Retire Ox Alpha, and make the checks tell the truth - #9
Merged
Conversation
Ox Alpha was a limited-time free stealth preview. The model is gone; the five-provider fan-out it justified was carried in eight files across five harnesses and is now pure maintenance cost. Removed the launcher, the per-harness catalogs (Pi, Hermes, Goose, Grok, OpenCode), the doc, and checks/ox-alpha.sh. Both modify_ scripts existed solely to inject Ox providers, so they go with it -- Hermes and Pi own their runtime files outright again. Source removal alone leaves materialized copies behind, so the six applied targets and the now-entirely-Ox ~/.pi/agent/models.json are appended to provision/retired-files.sha256 with hashes verified against their sources. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01HvvVk5xnS9hRBL9u1WcP6p
Three checks reported failures against a healthy system, which is how a health check teaches you to ignore it. checks/opencode.sh asserted `permissions`/`providers`/`plugins` and an invented `update: auto` against the raw file on disk. OpenCode migrates legacy key names as it loads (permission -> permissions, provider -> providers, attachment -> media), so the working config could never satisfy it. It now asks `opencode2 debug config` what was actually resolved, and warns when several config documents silently shadow each other. checks/blackbird.sh required the Blackbird MCP server at .mcp.servers.blackbird. OpenCode accepts both .mcp.<name> and .mcp.servers.<name>; the daemon was connected and the plugin loaded the whole time. It now reads `opencode2 mcp list` and `opencode2 plugin list`. checks/claude.sh compared ~/.claude/settings.json against a source file that stopped existing when settings moved to modify_settings.json. With the guard false the conditional fell through to its else branch and printed "settings.json matches source" unconditionally -- green forever, about a file that was not there. It now derives the managed block from the modify_ script itself and proves the merge preserves herdr's unmanaged hooks. Adds checks/skills.sh, which caught seven dangling skill adapters across Claude, OpenCode and Hermes on the first run -- including cyclomatic-complexity. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01HvvVk5xnS9hRBL9u1WcP6p
checks/pi.sh restated the managed package list that dot_pi/private_agent/modify_settings.json declares -- six pins duplicated across three assertion sites, plus the retired package name. The only drift those could detect was "you edited one file and not the other", which is a lockstep-edit detector, not a health check. All three sites now derive from the declaring config's managed_packages and retired_packages blocks. The roundtrip probe builds its synthetic input from retired_packages too, so adding a retirement automatically extends the test. Deriving the list immediately surfaced npm:blackbird-pi@0.1.1, which is declared managed but was absent from the hand-copied assertion, so its absence had been invisible. Also drops the shared-skill and cyclomatic-complexity adapter blocks: those are not Pi's business and checks/skills.sh now covers every harness. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01HvvVk5xnS9hRBL9u1WcP6p
The orientation docs still described the pre-PR#8 layout, so a session that trusted them produced work that fought the architecture -- the exact failure mode CLAUDE.md warns about in its closing line. Corrected: dot_claude/settings.json has not existed since settings moved to a modify_ merge script, so every instruction to "edit settings.json and apply" named a missing file and described the wrong operation; repo-onboarding is a symlink adapter into dot_agents/, not a Claude-local skill; dot-doctor does not have 27 checks. Adds the shared-skill seeding contract to the bootstrap ownership table, and updates the ultrareview note now that /code-review ultra is the command and /ultrareview the deprecated alias. Also retires ~/CLAUDE.md. It was an untracked verbatim copy of this repo's CLAUDE.md at 14ff43f, left in $HOME by the old behaviour of applying repo docs there. Every Claude session started under $HOME loaded it as project instructions alongside the real file, two months stale. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01HvvVk5xnS9hRBL9u1WcP6p
fixtures.sh still probed dot_pi/private_agent/modify_private_models.json and dot_hermes/modify_private_config.yaml for malformed-input tolerance. Both were Ox-only and are gone, so the fixture aborted before reporting. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01HvvVk5xnS9hRBL9u1WcP6p
Reading `opencode2 mcp list` and `plugin list` is the right evidence on a machine whose service lifecycle is enabled, but it is not available everywhere. The container fixtures run with services disabled, so both probes came back empty and reported a correctly configured integration as broken -- a regression introduced by the previous commit, and the same class of mistake it set out to fix. The runtime probes now run only when services_enabled. Otherwise the check asserts the configuration declares the integration, still accepting the MCP server at either .mcp.<name> or .mcp.servers.<name> rather than hardcoding one spelling. The credential assertion is unconditional either way. Verified both paths locally by toggling `services` in the machine profile. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01HvvVk5xnS9hRBL9u1WcP6p
phall1
force-pushed
the
fix/substrate-coherence
branch
from
September 9, 2026 09:23
2e303f8 to
1c8ec72
Compare
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
dot-doctorwas reporting three failures against a healthy system, which is howa health check teaches you to ignore it. None of the three were real; all three
checks were wrong.
Ox Alpha is retired
It was a limited-time free stealth preview. The model is gone; the five-provider
fan-out it justified spanned eight files and five harnesses. Removed the launcher,
the per-harness catalogs (Pi, Hermes, Goose, Grok, OpenCode), the doc, and
checks/ox-alpha.sh. Bothmodify_scripts existed solely to inject Oxproviders, so Hermes and Pi own their runtime files outright again.
Source removal alone leaves materialized copies behind, so the six applied targets
and the now-entirely-Ox
~/.pi/agent/models.jsonare appended toprovision/retired-files.sha256, each hash verified against its source first.The checks now assert what the runtime resolved
opencode.shassertedpermissions/providers/pluginsand an inventedupdate: autoagainst the raw file on disk. OpenCode migrates legacy key namesas it loads (
permission→permissions,provider→providers,attachment→
media), so a working config could never satisfy it. It now asksopencode2 debug configwhat was actually resolved — and warns when severalconfig documents silently shadow each other, which immediately found a redundant
opencode.jsonduplicating one MCP entry.blackbird.shrequired the MCP server at.mcp.servers.blackbird. OpenCodeaccepts both that and
.mcp.<name>; the daemon was connected and the pluginloaded the whole time. It now reads
opencode2 mcp listandplugin list.claude.shcompared~/.claude/settings.jsonagainst a source file thatstopped existing when settings moved to
modify_settings.json. With the guardfalse, the conditional fell through to its
elsebranch and printed"settings.json matches source"— green forever, about a file that was notthere. It now derives the managed block from the
modify_script itself andproves the merge preserves herdr's unmanaged hooks.
A silent breakage the new checks caught
checks/skills.shfound seven dangling skill adapters across Claude, OpenCodeand Hermes on its first run — including
cyclomatic-complexity.Root cause:
~/.agents/skillsis enrolled in live preferences, so.chezmoiignoreexcludes it and
chezmoi applynever writes there.dot_agents/skills/is meant tobe a seed — but nothing was seeding it. Because the adapters are symlinks, the
failure is invisible at the filesystem level and shows up only as a skill that
never loads.
scripts/bootstrap/skills.shnow seeds missing files into the livetree, never overwriting an existing one, and runs inside
converge.sh.Pins are derived, not restated
checks/pi.shrestated the package listmodify_settings.jsondeclares — six pinsacross three sites. The only drift that could detect was "you edited one file and
not the other." All three now derive from the declaring config. Doing so
immediately surfaced
npm:blackbird-pi@0.1.1, declared managed but absent from thehand-copied assertion, so its absence had been invisible.
Docs describe the repo that exists
dot_claude/settings.jsonhas not existed since the move to amodify_mergescript, so every instruction to "edit settings.json and apply" named a missing file
and described the wrong operation. Also retires
~/CLAUDE.md: an untrackedverbatim copy of this repo's
CLAUDE.mdat14ff43f, which every Claude sessionstarted under
$HOMEloaded as project instructions, two months stale.Result
dot-doctor: 0 failures, one warning (ghostty missing, unrelated).mise run checkgreen.chezmoi statusclean.🤖 Generated with Claude Code
https://claude.ai/code/session_01HvvVk5xnS9hRBL9u1WcP6p