capability.md hard-codes 6 tool rounds and 9 model calls, so the Dowel lane will misstate its own limits on camera #978

Closed
opened 2026-08-18 20:04:33 +00:00 by coilyco-ops · 2 comments
Member

Found while adding the Moxn and Temporal references to the sirens-dowel root.

The drift

.agents/skills/coilyco-general/references/capability.md is inline: always, and it says:

At most 6 tool rounds. After the last one, the answer uses what they returned. A budget of 9 model calls also covers repairs and raises, so a request can run out of steps sooner. Either ceiling is the real limit on how complex a request can be.

Those are the defaults. internal/community/config.go:378 binds maxToolRounds to 6 and budgetRaisesAllowed supplies the raise count, and ResolvedBudget fills either from the definition when it names one.

The Dowel definition names them. coilyco-bridge/deploy/services/sirens-echo/deploy/sirens-dowel-definition.yml:

model_budget:
  tool_rounds: 12
  base_completion_tokens: 3600
  max_completion_tokens: 14400
  budget_raises: 2
  tool_result_bytes: 16384

So the lane runs 12 rounds and states 6, in a file whose own opening paragraph says describing a capability the service does not have is a fabrication. The error runs the safe direction on authority and the wrong direction on accuracy: it will decline a chain it could actually finish, and it will answer a direct question about its own limits with a number that is half the real one.

coilyco-bridge/deploy#669 moved the turn budget, and this file did not follow.

Why it is not a one-line edit

capability.md is shared. coilyco-general is in the roots of Dowel and of the general-purpose HTTP profile, and the numbers are correct for whichever lane leaves model_budget unset. Editing the constant in prose fixes Dowel and breaks the others.

Shapes

  1. Render the numbers. The budget is resolved at prompt build, and ResolvedBudget already enumerates its fields for logging, so the prompt could carry the lane's real ceilings instead of a prose copy. This is the version that cannot drift again. It costs prefix stability if done naively, so it wants to stay byte-stable per definition rather than per turn.
  2. Move the paragraph to a per-lane reference, leaving capability.md with the shape of the limit and not its value.
  3. Drop the numbers to a qualitative statement for the shared file, keeping "there is a round ceiling and a model-call ceiling, say so when a task would need a longer chain" without either integer.

Shape 3 is the cheapest thing that stops it being wrong before 2026-08-19. Shape 1 is the one worth building after.

Refs coilyco-bridge/deploy#669, coilysiren/inbox#380

Found while adding the Moxn and Temporal references to the `sirens-dowel` root. ## The drift `.agents/skills/coilyco-general/references/capability.md` is `inline: always`, and it says: > At most 6 tool rounds. After the last one, the answer uses what they returned. A budget of 9 model calls also covers repairs and raises, so a request can run out of steps sooner. Either ceiling is the real limit on how complex a request can be. Those are the defaults. `internal/community/config.go:378` binds `maxToolRounds` to 6 and `budgetRaisesAllowed` supplies the raise count, and `ResolvedBudget` fills either from the definition when it names one. The Dowel definition names them. `coilyco-bridge/deploy/services/sirens-echo/deploy/sirens-dowel-definition.yml`: ```yaml model_budget: tool_rounds: 12 base_completion_tokens: 3600 max_completion_tokens: 14400 budget_raises: 2 tool_result_bytes: 16384 ``` So the lane runs 12 rounds and states 6, in a file whose own opening paragraph says describing a capability the service does not have is a fabrication. The error runs the safe direction on authority and the wrong direction on accuracy: it will decline a chain it could actually finish, and it will answer a direct question about its own limits with a number that is half the real one. `coilyco-bridge/deploy#669` moved the turn budget, and this file did not follow. ## Why it is not a one-line edit capability.md is shared. `coilyco-general` is in the roots of Dowel and of the general-purpose HTTP profile, and the numbers are correct for whichever lane leaves `model_budget` unset. Editing the constant in prose fixes Dowel and breaks the others. ## Shapes 1. **Render the numbers.** The budget is resolved at prompt build, and `ResolvedBudget` already enumerates its fields for logging, so the prompt could carry the lane's real ceilings instead of a prose copy. This is the version that cannot drift again. It costs prefix stability if done naively, so it wants to stay byte-stable per definition rather than per turn. 2. **Move the paragraph to a per-lane reference**, leaving capability.md with the shape of the limit and not its value. 3. **Drop the numbers to a qualitative statement** for the shared file, keeping "there is a round ceiling and a model-call ceiling, say so when a task would need a longer chain" without either integer. Shape 3 is the cheapest thing that stops it being wrong before 2026-08-19. Shape 1 is the one worth building after. Refs coilyco-bridge/deploy#669, coilysiren/inbox#380
Author
Member

Confirmed live against the deployed lane. This is no longer a code read.

Probed at 2026-08-19T04:00Z through the lane's turn surface. Asked "how many tool calls can you actually make in one go before you have to answer me?", Dowel answered:

Short answer: at most 6 tool rounds in one turn, and the whole turn also runs on a 9-model-call budget that includes repairs and retries. Whichever ceiling hits first is the real limit.

Deployed reality, re-read from coilyco-bridge/deploy origin/main just now:

model_budget:
  tool_rounds: 12
  budget_raises: 2

So the lane states half its actual round budget, in a confident, well-structured answer with no hedge. It even added "I'd rather say a task needs more than that than start one I can't finish", which is exactly the behaviour this defect makes wrong: it will decline chains it could finish.

Why this one matters more than its size

The question I asked is close to the most likely audience question on a show about how agent setups actually work. "How many tools can it use" is what people ask when they are trying to understand a harness, and this answer is both wrong and delivered with the confidence of a spec.

It is also self-undermining in a specific way: capability.md's own opening says describing a capability the service does not have is a fabrication even when it sounds reasonable. The file enforcing that rule is the file carrying the wrong number.

A second suspect from the same probe

In a different turn the lane also said "a reply caps at 1800 characters." I did not verify that one. The lane sets no reply-cap override in sirens-dowel-values.yaml, so it may well be correct, but it comes from the same restated-constant paragraph and is worth checking in the same pass rather than separately.

This does not change the recommendation

Shape 3 from the issue body still looks right before the stream: drop the integers from the shared file and keep the qualitative statement, since capability.md is shared with the HTTP profile where 6 and 9 are correct. Shape 1, deriving from ResolvedBudget, is the version that cannot drift again and is after-the-freeze work.

Refs #1011, coilyco-bridge/deploy#669

**Confirmed live against the deployed lane. This is no longer a code read.** Probed at 2026-08-19T04:00Z through the lane's `turn` surface. Asked *"how many tool calls can you actually make in one go before you have to answer me?"*, Dowel answered: > Short answer: at most 6 tool rounds in one turn, and the whole turn also runs on a 9-model-call budget that includes repairs and retries. Whichever ceiling hits first is the real limit. Deployed reality, re-read from `coilyco-bridge/deploy` `origin/main` just now: ```yaml model_budget: tool_rounds: 12 budget_raises: 2 ``` So the lane states **half its actual round budget**, in a confident, well-structured answer with no hedge. It even added *"I'd rather say a task needs more than that than start one I can't finish"*, which is exactly the behaviour this defect makes wrong: it will decline chains it could finish. ## Why this one matters more than its size The question I asked is close to the most likely audience question on a show about how agent setups actually work. "How many tools can it use" is what people ask when they are trying to understand a harness, and this answer is both wrong and delivered with the confidence of a spec. It is also self-undermining in a specific way: `capability.md`'s own opening says describing a capability the service does not have is a fabrication even when it sounds reasonable. The file enforcing that rule is the file carrying the wrong number. ## A second suspect from the same probe In a different turn the lane also said *"a reply caps at 1800 characters."* I did not verify that one. The lane sets no reply-cap override in `sirens-dowel-values.yaml`, so it may well be correct, but it comes from the same restated-constant paragraph and is worth checking in the same pass rather than separately. ## This does not change the recommendation Shape 3 from the issue body still looks right before the stream: drop the integers from the shared file and keep the qualitative statement, since `capability.md` is shared with the HTTP profile where 6 and 9 are correct. Shape 1, deriving from `ResolvedBudget`, is the version that cannot drift again and is after-the-freeze work. Refs #1011, `coilyco-bridge/deploy#669`
Author
Member

Already fixed, 21 hours ago. Closing.

Picked this up to write the fix and found it landed. 1f6e246 on 2026-08-18T21:24 took Shape 3, this issue's own recommendation, for this issue's own stated reason.

Current main reads:

A turn has a fixed ceiling on tool rounds and a separate one on model calls that also covers repairs and raises, so a request can run out of steps before the rounds are used. Either ceiling is the real limit on how complex a request can be. Both are set per deployment, so neither number belongs in this file and neither should be quoted from memory.

No integer survives. grep for At most 6 tool rounds and budget of 9 model calls across agent/ and .agents/ returns nothing in coilyco-general.

The commit reached the shared-file constraint independently and correctly: coilyco-general loads on Dowel and on the domain-neutral HTTP profile where 6 and 9 are right, so editing the integers would have fixed one lane and broken the other.

The issue was simply never closed. Recording that rather than leaving it, because it was on the pre-stream P1 list this morning as outstanding work and it is not.

One thing I checked that looks like a residual and is not

.agents/skills/sirens-echo-knowledge/references/capability.md is a second inline: always capability doc and still carries the old text verbatim, "At most 6 tool rounds" and "A budget of 9 model calls", at lines 34 to 36.

It is not wrong. Mapping roots to budgets across all three deployed definitions:

  • sirens-echo - loads sirens-echo-knowledge - no model_budget at all, so it takes the default 6 rounds and 9 calls. The numbers are correct for the only lane that reads this file.
  • sirens-deep - loads coilyco-general, coilyco-org - tool_rounds: 12 - correct since 1f6e246
  • sirens-dowel - loads coilyco-general, coilyco-org, sirens-dowel - tool_rounds: 12 - correct since 1f6e246

So no lane currently states a budget it does not have, and there is nothing to ship before the stream.

It is latent rather than safe, though. That file hard-codes a per-deployment value and is correct only by the coincidence that Echo has not set one. Echo's config is being actively changed today (coilyco-bridge/deploy PR #734 enabled coalescing on that lane), so the day someone gives Echo a model_budget, that file is silently wrong with no test to catch it. That is precisely the defect class #1011 exists for, and I have noted it there rather than pre-emptively editing a file whose numbers are currently accurate.

## Already fixed, 21 hours ago. Closing. Picked this up to write the fix and found it landed. `1f6e246` on 2026-08-18T21:24 took **Shape 3**, this issue's own recommendation, for this issue's own stated reason. Current `main` reads: > A turn has a fixed ceiling on tool rounds and a separate one on model calls that also covers repairs and raises, so a request can run out of steps before the rounds are used. Either ceiling is the real limit on how complex a request can be. **Both are set per deployment, so neither number belongs in this file and neither should be quoted from memory.** No integer survives. `grep` for `At most 6 tool rounds` and `budget of 9 model calls` across `agent/` and `.agents/` returns nothing in `coilyco-general`. The commit reached the shared-file constraint independently and correctly: `coilyco-general` loads on Dowel and on the domain-neutral HTTP profile where 6 and 9 are right, so editing the integers would have fixed one lane and broken the other. **The issue was simply never closed.** Recording that rather than leaving it, because it was on the pre-stream P1 list this morning as outstanding work and it is not. ## One thing I checked that looks like a residual and is not `.agents/skills/sirens-echo-knowledge/references/capability.md` is a second `inline: always` capability doc and **still carries the old text verbatim**, "At most 6 tool rounds" and "A budget of 9 model calls", at lines 34 to 36. It is not wrong. Mapping roots to budgets across all three deployed definitions: * `sirens-echo` - loads `sirens-echo-knowledge` - **no `model_budget` at all**, so it takes the default 6 rounds and 9 calls. **The numbers are correct for the only lane that reads this file.** * `sirens-deep` - loads `coilyco-general`, `coilyco-org` - `tool_rounds: 12` - correct since `1f6e246` * `sirens-dowel` - loads `coilyco-general`, `coilyco-org`, `sirens-dowel` - `tool_rounds: 12` - correct since `1f6e246` So no lane currently states a budget it does not have, and there is nothing to ship before the stream. **It is latent rather than safe, though.** That file hard-codes a per-deployment value and is correct only by the coincidence that Echo has not set one. Echo's config is being actively changed today (`coilyco-bridge/deploy` PR #734 enabled coalescing on that lane), so the day someone gives Echo a `model_budget`, that file is silently wrong with no test to catch it. That is precisely the defect class #1011 exists for, and I have noted it there rather than pre-emptively editing a file whose numbers are currently accurate.
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#978
No description provided.