Skip to content

Retire Ox Alpha, and make the checks tell the truth - #9

Merged
phall1 merged 6 commits into
mainfrom
fix/substrate-coherence
Sep 9, 2026
Merged

Retire Ox Alpha, and make the checks tell the truth#9
phall1 merged 6 commits into
mainfrom
fix/substrate-coherence

Conversation

@phall1

@phall1 phall1 commented Sep 9, 2026

Copy link
Copy Markdown
Owner

dot-doctor was reporting three failures against a healthy system, which is how
a 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. Both modify_ scripts existed solely to inject Ox
providers, 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.json are appended to
provision/retired-files.sha256, each hash verified against its source first.

The checks now assert what the runtime resolved

  • 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 (permissionpermissions, providerproviders, attachment
    media), so a 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, which immediately found a redundant
    opencode.json duplicating one MCP entry.
  • blackbird.sh required the MCP server at .mcp.servers.blackbird. OpenCode
    accepts both that and .mcp.<name>; the daemon was connected and the plugin
    loaded the whole time. It now reads opencode2 mcp list and plugin list.
  • 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"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.

A silent breakage the new checks caught

checks/skills.sh found seven dangling skill adapters across Claude, OpenCode
and Hermes on its first run — including cyclomatic-complexity.

Root cause: ~/.agents/skills is enrolled in live preferences, so .chezmoiignore
excludes it and chezmoi apply never writes there. dot_agents/skills/ is meant to
be 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.sh now seeds missing files into the live
tree, never overwriting an existing one, and runs inside converge.sh.

Pins are derived, not restated

checks/pi.sh restated the package list modify_settings.json declares — six pins
across 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 the
hand-copied assertion, so its absence had been invisible.

Docs describe the repo that exists

dot_claude/settings.json has not existed since the move to a modify_ merge
script, so every instruction to "edit settings.json and apply" named a missing file
and described the wrong operation. Also retires ~/CLAUDE.md: an untracked
verbatim copy of this repo's CLAUDE.md at 14ff43f, which every Claude session
started under $HOME loaded as project instructions, two months stale.

Result

dot-doctor: 0 failures, one warning (ghostty missing, unrelated).
mise run check green. chezmoi status clean.

🤖 Generated with Claude Code

https://claude.ai/code/session_01HvvVk5xnS9hRBL9u1WcP6p

phall and others added 6 commits September 9, 2026 05:23
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
phall1 force-pushed the fix/substrate-coherence branch from 2e303f8 to 1c8ec72 Compare September 9, 2026 09:23
@phall1
phall1 merged commit 7e6acc5 into main Sep 9, 2026
5 checks passed
@phall1
phall1 deleted the fix/substrate-coherence branch September 9, 2026 09:27
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant