Skip to content

v0.1.64 — offline gaps closed, closed decisions refuse answers

Choose a tag to compare

@mitchjablonski mitchjablonski released this 08 Oct 20:48
ee7fcfd

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_feedback waiters. They wake only when the write commits, or when something else happened during the hold.
  • Partial-write flush: if a flush lands decisions.json and 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 decisionCanAcceptAnswer drives 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 the daemon.js / standalone.js 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 227 warnings (cap 240), shared 3 (cap 5).
  • Tests: full pnpm test passes, 375 files and 5,700 tests (mcp-server 360 / 5,379, shared 15 / 321).
  • Checks: version-lockstep and plugin-bundle-boot pass (2 files, 5 tests).
  • Rebuild: a second cold pnpm build:clean leaves the tree clean, and grep -rF "0.1.63" claude-plugin/server returns nothing.
  • Conflict markers: none.