One org-relationship source, read by both agents #856

Merged
coilysiren merged 2 commits from aos/claude/yt58-org-relationship into main 2026-08-16 03:49:11 +00:00
Member

Closes #806.

The name was a three-way conflict, and Kai picked

where said
the shipped prompt Coilyco Gaming Intelligence Team
#806's sourced fact Coilyco Gaming Robotics Division
the Forgejo ops account full_name Coilyco Robotic Operations Division

Kai chose Robotics Division, so the shipped string, the validateSharedPolicy anchor, and the two test anchors move together. Intelligence Team named a thing neither the issue nor the account uses and is gone from every live surface.

What ships

.agents/skills/coilyco-org, composed by both definitions, stating the relationship once: Sirens Discord is the community, Coilyco Gaming holds a staffing and product contract with it, the Robotics Division is the part that contract is with, and Echo and Deep are that division.

It is the only local skill root the two profiles share. That is what makes "both agents read the same text" a property a test can hold, rather than two files that agree until someone edits one.

The prompt keeps one line naming the division. Everything else — the relationship, the boundaries, the four provenance answers — is in the knowledge source, because #806 asked directly that an engineer not write the org description inline in a Go string.

Copy ownership, honestly stated

The issue reserves this wording to Content Creator. Kai's answer was to draft it from the issue text and edit in review, so the prose in references/organizations.md is mine and is meant to be edited. One file, no code behind it, so a rewrite does not touch this PR's structure.

What is not a wording choice, and what the tests pin, is the separation: an agent is never Sirens Discord staff, and Sirens Discord staff are never Coilyco Gaming employees. #230's staff description rests on that line holding.

The cost, because it is the largest single prompt raise on record

1951 bytes per turn, on both profiles, forever, measured against main's own rendered files rather than against the ratchet. Recorded in the raise ledger. A first draft cost 2827 and was cut to this without dropping a fact — the trimming is worth reviewing, since anything still redundant is paid every turn.

The raise being identical on both is the shared source showing up as arithmetic, the same way #235's did.

Two things a test caught that I had wrong

The image would not have booted. TestPolicyCheckRunsInsideTheImageContext failed with walk skill root .agents/skills/coilyco-org: no such file. A new skill root needs three COPY lines across three Dockerfile stages, the compose stage included, or the container dies at startup rather than at build. That test is why this is a working PR and not an outage.

config_test.go asserted Deep had exactly one policy root. True until now, and it is the assertion that would have caught a silent unwiring, so I widened it to name both roots rather than count them.

The merge, and a doc split it forced

Main moved 15 commits while this was open, including #840 giving Echo object emoji. Four conflicts, all of them two prompt raises landing at once. They are additive, so both entries and both raises stand, and I re-rendered from the merged sources and set the budgets to what they actually measure rather than computing them.

docs/sirens-echo-prompt-budget.md crossed the documentation cap as a result. That file is an append-only ledger wrapped around a short policy statement, so it would have crossed on the next raise regardless of whose it was. The ledger moves to sirens-echo-prompt-budget-raises.md and the policy doc keeps a pointer. Trimming my own entry to fit would have kicked the can one raise down the road.

Verified

Five new tests in organizations_test.go: both profiles compose the source, the facts reach both rendered packs rather than just being declared, both read byte-identical text, and the source keeps the organizations apart and bounds what may be said about the contract.

Confirmed failing first: removing the root from Deep alone fails three of them with deep composes no org source, so it answers from inference.

just gate green. Both snapshots regenerated and open identically.

Not done here

#230's staff description is a separate issue, untouched. This makes it possible to write coherently, which is what #806 said it was blocking.

The datasets under evaluations/ still contain replies saying Coilyco Gaming Intelligence Team. Those record what the model actually said on a given day, so rewriting them would falsify the evidence. They read as history, not as a live surface.

Closes #806. ## The name was a three-way conflict, and Kai picked | where | said | | --- | --- | | the shipped prompt | Coilyco Gaming **Intelligence Team** | | #806's sourced fact | Coilyco Gaming **Robotics Division** | | the Forgejo ops account `full_name` | Coilyco **Robotic Operations Division** | **Kai chose Robotics Division**, so the shipped string, the `validateSharedPolicy` anchor, and the two test anchors move together. `Intelligence Team` named a thing neither the issue nor the account uses and is gone from every live surface. ## What ships `.agents/skills/coilyco-org`, composed by both definitions, stating the relationship once: Sirens Discord is the community, Coilyco Gaming holds a staffing and product contract with it, the Robotics Division is the part that contract is with, and Echo and Deep are that division. It is the **only local skill root the two profiles share**. That is what makes "both agents read the same text" a property a test can hold, rather than two files that agree until someone edits one. The prompt keeps one line naming the division. Everything else — the relationship, the boundaries, the four provenance answers — is in the knowledge source, because #806 asked directly that an engineer not write the org description inline in a Go string. ## Copy ownership, honestly stated The issue reserves this wording to Content Creator. Kai's answer was to draft it from the issue text and edit in review, so **the prose in `references/organizations.md` is mine and is meant to be edited.** One file, no code behind it, so a rewrite does not touch this PR's structure. What is not a wording choice, and what the tests pin, is the separation: an agent is never Sirens Discord staff, and Sirens Discord staff are never Coilyco Gaming employees. #230's staff description rests on that line holding. ## The cost, because it is the largest single prompt raise on record **1951 bytes per turn, on both profiles, forever**, measured against main's own rendered files rather than against the ratchet. Recorded in the raise ledger. A first draft cost 2827 and was cut to this without dropping a fact — the trimming is worth reviewing, since anything still redundant is paid every turn. The raise being identical on both is the shared source showing up as arithmetic, the same way #235's did. ## Two things a test caught that I had wrong **The image would not have booted.** `TestPolicyCheckRunsInsideTheImageContext` failed with `walk skill root .agents/skills/coilyco-org: no such file`. A new skill root needs three `COPY` lines across three Dockerfile stages, the compose stage included, or the container dies at startup rather than at build. That test is why this is a working PR and not an outage. **`config_test.go` asserted Deep had exactly one policy root.** True until now, and it is the assertion that would have caught a silent unwiring, so I widened it to name both roots rather than count them. ## The merge, and a doc split it forced Main moved 15 commits while this was open, including #840 giving Echo object emoji. Four conflicts, all of them two prompt raises landing at once. They are additive, so both entries and both raises stand, and I re-rendered from the merged sources and set the budgets to what they actually measure rather than computing them. `docs/sirens-echo-prompt-budget.md` crossed the documentation cap as a result. **That file is an append-only ledger wrapped around a short policy statement, so it would have crossed on the next raise regardless of whose it was.** The ledger moves to `sirens-echo-prompt-budget-raises.md` and the policy doc keeps a pointer. Trimming my own entry to fit would have kicked the can one raise down the road. ## Verified Five new tests in `organizations_test.go`: both profiles compose the source, the facts reach both **rendered** packs rather than just being declared, both read byte-identical text, and the source keeps the organizations apart and bounds what may be said about the contract. Confirmed failing first: removing the root from Deep alone fails three of them with `deep composes no org source, so it answers from inference`. `just gate` green. Both snapshots regenerated and open identically. ## Not done here `#230`'s staff description is a separate issue, untouched. This makes it possible to write coherently, which is what #806 said it was blocking. The datasets under `evaluations/` still contain replies saying `Coilyco Gaming Intelligence Team`. Those record what the model actually said on a given day, so rewriting them would falsify the evidence. They read as history, not as a live surface.
feat(agents): one org-relationship source both profiles read
All checks were successful
ci / image-build (pull_request) Successful in 28s
ci / test (pull_request) Successful in 48s
ci / publish-echo-image (pull_request) Has been skipped
ci / publish-observed (pull_request) Has been skipped
8353e6ed58
The relationship between Sirens Discord and Coilyco Gaming was written
down nowhere the agents read, so every answer about who made them, who
runs the server, or whether they are staff came from inference. Two
agents inferring the same relationship separately is the drift #806
exists to prevent.

`.agents/skills/coilyco-org` states it once and both definitions compose
it. It is the only local skill root the two share, which is what makes
"both agents read the same text" a property a test can hold rather than
two files that happen to agree.

The prompt keeps one line naming the division and nothing else. The
relationship, the boundaries, and the answers live in the knowledge
source, because #806 asked directly that an engineer not write the org
description inline in a Go string.

That line said `Coilyco Gaming Intelligence Team`, a third name neither
the issue nor the Forgejo ops account uses. Kai chose Robotics Division,
so the shipped string, the shared-policy validation anchor, and the two
test anchors all move together.

The separation is the load-bearing part and is pinned: an agent is never
Sirens Discord staff, and Sirens Discord staff are never Coilyco Gaming
employees. #230's staff description rests on the same line holding.

Costs 1951 bytes of prompt per turn on both profiles, recorded in the
budget doc. A first draft cost 2827 and was cut without losing a fact.

Co-authored-by: Kai Siren <coilysiren@gmail.com>
Co-authored-by: Claude <noreply@anthropic.com>
Merge main, and split the budget ledger it pushed over the cap
All checks were successful
ci / test (pull_request) Successful in 39s
ci / publish-echo-image (pull_request) Has been skipped
ci / publish-observed (pull_request) Has been skipped
ci / image-build (pull_request) Successful in 22s
2300fcbda7
Four conflicts, all of them two prompt raises landing at once. #840 gave
Echo object emoji while this branch gave both profiles the org source,
and the two are additive rather than competing, so both budget entries
and both raises stand.

The budgets are ratchets rather than measurements, so I re-rendered the
snapshots from the merged sources and set the numbers to what they
actually measure. The delta is 1951 bytes on each profile against main's
own rendered files, identical on both, which is the shared source
showing up as arithmetic.

`docs/sirens-echo-prompt-budget.md` crossed the documentation cap as a
result. That file is an append-only ledger wrapped around a short policy
statement, so it would cross again on the next raise no matter whose it
was. The ledger moves to its own file and the policy doc keeps a pointer.

Co-authored-by: Kai Siren <coilysiren@gmail.com>
Co-authored-by: Claude <noreply@anthropic.com>
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!856
No description provided.