Your third clock already exists, it is not a clock, and its first hole was closed by a human 48 minutes later.
I pulled the Actions run history for both jobs and the whole evidence/ tree. The gaps are not one failure mode. They are two, and only one of them is silent.
The census splits
2026-01-26, 01-27 no run of any kind SILENT
2026-02-15 daily #20 executed, failed LOUD
2026-07-09 daily #164 executed, failed LOUD
2026-05-23 (W21) weekly #19 executed, failed LOUD
PAYTON_DAILY_RECEIPT: 207 runs, numbered 1..207 with no holes. 204 scheduled, 3 dispatched, 3 failures, all three of them scheduled runs. 206 of the 208 days in the span carry a run.
So the silent class is 2 days out of 208, both inside the first three days of the project, and zero in the 205 days since 2026-01-28. Everything after that announced itself.
run_number is the layer the recursion terminates in
It is external to every job's runtime. The scheduler increments it whether the job succeeds, fails, or is cancelled, so a job cannot fail to advance it and cannot forge it. Your 2026-08-16 heredoc fix is what put it inside the artifact:
2026-08-17 RUN_NUMBER=203
2026-08-18 RUN_NUMBER=205
2026-08-19 RUN_NUMBER=206
2026-08-20 RUN_NUMBER=207
204 is missing, and 204 is 2026-08-18. I pulled that run's step list:
success Update manifest (append-only)
failure Check payload has not gone stale (cross-day duplicate detection)
skipped Commit evidence
That is the W21 shape exactly, one level down. Build succeeded, report never left.
What actually killed 204 was a check that could not pass
a1ea6cf1 shipped the staleness gate on 2026-08-17 at 17:57. It was cut -f3 over every manifest, then uniq -d. At that moment 200 of your 204 manifest rows already carried the same payload hash, e9e39c0e, spanning 2026-01-25 to 2026-08-16, from the quoted heredoc. So uniq -d was non-empty by construction, and the next scheduled run was doomed before it started. It did not detect a stale payload. It detected the archive.
You caught that inside 47 minutes and fixed it in e1677b9e: today's hash against every other day, instead of duplicates anywhere. That is the right narrowing and it is why 205, 206 and 207 pass.
Then the interesting part, which is the answer to your question
Run 205 is workflow_dispatch, 2026-08-18T03:43:06Z. Run 204 died at 02:55:20Z. Somebody watched a scheduled job fail and pressed the button 48 minutes later.
So the chain has already terminated in a human checking on a cadence. Once, that we can see.
And here is the part that decides what to build. The date column cannot see any of it. 2026-08-18 has a manifest, a receipt, a hash, and sits in W33 like every other day. Nothing in the archive distinguishes a day the scheduler delivered from a day a person rescued by hand, except one missing integer in a monotone column that has existed for four days.
date column catches never started 2 of 208 days
RUN_NUMBER column catches started, never committed 4 of 238 runs
and was committed by a human 1 of 204 days
That third row is the one no third scheduled process would have given you. A fourth layer would have re-run the job. It would not have recorded that the third layer needed a person.
A third scheduled process would not be independent anyway
All four of your workflows sit in one scheduler queue. Start delay of daily_receipt against its own 3 2 * * *, over all 204 scheduled runs:
min 49 min median 172 min p90 262 min max 325 min
198 of 204 runs started more than an hour late
Not once on time in 204 tries. A separate schedule buys a separate name, not a separate clock. It is not a correctness problem yet: the receipt files under date -u at run time, and filing under the wrong day needs 1,317 minutes of delay against an observed max of 325.
W21 cost zero bytes, and the byte column already prints the gaps
Your seals are cumulative, not weekly slices. cp -a evidence/daily copies the whole archive every time, so W22 is a strict superset of everything W21 would have held. The push that failed lost a name, not evidence. That is also what makes your outer clock stateless: a missed seal costs latency, never coverage, which is the property you were hoping to buy with a third process.
You are paying 58x for it. 154,908 bytes of live evidence have produced 8,978,136 bytes of sealed copies, growing 8,687 bytes per seal. Every gap is legible in that one column:
W07 -> W08 +7,446 short 1,241 = 2026-02-15
W20 -> W22 +17,374 exactly 2x = the W21 seal that never pushed
W27 -> W28 +7,446 short 1,241 = 2026-07-09
1,241 bytes is one day. Three of your four gaps are already reported, in bytes, by a job whose only intent was to copy a directory.
The caveat that decides what to build
The narrowed check compares today against the past, which means it can never see the past. The 200-day duplication is now permanently invisible to every check you ship: no future run will flag it, because no future run is one of those days.
So for 2026-01-25 to 2026-08-16 the continuity claim rests on filenames and mtimes. RUN_NUMBER starts on 08-17. The staleness guarantee starts on 08-17. The hole detector you were designing has four days of history.
Does the archive get a backfilled RUN_NUMBER column for the 200 days that never had one, from run history you can still read? Or is 2026-08-17 the honest start date of the continuity claim, with everything before it a filename record you stop making claims about?