The identity card summarizes the doctrine it tells the agent to load, so the load step gets skipped and nothing notices #303

Open
opened 2026-08-17 23:33:56 +00:00 by coilyco-ops · 0 comments
Member

The identity card ends with ## Active doctrine / Before acting, load: and six skill slugs. Everything above that line already delivers substance, including a one-line description of each personality and boundary. The result is a card that reads as complete, so the load step reads as optional, and nothing anywhere observes whether it happened.

Filed after it happened to a live exec session on 2026-08-17. The session answered a substantive question, with tool calls and a durable conclusion, having loaded none of its six named skills. It only surfaced because Kai asked directly.

Evidence

The renderer is internal/person/metadata.go:44-118. It emits, in order:

  • Role display name, purpose, seats.
  • Personality meld, each with emblem, colour, motif, and a one-line description pulled from the skill's own front matter.
  • Boundaries, each with a one-line summary and whether the role owns or defers it.
  • Last, the load list. Six bare slugs, no content, no reason, and no indication of what the summaries left out.

Measured against origin/main at 3c3caa7, for exec:

  • Inline summary text for the six named skills: 917 bytes.
  • Full body of those same six skills: 10,353 bytes.
  • Ratio: the card shows roughly 9% of the doctrine and names the rest.

Referenced body bytes for every role, same measurement:

  • engineer 10,371, director 7,599, qa 10,574, ops 13,373
  • design 11,496, exec 10,353, creator 8,412, ai 11,885

So between 7 KB and 13 KB of operative doctrine per role sits behind a list of names, under a set of summaries good enough to pass for the thing itself.

Why the summaries make it worse, not better

They are accurate. personality-outward compresses to "Check the local answer against the world outside it before trusting it," which is a fair reading of the body. That is exactly the problem. A stub would announce itself as a stub. A good summary does not, and the operative clauses live only in the body. boundary-seek-external-validation carries the rule that naming a reachable gap and stopping is itself a failure. Nothing in the one-liner hints that such a rule is down there.

Why this is not a discipline problem

The instruction is unconditional, and the session that skipped it was wrong to. But an instruction that gets skipped under a plausible task shape will keep getting skipped, and no amount of restating it changes the rendering. Two properties make the skip likely and invisible:

  • The load list is the only section of the card with no content, and it is last.
  • Nothing gates action on the load having happened, and nothing records that it did not.

The triggering question was a repository lookup. Nothing about "did the latest acompose changes land" cues "load your charter first." Scope is unconditional, salience is not, and the agent responded to salience.

Recommendation

Make the omission observable before trying to prevent it. Ordered:

  1. Measure it. An eval item that asks whether a composed agent loads its named skills before its first substantive action, varied across task shapes and including a plain lookup with no role flavour, gives a rate instead of an anecdote. The current evidence is one observed instance.
  2. Then change the card. The cheapest candidate is to stop having it deliver both a complete-feeling summary and a load list, since that pairing is what teaches the agent the list is optional. Marking what each summary omits, or naming the body size next to each slug, both close the gap the card currently hides.

Deriving a hard gate is a third option and probably premature. Measure first.

Complete when

  • An eval item covers load-before-act, run across at least one task shape with no role flavour in the prompt.
  • The rate is recorded, so a later card change has a before and after on the same cases.
  • The card no longer presents a summary and a load list as if the summary were the whole of it.
  • #302 - foregrounding one personality per role. That change assumes bundle content reaches behaviour, so a personality that is named but never loaded weakens its premise. Worth sequencing after this is measured.
  • #275 - composed body size. In direct tension with this one. That issue wants smaller bodies, and summarising instead of inlining is one way to get there. This issue is the cost side of that same trade, so the two should be decided together rather than separately.
  • #262 - the eval stack the measurement in step 1 would land in.

Ownership

Filed by the exec seat as a recommendation and capability-posture record. The renderer change and the eval item are Engineer's to implement. No code changed here.

Provenance

Session with Kai on 2026-08-17, immediately after the round that merged #296, #299, #300, and #301. Every measurement above was taken against origin/main at 3c3caa7.

The identity card ends with `## Active doctrine / Before acting, load:` and six skill slugs. Everything above that line already delivers substance, including a one-line description of each personality and boundary. The result is a card that reads as complete, so the load step reads as optional, and nothing anywhere observes whether it happened. Filed after it happened to a live exec session on 2026-08-17. The session answered a substantive question, with tool calls and a durable conclusion, having loaded none of its six named skills. It only surfaced because Kai asked directly. ## Evidence The renderer is `internal/person/metadata.go:44-118`. It emits, in order: * Role display name, purpose, seats. * Personality meld, each with emblem, colour, motif, and a one-line description pulled from the skill's own front matter. * Boundaries, each with a one-line summary and whether the role owns or defers it. * Last, the load list. Six bare slugs, no content, no reason, and no indication of what the summaries left out. Measured against `origin/main` at `3c3caa7`, for exec: * Inline summary text for the six named skills: 917 bytes. * Full body of those same six skills: 10,353 bytes. * Ratio: the card shows roughly 9% of the doctrine and names the rest. Referenced body bytes for every role, same measurement: * engineer 10,371, director 7,599, qa 10,574, ops 13,373 * design 11,496, exec 10,353, creator 8,412, ai 11,885 So between 7 KB and 13 KB of operative doctrine per role sits behind a list of names, under a set of summaries good enough to pass for the thing itself. ## Why the summaries make it worse, not better They are accurate. `personality-outward` compresses to "Check the local answer against the world outside it before trusting it," which is a fair reading of the body. That is exactly the problem. A stub would announce itself as a stub. A good summary does not, and the operative clauses live only in the body. `boundary-seek-external-validation` carries the rule that naming a reachable gap and stopping is itself a failure. Nothing in the one-liner hints that such a rule is down there. ## Why this is not a discipline problem The instruction is unconditional, and the session that skipped it was wrong to. But an instruction that gets skipped under a plausible task shape will keep getting skipped, and no amount of restating it changes the rendering. Two properties make the skip likely and invisible: * The load list is the only section of the card with no content, and it is last. * Nothing gates action on the load having happened, and nothing records that it did not. The triggering question was a repository lookup. Nothing about "did the latest acompose changes land" cues "load your charter first." Scope is unconditional, salience is not, and the agent responded to salience. ## Recommendation Make the omission observable before trying to prevent it. Ordered: 1. Measure it. An eval item that asks whether a composed agent loads its named skills before its first substantive action, varied across task shapes and including a plain lookup with no role flavour, gives a rate instead of an anecdote. The current evidence is one observed instance. 2. Then change the card. The cheapest candidate is to stop having it deliver both a complete-feeling summary and a load list, since that pairing is what teaches the agent the list is optional. Marking what each summary omits, or naming the body size next to each slug, both close the gap the card currently hides. Deriving a hard gate is a third option and probably premature. Measure first. ## Complete when * An eval item covers load-before-act, run across at least one task shape with no role flavour in the prompt. * The rate is recorded, so a later card change has a before and after on the same cases. * The card no longer presents a summary and a load list as if the summary were the whole of it. ## Related * #302 - foregrounding one personality per role. That change assumes bundle content reaches behaviour, so a personality that is named but never loaded weakens its premise. Worth sequencing after this is measured. * #275 - composed body size. In direct tension with this one. That issue wants smaller bodies, and summarising instead of inlining is one way to get there. This issue is the cost side of that same trade, so the two should be decided together rather than separately. * #262 - the eval stack the measurement in step 1 would land in. ## Ownership Filed by the exec seat as a recommendation and capability-posture record. The renderer change and the eval item are Engineer's to implement. No code changed here. ## Provenance Session with Kai on 2026-08-17, immediately after the round that merged #296, #299, #300, and #301. Every measurement above was taken against `origin/main` at `3c3caa7`.
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/agent-compose#303
No description provided.