Echo composes the ops role, and role stops implying voice #758

Merged
coilysiren merged 1 commit from eng/echo-composes-ops into main 2026-08-14 03:05:08 +00:00
Member

Sirens Echo runs ops. Sirens Deep keeps creator, which needed no change — it was the runtime default.

closes #757

The blocker this had to clear

composed: true with response_style: neutral was unsatisfiable, not merely unusual:

  • prompt.go required the literal ## Personality meld for a composing profile.
  • The same file forbade personality meld for a neutral profile.

The validator had encoded a coincidence. Until now the only composing lane was also the only expressive one, so nothing ever needed role and voice to come apart.

The framing

role-ops is the operator charter, not the infrastructure one. The infrastructure is a binding — the use-repository infrastructure / deploy / hardware lines in coilyco-bridge/agentic-os-kai's role graph. This repository admits no bindings, only what its request declares, so Echo inherits the charter and none of the estate.

Read that charter with its nouns removed and it is what .agents/skills/sirens-echo-community already said longhand:

role-ops Echo's existing local policy
a signal is not proof "Never claim a lookup, escalation, or issue action happened unless a tool result in the current turn confirms it"
evidence defines the estate "a URL written from memory is a fabrication even when the address turns out to be real"
factual work records sanitized knowledge-gap / correction issue drafts, observed-only
authority boundaries "It cannot edit or delete an issue body, reopen, or reach another repository"
no claimed containment "Never describe work as continuing after the reply"
hand reusable work to Engineering files an issue instead of fixing

Echo was already running the ops charter; it was just written out longhand as local policy. Its estate is the Sirens Discord as a running system rather than a cluster. Written up in the new docs/sirens-echo-role-and-voice.md.

What changed

  • Role and voice decoupled. A new composedVoicePolicy renders only for a neutral composing profile and states precedence outright: the bundle supplies doctrine, the response rules win on voice, the seat name and pronouns are never spoken. ValidateNeutralSystemPrompt now requires that clause exactly where it stopped requiring the meld's absence — the property is checked by presence rather than absence.
  • SIRENS_DEEP_ROLESIRENS_ECHO_ROLE, matching every other harness variable.
  • The creator default is gone. Safe while one lane composed; with two, a forgotten variable would have answered the Sirens community in Deep's persona. An unnamed role now fails startup the way a missing bundle already does.
  • Prompt snapshot regenerated, budget raised with the reason stated.
  • Docs corrected where they claimed Echo composes nothing.

ops gets no entry in agent/compose/roles.kdl — bare role-ops plus its meld. The skills a community lane would reach for are voice skills Echo's neutrality rejects, and widening it later stays a visible diff in the role record.

Verification

go test ./..., go vet, prompt --check, policy-check, and the full pre-commit suite all pass. New test: TestNeutralProfileComposesARoleWithoutTakingItsVoice, which also asserts that stripping the precedence clause fails validation.

Reviewer's eye

The ops meld is grounded/protective/reflective and the seat is Olaf (he). Protective is an emotional stance, which Echo's policy declines outright. Two layers hold it back — the precedence clause in the prompt, and ValidateNeutralStyle rejecting first person on every reply — but it is now doctrine Echo carries and cannot express. If that reads wrong, the fix is a meld override in the roster rather than anything in this diff.

Paired with coilyco-bridge/deploy#491, which names the role on both lanes. Land that first: these values are inert until an image carrying this change is pinned, but pinning before the deploy side is set would fail startup on both lanes.

🤖 Generated with Claude Code

Sirens Echo runs `ops`. Sirens Deep keeps `creator`, which needed no change — it was the runtime default. closes #757 ## The blocker this had to clear `composed: true` with `response_style: neutral` was **unsatisfiable**, not merely unusual: - `prompt.go` required the literal `## Personality meld` for a composing profile. - The same file forbade `personality meld` for a neutral profile. The validator had encoded a coincidence. Until now the only composing lane was also the only expressive one, so nothing ever needed role and voice to come apart. ## The framing `role-ops` is the operator charter, not the infrastructure one. The infrastructure is a *binding* — the `use-repository infrastructure / deploy / hardware` lines in `coilyco-bridge/agentic-os-kai`'s role graph. This repository admits no bindings, only what its request declares, so Echo inherits the charter and none of the estate. Read that charter with its nouns removed and it is what `.agents/skills/sirens-echo-community` already said longhand: | role-ops | Echo's existing local policy | |---|---| | a signal is not proof | "Never claim a lookup, escalation, or issue action happened unless a tool result in the current turn confirms it" | | evidence defines the estate | "a URL written from memory is a fabrication even when the address turns out to be real" | | factual work records | sanitized `knowledge-gap` / `correction` issue drafts, observed-only | | authority boundaries | "It cannot edit or delete an issue body, reopen, or reach another repository" | | no claimed containment | "Never describe work as continuing after the reply" | | hand reusable work to Engineering | files an issue instead of fixing | Echo was already running the ops charter; it was just written out longhand as local policy. Its estate is the Sirens Discord as a running system rather than a cluster. Written up in the new `docs/sirens-echo-role-and-voice.md`. ## What changed - **Role and voice decoupled.** A new `composedVoicePolicy` renders only for a neutral composing profile and states precedence outright: the bundle supplies doctrine, the response rules win on voice, the seat name and pronouns are never spoken. `ValidateNeutralSystemPrompt` now *requires* that clause exactly where it stopped requiring the meld's absence — the property is checked by presence rather than absence. - **`SIRENS_DEEP_ROLE` → `SIRENS_ECHO_ROLE`**, matching every other harness variable. - **The `creator` default is gone.** Safe while one lane composed; with two, a forgotten variable would have answered the Sirens community in Deep's persona. An unnamed role now fails startup the way a missing bundle already does. - Prompt snapshot regenerated, budget raised with the reason stated. - Docs corrected where they claimed Echo composes nothing. `ops` gets no entry in `agent/compose/roles.kdl` — bare `role-ops` plus its meld. The skills a community lane would reach for are voice skills Echo's neutrality rejects, and widening it later stays a visible diff in the role record. ## Verification `go test ./...`, `go vet`, `prompt --check`, `policy-check`, and the full pre-commit suite all pass. New test: `TestNeutralProfileComposesARoleWithoutTakingItsVoice`, which also asserts that stripping the precedence clause fails validation. ## Reviewer's eye The ops meld is grounded/**protective**/reflective and the seat is Olaf (he). Protective is an emotional stance, which Echo's policy declines outright. Two layers hold it back — the precedence clause in the prompt, and `ValidateNeutralStyle` rejecting first person on every reply — but it is now doctrine Echo carries and cannot express. If that reads wrong, the fix is a meld override in the roster rather than anything in this diff. Paired with coilyco-bridge/deploy#491, which names the role on both lanes. **Land that first**: these values are inert until an image carrying this change is pinned, but pinning before the deploy side is set would fail startup on both lanes. 🤖 Generated with [Claude Code](https://claude.com/claude-code)
feat(compose): Echo composes the ops role, and role stops implying voice
All checks were successful
ci / image-build (pull_request) Successful in 22s
ci / test (pull_request) Successful in 39s
ci / publish-echo-image (pull_request) Has been skipped
ci / publish-observed (pull_request) Has been skipped
2ea8f70b18
Sirens Echo runs `ops` and Sirens Deep keeps `creator`.

`composed: true` with `response_style: neutral` was unsatisfiable rather than
unusual: a composing profile had to contain "## Personality meld" and a neutral
one had to not. The validator encoded a coincidence, since the only composing
lane was also the only expressive one.

composedVoicePolicy renders for a neutral composing profile and states the
precedence outright - the bundle supplies doctrine, the response rules win on
voice, the seat name and pronouns are never spoken.
ValidateNeutralSystemPrompt requires that clause exactly where it stopped
requiring the meld's absence, so the property is checked by presence rather than
by absence.

`ops` is the operator charter and not the infrastructure one. The infrastructure
is a binding in agentic-os-kai's role graph, and this repository admits no
bindings, so Echo takes the charter and none of the estate. Read with its nouns
removed, that charter is what sirens-echo-community already said longhand, and
Echo's estate is the Sirens Discord as a running system.

SIRENS_DEEP_ROLE becomes SIRENS_ECHO_ROLE and loses its `creator` default,
because with two composing lanes a forgotten variable would answer the Sirens
community in Deep's persona.

closes #757

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>
Owner

I want a meld override on the name exclusively

I want a meld override on the name exclusively
Author
Member

🤖 Filed by Claude Code on Kai's behalf.

I want a meld override on the name exclusively

Built, landed upstream, and currently undeliverable. Details in that order.

Built

agent-compose had no override of any kind — ParseRequest is a closed switch and anything unrecognised fails as unknown node. So this was a new grammar node, not a config flip:

compose {
    role "ops"
    identity name="Echo" pronouns="it"
    delivery "native-skills"
}

Name and pronouns only, as you asked. That turned out to be the right cut for a reason beyond scope: role.Personalities also drives the melded favorite color, the nativeui theme tokens, and a validator requiring exactly three personalities on a core role. A name is one seam; a meld filter is several.

The override rewrites the role identity and every seat, because the card and roster read the role while the overlay, statusline, launcher, and manifest read the seats — rewriting one alone ships a bundle whose card and statusline disagree. Covered by a test asserting the rendered card says **Agent // Echo (it)**, that Olaf is gone rather than merely joined, and that a renamed seat cannot reuse an unrenamed bundle.

Landed as 71b112b on agent-compose main, closing coilyco-flight-deck/agent-compose#280. It also required a carve-out to docs/person-contract.md, which said an overlay may not redefine seats. The line it now holds: who is speaking is a caller's to name, what the role is is not.

Undeliverable

Nothing in this repository has changed, and I have not added the identity node to agent/compose/request.kdl, because doing so would break the image build today.

The delivery chain is: agent-compose releases → agentic-os/docker/dev-base/full/Dockerfile bumps AGENT_COMPOSE_VERSIONagentic-os:release republishes → this image rebuilds against it.

agent-compose's release pipeline has failed on every main push for a week. Last release is v2.19.0 on 2026-08-07, which is exactly the version agentic-os pins. Filed as coilyco-flight-deck/agent-compose#281 — I could not read the runner logs, so that issue carries metadata and one untested hypothesis rather than a cause.

What that means for this PR

It does not block it. Merging ships Echo composing ops with Olaf (he) in the identity card, never spoken: ValidateNeutralStyle rejects first person on every reply, and the precedence clause forbids the seat name outright. The rename lands as its own change once the pipeline is fixed.

Worth restating since it changed since this PR opened: merging does auto-deploy. Echo is reconciled by the chart-pin loop, so this reaches the Sirens Discord within about five minutes of the image publishing. I told you earlier it was hand-pinned; that was wrong, and coilyco-bridge/deploy#502 fixes the files that said so.

🤖 Filed by Claude Code on Kai's behalf.

> 🤖 Filed by Claude Code on Kai's behalf. > I want a meld override on the name exclusively Built, landed upstream, and currently undeliverable. Details in that order. ## Built `agent-compose` had no override of any kind — `ParseRequest` is a closed switch and anything unrecognised fails as `unknown node`. So this was a new grammar node, not a config flip: ```kdl compose { role "ops" identity name="Echo" pronouns="it" delivery "native-skills" } ``` Name and pronouns only, as you asked. That turned out to be the right cut for a reason beyond scope: `role.Personalities` also drives the melded favorite color, the nativeui theme tokens, and a validator requiring exactly three personalities on a core role. A name is one seam; a meld filter is several. The override rewrites the role identity **and** every seat, because the card and roster read the role while the overlay, statusline, launcher, and manifest read the seats — rewriting one alone ships a bundle whose card and statusline disagree. Covered by a test asserting the rendered card says `**Agent // Echo (it)**`, that `Olaf` is gone rather than merely joined, and that a renamed seat cannot reuse an unrenamed bundle. Landed as `71b112b` on `agent-compose` main, closing https://forgejo.coilysiren.me/coilyco-flight-deck/agent-compose/issues/280. It also required a carve-out to `docs/person-contract.md`, which said an overlay may not redefine seats. The line it now holds: who is speaking is a caller's to name, what the role is is not. ## Undeliverable Nothing in this repository has changed, and I have not added the `identity` node to `agent/compose/request.kdl`, because doing so would break the image build today. The delivery chain is: agent-compose releases → `agentic-os/docker/dev-base/full/Dockerfile` bumps `AGENT_COMPOSE_VERSION` → `agentic-os:release` republishes → this image rebuilds against it. **agent-compose's release pipeline has failed on every main push for a week.** Last release is v2.19.0 on 2026-08-07, which is exactly the version agentic-os pins. Filed as https://forgejo.coilysiren.me/coilyco-flight-deck/agent-compose/issues/281 — I could not read the runner logs, so that issue carries metadata and one untested hypothesis rather than a cause. ## What that means for this PR It does not block it. Merging ships Echo composing `ops` with `Olaf (he)` in the identity card, never spoken: `ValidateNeutralStyle` rejects first person on every reply, and the precedence clause forbids the seat name outright. The rename lands as its own change once the pipeline is fixed. Worth restating since it changed since this PR opened: merging **does** auto-deploy. Echo is reconciled by the chart-pin loop, so this reaches the Sirens Discord within about five minutes of the image publishing. I told you earlier it was hand-pinned; that was wrong, and https://forgejo.coilysiren.me/coilyco-bridge/deploy/pulls/502 fixes the files that said so. > 🤖 Filed by Claude Code on Kai's behalf.
Sign in to join this conversation.
No reviewers
No milestone
No project
No assignees
2 participants
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!758
No description provided.