Scope embedded Desktop refresh and connection ownership to the active presented sidebar slot. Hidden retained panels now invalidate pending work and disconnect RFB, while reactivation returns to a freshly loaded picker without silently reconnecting.
* fix(agents): scope simple completion runtime preparation
Explicit local model runs no longer build the broad plugin/live model catalog before inference.
Related to #125802 and #125834 as discovery context only; this commit does not claim to close either issue.
* refactor(agents): simplify runtime scope planning
Reuse canonical configured-slot and metadata-snapshot resolution, and consolidate test temp cleanup without changing the selected prepared-runtime contract.
* fix(codex): preserve model effort capabilities
Keep public model identities separate from app-server execution routing, and retain provider-owned complete effort metadata when account discovery is partial.
Fixes#126005
* refactor(codex): avoid redundant thread rotation
* fix(codex): preserve model fallbacks without leaking wire ids
Records native Telegram Desktop from a digest-pinned prebaked image: a ready desktop in ~12s with no per-lease apt installs or downloads, which also removes the dpkg-lock failures that killed recent runs.
The recorder only records; callers drive the turn and supply the TDLib driver used for QR authorization. Nothing in this repository invokes it yet - routing the Mantis Telegram Desktop Proof workflow through it is a follow-up.
Paired Control UI device credentials now share the canonical same-origin read authorizer, while session-derived routes retain read+owner policy. Fresh dashboard handoffs and reloads can therefore render workspace, channel, and plugin icons without exposing or persisting the shared Gateway secret.
Remove the old shared-secret-first UI workaround.
* fix(ui): preserve workshop revisions until admission
Skill Workshop revision instructions now remain retryable until the Gateway admits the request, including navigation and overlapping admission failures.
* fix(ui): materialize workshop revision binding
Manifest-only Skill Workshop proposals now resolve their revision hash inside the durable admission owner, and retries reuse the same binding and idempotency key.
* chore(ui): keep revision types internal
* fix(msteams): preserve replies across ingress replay
Recovered Teams channel and group-chat responses now preserve reply and quote context across durable ingress replay. Discovery metadata also advertises the existing group and reaction capabilities.
* chore(msteams): document replay assertion safety
* test(msteams): normalize replay delivery errors
* perf(gateway): remove repeated logging and delivery scans
Exact session-delivery retries no longer scan the full queue. Logging and diagnostics reuse lifecycle-owned settings and listener interest so uninterested projections are skipped, while outbound WebSocket summaries are built only after recipient admission.
* fix(infra): break diagnostic listener import cycle
Keep event-type validation at the diagnostic dispatcher while the process-wide listener presence counter remains a leaf module.
* test(cli): use logging override owner
Exercise late one-shot JSON diagnostics through the canonical logger override setter so lifecycle-cached console settings are invalidated as they are in production.
* test(auth): use logging override owner
Configure the locked-update warning test through the canonical logger override setter so lifecycle-cached console settings are invalidated before assertion.
* test(gateway): normalize redacted media fixture
Compare durable inbound media facts against the public redaction contract so random identifiers that resemble sensitive text do not make the Gateway suite flaky.
* fix(channels): reject malformed ingress queue claims instead of minting sentinel identity
A status=claimed row missing claim_token, claim_owner, or claimed_at was
decoded into a fake claim (token "", owner "", claimedAt 0). Release then
guarded on claim_token = "" (never matches NULL) and the stale-claim scan's
claimed_at <= cutoff never selected NULL timestamps, so such rows were stuck
claimed forever and blocked their dedupe slot.
Claimed rows now decode through a strict claim-column decoder; malformed
claims are tombstoned as failed/corrupt_claim by stale recovery without an
ownership-policy consult (no reachable owner can exist), preserving a valid
payload so the event stays operator-resubmittable. Regression test fails
pre-fix: listClaims leaked the sentinel claim and recovery never scanned
the row.
* fix(channels): rename recovery claim decode variable to avoid method shadow
* fix(channels): scan malformed claims into recovery regardless of timestamp
A claimed row missing token/owner but carrying a corrupt future claimed_at
dodged both the cutoff and IS NULL predicates, so it never reached the strict
decoder. Recovery now selects any row with incomplete claim columns; the
malformed-claim tombstone relies on the exact-token guard alone instead of a
stale-cutoff comparison its timestamp cannot satisfy.
* fix(workboard): recover interrupted worker launches
Persist prepared, accepted, and failed launch phases so Gateway restart reconciliation cannot leave cards permanently running between launch preparation and worker acceptance.
* fix(workboard): require durable terminal evidence
Do not synthesize terminal-session acceptance timing during restart reconciliation; stale same-key terminal rows without updatedAt now fail the prepared launch instead of being adopted.
* fix(gateway): bound audit and Codex backlogs
Live Gateway SQLite lock failures and process heap pressure exposed two
independent queue owners. Route best-effort audit persistence through the
canonical shared-state connection with bounded contention retries, and remove
the per-notification Codex yield so the keyed turn queue can drain directly.
Follow-up to #126033 and #126073.
* fix(gateway): annotate raw SQLite cold-open probe
* test(codex): register notification burst shard
startChatDispatch reserved the detached dispatch's root-work continuation
after the ACK, and swallowed a failed reservation with ?? undefined. When
the reservation did not land, the request's root was released before
chat-send-dispatch-errors finalize() awaited
persistGatewaySessionLifecycleEvent, so a concurrent restart drain saw
zero active roots and completed while the session's terminal state was
still being written.
Reserve in admitChatSend instead, where the request root is provably
live, and release it from the single cleanupAdmittedRun owner. Callers
outside a Gateway request envelope hold no root, so their continuation is
a no-op.
The regression now starts a real waitForActiveGatewayRootWork() drain
while persistence is blocked and asserts it cannot settle until the write
is released, instead of asserting an absolute process-global counter.