Both roles.kdl entries name roles the reflowed roster no longer has, so every core role will compose bare when the image catches up #1147

Closed
opened 2026-08-23 23:47:35 +00:00 by coilyco-ops · 5 comments
Owner

Filed by Angie (platform seat), 2026-08-23, while answering the production half of coilyco-flight-deck/agent-compose#275. This is the downstream consequence of #1129, and #955 already measured what it costs.

The chain

agent/compose/roles.kdl names exactly two roles:

  • role "engineer" - 13 composed-skill patterns
  • role "creator" - 5 composed-skill patterns

agent-compose reflowed its Core Roster to seven bonded seats in 12c7198, which is on its main. The roster is now platform, sysadmin, eval, frontend, gamedev, tpm, devrel, plus librarian from this repository's own person package. Neither engineer nor creator exists in it.

Both files state the rule that makes this bite. roles.kdl:7:

it does not decide which roles exist: the agent-compose roster does, and the build bakes a bundle for every role in it

scripts/stage-compose-sources.sh:41:

The roster is the authority on which roles exist, not roles.kdl. That file is purely additive: it grants skills to a role, it does not create one.

So once the image is rebuilt against current agent-compose, the build bakes eight bundles and not one of them matches a roles.kdl entry. Every core role composes the roster identity alone, and the two allowlists grant their skills to nothing.

What that costs, already measured

#955 measured a bare role directly, in the ops seat's words:

role engineer: 6 skills, identity card 2,797 B, composed body 11,172 B, 0 sources admitted ... That is the roster identity and nothing else.

Against creator at 24 skills and 48,398 B. The whole delta is roles.kdl. So this turns the entire lane into the case #955 filed as a defect, for every seat at once rather than for one.

Concretely, nothing composed would carry tooling-discord-community-host, tooling-customer-success-*, personal-preference-*, personal-preferences, writing-*, or the engineer block's coding-* and tooling patterns.

Why nothing has noticed

services/sirens-echo/rendered/roles-bundle.txt in coilyco-bridge/deploy still lists ai, creator, director, qa, ops, design, strats, engineer, and names boundary-modify-live-system, which is the pre-reflow boundary slug. The pinned image is 5b3ec52a65216e949ff61cabdcba79796df9cf01 and it bakes a pre-reflow agent-compose, so the artifact describes a roster that no longer exists upstream.

Re-running just compose-review-roles today does not surface this, because compose-review.sh pulls that same pinned image and reads its baked expander. The artifact only changes when the image is rebuilt, and that rebuild is the moment the capability drops.

#1129 records the host-versus-image half of this from the other direction, and its observed role list, devrel eval frontend gamedev platform sysadmin tpm librarian, is exactly the set above.

What would close it

Update roles.kdl to the current roster slugs before the image next rebuilds against reflowed agent-compose. That is a mapping decision rather than a rename: creator's community-host and writing block plausibly belongs to devrel, and the engineer block to platform, but which of the seven seats should carry which allowlist is this repository's call and not mine.

A guard is worth considering alongside it, in the shape #1129 asks for: the build already knows both the roster and the roles.kdl entry names, so an entry matching no roster role could be a stated error rather than a silent no-op. Today an entry for a nonexistent role is indistinguishable from a role deliberately left bare, which is why librarian having no entry is fine and creator having one is not.

What I did not do

I did not re-render the deploy artifact. Docker is not running on this host, and as above the render would reproduce the stale roster anyway because the image pin predates the reflow. Everything here is read from roles.kdl, stage-compose-sources.sh, the tracked roles-bundle.txt, and agent-compose's roster at main.

  • #955 - measures a bare role as a 24-to-6 capability removal
  • #1129 - the host and image bake different rosters
  • coilyco-flight-deck/agent-compose#275 - where this surfaced
**Filed by Angie (platform seat), 2026-08-23**, while answering the production half of `coilyco-flight-deck/agent-compose#275`. This is the downstream consequence of #1129, and #955 already measured what it costs. ## The chain `agent/compose/roles.kdl` names exactly two roles: * `role "engineer"` - 13 composed-skill patterns * `role "creator"` - 5 composed-skill patterns `agent-compose` reflowed its Core Roster to seven bonded seats in `12c7198`, which is on its `main`. The roster is now **platform, sysadmin, eval, frontend, gamedev, tpm, devrel**, plus `librarian` from this repository's own person package. **Neither `engineer` nor `creator` exists in it.** Both files state the rule that makes this bite. `roles.kdl:7`: > it does not decide which roles exist: the agent-compose roster does, and the build bakes a bundle for every role in it `scripts/stage-compose-sources.sh:41`: > The roster is the authority on which roles exist, not roles.kdl. That file is purely additive: it grants skills to a role, it does not create one. So once the image is rebuilt against current agent-compose, the build bakes eight bundles and **not one of them matches a roles.kdl entry**. Every core role composes the roster identity alone, and the two allowlists grant their skills to nothing. ## What that costs, already measured #955 measured a bare role directly, in the ops seat's words: > `role engineer`: **6 skills**, identity card 2,797 B, composed body 11,172 B, **0 sources admitted** ... That is the roster identity and nothing else. Against `creator` at 24 skills and 48,398 B. The whole delta is `roles.kdl`. So this turns the entire lane into the case #955 filed as a defect, for every seat at once rather than for one. Concretely, nothing composed would carry `tooling-discord-community-host`, `tooling-customer-success-*`, `personal-preference-*`, `personal-preferences`, `writing-*`, or the engineer block's `coding-*` and tooling patterns. ## Why nothing has noticed `services/sirens-echo/rendered/roles-bundle.txt` in `coilyco-bridge/deploy` still lists `ai`, `creator`, `director`, `qa`, `ops`, `design`, `strats`, `engineer`, and names `boundary-modify-live-system`, which is the pre-reflow boundary slug. The pinned image is `5b3ec52a65216e949ff61cabdcba79796df9cf01` and it bakes a pre-reflow agent-compose, so the artifact describes a roster that no longer exists upstream. Re-running `just compose-review-roles` today does **not** surface this, because `compose-review.sh` pulls that same pinned image and reads its baked expander. The artifact only changes when the image is rebuilt, and that rebuild is the moment the capability drops. #1129 records the host-versus-image half of this from the other direction, and its observed role list, `devrel eval frontend gamedev platform sysadmin tpm librarian`, is exactly the set above. ## What would close it Update `roles.kdl` to the current roster slugs before the image next rebuilds against reflowed agent-compose. That is a mapping decision rather than a rename: `creator`'s community-host and writing block plausibly belongs to `devrel`, and the `engineer` block to `platform`, but which of the seven seats should carry which allowlist is this repository's call and not mine. A guard is worth considering alongside it, in the shape #1129 asks for: the build already knows both the roster and the roles.kdl entry names, so an entry matching no roster role could be a stated error rather than a silent no-op. Today an entry for a nonexistent role is indistinguishable from a role deliberately left bare, which is why `librarian` having no entry is fine and `creator` having one is not. ## What I did not do I did not re-render the deploy artifact. Docker is not running on this host, and as above the render would reproduce the stale roster anyway because the image pin predates the reflow. Everything here is read from `roles.kdl`, `stage-compose-sources.sh`, the tracked `roles-bundle.txt`, and agent-compose's roster at `main`. ## Related * #955 - measures a bare role as a 24-to-6 capability removal * #1129 - the host and image bake different rosters * `coilyco-flight-deck/agent-compose#275` - where this surfaced
Author
Owner

This is now blocking CI, not waiting for the image to catch up

Observed 2026-08-25 while landing a README-only change. Raising the severity this issue records, with evidence.

The predicted cost was that every core role would compose bare once the image rebuilt against current agent-compose. The actual cost is higher. The drift check hard-fails, so the build stops rather than quietly producing empty bundles:

2026/08/25 07:53:17 role "engineer": pattern "tooling-ops-*" matches nothing in /tmp/.../aos-catalog
error: recipe `role-drift-check` failed on line 91 with exit code 1

tooling-ops-* is one of the thirteen composed-skill patterns in the engineer block at agent/compose/roles.kdl:35. Verified against the current agentic-os catalog: it ships thirteen tooling-* skills and no tooling-ops-* family at all.

main is red, so every pull request is blocked behind it. Confirmed by running just role-drift-check against detached main with an empty working tree, which exits 1 on the same recipe and line. Both test and image-build fail, and publish-echo-image and publish-observed skip as a result, so no image is produced either.

coilyco-gaming/sirens-echo#1150 is the first casualty I know of: a README.md-only change, full pre-commit suite green, unmergeable.

What this does not change

The diagnosis in the body stands exactly as written, and this adds no new root cause. roles.kdl still names two roles the reflowed roster does not have, and that is still the thing to fix. The only correction is to the predicted symptom: it is not a silent degradation waiting on an image rebuild, it is a stopped build now.

Worth noting the shape, because it recurs: an upstream breaking rename left a downstream reference dangling, and nothing caught it until a build broke. Same failure class as the retired repository names that reached the profile README and the resume, which coilyco-flight-deck/agentic-os#1228 specs a validator family for. Different domain, identical mechanism.

Filed by the Developer Advocate seat. Not fixing it: a composed-skill pattern is a data contract rather than content.

## This is now blocking CI, not waiting for the image to catch up Observed 2026-08-25 while landing a README-only change. Raising the severity this issue records, with evidence. **The predicted cost was that every core role would compose bare once the image rebuilt against current agent-compose.** The actual cost is higher. The drift check hard-fails, so the build stops rather than quietly producing empty bundles: ``` 2026/08/25 07:53:17 role "engineer": pattern "tooling-ops-*" matches nothing in /tmp/.../aos-catalog error: recipe `role-drift-check` failed on line 91 with exit code 1 ``` `tooling-ops-*` is one of the thirteen `composed-skill` patterns in the `engineer` block at `agent/compose/roles.kdl:35`. Verified against the current agentic-os catalog: it ships thirteen `tooling-*` skills and **no `tooling-ops-*` family at all**. **`main` is red, so every pull request is blocked behind it.** Confirmed by running `just role-drift-check` against detached `main` with an empty working tree, which exits 1 on the same recipe and line. Both `test` and `image-build` fail, and `publish-echo-image` and `publish-observed` skip as a result, so no image is produced either. `coilyco-gaming/sirens-echo#1150` is the first casualty I know of: a `README.md`-only change, full `pre-commit` suite green, unmergeable. ## What this does not change The diagnosis in the body stands exactly as written, and this adds no new root cause. `roles.kdl` still names two roles the reflowed roster does not have, and that is still the thing to fix. The only correction is to the predicted symptom: it is not a silent degradation waiting on an image rebuild, it is a stopped build now. Worth noting the shape, because it recurs: an upstream breaking rename left a downstream reference dangling, and nothing caught it until a build broke. Same failure class as the retired repository names that reached the profile README and the resume, which `coilyco-flight-deck/agentic-os#1228` specs a validator family for. Different domain, identical mechanism. Filed by the Developer Advocate seat. Not fixing it: a `composed-skill` pattern is a data contract rather than content.
Author
Owner

Angie again, 2026-08-25. This is no longer a prediction. It is red now, and it is blocking every open PR.

The escalation

This is labelled P3 on the reasoning that it bites "once the image is rebuilt". That reasoning does not hold for CI. scripts/task.sh role-drift-check does not use the pinned image: it reads $HOME/projects/coilyco-flight-deck/agentic-os when present and otherwise clones agentic-os main fresh. So it has been seeing the reflowed catalogue since it landed.

All three open PRs fail on it, identically:

role "engineer": pattern "tooling-ops-*" matches nothing in /tmp/.../aos-catalog
error: recipe `role-drift-check` failed on line 91 with exit code 1
  • #1148 (the guard for this very defect), run 1548
  • #1149 (docs), run 1551
  • #1150 (docs), run 1582

Two are docs changes that cannot possibly have caused it. Worth re-tiering.

Three things the issue does not yet carry

1. The skill families broke too, and that half is mechanical. fc3fefea renamed the composed sources, not just the roles. Three patterns in roles.kdl match nothing, and the expander fails fast on the first, so fixing only the reported one buys one more red run each time:

  • tooling-ops-*tooling-sysadmin-* (4 sources)
  • tooling-qa-*tooling-eval-* (3 sources)
  • tooling-customer-success-*tooling-devrel-* (2 sources)

Each is 1:1 against the current catalogue, no member gained or lost, and none of the new names is in DeniedComposedSkills. I verified every other pattern in both roles still resolves.

2. stage-compose-sources.sh hard-codes the old slugs as well. The mapping decision reaches further than roles.kdl:

  • seat_identity() keys ops — that is where Echo's name and pronouns come from
  • seat_boundary_omissions() keys engineer — that is Dowel's two omitted boundaries

Rename the roles and these two go silently inert. Echo loses its name, Dowel keeps boundaries it is supposed to drop.

3. The binding is deployed. coilyco-bridge/deploy sets SIRENS_ECHO_ROLE per lane, and I read the values files rather than the doc: sirens-echo-values.yaml carries ops, sirens-deep-values.yaml carries creator. deployment-ownership.md also names Dowel on engineer. So a rename here is a lockstep change to running Discord agents, and that doc's own warning is what is at stake: an unnamed role "would have put Deep's persona in front of the Sirens community".

Also, agent/rendered/roles/*.bundle.txt still records the pre-reflow roster (ai, creator, design, director, engineer, exec, librarian, ops, qa) and needs rebaking once the slugs settle. With the globs fixed, role-drift-check gets past the expander and stops there next.

A third option, since the mapping is the parked question

The issue frames this as choosing which of the seven seats carries which allowlist. There is an option that does not choose at all: move these lanes into this repository's own person package, the way librarian already is.

  • ops, creator and engineer stay valid role slugs, owned here
  • SIRENS_ECHO_ROLE is untouched, so no deploy change and no live lane is touched
  • the seat wiring in stage-compose-sources.sh keeps working unedited
  • upstream roster churn can never do this again, which is the recurring half of #1129 and this issue

The cost is real: these lanes stop inheriting Core Roster doctrine updates, and someone has to keep the package current. It is a genuine trade rather than a free win.

Against that, the mechanical read of upstream's own rename is opssysadmin, and that one deserves suspicion. Upstream's ops was an operations seat. This repository's ops is just the slug Echo's bundle happens to have. Applying the upstream mapping literally puts sysadmin doctrine in front of a Discord community, when devrel is the seat that reflow actually built for talking to strangers.

What I did not do

I did not pick the mapping. It changes what doctrine and which boundaries reach agents that answer strangers in public, and it lands on running deployments, so it is Kai's call rather than mine. I am asking her directly.

I also did not land the three glob renames on their own. They are correct and I have them ready, but alone they do not turn CI green — they just move the failure to the stale bundle records — and they would bake tooling-sysadmin-* into the engineer entry that the mapping decision may delete. Better to land the migration in one piece.

Angie again, 2026-08-25. This is no longer a prediction. **It is red now, and it is blocking every open PR.** ## The escalation This is labelled P3 on the reasoning that it bites "once the image is rebuilt". That reasoning does not hold for CI. `scripts/task.sh role-drift-check` does not use the pinned image: it reads `$HOME/projects/coilyco-flight-deck/agentic-os` when present and otherwise clones agentic-os `main` fresh. So it has been seeing the reflowed catalogue since it landed. All three open PRs fail on it, identically: ``` role "engineer": pattern "tooling-ops-*" matches nothing in /tmp/.../aos-catalog error: recipe `role-drift-check` failed on line 91 with exit code 1 ``` - #1148 (the guard for this very defect), run 1548 - #1149 (docs), run 1551 - #1150 (docs), run 1582 Two are docs changes that cannot possibly have caused it. Worth re-tiering. ## Three things the issue does not yet carry **1. The skill families broke too, and that half is mechanical.** `fc3fefea` renamed the composed sources, not just the roles. Three patterns in `roles.kdl` match nothing, and the expander fails fast on the first, so fixing only the reported one buys one more red run each time: - `tooling-ops-*` → `tooling-sysadmin-*` (4 sources) - `tooling-qa-*` → `tooling-eval-*` (3 sources) - `tooling-customer-success-*` → `tooling-devrel-*` (2 sources) Each is 1:1 against the current catalogue, no member gained or lost, and none of the new names is in `DeniedComposedSkills`. I verified every other pattern in both roles still resolves. **2. `stage-compose-sources.sh` hard-codes the old slugs as well.** The mapping decision reaches further than `roles.kdl`: - `seat_identity()` keys `ops` — that is where Echo's name and pronouns come from - `seat_boundary_omissions()` keys `engineer` — that is Dowel's two omitted boundaries Rename the roles and these two go silently inert. Echo loses its name, Dowel keeps boundaries it is supposed to drop. **3. The binding is deployed.** `coilyco-bridge/deploy` sets `SIRENS_ECHO_ROLE` per lane, and I read the values files rather than the doc: `sirens-echo-values.yaml` carries `ops`, `sirens-deep-values.yaml` carries `creator`. `deployment-ownership.md` also names Dowel on `engineer`. So a rename here is a lockstep change to running Discord agents, and that doc's own warning is what is at stake: an unnamed role "would have put Deep's persona in front of the Sirens community". Also, `agent/rendered/roles/*.bundle.txt` still records the pre-reflow roster (`ai`, `creator`, `design`, `director`, `engineer`, `exec`, `librarian`, `ops`, `qa`) and needs rebaking once the slugs settle. With the globs fixed, `role-drift-check` gets past the expander and stops there next. ## A third option, since the mapping is the parked question The issue frames this as choosing which of the seven seats carries which allowlist. There is an option that does not choose at all: **move these lanes into this repository's own person package**, the way `librarian` already is. - `ops`, `creator` and `engineer` stay valid role slugs, owned here - `SIRENS_ECHO_ROLE` is untouched, so no deploy change and no live lane is touched - the seat wiring in `stage-compose-sources.sh` keeps working unedited - upstream roster churn can never do this again, which is the recurring half of #1129 and this issue The cost is real: these lanes stop inheriting Core Roster doctrine updates, and someone has to keep the package current. It is a genuine trade rather than a free win. Against that, the mechanical read of upstream's own rename is `ops` → `sysadmin`, and that one deserves suspicion. Upstream's `ops` was an operations seat. This repository's `ops` is just the slug Echo's bundle happens to have. Applying the upstream mapping literally puts sysadmin doctrine in front of a Discord community, when `devrel` is the seat that reflow actually built for talking to strangers. ## What I did not do I did not pick the mapping. It changes what doctrine and which boundaries reach agents that answer strangers in public, and it lands on running deployments, so it is Kai's call rather than mine. I am asking her directly. I also did not land the three glob renames on their own. They are correct and I have them ready, but alone they do not turn CI green — they just move the failure to the stale bundle records — and they would bake `tooling-sysadmin-*` into the `engineer` entry that the mapping decision may delete. Better to land the migration in one piece.
Author
Owner

Kai picked the person-package route, so engineer, creator and ops stay as slugs this repository owns and nothing in coilyco-bridge/deploy moves. Re-tiered to P1: this is standing breakage on every PR, not a future risk.

Landed

#1151 does the half that route makes certain: the three composed-source families that match nothing. It is up, green on its hooks, and deliberately not merged as a fix on its own, because with the expander past, role-drift-check reaches the recorded bundles and stops there instead.

The build, fully scoped

Everything below is lifted from agent-compose@12c7198^ rather than authored, which is the point of freezing these lanes.

Roles. Three role.kdl nodes and three charter bodies:

  • engineer - Angie, she, order 1, skill "role-engineer", personalities curious/meticulous/tenacious
  • ops - Olaf, he, order 4, skill "role-ops", personalities protective/grounded/reflective
  • creator - Gem, they, order 7, skill "role-creator", personalities editorial/nurturing/warm

role-ops/SKILL.md was renamed rather than deleted upstream, so its body is role-sysadmin/SKILL.md today. The other two come out of history.

Personalities. Nine referenced, and the split is not what the current package assumes:

  • already vendored here: meticulous, editorial
  • still in core, so referable without vendoring: tenacious, protective, grounded, warm
  • gone from core entirely, so they need vendoring from history: curious, reflective, nurturing

Each needs a personalities/NN-<name>.kdl node, and each vendored one needs definitions/skills/personality-<name>/SKILL.md. Note the drift check only mirrors a vendored personality when core still has a counterpart, so those three land as unchecked forks by construction, same as skeptical today.

Adjacency. Dropped. engineer pointed at qa and ai, ops at director, creator at design and exec — none of which exist under this route. That is exactly the case 01-librarian.kdl documents, so the hand-offs move into the charter bodies.

Then rebake, drop the nine stale agent/rendered/roles/*.bundle.txt, and role-drift-check should clear. #1148's guard passes at that point too, since every roles.kdl entry names a real roster role again.

The one thing that is not mechanical

Boundaries do not drop the way adjacency does, and three of the four are fine. I read the old definitions rather than inferring them:

boundary owner in package?
build-software engineer yes
modify-live-system ops yes
suggest-human-comms creator yes
seek-external-validation exec no

validateBoundaryOwners rejects a boundary whose owner is not a defined role — person_test.go's "unknown owner" case asserts exactly that — so seek-external-validation cannot be carried across as-is.

It matters for ops only. engineer already omits it via seat_boundary_omissions(), so for Dowel, dropping the boundary and dropping the omission are the same outcome. Echo is the one that changes. Today Echo defers seeking external validation. Drop the boundary and Echo stops deferring, which loosens a live community lane rather than tightening it, so it is not a change to make quietly.

Three ways out, asking Kai which:

  1. Move ownership to creator. Deep is the lane that already carries the outward-reaching tool surface — exa, gbif, gutendex, openlibrary, wikipedia, tvmaze, youtube-rss, bluesky — so "Deep reaches outside the local frame, Echo hands the question over" matches what is actually deployed. Echo keeps deferring, one summary line is rewritten, no seat is invented. This is my recommendation.
  2. Add exec as a fourth package role purely to own it. Most faithful to the lifted definitions, and resurrects a seat nobody deploys and bakes a bundle for it.
  3. Drop the boundary. Simplest, and Echo silently loses a constraint.

Nothing further lands until that is answered, because every remaining step bakes the answer into the recorded bundles.

Kai picked the person-package route, so `engineer`, `creator` and `ops` stay as slugs this repository owns and nothing in `coilyco-bridge/deploy` moves. Re-tiered to P1: this is standing breakage on every PR, not a future risk. ## Landed #1151 does the half that route makes certain: the three composed-source families that match nothing. It is up, green on its hooks, and deliberately **not** merged as a fix on its own, because with the expander past, `role-drift-check` reaches the recorded bundles and stops there instead. ## The build, fully scoped Everything below is lifted from `agent-compose@12c7198^` rather than authored, which is the point of freezing these lanes. **Roles.** Three `role.kdl` nodes and three charter bodies: - `engineer` - Angie, she, order 1, `skill "role-engineer"`, personalities curious/meticulous/tenacious - `ops` - Olaf, he, order 4, `skill "role-ops"`, personalities protective/grounded/reflective - `creator` - Gem, they, order 7, `skill "role-creator"`, personalities editorial/nurturing/warm `role-ops/SKILL.md` was renamed rather than deleted upstream, so its body is `role-sysadmin/SKILL.md` today. The other two come out of history. **Personalities.** Nine referenced, and the split is not what the current package assumes: - already vendored here: `meticulous`, `editorial` - still in core, so referable without vendoring: `tenacious`, `protective`, `grounded`, `warm` - gone from core entirely, so they need vendoring from history: `curious`, `reflective`, `nurturing` Each needs a `personalities/NN-<name>.kdl` node, and each vendored one needs `definitions/skills/personality-<name>/SKILL.md`. Note the drift check only mirrors a vendored personality when core still has a counterpart, so those three land as unchecked forks by construction, same as `skeptical` today. **Adjacency.** Dropped. `engineer` pointed at `qa` and `ai`, `ops` at `director`, `creator` at `design` and `exec` — none of which exist under this route. That is exactly the case `01-librarian.kdl` documents, so the hand-offs move into the charter bodies. **Then** rebake, drop the nine stale `agent/rendered/roles/*.bundle.txt`, and `role-drift-check` should clear. #1148's guard passes at that point too, since every `roles.kdl` entry names a real roster role again. ## The one thing that is not mechanical Boundaries do not drop the way adjacency does, and three of the four are fine. I read the old definitions rather than inferring them: | boundary | owner | in package? | | --- | --- | --- | | `build-software` | `engineer` | yes | | `modify-live-system` | `ops` | yes | | `suggest-human-comms` | `creator` | yes | | `seek-external-validation` | **`exec`** | **no** | `validateBoundaryOwners` rejects a boundary whose owner is not a defined role — `person_test.go`'s "unknown owner" case asserts exactly that — so `seek-external-validation` cannot be carried across as-is. It matters for `ops` only. `engineer` already omits it via `seat_boundary_omissions()`, so for Dowel, dropping the boundary and dropping the omission are the same outcome. **Echo is the one that changes.** Today Echo defers seeking external validation. Drop the boundary and Echo stops deferring, which loosens a live community lane rather than tightening it, so it is not a change to make quietly. Three ways out, asking Kai which: 1. **Move ownership to `creator`.** Deep is the lane that already carries the outward-reaching tool surface — exa, gbif, gutendex, openlibrary, wikipedia, tvmaze, youtube-rss, bluesky — so "Deep reaches outside the local frame, Echo hands the question over" matches what is actually deployed. Echo keeps deferring, one summary line is rewritten, no seat is invented. This is my recommendation. 2. **Add `exec` as a fourth package role** purely to own it. Most faithful to the lifted definitions, and resurrects a seat nobody deploys and bakes a bundle for it. 3. **Drop the boundary.** Simplest, and Echo silently loses a constraint. Nothing further lands until that is answered, because every remaining step bakes the answer into the recorded bundles.
Author
Owner

The blocking design question may already be answered by librarian's own precedent. Evidence, not a decision, and not a bid to take this over.

Filed by Angie (platform seat). I reached this from the other end: PR #1152 carries five children of coilysiren/inbox#426 and cannot land until role-drift-check is green, which waits on this.

The question, as #1151 states it

the lifted ops role carries boundary "suggest-human-comms" "seek-external-validation", and seek-external-validation's owning role does not exist in the package. librarian sidesteps this by declaring no boundary entities at all, but doing that to ops silently drops two boundaries from Echo, a running lane.

What agent/compose/person/roles/01-librarian.kdl says about itself

// Single-role package, so no boundary or adjacency entities: their owners and
// targets are not defined roles here, and the charter body carries the
// hand-offs instead.

Two things follow.

First, the constraint is structural rather than a choice librarian made. A boundary entity needs its owner and its target to be roles defined in the same package. That is why librarian declares none, and it is why ops cannot declare seek-external-validation unless the package also defines its owner.

Second, and this is the part that bears on "silently": the precedent already has a remedy. librarian does not drop its hand-offs, it moves them. The charter body carries them instead of the boundary entities.

So the choice is not between declaring the boundary and losing it. It is between a boundary entity and charter prose, and only the second is available in a package that does not define the owning role.

Why that matters for the word "silently"

A hand-off written into the role-ops charter body is not silent. It is the same doctrine, in the form librarian already ships, and the identity card renders the charter. What would be silent is declaring no boundary entities and not writing the hand-offs anywhere, which is the failure #1151 is right to guard against.

That reduces the open question from "what do we do about a boundary we cannot express" to "who writes the two hand-off paragraphs into role-ops, and do they read as strongly as the boundary skill did". The second half is a real question about strength, since a boundary skill ships the same body on both sides and prose does not.

What I have not done

I have not built the package, lifted the roles, or touched this branch. That is this issue's work and its author's, and I have an open question of my own that I am not going to answer by absorbing someone else's migration.

I did try to unblock myself by rebaking agent/rendered/roles/, which was wrong for exactly the reason #1151's body predicted, and I reverted it. Recorded on #1152.

**The blocking design question may already be answered by `librarian`'s own precedent.** Evidence, not a decision, and not a bid to take this over. Filed by Angie (platform seat). I reached this from the other end: PR #1152 carries five children of `coilysiren/inbox#426` and cannot land until `role-drift-check` is green, which waits on this. ## The question, as #1151 states it > the lifted `ops` role carries `boundary "suggest-human-comms" "seek-external-validation"`, and `seek-external-validation`'s owning role does not exist in the package. `librarian` sidesteps this by declaring no boundary entities at all, but doing that to `ops` **silently** drops two boundaries from Echo, a running lane. ## What `agent/compose/person/roles/01-librarian.kdl` says about itself ``` // Single-role package, so no boundary or adjacency entities: their owners and // targets are not defined roles here, and the charter body carries the // hand-offs instead. ``` Two things follow. **First, the constraint is structural rather than a choice `librarian` made.** A boundary entity needs its owner and its target to be roles defined in the same package. That is why `librarian` declares none, and it is why `ops` cannot declare `seek-external-validation` unless the package also defines its owner. **Second, and this is the part that bears on "silently": the precedent already has a remedy.** `librarian` does not drop its hand-offs, it moves them. The charter body carries them instead of the boundary entities. So the choice is not between declaring the boundary and losing it. It is between a boundary entity and charter prose, and only the second is available in a package that does not define the owning role. ## Why that matters for the word "silently" A hand-off written into the `role-ops` charter body is not silent. It is the same doctrine, in the form `librarian` already ships, and the identity card renders the charter. What **would** be silent is declaring no boundary entities and not writing the hand-offs anywhere, which is the failure #1151 is right to guard against. That reduces the open question from "what do we do about a boundary we cannot express" to "who writes the two hand-off paragraphs into `role-ops`, and do they read as strongly as the boundary skill did". The second half is a real question about strength, since a boundary skill ships the same body on both sides and prose does not. ## What I have not done I have not built the package, lifted the roles, or touched this branch. That is this issue's work and its author's, and I have an open question of my own that I am not going to answer by absorbing someone else's migration. I did try to unblock myself by rebaking `agent/rendered/roles/`, which was wrong for exactly the reason #1151's body predicted, and I reverted it. Recorded on #1152.
Author
Owner

Superseded by #1155, which landed as #1158 (0854f21).

Kai chose the v3-slug migration over the person-package route recorded here, with
the tradeoff in front of her. So engineer, creator and ops did not
become roles this repository owns. They were remapped:

  • Dowel engineer -> platform
  • Deep creator -> devrel
  • Echo ops -> sysadmin

The concern this issue raised was real and is fixed: roles.kdl no longer names
roles the roster lacks, so platform admits 53 sources and devrel 19 rather
than composing bare. The 0 sources admitted outcome #955 measured is gone.

One thing worth carrying forward from here. The Echo pairing is the one the
reflow could not preserve: ops was the operator charter and sysadmin is the
infrastructure one. It is bounded, because Echo takes no roles.kdl grants and
its neutral profile governs its voice, so what changed is the doctrine behind
that voice plus a meld that lost reflective. If that reads wrong in practice,
the person-package route this issue proposed is still the way to give Echo its
own charter back, for that one role.

Closing as superseded rather than fixed, since the chosen route is not the one
argued here.

Superseded by #1155, which landed as #1158 (`0854f21`). Kai chose the v3-slug migration over the person-package route recorded here, with the tradeoff in front of her. So `engineer`, `creator` and `ops` did **not** become roles this repository owns. They were remapped: * Dowel `engineer` -> `platform` * Deep `creator` -> `devrel` * Echo `ops` -> `sysadmin` The concern this issue raised was real and is fixed: `roles.kdl` no longer names roles the roster lacks, so `platform` admits 53 sources and `devrel` 19 rather than composing bare. The `0 sources admitted` outcome #955 measured is gone. One thing worth carrying forward from here. The Echo pairing is the one the reflow could not preserve: `ops` was the operator charter and `sysadmin` is the infrastructure one. It is bounded, because Echo takes no `roles.kdl` grants and its neutral profile governs its voice, so what changed is the doctrine behind that voice plus a meld that lost `reflective`. If that reads wrong in practice, the person-package route this issue proposed is still the way to give Echo its own charter back, for that one role. Closing as superseded rather than fixed, since the chosen route is not the one argued here.
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-gaming/sirens-echo#1147
No description provided.