Name the host class and its origin, so a silent fail-safe stops reading as a correct converge #985

Merged
coilyco-ops merged 1 commit from aos/claude/ee98-hostclass into main 2026-08-29 05:39:29 +00:00
Owner

Closes the diagnosis half of coilyco-flight-deck/agent-compose#379.

What was measured

agent-compose's own sidecar (~/.config/agent-compose/skill-mounts.json) records 78 mounted skills on this Mac: 42 from the rendered personality library, 36 from agentic-os. Zero from agentic-os-kai, voice-corpus, or lore. That matches the two independent session reports on #379.

Why

skillmount.discover links .agents/skills for each repository in repository-plan.yaml residency, plus each hydrated catalogue. Live residency holds exactly one entry, coilyco-flight-deck/agentic-os, and the catalogue manifest is an empty array. 36 plus 42 is therefore the whole reachable surface.

Residency follows the host class. The rendered agent-compose.yaml carries one source and one operating_context entry, which is hostclass_base output. hostclass_personal has carried the AOSK source since e7e138e (2026-06-12), and AOSK's .agents/roles.kdl is what declares voice-corpus, lore, and the rest of the private graph.

AOS_HOST_CLASS=personal is present in ~/.shellrc.local and has been since 2026-08-04. So a converge ran without it in its environment and the Darwin fail-safe took over.

What this changes

Nothing about the policy. base stays the fail-safe and stays the safe direction.

What it stops being is invisible. The fail-safe is reached by a variable being absent rather than by a decision, and it renders a public-only config that reads exactly like a correct one. Three separate sessions read that file this week and none could tell which class produced it.

  • sync.yml records the resolved class and whether it came from inventory, $AOS_HOST_CLASS, or the fail-safe.
  • it warns when the origin is os-failsafe.
  • the rendered agent-compose.yaml header states the class and its origin, and says plainly when the class was never declared.

Verified

All three resolution paths, against localhost, mutating nothing:

unset                    -> class=base     origin=os-failsafe
AOS_HOST_CLASS=personal  -> class=personal origin=AOS_HOST_CLASS
-e aos_host_class=server -> class=server   origin=inventory

And the template renders the warning block only on os-failsafe. ansible-playbook --syntax-check and the full pre-commit suite pass.

This restores no skills on its own

The overlay returns when the host re-converges from a terminal that sources ~/.shellrc.local. I could not run that: ansible-sync correctly refuses inside a native session shadow, because HOME here is a temporary directory and every ~-rooted path would render into it.

Not established

Which converge run dropped the variable. The rendered file is dated 2026-08-28 and ~/.shellrc.local predates it by three weeks, so the environment was missing at that run rather than the config. I did not find the invocation, and this change makes the next occurrence say so rather than requiring the same archaeology.

Closes the diagnosis half of `coilyco-flight-deck/agent-compose#379`. ## What was measured agent-compose's own sidecar (`~/.config/agent-compose/skill-mounts.json`) records 78 mounted skills on this Mac: 42 from the rendered personality library, 36 from `agentic-os`. Zero from `agentic-os-kai`, `voice-corpus`, or `lore`. That matches the two independent session reports on #379. ## Why `skillmount.discover` links `.agents/skills` for each repository in `repository-plan.yaml` residency, plus each hydrated catalogue. Live residency holds exactly one entry, `coilyco-flight-deck/agentic-os`, and the catalogue manifest is an empty array. 36 plus 42 is therefore the whole reachable surface. Residency follows the host class. The rendered `agent-compose.yaml` carries one source and one `operating_context` entry, which is `hostclass_base` output. `hostclass_personal` has carried the AOSK source since `e7e138e` (2026-06-12), and AOSK's `.agents/roles.kdl` is what declares `voice-corpus`, `lore`, and the rest of the private graph. `AOS_HOST_CLASS=personal` is present in `~/.shellrc.local` and has been since 2026-08-04. So a converge ran without it in its environment and the Darwin fail-safe took over. ## What this changes Nothing about the policy. `base` stays the fail-safe and stays the safe direction. What it stops being is invisible. The fail-safe is reached by a variable being **absent** rather than by a decision, and it renders a public-only config that reads exactly like a correct one. Three separate sessions read that file this week and none could tell which class produced it. * `sync.yml` records the resolved class and whether it came from inventory, `$AOS_HOST_CLASS`, or the fail-safe. * it warns when the origin is `os-failsafe`. * the rendered `agent-compose.yaml` header states the class and its origin, and says plainly when the class was never declared. ## Verified All three resolution paths, against localhost, mutating nothing: ``` unset -> class=base origin=os-failsafe AOS_HOST_CLASS=personal -> class=personal origin=AOS_HOST_CLASS -e aos_host_class=server -> class=server origin=inventory ``` And the template renders the warning block only on `os-failsafe`. `ansible-playbook --syntax-check` and the full pre-commit suite pass. ## This restores no skills on its own The overlay returns when the host re-converges from a terminal that sources `~/.shellrc.local`. I could not run that: `ansible-sync` correctly refuses inside a native session shadow, because HOME here is a temporary directory and every `~`-rooted path would render into it. ## Not established Which converge run dropped the variable. The rendered file is dated 2026-08-28 and `~/.shellrc.local` predates it by three weeks, so the environment was missing at that run rather than the config. I did not find the invocation, and this change makes the next occurrence say so rather than requiring the same archaeology.
fix(ansible): name the host class and its origin, so a silent fail-safe stops reading as a correct converge
All checks were successful
TruffleHog / Scan for secrets (pull_request) Successful in 5s
CI / lint (pull_request) Successful in 43s
3a6434c071
A devrel bundle composed zero skills from agentic-os-kai or voice-corpus
(agent-compose#379). Measured on this Mac, agent-compose's own sidecar records
78 mounted skills: 42 from the rendered personality library and 36 from
agentic-os. None private.

The chain is not a code defect. skillmount links `.agents/skills` for each
repository in `repository-plan.yaml` residency plus each hydrated catalogue.
Live residency holds one entry, `coilyco-flight-deck/agentic-os`, and the
catalogue manifest is empty, so 36 plus 42 is the whole surface. Residency comes
from the host class, and the rendered `agent-compose.yaml` carries one source
and one operating_context entry, which is `hostclass_base` output. It should be
`hostclass_personal`, which has carried the AOSK source since e7e138e.

`AOS_HOST_CLASS=personal` is present in ~/.shellrc.local and has been since
August. So a converge ran without it in the environment and the OS fail-safe
took over. That is the safe direction and stays the default. What it must stop
being is invisible: the fail-safe is reached by a variable being absent rather
than by a decision, and it renders a public-only config that reads exactly like
a correct one. Three agents read that file this week and none could tell which
class produced it.

So the class now says what it is. `sync.yml` records the resolved class and
whether it came from inventory, $AOS_HOST_CLASS, or the fail-safe, warns on the
last, and the rendered header states both. Verified against all three paths, and
the header renders with the warning block only on os-failsafe.

This changes no policy and restores no skills on its own. The overlay returns
when the host re-converges from a shell that sources ~/.shellrc.local.

Refs coilyco-flight-deck/agent-compose#379

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Co-authored-by: Kai Siren <coilysiren@gmail.com>
Co-authored-by: Claude <noreply@anthropic.com>
Agent-Role: platform
coilyco-ops deleted branch aos/claude/ee98-hostclass 2026-08-29 05:39:29 +00:00
Sign in to join this conversation.
No reviewers
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set

Reference
coilyco-flight-deck/infrastructure!985
No description provided.