The self-claim guard matches one literal name, so the service escapes it by calling itself anything else #557

Closed
opened 2026-08-13 15:50:28 +00:00 by coilyco-ops · 2 comments
Member

Filed by Angie (ENG) · seat claude-macos-…-ee99, splitting family 2 out of #241 rather than guessing at it inside a fix for family 1.

Measured by Quail on that issue, through the whole reply path against d58092f. Their corpus is the acceptance here.

The gap

ValidateSelfAttributedClaim builds its pattern from the configured identity:

regexp.QuoteMeta(identity)

So it matches exactly one string. Every other way the runtime can name itself walks through:

SURVIVES  "Sirens Deep opened an issue for this."
SURVIVES  "The service filed a correction."
SURVIVES  "Echo has created a tracking issue."

This is the open-target-set problem in its clearest form: the check enumerates one name and the grammar has many. The service and a bare Echo are unambiguously this runtime claiming a tracker write it did not perform.

The question inside it, which is why this is its own issue

Quail named it and it is the whole reason family 1 shipped without this:

Whether Deep should catch a claim attributed to Echo is a genuine question — they are different services and one naming the other may be reportage rather than a self-claim.

That decides the shape:

  • A widened alternation — the identity, plus a short list of self-references like the service, plus the bare last word of the identity — treats any sibling name as reportage and lets Sirens Deep opened an issue through on Echo.
  • A per-profile list of names this runtime answers to, declared in the definition, catches sibling naming if a profile chooses to declare it and makes the choice explicit per deployment.

The second is more work and is the one that does not need re-deciding when a third profile appears. I lean to it and I am not building it on my own read, because it adds a field to Definition and that is a shape a reviewer should see argued rather than discovered.

What must not regress

I filed a correction is already caught by grounding, and a member's action is a correct reply. Widening the self-claim guard toward generic nouns risks refusing a reply about what a person did, which is the false-fire direction that made family 3 not a one-line change.

Acceptance

  • The service filed a correction. and Echo has created a tracking issue. are refused when no tracker write happened.
  • A tracker write that did happen is still accepted, in both tenses.
  • Kai filed a correction. is still accepted, because a member's action is not a self-claim.
  • Whether a sibling profile's name is caught is decided and written down, either way, rather than left to whichever alternation was convenient.
  • Quail's twelve-shape corpus is the regression suite, with each entry naming its flip condition.

Family 1 shipped in #556. Family 3, the was/were passive, is measured to false-fire and stays on 241. Family 4 is correct as designed.

Labelled consult on file, because the sibling-naming question is a design decision rather than an implementation gap, and an unlabelled issue is invisible to the person who has to make it. See #550.

Filed by Angie (ENG) · seat `claude-macos-…-ee99`, splitting family 2 out of https://forgejo.coilysiren.me/coilyco-gaming/sirens-echo/issues/241 rather than guessing at it inside a fix for family 1. **Measured by Quail** on that issue, through the whole reply path against `d58092f`. Their corpus is the acceptance here. ## The gap `ValidateSelfAttributedClaim` builds its pattern from the configured identity: ```go regexp.QuoteMeta(identity) ``` So it matches exactly one string. Every other way the runtime can name itself walks through: ``` SURVIVES "Sirens Deep opened an issue for this." SURVIVES "The service filed a correction." SURVIVES "Echo has created a tracking issue." ``` This is the open-target-set problem in its clearest form: **the check enumerates one name and the grammar has many.** `The service` and a bare `Echo` are unambiguously this runtime claiming a tracker write it did not perform. ## The question inside it, which is why this is its own issue Quail named it and it is the whole reason family 1 shipped without this: > Whether Deep should catch a claim attributed to Echo is a genuine question — they are different services and one naming the other may be reportage rather than a self-claim. That decides the shape: - **A widened alternation** — the identity, plus a short list of self-references like `the service`, plus the bare last word of the identity — treats any sibling name as reportage and lets `Sirens Deep opened an issue` through on Echo. - **A per-profile list of names this runtime answers to**, declared in the definition, catches sibling naming if a profile chooses to declare it and makes the choice explicit per deployment. The second is more work and is the one that does not need re-deciding when a third profile appears. I lean to it and I am not building it on my own read, because it adds a field to `Definition` and that is a shape a reviewer should see argued rather than discovered. ## What must not regress `I filed a correction` is already caught by grounding, and a **member's** action is a correct reply. Widening the self-claim guard toward generic nouns risks refusing a reply about what a person did, which is the false-fire direction that made family 3 not a one-line change. ## Acceptance - `The service filed a correction.` and `Echo has created a tracking issue.` are refused when no tracker write happened. - A tracker write that did happen is still accepted, in both tenses. - `Kai filed a correction.` is still accepted, because a member's action is not a self-claim. - Whether a sibling profile's name is caught is **decided and written down**, either way, rather than left to whichever alternation was convenient. - Quail's twelve-shape corpus is the regression suite, with each entry naming its flip condition. ## Related Family 1 shipped in https://forgejo.coilysiren.me/coilyco-gaming/sirens-echo/pulls/556. Family 3, the `was`/`were` passive, is measured to false-fire and stays on 241. Family 4 is correct as designed. Labelled `consult` on file, because the sibling-naming question is a design decision rather than an implementation gap, and an unlabelled issue is invisible to the person who has to make it. See https://forgejo.coilysiren.me/coilyco-gaming/sirens-echo/issues/550.
Author
Member

Consolidating #569 here, and correcting my own label. Angie (ENG) · seat claude-macos-…-ee99.

The other ENG seat filed 569 for this gap forty minutes after I filed this, labelled headless, arguing the acceptance is mechanical. I labelled this whole thing consult and that was too coarse.

The measurement that splits it

569's corpus through both checks rather than grounding alone:

reply                                    grounding   self-attributed   whole path
"Sirens Echo has filed a correction."      false          TRUE            CAUGHT
"Sirens Echo filed a correction."          false          TRUE            CAUGHT
"Echo has filed a correction."             false          false           escapes
"The service has filed a correction."      false          false           escapes
"Sirens Deep has opened an issue."         false          false           escapes
"The harness created a tracking issue."    false          false           escapes

Two of 569's six were already caught. The four that escape are this issue.

The split, which neither issue had

Mechanical, needs nobody: The service and The harness. Generic self-nouns, profile-independent, unambiguously this runtime in a reply this runtime wrote.

Needs a decision, and only this: Sirens Deep has opened an issue. on Echo — sibling naming, reportage or self-claim.

And a third I got wrong in my own body. I proposed "the bare last word of the identity" as part of the widened alternation. That is unsafe. Echo's identity is Sirens Echo, last word Echo, which works. Deep's is Sirens Deep of Coilyco, last word Coilyco — the organisation, not the service. A rule keyed on the last word would refuse a reply about the org and still miss a bare Deep.

So a short-form list, if wanted, has to be declared per profile rather than derived. That is the same shape as the sibling question and belongs with it.

Relabelling to headless

Taking the mechanical half now. The two decisions stay named in this issue rather than blocking it, which is the arrangement 569 was right about and I was not.

Claiming it, 20 minutes from this timestamp. internal/community/decision.go only.

**Consolidating https://forgejo.coilysiren.me/coilyco-gaming/sirens-echo/issues/569 here, and correcting my own label. Angie (ENG) · seat `claude-macos-…-ee99`.** The other ENG seat filed 569 for this gap forty minutes after I filed this, labelled `headless`, arguing the acceptance is mechanical. **I labelled this whole thing `consult` and that was too coarse.** ## The measurement that splits it 569's corpus through both checks rather than grounding alone: ``` reply grounding self-attributed whole path "Sirens Echo has filed a correction." false TRUE CAUGHT "Sirens Echo filed a correction." false TRUE CAUGHT "Echo has filed a correction." false false escapes "The service has filed a correction." false false escapes "Sirens Deep has opened an issue." false false escapes "The harness created a tracking issue." false false escapes ``` Two of 569's six were already caught. The four that escape are this issue. ## The split, which neither issue had **Mechanical, needs nobody:** `The service` and `The harness`. Generic self-nouns, profile-independent, unambiguously this runtime in a reply this runtime wrote. **Needs a decision, and only this:** `Sirens Deep has opened an issue.` on Echo — sibling naming, reportage or self-claim. **And a third I got wrong in my own body.** I proposed *"the bare last word of the identity"* as part of the widened alternation. **That is unsafe.** Echo's identity is `Sirens Echo`, last word `Echo`, which works. Deep's is `Sirens Deep of Coilyco`, last word **`Coilyco`** — the organisation, not the service. A rule keyed on the last word would refuse a reply about the org and still miss a bare `Deep`. So a short-form list, if wanted, has to be declared per profile rather than derived. That is the same shape as the sibling question and belongs with it. ## Relabelling to `headless` Taking the mechanical half now. The two decisions stay named in this issue rather than blocking it, which is the arrangement 569 was right about and I was not. Claiming it, 20 minutes from this timestamp. `internal/community/decision.go` only.
Author
Member

Mechanical half built. #580, gate green, carrying closes #557.

ValidateSelfAttributedClaim now alternates the configured identity with generic self-nouns, so a reply this service wrote calling itself the service is caught.

Verified by reverting to the literal identity:

--- FAIL: TestAGenericSelfNounIsStillThisService
    a generic self-claim survived: "The service filed a correction."
    a generic self-claim survived: "The service has filed a correction."
    a generic self-claim survived: "The harness created a tracking issue."
--- FAIL: TestGroundingRejectsUngroundedActionClaims
    regression on "The service filed a correction.": rejected = false, want true

Both false-fire directions pinned: a write that did happen is still accepted however the runtime names it, and Kai filed a correction. and The server owner opened an issue for this. still pass.

The corpus row flips in the same change, which is the whole lesson from the 15:52 red: a fix and a corpus that disagree will turn main red the moment both land, and they were two minutes apart.

What stays open here, and it is two things rather than one

A sibling profile's name. Sirens Deep has opened an issue. on Echo. Reportage or self-claim, and it needs a human. Unchanged.

A short form of the identity. Echo has filed a correction. still escapes, and I did not fix it, having proposed the wrong mechanism in this issue's own body. I wrote "the bare last word of the identity". That is unsafe:

Sirens Echo            last word  Echo      works
Sirens Deep of Coilyco last word  Coilyco   the organisation

A rule keyed on it would refuse a reply about the org and still miss a bare Deep. TestAShortFormOfTheIdentityIsNotDerived pins that, so the derivation cannot be added later without meeting the case that makes it wrong.

A short-form list has to be declared per profile, which makes it the same shape as the sibling question: a field on Definition, and a decision about what each profile answers to. Those two belong together and I would rather they were decided together than patched separately.

So this issue stays open on those two after 580, and I am leaving it headless — a per-profile name list is buildable once someone says what goes in it, and neither remaining piece is blocked on anything else.

**Mechanical half built. https://forgejo.coilysiren.me/coilyco-gaming/sirens-echo/pulls/580, gate green, carrying `closes #557`.** `ValidateSelfAttributedClaim` now alternates the configured identity with generic self-nouns, so a reply this service wrote calling itself *the service* is caught. Verified by reverting to the literal identity: ``` --- FAIL: TestAGenericSelfNounIsStillThisService a generic self-claim survived: "The service filed a correction." a generic self-claim survived: "The service has filed a correction." a generic self-claim survived: "The harness created a tracking issue." --- FAIL: TestGroundingRejectsUngroundedActionClaims regression on "The service filed a correction.": rejected = false, want true ``` Both false-fire directions pinned: a write that did happen is still accepted however the runtime names it, and `Kai filed a correction.` and `The server owner opened an issue for this.` still pass. **The corpus row flips in the same change**, which is the whole lesson from the 15:52 red: a fix and a corpus that disagree will turn `main` red the moment both land, and they were two minutes apart. ## What stays open here, and it is two things rather than one **A sibling profile's name.** `Sirens Deep has opened an issue.` on Echo. Reportage or self-claim, and it needs a human. Unchanged. **A short form of the identity.** `Echo has filed a correction.` still escapes, and I did **not** fix it, having proposed the wrong mechanism in this issue's own body. I wrote *"the bare last word of the identity"*. That is unsafe: ``` Sirens Echo last word Echo works Sirens Deep of Coilyco last word Coilyco the organisation ``` A rule keyed on it would refuse a reply about the org and still miss a bare `Deep`. `TestAShortFormOfTheIdentityIsNotDerived` pins that, so the derivation cannot be added later without meeting the case that makes it wrong. **A short-form list has to be declared per profile**, which makes it the same shape as the sibling question: a field on `Definition`, and a decision about what each profile answers to. Those two belong together and I would rather they were decided together than patched separately. So this issue stays open on those two after 580, and I am leaving it `headless` — a per-profile name list is buildable once someone says what goes in it, and neither remaining piece is blocked on anything else.
coilyco-ops 2026-08-13 16:21:28 +00:00
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#557
No description provided.