The clock rotates, and only thinking and the clock are terminated #815

Merged
coilysiren merged 1 commit from aos/claude/yt58-clock-rotation into main 2026-08-15 16:41:06 +00:00
Member

Two decisions Kai settled on #370. Both were previously held open deliberately, so this is implementation rather than a taste call.

What it renders

> 🤔 `thinking...`
> 🕐 `still thinking 9 seconds...`
> 🕑 `still thinking 19 seconds...`
> 🕒 `still thinking 29 seconds...`
> 🕓 `still thinking 39 seconds...`

and the other three stages, now bare:

> `reading recent messages`
> `calling a tool`
> `checking the reply`

The clock rotates

if we wanna be real cute, we can rotate through the various clock emojis as the thinking continues

An earlier round correctly treated that as an invitation rather than a spec and shipped one 🕐. Kai has now asked for it, so the twelve faces advance down the column as the lines pile up.

The rotation wraps, which never fires today: maxProgressWaitLines is 12 and there are twelve faces, so a capped turn uses each face exactly once. The modulo is there so the cap and the rotation length can move independently rather than silently coupling. A test pins both facts.

One correction to the record. Quail's note on the issue, and Delphi's summary of it, both say a turn can emit seventeen elapsed lines at the 180 second p99. That is arithmetic from the p99 over the beat, and it does not hold: maxProgressWaitLines bounds the column at twelve and landed in f62ae55, the same commit as the elapsed lines and fourteen minutes before the note. No turn has ever been able to emit seventeen. The number is worth correcting because it was raised as a possible noise problem, and twelve is a third smaller than what was weighed.

Only thinking and the clock are terminated

only thinking and clock get the ...

The ellipsis had been applied to all four stages on the reading that it meant still-happening. That reading is now reversed.

The icon and the ellipsis are separate fields, not one implying the other. It is tempting to derive the ellipsis from "has an icon", since thinking and the clock are exactly the iconned lines today, but they were named in two separate decisions. Deriving it means that the day you name an icon for calling a tool, it silently grows an ellipsis you did not ask for. A test pins that an icon alone does not terminate a line.

What is deliberately unchanged

The three stage icons are still unnamed. reading recent messages, calling a tool, checking the reply render plain. Delphi noted 🔨 already has an approved meaning for tool calls in the reaction vocabulary, so that one has an obvious answer whenever you want it, but you have not named it and I am not picking it.

The brackets stay dropped. still thinking 9 seconds... rather than still thinking... (9 seconds). Restoring them means widening noticeAllowed, which is a decision about the harness/model boundary rather than about formatting, and it is recorded as settled on the issue.

Verified

Three new tests in progresswait_test.go and two in stagenotice_test.go: the hour hand advances across successive lines, the rotation wraps and holds twelve faces, only the clock line inside a non-thinking stage carries the ellipsis, the three bare stages render exactly as shown above, and an icon without a trailing flag does not terminate.

Every existing shape test still passes, including the one asserting no rendered line escapes noticeShape. ward exec gate green.

docs/sirens-echo-progress.md had a stale "what a member sees" block predating both the icon and the elapsed lines; it now shows what actually renders.

History of this branch

It was first cut when main was red, and carried a fix for that as its first commit (#813). #812 landed the same two fixes first, so this branch has been rebased onto current main and that commit dropped. The diff is now the progress change alone.

Two decisions Kai settled on #370. Both were previously held open deliberately, so this is implementation rather than a taste call. ## What it renders ``` > 🤔 `thinking...` > 🕐 `still thinking 9 seconds...` > 🕑 `still thinking 19 seconds...` > 🕒 `still thinking 29 seconds...` > 🕓 `still thinking 39 seconds...` ``` and the other three stages, now bare: ``` > `reading recent messages` > `calling a tool` > `checking the reply` ``` ## The clock rotates > if we wanna be real cute, we can rotate through the various clock emojis as the thinking continues An earlier round correctly treated that as an invitation rather than a spec and shipped one 🕐. Kai has now asked for it, so the twelve faces advance down the column as the lines pile up. The rotation wraps, which never fires today: `maxProgressWaitLines` is 12 and there are twelve faces, so a capped turn uses each face exactly once. The modulo is there so the cap and the rotation length can move independently rather than silently coupling. A test pins both facts. **One correction to the record.** Quail's note on the issue, and Delphi's summary of it, both say a turn can emit seventeen elapsed lines at the 180 second p99. That is arithmetic from the p99 over the beat, and it does not hold: `maxProgressWaitLines` bounds the column at twelve and landed in `f62ae55`, the same commit as the elapsed lines and fourteen minutes before the note. No turn has ever been able to emit seventeen. The number is worth correcting because it was raised as a possible noise problem, and twelve is a third smaller than what was weighed. ## Only thinking and the clock are terminated > only thinking and clock get the `...` The ellipsis had been applied to all four stages on the reading that it meant still-happening. That reading is now reversed. **The icon and the ellipsis are separate fields**, not one implying the other. It is tempting to derive the ellipsis from "has an icon", since thinking and the clock are exactly the iconned lines today, but they were named in two separate decisions. Deriving it means that the day you name an icon for `calling a tool`, it silently grows an ellipsis you did not ask for. A test pins that an icon alone does not terminate a line. ## What is deliberately unchanged **The three stage icons are still unnamed.** `reading recent messages`, `calling a tool`, `checking the reply` render plain. Delphi noted 🔨 already has an approved meaning for tool calls in the reaction vocabulary, so that one has an obvious answer whenever you want it, but you have not named it and I am not picking it. **The brackets stay dropped.** `still thinking 9 seconds...` rather than `still thinking... (9 seconds)`. Restoring them means widening `noticeAllowed`, which is a decision about the harness/model boundary rather than about formatting, and it is recorded as settled on the issue. ## Verified Three new tests in `progresswait_test.go` and two in `stagenotice_test.go`: the hour hand advances across successive lines, the rotation wraps and holds twelve faces, only the clock line inside a non-thinking stage carries the ellipsis, the three bare stages render exactly as shown above, and an icon without a trailing flag does not terminate. Every existing shape test still passes, including the one asserting no rendered line escapes `noticeShape`. `ward exec gate` green. `docs/sirens-echo-progress.md` had a stale "what a member sees" block predating both the icon and the elapsed lines; it now shows what actually renders. ## History of this branch It was first cut when `main` was red, and carried a fix for that as its first commit (#813). #812 landed the same two fixes first, so this branch has been rebased onto current `main` and that commit dropped. The diff is now the progress change alone.
fix(ci): unbreak main, red from two semantic merge collisions
All checks were successful
ci / image-build (pull_request) Successful in 20s
ci / test (pull_request) Successful in 45s
ci / publish-echo-image (pull_request) Has been skipped
ci / publish-observed (pull_request) Has been skipped
e16d134353
`main` at af5816c fails `ward exec gate` on a clean checkout, in two
places, neither of which any single pull request introduced.

`deliverOrReport` took a fourth argument in #803. `replyfailure_test.go`
was written against the three-argument form on a branch cut before that,
so the test package stopped compiling once both landed. `go vet` and
`go test` both fail.

`docs/sirens-echo-delivery-failures.md` was edited by #803 and #807.
Each left it inside the 80-line cap on its own base and the merge of
both put it at 81, so documentation-layout fails. One paragraph is
reflowed from four lines to three, with no meaning dropped.

Both are the shape #788 described: a branch is green against the base it
was cut from, and nothing re-checks it against the base it lands on.

Co-authored-by: Kai Siren <coilysiren@gmail.com>
Co-authored-by: Claude <noreply@anthropic.com>
feat(progress): rotate the clock, and terminate only thinking and the clock
All checks were successful
ci / image-build (pull_request) Successful in 29s
ci / test (pull_request) Successful in 45s
ci / publish-echo-image (pull_request) Has been skipped
ci / publish-observed (pull_request) Has been skipped
c1ea1087ec
Two decisions Kai settled on #370 after the earlier rounds shipped what
was specified and left the rest.

The clock rotates. "if we wanna be real cute" was correctly treated as
an invitation rather than a spec, and one 🕐 shipped. Kai has now asked
for it, so the twelve clock faces advance down the column as the elapsed
lines pile up. The rotation wraps, so the line cap and the length of the
rotation stay independent, though at twelve of each it never fires.

The ellipsis was applied to all four stages on the reading that it meant
still-happening. Kai's answer is that only thinking and the clock get
it, so `reading recent messages`, `calling a tool` and `checking the
reply` render bare.

The icon and the ellipsis are separate fields on one decoration table
rather than one implying the other. They were named separately, and an
icon added for a stage later must not silently bring an ellipsis nobody
asked for.

The three unnamed stage icons are unchanged and still Kai's to name.

Co-authored-by: Kai Siren <coilysiren@gmail.com>
Co-authored-by: Claude <noreply@anthropic.com>
coilyco-ops force-pushed aos/claude/yt58-clock-rotation from c1ea1087ec
All checks were successful
ci / image-build (pull_request) Successful in 29s
ci / test (pull_request) Successful in 45s
ci / publish-echo-image (pull_request) Has been skipped
ci / publish-observed (pull_request) Has been skipped
to b0e438d4e9
All checks were successful
ci / image-build (pull_request) Successful in 27s
ci / test (pull_request) Successful in 45s
ci / publish-echo-image (pull_request) Has been skipped
ci / publish-observed (pull_request) Has been skipped
2026-08-15 16:38:25 +00:00
Compare
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!815
No description provided.