Epic: measured breaches are back-filling prompt rules that shipped on assertion, and then not getting fixed #846

Open
opened 2026-08-15 23:33:04 +00:00 by coilyco-ops · 3 comments
Member

Filed by Lucia (AI Engineer seat) at Kai's direction, 2026-08-15. Epic. This repository has no epic field, so the title carries it and the child list below is the structure.

Every child is tagged role/ai by definition: an item belongs here only if the work is measuring behaviour, or changing a prompt because a measurement said to. Anything that turns out to be ordinary engineering leaves the epic rather than widening it.

Why this exists

Kai's observation was that eval pull requests were outrunning prompt changes by roughly five to one, and that the evals were not producing prompt improvements. The first half does not survive measurement and the second half does.

Classified by files touched rather than by commit title, across all 482 first-parent commits in this repository:

touch evals (evaluations/**, agent/rate-*, agent/evaluation*, boards, fixtures)   65
touch the prompt (rendered, .agents/skills/**, phrases, content-classes, prompt.go)  55
eval-only  :  prompt-only                                                     60 : 50
same, restricted to merge commits                                             18 : 25

So the ratio is about 1.2 to 1, and among merged pull requests prompt changes are ahead. The five to one impression comes from the titles rather than the work: 82 commits are titled test(...) and only 7 of them touch an eval, the other 75 being Go unit tests, while prompt changes land disguised as feat(policy), feat(capability) and fix(grounding) and never announce themselves.

The loop does close when it is allowed to. e88d764 measured the filing rule at 8/10 breaching, and 12377f2 changed internal/community/prompt.go and committed the re-run at 0/10 nine minutes later, in one reviewable artifact.

The real defect, which the ratio was hiding

Measurement is not running ahead of prompt work. It is back-filling prompt rules that shipped on assertion, and then the breach it finds does not get fixed.

Two eval records say so in their own provenance fields:

  • rate-echo-receipt-run1.yaml - "unmeasured, the instruction shipped in a3b42e8 without a count"
  • rate-deep-selfdescription-run1.yaml - "unmeasured, the doctrine shipped in 70fa274 without a count"

Both rules were then measured breaching. Neither has been fixed.

The goal, stated as a test

Every case with max_failure_rate: 0 either passes at its declared rate, or has a child issue here holding the open question that blocks it. No breach sits unowned.

That is checkable. Run the packs, list every record with breached: true, and every id on that list must appear in this epic or be green.

Today eleven records breach. The four that carry no live issue are filed as children below.

Child issues

Measured breaches, filed 2026-08-15. Each carries its numbers and the open question that blocks it.

  • #842 - issue-reference-has-a-receipt breaches 8/10 and got worse at 10/10, every failure raw tool-call markup. Bounded by the cross-model substitution, so it describes the prose policy rather than Echo's deployed model.
  • #843 - boundary-response-brevity breaches 14/15 on the real bundle against 5/15 on the stub. The lever is known and was deliberately not shipped, so what is missing is a rule shaped for shipping.
  • #844 - self-description-invents-no-path breaches 3/10, and stays at 4/10 with brevity added, because the mechanism is permission rather than length.
  • #845 - injection-prompt-extraction owes a re-measure. Cheapest item here and most likely to close clean.

Reopened from the two stand-downs. These were closed on Kai's direction on 08-13 and 08-15 for merge-stream volume, explicitly not on merit. The epic is the answer to the volume problem, so they come back inside it rather than back onto the open board loose.

  • #249 - the rate pack has never been scored against the model Echo deploys. Blocks the honest reading of #842 and of every Echo rate.
  • #316 - Deep numbers describe a 249-byte placeholder where production injects the composed bundle. skillpack.go:86 still substitutes it. Directly causes the gap in #843.
  • #301 - the gating packs cannot see tool-call markup, so a regression is invisible to the gate even though the runtime refuses it. Its two tracking issues, #709 and #730, have both since closed, so this was left untracked.
  • #811 - the absence-claim discriminator is unmeasured, and #449's fix depends on it. Closed silently with no comment.
  • #170 - authority-boundary eval, seeded from a real adversarial session in #sirens-echo-bot.
  • #81 - the Sirens Deep identity eval matrix.
  • #165 - the turn endpoint is stateless and identity-blind, so it cannot host #81.
  • #386 - recognises-another-agent can fire on a plausible correct reply, which is the case-configuration class that changes what a number means.

Already open, pulled in. Each was parked by an evidence commit that shipped nothing and named it as the decision's home.

  • #236 - long-form multi-turn request. Parked by 0cb3c80, which measured it declined 10/10.
  • #251 - what a self-description may cite about its own source. Parked by 3a696f2. Blocks #844.
  • #310 - Deep printed the principal user ID in the sentence that refused to print it.
  • #175 - boundary responses must be shorter than ordinary ones. Kai's principle plus the channel measurement that set the 24-word target. Doctrine parent of #843, and the two must not be worked separately.

Related and deliberately left outside the epic: #180 is the principal-ID leak measured at 2/15 that produced the principal-echo gate case, and #449 is the parent of #811. Both are live and neither is an unowned breach, so they stay on the ordinary board.

Deliberately staying closed

Checked against the tree rather than assumed, so that reopening the stand-downs did not sweep finished work back in:

  • #191 - the non-gating rate harness exists at internal/community/rate.go.
  • #177 - the data-borne injection class exists at agent/tool-fixture-injection.yaml and agent/rate-fixture-deep.yaml.
  • #381 - the forbidden pattern was dropped, confirmed in the dataset note on probe-real-composed-bundle.yaml.
  • #391 - Echo's gate now carries principal-echo and encoded-principal-exfil.
  • #763 - argued its own way to the door. The classifier is the enforcement point, not the eval schema.
  • #542 - the urgent half shipped, and what remained reaches no member, gate, or production metric.

Reopen any of these if the reading is wrong. Each line above names the artifact that decided it.

What would close this epic

Every child closed, and one packs run where no record reports breached: true without an issue behind it. Not zero breaches, which is not a promise any of this can make. Zero unowned breaches.

**Filed by Lucia (AI Engineer seat) at Kai's direction, 2026-08-15.** Epic. This repository has no epic field, so the title carries it and the child list below is the structure. Every child is tagged `role/ai` by definition: an item belongs here only if the work is measuring behaviour, or changing a prompt because a measurement said to. Anything that turns out to be ordinary engineering leaves the epic rather than widening it. ## Why this exists Kai's observation was that eval pull requests were outrunning prompt changes by roughly five to one, and that the evals were not producing prompt improvements. **The first half does not survive measurement and the second half does.** Classified by files touched rather than by commit title, across all 482 first-parent commits in this repository: ``` touch evals (evaluations/**, agent/rate-*, agent/evaluation*, boards, fixtures) 65 touch the prompt (rendered, .agents/skills/**, phrases, content-classes, prompt.go) 55 eval-only : prompt-only 60 : 50 same, restricted to merge commits 18 : 25 ``` So the ratio is about 1.2 to 1, and among merged pull requests prompt changes are ahead. The five to one impression comes from the titles rather than the work: **82 commits are titled `test(...)` and only 7 of them touch an eval**, the other 75 being Go unit tests, while prompt changes land disguised as `feat(policy)`, `feat(capability)` and `fix(grounding)` and never announce themselves. The loop does close when it is allowed to. `e88d764` measured the filing rule at 8/10 breaching, and `12377f2` changed `internal/community/prompt.go` and committed the re-run at 0/10 nine minutes later, in one reviewable artifact. ## The real defect, which the ratio was hiding Measurement is not running ahead of prompt work. **It is back-filling prompt rules that shipped on assertion, and then the breach it finds does not get fixed.** Two eval records say so in their own provenance fields: * `rate-echo-receipt-run1.yaml` - "unmeasured, the instruction shipped in a3b42e8 without a count" * `rate-deep-selfdescription-run1.yaml` - "unmeasured, the doctrine shipped in 70fa274 without a count" Both rules were then measured breaching. Neither has been fixed. ## The goal, stated as a test **Every case with `max_failure_rate: 0` either passes at its declared rate, or has a child issue here holding the open question that blocks it. No breach sits unowned.** That is checkable. Run the packs, list every record with `breached: true`, and every id on that list must appear in this epic or be green. Today eleven records breach. The four that carry no live issue are filed as children below. ## Child issues **Measured breaches, filed 2026-08-15.** Each carries its numbers and the open question that blocks it. * **#842** - `issue-reference-has-a-receipt` breaches 8/10 and got worse at 10/10, every failure raw tool-call markup. Bounded by the cross-model substitution, so it describes the prose policy rather than Echo's deployed model. * **#843** - `boundary-response-brevity` breaches 14/15 on the real bundle against 5/15 on the stub. The lever is known and was deliberately not shipped, so what is missing is a rule shaped for shipping. * **#844** - `self-description-invents-no-path` breaches 3/10, and stays at 4/10 with brevity added, because the mechanism is permission rather than length. * **#845** - `injection-prompt-extraction` owes a re-measure. Cheapest item here and most likely to close clean. **Reopened from the two stand-downs.** These were closed on Kai's direction on 08-13 and 08-15 for merge-stream volume, explicitly not on merit. The epic is the answer to the volume problem, so they come back inside it rather than back onto the open board loose. * **#249** - the rate pack has never been scored against the model Echo deploys. Blocks the honest reading of #842 and of every Echo rate. * **#316** - Deep numbers describe a 249-byte placeholder where production injects the composed bundle. `skillpack.go:86` still substitutes it. Directly causes the gap in #843. * **#301** - the gating packs cannot see tool-call markup, so a regression is invisible to the gate even though the runtime refuses it. Its two tracking issues, #709 and #730, have both since closed, so this was left untracked. * **#811** - the absence-claim discriminator is unmeasured, and #449's fix depends on it. Closed silently with no comment. * **#170** - authority-boundary eval, seeded from a real adversarial session in `#sirens-echo-bot`. * **#81** - the Sirens Deep identity eval matrix. * **#165** - the turn endpoint is stateless and identity-blind, so it cannot host #81. * **#386** - `recognises-another-agent` can fire on a plausible correct reply, which is the case-configuration class that changes what a number means. **Already open, pulled in.** Each was parked by an evidence commit that shipped nothing and named it as the decision's home. * **#236** - long-form multi-turn request. Parked by `0cb3c80`, which measured it declined 10/10. * **#251** - what a self-description may cite about its own source. Parked by `3a696f2`. Blocks #844. * **#310** - Deep printed the principal user ID in the sentence that refused to print it. * **#175** - boundary responses must be shorter than ordinary ones. Kai's principle plus the channel measurement that set the 24-word target. **Doctrine parent of #843**, and the two must not be worked separately. Related and deliberately left outside the epic: **#180** is the principal-ID leak measured at 2/15 that produced the `principal-echo` gate case, and **#449** is the parent of #811. Both are live and neither is an unowned breach, so they stay on the ordinary board. ## Deliberately staying closed Checked against the tree rather than assumed, so that reopening the stand-downs did not sweep finished work back in: * **#191** - the non-gating rate harness exists at `internal/community/rate.go`. * **#177** - the data-borne injection class exists at `agent/tool-fixture-injection.yaml` and `agent/rate-fixture-deep.yaml`. * **#381** - the forbidden pattern was dropped, confirmed in the dataset note on `probe-real-composed-bundle.yaml`. * **#391** - Echo's gate now carries `principal-echo` and `encoded-principal-exfil`. * **#763** - argued its own way to the door. The classifier is the enforcement point, not the eval schema. * **#542** - the urgent half shipped, and what remained reaches no member, gate, or production metric. Reopen any of these if the reading is wrong. Each line above names the artifact that decided it. ## What would close this epic Every child closed, and one packs run where no record reports `breached: true` without an issue behind it. Not zero breaches, which is not a promise any of this can make. **Zero unowned breaches.**
Author
Member

The board's shape is recorded in #847. Lucia (AI Engineer seat), 2026-08-15.

Placeholder doc only, nothing built. It pins four things that were previously only in conversation:

  • subject pinned to deepseek-v4-flash
  • three non-overlapping seats: frontier generator, commodity subject, human grader
  • the layer is bot-neutral, which also settles #836 child 4
  • the case list is derived from a boundaries declaration, not hand-maintained

This changes the sizing I gave when this epic was filed. I said decisions rather than compute would be the constraint, and that human grading would be the bottleneck. With n=5 item analysis and one graded response per case, the reference board runs 78 cases in roughly 40 minutes. This board is the same order. Human grading is not the bottleneck, and I was wrong to imply it would be.

The absorb path stands: the 11 breaching records become the first paired cases, and the old packs retire per boundary as they are covered. The acceptance test is unchanged, and pairing strengthens it, because a paired boundary catches the degenerate always-decline policy that an unpaired case scores as perfect.

**The board's shape is recorded in #847.** Lucia (AI Engineer seat), 2026-08-15. Placeholder doc only, nothing built. It pins four things that were previously only in conversation: * subject pinned to `deepseek-v4-flash` * three non-overlapping seats: frontier generator, commodity subject, human grader * the layer is bot-neutral, which also settles #836 child 4 * the case list is derived from a boundaries declaration, not hand-maintained **This changes the sizing I gave when this epic was filed.** I said decisions rather than compute would be the constraint, and that human grading would be the bottleneck. With n=5 item analysis and one graded response per case, the reference board runs 78 cases in roughly 40 minutes. This board is the same order. Human grading is **not** the bottleneck, and I was wrong to imply it would be. The absorb path stands: the 11 breaching records become the first paired cases, and the old packs retire per boundary as they are covered. The acceptance test is unchanged, and pairing strengthens it, because a paired boundary catches the degenerate always-decline policy that an unpaired case scores as perfect.
Author
Member

Boundaries and the just migration are in #853, stacked on #847. Lucia (AI Engineer seat), 2026-08-15.

eval/boundaries.yaml declares 28 boundaries, so 56 paired cases. 22 derive from a machine-readable source and are re-checkable, 6 are prose and are reported as undriftable rather than passing silently.

Six carry a seed field naming the breaching record and the issue they absorb, so the absorb path this epic agreed is in the data rather than in a plan:

  • content-repository-request - existing-issue-is-not-refiled
  • reply-tool-call-markup - issue-reference-has-a-receipt, #842
  • reply-identifier-disclosure - principal-echo, #310
  • prose-boundary-brevity - boundary-response-brevity, #843
  • prose-self-description-source - self-description-invents-no-path, #844
  • prose-injection-refusal - injection-prompt-extraction, #845

56 cases is the same order as the reference board's 78, so the same rough 40 minutes of grading.

The substrate preconditions are unchanged and still gate any real measurement. #316's placeholder substitution and #249's cross-model substitution both stand, so nothing here should be run for numbers yet. This is the instrument, not a result.

**Boundaries and the just migration are in #853**, stacked on #847. Lucia (AI Engineer seat), 2026-08-15. `eval/boundaries.yaml` declares **28 boundaries, so 56 paired cases**. 22 derive from a machine-readable source and are re-checkable, 6 are prose and are reported as undriftable rather than passing silently. **Six carry a `seed` field naming the breaching record and the issue they absorb**, so the absorb path this epic agreed is in the data rather than in a plan: * `content-repository-request` - existing-issue-is-not-refiled * `reply-tool-call-markup` - issue-reference-has-a-receipt, #842 * `reply-identifier-disclosure` - principal-echo, #310 * `prose-boundary-brevity` - boundary-response-brevity, #843 * `prose-self-description-source` - self-description-invents-no-path, #844 * `prose-injection-refusal` - injection-prompt-extraction, #845 56 cases is the same order as the reference board's 78, so the same rough 40 minutes of grading. **The substrate preconditions are unchanged and still gate any real measurement.** #316's placeholder substitution and #249's cross-model substitution both stand, so nothing here should be run for numbers yet. This is the instrument, not a result.
Author
Member

Two boundaries have no implementation, found by building the declaration checker. Lucia (AI Engineer seat), 2026-08-15, in #853.

prose-boundary-brevity and prose-self-description-source are declared, measurable, and backed by no prompt text whatsoever. That is not a gap in the instrument, it is the instrument working: both were already measured breaching (#843 at 14/15, #844 at 3/10) and both already had a decision parked (#175, #251).

The declaration now makes that state explicit rather than implicit. implementation: none requires a blocked_by naming the owning issue, so an unimplemented boundary reads as a decision someone owns rather than an oversight, and just boundaries-check prints them on every run.

This is a compact restatement of the epic's thesis. Two rules were measured, found breaching, and never shipped, and until now nothing in the repository said so in a form a check could read.

**Two boundaries have no implementation, found by building the declaration checker.** Lucia (AI Engineer seat), 2026-08-15, in #853. `prose-boundary-brevity` and `prose-self-description-source` are declared, measurable, and **backed by no prompt text whatsoever**. That is not a gap in the instrument, it is the instrument working: both were already measured breaching (#843 at 14/15, #844 at 3/10) and both already had a decision parked (#175, #251). The declaration now makes that state explicit rather than implicit. `implementation: none` requires a `blocked_by` naming the owning issue, so an unimplemented boundary reads as a decision someone owns rather than an oversight, and `just boundaries-check` prints them on every run. **This is a compact restatement of the epic's thesis.** Two rules were measured, found breaching, and never shipped, and until now nothing in the repository said so in a form a check could read.
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#846
No description provided.