Repository navigation
v0.1.68 — the companion shows why the gate stopped you
v0.1.68 ships the 13 PRs merged on main since v0.1.67, all merge commits: #530, #536, #537, #539, #541, #542, #545, #547, #548, #550, #551, #552, #555.
What ships
Headline: the companion shows why the gate stopped you
The default gate is still ask. On Claude Code 2.1.301 the native permission prompt does not show the reason (upstream anthropics/claude-code#102892), so deepPairing now shows it in the companion.
- The companion shows the stance (#552, refs #544): when the gate asks or denies, the companion shows the matched stance, your original reason and the target. The hook writes a bounded, control-stripped record to
hooks-state.jsonand makes no network call. The daemon delivers it with a file watcher plus a stat-poll fallback, routed to the right session. Detailed gate payloads don't reach other sessions or the legacyhook_firedbroadcast. - The warning is mirrored (#545): both the init-generated and the plugin-bundled hook also copy the reason into the documented top-level
systemMessagefield. Ask decisions and fail-open handling are unchanged. - Strict-stop is opt-in (#547):
DEEPPAIRING_PREFLIGHT_MODE=strict-stopmakes a matching editdenyand stop, with the reason in three fields. Unset, empty oraskkeeps today's output. Any other nonempty value conservatively stops an existing match with a fixed warning. - Worker handoff docs (#548, docs only): they record that a worker subagent's strict-stop deny does not reach the parent (#553), and they bound a supervised retrieval step after each worker.
Decisions and rejections
- Reject is easy to find (#550, fixes #543): Reject and Request changes are enabled on an untouched draft. With an empty reason they focus the response box and prompt for one. The reason is still required.
- Unchosen options no longer become stances (#551, fixes #549): picking A used to record B as rejected, so a later proposal of B hit the gate. Now a pick records only the chosen option. The resolved card lists the others as "Not chosen" with an explicit "Never suggest this" button that asks you to confirm first.
- Remembered state refreshes (#555): an open decision card stops saying "Remembered as rejected" after you retire that stance. Cross-project concept removal is a separate operation.
Subagents and worktrees
check_feedbackroutes by presenter (#539, fixes #533): a subagent's answer can't be consumed by a context-less sibling. Delivery is also crash-safe: acknowledgements happen after the response is built, so a throw or cancelled call doesn't lose items. A dead presenter's decisions are held for about 60 seconds, then released.- One project root across git worktrees (#536, fixes #532): a linked worktree now shares the main checkout's ledger, so the rejection gate holds there.
- Hooks in worktrees (#542, fixes #538): doctor and the first-call preamble warn when the main checkout has hooks and the worktree doesn't, and
initinstalls them. Nothing is written automatically.
Keyboard, CI and protocol
- Next-up keyboard and focus (#530): arrow-key navigation works, Escape closes the queue, and focus returns correctly when a row or the Why button disappears.
- Next-up keyboard smoke in ordinary PR CI (#537): three bounded real-browser cases run in the normal E2E path.
- Coordinator experiment protocol (#541, docs only): preparation for the bounded trial in #540. It launches no trial and changes no product behavior.
Known limits (not claimed as fixed)
askstays the default, and strict-stop is opt-in.- A worker subagent's strict-stop deny doesn't reach the parent (#553).
- Preflight read and evaluation failures can still fail open (#546; #557 is in progress). This release does not claim fail-closed.
Not in this release: #556 and #557 (in review), the delegate slices S1–S6, #430 and #434.
Review provenance
Each is from the PR's comments.
- #552: Opus approved
b44946c3; a Sonnet delta approved4611450f. Sol requested changes on two session-isolation leaks, fixed at75dd9247and approved by Sol and by a Claude Sonnet delta check. Sol then took over the main refresh and approved26c4c4ba, merged as557fae2f, under Mitch's direct ownership-handoff instruction, which is recorded on #552. - #551: Opus requested changes at
a53d34ee, then approved7dabdcf6; Fable's UX check approved. Sol's post-merge P3 became #555. Merged under Mitch's authorization. - #550: Fable UX approved
19ac42e4, and an Opus delta check approved560638c4. Merged under Mitch's authorization. - #555: Sol approved
7073367c, thend902a4ae, then the metadata-only merged589e1fc. CI at merge is unconfirmed from the PR record. - #547: a non-author review approved
858e0cbf. A post-merge Claude Opus review found nothing to revert. - #545: Sol (GPT-6.1) approved
f2c60e4b. #548: a non-author review approvedfc64cb94. - #539: Opus requested changes at
1ff5527b, then approved5dabe042. - #536: Opus approved
92747e44. #542: Opus approved3779751f. - #541: Opus requested changes at
8674521d(stale against #539 and #536). Sol approved the final head81401637, and an Opus delta approved it. - #530: Sol requested changes at
9050e3e(the Why-opener focus path), then approved07c2b871. #537: a Sol review approved80aa0068. - #536, #539 and #542 were merged by Opus under Mitch's authorization to merge adversarially reviewed PRs, now recorded on each PR. Merge authorization for #541, #530, #537, #545, #547 and #548 is unconfirmed here: the record on those PRs shows merges but not who authorized them.
Verification
Measured on a fresh native clone, branch release/v0.1.68 off main 9677cf83:
- Version sources: all four read 0.1.68.
- Diff vs
main: 7 files, 7 insertions and 7 deletions (the four version sources plus thedaemon.js,standalone.jsanddoctor.mjsstamps). - Cold build:
pnpm install --frozen-lockfile, thenpnpm build:clean; the regenerated stamps are committed. - Typecheck: 3 of 3 tasks clean.
- Lint: 0 errors; mcp-server 219 warnings (cap 240), shared 3.
- Tests: full
FORCE_COLOR=0 NO_COLOR=1 pnpm testpasses on the first run, in the foreground: mcp-server 399 files and 6,024 tests, shared 15 files and 321 tests. No timing failures. - Checks:
version-lockstepandplugin-bundle-bootpass (2 files, 5 tests). - Rebuild: a second cold
pnpm build:cleanleavesgit statusclean, andgrep -rF "0.1.67" claude-plugin/serverreturns nothing. - Conflict markers: none.