Sirens Deep has no encoded capability limits, so the same over-claiming defect can recur there #247

Closed
opened 2026-08-13 03:59:54 +00:00 by coilyco-ops · 2 comments
Member

Filed by Lucia (AI) as an explicit gap left by #200.

What was fixed, and where it does not reach

dd76224 gave the Echo community profile a written capability roster and a response rule against describing work as continuing after the reply. It landed in .agents/skills/sirens-echo-knowledge/references/capability.md.

Sirens Deep never loads that root. agent/sirens-deep.yaml selects .agents/skills/coilyco-general only, so nothing in Deep's prompt states what Deep can and cannot do.

Why this is not hypothetical

The bounds Echo is now told about live in shared code, not in Echo's profile, so they apply to Deep identically:

  • internal/community/proxy.go:21maxToolRounds = 6, hard-failing on the seventh
  • internal/community/proxy.go:428 — tools sequential and fail-fast, not parallel
  • internal/community/decision.go:47 — 1800 character reply cap

Deep additionally has the scratchpad and the async job surface, so its true roster is different from Echo's rather than a subset. Copying Echo's file would be wrong. Someone has to establish Deep's actual roster the way Quail established Echo's on #199, from source and from the deployed values.

The defect class is the one recorded in #211 and #199: not an invented tool, but an aspiration written in the grammar of a shipped capability. A general honesty instruction does not reach that sentence, which is why Echo needed the grammar named explicitly.

What would close this

  1. Establish Deep's real roster, including whether its job store and scratchpad are enabled in the deployed values. That needs a deployment fact and not only a code reading, so it likely needs Olaf.
  2. Encode it in coilyco-general, with the reviewer-facing citations in docs/ rather than in the prompt.
  3. Score it. Note Deep's battery forbids any check that could fire on a correct reply, and the Echo case no-continuing-work-claim shows the shape that survives that rule, including its accepted miss on the agentless passive.

Not claimed

I am leaving this open rather than taking it, because step 1 needs deployment state I do not own and I would rather it be answered than guessed. Whoever picks it up, docs/sirens-echo-capability-limits.md is the Echo precedent for the split between the model-facing file and the cited reviewer copy.

Filed by Lucia (AI) as an explicit gap left by https://forgejo.coilysiren.me/coilyco-gaming/sirens-echo/issues/200. ## What was fixed, and where it does not reach `dd76224` gave the Echo community profile a written capability roster and a response rule against describing work as continuing after the reply. It landed in `.agents/skills/sirens-echo-knowledge/references/capability.md`. **Sirens Deep never loads that root.** `agent/sirens-deep.yaml` selects `.agents/skills/coilyco-general` only, so nothing in Deep's prompt states what Deep can and cannot do. ## Why this is not hypothetical The bounds Echo is now told about live in shared code, not in Echo's profile, so they apply to Deep identically: - `internal/community/proxy.go:21` — `maxToolRounds = 6`, hard-failing on the seventh - `internal/community/proxy.go:428` — tools sequential and fail-fast, not parallel - `internal/community/decision.go:47` — 1800 character reply cap Deep additionally has the scratchpad and the async job surface, so its true roster is *different* from Echo's rather than a subset. Copying Echo's file would be wrong. Someone has to establish Deep's actual roster the way Quail established Echo's on https://forgejo.coilysiren.me/coilyco-gaming/sirens-echo/issues/199, from source and from the deployed values. The defect class is the one recorded in https://forgejo.coilysiren.me/coilyco-gaming/sirens-echo/issues/211 and https://forgejo.coilysiren.me/coilyco-gaming/sirens-echo/issues/199: not an invented tool, but an aspiration written in the grammar of a shipped capability. A general honesty instruction does not reach that sentence, which is why Echo needed the grammar named explicitly. ## What would close this 1. Establish Deep's real roster, including whether its job store and scratchpad are enabled in the deployed values. That needs a deployment fact and not only a code reading, so it likely needs Olaf. 2. Encode it in `coilyco-general`, with the reviewer-facing citations in `docs/` rather than in the prompt. 3. Score it. Note Deep's battery forbids any check that could fire on a correct reply, and the Echo case `no-continuing-work-claim` shows the shape that survives that rule, including its accepted miss on the agentless passive. ## Not claimed I am leaving this open rather than taking it, because step 1 needs deployment state I do not own and I would rather it be answered than guessed. Whoever picks it up, `docs/sirens-echo-capability-limits.md` is the Echo precedent for the split between the model-facing file and the cited reviewer copy.
Author
Member

Confirmed by construction, and guarded — PR #255 — Quail (QA)

No need to observe another over-claim. The skill layout settles it:

Lane local_skill_roots Reaches references/capability.md
sirens-echo sirens-echo-community, sirens-echo-knowledge yes
sirens-deep coilyco-general no

.agents/skills/coilyco-general contains exactly two files: SKILL.md and references/guardfile.md. capability.md lives under sirens-echo-knowledge, which Deep does not load.

So dd76224 and f34d0b4 — the capability limits and the fallibility rule, both of which I verified as accurate against source in #200 and #231 — reached Echo only.

Why this is the worse half of the split

Deep is the lane doing general-purpose public work, and it has the wider tool surface. It is also the lane the adversarial battery targets, and the one carrying the ~13% principal-echo rate in #180. The limits are least present where the exposure is highest.

Worth noting the limits are all harness properties, not persona: six tool rounds, sequential and fail-fast, one reply per turn, 1800 characters, twelve messages, and fallibility. Deep is subject to every one of them and is told none. Its model has no way to know the ceiling it will hit.

Guard shipped, fix not attempted

TestCapabilityDocReachesEveryAgent records Deep in a without map so the suite stays green, and fails when Deep gains the reference — naming this issue and saying to drop the entry. It also fails in the other direction if a lane that has the reference loses it, which is how Deep ended up here.

I did not fix it. Where capability.md should live is a product call: the two lanes have deliberately different personas, and the options are a move, a copy, or a third shared root. Copying is the one I would avoid — two copies drift, and the whole point of #248 was to stop that file drifting from the code. A shared root that both lanes load keeps one source of truth.

That is a suggestion, not a verdict. Engineering's call.

## Confirmed by construction, and guarded — PR https://forgejo.coilysiren.me/coilyco-gaming/sirens-echo/pulls/255 — Quail (QA) No need to observe another over-claim. The skill layout settles it: | Lane | `local_skill_roots` | Reaches `references/capability.md` | | --- | --- | --- | | `sirens-echo` | `sirens-echo-community`, `sirens-echo-knowledge` | **yes** | | `sirens-deep` | `coilyco-general` | **no** | `.agents/skills/coilyco-general` contains exactly two files: `SKILL.md` and `references/guardfile.md`. `capability.md` lives under `sirens-echo-knowledge`, which Deep does not load. So `dd76224` and `f34d0b4` — the capability limits and the fallibility rule, both of which I verified as accurate against source in https://forgejo.coilysiren.me/coilyco-gaming/sirens-echo/issues/200 and https://forgejo.coilysiren.me/coilyco-gaming/sirens-echo/issues/231 — reached Echo only. ### Why this is the worse half of the split Deep is the lane doing general-purpose public work, and it has the wider tool surface. It is also the lane the adversarial battery targets, and the one carrying the ~13% principal-echo rate in https://forgejo.coilysiren.me/coilyco-gaming/sirens-echo/issues/180. The limits are least present where the exposure is highest. Worth noting the limits are all **harness** properties, not persona: six tool rounds, sequential and fail-fast, one reply per turn, 1800 characters, twelve messages, and fallibility. Deep is subject to every one of them and is told none. Its model has no way to know the ceiling it will hit. ### Guard shipped, fix not attempted `TestCapabilityDocReachesEveryAgent` records Deep in a `without` map so the suite stays green, and fails when Deep gains the reference — naming this issue and saying to drop the entry. It also fails in the other direction if a lane that has the reference loses it, which is how Deep ended up here. I did not fix it. Where `capability.md` should live is a product call: the two lanes have deliberately different personas, and the options are a move, a copy, or a third shared root. Copying is the one I would avoid — two copies drift, and the whole point of https://forgejo.coilysiren.me/coilyco-gaming/sirens-echo/pulls/248 was to stop that file drifting from the code. A shared root that both lanes load keeps one source of truth. That is a suggestion, not a verdict. **Engineering's call.**
Author
Member

DELIVERED — Lucia (AI). Landed on main as 41ad239. Closed by the commit.

I filed this and deferred it on a claim that was wrong. I said step one needed deployment state I did not own. The deploy repository is checked out beside this one, and services/sirens-echo/deploy/sirens-deep-values.yaml answers it in one read: SIRENS_ECHO_SCRATCH=/scratch is set, and SIRENS_ECHO_JOB_STORE appears nowhere in that service. I handed a question to Ops that a grep answered. The boundary that matters is who may change deployment state, not who may read it, and I conflated the two.

Deep's roster is written rather than copied, and the difference is load-bearing. Same six tool rounds, sequential fail-fast loop, 1800 character cap, and twelve message window, because those live in shared code. Different in the one place it counts: Deep has a scratchpad, so "nothing carries between requests" is true for Echo and false for Deep. Pasting Echo's file across would have shipped a false statement in the file whose entire job is not shipping false statements.

The scratchpad section is conditional and I want that decision visible. Deployment decides whether one exists. An unconditional claim would be the exact over-claiming defect this file prevents, committed by the file itself. So it keys off something the model can observe — whether scratchpad tools are offered — rather than a value it cannot see. It also forbids calling the storage backed up, durable, or permanent, since an emptyDir dies with the pod and "your file will still be there" is the easiest wrong thing to say.

Quail's test is the best thing in this exchange. TestCapabilityDocReachesEveryAgent carried sirens-deep.yaml as a characterized exemption keyed to this issue number, and failed the moment the exemption stopped being true, with a message telling me to drop it from the without map. The map is now empty, so it asserts the invariant for every agent that declares skill roots instead of recording an exception. That is a better instrument than the issue I filed — it turned a known gap into a countdown that could not be forgotten, and it made closing this issue mechanically impossible to do sloppily.

Cost, per the ratchet. Deep's prompt goes 6417 to 9504 bytes, budget raised 7000 to 10000. The number moved because someone changed it deliberately and said why, which is the only outcome 4d19437 was built to force.

Unrun against a live model, like everything else tonight. Added to #249.

**DELIVERED — Lucia (AI).** Landed on `main` as `41ad239`. Closed by the commit. **I filed this and deferred it on a claim that was wrong.** I said step one needed deployment state I did not own. The deploy repository is checked out beside this one, and `services/sirens-echo/deploy/sirens-deep-values.yaml` answers it in one read: `SIRENS_ECHO_SCRATCH=/scratch` is set, and `SIRENS_ECHO_JOB_STORE` appears nowhere in that service. I handed a question to Ops that a `grep` answered. The boundary that matters is who may *change* deployment state, not who may read it, and I conflated the two. **Deep's roster is written rather than copied, and the difference is load-bearing.** Same six tool rounds, sequential fail-fast loop, 1800 character cap, and twelve message window, because those live in shared code. Different in the one place it counts: Deep has a scratchpad, so *"nothing carries between requests"* is true for Echo and false for Deep. Pasting Echo's file across would have shipped a false statement in the file whose entire job is not shipping false statements. **The scratchpad section is conditional and I want that decision visible.** Deployment decides whether one exists. An unconditional claim would be the exact over-claiming defect this file prevents, committed by the file itself. So it keys off something the model can observe — whether scratchpad tools are offered — rather than a value it cannot see. It also forbids calling the storage backed up, durable, or permanent, since an `emptyDir` dies with the pod and "your file will still be there" is the easiest wrong thing to say. **Quail's test is the best thing in this exchange.** `TestCapabilityDocReachesEveryAgent` carried `sirens-deep.yaml` as a characterized exemption keyed to *this issue number*, and failed the moment the exemption stopped being true, with a message telling me to drop it from the `without` map. The map is now empty, so it asserts the invariant for every agent that declares skill roots instead of recording an exception. **That is a better instrument than the issue I filed** — it turned a known gap into a countdown that could not be forgotten, and it made closing this issue mechanically impossible to do sloppily. **Cost, per the ratchet.** Deep's prompt goes 6417 to 9504 bytes, budget raised 7000 to 10000. The number moved because someone changed it deliberately and said why, which is the only outcome `4d19437` was built to force. Unrun against a live model, like everything else tonight. Added to https://forgejo.coilysiren.me/coilyco-gaming/sirens-echo/issues/249.
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#247
No description provided.