fix: give a role launch its own user-scoped load points #252

Merged
coilysiren merged 2 commits from native-home/968-user-scope-projection into main 2026-08-08 17:51:19 +00:00
Member

Two commits fixing where a composed role actually lands.

5b21ac8 // wire claude's global skill load point by default

skill_load_points had no defaults, so skillmount iterated only over harnesses the host config named explicitly. The fleet config names codex alone, so ~/.claude/skills was never created and a Claude session ran with no global skills at all while Codex had 161. The instruction side never had this problem, because cascade.DefaultLoadPoints wires claude and codex whether or not config mentions them.

DefaultSkillLoadPoints and ResolveSkillLoadPoints now mirror that, falsy opt-out included. SkillLoadPoints moves to RawValue so a null can express the opt-out, and both resolvers share one helper. Naming one harness leaves the other on its default.

Detail lives in the new docs/skill-load-points.md, because docs/cascade.md sat at 78 of its 80-line cap.

f1097ac // project the role into the session home, base included

Native launch projected at repo scope into the session projects root, so the role landed at <projects>/CLAUDE.md while the user-scoped load point still pointed at the host file. A session therefore read the host's all-roles COMPOSED document and the selected role card at once, and role scoping was never enforced where the harness reads.

AGENT_COMPOSE_RUNTIME_HOME already carried the staged home from the launch consumer but only reconfigured the harness process. Projection uses it now: when set, the bundle lands at the harness global load points.

That replaces the host load point, which supplied the operating base, so a runtime-home launch composes the base ahead of the role card through the new cascade.OperatingBase. A repo-scope launch still reads the host file and omits the base, which would otherwise double it.

Notes

Pairs with agentic-os PR for the shadow-home side. Home-scope projection is only safe once that lands: without it, .codex and .config are single symlinks in the session home and a projection would write through to the host copy.

converge tests never isolated $HOME, which was harmless only while skill load points had no defaults to fall back on. The run helper now pins it beside the config.

internal/evaluation fails on main before these commits, nine cases of codex result-pack digest drift. Confirmed by stashing and re-running. Out of scope here, but it gates the release train.

Refs coilyco-flight-deck/agentic-os#968

Two commits fixing where a composed role actually lands. ## `5b21ac8` // wire claude's global skill load point by default `skill_load_points` had no defaults, so `skillmount` iterated only over harnesses the host config named explicitly. The fleet config names `codex` alone, so `~/.claude/skills` was never created and a Claude session ran with no global skills at all while Codex had 161. The instruction side never had this problem, because `cascade.DefaultLoadPoints` wires claude and codex whether or not config mentions them. `DefaultSkillLoadPoints` and `ResolveSkillLoadPoints` now mirror that, falsy opt-out included. `SkillLoadPoints` moves to `RawValue` so a null can express the opt-out, and both resolvers share one helper. Naming one harness leaves the other on its default. Detail lives in the new `docs/skill-load-points.md`, because `docs/cascade.md` sat at 78 of its 80-line cap. ## `f1097ac` // project the role into the session home, base included Native launch projected at repo scope into the session projects root, so the role landed at `<projects>/CLAUDE.md` while the user-scoped load point still pointed at the host file. A session therefore read the host's all-roles COMPOSED document and the selected role card at once, and role scoping was never enforced where the harness reads. `AGENT_COMPOSE_RUNTIME_HOME` already carried the staged home from the launch consumer but only reconfigured the harness process. Projection uses it now: when set, the bundle lands at the harness global load points. That replaces the host load point, which supplied the operating base, so a runtime-home launch composes the base ahead of the role card through the new `cascade.OperatingBase`. A repo-scope launch still reads the host file and omits the base, which would otherwise double it. ## Notes Pairs with agentic-os PR for the shadow-home side. Home-scope projection is only safe once that lands: without it, `.codex` and `.config` are single symlinks in the session home and a projection would write through to the host copy. `converge` tests never isolated `$HOME`, which was harmless only while skill load points had no defaults to fall back on. The `run` helper now pins it beside the config. `internal/evaluation` fails on `main` before these commits, nine cases of codex result-pack digest drift. Confirmed by stashing and re-running. Out of scope here, but it gates the release train. Refs coilyco-flight-deck/agentic-os#968
`skill_load_points` had no defaults, so converge mounted skills only where the
host config named a harness. Kai's config names codex alone, which left
`~/.claude/skills` absent entirely: every Claude session ran with no global
skills while Codex had 161.

Add `DefaultSkillLoadPoints` and `ResolveSkillLoadPoints` mirroring the
instruction-side `DefaultLoadPoints` and `ResolveLoadPoints`, including the
falsy opt-out, and switch `SkillLoadPoints` to `RawValue` so a null can express
it. Naming one harness now leaves the other on its default.

Isolate `$HOME` in the converge test helper. Unset load points resolve against
the real home, which was harmless only while skills had no defaults.

Refs coilyco-flight-deck/agentic-os#968

Co-authored-by: Kai Siren <coilysiren@gmail.com>
Co-authored-by: Claude <noreply@anthropic.com>
Native launch projected at repo scope into the session projects root, so the
role landed at `<projects>/CLAUDE.md` and `<projects>/.claude/skills` while the
user-scoped load point kept pointing at the host file. A session therefore read
the host's all-roles COMPOSED document and the selected role card at once, and
role scoping was never enforced where the harness actually reads it.

`AGENT_COMPOSE_RUNTIME_HOME` already carried the staged home from the launch
consumer but only reconfigured the harness process. Projection now uses it:
when set, the bundle lands at the harness global load points instead.

That replaces the host load point, which supplied the operating base, so a
runtime-home launch also composes the base ahead of the role card through the
new `cascade.OperatingBase`. A repo-scope launch still reads the host file and
omits the base, which would otherwise double it.

Refs coilyco-flight-deck/agentic-os#968

Co-authored-by: Kai Siren <coilysiren@gmail.com>
Co-authored-by: Claude <noreply@anthropic.com>
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/agent-compose!252
No description provided.