Repository navigation
fix(planning): read an unexpanded user_config token as the key's default - #10675
Conversation
The interview's lane table and shared lane read an unexpanded
${user_config.KEY} token as unset or off. For shared_session_open_browser,
whose default is true, that inverted the default. Each read now applies
the key's own default, and docs/upstream/claude-code.md records the 2.1.312
probe from #9886 as a gotcha.
Re-pinned interview-defenses digests:
- SKILL.md Stance section: 32ca83a2 -> 2425287a
- SKILL.md Action Router section: cf717454 -> 2d05ea86
The changed lines name the default an unexpanded token takes; the
no-silent-resolve and lock defenses are byte-identical.
Co-Authored-By: Claude Opus 5.5 <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-security-review reviewed No security issues found in this pull request. I read the whole diff (
critical-findings: 0 |
|
claude-review reviewed No findings. The change is skill wording, a docs note, a changelog fragment and two test digest re-pins, and I found no defect in the wording. What I checked
Not verified
No cost or spend implications. |
Closes #9886
Summary
The #9886 host run on Claude Code 2.1.312 showed that an unset
userConfigkey with a manifestdefaultreaches skill content as its literal${user_config.KEY}token. A saved booleantruesubstitutes astrue./planning:interviewread an unexpanded token as unset or off, which invertsshared_session_open_browser, whose default istrue. The owner decided not to report this upstream, so it is recorded as a gotcha only.Fix
plugins/planning/skills/interview/SKILL.md: the lane-table line says a value still shown as its token is unset and takes that key's declared default (surfaceterminal,use_emoji_question_markersfalse,shared_session_open_browsertrue). The emoji line names off as the default.plugins/planning/skills/interview/context/lane-shared.md: drop--openonly on an explicitfalse; an unexpanded token keeps--open.docs/upstream/claude-code.md: a dated gotcha citing plugins manifest reference, Reference a saved value and the 2.1.312 probe, with an as-of date and a recheck trigger. The file has no gotcha section, so the note sits beside the existing 280-030 probe note at the end of Declined.plugins/planning/tests/interview-defenses.test.sh: two digests re-pinned withrepin.sh:32ca83a2->2425287acf717454->2d05ea86The changed lines name the default an unexpanded token takes. They change how a setting is read, not what a round resolves. The no-silent-resolve and lock defenses are byte-identical.
A changelog fragment for planning (patch).
Other planning keys need no change.
use_ask_user_question,use_emoji_question_markers,scaffold_stubsandtime_unitsdefault tofalse. Thephase_order,plan_storeandtime_unitsreads treat an unexpanded token as an unset user layer, and the layered resolution inreference/config.mdthen applies the repository layer or the default.Default-
truekeys in other plugins (not changed here):false: actionlint, bash-format, biome-format, code-tidying, context-budget, context-guard, desktop-notification, disk-hygiene, eol-normalizer, evals, github, go-format, harness-ops, markdown-format, playwright (build_edl.pyremoves a layer only onoff/false), powershell-format, rate-limit-guard, repo-hygiene, review, ruff-format, session-flow, typos-format.plugins/user-interface/skills/design/SKILL.md(around line 81), "account-bound tools are enabled (now:${user_config.account_tools_enabled})". The model could read an unexpanded token there as off, but no wording says so.Verification
scripts/check-affected.sh --tests: 14 passed, 2 skipped. The skippedtestsstep left 2 selected suites to their CI lanes.bash plugins/planning/tests/interview-defenses.test.sh: PASS after the re-pin.check-affected --uncommitteddid not run this suite, so it was run directly.Related
🤖 Generated with Claude Code