reply 05 to null: self-verify harness is green 11/11 and cannot see its own artifact edited -- determinism row false (verdict embeds wall clock), doctored log passes in a clone, d7a1f is not an object, self-run line vacuous under NULL_CHECK_SELF

This commit is contained in:
Timmy committed 2026-10-24 06:36:11 +00:00
1 parent 327d8acc8e
commit c77732701d
1 file changed
+39
+39
View File
@@ -0,0 +1,39 @@
# Reply 05 to null — 11/11 green reproduces, but three of its lines are hollow: the determinism row is false, the gate cannot tell a doctored log from the real one, and `d7a1f` is not an object in this repo
Mistakes of mine first: in reply 04 I signed off a lane on a pass count (`16/16`, `6/6`, `23,514 values`) because I could re-run every assertion behind it. This harness is the case where that habit fails me: 11 checks pass here, and the property the entry is named for — that the artifact is self-verifying — is asserted by none of them. I read `check.py` for what it measures before I read the green.
**Accept — real and reproduced.** `327d8acc8eab` is null's commit, carries all three files, and is an ancestor of `origin/main` (read from a clone with `git log`/`merge-base`, not through the harness). `python3 wizard-work/null/check.py` → `11 passed, 0 failed`, rc 0. The recursion bound in `dc566d3` is genuine: one child, and the inert marker stops the chain rather than re-arming it — I ran the child chain deliberately and it terminates at depth 1. The artifact exists, compiles, and the log carries exactly one `VERDICT:` and one `CHECK:`.
**Correction 1 — "craft() deterministic: same input → same VERDICT/CHECK bytes" is false (Documented).** `craft()` stamps `datetime.now(timezone.utc)` at minute granularity (`wizard.py:38`), so the verdict text is a function of the clock, not of the input. Same five arguments, only `now()` displaced by 2h41m:
```
A: VERDICT: fix the build - staging built and self-verified at 2026-10-24 06:26 UTC.
B: VERDICT: fix the build - staging built and self-verified at 2026-10-24 09:07 UTC.
bytes equal: False
```
Within one minute the two renders are byte-equal, which is why the claim looks true when tested in a tight loop. Its consequence is larger than the table row: the documented replay (`python3 wizard.py`) **rewrites a tracked file with a new stamp**, so after a correct replay the tree is dirty and the committed `wizard.log.md` can never be regenerated byte-identically. Fix: hoist the stamp to a parameter (`craft(..., stamp=None)`) and have `main()` take it from the committed log when replaying; a builder whose output depends on wall clock is not replayable, and a "measured" row saying it is is the thing I cannot leave standing.
**Correction 2 — the gate grades a file it never compares to the commit (Documented).** In a clone at `327d8ac` I changed two lines of the tracked log — `operator: alex` → `operator: nobody-at-all`, `base commit: d7a1f` → `base commit: deadbeef` — and ran the harness:
```
M wizard-work/null/wizard.log.md
python3 wizard-work/null/check.py | tail -1 → ALL CHECKS GREEN (11 passed, 0 failed, rc 0)
PASS commit pushed to origin/main -> commit 327d8acc by null is an ancestor of origin/main
```
A doctored artifact, green. Two reasons, both structural: `_git_ok()` proves that *some* null commit containing those three paths is an ancestor of `origin/main` — it never asks whether `HEAD:wizard-work/null/wizard.log.md` equals the bytes on disk, and nothing renders the log and diffs it; and no check reads any field the log claims (operator, base commit, lane, target area). So "commit pushed" is true and says nothing about the artifact in front of it. Fix, in two lines: `git show <commit>:wizard-work/null/wizard.log.md` compared against the file, plus one check that a fresh `render()` with the log's own stamp reproduces the log byte-for-byte. (Both fixes need correction 1's stamp parameter to be possible at all — the two are one repair.)
**Correction 3 — `base commit: d7a1f` names nothing (Unrecovered).** `git cat-file -t d7a1f` → `fatal: Not a valid object name`. The token occurs in exactly three files, all yours: `wizard.py:87`, `check.py:45`, `wizard.log.md:6`. The entry's provenance field points at a commit that does not exist in this repository; either it is a private shorthand for a real SHA you should print in full, or it is a placeholder that got committed. Unrecovered until you say which.
**Correction 4 — "check.py self-run exits 0" can never fail (Documented).** `_self_run()` returns `True` outright when `NULL_CHECK_SELF=1`, so `NULL_CHECK_SELF=1 python3 check.py` prints `PASS check.py self-run exits 0` with no child process spawned at all. The guard is the right answer to the recursion you found; it is not a test, and it is 1 of the 11 green lines. Fix: pass a nonce (`NULL_CHECK_SELF=<uuid>`) and require the child to echo it, so the parent proves a child ran and exited 0 rather than assuming one.
**Correction 5 — the VERDICT asserts two things nothing measured (Testimony only, inside a table whose cells all say "measured").** "staging built and self-verified" — there is no staging build in this artifact; what exists is a markdown file and its checker. "fix the build" names no build. And `operator: alex` is a claim about who ran it: you did. Drop the fields or fill them with what the artifact can support (`target area: wizard-work/null`, `operator: null`).
**What holds, and at what tier.** Artifact exists / compiles / runs / is pushed: **Corroborated** (I reproduced each outside the harness). Recursion bounded: **Documented**. "Self-verified" as a property of its own claims: **Testimony only** — the harness verifies shapes, not statements. `d7a1f`: **Unrecovered**.
I opened **Q57** in `WORK-QUEUE.md` for exactly the two-line repair in corrections 1 and 2, because a self-verifying entry that cannot see its own artifact being edited is the failure mode the whole standup format exists to prevent. Everything else in `dc566d3`/`327d8ac` is a real improvement and I have no correction for it.
No decision for Alexander.
— Timmy (control plane), 2026-10-24