Skip to content

fix: a gesture never waits behind a run's summary, and an open page reads on a beat - #1251

Closed
santoshkumarradha wants to merge 3 commits into
santos/devfrom
fix/gestures-never-wait-behind-a-summary
Closed

santoshkumarradha wants to merge 3 commits into
santos/devfrom
fix/gestures-never-wait-behind-a-summary

Conversation

@santoshkumarradha

@santoshkumarradha santoshkumarradha commented Sep 19, 2026

Copy link
Copy Markdown
Member

What was wrong

Every ask the surface makes of its engine stood in one ordered line, so the engine sees a person's gestures in the order they were made. The run's summary stood in that line too, and the summary asks a model with a ten second budget. A press made while a summary was out waited behind it.

Separately, an open task page asked for its page again from the paint clock: about six reads a second over the wire for as long as the page was open, ended tasks included.

What changed

Two commits, each with a failing test first.

  1. Nothing a person did not press stands in the ordered line. A second road off the update loop, besideLine, asks on its own goroutine and folds the same way. Its property: a read nobody pressed for, where nothing a person does next depends on the engine having seen it first. The run's summary is its one caller. A ledger law (doorsBesideTheLine, TestOnlyReadsNobodyPressedForAreAskedBesideTheLine) lists every caller, and the structural law that keeps engine doors off the loop accepts both roads.
  2. An open page reads on a beat. Once per three second beat, counted from the last page read, and only while the task is queued or running. A page on an ended task is read once, to open it. The follow stays in the ordered line, because its answer replaces the page and a note re-reads the page too.

Who stands in the ordered line

Autonomy reads and writes, the replay on attach, the gestures that resolve a question, the plan's spend, the plan verbs, a note, and page reads. Of all of them only the run's summary was a model call or had a budget in seconds. One more finding is not in this PR: the tasks place reads the plan synchronously on the frame. That read is on the loop ledger and has its own cell.

Measured, real binary, hosted, 2026-09-19

Press on a run's row to its page being drawn. The press is made the moment the row appears, which is when a summary has just been asked, so this is a gesture made during a summary.

seconds
before 2.4, 5.4, 7.7
before, same drive at trunk 12840ee the same night 9.9, 10.0, 10.1
after 0.09, 0.18, 0.18

Page reads over twenty seconds of an open page on a running task, in the hosted test: 120 before, 5 after. On an ended task: none after the opening read.

I did not time a note separately. A note takes the same ordered line as the press, so the press is its measure.

Proof

  • Spark, head 1ff2478 on trunk 443c661, under the one-suite lock: whole internal/tui3 exit 0, whole internal/session exit 0. The head pushed here adds the change entry only.
  • Spark, same tree: internal/guard, internal/namelaw, internal/manual ok; make test-laws exit 0; gofmt -l ./cmd ./internal empty.
  • Manual: the follow sentence in worker-harness.md now says what the page does.

🤖 Generated with Claude Code

santoshkumarradha and others added 3 commits September 19, 2026 00:45
The line exists so the engine sees a person's gestures in the order they
were made. The run's summary, a sentence a model writes under a budget of
ten seconds that nobody pressed for, was asked through it, and stood in
front of whatever a person did next. Measured on a real screen: a press on
a run's row waited 7.6 s for a read that took 2 ms, and a stop or a pause
pressed in that window would have waited the same.

The summary is now asked beside the line, its fold unchanged. A pause
pressed while the summary is held on a channel is answered before it
returns, gestures made meanwhile still reach the plan in the order they
were made, and a structural law names with its reason every door that may
be asked beside the line, so a gesture cannot be moved there.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
The follow was offered its read on every tick of the paint clock and held
back only while one was out, so a fast engine was asked again the moment it
answered: 509 reads over the wire in ninety seconds on a real screen, about
six a second, for one open page. It now reads once every three seconds, the
rail's own beat, counted from the last time the page was read for any
reason, and only while the task is queued or running. A page on a task that
has ended is read once, to open it.

Counted through the real server and client: twenty ticks a beat over five
beats cost 120 reads before and cost five now; twenty beats on an ended
task cost none. The follow stays in the ordered line because its fold
replaces the page and a note re-reads it too.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
@santoshkumarradha
santoshkumarradha marked this pull request as ready for review September 19, 2026 05:24
@santoshkumarradha

Copy link
Copy Markdown
Member Author

Landed on santos/dev as c3ab6e0 (tree 77cca97f5). Full make check on Spark on that exact commit: EXIT 0, 114 packages ok, on the third run. Runs 1 and 2 each failed one test in a package this PR does not touch (cmd/codeaf TestDoOnTheRunEngineSeatsACheckOnTheCheckModel, then internal/session TestANewDirectionArrivesWithTheClaimUnspent); both logs are kept beside the green one as ~/src/trees/check-sdev-c3ab6e03b.run1-flake.log and .run2-flake.log, and both failures are being worked as their own items. Squashed by hand, so GitHub shows this as closed, not merged; the branch is level with dev 9258f70.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant