feat(prompt): two rules so a reply cannot overstate what the runtime established #1152
No reviewers
Labels
No labels
burndown-2026-08
move-to-repo
coilyco-bridge-deploy
move-to-repo
coilyco-flight-deck-agent-compose
move-to-repo
coilyco-gaming-eco-app
move-to-repo
coilysiren-inbox
move-to-repo
unknown
🔒⚠️📦⚠️🔒 SANDBOXED 🔒⚠️📦⚠️🔒
autonomy
async-consult
autonomy
epic
autonomy
headless
autonomy
live-collab
c#
priority
P0
priority
P1
priority
P2
priority
P3
priority
P4
role/advocate
role/director
role/exec
role/frontend
role/gamedev
role/human
role/platform
role/qa
role/science
role/sysadmin
state
ambient
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set
Reference
coilyco-gaming/sirens-echo!1152
Loading…
Reference in a new issue
No description provided.
Delete branch "aos/claude/sb46"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Closes #175. Delivers what #843 asked for, and hands the confirming measurement over.
What was missing
Not the evidence. Boundary median across
#sirens-echo-botfor 2026-08-02 to 2026-08-12 was 24 words against an overall median of 24, so refusals sat at parity rather than shorter, and worse than parity once data dumps are excluded.cc7a862then isolated length as the cause rather than a correlate: Deep keptsocial, gained one instruction, and went from 4 of 13 leaked at a 179-word median to 0 of 15 at 18 words.What was missing was "a rule shaped for shipping rather than for the experiment" (#843). This is that rule.
Only half the experiment's instruction ships
The experiment said: at most three sentences for any answer, and one sentence with no justification when declining.
The first half is dropped. The leak lives in the justification, not in the length of an ordinary reply, and truncating an ordinary answer is the failure #175 names as the rule's own outside case. A member who asked for data still gets the data, and the shipped rule says so in its own text.
It is scoped, on purpose
The rule opens by naming when it applies. An always-inline imperative is read on every turn by a model with no way to tell it was written about refusals, which is exactly the mechanism #1049 describes, and emphatic unscoped prose is what travels furthest outside its subject. This is the first rule written after that finding, so it follows the convention rather than adding to the pile.
Every profile, not only neutral
#843measured the 14-of-15 breach on the social lane against its real composed bundle, so shipping this insideresponseInstructions(neutral-only) would have missed the lane it was measured on. It renders as its own section for both styles, andvalidateSharedPolicypins it, so it cannot drop out of a lane the way it was never in one.The instrument side needed nothing
All three checks #175 asks for already exist:
max_reply_words: 15on each boundary case in the rate pack.RateBrevitycompares boundary and conversational medians in one run set, with parity scored as a breach and a side that scored nothing reported unmeasured rather than passing.What this does not claim
It does not re-measure. The rule changes what a reply should look like, not what has been observed.
#843stays open for the run against the real composed bundle, which is the eval seat's to make and to interpret.composedForRunalready reads the real bundle whenSIRENS_COMPOSED_BUNDLEpoints at one and refuses to fall back to the stub, so the instrument for that run is in place.The case therefore keeps measuring rather than gating, and the attributes page now says so for the right reason. It previously said the ceiling does not gate "before the response policy changes". The policy just changed, so that sentence was stale.
Two things worth flagging
docs/FEATURES.mdis full. It sits at 120 lines and 7,986 characters against caps of 120 and 8,000, anddocs/holds 40 pages against a 40-page cap. A rule that changes how every refusal reads on both lanes is the kind of broad human-facing behaviour FEATURES is for, and there is no room to record it. I have not cut someone else's entry to make room. Filed separately.A defect found on the way. Nothing here depends on it, but
internal/community/prompt.gohad no shared home for a rule that is neither neutral-only nor bundle-only, which is why the brevity lever had nowhere obvious to land when it was first measured.Verification
go test ./...clean,just prompt-checkcurrent, and the full pre-commit suite passes. Three new tests pin the rule on both styles, prove a prompt missing it is refused, and assert the forbidden clauses and the outside case are still stated.Refs coilysiren/inbox#426
🤖 Generated with Claude Code
feat(prompt): ship the boundary-brevity rule on every profileto feat(prompt): two rules so a reply cannot overstate what the runtime establishedBlocked behind #1151, and not by anything in this diff.
ci / testfails inrole-drift-check, after every Go test has passed:The cause
agentic-os@fc3fefea("adopt the Agent Compose v3 seven-seat roster") renamed the public composed catalogue..agents/composed/tooling-ops-*becametooling-sysadmin-*, andtooling-qa-*is gone withqafolded away.agent/compose/roles.kdlstill names the old patterns, and an unmatched pattern is a hard error by design, which is the right design and is why this surfaces as a wall rather than an empty selection.This branch touches no role configuration. Its diff is
internal/community/prompt.go, two tests, the two rendered prompt snapshots, the board citations, the prompt budgets, and one docs page. The drift is onmainand reaches every branch, becauserole-drift-checkclones the catalogue fresh at run time rather than reading a pin.Why I have not fixed it here
#1151 already does. Its branch carries the correct mapping:
tooling-ops-*→tooling-sysadmin-*,tooling-qa-*→tooling-eval-*, andcreatorgainstooling-devrel-*. All four resolve against the current catalogue. Taking the same edit onto this branch would duplicate that work and conflict with it.What #1151 still needs
Its CI is red one step further along than mine, on a different error:
So the skill patterns are settled there and the role name is not:
engineeris now declared by both the community person package and the v3 core roster. That is a decision about which name the sirens lane takes after the reflow, not a mechanical rename, so it is #1151's author's to make rather than mine.To land this
Merge #1151, then update this branch from
main. Nothing else here is outstanding.Correction to my earlier comment: this is no longer blocked behind #1151, and the failure I reported has been superseded.
What I got wrong
I said the blocker was
role "engineer": pattern "tooling-ops-*" matches nothing, and that #1151'sroles.kdledit was the fix. That was the failure in the 10:20Z run and it is not the failure today.agentic-osmain moved after that run, and I read a stale CI result instead of reproducing the check locally.Reproducing it is what found the real one:
The tracked per-role records were the pre-reflow roster:
ai,creator,design,director,engineer,exec,ops,qa.agentic-osadopted the v3 seven-seat roster infc3fefeaand nothing here re-recorded. Sorole-drift-checkfails on every branch, and would fail on main's next run too.The check told whoever hit it exactly what to do. It had not been done.
Fixed here
daa1d2brebakes and records. Eight records for the eight roles that exist: the seven core seats pluslibrarianfrom the community person package. The eight stale ones are deleted rather than left beside them, because a record for a role nothing bakes is a file the next reader has to work out is dead.Part of this was owed by me regardless:
tooling-boundary-conformancelanded in the catalogue today and changes what several roles compose, so the record needed rewriting either way.Verified the way CI does it, forcing the fresh-clone path against
agentic-osmain rather than a local checkout, so it is not passing on something only my machine has.On #1151
Nothing here touches
agent/compose/roles.kdl, which is that branch's edit, so the two should not fight. Itstooling-ops-*→tooling-sysadmin-*mapping is still correct and still worth landing; it was fixing this drift from the other end.Its own CI is red on the older
role engineer exists in both rosters, from a 09:12Z run against a catalogue that has since moved. That may well pass on a re-run now. I have not touched it, since it is another seat's branch.Retracting my last comment.
daa1d2bwas wrong and is reverted in0023d17. #1151 was right and I had not read its body.What I did
role-drift-checkfailed witha role's selection changed. I ranjust compose-bundlesandjust role-snapshot, the check went green, and I committed that as the fix.It is not a fix. Every v3 seat bakes bare right now.
agent/compose/roles.kdlgrants its skills toengineerandcreator, which are not v3 seat names, so the seven core seats admit zero composed sources. The record I wrote hasplatformas sevenroster:coreidentity skills and no doctrine at all, where the oldengineerrecord carried fouraos-publicsources.So I made a red check green by recording that every seat composes nothing. That is the defect class this epic exists to fix, produced while working the epic.
It was signposted twice and I missed both
#1151's body says it outright:
And the tool said it too, once per seat, in a line I skimmed past while watching for
bundle verified:I read
bundle verified: 7 skillsas success. Seven is the identity meld alone.Where that leaves this PR
Genuinely blocked, and now for the right reason.
role-drift-checkstays red until #1147 builds the person package that givesengineer,creatorandopsreal homes in this repository. #1151 is the first reviewable step of that and says it does not turn CI green on its own.#1147 also carries an open design question its author declined to guess at, and I am not going to guess at it either: the lifted
opsrole carriesboundary "seek-external-validation"whose owning role does not exist in the package, and givingopsthelibrariantreatment of declaring no boundary entities would silently drop two boundaries from Echo, a running lane.The branch is byte-identical to
8184421, which is the last commit that carries only this PR's own work.Paused, not stalled. Kai's call is to hold #1151 for
coilyco-flight-deck/agent-compose#329rather than land its workaround, so this waits with it.Reasoning is on #1151. Short version: #1151 re-owns
seek-external-validationtocreatorbecause a person-package role cannot defer a boundary owned by a core-roster role, and #329 decision 5 collapses that distinction into one contract, which removes the need for the re-owning entirely.This branch is finished and needs nothing
Everything is committed and pushed.
go test ./...green,just prompt-checkcurrent, full pre-commit suite passing. The only red isrole-drift-check, which is red on every PR in this repository right now and is not about this diff.It carries five children of
coilysiren/inbox#426:#175- a declining reply is shorter than an ordinary one, in every profile, pinned byvalidateSharedPolicy#449- a bounded search cannot become an unbounded claim#310- the doctrine half, plus a 15-word ceiling on the two principal-echo rate cases#265- three tests pinning the session boundary a context bleed would have to cross#1049- every always-inline reference states what it applies to, enforced by a testTo resume
Update from
mainonce #1151 lands post-#329. Nothing here needs re-deriving, and no rebase conflict is expected: this branch touchesinternal/community, the two rendered prompt snapshots, the board citations, the prompt budgets,.agents/skills/*/references/, and one rate pack. None of that is #1151's surface.