A skill pointer phrased "when it is loaded" cannot fail loudly, so an absent overlay skill reads as satisfied #1381

Open
opened 2026-08-29 05:40:29 +00:00 by coilyco-ops · 0 comments
Owner

Split out of coilyco-flight-deck/agent-compose#379, where Gem hit it from the voice side while I was fixing the host-class cause. That fix (infrastructure#985) does not touch this, and this survives it.

The line

.agents/composed/writing-kai-voice/COMPOSED.md:49

* **LinkedIn** - apply the LinkedIn voice specialization when it is loaded.

kai-linkedin-voice lives only in agentic-os-kai/.agents/composed/. kai-linkedin-video, kai-engineering-voice, and kai-bio-surface are the same shape.

Why the phrasing is the defect

The register list is in a public skill that mounts everywhere. The specialization it points at mounts only where the private overlay composes. So on any host where the overlay is absent, for any reason, the agent reads a satisfied conditional: the pointer said "when it is loaded", it is not loaded, so the instruction is complete and the agent writes baseline voice.

Nothing announces the drop. The pointer is not broken, not stale, and not wrong. It is phrased so that its own failure mode is indistinguishable from its success, which means no amount of careful reading from inside a session catches it. Gem's report is the evidence: a devrel session whose whole charter is outward-facing communication read this line, satisfied it, and produced LinkedIn-adjacent copy in baseline voice.

That class matters more than this instance. A conditional pointer across a composition boundary is a boundary that is declared and not enforced, which is the tooling-boundary-conformance shape.

What would fix it

Options, none decided:

  • State the dependency and let composition fail closed. If the register names a specialization the bundle does not carry, that is a composition error rather than a runtime shrug.
  • Announce the absence. Keep composing, but have the composed output say which named specializations were expected and not mounted, so the roster shows a gap instead of hiding one.
  • Move the register. If the LinkedIn row only means anything with the overlay, the row belongs in the overlay, and the public skill should not carry a line it cannot satisfy.

The third is smallest and the first is strongest. Worth deciding once, because the phrasing pattern will recur wherever a public skill points at a private sibling.

Not established

How many other pointers share the shape. I found these four through Gem's report rather than by sweeping, and I have not grepped the composed tree for the pattern. That sweep is the first step whichever fix is chosen.

Split out of `coilyco-flight-deck/agent-compose#379`, where Gem hit it from the voice side while I was fixing the host-class cause. That fix (`infrastructure#985`) does not touch this, and this survives it. ## The line `.agents/composed/writing-kai-voice/COMPOSED.md:49` > `* **LinkedIn** - apply the LinkedIn voice specialization when it is loaded.` `kai-linkedin-voice` lives only in `agentic-os-kai/.agents/composed/`. `kai-linkedin-video`, `kai-engineering-voice`, and `kai-bio-surface` are the same shape. ## Why the phrasing is the defect The register list is in a public skill that mounts everywhere. The specialization it points at mounts only where the private overlay composes. So on any host where the overlay is absent, for any reason, the agent reads a satisfied conditional: the pointer said "when it is loaded", it is not loaded, so the instruction is complete and the agent writes baseline voice. Nothing announces the drop. The pointer is not broken, not stale, and not wrong. It is phrased so that its own failure mode is indistinguishable from its success, which means no amount of careful reading from inside a session catches it. Gem's report is the evidence: a devrel session whose whole charter is outward-facing communication read this line, satisfied it, and produced LinkedIn-adjacent copy in baseline voice. That class matters more than this instance. A conditional pointer across a composition boundary is a boundary that is declared and not enforced, which is the `tooling-boundary-conformance` shape. ## What would fix it Options, none decided: * **State the dependency and let composition fail closed.** If the register names a specialization the bundle does not carry, that is a composition error rather than a runtime shrug. * **Announce the absence.** Keep composing, but have the composed output say which named specializations were expected and not mounted, so the roster shows a gap instead of hiding one. * **Move the register.** If the LinkedIn row only means anything with the overlay, the row belongs in the overlay, and the public skill should not carry a line it cannot satisfy. The third is smallest and the first is strongest. Worth deciding once, because the phrasing pattern will recur wherever a public skill points at a private sibling. ## Not established How many other pointers share the shape. I found these four through Gem's report rather than by sweeping, and I have not grepped the composed tree for the pattern. That sweep is the first step whichever fix is chosen.
Sign in to join this conversation.
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/agentic-os#1381
No description provided.