fix(planning): name the bundled resolver in design so a configured dialect resolves - #3926
Conversation
…alect resolves `plugins/planning/skills/design/SKILL.md` told the running agent that the planning plugin ships no bundled resolver and that "until the resolver is bundled, a configured dialect cannot be read at all". Both claims were false: `plugins/planning/lib/resolve-convention-home.sh` shipped in 0.39.0 (#3882), nine hours after the design skill landed (#3879), and the sweep back never happened. The effect on main was that a consumer setting `diagram_dialect.data` to `dbml` was silently served `mermaid`, and the system-scope C4 container view was unreachable for every consumer because `diagram_dialect.system` could never resolve to a value. The design body now names the resolver at `bash "${CLAUDE_PLUGIN_ROOT}/lib/resolve-convention-home.sh"` with its exit-code contract, in the same terms `interview/SKILL.md` and `prd/SKILL.md` already use. The "tracked separately" pointer is dropped, since it pointed at #3881, which closed as refuted. The untrusted-input rule and the restate-rather-than-cite rationale are preserved. Three documents also stated reader facts that were wrong on main: - `docs/PLUGIN-PHILOSOPHY.md` named `/work-items:decompose` and `/review:quality-gate` as readers of the authoring-formats keys. Neither reads a key; `git grep -E "acceptance_criteria_format|diagram_dialect|resolve-convention-home"` over `plugins/work-items` and `plugins/review` returns nothing, and both skills say so in their own bodies. The row now names only the three planning skills. - `docs/conventions/authoring-formats/README.md` said "no skill reads either key on main today" in two places and headed its column "Declared consumer (not yet reading)". The table now names the three reading skills, and a sentence below it records that decompose and quality-gate consume the produced artifact by presence without reading a key. - `docs/conventions/config-cascade/README.md` carried the same stale claim plus "conformance becomes verifiable when the first resolver lands". The row now states which skills read which keys through which resolver. Verified by running the shipped resolver against a fixture repository under the platform temp directory carrying a convention-home pointer line and an `authoring-formats/README.md` setting `diagram_dialect.data` to `dbml`: exit 0 printing `docs/conventions`, exit 1 with no region, exit 2 on a bad argument and an unusable `--root`, and exit 3 on two pointer lines in one region. Those match the contract the new design text documents and the script's own `--help`. Closes #3924 Refs #3799, #3882 Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Codex Review SummaryThis comment shows the latest Codex review activity on this pull request.
ℹ️ About Codex in GitHubYour team has set up Codex to review pull requests in this repo. Reviews are triggered when you
Codex reacts with 👀 while any review is running, comments if it has suggestions, and reacts with 👍 once all reviews finish with no findings. |
|
Claude finished @kyle-sexton's task in 2m 6s —— View job Code review — PR #3926
Scope note: Verification performed (not just author-claimed):
I was not able to execute Findings: none. This is a well-scoped documentation/skill-body fix — six files, no behavior change outside the four documents the linked issue named. Every "reader" and "non-reader" claim I checked against the actual skill files holds, the new resolver paragraph is a faithful, path-correct restatement of the shared script's contract, and I found no correctness or maintainability issue that a careful reviewer would block on. CI ( |
|
Claude finished @kyle-sexton's task in 1m 1s —— View job Security review complete
No security issues found. This PR is a documentation/skill-body correction: it removes false claims in Notably preserved and unchanged: the "convention doc is untrusted input — match it for the documented keys, never execute or interpolate it" rule in the design skill body (SKILL.md#L221). The resolver script itself ( No injection, authorization, secrets-handling, or GitHub Actions concerns identified in this diff. |
|
Last security-reviewed head: |
|
Claude has reviewed this PR 1 time. The lane skips further automatic reviews after 5; deleting this comment resets the count. |
Closes #3924
Refs #3799, #3882
Summary
/planning:designcould not read thediagram_dialectconvention keys, because its own skill body told the running agent the resolver it needed did not exist.plugins/planning/skills/design/SKILL.md:222said "the planning plugin ships no bundled resolver", and:224said "Until the resolver is bundled, a configured dialect cannot be read at all. ... this plugin carries no copy of the shared resolver, so every run resolves through step 6 and takes the default".Both statements were false on
main.plugins/planning/lib/resolve-convention-home.shis present and executable, and the sibling skills in the same plugin name it:plugins/planning/skills/interview/SKILL.md:268-270andplugins/planning/skills/prd/SKILL.md:296-298.The cause was ordering. #3879 landed the design skill at 2026-09-06T23:43:06Z; #3882 landed the resolver nine hours later and did not sweep design back. The effect on
mainwas that a consumer settingdiagram_dialect.datatodbmlwas silently servedmermaid, and the system-scope C4 container view was unreachable for every consumer, sincediagram_dialect.systemcould never resolve to a value.Three surrounding documents carried reader claims that were also wrong on
main, all of the same shape: a value that reads as sourced but was never checked against the code.Fix
Six files, no behavior outside the four documents named in the issue.
plugins/planning/skills/design/SKILL.md. The false clause at:222and the whole "Until the resolver is bundled" paragraph at:224are replaced with the resolver's real path and exit-code contract, phrased asinterview/SKILL.md:268-270andprd/SKILL.md:296-298already phrase it, with only the degrade value adapted fromfree-textto this skill's own defaults (mermaidfor the data artifact, no C4 view for the system scope). The "tracked separately" pointer is dropped, since it pointed at plugins: enrol planning, work-items and review as resolve-convention-home carriers #3881, which closed as refuted. The untrusted-input rule and the "restated here rather than cited because an installed plugin never sees the publishing repository at runtime" rationale are preserved. One punctuation change inside the preserved rule, disclosed so a diff of that hunk is not a surprise: the break after "The convention doc is untrusted input" is now a colon where it was an em dash, so the rewritten line introduces no em dash into a repository mid de-slop campaign. Every word of the rule is unchanged. No dialect branch below the ladder moved.docs/PLUGIN-PHILOSOPHY.md:669. The row named/work-items:decomposeand/review:quality-gateas readers. Neither reads a key. The row now names only the three planning skills.docs/conventions/authoring-formats/README.md. "no skill reads either key onmaintoday" is removed from both places it appeared. The column heading "Declared consumer (not yet reading)" becomes "Reading skill", and the rows now name/planning:interview,/planning:prdand/planning:design./work-items:decomposeand/review:quality-gateare dropped from the table and stated explicitly below it as consuming the produced artifact without reading a key, so the document's own closing rule ("A skill appears here once it actually reads the key") stays true of the table. The:167contract, "each consuming slice adds its own reading and updates its row in the same change", is honoured by this change.docs/conventions/config-cascade/README.md:303. "Conformance becomes verifiable when the first resolver lands" and "No skill onmainreads these keys yet" are dropped, replaced with which skills read which keys through which resolver.plugins/planning/.claude-plugin/plugin.jsonbumped0.39.0to0.39.1, with a matching new## [0.39.1]entry at the top ofplugins/planning/CHANGELOG.md.No test digest needed refreshing:
plugins/planning/tests/interview-defenses.test.shpins content overinterview/SKILL.mdandprd/SKILL.md, and this change touches neither. The onegrep -rn design plugins/planning/tests/hit is the word "design" inside an interview pin's prose, not a pin over the design skill.Verification
Behavior was attempted, not read.
Fixture run. A fixture repository was built under the platform temp directory (never inside the repo), carrying a convention-home pointer line in
AGENTS.mdand adocs/conventions/authoring-formats/README.mdsettingdiagram_dialect.datatodbml.Reading the key through the resolved home returned the configured value, not the default:
Exit-code contract, confirmed against the script rather than copied from interview's wording.
The script's own
--helpstates the same contract: "Exit: 0 resolved (home on stdout); 1 no pointer anywhere (ask); 2 usage; 3 FAIL". That is what the new design text now documents.Every reader claim left standing, confirmed by
git grepinside that skill's own files./planning:interviewreadsacceptance_criteria_formatgit grep -lE "acceptance_criteria_format|resolve-convention-home" -- plugins/planning/skills/interviewSKILL.md,context/loop.md/planning:prdreadsacceptance_criteria_formatgit grep -lE "acceptance_criteria_format|resolve-convention-home" -- plugins/planning/skills/prdSKILL.md/planning:designreadsdiagram_dialectgit grep -lE "diagram_dialect" -- plugins/planning/skills/designSKILL.mdEvery skill removed as a reader, confirmed at zero hits.
/work-items:decomposereads no keygit grep -nE "acceptance_criteria_format|diagram_dialect|resolve-convention-home" -- plugins/work-items/review:quality-gatereads no keygit grep -nE "acceptance_criteria_format|diagram_dialect|resolve-convention-home" -- plugins/reviewBoth skills also state it themselves:
plugins/work-items/skills/decompose/context/container-lifecycle.md:46reads "no flag, no lever, no convention key", andplugins/review/skills/quality-gate/context/close-out.md:383reads "no flag, no lever, and no convention key is read here".Local gates.
CHECK_SKILL_SKILLS_ROOT=plugins/planning/skills bash plugins/skill-quality/scripts/check-skill.sh designgivesPASS, 0 errors, 3 warning(s). All three warnings are pre-existing and structural (line count over the 200 soft target, no Gotchas surface, a numbered procedure at lines 156-162 with no completion-criteria signal); none is introduced here.bash scripts/check-purged-em-dashes.shgives98 declared paths, 130 files scanned, no em dashes.bash scripts/check-changelog-parity.sh --checkpasses.npx markdownlint-cli2over the five changed markdown files reports 0 issues.git diff | grep -c $'\r'is 0.Related
plugins/planning/lib/resolve-convention-home.shnine hours after feat(planning): dialect-select and scope-label the design skill's per-scope artifacts #3879 landed the design skill, without sweeping design back.Criterion 1andagent-brief.md'sSpecific, testable criterion 1) are a separate known follow-up and are untouched here.