Agents Execution
- Root cause. Codex was deliberately excluded from the hard
ready_floor_secondsthat gates the Claude and Antigravity seats, on the assumption its^>\s*$ready-prompt regex (SEAT_READY_PATTERNS["codex"]) was a reliable "ready" signal. It isn't — Codex paints a bare>on its loading screen before the input box is live, so the regex matched an early boot frame, readiness "confirmed", and only the general 2s post-ready grace stood between the match and the paste. That was not enough. - Fix. Added a
codexentry toSEAT_READY_PROFILES(terminal.py) withready_floor_seconds = _CODEX_READY_FLOOR_SECONDS(default 5s, env-tunable viaSKYBOLT_CODEX_READY_FLOOR_SECONDS), mirroring how Claude/Antigravity already suppress every readiness signal — the regex match included — for the first N boot seconds. The floor is shorter than Claude's 10s because Codex comes up in ~4-5s. The fast>regex still fires the instant the real prompt appears once the floor elapses; the general 2s post-ready grace is unchanged. - Tests.
tests/test_terminal.py::test_seat_ready_profile_codex_has_ready_floor(new); the oldtest_seat_ready_profile_default_has_no_settle_overrideno longer listscodex(it now has a profile) and coversaider/opencode/unknown instead. - Root cause. Review-ness of a seat was inferred solely from the edge's
participation_role(plus the retired legacyreview_agentrole). The claim gate only admits a *review* session to areview-lane card (_claim_next/_is_review_session), and a reviewer routed asownersnapshots a plain repo-change contract (create_agent_session_recordresolves the contract without the role_key), so_is_review_sessionreturned False and the card wedged. - Fix — review-ness is now keyed off the ROLE, like merge roles. New
REVIEW_ROLE_KEYS(constants.py) ={review_agent, code_review_agent, code_qa_reviewer}.resolve_work_contractresolves any of these to the read-only review contract regardless of the edge's participation, and the scheduler's_is_review_sessionrole fallback recognises the same set — so a reviewer handed a card by ANY agent (not just the orchestrator, and not only via a reviewer-participation edge) claims its review-lane card and returns a pass/fail verdict that routes onward. An explicitparticipation_role="reviewer"edge still works for every other role. - Tests.
tests/test_work_contracts.py(role precedence) andtest_scheduler.py::test_review_role_claims_review_card_via_plain_workflow_edge(acode_review_agentseat with a defaultownerparticipation claims areviewcard).
Cloud Identity (skybolt.ai)
- Bug. Popping a terminal into its own OS window failed with "Not authenticated" while docked terminals worked.
_require_local_session(instore/project_store.py) only fell back to the middleware-validated per-launch engine bearer token when theskybolt_engine_sessioncookie was absent. A freshly-created pop-out webview attaches a lingering pre-restart cookie from the shared WebView cookie jar that no longer maps to a livelocal_sessionsrow, so the "cookie present" branch returned 401 without ever attempting the desktop-token recovery. Docked terminals reused the main window's live session, so they were unaffected. - Fix.
_require_local_sessionnow recovers the latest unexpired local session via the desktop engine token whenever the cookie is missing or present-but-invalid — same trust level (the per-launch token is loopback/host/origin-gated byrequire_engine_tokenmiddleware), so a valid cookie still binds to its exact session and an unauthenticated request still 401s. - Tests.
test_desktop_engine_token_recovers_session_with_stale_cookieasserts a session-gated route succeeds with a staleskybolt_engine_sessioncookie + engine bearer token (regression guard); the existing dropped-cookie and logout tests continue to pass.
Dashboard
- Removed the deterministic mock dashboard-stat fallback. A failed or still-loading local aggregate now produces an explicit loading or unavailable state, while project shortcuts continue to work.
- The dashboard no longer shows invented activity, usage, cost, or build signals.
Settings & Storage
- Documented destination preflight, no-merge/no-overwrite moves, rollback, and Engine recovery after a failed relocation.
- Replaced obsolete git-crypt/blob-sync guidance with the active ADR-0069/0070 record-envelope boundary: the live database and raw artifacts remain device-local.
SSH Machines
- Replaced silent first-connect acceptance with
StrictHostKeyChecking=yesacross SSH adapter and operation paths. A new host must be verified and added to the user's OpenSSHknown_hostsbefore Skybolt can connect; a changed key remains a hard block.