fix(prompts): the clock is bearings, not a line [spec 04] - #201
Merged
Conversation
The talk and reply prompts rendered the clock bare ("It's Monday
2026-08-31, 2:28 pm.") with no word on what it was for, so the host read
the date and minute out on every beat. It now arrives with its usage:
bearings, mentioned only when the hour or day lands in what is already
being said, never as an opener or a time-check. Same source line for the
talk builders and the reply status block.
The profile block also injected the fading ledger's [seen YYYY-MM-DD] /
[stable] tags verbatim, which the host read as content ("you told me on
the 31st"). They are stripped at injection; the file keeps them, and the
recall block's dates stay — those are deliberate.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_018KVNGUoCkDfWFdLwkGWsAi
This was referenced Sep 3, 2026
wine-fall
added a commit
that referenced
this pull request
Sep 4, 2026
"Say real things" shipped: the off-loop topic pool, weighted by the listener's spoken language and their timezone, landed via #201 and #203. The file's own rule is that a delivered line is deleted rather than archived, so the row and its section go, and spec 13 becomes the record — its two pointers into the deleted section are retargeted at itself. What survives the line is tracked elsewhere: #202 joins the by-ear list, and #44 closes on that issue's first box. Line 0's other half is resolved too, though not the way the file predicted. It called for the parallel clock and grounding work to be reconciled into one change; what actually happened is that #165 landed the grounding, #191 then landed only the weekday-and-date half of #162, and the play-progress half was deliberately dropped because the look-ahead makes a countdown false by the time it airs. Recorded as a decision, not a merge, so nobody re-proposes the progress fields. What is left of line 0 is the dropped first line, unchanged. Two cross-references pointed at the deleted line. #98's eval track is the sharper of them: line 2 shipped a prompt whose whole job is stochastic, and the only thing that caught its first draft getting that wrong was a person reading a dev log — so the eval is overdue, not upcoming. Claude-Session: https://claude.ai/code/session_018KVNGUoCkDfWFdLwkGWsAi Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Relates to specs/spec04/04-no-dead-air.md §3.4 (the scene / clock cue) — a bugfix on the prompt rendering; the spec is not changed.
What
The clock is bearings, not a line.
sceneLinerenderedformatClock's "Monday 2026-08-31, 2:28 pm" bare, with no word on what it was for, while the scene cue right beside it came with guidance. The model did the obvious thing and read the date and minute out on every beat (by-ear: deliberate, stiff). The clock now arrives with its usage — mention the hour or day only when it lands in what is already being said, or when the listener asks outright; never as an announcement, a time-check, or an opener. One source line serves both talk builders and the reply path's status block.Profile bookkeeping stays in the file.
profileBlockinjectedprofile.mdverbatim,[seen YYYY-MM-DD]/[stable]tags included (spec 05-01 §3.3's fading ledger), and nothing told the model these were bookkeeping.MEMORY_GROUNDINGguards against invented dates, not real ones read out. The trailing tag sequence is stripped at injection;fadeFactsreads the file and is untouched; the recall block's dates are deliberate and stay.Tests
test/prompts.test.ts: the clock line carries its usage on every path that shows it (talk, batched talk, reply); the profile block has no tags on all three paths; tag-shaped text inside a fact is left alone.Peer review
Peer review (codex gpt-5.6-sol): 3 findings, 3 applied, 0 dismissed — the reply path now allows a listener asking the time outright; tag stripping is anchored to the line end; comments state the invariant, not the history.
By-ear
Owed, folded into the spec-13 by-ear issue opened by the next PR: the host stops reciting the date, and answers "what time is it" when asked.
AI coding brief
Original request: two sequential PRs from a finished design; this is the first — a bugfix tagged spec 04, no spec change. The why: the listener heard the date read out on every beat and profile dates surfacing as content.
Manual interventions: none in this session; the design was pinned in the dispatching session (usage text, strip-at-injection, recall dates untouched).
Retro: the brief named the exact lines and the two seams, which made the fix a two-function change. The codex round caught the "listener asks the time" hole the brief did not name — worth stating the reply-path exception up front next time.
🤖 Generated with Claude Code
https://claude.ai/code/session_018KVNGUoCkDfWFdLwkGWsAi