Skip to content

Upgrade to Lash main 9debf5aab: turn-start identity, dock retention, lash-core elimination - #16

Merged
SamGalanakis merged 6 commits into
mainfrom
upgrade/lash-9debf5a
Aug 29, 2026
Merged

SamGalanakis merged 6 commits into
mainfrom
upgrade/lash-9debf5a

Conversation

@SamGalanakis

Copy link
Copy Markdown
Owner

Upgrade lash-cli from Lash main 8dac97fa5 to 9debf5aab (git pin, not a release), adopting the fixes Lash landed for our filed feedback and the two product bugs the verification battery surfaced.

What changed

  • Pin Lash main 9debf5aab. 57 upstream commits. Version stamps (all derived): session schema 45, trace schema 10, remote protocol 49. The BLAKE3 identity cutover is a forward-only durable-format change: pre-45 stores are refused by preflight with detected/expected stamps; --reset starts fresh (no migration, per upstream contract).
  • Explicit queued-work ownership. Upstream removed the implicit driver: interactive cores build .without_queued_work() (preserving the CLI-owns-visible-queued-turns contract from Queued next-turn input executes headlessly via the post-turn catalog sync drain — user row and response never render #12), autonomous cores .with_native_queued_work(). InlineEffectHost → NativeEffectHost.
  • First-class turn-start identity (FIG-2205 landed). TurnEvent::TurnStarted { turn_id } is now the preferred source of active-turn identity for Escape-cancel targeting; the old first-activity inference remains only as a release-mode fallback (warn + adopt) with a debug tripwire on id divergence. Tests prove TurnStarted arrives first and immediately targets cancellation for direct turns, queued turns, and selected-batch drains.
  • lash-core dependency eliminated (FIG-2206 landed). PruneState and testing::run_tool moved to facade homes; zero lash_core:: references remain in the workspace.
  • Dock shows completed processes (Process dock never shows sub-second or completed processes: snapshot feed is Running-filtered #14). Subagent spawns are durable Runtime Processes again at this pin (upstream restored process admission — the no-dock behavior at 8dac97fa5 was a regression window). The dock snapshot feed now uses list_all() with a recency guard, so the existing 10-second terminal retention window actually functions; sub-second processes render deterministically instead of by snapshot luck. Post-cancel refresh uses the same all-statuses feed.
  • New config keys documented: options.reliability.response_start_timeout (ms) and per-MCP-server graceful_period_ms / post_kill_wait_ms. No new CLI flags.
  • Commit-budget regression added for the upstream change that measures the complete RuntimeCommit against CommitBudget (CLI policy unchanged at 1 MiB / 512 rows).
  • Runbooks: process-dock rewritten to the restored subagent-process contract (with a durable processes.db cross-check); resume-picker gates rebuilt as action-driven repaints (a differential renderer never re-emits unchanged rows, so post-clear gates must target rows the next action repaints).

Verification

cargo fmt --check; workspace clippy -D warnings; cargo test --workspace (463 passed); cli_e2e 12/12; scripts/check_docs.py; operator battery: quickstart, turn-flow-and-queueing (all gates including queued next-turn delivery and slow-turn exactly-once), cancel-semantics, process-dock (restored contract incl. durable lifecycle cross-check), resume-picker (all five score rows) — all PASS on this pin.

Review outcome

Independent fresh review of the re-pin diff approved the design and requested one change (adopted): keep the first-activity fallback so a release build degrades gracefully if the upstream TurnStarted-first ordering ever regresses. A second focused review of the post-review delta approved the fallback as defensive-only (the sink cannot receive a foreign turn id) and flagged the dock feed's polling cost — list_all() does one serialized lease lookup per ever-observed process on the ~250ms snapshot cadence, monotonic per session — tracked as #15 with two bounded fix directions; the required modals.rs all-statuses fix is included here.

Release-Notes

  • Build against Lash main (9debf5aab). Pre-existing stores (schema ≤44) are refused with a clear stamp report; use --reset to start fresh (BLAKE3 identity cutover, no in-place migration).
  • Escape-cancel targeting now uses Lash's first-class turn-start identity.
  • Background processes that finish quickly (including subagent spawns, which are durable Runtime Processes again) now appear in the dock for a short retention window.
  • New config keys: provider options.reliability.response_start_timeout (ms), MCP graceful_period_ms / post_kill_wait_ms.

Samuel Galanakis and others added 6 commits August 29, 2026 23:56
Select queued-work ownership explicitly: interactive and fixture cores run without background queued work, while autonomous cores use the native queued-work driver. Rename the native effect host and preserve the CLI-owned visible-turn and selected catalog-drain contract.

Adopt TurnStarted as the sole active-turn targeting signal for direct, ordinary queued, and selected-batch turns (FIG-2205), with exact-cancellation and complete-commit-budget regression coverage. Complete the Lash facade migration and remove direct lash-core dependencies (FIG-2206).

Keep the BLAKE3/schema-45 transition forward-only through preflight refusal and --reset, derive version assertions from upstream constants, and document response-start plus MCP shutdown timing configuration.

Release-Notes: Existing schema-44 stores require `lash --reset`; provider configs may set `options.reliability.response_start_timeout`, and MCP servers may set `graceful_period_ms` and `post_kill_wait_ms`.
Prefer TurnStarted for active-turn targeting, but publish the emitted turn id from the first physical-turn activity if the ordering contract regresses. This lets release builds degrade gracefully without losing Escape-cancel targeting while retaining the debug tripwire for announced/emitted id divergence.

Release-Notes: none (internal resilience fix)
Document restored durable subagent process admission with dock and process-store lifecycle gates.

Clear capture immediately after each resume-picker escape so later commands wait for a freshly dismissed frame.

Release-Notes: none (runbook documentation only)
The Running-filtered process snapshot feed starved the dock of terminal transitions, so fast background processes could flash or never render.

Use list_all() with a durable recency guard to retain tracked completions for the existing 10-second window without resurrecting stale terminal rows. Carry the observation timestamp in a typed ProcessSnapshot instead of hiding metadata in the process definition.

Fixes #14.

Release-Notes: background processes that finish quickly now appear in the dock for a short window instead of flashing or never rendering.
The differential renderer never re-emits unchanged rows, so post-clear gates must target rows the next action repaints.

Release-Notes: none (runbook documentation only)
The post-cancel refresh still used the running-only process list, so a
cancelled process inside its retention window vanished from the dock and
then reappeared with a fresh window on the next full snapshot.

Release-Notes: none (follow-up to the dock retention fix)
@SamGalanakis
SamGalanakis merged commit fca6a88 into main Aug 29, 2026
4 checks passed
@SamGalanakis
SamGalanakis deleted the upgrade/lash-9debf5a branch August 29, 2026 23:11
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant