Fixed
A global install no longer fails to find the comment checker. (#8247)
The shipped extension asks for @code-yeongyu/comment-checker after a write-like tool result, but omo-ai never declared it, so an install that had no other copy of that package raised Cannot find module '@code-yeongyu/comment-checker'. The package now declares it as a pinned runtime dependency, and the manifest test pins the declaration so it cannot disappear again.
Changed
Tool cards stop showing the model's bookkeeping, and runs of reads collapse into one "Explored" entry. (#8732) The OmO Native engine moves to senpi 2026.9.23-4. Hints meant for the model, such as [143 more lines in file. Use offset=58 to continue.], "limit reached", Full output: <path>, grep statistics, and the project-rules or AGENTS.md text injected into a read, still reach the model unchanged but no longer appear in the terminal UI. Consecutive read, grep, find and ls calls now render the way Codex shows them: one • Explored entry listing Read a.ts, b.ts, Search <pattern> and List <dir>, expandable to the original cards. Hidden diagnostics also no longer duplicate the screen when mouse capture is on.
The programming skill's Rust guidance compiles and no longer contradicts itself. (#8739) Agents writing Rust got several examples that did not build or broke the skill's own strict lint config: an edition 2024 template declaring Rust 1.83, a duplicate lint key cargo rejects, mem::forget and static mut patterns the config denies, a serde struct combining two attributes serde cannot combine, and a project scaffold that failed its own lint gate and could not link on macOS. Every edited example now compiles under the skill's configuration on Rust 1.85 and current stable, and the scaffold builds, lints, and runs clean. The Rust references also gained what they were missing: Rust 2024 FFI syntax, explicit overflow and conversion rules, validated-newtype construction, async trait and cancellation guidance, public-API naming and trait design, macro hygiene, doctests, and an MSRV check. The bundled checker now also flags #[allow], silently discarded results, and blocking calls inside async code.
Model profiles detect GPT providers with the same subscription-first priority as task routing. ChatGPT subscriptions take priority over the openai API/proxy lane, and the non-fast Sol fallback remains available. Custom profile chains can choose their own provider and reasoning; a provider-qualified candidate no longer silently runs through a different provider when its named provider is unavailable. (#8735)
Memory reads as the agent remembering, in one quiet notice. (#8733) Background reflection no longer draws its own lifecycle into your conversation: the Memory reflection started, no changes, single-run failure and "older completions collapsed" rows are gone, and so are their toasts (which the Desktop app also showed as warning rows). Everything that actually changed memory now uses the same blue notice: a memory write reads Remembered · 4th entry today with one sentence such as Added 22 lines to reference/project/x.md., a deletion reads Let go (Cleared <file>. One less thing to carry.), a reflection that committed reads Remembered · on reflection with the first sentence of what it learned, and a refused write reads Not remembered with a plain reason instead of the raw engine error. Repeated reflection failures still raise their alert.
Model profiles are four lanes: Daily/Geeky × Normal/Heavy. (#8735) The old capable and deep-work ids are gone, with no alias or migration: a config still naming them gets the unknown-profile notice listing daily-normal, daily-heavy, geeky-normal, and geeky-heavy. Daily · Normal (Claude Opus 5.5 medium, then Kimi K3 max, then GLM 5.3 max) is the default on a fresh session when model_profile is unset. Daily · Heavy is Claude Fable 5.1 xhigh. Geeky · Normal is GPT-6 Sol Fast medium on a ChatGPT subscription, then GPT-6 Sol medium on Copilot or OpenCode. Geeky · Heavy is GPT-6 Astra xhigh. The session-start notice names the lane, the selected model, and the thinking level. If no rung is in this session's model registry, the notice lists those candidates instead of claiming a provider is disconnected. A --model flag, a scoped model, a resume, a fork, and a user model_profiles overlay behave as before.
Every browser instruction OmO Native and Codex ship now goes through omowright. (#8727) The browser skill bundles the omowright library (staged at build time from a pinned dependency, no nested node_modules) and routes between its two engines: the attached engine drives the browser the user is already signed into through BrowserSkill's daemon and extension from the js-eval kernel (connectBrowserSkill(), bskSnapshot(), no bsk process per call), and the owned engine launches a browser the code controls (connectPipe(), CloakBrowser via connectCloakProfile()) with snapshots, coordinate control, captcha helpers, network snooping, routes and flight traces. The skill's browser-install.mjs now installs the CLI, starts the daemon and registers the Web Store extension through Chrome's external-extension mechanism, so the only step left for the user is one Enable click; browser-doctor.mjs reports the exact state. visual-qa, debugging, frontend, review-work, ulw-execute, ulw-loop, ultimate-browsing (Tier 2) and the ultrawork directives on both editions describe that library instead of Bun.WebView and hand-written playwright-core scripts; the debugging skill's Playwright CLI reference is replaced by references/tools/browser-qa.md. The shipped-guidance gate (script/no-retired-browser-tools.test.ts) now also rejects playwright-core, playwright-cli, Bun.WebView, launchPersistentContext and chromium.launch in those editions' payloads. The OpenCode edition's browser_automation_engine providers are unchanged.
unspecified-high runs Claude Opus 5.5 at medium instead of max. (#8728) The catch-all high-effort lane still leads with Claude Opus 5.5, on both OmO Native and the OpenCode edition, but at medium reasoning, so ordinary multi-file work no longer pays for maximum thinking on every call. Its fallbacks are unchanged: GLM 5.3 at max, then Kimi K3 at max. An unspecified-high entry in your own config still wins over the default.
Fixed
Claude subscription sessions keep the model you chose, say which Claude Code is too old, and find npm-installed Claude Code on Windows. (#8700) The engine moves to senpi 2026.9.23-3. --no-model-fallback and SENPI_NO_FALLBACK=1 now hold for the whole session: they were dropped the first time the session saved any setting, so a turn that Claude Opus 5.5 rejected with "Claude Code 2.1.278 does not support this model" still walked down to Opus 5, 4.8 and 4.6 and answered from a model the run had excluded. --no-ask-user and --theme had the same hole. When the local Claude Code is too old for a model, the message now names the binary that ran and where it came from (CLAUDE_CODE_EXECUTABLE, the copy OmO ships, or claude on your PATH) and gives the fix for that binary, instead of always saying "update senpi/omo" next to the API's "run claude update". On Windows, a Claude Code installed with npm i -g @anthropic-ai/claude-code (a claude.cmd wrapper) is now found and used when it is newer than the bundled copy. senpi's release now fails when a recommended, default or fallback Claude model is unknown to the Claude Code it bundles, which is how Opus 5.5 shipped unusable in beta.84-beta.85.
GPT models in the builtin chains work when OpenAI is set up as the openai provider, not only as the ChatGPT subscription. (#8734) On OmO Native, every builtin GPT rung (GPT-6 Astra, GPT-6 Sol and Sol Fast, GPT-6 Luna Fast, GPT-5.6 Sol, in the category chains, the explore, librarian and plan-reviewer agents, and the deep-work profile) listed only chatgpt-subscription. A machine whose OpenAI access is an API key, or an OpenAI-compatible proxy configured as openai, never got a GPT model from them: explore skipped gpt-6-luna-fast and fell to claude-haiku-4-5, and when an earlier rung failed at runtime the fallback list skipped every GPT rung too. Each of those rungs now lists chatgpt-subscription first and openai right after it, so the subscription still wins when both are configured and nothing is billed per token that was not before. In the OpenCode edition, the quick category's gpt-6-luna-fast rung gains openai like every other GPT rung there.
writing is unavailable when none of its Claude models is connected, instead of running on another model. (#8723) The writing chain is Claude Fable 5.1, then Claude Opus 5.5, then Claude Opus 4.6. In the OpenCode edition, a machine without any of them still accepted task(category: "writing") and ran it on the session's default model. The installer went further: on an OpenAI-only setup it wrote writing as GPT-5.6 Sol, and on a setup with no matching provider it wrote the opencode/gpt-5-nano last resort. Now the OpenCode runtime refuses the lane with Category "writing" has no available model, and the installer leaves writing out of the generated config. OmO Native already treated the lane as unavailable. An explicit categories.writing model in omo.json still opens it.
- 09f1a95 Merge pull request #8749 from code-yeongyu/release/v5.0.0-beta.87-source-state
- 22e3517 Merge pull request #8745 from code-yeongyu/fix/8247-comment-checker-dep
- 89eb53b fix(omo-native): declare the comment-checker runtime dependency
- 7b5f51f Merge pull request #8740 from code-yeongyu/feat/profile-lanes-native-01a0cd16
- 16dd58b Merge pull request #8742 from code-yeongyu/fix/8700-claude-sdk-currency
- d489d74 Merge pull request #8741 from code-yeongyu/fix/programming-rust-refs
- 43efe50 docs(programming): Rust references compile under their own config and cover the missing rules
- f71c7c9 fix(programming): Rust scaffold passes its own gate and links on macOS
- 8b71d46 fix(programming): Rust no-excuse checker honors #[expect] and flags discards and blocking async calls
- eb2785a Merge pull request #8737 from code-yeongyu/fix/openai-lane-rungs
- bc2f526 Merge pull request #8736 from code-yeongyu/fix/hide-reflection-lifecycle-notices
- 5149221 Merge pull request #8730 from code-yeongyu/fix/unspecified-high-opus-medium
- 573d36a feat(routing): unspecified-high runs Claude Opus 5.5 at medium
- 9a97f3a Merge pull request #8729 from code-yeongyu/feat/omowright-browser-guidance
- b55e5ce build(skills-loader-core): resync the checked-in frontend skill artifact
- c3ba853 docs: shipped browser guidance runs through omowright
- 21aa5f4 feat(ultrawork): drive the browser Manual-QA channel through omowright on both editions
- 327afa4 feat(skills): point visual-qa, debugging, frontend, review-work, ulw-execute and ultimate-browsing at omowright
- deee607 feat(browser): route the browser skill through omowright's owned and attached engines
- b49e655 build(shared-skills): stage the omowright runtime into the browser skill
- 66d3efe Merge pull request #8725 from code-yeongyu/fix/writing-disable-without-own-models
- 9a161f1 docs: writing is unavailable without its Claude models
- beec41b fix(routing): writing opens only on its own Claude models
- b4724de Merge pull request #8721 from code-yeongyu/fix/skills-verify-behavior-not-tdd
- 36ca4bb fix(omo-codex): carry the ulw-execute test-decision rule through the Codex skill overlay
- 7b77354 feat(skills): verify behavior instead of mandating TDD in ultrawork and the bundled skills
npm i -g omo-ai@beta