Skip to content

feat(planning): make questionnaire model-invoked - #3023

Merged
kyle-sexton merged 3 commits into
mainfrom
claude/pocock-steering-course-00zkvd
Aug 19, 2026
Merged

kyle-sexton merged 3 commits into
mainfrom
claude/pocock-steering-course-00zkvd

Conversation

@kyle-sexton

Copy link
Copy Markdown
Contributor

Closes #2969

Summary

The one re-grade flip from course lane 8 (#2910). The ADR 0005-bounded fleet grade found planning:questionnaire was the single disable-model-invocation: true skill matching none of the rubric's three exception classes — no side effects beyond writing a Markdown document, not a setup skill, not maintainer-only — and no rationale for the true existed in the skill body or the planning CHANGELOG.

Fix

  • Re-checked for a latent rationale before flipping, as the issue requires. The candidate was a trigger collision with planning:interview (both plausibly firing on "I need to ask…"-shaped requests). There is none: the two split on who holds the knowledge, and each description already routes to the other on that axis — questionnaire says to run /planning:interview when the user can answer themselves, while interview's phrases ("ask me questions first", "what do you need to know") are about interrogating the user and questionnaire's name a third-party holder. So the flip proceeds rather than being recorded as a new exception class.
  • disable-model-invocation: false on plugins/planning/skills/questionnaire/SKILL.md.
  • Restored trigger phrases. planning 0.30.1 deliberately left this skill's Use when: phrases unoptimized because a hidden skill's description is never matched against user text. Now that it is model-invoked, the description carries three phrases a user would actually type ("I don't know, that's the client's call", "send this to someone else to answer", "write up questions for our security team") beside the ones it already had. Every existing phrase is preserved verbatim (check-skill.sh confirms: "all 3 base-ref trigger phrase(s) preserved").
  • New eval case (model-routes-third-party-decision-here) pinning what the flip actually enables: a natural-language request with no slash command routing here rather than to /planning:interview, on the who-holds-the-knowledge axis, then interviewing the send only.
  • Rubric doc updated — the fleet-grade row now reads FLIPPED, and a new paragraph records the latent-rationale re-check, the two costs of the hidden mode that surfaced, and the post-flip counts (162 false / 58 true, leaving 9 non-setup true skills, all class-attributed).
  • Version bump planning 0.30.7 → 0.31.0 with the matching CHANGELOG entry.

A second cost the re-check surfaced

questionnaire's own description advertises a hand-off "when an interview branch defers to a person-arbiter", and the original changelog entry noted "the interview-side pull-out reference lands separately". It never landed — and while the skill was true, the invocation-reach invariant made it unreachable from interview anyway, so the advertised hand-off could not have worked. The flip unblocks it; wiring the interview-side pointer is deliberately out of scope here (it is its own deliverable, not part of #2969's acceptance criteria).

Verification

  • bash scripts/check-changed-skills.sh origin/main — 1 skill checked, 0 failed; reports invocation mode: model-invoked (fleet default) and all 3 base-ref trigger phrases preserved. (One pre-existing WARN: the skill has no Gotchas surface — present before this change, untouched by it.)
  • bash scripts/check-changed-skills.test.sh — PASS=13 FAIL=0.
  • Fleet recount confirms the doc's figures: 162 false / 58 true across 220 top-level skills.
  • check-jsonschema + check-evals-quality.sh on the eval suite — ok / PASS, 0 warnings.
  • bash scripts/validate-plugins.sh — all manifests + catalog validated; generate-catalog.mjs --check and generate-cheatsheet.mjs --check in sync.
  • bash scripts/check-changelog-parity.sh --check / --check-bump origin/main / --check-order — all green.
  • npx markdownlint-cli2 on all changed markdown — 0 issues; typos clean.

Related

🤖 Generated with Claude Code

https://claude.ai/code/session_01QbfCrj3X9FfGL7VRZYmrn4


Generated by Claude Code

Closes the one re-grade flip from course lane 8 (#2969).

The fleet grade found `planning:questionnaire` was the single
`disable-model-invocation: true` skill matching none of the rubric's three
exception classes. Per the issue, the flip was gated on first looking for a
latent rationale the grade could not see — a trigger collision with
`planning:interview`. There is none: the two split on who holds the
knowledge, and each description already routes to the other on that axis.

Two costs of the hidden mode turned up instead, both now paid. Its trigger
phrases were deliberately left unoptimized because a hidden skill's
description is never matched against user text (planning 0.30.1), so it
gains phrases a user would actually type. And its own description advertises
a hand-off from an interview branch that the invocation-reach invariant made
unreachable while it stayed hidden.

Adds an eval case for what the flip enables: a natural-language request with
no slash command routing here rather than to interview.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01QbfCrj3X9FfGL7VRZYmrn4
@claude

claude Bot commented Aug 19, 2026

Copy link
Copy Markdown
Contributor

Claude finished @kyle-sexton's task in 2m 29s —— View job


CI Code Review

  • Gather context (PR diff, REVIEW.md, security-lane check)
  • Review each changed file for correctness/maintainability
  • Post findings (inline + summary)

Scope note: .github/workflows/claude-security-review.yml exists in this repo, so per REVIEW.md this lane omits security findings (none applicable here anyway — this PR is docs/config only).

Summary

This is a low-risk, well-scoped flip of planning:questionnaire from hidden (disable-model-invocation: true) to model-invoked, with matching rubric doc, changelog, version bump, and eval updates. Verified:

  • plugins/planning/skills/questionnaire/SKILL.md — flag flip is correct; all 3 pre-existing trigger phrases are preserved verbatim in the new description, and the 3 added phrases are distinct natural-language variants (no slash command) as claimed.
  • plugins/planning/skills/interview/SKILL.md — cross-checked the "no trigger collision" claim: interview's description already carries "ask me questions first" / "what do you need to know" (interrogates the user) and doesn't overlap with questionnaire's "another person holds the knowledge" framing. The who-holds-the-knowledge split holds up.
  • plugins/planning/skills/questionnaire/evals/evals.json — new eval case 5 validates against evals.schema.json (its missing files key is optional per schema, not an issue); its no-slash-command prompt is exactly the scenario the flip newly enables.
  • plugins/planning/CHANGELOG.md / plugin.json — 0.30.7 → 0.31.0 (minor, since this is an added capability, not a fix) is the right bump; the 0.30.1 cross-reference about descriptions never being matched while hidden checks out against that historical entry.
  • docs/conventions/invocation-mode/README.md — fleet counts are internally consistent (161→162 false, 59→58 true after the flip; 220 total either way).

One nit posted inline: docs/conventions/invocation-mode/README.md:141 — a dropped verb ("questionnaire's name a third-party holder") breaks the sentence in this rubric doc. Not blocking.

No correctness bugs, no maintainability concerns, no test-coverage gaps found.

@claude

claude Bot commented Aug 19, 2026

Copy link
Copy Markdown
Contributor

Claude finished @kyle-sexton's task in 46s —— View job


Security review — /review:security-review

  • Load /review:security-review instructions
  • Fetch PR diff (origin/main...HEAD)
  • Apply skip gate
  • Review changed files for security-relevant surface
  • Post findings / conclusion

Skip gate: change has no security-relevant surface.

All five changed files are documentation/configuration:

  • docs/conventions/invocation-mode/README.md — prose update to the fleet-grade rubric doc.
  • plugins/planning/.claude-plugin/plugin.json — version bump (0.30.7 → 0.31.0).
  • plugins/planning/CHANGELOG.md — changelog entry.
  • plugins/planning/skills/questionnaire/SKILL.md — flips disable-model-invocation: true → false and adds three trigger phrases to the frontmatter description.
  • plugins/planning/skills/questionnaire/evals/evals.json — one new eval case.

No code execution paths, command/SQL/path/template injection surfaces, secret/credential/token handling, or GitHub Actions workflow permissions are touched. The disable-model-invocation flip changes when this skill's existing behavior (interview the user about a hand-off, then write a Markdown questionnaire document) is triggered — it doesn't change what the skill does, and the PR description itself notes the skill has "no side effects beyond writing a Markdown document." This is a routing/config change reviewed under the repo's own invocation-mode rubric (ADR 0005-bounded), not a security boundary.

No security issues found.

@github-actions

github-actions Bot commented Aug 19, 2026

Copy link
Copy Markdown
Contributor

Last security-reviewed head: 3d84f707e30862707a4c1f4416c19df7eec0fc44. On the next push, the relevance gate compares only the commits since this SHA; delete this comment to force a full re-review.

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: d3ebb0bb83

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread docs/conventions/invocation-mode/README.md Outdated
Comment thread plugins/planning/skills/questionnaire/SKILL.md
Comment thread docs/conventions/invocation-mode/README.md Outdated
@github-actions

github-actions Bot commented Aug 19, 2026

Copy link
Copy Markdown
Contributor

Claude has reviewed this PR 3 times. The lane skips further automatic reviews after 5; deleting this comment resets the count.

…te-away chain explicit

Two review findings, both verified against the tree.

The post-flip paragraph claimed 9 non-setup `true` skills, all class-attributed.
A recount says 10: `session-flow:show-options` carries `true` and is absent
from the grade table. It landed 2026-08-18, a day after the 2026-08-17 grade,
so the table's population predates it and the ADR 0005 bound leaves it
unswept rather than silently covered. The doc now records that gap instead of
overclaiming, and grading it is filed as #3024.

The route-away named `/planning:interview` as bare prose. That reads as advice
to a human, which is the failure the rubric's cross-skill phrasing rule exists
to prevent — and it only became live with this flip, since the model can now
land here from a natural-language request and would strand the decision.
It is now an explicit Skill-tool invocation, with the eval expectation
updated to pin the mechanism rather than the recommendation.

Also fixes a dropped verb in the same paragraph.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01QbfCrj3X9FfGL7VRZYmrn4
@claude

claude Bot commented Aug 19, 2026

Copy link
Copy Markdown
Contributor

Claude finished @kyle-sexton's task in 47s —— View job


Security review — /review:security-review

  • Gather context (PR diff, custom instructions)
  • Invoke /review:security-review skill and follow its instructions
  • Post findings / conclusion

Skip gate: change has no security-relevant surface (checked both the full PR diff and the incremental diff since the last reviewed head, d3ebb0bb83dc1f7fe07214cab74b7d744e5af6413d84f707e30862707a4c1f4416c19df7eec0fc44).

The new commit (3d84f70) touches three files, all non-code:

No code execution paths, command/SQL/path/template injection surfaces, secret/credential/token handling, or GitHub Actions workflow permissions are touched by this delta (or by the PR as a whole, consistent with the prior review at d3ebb0b).

No security issues found.
(branch: claude/pocock-steering-course-00zkvd)

@claude

claude Bot commented Aug 19, 2026

Copy link
Copy Markdown
Contributor

Claude finished @kyle-sexton's task in 1m 43s —— View job


CI Code Review

  • Gather context (PR diff, CLAUDE.md, prior review state, HEAD SHA vs. previous review)
  • Review each changed file for correctness/maintainability
  • Post findings (inline + summary)

Summary

This review covers the latest commit, 3d84f70, pushed since the last CI review of this PR (which reviewed d3ebb0b). That commit responds to two prior findings from @chatgpt-codex-connector's review:

  • show-options count fix — correct. Verified plugins/session-flow/skills/show-options/SKILL.md does carry disable-model-invocation: true and was absent from the grade table. The doc no longer overclaims "9, all class-attributed"; it now states 48 *:setup + 10 non-setup, flags show-options as ungraded (post-dates the 2026-08-17 grade), and links the follow-up issue (invocation-mode: grade session-flow:show-options against the exception classes (post-dates the lane 8 fleet grade) #3024) rather than silently covering the gap.
  • Route-away Skill-tool invocation — correct. plugins/planning/skills/questionnaire/SKILL.md now says "invoke /planning:interview via the Skill tool and stop this skill" instead of bare /name prose, matching the cross-skill phrasing convention this rubric doc itself requires (docs/conventions/invocation-mode/README.md:73-86). The matching eval (evals.json case 3) was updated to pin the mechanism, not just the recommendation.

One inline finding: the commit message for 3d84f70 claims to also fix "a dropped verb in the same paragraph" (the grammar nit flagged by Claude's own prior review), but docs/conventions/invocation-mode/README.md:141 is still missing the verb — "while questionnaire's name a third-party holder who is asked instead)" needs "names". Posted inline with a suggestion fence.

No correctness bugs, no maintainability concerns, no test-coverage gaps beyond the nit above.
(branch: claude/pocock-steering-course-00zkvd)

Comment thread docs/conventions/invocation-mode/README.md Outdated
The clause relied on eliding "phrases" after "questionnaire's", which is
grammatical but misparsed by two readers in a row as the noun "questionnaire's
name" — so the sentence was ambiguous whatever its defence. It now names the
subject outright rather than doubling the word into "name names".

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01QbfCrj3X9FfGL7VRZYmrn4
@claude

claude Bot commented Aug 19, 2026

Copy link
Copy Markdown
Contributor

Claude finished @kyle-sexton's task in 1m 56s —— View job


CI Code Review

  • Gather context (PR diff, CLAUDE.md, prior review state, HEAD SHA vs. previous review)
  • Review each changed file for correctness/maintainability
  • Post findings (inline + summary)

Summary

This review covers the latest commit, 733ec49, pushed since the last CI review of this PR (which reviewed 3d84f70). That commit is a one-file grammar fix responding to the two prior "dropped verb" findings (from @claude and from Codex's earlier passes) on docs/conventions/invocation-mode/README.md.

  • Grammar fix is now correct. docs/conventions/invocation-mode/README.md#L138-L142 now reads "while questionnaire's phrases name the third-party holder who is asked in the user's place)." Subject (questionnaire's phrases) → verb (name) → object (the third-party holder) — the sentence is grammatical now, unlike the two prior attempts ("name a third-party holder" / doubled "name names"). The rewrite also fixed the orphaned "Two costs of the true\nturned up instead" line break from the prior commit as a side effect.
  • Rest of the diff (origin/main...HEAD) is unchanged since the last full review and remains correct: the disable-model-invocation flip, restored trigger phrases (3 pre-existing preserved verbatim + 3 new), the explicit Skill-tool route-away hand-off in plugins/planning/skills/questionnaire/SKILL.md and its matching eval update, the new eval case 5, the CHANGELOG entry, and the 0.30.7 → 0.31.0 minor bump are all internally consistent. evals.json is valid JSON with 5 well-formed cases.
  • session-flow:show-options claim re-verified: it does carry disable-model-invocation: true (confirmed at plugins/session-flow/skills/show-options/SKILL.md:5), matching the doc's new paragraph about it being ungraded pending invocation-mode: grade session-flow:show-options against the exception classes (post-dates the lane 8 fleet grade) #3024.

No correctness bugs, no maintainability concerns, no test-coverage gaps. Nothing further to flag — both previously open findings (bare /planning:interview hand-off; the dropped-verb grammar nit) are resolved as of this head.

Note: I did not independently execute the repo's check scripts (check-changed-skills.sh, markdownlint-cli2, etc.) in this session — the figures and pass/fail results cited in the PR description and prior comments are author-claimed and were not re-run here. The MD013 line-length rule is disabled repo-wide (.markdownlint-cli2.jsonc:32), so the short mid-paragraph line wrap at L142-143 is not a lint issue.
(branch: claude/pocock-steering-course-00zkvd)

@kyle-sexton
kyle-sexton merged commit fb30333 into main Aug 19, 2026
48 checks passed
@kyle-sexton
kyle-sexton deleted the claude/pocock-steering-course-00zkvd branch August 19, 2026 14:04
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

planning: flip questionnaire to model-invoked — the one invocation-mode re-grade flip

2 participants