The canonical phrase registry, tracked in git and invoked by key #408

Closed
opened 2026-08-13 12:10:30 +00:00 by coilyco-ops · 0 comments
Member

Slice of #176, which Kai approved and Delphi recorded at 07:06Z as "build it. This is the real fix."

Scope

agent/phrases.yaml holds canonical phrases. The model writes {{phrase:no-tool}} and the harness renders the tracked text in the blockquote-code form it already uses.

What the registry enforces, and why each rule exists

A phrase must survive the notice alphabet unchanged, checked at load rather than at reply time. A phrase that says one thing in git and another in the channel is worse than no registry.

Keys are lowercase and hyphenated, so they never need quoting and never look like prose.

Duplicates are refused. A shadowed phrase is one nobody can find by reading the file.

An unknown key is an error, not a rendered marker. {{phrase:typo}} reaching a member is worse than a failed turn: the failure is recoverable through the repair loop and the leaked marker is not recoverable once it is on screen.

Out of scope

Making the model use a key. Whether the keys exist and render correctly is separable from whether the model reaches for them, and the second is where the prompt still has a job. Shipping the registry first means the prompt half can be measured against something real.

Acceptance

  • The tracked registry loads, and every phrase in it renders inside the notice shape unaltered.
  • A key renders; an unknown key fails and names itself.
  • A reply with no invocation is byte-identical.
  • policy-check verifies the registry, so it cannot become another declared-but-unread artifact.
**Slice of** https://forgejo.coilysiren.me/coilyco-gaming/sirens-echo/issues/176, which Kai approved and Delphi recorded at 07:06Z as *"build it. This is the real fix."* ## Scope `agent/phrases.yaml` holds canonical phrases. The model writes `{{phrase:no-tool}}` and the harness renders the tracked text in the blockquote-code form it already uses. ## What the registry enforces, and why each rule exists **A phrase must survive the notice alphabet unchanged**, checked at load rather than at reply time. A phrase that says one thing in git and another in the channel is worse than no registry. **Keys are lowercase and hyphenated**, so they never need quoting and never look like prose. **Duplicates are refused.** A shadowed phrase is one nobody can find by reading the file. **An unknown key is an error, not a rendered marker.** `{{phrase:typo}}` reaching a member is worse than a failed turn: the failure is recoverable through the repair loop and the leaked marker is not recoverable once it is on screen. ## Out of scope **Making the model use a key.** Whether the keys exist and render correctly is separable from whether the model reaches for them, and the second is where the prompt still has a job. Shipping the registry first means the prompt half can be measured against something real. ## Acceptance - The tracked registry loads, and every phrase in it renders inside the notice shape unaltered. - A key renders; an unknown key fails and names itself. - A reply with no invocation is byte-identical. - policy-check verifies the registry, so it cannot become another declared-but-unread artifact.
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#408
No description provided.