agent-compose compose cannot run on native Windows (operating_context validation) #887
Labels
No labels
burndown-2026-06
autonomy
async-consult
autonomy
epic
autonomy
headless
autonomy
live-collab
coherence-core
priority
P0
priority
P1
priority
P2
priority
P3
priority
P4
qa-fixture
role/ai
role/creator
role/design
role/director
role/engineer
role/exec
role/human
role/ops
role/qa
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set
Reference
coilyco-flight-deck/infrastructure#887
Loading…
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Found while setting up acompose on kai-tower-3026 (native Windows). Related to #356.
Problem
agent-compose compose(v2.32.0) cannot converge on native Windows, a catch-22:composerequiresoperating_context: with it absent it exitsagent-compose.yaml must declare operating_context repositories.operating_contextvalue on Windows:repository "coilyco-flight-deck/agentic-os" must be a clean owner/repository path. Evenfoo/barfails, and the backslash formowner\repois rejected too.The check appears to run
filepath.Clean()(OS-specific) on each entry. On Windows that rewritesowner/repo->owner\repo, soClean(v) != vand the value is declared "not clean". Net: a config that validates (nooperating_context) cannot compose, and a config that could compose cannot validate. The composer is unusable on native Windows.Also: config discovery path differs by OS
The Windows binary reads
~/.agent-compose/agent-compose.yaml(C:\Users\<user>\.agent-compose\...), not the~/.config/agent-compose/agent-compose.yamlthat the Ansibleagent-composerole writes on mac/linux. (The role is already gated off thewindowsgroup, so this only bites once #356 wires Windows in.)Fix direction
The
operating_contextcleanliness check should usepath.Clean(forward-slash, OS-independent) rather thanfilepath.Clean: these are logicalowner/repoidentifiers, not filesystem paths.Workaround in place (kai-tower-3026)
Harness load point is hand-maintained per
group_vars/windows.yml:~/.claude/CLAUDE.md@-includesagentic-os-kai/AGENTS.mddirectly. A staged, inert~/.agent-compose/agent-compose.yaml(sources only, nooperating_context) is left ready for when the composer is Windows-operable.Repro on kai-tower-3026:
Diagnosis confirmed and fixed upstream: agent-compose#313.
Root cause
internal/cascade/cascade.go,validateConfiguredRepository. Exactly as this issue predicted:Probed on kai-tower-3026:
filepath.IsAbswas the same OS-specific trap one operand over.Fix
path.Cleanfor the cleanliness test, a leading-slash check in place offilepath.IsAbs, and the split dropsfilepath.ToSlashbecause the backslash rejection above it already guarantees forward slashes. Unix behaviour is unchanged, sincepath.Cleanandfilepath.Cleanagree there.Verification on kai-tower-3026
Shipped v2.32.0 against the fixed build, same config:
A full
composerun against an isolatedHOME, which v2.32.0 cannot start at all:go test ./...on Windows drops from 33 failures to 12: 22 tests fixed, 0 newly broken, acrosscascade,compose,converge, andnativelaunch. Most of them writeoperating_contextinto their fixture config and were failing atLoadConfig.On the config-discovery half of this issue
Not a bug, and no OS split.
internal/home/home.gomakes~/.agent-composethe canonical state directory on every platform, and~/.config/agent-composeis the pre-consolidation legacy path it migrates once, leaving a compatibility symlink. So the Ansibleagent-composerole is writing to the legacy location on mac and linux and getting away with it via that migration. Worth pointing the role at~/.agent-composedirectly before #356 wires Windows in, rather than treating it as a Windows-only path difference.Follow-up, not in scope here
12 Windows test failures remain, all pre-existing on
mainand unrelated tooperating_context: path separators baked into assertions,HOMEvsUSERPROFILEinTestResolveSkillLoadPointsDefaultsWireClaudeAndCodex, a stale palette snapshot, embedded-roster mismatches, and askillmountverified/preserved split thatTestConvergeComposesRosterIntoCascadenow reaches for the first time. These want their own issue onagent-compose; none of them blockcomposefrom converging.Once #313 releases, the staged
~/.agent-compose/agent-compose.yamlon kai-tower-3026 can drop its inert banner and take back theoperating_contextblock its comment already spells out.Landed and released. agent-compose#313 merged to
mainas1395916, CI green, and the release workflow published v2.33.0 with a Windows amd64 binary.kai-tower-3026 is upgraded (
scoop update agent-compose, 2.32.0 to 2.33.0) and the shipped binary clears the repro:A full
composeagainst an isolatedHOMEconverges on the released binary too:Kai has not pointed the live host at the composer yet.
~/.agent-compose/agent-compose.yamlstill carries its inert banner and the hand-maintained~/.claude/CLAUDE.md@-include fromgroup_vars/windows.ymlis untouched, because activating it rewrites that load point and belongs to the #356 rollout rather than to this bug. The composer half of the blocker is gone; #356 owns the wiring.Closing this. The 12 remaining Windows test failures are unrelated to
operating_contextand want their ownagent-composeissue.