#1252 Keep a skill's own sections out of injected guidance - #1266
Merged
Conversation
A section belonging to `respond-to-review`, `revise-comments`, or `testing-conventions` no longer renders as a subsection of the guidance inlined above it. Where the injection was a guidance hook, that parent varied with whichever rulebook the local configuration bound, so the same skill read differently on two machines. Placing a directive this way now fails a content check, in any skill or subagent and for both injection mechanisms.
The content specification sets where a directive may be placed in a skill or subagent body: the next heading below it must sit at or above the shallowest heading the injected content brings, so the section following a directive keeps its own parent. The rule turns on the injected content's own shallowest level rather than on a fixed `##`, so a partial that opens deeper legitimately takes siblings at its own level after it.
A section following an include no longer escapes the placement check when the partial declares a guidance hook. Such a hook resolves inside the host and fills at the level a bound rulebook's title lands on, which can be shallower than anything the partial itself authors, so the section it adopted went unreported. The partial-system reference now carries the level computation and the content specification the rule an author follows, in place of two near-identical statements of both.
Dependency auditProduction dependency audit passed. |
williamthorsen
marked this pull request as ready for review
August 10, 2026 04:06
williamthorsen
added a commit
that referenced
this pull request
Aug 13, 2026
…e-v0.3.0 codeassembly-v0.9.0 factory-v0.2.6 codeassembly-mcp-v0.2.5 codeassembly-v0.9.0 - #1288 feat: State mutability and name the lede reader at the artifact type lists (#1303) - #1285 fix: Require plain bullets for checklists on both update-jira-ticket paths (#1302) - deps: Upgrade all deps to latest version - #1290 tooling: Upgrade eslint-config-typescript to 10 and complete manifest metadata (#1301) - #1294 feat: Specify artifact mutability and its sanctioned exceptions (#1297) - #1293 fix: Present and classify discretionary findings as actionable (#1295) - #1289 tooling: Remove shelled nmr calls from package manifests (#1291) - #1280 feat: Add a refresh path that edits an existing AGENTS.md instead of redrafting it (#1287) - #1055 feat: Replace the lede doctrine with corpus-derived guidance and retire the changelog-writer (#1286) - deps: Upgrade all deps to latest version - #1264 refactor: Consolidate error-message extraction on toolbelt.errors' describeError (#1284) - #1263 refactor: Retire the deferred-lint mechanism and adopt toolbelt.errors in agents (#1279) - #1262 refactor: Hoist unreadable for-of expressions and promote the lint rule to an error (#1276) - #1267 fix: Extend the no-hard-wrapping instruction to every GitHub composer (#1275) - #1177 fix: Rewrite links, tokens, and template variables in a Markdown file support entry (#1273) - #1176 feat: Add a ticketing-preferences hook to the skills that split and create tickets (#1268) - #1252 fix: Keep a skill's own sections out of injected guidance (#1266) - #1260 refactor: Fix lint and retire rule deferrals (#1265) - #1247 feat: Add a personal tooling-preferences rulebook (#1257) - #1251 feat: Let a rulebook declare that a guidance hook is how it is reached (#1259) - #1246 feat: Guard home-domain writes and record their provenance (#1254) - #1175 feat: Link new tickets to their blockers and parents (#1249) factory-v0.2.6 - deps: Upgrade all deps to latest version - #1290 tooling: Upgrade eslint-config-typescript to 10 and complete manifest metadata (#1301) - deps: Upgrade all deps to latest version - deps: Upgrade all deps to latest version - #1264 refactor: Consolidate error-message extraction on toolbelt.errors' describeError (#1284) kb-v0.6.0 - deps: Upgrade all deps to latest version - #1290 tooling: Upgrade eslint-config-typescript to 10 and complete manifest metadata (#1301) - #1289 tooling: Remove shelled nmr calls from package manifests (#1291) - #1264 refactor: Consolidate error-message extraction on toolbelt.errors' describeError (#1284) - #1261 feat: Attach causes to kb's loader errors and retire its lint deferral (#1272) - #1260 refactor: Fix lint and retire rule deferrals (#1265) codeassembly-lifecycle-v0.4.0 - #1290 tooling: Upgrade eslint-config-typescript to 10 and complete manifest metadata (#1301) - #1289 tooling: Remove shelled nmr calls from package manifests (#1291) - #1261 feat: Attach causes to kb's loader errors and retire its lint deferral (#1272) - #1260 refactor: Fix lint and retire rule deferrals (#1265) codeassembly-mcp-v0.2.5 - deps: Upgrade all deps to latest version - #1290 tooling: Upgrade eslint-config-typescript to 10 and complete manifest metadata (#1301) - #1289 tooling: Remove shelled nmr calls from package manifests (#1291) - #1264 refactor: Consolidate error-message extraction on toolbelt.errors' describeError (#1284) codeassembly-run-core-v0.3.0 - deps: Upgrade all deps to latest version - #1290 tooling: Upgrade eslint-config-typescript to 10 and complete manifest metadata (#1301) - #1289 tooling: Remove shelled nmr calls from package manifests (#1291) - #1264 refactor: Consolidate error-message extraction on toolbelt.errors' describeError (#1284) - #1261 feat: Attach causes to kb's loader errors and retire its lint deferral (#1272) - #1260 refactor: Fix lint and retire rule deferrals (#1265)
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
What
Fixes an issue where three deployed skills presented their own sections as subsections of the shared guidance inlined into them rather than at the skill's own level. Skill and rulebook authors are now instructed where shared guidance may be inserted relative to the section that follows it, and content that breaks the rule is now flagged.
Why
An agent reading
respond-to-review,revise-comments, ortesting-conventionsmet structure that attributed the skill's own rules to a document those rules do not belong to. Nothing guarded the shape and the rule governing it was written down nowhere, so the next directive added to any skill would have reintroduced it.Details
🐛 Bug fixes
respond-to-review's "Writing code after a review",revise-comments' "File-level carve-outs", andtesting-conventions' "Test files" now sit at the skill's own level. The last is renamed "Comments in test files": promotion strips the "comments" sense the heading drew from its former parent, and a bare "Test files" reads ambiguously at top level in a skill about testing.respond-to-reviewplaces its include above its guidance hook, matchingimplement-planandreview-criteria.🧪 Tests
injection-point-placement.unit.test.tsscans every body undercontent/and reports any directive whose next host heading is deeper than the shallowest heading the injection contributes, for includes and guidance hooks alike, with no allowlist. It reads source rather than rendered output, because an inlined partial is byte-identical to the text around it once includes expand. A hook a partial declares counts at the fill level, since hooks resolve after includes expand and so fill inside the host.📚 Documentation
codeassembly-content-specificationrulebook carries the placement rule an author follows;_partials/README.mdcarries the level computation behind it and points back.Closes #1252