feat(phrases): render an invocation before anything can emit one #590

Merged
coilyco-ops merged 1 commit from coilyco-ops/render-a-phrase-before-anything-invokes-one into main 2026-08-13 16:39:49 +00:00 AGit
Member

closes #588 render half - the registry was built, CI-validated and never loaded, so RenderPhrases had no callers and a marker would have reached a member verbatim.

closes #588 render half - the registry was built, CI-validated and never loaded, so RenderPhrases had no callers and a marker would have reached a member verbatim.
feat(phrases): render an invocation before anything can emit one
All checks were successful
ci / test (pull_request) Successful in 33s
ci / publish-echo-image (pull_request) Has been skipped
ci / publish-observed (pull_request) Has been skipped
ci / image-build (pull_request) Successful in 21s
61073f0cbf
The phrase registry was fully built and entirely inert. LoadPhraseRegistry had
one caller and it was the build-time policy check. RenderPhrases and Keys had
none at all. Config had no field for it and NewAgent never read one.

So the only thing that substitutes {{phrase:key}} never ran, and the moment
anyone added the prompt half a reply would have reached Discord carrying the
literal marker. That is the raw-markup defect on sirens-echo#301 arriving by a
different door, and the prompt half is the easier half to write.

This lands the render half and deliberately not the prompt half, so the
dangerous ordering is closed off before it can happen:

  no invocation          returned untouched, which is every reply today
  no registry            the turn fails rather than a marker reaching a member
  not the whole reply    refused, per 176: an invocation is terminal
  unknown key            the turn fails
  known key              rendered in the harness form

Nothing tells the model the syntax exists, so none of it fires. The feature
stays off and stops being able to fail open.

Two things I said needed deciding and did not. 176 states the terminal rule
outright, so that was a specification I mistook for a question. And an unknown
key returning an error does satisfy 176's "fail closed to a canned phrase,
never to prose", because on the reply path an error reaches failTurn and the
member gets a harness notice. I had not traced that route before calling it a
contradiction.

The capability line from sirens-echo#539 now reports the registry, since there
is finally something to report about it.

Still open on 588: the prompt half, which changes every turn's system block and
wants the evaluation cadence run against it.

closes #588

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Co-authored-by: Kai Siren <coilysiren@gmail.com>
Co-authored-by: Claude <noreply@anthropic.com>
Sign in to join this conversation.
No reviewers
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!590
No description provided.