Memory sync checks each new keyring entry without re-reading the chain before it. The client now uses the shared receiver's incremental entry point (omo-service #600, re-vendored), and the receiver moves along with the verified chain state. Appending one entry to a 1,000-entry chain used to hand the receiver all 1,006 entries again; it now hands it one, at any chain length. What the receiver refuses is unchanged, including a replayed or lower-seq entry. (#10694, fixes #10655)
The engine moves to senpi 2026.10.21-2: idle task hosts exit again, reopened sessions stop spending quota, and sessions share their prompt cache (#10893). A monitor watch no longer keeps every task shard host on the machine running, so idle hosts exit as designed. Reopening an unattended session no longer spends quota on goals or background events until you send input or choose Resume. Responses prompt-cache keys follow the model, instructions and tool schemas instead of the session, so new sessions and task children with the same prefix reuse one cache. A goal waiting on a subscription limit retries at the provider's reset time instead of hammering the spent account. On Windows, input sent while a turn is running no longer gets stuck or races through the whole fallback chain. Switching a long conversation to a smaller-context model while the current one is at its limit now applies at the next message, saving an API key over an OAuth login (or the reverse) replaces the credential instead of storing one that is never used, a busy command monitor is no longer muted after 200 lines a day, and every assistant reply records its timing (time to first token and generation rate).
OmO records when an answer says "tests pass" or "done" with nothing in the session behind it. When a turn's final answer says tests pass, a build or typecheck is clean, a feature already exists, or the work is done, OmO checks the session for a check that passed after the last code edit, and records in the session whether the claim is backed. It starts in shadow mode: nothing is shown to you or the agent and no turn is blocked or continued, because on a week of our own sessions most flags were still false positives. Setting the omo-senpi-claim-receipt-nudge flag turns on a short note under a flagged answer (once per message you send) and passes the flagged claims to a gate reviewer spawned afterwards. (#10785)
omo doctor --models shows which model every task category and agent runs, and exclude_models keeps a model out of all of them (#10763). The new doctor view prints, per category and agent, the model a spawn runs first, the retry chain in order, and each rung's source (built-in, omo.json, or the category an agent borrows) with why it does or does not run: excluded, no login, or not reached. It reads the same resolvers spawns use, and --json gives the same view to scripts. The new top-level exclude_models list (provider/model, a bare model id, or a * pattern such as "claude-fable-*") is honored by category and agent chains, memory children (the session model they would inherit included), the main session's model profile, explicit task pins, and task children respawned or resumed on a recorded model, including their recorded fallback chains. Before, no setting could stop a builtin rung from running; only logging out of its provider did (#10759).
Geeky becomes Obsessive. The two GPT lanes' display names are now Obsessive · Normal and Obsessive · Heavy, with one-line descriptions to match and a shared caution, NOT RECOMMENDED FOR WRITING OR EVERYDAY WORK., that the session-start notice renders in bold; the geeky-normal and geeky-heavy ids and the family they report stay unchanged, so a saved model_profile, a picker choice or a user overlay keeps resolving exactly as before. A model_profiles entry may set its own caution string, and one that replaces a builtin inherits its caution when it does not. (#10608, #10590)
Obsessive · Normal leads with GPT-6 Astra at medium. The geeky-normal model profile resolves GPT-6 Astra at medium on every GPT provider first, with its GPT-6.1 Sol Fast, GPT-6.1 Sol and GPT-5.6 Sol rungs kept as availability fallbacks; Obsessive · Heavy keeps Astra at high. (#10608, #10590)
Memory sync can verify and seal real batches. The sync engine now has a production verifier and sealer: each row another device appended is checked against this device's verified copy of the account chain, then opened with the epoch key the device holds, and only that memory's own notes reach it. Outgoing batches are encrypted, signed and linked the same way. Nothing uses this yet; the device sign-in that opens a session comes next. (#10625, #10627)
A signed-in device now reaches memory sync. Memory sync used to stay idle on every device, because nothing gave it the device's sign-in. It now reads the device omo login signed in, and the key pair that device registered, then opens the account's sync for that memory. A device that is signed in but has not joined the account's memory yet says so instead of reporting no sign-in. When the device signs out or is removed, sync closes and goes back to idle. (#10625, #10630)
A subtask whose category has no model left now finishes on the model your session runs. When every model in a delegated task's category is out (its usage limit is spent or its provider is not signed in), the task continues on your session's model in the same conversation, so tool calls it already finished are not run again. Before, it stopped with a usage-limit error even though your own model was working. The task's row, task_output and the completion notice say which model it ran on and why, for example parent-model:usage limit, resets 3:20am, and name any tool call the limit cut off, which never ran. Categories with a model that still works route exactly as before, and a session model on the same spent account still ends with the old error. Until the engine can limit this to spent or signed-out models, a task whose category models all fail for another reason, such as an overload, also continues on your session's model and says so (#10750, #10772).
Git worktrees of one repository can share the main checkout's memory. Set memory.auto_identity: "git" (for example in ~/.omo/omo.jsonc, so worktrees created outside the main checkout see it) and every linked worktree, including the ones Orca creates per agent, reads and writes the main checkout's memory instead of starting empty. The main checkout keeps its existing memory, sessions that are already bound keep theirs, and the default "path" leaves behavior unchanged. (#9659, #10047)
- 4d18b5e Merge pull request #10930 from code-yeongyu/release/v5.1.42-source-state
- 1c492a9 Merge pull request #10928 from code-yeongyu/fix/web-build-id-content-hash
- 7ca0c35 test(script): drop the compiled 10763 fragment from the command-string audit allowlist
- 738b7b1 docs(changelog): lead 5.1.42 with its measured optimization
- 5888e9f Merge pull request #10923 from code-yeongyu/test/10912-late-child-abort-signal
- d9309df docs(changelog): compile the unreleased change fragments into 5.1.42 and lead with the optimizations
- 45dc3e8 test(web): assert the inlined build id marker; note same-commit redeploys in the runbook
- cb52742 fix(web): build id from the commit so one /_next/static// path names one set of bytes
- ea4341e Merge pull request #10917 from code-yeongyu/test/10911-packed-sidecar-bounded-stages
- e7369e0 chore(deps): regenerate the plugin bundles after merging dev (bundle-train batch 1)
- da40a02 Merge pull request #10882 from code-yeongyu/batch/memsync-coord-1
- 59d133f Merge pull request #10909 from code-yeongyu/ci/web-deploy-skip-master
- 30d7ca2 docs(changelog): keep the batch #1 entries under [Unreleased] after the 5.1.41 cut
- 50b7e01 test(web): assert the exact deploy job condition
- 7c51aff ci(web): skip the production deploy on pushes to master
- f9de7ac Merge pull request #10907 from code-yeongyu/ci/10904-warm-python-before-eval-smoke
- 7bd5311 ci(publish): warm the kernel stdlib imports before the Windows eval smoke (#10904)
- 6ce160a chore(bundles): regenerate generated bundles for bundle-train batch #1 on current dev (bun 1.4.3)
- 2820b40 batch1: merge dev
- edcdccf chore(deps): regenerate the plugin bundles after merging dev
- 7d818ab Merge pull request #10886 from code-yeongyu/release/v5.1.41-source-state
- 1fce9cc Merge pull request #10880 from code-yeongyu/fix/10847-gatekeeper-window-clock
- f52b4a2 Merge pull request #10871 from code-yeongyu/fix/reload-cleanup-kill-wait
- 5131eae Merge remote-tracking branch 'origin/dev' into fix/10847-gatekeeper-window-clock
- 29b2eb9 chore(bundles): regenerate generated bundles for bundle-train batch #1 (bun 1.4.3)
- 9118704 test(script): count the Gatekeeper window in polls, not wall-clock time
- 158baf4 batch1: merge #10694 @d84146c6dd (snapshot.ts: import union with dev's decodeB64 from #10743)
- 9633a52 batch1: merge #10608 @e804fb8ada
- 8b63f34 batch1: merge #10675 @76c51c2dde
- 37e0f05 batch1: merge #10047 @f411e0810e
- 183bb0e batch1: merge #10772 @f2086ad7c0
- 3b2b367 batch1: merge #10630 @0f74428b44
- fe4f07f batch1: merge #10627 @bf83f20814
- af513a0 batch1: merge #10763 @4c43a9d401
- 59d78fc batch1: merge #10785 @1a3689cb6d
- e804fb8 Merge dev into feat/geeky-normal-astra-medium (base sync, merge rule 04:11Z)
- d000904 Merge remote-tracking branch 'origin/dev' into feat/claim-receipt
- 4c43a9d test(build): guard the category-coverage runtime bundle against multi-output blow-up
- c57353f test(audit): allowlist the omo doctor mention in changes/unreleased/10763.md
- 76c51c2 Merge remote-tracking branch 'origin/dev' into i18n-eu/european-locales
- 7b2d8d4 docs(changelog): keep the Unreleased paragraph next to the fragment (changelog gate)
- 8d58df2 Merge dev (after #10790) into feat/10759-doctor-models
- f5df6f3 Merge remote-tracking branch 'origin/dev' into prestage/claim-receipt-merge
- c50ea6f fix(claim-receipt): exact command identifiers in the allow-list; argv messages are not commands (#10785 review r4)
- 9eb70e6 fix(claim-receipt): eval-cell commands come from a positive allow-list of command positions (#10785 review r3 L1)
- 43f1851 fix(claim-receipt): read command-string lists, value flags, ssh --, backticks and here-strings (#10785 review r3)
- 3d46b43 fix(task): re-filter a revived child's persisted fallback chain against exclude_models
- a04897d feat(claim-receipt): ship in shadow mode until replay precision reaches 70%
- b4a372e fix(claim-receipt): reads are never check runs; restore and extend command recognition (#10785 review r2)
- 9f9b1df fix(models): route every child path through exclude_models
- 508e2fa fix(web): installation redirects reach every locale; the matcher stays locale-agnostic and the locale is checked against the registry (#10670)
- 05955c0 test(script): categorize the new omo doctor --models mentions in the command-string audit (#10759)
- d84146c test(memory-core): the carried receiver gives the whole-history verdict; document passReceiver's precondition (#10694 review LOWs)
- 27fb8b4 Merge remote-tracking branch 'origin/dev' into tk10694
- 0f74428 Merge commit 'bf83f208147b975df7e8b9531289433b28fc2b71' into memsync/10625-device-resolver
- bf83f20 Merge remote-tracking branch 'origin/dev' into memsync/10625-account-session
- f411e08 Merge remote-tracking branch 'origin/dev' into pr10047-rebase
- 80f50e9 Merge remote-tracking branch 'origin/dev' into feat/10759-doctor-models
- 85f271e Merge dev (bundle-train window) into feat/geeky-normal-astra-medium
- e49c20f Merge remote-tracking branch 'origin/dev' into fix/child-fallback-parent-model
- dcc1cd0 docs(changelog): link claim-receipt entry to #10785
- 8740755 Merge remote-tracking branch 'origin/dev' into pr10047-rebase
- 0a2374d docs(changelog): link #10772 for the parent-model fallback entry
- e7209d8 feat(omo-native): omo doctor --models prints every chain the spawn resolvers build (#10759)
- 3b4efc5 feat(config): exclude_models keeps a model out of every chain (#10759)
- 1a1d017 fix(memory-core): keep the receiver with the state a snapshot import continues from (#10655)
- f2fd7f8 Merge remote-tracking branch 'origin/dev' into memsync-10655-mv
- 5403989 test(audit): list the five new READMEs under docs in the agent command string allowlist (#10670)
- 7a97d34 Merge commit 'a0cba509d4c4fd789e230d1ac075880c298b5b11' into memsync/10625-device-resolver
- a0cba50 docs(changelog): move the #10627 entry back under Unreleased (the dev merge left it in 5.1.39)
- b60cfa1 Merge remote-tracking branch 'origin/dev' into memsync/10625-account-session
- 8752521 Merge remote-tracking branch 'origin/dev' into memsync-10655-mv
- 7dbcf26 Merge commit 'd39fb5550ca682a17c46be9c74b2c36373d31635' into memsync/10625-device-resolver
- ca75c32 Merge remote-tracking branch 'origin/dev' into memsync/10625-account-session
- f7bb96a docs(memory): auto_identity shares the main checkout's sync stream only when sync is enabled and signed in (#10047 review LOW)
- b01d525 Merge remote-tracking branch 'origin/dev' into pr10047-rebase
- 3f51f54 Merge dev into feat/geeky-normal-astra-medium (final base sync)
- 4f971fb docs(changelog): link the auto_identity entry to #10047
- ac3308e Merge remote-tracking branch 'origin/dev' into pr10047-rebase
- b29faf4 fix(memory-core): check each keyring entry with the incremental receiver, carried with the verified chain state (#10655)
- bcf24f7 test(memory-core): RED - appending one keyring entry hands the receiver the whole verified history (#10655)
- 363f96c chore(memory-core): re-vendor sync-format at omo-service 5de1455489 (#600, incremental keyring receiver)
- b118c2a fix(memory): resolve auto_identity in session-binding.ts and sync the main checkout's identity (#10047)
- a238476 Merge remote-tracking branch 'origin/dev' into pr10047-rebase
- 1537ca8 feat(web,docs): add es, fr, de, pt-BR and it to omo.dev and the README (#10670)
- 6f94f13 Merge dev into feat/geeky-normal-astra-medium (final pre-READY sync)
- e272d10 Merge commit '2781981a397be00bd57c058e9fb11195c8354740' into memsync/10625-device-resolver
- 2781981 Merge commit '7b7742fb6eed1d364947347a93042e6a76cb8d1f' into memsync/10625-account-session
- 3f44155 Merge dev into feat/geeky-normal-astra-medium (pre-READY base sync)
- 2db6128 Merge commit '61f1975bb5e3e9ecd7c64c04e1ef1cf35fd383ad' into memsync/10625-device-resolver
- fe4496b test(omo-opencode): hold the service-auth subpath to the public-subpath guard (#10630)
- 1555e17 docs(changelog): memory sync device session (#10630)
- b2a4e7d feat(memory): open the memory sync session from the signed-in device
- c6d0022 Merge commit '85afdc2f73365f4ca9d813edbfec3e6f93c1328e' into memsync/10625-account-session
- fb338d0 Merge remote-tracking branch 'origin/dev' into memsync/10625-account-session
- ebbf8fe Merge remote-tracking branch 'origin/dev' into memsync/10625-account-session
- 1b03529 fix(memory): keep valid rows before an unusable one and page the account chain
- ec33ff3 Merge dev into feat/geeky-normal-astra-medium (changelog gate base)
- 7da7c91 fix: rebuild the Unreleased changelog from dev and re-add the Obsessive/Astra entries (review H1, #10608)
- 70d75c5 docs(changelog): memory sync account session (#10627)
- 515b089 feat(memory-core): account sync session with a verifying Verifier and Sealer over the account chain
- 755e7ad Merge dev into feat/geeky-normal-astra-medium before READY (2)
- 1edc409 Merge dev into feat/geeky-normal-astra-medium before READY
- 63a184f docs: link the Obsessive/Astra changelog entries to PR #10608
- 23efdb7 Merge dev into feat/geeky-normal-astra-medium before the Obsessive/Astra PR
- 3f1ffea feat: geeky lanes rename to Obsessive; Obsessive · Normal leads with GPT-6 Astra at medium (#10590)
- d8bd0c8 docs(changelog): restore the #9659 Unreleased entry lost in the bundle-conflict resolution (#10047)
- 4cec56e Merge remote-tracking branch 'origin/dev' into feat/memory-repo-scoped-identity
- 39638a3 Merge remote-tracking branch 'origin/dev' into feat/memory-repo-scoped-identity
- d4792d1 Merge remote-tracking branch 'origin/dev' into feat/memory-repo-scoped-identity
- a04ffc8 docs(memory-core): note which git config lines the core reader skips
- fa14a5d Merge remote-tracking branch 'origin/dev' into feat/memory-repo-scoped-identity
- 1df3cb3 docs(memory): document the git layouts auto_identity maps and its root-only scope
- 1115876 refactor(memory-core): export resolveAutoIdentity as the auto identity entry point
- 012cad2 fix(memory-core): map a worktree only when git records the main working tree
- f876f7a docs(memory): document memory.auto_identity
- c52a10b feat(config): add memory.auto_identity
- acc31ad feat(memory-core): resolve linked git worktrees onto the main checkout
Thank you to 1 community contributor:
- @IvoryKir:
- feat(memory-core): resolve linked git worktrees onto the main checkout
- feat(config): add memory.auto_identity
- docs(memory): document memory.auto_identity
- fix(memory-core): map a worktree only when git records the main working tree
- refactor(memory-core): export resolveAutoIdentity as the auto identity entry point
- docs(memory): document the git layouts auto_identity maps and its root-only scope
- Merge remote-tracking branch 'origin/dev' into feat/memory-repo-scoped-identity
- docs(memory-core): note which git config lines the core reader skips
- Merge remote-tracking branch 'origin/dev' into feat/memory-repo-scoped-identity
- Merge remote-tracking branch 'origin/dev' into feat/memory-repo-scoped-identity
bun add -g omo-ai