Peter Steinberger
9e9615d7c1
refactor(codex): prune migration pipeline ( #113536 )
2026-07-25 00:58:11 -07:00
Vincent Koc
749dbcb2a7
refactor(media): consolidate generated media byte limits ( #113556 )
2026-07-25 15:39:49 +08:00
Peter Steinberger
4f1b5da9d8
refactor(codex): split app-server config ( #113552 )
...
* refactor(codex): split app-server config
* refactor(codex): keep config helper types private
2026-07-25 00:36:50 -07:00
Peter Steinberger
d734df9d0f
test(codex): read canonical steering terminal outcome ( #113416 )
2026-07-24 14:39:27 -07:00
Jason (Json)
ee606def49
fix(codex): stop Computer Use readiness stalls across fallbacks ( #113393 )
...
* fix(codex): bound computer use readiness preflight
* chore(codex): keep service status internal
2026-07-24 14:27:53 -06:00
scotthuang
2900026b33
fix: stop selected channel sessions from WebChat ( #111108 )
...
* fix: stop selected channel sessions from WebChat
* fix: clear channel working state after stop
* fix: cancel queued turns before session abort
* fix: replay pending stops after reconnect
* fix: align stop lifecycle test fixtures
* fix(ui): bind pending aborts to gateway client
* test(ui): keep chat pane specs within line limit
* chore(ios): refresh native i18n inventory
* chore: retrigger PR checks
* fix(system-agent): avoid blocking TUI catalog discovery
* fix: preserve session abort ownership
* test: align abort coverage with current main
* test: assert scoped session abort broadcast
* fix(agent-runs): expose SDK runtime abort state
* fix(ui): clear queued main-session stops by scope
* fix(ui): replay only exact run aborts
* fix(gateway): protect session abort cleanup
* fix(ui): narrow session abort intent
* test(ui): avoid unbound request assertions
---------
Co-authored-by: scotthuang <scotthuang@tencent.com >
Co-authored-by: Patrick Erichsen <patrick.a.erichsen@gmail.com >
2026-07-24 14:36:18 -05:00
Peter Steinberger
756b6f7009
fix(release): repair plugin prerelease regressions ( #113373 )
2026-07-24 10:20:32 -07:00
Peter Steinberger
6235ea55ac
refactor(codex): split command handlers ( #113335 )
...
* refactor(codex): split command handlers
* refactor(codex): keep helper types private
2026-07-24 07:29:44 -07:00
Peter Steinberger
7584d9585b
refactor(codex): consolidate app-server test fixtures ( #113246 )
...
* test(codex): consolidate app-server fixtures
* test(codex): align legacy heartbeat coverage
2026-07-24 01:54:55 -07:00
Jason (Json)
aee46707ba
feat(plugins): support manifest-declared MCP Apps in native plugins ( #113224 )
...
* feat(plugins): load native manifest MCP servers
* fix(gateway): advertise proxied plugin surface ports
* fix(codex): retain MCP App transcript previews
* fix(codex): render native MCP apps inline
* fix(mcp-apps): resolve harness-native views by session
* fix(codex): normalize null MCP result metadata
* fix(ui): give inline MCP apps full message width
* test(codex): use generic native MCP App fixtures
* chore(plugin-sdk): refresh harness runtime baseline
* refactor(codex): isolate native MCP App contracts
* fix(codex): satisfy native app CI contracts
* fix(ci): scope automation app tokens
* chore(ci): defer token scopes to current main
2026-07-24 01:43:48 -06:00
joshavant
bd559a98ed
fix(cron): migrate scheduled authority provenance
2026-07-24 01:24:03 -05:00
joshavant
5d21ba0a2a
fix(cron): bind scheduled authority to creator accounts
2026-07-24 01:24:03 -05:00
joshavant
d8f1f098e5
fix(cron): honor explicit authority for senderless runs
2026-07-24 01:24:03 -05:00
Peter Steinberger
3b7b2a2a1f
chore: update dependencies and migrate major contracts ( #112963 )
...
* build(deps): complete latest dependency migrations
* fix(deps): satisfy updated dependency types
* fix(deps): hold incompatible build tooling
* fix(deps): preserve portable tooling contracts
* build(deps): allow reviewed fresh transitive releases
* fix(deps): repair major upgrade validation
* build(deps): regenerate current dependency graph
* fix(logging): keep tslog adapter type private
* fix(agents): narrow grep subprocess handle
* fix(codex): prefer pinned managed binary
* fix(codex): fence managed native provenance
* build(deps): align codex ACP with managed harness
* fix(slack): use socket-mode Undici runtime
* fix(slack): detect cross-runtime responses
* fix(slack): bridge package-owned fetch types
* fix(deps): retain tslog v4 JSON contract
* build(plugin-sdk): refresh logging API manifest
2026-07-23 21:21:01 -07:00
Peter Steinberger
61f036f748
refactor(agents): close embedded attempt terminal outcomes ( #113201 )
...
* refactor(agents): close embedded attempt outcomes
* test(agents): align trajectory terminal fixture
* refactor(codex): share attempt failure type
* fix(codex): retain projector result contract
* test(agents): keep terminal projections test-only
* chore(plugin-sdk): refresh attempt terminal baseline
2026-07-23 19:56:03 -07:00
Peter Steinberger
bb657eec93
refactor(config): retire redundant settings ( #113174 )
...
* refactor(config): retire redundant settings
* style: apply current formatter
* chore: update plugin sdk baseline
* fix: keep Codex tool caps context-aware
* chore: remove stale imports
* test: align WhatsApp QA debounce config
* fix(config): clean up retired config checks
* fix(ci): align config cleanup checks
2026-07-23 17:45:02 -07:00
Jason (Json)
09c6d66d19
fix(ui): render managed chat media under base paths ( #113163 )
2026-07-23 16:49:14 -06:00
Peter Steinberger
3e2b3ea4d5
feat(cron): database-backed heartbeat monitor scratch replaces HEARTBEAT.md ( #112967 )
...
* feat(cron): move heartbeat context into database-backed per-job cron scratch
- new additive cron_job_scratch SQLite table (revision tombstones keep
compare-and-swap monotonic across unset/recreate; 256KiB cap)
- heartbeat runner reads monitor scratch instead of workspace HEARTBEAT.md;
heartbeat_respond gains a private scratch replacement parameter
- openclaw doctor --fix migrates HEARTBEAT.md into scratch (hash-verified,
archived under state backups, idempotent, symlink-contained)
- gateway cron.scratch.get/set admin RPCs + openclaw cron scratch CLI
- workspace bootstrap no longer seeds HEARTBEAT.md; Codex heartbeat file
guidance removed; docs and prompt snapshots updated
* fix(cron): review round 2 — shared-workspace heartbeat migration and non-default agent monitors
- doctor migration groups agents by heartbeat source file and imports into
every monitor before archiving/removing the shared file once
- exempt heartbeat payloads from the main-session default-agent restriction:
monitors only poke the wake bus, so non-default agents converge again
- document why disabled monitors retain their last cadence (config default
already resolves before the fallback)
* fix(cron): honor configured cron store, legacy heartbeat fallback, and safer doctor claim
* fix(cron): claim HEARTBEAT.md before committing scratch and restore without clobbering
* fix(cron): pin migration CAS to precondition revision, re-verify claim on release, archive first, report scratch as pending
* docs(heartbeat): remove retired config options
* fix(cron): crash-recoverable migration claims, partial-import rollback, latest-response scratch pairing
* test(heartbeat): keep latest scratch proposal paired
* fix(cron): roll back committed scratch on changed-claim release and restore no-row state
* fix(cron): revision-guarded rollback delete and recreated-file detection on claim release
* fix(cron): treat every failed claim re-verification as a migration conflict
* test(heartbeat): rename ack test after ackMaxChars retirement
* fix(heartbeat): keep monitor scratch out of bypass-scope runs
* fix(cron): resolve claimed symlinks on release and gate legacy fallback on proven scratch state
* fix(cron): strict claim-name recovery and per-entry migration grouping
* fix(ci): heartbeat scratch gate repairs — lint causes, dead exports, since-train, inventory path, prompt snapshot, regenerated docs map, SDK baseline, protocol bindings
* fix(cron): live-owner claim guard and canonical entry-key migration grouping
* fix(cron): archive claimed inode on release and flag orphan claims beside recreated files
* docs(cron): document process-global state-db invariant for scratch service ops
* chore(i18n): refresh native inventory line numbers after protocol binding regen
2026-07-23 11:10:49 -07:00
Peter Steinberger
3608baa853
test(codex): deduplicate run-attempt scenarios ( #113076 )
...
* test(codex): deduplicate run attempt scenarios
* test(codex): satisfy run-attempt lint
2026-07-23 09:27:44 -07:00
Peter Steinberger
09672312c4
feat(gateway): incognito sessions for the web Control UI ( #113006 )
...
* feat(gateway): add web-only incognito sessions held in process memory
* feat(ui): add incognito toggle and badges to the web new-session flow
* fix(sessions): classify incognito by key shape, fail closed on stale keys, and gate memory writes
* fix(codex): start harness threads ephemeral for incognito sessions
* fix(sessions): reshape internal-effects incognito keys and add doctor repair for reserved key collisions
* refactor(plugin-sdk): export canonical incognito key classifier and guard the sentinel path
* fix(state): classify incognito DB handles from the recorded open-time set
* fix(gateway): isolate incognito sessions from durable lineage and allocation on read-only misses
* docs(sessions): pin the reserved incognito namespace ownership decision
* feat(gateway): admin-scope incognito visibility and incognito-blind cross-session surfaces
* fix(ci): repair kysely guardrails, dead export, docs map, protocol bindings, and ACP reset rotation
* fix(gateway): remove non-admin observability side channels for incognito sessions
* fix(gateway): enforce admin-scope incognito access and cover all parent-reference creation paths
2026-07-23 09:04:36 -07:00
Peter Steinberger
88963299e7
test(codex): deduplicate turn watch scenarios ( #113061 )
2026-07-23 09:03:05 -07:00
Peter Steinberger
ad505a7b55
fix(swarm): keep collector results reliable through races and restarts ( #112989 )
...
* fix(swarm): harden collector lifecycle and dashboards
* fix(swarm): initialize collector completion state
* test(swarm): satisfy cross-environment type checks
* test(codex): allow direct request handler calls
* style(ui): avoid Swarm widget shadowing
* test(swarm): keep internal helpers private
* refactor(ui): own Swarm roster helpers in runtime
2026-07-23 06:26:31 -07:00
Peter Steinberger
852548ce05
feat(onboard): stage migration imports before promotion ( #112798 )
...
* feat(onboard): stage migration imports before promotion
* fix(onboard): harden migration recovery
* fix(onboard): commit promoted config with CAS
* fix(onboard): resume setup after migration recovery
* test(onboard): split noninteractive migration coverage
* refactor(onboard): split migration promotion helpers
* fix(onboard): normalize migration preparation cleanup
* fix(onboard): preserve recovered inference ownership
* fix(codex): complete empty deferred plugin config
* fix(codex): reconcile deferred plugin config retries
* fix(onboard): resolve verification target after rebase
* refactor(onboard): trim retired migration exports
* test(onboard): assert read-only auth prompt store
2026-07-23 07:06:01 -04:00
Peter Steinberger
9f13f9b140
feat(openai): make million-token context an explicit opt-in ( #112916 )
...
* feat(openai): add safe long-context opt-in
* fix(ci): keep long-context checks within gates
* fix(ci): keep Codex usage helpers internal
2026-07-23 05:34:54 -04:00
Jason (Json)
93c48a6adb
fix: steer active Codex tasks from the Control UI ( #112858 )
...
* fix(codex): enable transcript-backed active steering
* test(codex): keep persistent fixture tool policy
* test(codex): type mock tool capability
* test(codex): scope persistent policy fixtures
* chore: refresh PR CI base
* test(codex): stabilize persistent run fixtures
* test(codex): preserve lifecycle cached-search baseline
2026-07-23 01:59:50 -06:00
Jason (Json)
307b3060a9
fix: hide memory maintenance turns from chat ( #112942 )
...
* fix: hide memory maintenance turns from chat
* chore: update plugin SDK API baseline
* chore: account for harness visibility export
2026-07-23 01:02:27 -06:00
joshavant
a71ac33928
fix(codex): reject interrupted finalization turns
2026-07-22 06:04:27 -05:00
joshavant
6eea20ce18
fix(agents): finalize settled tool turns safely
2026-07-22 06:04:27 -05:00
joshavant
60f49dcc04
fix(agents): isolate settled-turn finalization
2026-07-22 06:04:27 -05:00
Peter Steinberger
6f29fc88e9
refactor(sessions): migrate pure readers to read-only session accessors ( #112568 )
...
* refactor(sessions): migrate pure readers to read-only session accessors
* test(sessions): teach mocks and declarations the read-only accessors
* test(sessions): align remaining harnesses with read-only accessors
2026-07-22 01:16:35 -07:00
Peter Steinberger
c24a215fe4
fix: prevent announce restart recovery cascades ( #112534 )
...
* fix(agents): stop announce restart recovery cascades
Reconcile interrupted completion handoffs from existing run and transcript provenance, and keep their CLI, embedded, and Codex execution tool-free.\n\nCo-authored-by: Moeed Ahmed <moeedahmed@users.noreply.github.com >
* chore: preserve prior-art credit
Co-authored-by: Moeed Ahmed <moeedahmed@users.noreply.github.com >
* fix(agents): prefer explicit restart recovery runs
* fix(agents): revalidate announce recovery ownership
* test(agents): consolidate announce recovery cases
* fix(agents): preserve silent announce fallback
---------
Co-authored-by: Moeed Ahmed <moeedahmed@users.noreply.github.com >
2026-07-22 00:05:18 -07:00
Jason (Json)
735a6acd56
fix(codex): label unnamed sessions from previews ( #112497 )
2026-07-21 22:53:05 -06:00
Peter Steinberger
edecdbd05e
refactor(config): config-surface reduction tranche 3 — product consolidations (review request) ( #111527 )
...
* refactor(config): consolidate media model lists
* refactor(config): unify memory configuration
* refactor(config): consolidate TTS ownership
* refactor(config): move typing policy to agents
* refactor(config): retire product-level config surfaces
* refactor(config): share scoped tool policy type
* chore(config): refresh generated baselines
* fix(config): honor agent typing overrides
* fix(config): migrate sibling config consumers
* refactor(infra): keep base64url decoder private
* fix(config): strip invalid legacy TTS values
* chore(config): refresh rebased baseline hash
* fix(doctor): route legacy messages.tts.realtime voice to talk during tts move
* refactor(config): polish final layout names
* refactor(config): freeze retired tuning defaults
* feat(config): add fast mode default symmetry
* refactor(config): key agent entries by id
* docs(config): update final layout reference
* test(config): cover final layout migrations
* chore(config): refresh final layout baselines
* fix(config): align final layout runtime readers
* fix(config): align remaining readers
* fix(config): stabilize final layout migrations
* fix(config): finalize config projection proof
* fix(config): address final layout review
* docs(release): preserve historical config names
* fix(config): complete keyed agent migration
* fix(config): close final migration gaps
* fix(config): finish full-branch review
* fix(config): complete runtime secret detection
* fix(config): close final review findings
* fix(config): finish canonical docs and heartbeat migration
* fix(config): integrate latest main after rebase
* refactor(env): isolate test-only controls
* refactor(env): isolate build and development controls
* refactor(env): collapse process identity indirection
* refactor(env): remove duplicate config and temp aliases
* docs(env): define the operator-facing allowlist
* ci(env): ratchet production variable count
* fix(env): remove stale provider helper import
* fix(env): make ratchet sorting explicit
* test(env): keep test seam in dead-code audit
* test(env): cover ratchet growth and boundary; document surface budgets
* docs(config): document tier-eval consolidations
* docs(config): clarify speech preference ownership
* test(memory): align retired tuning fixtures
* refactor(memory): freeze engine heuristics
* refactor(config): apply tier-eval tranche
* refactor(tts): move persona shaping to providers
* refactor(compaction): move prompt policy to providers
* test(config): align hookified prompt fixtures
* chore(deadcode): classify test-only exports
* chore(github): remove unused spawn helper
* chore(deadcode): classify queue diagnostics
* chore(deadcode): remove unused lane snapshot export
* chore(plugin-sdk): ratchet consolidated surface
* fix(config): integrate latest main after rebase
2026-07-21 20:28:43 -07:00
Jason (Json)
c4911a2c77
improve(ui): simplify coding agent session headers ( #112354 )
...
* improve: simplify coding session catalog headers
* improve: simplify coding session catalog headers
2026-07-21 15:27:49 -06:00
pash-openai
b0341b8693
Allow Codex plugin discovery enough startup time ( #112418 )
2026-07-21 14:22:23 -07:00
Andy Ye
5f05c54e87
fix(approvals): handle stale plugin waits ( #88203 )
...
* fix(approvals): handle stale plugin waits
Recognize the gateway stale-id message through the shared classifier and map stale exec, Codex app-server, and native PermissionRequest waits to their existing fail-closed or defer contracts without swallowing aborts.
Closes #88111
Co-authored-by: Andy Ye <35905412+TurboTheTurtle@users.noreply.github.com >
* style(approvals): type stale wait catch values
Satisfy the catch-callback unknown lint without changing approval behavior.
Co-authored-by: Andy Ye <35905412+TurboTheTurtle@users.noreply.github.com >
---------
Co-authored-by: Peter Steinberger <steipete@gmail.com >
2026-07-21 01:56:38 -07:00
mikasa
7a73531321
fix(codex): stream sandbox file copies ( #101511 )
...
* fix(codex): cap sandbox file copy reads
Co-Authored-By: Claude <noreply@anthropic.com >
* test(codex): use PathUri in oversized copy proof
* fix(codex): stream sandbox file copies
Co-authored-by: mikasa0818 <0668001030@xydigit.com >
---------
Co-authored-by: Claude <noreply@anthropic.com >
Co-authored-by: Peter Steinberger <steipete@gmail.com >
2026-07-20 23:03:04 -07:00
Josh Avant
33720886c8
fix(agents): keep sender-scoped tools in delegated runs ( #110345 )
...
* fix(agents): preserve requester policy across delegation
* fix(agents): keep policy types internal
* test(codex): cover delegated policy forwarding
* fix(agents): harden delegated policy contract
* fix(agents): preserve split-owner completion policy
* fix: version delegated requester snapshots
* fix: refresh delegated policy protocol artifacts
2026-07-20 19:42:06 -05:00
Peter Steinberger
fd081d6521
fix(ui): keep Codex commentary visible after runs ( #111648 )
...
* fix(ui): keep Codex commentary visible
* fix(codex): preserve commentary transcript ordering
* fix(ui): preserve commentary retention opt-out
2026-07-20 02:10:56 -07:00
Peter Steinberger
7d4dccf959
improve(swarm): close out wait, phase, and worker follow-ups ( #111605 )
...
* fix(codex): support full swarm wait budgets
* feat(ui): bucket swarm dots by phase
* docs(swarm): document flat worker patterns
* fix(codex): configured per-tool timeout still wins over swarm wait default
* fix(codex): outer swarm-wait watchdog outlives the 600s budget (cap + grace)
* fix(ui): order swarm phase buckets by observation rank
* fix(ui): repair rank-order widget test — proper lit render container, untangle sibling assertions
* fix(ui): implicit swarm phase assignment only on child creation events
* test(ui): split swarm activity integration coverage
2026-07-19 20:11:54 -07:00
Peter Steinberger
c7e7ac2728
refactor: remove expired plugin compatibility surfaces ( #111451 )
...
* docs(secrets): remove retired web credential paths
* refactor(web): remove retired provider compatibility paths
* refactor(providers): delete retired compatibility routes
* refactor(secrets): remove retired credential aliases
* refactor(plugin-sdk): delete retired compatibility surfaces
* docs(plugin-sdk): remove retired migration guidance
* chore(plugin-sdk): refresh rebased surface budgets
* chore(plugin-sdk): refresh API removal baseline
* refactor(compat): migrate retired internal callers
* chore(plugin-sdk): refresh current-main baselines
* test(config): migrate plugin-owned secret assertions
* test(gateway): narrow plugin secret refs
* fix(plugin-sdk): preserve private boundary type identity
* chore(compat): remove stale sweep references
* chore(lint): lower max-lines budget
* refactor(secrets): remove unused web helper
* build(plugin-sdk): drop removed compat entries
* chore(plugin-sdk): refresh rebased API baseline
* chore(plugin-sdk): use Linux API baseline hash
* fix(plugin-sdk): preserve private bundled build entries
* fix(plugin-sdk): package private runtime facades
* fix(plugins): preserve external credential contracts
2026-07-19 11:04:48 -07:00
Peter Steinberger
4c55a4fc28
feat(plugins): expose requester context to tool hooks ( #111190 )
...
* feat(plugins): expose requester context to tool hooks
* chore(plugin-sdk): restore generated API baseline
* chore: drop release-owned changelog entry
* docs: refresh documentation map
2026-07-19 10:31:58 -07:00
Peter Steinberger
783a5d21cf
refactor(config): purge numeric tuning knobs behind built-in defaults ( #111382 )
2026-07-19 07:35:45 -07:00
Peter Steinberger
3b84a55d99
refactor(protocol): pre-publish cheat-window cleanup and vintage tracking ( #111041 )
...
* fix(codex): drain dynamic-tool handlers before side-thread cleanup
* refactor(protocol): rename question ids to questionId and flatten answer maps
* refactor(protocol): slim worker stack and unify session-catalog shapes
* refactor(protocol): delete dead public surface and polish packaging
* feat(protocol): track release-train vintage on gateway methods and schemas
* fix(apps): align question surfaces merged from main with reshaped protocol
* test(health): shape secret fixtures to scanner-safe token names
* test(health): use scanner-safe token fixtures
* fix(apps): align question surfaces merged from main with reshaped protocol
* fix(ci): prove reshaped protocol in shallow checks
* fix(ui): align sidebar question fixtures with protocol
* fix(apps): read flat Swift question answers
* fix(apps): align question surfaces merged from main with reshaped protocol
* fix(apps): refresh native question inventory
* fix(apps): align macOS snapshot fixtures with protocol
* fix(ui): align narration question fixture with protocol
2026-07-19 04:07:15 -07:00
xingzhou
e2ca148d4b
fix(codex): preserve JSONL framing across WebSocket writes ( #110384 )
...
* fix(codex): preserve UTF-8 websocket frames
* test(codex): satisfy websocket transport lint
* fix(codex): preserve websocket JSONL framing
2026-07-19 17:07:03 +08:00
Peter Steinberger
ea54060223
feat(codex): fork upstream-linked sessions at a message via thread/fork ( #111149 )
...
* feat(codex): fork upstream-linked sessions at a message via thread/fork
* fix(gateway): fail closed for rewind and branch switch on upstream-linked sessions
* fix(codex): fail closed on first-message forks, image-only prompts, and orphan archival
* fix(codex): baseline retained history and reject paginated threads on upstream fork
* fix(codex): validate the full fork prefix and fail closed across crash windows
* fix(codex): treat all non-text inputs as unverifiable in fork drift checks
* fix(codex): support first-message forks as empty-history upstream cuts
* fix(codex): reject source-id reuse and unverifiable hidden inputs in fork boundaries
* refactor(codex): materialize upstream forks from verified thread read-back
* fix(codex): satisfy strict type lanes and knip for upstream fork
2026-07-19 00:11:10 -07:00
Peter Steinberger
208036afdc
fix(codex): session permissions persist across resumed turns ( #111136 )
...
* test: harden Codex compaction command oracle
* test: accept omitted Codex command exit code
* fix(codex): apply stored session permissions
* test: harden Codex gateway stress evidence
* test: accept successful Codex command retries
* test: classify Codex evidence as live helper
2026-07-18 19:56:42 -07:00
Peter Steinberger
968f9ad0f3
test(codex): split event projector suites ( #111097 )
2026-07-18 18:17:25 -07:00
Kris Wu
e5b2ca3c6b
feat(config): add compaction.thinkingLevel to override thinking level during compaction ( #98074 )
...
* feat(config): add compaction.thinkingLevel to override thinking during compaction
* fix: make compaction.thinkingLevel override inherited session thinking
* fix: warn on compaction.thinkingLevel ignored by Codex native runtime
* feat(config): add compaction thinking override
Co-authored-by: wu.duozhen@xydigit.com <wu.duozhen@xydigit.com >
* test(agents): remove duplicate compaction harness
Co-authored-by: wu.duozhen@xydigit.com <wu.duozhen@xydigit.com >
* test(plugin-sdk): account for thinking level export
Co-authored-by: wu.duozhen@xydigit.com <wu.duozhen@xydigit.com >
* chore: keep release note in PR metadata
* chore: reconcile plugin SDK surface budgets
---------
Co-authored-by: Peter Steinberger <steipete@gmail.com >
2026-07-18 17:18:28 -07:00
Peter Steinberger
f3f6eb2321
fix(codex): stop fallback for superseded sessions ( #110980 )
2026-07-18 23:02:03 +01:00