feat(compose): grant the engineer role its room-craft #961

Closed
coilyco-ops wants to merge 0 commits from feat/engineer-role-graph into main
Member

sirens-dowel runs SIRENS_ECHO_ROLE=engineer for the 2026-08-19 Temporal
livestream (coilyco-bridge/deploy#658). engineer had no entry in this graph, so
it composed the roster identity alone: six skills and zero sources, against
creator's twenty-four and nineteen.

That is the documented behaviour of an absent entry rather than a defect. It is
also the wrong shape for a lane whose entire job is a live Discord room.

Blocked on #963, which this PR found

test passes here, including role-drift-check, so the tracked snapshot is
correct. image-build failed on:

role "engineer": pattern "tooling-sirens-dowel-contract" matches nothing in /tmp/aos-catalog

The skill merged to agentic-os main at 15:37:26Z and this build ran at
16:07:22Z, thirty minutes later, with a catalogue clone that still did not have
it. Dockerfile's RUN git clone --branch "${AOS_CATALOG_REF}" caches on
instruction text, so the ref docs/sirens-echo-compose.md calls "floating on
main by design" was frozen.

Fixed separately in #963, because it blocks any change adding a catalogue
source and #956 needs it too. Merge #963 first, then this. Nothing here needs
to change for it.

The personality was never the gap

The role flip was read as a neutrality change and that diagnosis was wrong.

The bundle already carries personality-curious, meticulous, and tenacious
from the roster. The Seat: and Personalities: lines in the rebaked
engineer.bundle.txt are unchanged by this diff. What was missing is
room-craft: the community-host loop, the social writing set, and the
preference skills that give a reply something to be about.

What is granted

Grants mirror creator's, because the lane sits in a Discord guild for the same
reason Deep does, plus tooling-sirens-dowel-contract, which reconciles an
engineer charter with a conversational seat: the work product is a turn rather
than a landed change, the lane's own posts are speech rather than the live-system
mutation boundary-modify-live-system defers, and the composed personalities are
the point of the seat rather than overhead.

tooling-customer-success-* is deliberately not granted. Those are community
trust-repair and signal-routing surfaces for the Sirens server, and this lane
serves one staging guild for one stream.

personal-preference-social matches the glob and stays denied by
DeniedComposedSkills, exactly as it is for creator.

Verification

scripts/task.sh role-drift-check, re-run against agentic-os main at
cc3cf4b1 after agentic-os#1123 merged:

  • role engineer: 18 sources admitted
  • role engineer: 24 skills, prompt 63696 bytes, bundle verified
  • engineer.bundle.txt is not in the drift list, so the tracked snapshot
    matches what a fresh compile produces
  • CI's own test job agrees: role-drift-check passed there

Conflicts with #956

#956 also adds a role "engineer" block to this file, so only one can land. It
reads engineer as a code-engineering seat (coding-*, tooling-qa-*,
tooling-ops-*); this reads it as the Discord seat the lane actually is. That is
a product call rather than mine. Separately, #956's graph fails the expander
outright, since tooling-repo-baseline is an exact name living in the private
catalogue while the image reads only aos-public. Commented there with the
output.

Also left out on purpose

Roster drift. Rebaking reports drift on ai.bundle.txt and
exec.bundle.txt, where the roster moved curious to empirical and outward.
Reverted here so this change stays one thing. CI's test job passes without it,
which means the CI container's agent-compose is older than a current
workstation's. Worth its own change.

No docs page. docs/ is at its 40-page cap and sirens-echo-compose.md sits
13 characters under its own, and catalog-doc-size explicitly refuses
split-to-fit. The commit message carries the reasoning until related pages get
merged. Also worth its own change.

`sirens-dowel` runs `SIRENS_ECHO_ROLE=engineer` for the 2026-08-19 Temporal livestream (coilyco-bridge/deploy#658). `engineer` had no entry in this graph, so it composed the roster identity alone: **six skills and zero sources**, against `creator`'s twenty-four and nineteen. That is the documented behaviour of an absent entry rather than a defect. It is also the wrong shape for a lane whose entire job is a live Discord room. ## Blocked on #963, which this PR found `test` passes here, including `role-drift-check`, so the tracked snapshot is correct. `image-build` failed on: ``` role "engineer": pattern "tooling-sirens-dowel-contract" matches nothing in /tmp/aos-catalog ``` The skill merged to agentic-os `main` at 15:37:26Z and this build ran at 16:07:22Z, thirty minutes later, with a catalogue clone that still did not have it. `Dockerfile`'s `RUN git clone --branch "${AOS_CATALOG_REF}"` caches on instruction text, so the ref `docs/sirens-echo-compose.md` calls "floating on `main` by design" was frozen. **Fixed separately in #963**, because it blocks any change adding a catalogue source and #956 needs it too. **Merge #963 first**, then this. Nothing here needs to change for it. ## The personality was never the gap The role flip was read as a neutrality change and that diagnosis was wrong. The bundle already carries `personality-curious`, `meticulous`, and `tenacious` from the roster. The `Seat:` and `Personalities:` lines in the rebaked `engineer.bundle.txt` are **unchanged** by this diff. What was missing is **room-craft**: the community-host loop, the social writing set, and the preference skills that give a reply something to be about. ## What is granted Grants mirror `creator`'s, because the lane sits in a Discord guild for the same reason Deep does, plus `tooling-sirens-dowel-contract`, which reconciles an engineer charter with a conversational seat: the work product is a turn rather than a landed change, the lane's own posts are speech rather than the live-system mutation `boundary-modify-live-system` defers, and the composed personalities are the point of the seat rather than overhead. `tooling-customer-success-*` is deliberately **not** granted. Those are community trust-repair and signal-routing surfaces for the Sirens server, and this lane serves one staging guild for one stream. `personal-preference-social` matches the glob and stays denied by `DeniedComposedSkills`, exactly as it is for `creator`. ## Verification `scripts/task.sh role-drift-check`, re-run against agentic-os `main` at `cc3cf4b1` after agentic-os#1123 merged: - `role engineer: 18 sources admitted` - `role engineer: 24 skills, prompt 63696 bytes`, bundle verified - `engineer.bundle.txt` is **not** in the drift list, so the tracked snapshot matches what a fresh compile produces - CI's own `test` job agrees: `role-drift-check` passed there ## Conflicts with #956 #956 also adds a `role "engineer"` block to this file, so only one can land. It reads `engineer` as a code-engineering seat (`coding-*`, `tooling-qa-*`, `tooling-ops-*`); this reads it as the Discord seat the lane actually is. That is a product call rather than mine. Separately, #956's graph fails the expander outright, since `tooling-repo-baseline` is an exact name living in the private catalogue while the image reads only `aos-public`. Commented there with the output. ## Also left out on purpose **Roster drift.** Rebaking reports drift on `ai.bundle.txt` and `exec.bundle.txt`, where the roster moved `curious` to `empirical` and `outward`. Reverted here so this change stays one thing. CI's `test` job passes without it, which means the CI container's `agent-compose` is older than a current workstation's. Worth its own change. **No docs page.** `docs/` is at its 40-page cap and `sirens-echo-compose.md` sits 13 characters under its own, and `catalog-doc-size` explicitly refuses split-to-fit. The commit message carries the reasoning until related pages get merged. Also worth its own change.
feat(compose): grant the engineer role its room-craft
Some checks failed
ci / image-build (pull_request) Failing after 31s
ci / test (pull_request) Successful in 1m6s
ci / publish-echo-image (pull_request) Has been skipped
ci / publish-observed (pull_request) Has been skipped
cfb082e99c
sirens-dowel runs SIRENS_ECHO_ROLE=engineer for the 2026-08-19 Temporal
livestream (coilyco-bridge/deploy#658). engineer had no entry in this graph, so
it composed the roster identity alone: six skills and zero sources, against
creator's twenty-four and nineteen. That is the documented behaviour of an
absent entry rather than a defect, and the wrong shape for a lane whose entire
job is a live Discord room.

The personality was never the gap. The bundle already carries curious,
meticulous, and tenacious from the roster, and the seat and personality lines in
the rebaked engineer.bundle.txt are unchanged. What was missing is room-craft:
the community-host loop, the social writing set, and the preference skills that
give a reply something to be about. That absence is what made the role flip read
as a neutrality change.

Grants mirror creator's plus tooling-sirens-dowel-contract, which reconciles an
engineer charter with a conversational seat. tooling-customer-success-* is
deliberately not granted: those are community trust-repair and signal-routing
surfaces for the Sirens server, and this lane serves one staging guild for one
stream. personal-preference-social matches the glob and stays denied by
composepolicy.go, exactly as for creator.

The register is a separate control and does not follow the role. response_style
stays social on that lane, which is what lets the composed bundle reach the
voice at all.

Verified with scripts/task.sh role-drift-check against the catalogue: engineer
admits 18 sources and the bundle verifies at 24 skills.

NO DOCS PAGE, DELIBERATELY. docs/ is at its 40-page cap and
sirens-echo-compose.md is 13 characters under its own, so both a section and a
new page fail the layout hooks. The reasoning above is the durable record until
someone merges related pages. Worth its own change.

NOT INCLUDED: rebaking also reports drift on ai.bundle.txt and exec.bundle.txt,
where the roster moved curious to empirical and outward respectively. That
predates this branch and is reverted here so this change stays one thing.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Co-authored-by: Kai Siren <coilysiren@gmail.com>
Co-authored-by: Claude <noreply@anthropic.com>
Author
Member

Folded into #956 and closing this one.

Both branches inserted a role "engineer" block at the same line of roles.kdl, so they conflicted on merge. The glob sets turned out disjoint, so #956 now carries the union: this branch's room-craft (tooling-sirens-dowel-contract, tooling-discord-community-host, personal-preference-*, personal-preferences, writing-*) plus the engineering doctrine half.

Two things from here that carried over:

  • The rebaked engineer.bundle.txt. #956 had no bundle at all, so landing it second would have left the record stale and role-drift-check red.
  • The ai.bundle.txt and exec.bundle.txt roster drift you identified. #956 records it rather than reverting it. Keeping this branch to one thing was the right instinct, but the revert is what leaves the check red on main, and the branch needs a green role-drift-check to be verifiable before the stream.

One correction worth carrying: four entries in #956's half (tooling-repo-baseline, tooling-browser-routing, tooling-forgejo-issue-counts, tooling-triage-cascade) live in agentic-os-kai, and both Dockerfile:46 and role-drift-check pass public agentic-os alone, so they matched nothing and hard-failed the bake. They are dropped in #956 and the catalogue-reach rule is now in the roles.kdl header.

Reopen this if the union in #956 lost something it should not have.

Folded into #956 and closing this one. Both branches inserted a `role "engineer"` block at the same line of `roles.kdl`, so they conflicted on merge. The glob sets turned out disjoint, so #956 now carries the union: this branch's room-craft (`tooling-sirens-dowel-contract`, `tooling-discord-community-host`, `personal-preference-*`, `personal-preferences`, `writing-*`) plus the engineering doctrine half. Two things from here that carried over: * The rebaked `engineer.bundle.txt`. #956 had no bundle at all, so landing it second would have left the record stale and `role-drift-check` red. * The `ai.bundle.txt` and `exec.bundle.txt` roster drift you identified. #956 records it rather than reverting it. Keeping this branch to one thing was the right instinct, but the revert is what leaves the check red on `main`, and the branch needs a green `role-drift-check` to be verifiable before the stream. One correction worth carrying: four entries in #956's half (`tooling-repo-baseline`, `tooling-browser-routing`, `tooling-forgejo-issue-counts`, `tooling-triage-cascade`) live in `agentic-os-kai`, and both `Dockerfile:46` and `role-drift-check` pass public `agentic-os` alone, so they matched nothing and hard-failed the bake. They are dropped in #956 and the catalogue-reach rule is now in the `roles.kdl` header. Reopen this if the union in #956 lost something it should not have.
coilyco-ops closed this pull request 2026-08-18 16:38:33 +00:00
Some checks failed
ci / image-build (pull_request) Failing after 31s
ci / test (pull_request) Successful in 1m6s
ci / publish-echo-image (pull_request) Has been skipped
ci / publish-observed (pull_request) Has been skipped

Pull request closed

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-gaming/sirens-echo!961
No description provided.