What to build
Two things the collection now promises about a Feature are not held by anything. They are filed together because both are the same shape — a rule stated for both entry types and enforced for one — and because docs/rules/skills.md already obliges that module to say where the suite holds less than the rule, which is half of what each needs.
The Feature half of Select's unchecking gate. cmd_apply_select in skills/kntnt/scripts/kntnt.py raises two distinct refusals through require_yes: one where unchecking deletes a Skill's files, and one where unchecking a Feature takes what it wrote back out of a Harness's own configuration. docs/rules/collection.md states both halves as the rule, and every shipped page carrying the gate now states both. Only the first is exercised by a test. Add a test for the second, alongside the existing one for the Skill half so a reader meets them together.
The README's Feature sections. docs/rules/skills.md says a Feature gets a section under the README's ## Features heading on the same terms a Skill's section is written on, and the module names the suite enforcement for the Skill case. tests/test_readme.py reads only the partition holding the Skills, against the Catalog's Skills. Nothing compares the ## Features sections against the Catalog's Features.
That second one has two admissible shapes and the choice is made here so a builder does not have to make it: extend the test. Compare the README's ## Features sections against the Catalog's features the way the existing check compares the Skills, rather than adding a disclaimer saying nothing does. The disclaimer route is what docs/rules/skills.md requires when a rule genuinely outruns the suite, and it is the wrong answer where the check is this cheap to write.
Acceptance criteria
Written against 6fc533f
What to build
Two things the collection now promises about a Feature are not held by anything. They are filed together because both are the same shape — a rule stated for both entry types and enforced for one — and because
docs/rules/skills.mdalready obliges that module to say where the suite holds less than the rule, which is half of what each needs.The Feature half of Select's unchecking gate.
cmd_apply_selectinskills/kntnt/scripts/kntnt.pyraises two distinct refusals throughrequire_yes: one where unchecking deletes a Skill's files, and one where unchecking a Feature takes what it wrote back out of a Harness's own configuration.docs/rules/collection.mdstates both halves as the rule, and every shipped page carrying the gate now states both. Only the first is exercised by a test. Add a test for the second, alongside the existing one for the Skill half so a reader meets them together.The README's Feature sections.
docs/rules/skills.mdsays a Feature gets a section under the README's## Featuresheading on the same terms a Skill's section is written on, and the module names the suite enforcement for the Skill case.tests/test_readme.pyreads only the partition holding the Skills, against the Catalog's Skills. Nothing compares the## Featuressections against the Catalog's Features.That second one has two admissible shapes and the choice is made here so a builder does not have to make it: extend the test. Compare the README's
## Featuressections against the Catalog'sfeaturesthe way the existing check compares the Skills, rather than adding a disclaimer saying nothing does. The disclaimer route is whatdocs/rules/skills.mdrequires when a rule genuinely outruns the suite, and it is the wrong answer where the check is this cheap to write.Acceptance criteria
cmd_apply_selectraises when unchecking a Feature without--yes, asserting on that refusal and not on the one raised for a Skill.## Featuressections against the Catalog's Features, on the terms the existing Skills check uses.docs/rules/skills.mdsaid the suite holds less than the rule for either of these, and it no longer does, that sentence is brought up to what the suite now holds.CONTRIBUTING.mdlists all pass.Written against 6fc533f