Repository navigation
fix(interview-mode): read attended/unattended as aliases for steering/auto - #335
Merged
Merged
Conversation
…/auto CLAUDE.md, the runbook and intake Q9 told users to write `Interview mode: unattended` in PROJECT.md, but bin/interview-mode.sh accepted only steering|assist|auto and fell back to steering. A project that opted into unattended as documented silently ran as steering. - interview-mode.sh: canon() maps attended -> steering and unattended -> auto in every source (env, .interview-mode, PROJECT.md, --set), case-insensitive, with one stderr alias note. Output is always the canonical name, so interview-gate.sh is unchanged. Typos still fall back to steering. - Docs name the canonical values; interview-protocol.md carries the alias vocabulary, CLAUDE.md and the runbook point there. - intake Q9 body offers steering/assist/auto, steering the default. The heading is unchanged (it is the "## 9." locator and the text sync matches on). sync-project.sh treats any Q9 body still opening "_Not yet asked._" as unanswered, so the body rewrite does not turn untouched scaffolds into the "edited, NOT touching it" warning. - test-interview-mode.sh: +21 checks, 13 of which fail on master (aliases per source, typo, no note on canonical values, hook does not block on unattended). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01VJgWP5vEoAsNsJYqCDMGNw
The PROJECT.md line is human-written and gets annotated
("auto (user asked 2026-...)", "**auto** - fast POC", "Unattended, per
user"). The old read kept the whole rest of the line with whitespace
removed, so every annotated opt-in fell back to steering -- the same
failure the alias fix addresses.
Now: strip the key up to the first colon, lower-case, drop bold and
backticks, take the first whitespace-delimited word, trim trailing
,.;:!?) and only then map aliases and validate. The first word must
still be exact (auto-ish is a typo -> steering), an empty value still
gives steering, and the env var, session file and --set stay exact
because they are machine-written.
test-interview-mode.sh: +14 checks (40 -> 54); 6 fail on 56d16ab.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01VJgWP5vEoAsNsJYqCDMGNw
Review of #335 (MERGE-AFTER-FIX): the first-word read let hedged lines resolve QUIETER than on master, breaking the header rule that a typo never resolves quieter. `auto? (to confirm with user)`, `unattended? ask user`, `auto | steering` and `auto (proposed, not confirmed)` gave auto on 12838b4, steering on master. - `?` is no longer stripped from the first word. - A value containing `?` or `|`, or (case-insensitively) propos, tbd, todo, unconfirmed, not confirmed, to confirm, recommend or suggest, is invalid -> steering, with a stderr note naming it a hedge. Plain notes (`auto (user asked ...)`, `**auto** - fast POC`, `Unattended, per user`) still resolve. - interview-protocol.md: one clause on note vs hedge. - exec-approval.sh: comment no longer claims the same convention as interview-mode.sh; its parse is unchanged. - test-interview-mode.sh: +7 checks (54 -> 61); 7 fail on 12838b4. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01VJgWP5vEoAsNsJYqCDMGNw
Confirmation review of #335: the hedge word list leaked. `auto / steering`, `auto or steering`, `auto (pending sign-off)`, `(maybe)`, `(tentative)`, `(draft)` and `- awaiting user` still gave auto on d3a75e1 where master gave steering. A word list cannot converge, so it is replaced by a rule that cannot leak: - strip bold/backticks, lower-case; - a value that is exactly one mode or alias (trailing '.' allowed) is used; - trailing text after steering/attended is a note: steering; - trailing text after assist/auto/unattended: steering, with one stderr line saying a quieter mode must stand alone on the line; --explain shows "fallback (quieter mode with trailing text)". The hedge list and the ?/| special-casing are removed. Behaviour change: plain notes after auto (`auto (user asked ...)`) now also give steering. Env, session file and --set stay exact. interview-protocol.md, exec-approval.sh's comment and the CHANGELOG line follow. test-interview-mode.sh: 61 -> 76 checks; 14 fail on d3a75e1. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01VJgWP5vEoAsNsJYqCDMGNw
MendixMau
marked this pull request as ready for review
October 14, 2026 03:36
MendixMau
added a commit
that referenced
this pull request
Oct 14, 2026
README rewritten for newcomers: what it is, how it works, ways to use it, quick start, "Make it yours", testing and quality, "We need your input", releases; existing reference kept below (generated ROUTING blocks untouched). New docs/releases/v1.0.md (themes of the last two weeks, upgrading, known gaps, credits). docs/RELEASE-PROCESS.md §8: the vYYYY.MM.DD train stays; named milestones (1.0, 1.1, 2.0) get curated notes and a GitHub Release; tags start at 1.0. CHANGELOG header points there. Size: ~670 counted lines, over the 400-line cap — exception accepted by the maintainer for a docs restructure (mostly moved README text), as the reviewer required. Review: independent review MERGE-AFTER-FIX (tag claims untrue on a tagless remote, pinning vs ritual, closed-PR links, cadence restated, three accuracy fixes, missing known gap) — all fixed; confirmation review found one new false line (unattended alias before the script accepted it), removed in 110f4bd. Master merged in for a CHANGELOG conflict with #335 (both lines kept). Every path, flag, number and credit verified against master. CI green on 882df14. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01VJgWP5vEoAsNsJYqCDMGNw
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.
Direct lane
What changed and why:
CLAUDE.md,
skills/conversion-runbook.mdand intake Q9 told users to writeInterview mode: unattendedinPROJECT.md. Butbin/interview-mode.shaccepted onlysteering | assist | autoand fell back tosteeringfor anything else. A project that opted into unattended exactly as documented silently ran as steering.What this PR changes:
attendedreads assteeringandunattendedasautoin$CLAUDE_INTERVIEW_MODE,.claude/.interview-mode, thePROJECT.mdline, and--set(which stores the canonical name). Each alias prints one stderr note, e.g.interview-mode: 'unattended' read as 'auto' (alias).PROJECT.mdline is read. Markdown bold and backticks are stripped and the value is lower-cased. Then:.is allowed) is used, so**auto**,`auto`,auto.andUnattendedall give auto.steeringorattendedis a harmless note, because steering is the loudest mode.assist,autoorunattendedfalls back to steering with one stderr line: "a quieter mode must stand alone on the line — write 'Interview mode: auto' and put notes on the next line".--explainshowsfallback (quieter mode with trailing text).--set.claude-hooks/hooks/interview-gate.sh(which compares toauto), is unchanged.skills/interview-protocol.mdholds the vocabulary and the "note may followsteering;assist/automust stand alone" clause. CLAUDE.md and the runbook nameInterview mode: auto(aliasunattended) and point there. The intake Q9 body offers steering/assist/auto, with steering as the default.## 9.locator and its question-text key.sync-project.shand old Q9 bodies. Sync now treats any Q9 body that still opens with_Not yet asked._as unanswered. Without this, the body rewrite would turn every untouched scaffold into the false "edited, NOT touching it" warning.bin/exec-approval.sh: comment-only change. It no longer claims to follow interview-mode's convention, and its parsing is unchanged.gate-check.sh:699is deliberately unchanged. It is the byte-exact stale-scaffold reference.README.md is not touched here. Open draft PR #334 is rewriting it, and #334's README already documents the canonical values.
Field evidence: none yet. This is a vocabulary mismatch found by reading during the 1.0 README review.
No client data anywhere in the diff (leak guard clean)
Size cap: 9 files, +223/−27 including the fixture and CHANGELOG
Test tier: fixture level.
tests/wave2/test-interview-mode.shgrew from 19 to 76 checks. They cover:--setstoring the canonical name;unattended;--explainsource;auto-ishand empty values;test-interview-mode.shon mastertest-interview-mode.shon d3a75e1test-interview-mode.shon this headtest-bug12-sync.shtest-exec-approval.shtest-interview-gate.shrender-routing.sh --checkpasses, with the baseline at 74,995 → 75,038 words (budget 80,000).check-scripts,check-portabilityandcheck-pr-disciplineare clean.Instrument change: it adds no new parser of tool output. Paths are unchanged, and the code is bash 3.2 safe.
CHANGELOG.mdline appended, crediting MendixMau (found in the 1.0 README review)Review
auto? (to confirm with user),unattended? ask user,auto | steering,auto (proposed, not confirmed). d3a75e1 answered with a hedge word list plus?/|checks.auto / steering,auto or steering,auto (pending sign-off),(maybe),(tentative),(draft)and— awaiting userstill gave auto. A list of hedge words cannot converge, because there are always more ways to hedge. 09691fc replaces the list with a rule that cannot leak: a quieter mode is only taken when it stands alone on the line. Trailing text is tolerated only aftersteering, where a misread costs nothing because steering is already the loudest mode.auto (user asked 2026-10-14),**auto** — fast POC,Unattended, per user) now also give steering, with the stand-alone message. Telling a plain note from a hedge is exactly the problem the word list could not solve.🤖 Generated with Claude Code
https://claude.ai/code/session_01VJgWP5vEoAsNsJYqCDMGNw