What running the experiment turned out to require
What running the experiment turned out to require
This is not the second reading. It is the record of an attempt to run the
experiment ./maintenance-check.md §6 named — a
person, a canvas of their own on a real task they are working, days rather than
hours, the tab in front of them, and nothing instructing them to write — and of
the two things that attempt found standing in front of it. One of them is
arithmetic. The other is a finding, and it is the reason waiting will not be
enough on its own.
It is a fourth document beside ./VERDICT.md,
./off-corpus-check.md and
./maintenance-check.md, and amends none of them.
Written for Basecamp todo
10337947736,
Run the experiment the first reading could not, on 2026-09-25, ledger row
bc-10337947736-run-the-experiment-a-person-a-canvas-days.
0. The store this reads, named exactly
- Path:
/Users/lfigea/.openclaw/workspace/state/canvas, which is what$OPENCLAW_WORKSPACE/state/canvasresolves to on the machine that runs the ledger — the same storemaintenance-check.md§0 pins. - Head at the time of reading:
48159af029eefd50f676727e8d4f995e24bea49c, 174 commits, twenty-two files. - First commit: 2026-09-24 12:51:03 +0200. Last: 2026-09-25 02:02:29 +0200.
This reading is in its own corpus and says where. Its ledger row’s three
birth commits (bc-10337947736-run-the-experiment-a-person-a-canvas-days,
author task-ledger | open) and the three nodes this reading wrote to that
canvas while working (claude-opus-5[1m] | canvas-follow-through) are in the
- None of the counts in §2 is taken from any of the six: §2.1 counts person and page writes, and none of the six is either.
Every command below names that sha rather than HEAD, so a later reader gets
the numbers this document reports rather than the numbers of whatever the store
has become since — which is the failure §3 is about, arriving in the smallest
possible form.
STORE=/Users/lfigea/.openclaw/workspace/state/canvas
HEAD=48159af029eefd50f676727e8d4f995e24bea49c
git -C "$STORE" rev-list --count "$HEAD"
git -C "$STORE" ls-tree --name-only "$HEAD" | grep -c '\.xml$'
git -C "$STORE" log --reverse --format=%ad --date=iso "$HEAD" | head -1
git -C "$STORE" log -1 --format=%ad --date=iso "$HEAD"
1. The window does not exist yet, and that part is arithmetic
The store is thirteen hours and eleven minutes old, end to end, including every hour in which nobody was awake. The todo asks for a reading “over a named window of at least several days”. Nothing done on 2026-09-25 can produce a window of several days ending on 2026-09-25, so this is not a thing that was attempted and failed; it is a thing that cannot be attempted yet.
That much was foreseeable. §2 is not.
2. The subject does not exist either, and waiting alone will not create one
Every canvas in this store that has outlived two hours did so because something went wrong. That sentence is the finding, and it is what turns wait several days into a precondition somebody has to supply.
Nineteen of the twenty-two files belong to ledger rows. (Three do not: skill-validation-20260924,
skill-validation-b-20260924 and the §5.4 probe.) Sixteen of the nineteen
are frozen, and their lifetimes — birth to freeze — are:
| minutes | |
|---|---|
| shortest | 3.5 |
| median | 29.3 |
| longest | 130.8 |
Three are unfrozen, and not one of them is a subject. Open is measured to the pinned head, so it is a number a later reader gets back rather than a number that grows while nobody looks:
| canvas | open at 48159af |
why it is still open |
|---|---|---|
duplicate-invoice-criterion-output-schema |
11.3 h | its row reached done at 17:28 on 2026-09-24 and the automatic freeze failed — canvas:failed, exit 2 |
bc-10336256184 |
9.0 h | its row has been sitting in executing since 17:02 the previous afternoon |
bc-10337947736-…-a-canvas-days |
0.1 h | this reading’s own row, born minutes before this sentence |
So the store has never held a canvas that stayed writable for days because the work it belonged to lasted days. It has held one whose freeze crashed, one whose row is stuck, and one that is minutes old.
A canvas open by accident is the same bad sample the first reading had to work
with, arriving from the other end. §1.4 discounted its one person-written canvas
because the row’s automatic create had failed, so making the canvas at all was
already an intervention; duplicate-invoice-criterion-output-schema is now
also the canvas whose freeze failed, and bc-10336256184 is open only
because nothing is finishing its row.
The precise statement is therefore not “wait several days”. It is:
The experiment’s subject cannot come from a row the follow-through loop drives, because the loop freezes canvases faster than a person could come back to one — a median of twenty-nine minutes, and never more than 2h11m when nothing goes wrong. It has to come from a row a person owns and works by hand over days, and this store has never held one.
That precondition is a person’s to supply, and supplying it is not the same as being asked to write. A row somebody opens for work they were going to do anyway leaves the question intact; a row opened in order to be written to does not.
# every freeze, with its time
git -C "$STORE" log --format='%at%x01%(trailers:key=Canvas-Freeze,valueonly)' "$HEAD" \
| grep -v '^[0-9]*.$'
# every birth
for f in $(git -C "$STORE" ls-tree --name-only "$HEAD" | grep '\.xml$'); do
printf '%s %s\n' "$(git -C "$STORE" log --format=%at "$HEAD" -- "$f" | tail -1)" "$f"
done
# which of them are a ledger row's
ls /Users/lfigea/.openclaw/workspace/state/ledger/*.json
2.1 What the hours since the first reading did say
Eleven more ledger-row canvases were born between the head
maintenance-check.md pins (8f773f2, 2026-09-24 18:08:08) and this one. Across
all eleven:
- No person wrote to any of them. All 36
leo | via claudecommits in the store are still on the single fileduplicate-invoice-criterion-output-schema.xml, and the last of them is still 14:48:58 on 2026-09-24 — the same burst §1.2 describes. Nothing has been added to that census in the seven hours and fifty-four minutes since. - The tab still has zero writes. No commit in the store carries
Canvas-Author: lfigea, which is whatbin/watch-runs-webwrites for an edit made from the page. The threelfigea | by-handcommits are the CLI’s default author, and are the §5.4 probe and its freeze.
This is a second data point pointing the same way as the first, and it is worth almost exactly as much: eleven agent-driven rows, over one night, on a machine whose only person was asleep for most of it. It is not evidence about a habit, and §5 says so again rather than relying on this sentence being remembered.
3. The first reading’s denominator had already stopped being re-derivable
maintenance-check.md §0 states its denominator — 7.49 canvas-hours — as an
intersection with “the 14:46:37–18:08:08 window in which pid 33867 has been
running”, and gives the command for it:
ps -o lstart= -p 33867
That process has exited. The command prints nothing. The number the document published can no longer be re-derived from the document itself, which is the one property the second reading is required to have — and over a window of days it could not have been recovered by any command issued afterwards, because nothing on this machine kept the fact.
Nor is one window the right shape for a longer one. Three different
bin/watch-runs-web processes ran between 00:10 and 01:23 on 2026-09-25 — pids
35209, 93489 and 72266 — because the page is restarted whenever a merge is
deployed, which on this machine happens several times an hour.
So the reading is now sampled as it happens rather than reconstructed
afterwards. tasks/deployment-freshness already asked ps which processes
were running out of the checkout and when each started, every fifteen minutes,
and printed it into a run log; it now also appends it to
$OPENCLAW_WORKSPACE/state/deployment/freshness.jsonl. bin/canvas-hours turns
that series plus this store’s own git log into the denominator, and states two
bounds rather than absorbing them: a process’s start is exact while its
end is only a last sighting, so a window is start .. last seen and is never
joined to the next one; and a stretch of the requested window falling outside the
series is named as unsampled, not counted as zero. Where an error remains it
undercounts, because this number sits underneath a count of writes.
That work is in the ledger-orchestrator repository, merged as
ledger-orchestrator#121
— orchestrator/canvas_hours.py, orchestrator/deployment.py,
bin/canvas-hours, and the decision in docs/canvas-hours.md — and nothing
in it teaches this repository about the ledger: the store’s git log is one
side, a fact about processes on that machine is the other, and they are measured
separately, exactly as the first reading insisted.
The series begins 2026-09-25 01:58. Everything before that is unsampled and will be reported as unsampled.
4. What the second reading will be
- A window running forward from 2026-09-25 01:58, of at least several days, named by its two ends.
- A named set of ledger rows, and a denominator stated the same way §0 of the
first reading states it — canvas-hours in which a canvas was born, not yet
frozen, and the page was up — derived from the sample series and re-derivable
by
bin/canvas-hours --since … --until …. - Counts from
Canvas-Authortrailers, matched exactly:lfigeais the page andlfigea | by-handis the CLI, and the whole question turns on the difference. - Whether each of the three reversal conditions in
ledger-orchestrator/docs/canvas-in-prompts.mdfired, naming rows and shas — and in particular whether the over-budget notice has yet had anything to work on, which as of this head it still has not. The largest canvas in the store is stillbc-10327745654-the-ledger-orchestrator-repository-git-gat the same 11,495 bytes of XML the first reading measured — 11,549 characters asreadprints it, 57.7% of the 20,000-character budget — and eleven more canvases have been born without displacing it. The condition remains untested rather than refuted, exactly as §2 of the first reading left it. - What the evidence does not support, in its own words.
And the four things that are not up for grabs, restated because a document that
is finished months from now will be read by somebody who never saw the todo:
nobody is prompted, reminded or nudged to write; the answer is never an
attribute (engineering-spec.md:291-295 — the todo and this document’s first
draft both cited 280-284, which is the passage about a contradiction landing
as a <question> node; the sentence that refuses an attribute is “A state
field distinguishing what was asserted from what was verified was considered and
rejected as premature… it should be fixed with evidence in the reason before it
is fixed with a new attribute”, and it is five lines further down); a finding of
staleness is not a
licence to escalate (canvas-in-prompts.md §2); and nothing here learns
about the ledger.
5. What this document does not claim
- It does not claim the experiment failed. It has not run. A reading that
called thirteen hours of agent-driven rows an answer would be the failure
product-spec.md:124describes, arriving as a measurement instead of as a canvas. - It does not grade a reason and does not decide whether a silence is
staleness.
VERDICT.mdowns the first; §1.4 of the first reading left the second open, and nothing here closes it. - It does not argue that the follow-through loop should close rows more slowly. Twenty-nine minutes is what the loop is for. Changing how work is done so that a measurement becomes convenient is the wrong order, and the finding in §2 is a statement about where the experiment’s subject must come from, not a request to slow anything down.
- It is still one machine and one store, and still a reader at no distance: the bar in §1 of the first reading is about somebody months later, and everything read here is hours old.
Written 2026-09-25 for Basecamp todo
10337947736,
ledger row bc-10337947736-run-the-experiment-a-person-a-canvas-days. Store
/Users/lfigea/.openclaw/workspace/state/canvas at
48159af029eefd50f676727e8d4f995e24bea49c, 174 commits.