Repository navigation
v0.1.64 — offline gaps closed, closed decisions refuse answers
v0.1.64 ships the four PRs merged on main since v0.1.63.
What ships
The rest of the offline gating, and an honest stalled load (#487, closes #477, refs #430).
- Remaining act paths gated offline: per-finding verdicts on research artifacts, the suggestion counter actions (Take the counter, Insist on mine, the counter reply), the conversation rail reply, and Send request. Each is disabled with the same visible reason as #467's controls, drafts are kept, and it re-enables on reconnect. The request composer now stays on screen during an outage instead of disappearing with your text. It is still hidden before the first connect.
- Stalled hydration is bounded: a connected tab whose first snapshot never applies used to show "Checking what needs you…" forever. After 10 s it now says "Still loading this session — it's taking longer than usual. It may still finish." with a Reload button. The deadline is scoped to the session and project the tab is bound to, so switching sessions doesn't inherit the previous one's state or deadline. A late load clears the message. With the Next-up bar on, it is announced once.
- Reload asks first: if any composer holds unsaved text, Reload opens an in-app confirm. Keep my text is the default (focused, Enter and Esc both keep), and only "Reload anyway" discards.
- No duplicate request: a request that succeeds after you switch A→B→A no longer brings its sent text back with Send enabled.
Resolve settle follow-ups (#491, closes #490).
- No spurious wake: a resolve that 503s and is rolled back no longer wakes long-polling
check_feedbackwaiters. They wake only when the write commits, or when something else happened during the hold. - Partial-write flush: if a flush lands
decisions.jsonand then fails on a later file, the answer is on disk. The request now counts as committed: 200, announced once, delivered. Otherwise it rolls back as before, and the rollback schedules a re-flush so what didn't land converges.
Late answers on closed decision cards are refused (#493, closes #492).
- Refusal: answering a decision whose card is superseded, retracted or obsolete now gets a 409
decision_closed, on both the public and internal resolve routes. Nothing is written or announced. The check runs inside the same atomic resolve as #484, so an identical re-pick of a recorded answer is still a no-op 200. - Revised questions: for a superseded card, or one that already has a newer version, the 409 links to the newest version. When that newer version can't take an answer either, there's no link, and the copy says so honestly.
- One rule: a shared
decisionCanAcceptAnswerdrives both the refusal and the successor link, on the server and in the card. - The stale card shows the closed state, with options readable and no Select buttons.
CI only: e2e time limits (#495, closes #494). The e2e job gets a 25-minute timeout and its Chromium install a 10-minute one. This came from a hung install that left #483's check pending for 4 hours. Not user-facing.
Not in this release: #439 and #478.
Review provenance
- #487: a Fable UX review (2 rounds), plus independent Claude lifecycle reviews that verified Sol's findings fixed.
- #491 and #493: independent Claude adversarial reviews. The #491 delta was written by Opus and reviewed by the Claude reviewer.
- #495: an independent Sonnet review.
- Merges: all four were merged by Opus under Mitch's authorization. The Codex re-review of #487 is still pending.
- Every round is recorded on its PR.
Verification
Measured on a fresh native clone, branch release/v0.1.64 off main d7e66ee4 (head 65abf694):
- Version sources: all four read 0.1.64.
- Diff vs
main: 6 files, 6 insertions and 6 deletions (the four version sources plus thedaemon.js/standalone.jsstamps). - 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 227 warnings (cap 240), shared 3 (cap 5).
- Tests: full
pnpm testpasses, 375 files and 5,700 tests (mcp-server 360 / 5,379, shared 15 / 321). - Checks:
version-lockstepandplugin-bundle-bootpass (2 files, 5 tests). - Rebuild: a second cold
pnpm build:cleanleaves the tree clean, andgrep -rF "0.1.63" claude-plugin/serverreturns nothing. - Conflict markers: none.