Skip to content

v0.1.68 — the companion shows why the gate stopped you

Choose a tag to compare

@mitchjablonski mitchjablonski released this 18 Oct 00:49
8bcdefa

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.json and 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 legacy hook_fired broadcast.
  • The warning is mirrored (#545): both the init-generated and the plugin-bundled hook also copy the reason into the documented top-level systemMessage field. Ask decisions and fail-open handling are unchanged.
  • Strict-stop is opt-in (#547): DEEPPAIRING_PREFLIGHT_MODE=strict-stop makes a matching edit deny and stop, with the reason in three fields. Unset, empty or ask keeps 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_feedback routes 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 init installs 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)

  • ask stays 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 approved 4611450f. Sol requested changes on two session-isolation leaks, fixed at 75dd9247 and approved by Sol and by a Claude Sonnet delta check. Sol then took over the main refresh and approved 26c4c4ba, merged as 557fae2f, under Mitch's direct ownership-handoff instruction, which is recorded on #552.
  • #551: Opus requested changes at a53d34ee, then approved 7dabdcf6; 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 approved 560638c4. Merged under Mitch's authorization.
  • #555: Sol approved 7073367c, then d902a4ae, then the metadata-only merge d589e1fc. 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 approved fc64cb94.
  • #539: Opus requested changes at 1ff5527b, then approved 5dabe042.
  • #536: Opus approved 92747e44. #542: Opus approved 3779751f.
  • #541: Opus requested changes at 8674521d (stale against #539 and #536). Sol approved the final head 81401637, and an Opus delta approved it.
  • #530: Sol requested changes at 9050e3e (the Why-opener focus path), then approved 07c2b871. #537: a Sol review approved 80aa0068.
  • #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 the daemon.js, standalone.js and doctor.mjs stamps).
  • Cold build: pnpm install --frozen-lockfile, then pnpm 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 test passes 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-lockstep and plugin-bundle-boot pass (2 files, 5 tests).
  • Rebuild: a second cold pnpm build:clean leaves git status clean, and grep -rF "0.1.67" claude-plugin/server returns nothing.
  • Conflict markers: none.