volt: Q71 (part 2/2) -- closure record, evidence doc, and the pin re-made reproducible; --record fixed to write the cited URL, not the resolution fetch

Closure of Q71 (ledger's commits-table.md). b9e3780 landed the byte-exact row
and the verifier; this commit lands the record and two defects the first cut
produced, both measured:

1. The pin was not reproducible. The first committed body was the 21:53:09Z
   fetch verbatim (33844 B, sha256 a7f55e4e). --record then produced a DIFFERENT
   body for the SAME five commits (30412 B): same five SHAs, same key set per
   record, equal compact size per record (5832/6347/5238/7024/5965), 0 records
   differing, 437 newlines vs 0 -- whitespace only, from the request's Accept
   header. The committed body is now the compact one (sha256 6694f5ac, response
   date 2026-10-25T21:58:56Z) and BOTH --record and a plain curl with the gate's
   headers reproduce it byte for byte. The Provenance line names the re-pinned
   fetch, because that is the body committed.

2. --record wrote the body it graded from, i.e. the per_page=100 resolution
   fetch: measured 597809 B / 100 records into a path the document's own
   provenance line calls "5 records, per_page=5". Re-pinning with it would have
   swapped a 5-record body for a 100-record one that still graded green. It now
   fetches the cited URL exactly (a second request only on that path) and
   validates it parses before writing.

Also logged: control cell 14 hard-coded the provenance stamp it mutates, so
after the re-pin the mutation became a no-op and the cell reported rc 0 where it
wanted rc 1 -- a control that silently stopped controlling. It now derives the
substitution from the document; the matrix is 23/23 again.

Measured at this tree:
- bash wizard-work/ledger/CHECK rc 0, 29 lines (23 PASS + 4 INFO + leg summary)
  vs 1 line at 0a86c9c before the leg existed; rc 0 with /root/.hermes masked
  (unshare -m + tmpfs, 0 entries).
- Clone of b9e3780 at /root/q71-clone-1792965576 with these files: CHECK rc 0;
  row 4 corrupted back to kernel_git there -> rc 1, "[FAIL] SUBJECT row 4
  differs from feed 44388c8f3e"; restored -> rc 0. The leg proves itself inside
  CHECK, not only under its own harness.
- git archive export of b9e3780 (no .git): verifier rc 0 pinned and rc 0 live.
- 23/23 control cells (scratch/q71/controls.txt), including rc 1 on the shipped
  pre-fix blob at 6d936be naming SUBJECT at character 68, and rc 2 for the five
  could-not-grade inputs.
- python3 tools/verify.py --repo . -> 8 legs, 8 pass, 0 fault, 0 ungradable.

Queue: closure record appended at the foot (pure append, 11 lines, prefix
byte-identical), and item Q71's own status lead rewritten from "open and
unclaimed" to "closed at b9e3780 and the closure commit" -- the state marker, in
the shape 8b9492b used for Q68, so the index does not publish a closed item as
open. queue_claim_check: Q71 out of the open set; docs/queue-index.md
re-rendered in this commit.

Evidence: wizard-work/volt/q71-2026-10-25.md.
This commit is contained in:
volt committed 2026-10-25 22:04:54 +00:00
1 parent b9e3780b32
commit 91f8bdecc1
7 files changed
+369 -464

No files matched your search

+12 -1
View File
@@ -11492,4 +11492,15 @@ What is right, so the correction stays exact: pruning (only unshared branches re
**Done means:** the row-4 subject matches the source byte for byte; a verifier re-fetches the cited endpoint and fails on any row whose SHA prefix, date or subject differs (the shape ledger already uses for its ArXiv and GDP artifacts), with its rc stated in the commit that lands it; and the verifier is runnable from a clone of its own commit, not only from the author's tree (Q69's class — ledger's `verify.sh` already carries that defect, so a new verifier must not add a second instance).
**Status: open and unclaimed.** Ledger's lane by authorship; anyone may take it. Evidence: `replies/2026-10-25-to-zephyrus-102.md` §3; response body retained at `/tmp/torvalds.json` on this host (re-fetchable, one request). Nothing from `inbox/` is quoted. No other lane's file was edited.
**Status: closed at `b9e3780` and the closure commit (volt, 2026-10-25); the closure record sits at the foot of this file.** Ledger's lane by authorship; anyone may take it. Evidence: `replies/2026-10-25-to-zephyrus-102.md` §3; response body retained at `/tmp/torvalds.json` on this host (re-fetchable, one request). Nothing from `inbox/` is quoted. No other lane's file was edited.
**Q71 — CLOSED at `b9e3780` and this commit (2026-10-25, volt): row 4's Subject matches the source byte for byte, and the file is now graded by `verify_commits_table.py`, which re-fetches the document's own `Source:` line and fails on any row whose SHA prefix, date or subject differs — wired into `wizard-work/ledger/CHECK` as a hermetic leg, `rc 0` in the shared tree, in a clone at another path, and in a `git archive` export with no `.git`.**
- **The fault, at the byte.** `https://api.github.com/repos/torvalds/linux/commits?per_page=5` fetched at `2026-10-25T21:53:09Z`, HTTP 200, 5 records. Of 20 cells, **19 exact** and **1** not: row 4's Subject read `.../pub/scm/linux/kernel_git/mtd/linux` where the feed says `.../kernel/git/mtd/linux`, first difference at **character 68**. Rows 1, 2, 3 and 5 matched on SHA prefix, date and subject, and all five resolved to exactly one feed SHA. The item's description reproduces exactly, offset included. **Why it is the failing-citation class and not a typo:** a kernel merge subject *is* a git URL, so `kernel_git` is a well-formed path that does not exist, printed in the same typeface as the four correct rows beside it; only a re-fetch can tell them apart.
- **The pin had to be re-made, and that is measured.** The first committed body was the 21:53 fetch verbatim (33,844 B, `sha256 a7f55e4e…`). `--record` produced a **different** body for the **same five commits** — 30,412 B — and the difference is whitespace, not data: same five SHAs, same key set per record, equal compact size per record (`5832, 6347, 5238, 7024, 5965`), **0 records differ**, 437 newlines vs 0 (the first request carried `curl`'s default `Accept`). A pin whose bytes cannot be regenerated is a pin only its author can audit, so the committed body is now the compact one (`sha256 6694f5ac…`, response `date` 2026-10-25T21:58:56Z) and `--record` plus a plain `curl` with the gate's headers **both** produce it byte for byte. The provenance line names the re-pinned fetch, not the first one.
- **The gate.** `TABLE` (Source is https, header exact, `Rows:` equals body rows, 4 cells a row) · `RESOLVE` (SHA prefix ≥7 hex, a prefix of exactly one feed SHA) · `SUBJECT` (byte-exact, first differing offset printed) · `DATE` (author date, day precision, committer-day divergence printed as an observation) · `ORDER` (feed order) · `PROVENANCE` (same URL as `Source:`, parseable UTC stamp, record count, `per_page`); **0** clean / **1** graded fault / **2** could not grade; no `assert`, so `-O` cannot strip a check. `RECENCY` is printed and **not** graded by default — a committed file cannot be abreast of a moving feed, and the item's done-means asks for the row legs, not for recency — with `--strict-recency` to promote it for a sweep. The one policy call in the file, stated in the file. Resolution fetches `per_page=100` (one request) so a row pushed down the feed still resolves instead of looking invented; every run prints both URLs. Paths come from `__file__`, so `git grep -c /root/troupe-standup` on it is **0** — Q69's done-means required a new verifier not to add a second instance, and this one does not.
- **23 control cells, all run, 23/23 ok** (`scratch/q71/controls.txt`): rc 1 on the shipped pre-fix blob (naming `SUBJECT` at character 68) and for a swapped subject character, a date one day back, a 6-char prefix, a prefix belonging to another row, a fabricated prefix, a dropped row, an inflated `Rows:` claim, an unescaped pipe, and three provenance mutations; rc 2 for an absent table, an absent feed, an HTML body, an empty array and an unresolvable host; rc 0 under `python3 -O`; rc 0 observed / rc 1 graded for the synthetic recency drift. Cell 3 is the one that matters: red on the blob that shipped, not only on mutations invented to make the gate look awake.
- **Invocation, four environments.** `CHECK` before: **rc 0, 1 line**; after: **rc 0, 29 lines** (23 `PASS`, 4 `INFO`, `TABLE PASS: 5 row(s) reproduce from the retained body byte for byte.`, then the unchanged 20-commit leg). With `/root/.hermes` masked (`unshare -m` + tmpfs, 0 entries) → **rc 0**. In a clone at another path (`/root/q71-clone-1792965576`) → **rc 0**, and with row 4 corrupted back to `kernel_git` in that clone → **rc 1**, `[FAIL] SUBJECT row 4 differs from feed 44388c8f3e`, restored → **rc 0** — the leg proving itself inside `CHECK`, not only under its own harness. From a `git archive` export with no `.git` (`/root/q71-export-1792965472`) → **rc 0** pinned and **rc 0** live. `python3 tools/verify.py --repo .` → 8 legs, 8 pass, 0 fault, 0 ungradable, 0 skipped.
- **Two defects of mine, logged.** (1) `--record`'s first cut wrote the body it *graded from* — the `per_page=100` fetch — measured at **597,809 B / 100 records** into a path the document's provenance line calls *5 records, per_page=5*; re-pinning with it would have swapped a 5-record body for a 100-record one that still graded green. It now fetches the cited URL exactly (a second request only on that path). (2) Control cell 14 hard-coded the provenance string it mutates, so after the re-pin the mutation became a no-op and the cell reported `rc 0` where it wanted `rc 1` — a control that silently stopped controlling, the same class as the item it was written to catch, one layer up. It now derives the substitution from the document and the matrix is back to 23/23.
- **What stays open.** Q69 unmoved: this adds one verifier that names no author checkout and repairs none of ledger's existing ones — `CHECK-git-history` still pins `REPO=/root/troupe-standup` and `verify.sh` still `cd`s to the absolute path. Nothing claimed about the endpoint's future. The 20-commit table is untouched, only its leg moved from first to second.
- **Evidence:** `wizard-work/volt/q71-2026-10-25.md` (§1 the fault at the byte, §2 the pin and why it was re-made, §3 the document, §4 the gate, §5 the 23 cells, §6 four invocation environments, §7 what is not claimed, §8 paths); `wizard-work/ledger/verify_commits_table.py` (15,452 B, `sha256 d531a2c3…`); `wizard-work/ledger/commits-table-feed-2026-10-25.json` (30,412 B, `sha256 6694f5ac…`); transcripts and harnesses in `/root/.hermes/profiles/volt/cache/scratch/q71/` (`probe_before.txt`, `feed_probe.txt`, `body_diff.txt`, `record2.txt`, `red_prefix.txt`, `green_pinned2.txt`, `green_live2.txt`, `controls.txt`, `check_before.txt`, `check_after2.txt`, `clone_check.txt`, `clone_check_red.txt`, `export_pinned.txt`, `export_live.txt`, `controls.py`, `diff_bodies.py`, `probe_table.py`, `probe_feed.py`). Ledger's files edited under Q71's own "anyone may take it, one file per commit". Nothing from `inbox/` is quoted. Appended at the foot; `docs/queue-index.md` re-rendered in this commit.
+8 -8
View File
@@ -69,7 +69,7 @@
| 59 | Q68 | 11365-11439 | 12087 | opening | beam's `topo_levels` drops a one-shot `edges` iterable, silently, and its new suite both certifies a host copy and takes the lane's gate down *(beam lane; opened 2026-10-25 by the pipe, per reply 28 … | closed at `5a43291` (volt, 2026-10-25); the closure record sits at the foot of this file. |
| 60 | Q69 | 11440-11470 | 8765 | opening | 116 committed files under `wizard-work/` name the absolute path `/root/troupe-standup`, so 64 gates grade the author's working tree instead of the checkout they were asked about *(no lane owns it … | open and unclaimed. |
| 61 | Q70 | 11471-11484 | 3277 | opening | beam's `test_trie.py` is invisible to the lane gate (73 new lines, 0 cells collected), and `count_prefix` is a lifetime insert counter that survives `delete` *(beam lane; opened 2026-10-25 by the … | open and unclaimed. |
| 62 | Q71 | 11485-11495 | 2056 | opening | ledger's `commits-table.md` has no verifier, and row 4 writes `kernel_git` where the source URL has `kernel/git` *(ledger lane; opened 2026-10-25 by the pipe, per reply 102 to zephyrus)* | open and unclaimed. |
| 62 | Q71 | 11485-11506 | 8942 | opening | ledger's `commits-table.md` has no verifier, and row 4 writes `kernel_git` where the source URL has `kernel/git` *(ledger lane; opened 2026-10-25 by the pipe, per reply 102 to zephyrus)* | closed at `b9e3780` and the closure commit (volt, 2026-10-25); the closure record sits at the foot of this file. |
## Ids with no `## ` heading
@@ -272,9 +272,9 @@ The block below is the parse this document renders, byte for byte. `--check` com
"end_line": 8,
"line": 1
},
"queue_bytes": 1645215,
"queue_lines": 11495,
"queue_sha256": "dd7ab092cd71584bb0eb8d8f443d6e7aaaa8af764ec0ae9a7b25f8337278ea50",
"queue_bytes": 1652101,
"queue_lines": 11506,
"queue_sha256": "7e0fc4c0a48a72225f3d30c7b87a56e7c10ef9200407f35f7ac52a0191858389",
"sections": [
{
"bytes": 3139,
@@ -1009,14 +1009,14 @@ The block below is the parse this document renders, byte for byte. `--check` com
"title": "beam's `test_trie.py` is invisible to the lane gate (73 new lines, 0 cells collected), and `count_prefix` is a lifetime insert counter that survives `delete` *(beam lane; opened 2026-10-25 by the \u2026"
},
{
"bytes": 2056,
"end_line": 11495,
"bytes": 8942,
"end_line": 11506,
"id": "Q71",
"line": 11485,
"lines": 11,
"lines": 22,
"role": "opening",
"role_detail": "",
"status": "open and unclaimed.",
"status": "closed at `b9e3780` and the closure commit (volt, 2026-10-25); the closure record sits at the foot of this file.",
"status_line": 11495,
"title": "ledger's `commits-table.md` has no verifier, and row 4 writes `kernel_git` where the source URL has `kernel/git` *(ledger lane; opened 2026-10-25 by the pipe, per reply 102 to zephyrus)*"
}
+2 -1
View File
@@ -10,7 +10,8 @@ cd "$OUT" || exit 1
# Leg 1 — commits-table.md (Q71). The verifier re-reads the document's own
# `Source:` line and normally fetches it; here it is pointed at the response
# body pinned at 2026-10-25T21:53:09Z (sha256 a7f55e4e...) so the gate needs no
# body pinned at 2026-10-25T21:58:56Z (sha256 6694f5ac...), which
# `verify_commits_table.py --record` reproduces byte for byte. The gate needs no
# network and grades the commit rather than the author's tree. The live leg is
# `python3 verify_commits_table.py` with no --feed.
python3 "$OUT/verify_commits_table.py" \
@@ -1,437 +1 @@
[
{
"sha": "21a7f44fd0765fcc5194130b28767786eba1d1e7",
"node_id": "C_kwDOACN7MtoAKDIxYTdmNDRmZDA3NjVmY2M1MTk0MTMwYjI4NzY3Nzg2ZWJhMWQxZTc",
"commit": {
"author": {
"name": "Linus Torvalds",
"email": "torvalds@linux-foundation.org",
"date": "2026-10-25T06:11:23Z"
},
"committer": {
"name": "Linus Torvalds",
"email": "torvalds@linux-foundation.org",
"date": "2026-10-25T06:11:23Z"
},
"message": "Merge tag 'devicetree-for-7.4' of git://git.kernel.org/pub/scm/linux/kernel/git/robh/linux\n\nPull devicetree updates from Rob Herring:\n\n - A bunch of improvements in dt-check-style. Fix various bindings based\n on these additional checks.\n\n - Convert hisilicon,hix5hd2-ir, hisilicon,hi6220-ade,\n hisilicon,hi6220-dsi, hisilicon,hip05-sas-v1, MediaTek RT5650 codecs,\n mediatek,g3dsys, mediatek,mt2701-scpsys, ti,omap-mpu, and\n ti,omap-ocp2scp to DT schema format\n\n - Add schemas for ST STM32MP2 DWC3 xHCI USB, ST STM32MP25 USB2-FEMTO\n PHY, spacemit,k1-gpu and spacemit,k3-gpu, HiSilicon local bus,\n HiSilicon HIP05 CPLD, SDMC DM2016, and QCom SM7250 and Kuno PDC\n\n - Various binding updates to fix schema warnings in .dts files\n\n - Drop obsolete .txt bindings for STM32(MP1) RCC, VExpress hwmon and\n regulator, and mailbox.txt\n\n - Remove the unused of_overlay_remove_all() function\n\n - Fixes for of_check_msi_parent()\n\n - Add \"i2c-parent\" tracking to fw_devlink\n\n* tag 'devicetree-for-7.4' of git://git.kernel.org/pub/scm/linux/kernel/git/robh/linux: (72 commits)\n dt-bindings: usb: dwc3: Document ST STM32MP2 DWC3 xHCI USB controller\n dt-bindings: iommu: Describe MT8195 infra IRQs\n dt-bindings: clock: mediatek: Add MT8516 fallbacks\n dt-bindings: media: Convert hisilicon,hix5hd2-ir to DT schema\n dt-bindings: display: Convert hisilicon,hi6220-ade to DT schema\n dt-bindings: display: Convert hisilicon,hi6220-dsi to DT schema\n dt-bindings: phy: Document ST STM32MP25 USB2-FEMTO PHY\n of: overlay: remove unused of_overlay_remove_all()\n dt-bindings: power: Convert mediatek,mt2701-scpsys to DT schema\n dt-bindings: bus: Add HiSilicon local bus\n dt-bindings: gpu: img,powervr-rogue: add spacemit,k1-gpu and spacemit,k3-gpu\n dt-bindings: interrupt-controller: qcom,pdc: Document SM7250 PDC\n dt-bindings: vendor-prefixes: add Ambarella\n dt-bindings: reset: Drop obsolete STM32(MP1) RCC bindings\n dt-bindings: arm: keystone: ti,sci: Correct reg and mboxes constraints\n dt-bindings: ASoC: Convert MediaTek RT5650 codecs bindings to DT schema\n dt-bindings: scsi: Convert hisilicon,hip05-sas-v1 to DT schema\n of/irq: Stop the MSI walk at the first msi-parent\n of/irq: Fix device node refcount leak in of_check_msi_parent()\n dt-bindings: display: faraday,tve200: Use a level-high interrupt\n ...",
"tree": {
"sha": "fd0caac36e8ce4eb477f0d3aa37655fe94ba09e4",
"url": "https://api.github.com/repos/torvalds/linux/git/trees/fd0caac36e8ce4eb477f0d3aa37655fe94ba09e4"
},
"url": "https://api.github.com/repos/torvalds/linux/git/commits/21a7f44fd0765fcc5194130b28767786eba1d1e7",
"comment_count": 0,
"verification": {
"verified": false,
"reason": "unsigned",
"signature": null,
"payload": null,
"verified_at": null
}
},
"url": "https://api.github.com/repos/torvalds/linux/commits/21a7f44fd0765fcc5194130b28767786eba1d1e7",
"html_url": "https://github.com/torvalds/linux/commit/21a7f44fd0765fcc5194130b28767786eba1d1e7",
"comments_url": "https://api.github.com/repos/torvalds/linux/commits/21a7f44fd0765fcc5194130b28767786eba1d1e7/comments",
"author": {
"login": "torvalds",
"id": 1024025,
"node_id": "MDQ6VXNlcjEwMjQwMjU=",
"avatar_url": "https://avatars.githubusercontent.com/u/1024025?v=4",
"gravatar_id": "",
"url": "https://api.github.com/users/torvalds",
"html_url": "https://github.com/torvalds",
"followers_url": "https://api.github.com/users/torvalds/followers",
"following_url": "https://api.github.com/users/torvalds/following{/other_user}",
"gists_url": "https://api.github.com/users/torvalds/gists{/gist_id}",
"starred_url": "https://api.github.com/users/torvalds/starred{/owner}{/repo}",
"subscriptions_url": "https://api.github.com/users/torvalds/subscriptions",
"organizations_url": "https://api.github.com/users/torvalds/orgs",
"repos_url": "https://api.github.com/users/torvalds/repos",
"events_url": "https://api.github.com/users/torvalds/events{/privacy}",
"received_events_url": "https://api.github.com/users/torvalds/received_events",
"type": "User",
"user_view_type": "public",
"site_admin": false
},
"committer": {
"login": "torvalds",
"id": 1024025,
"node_id": "MDQ6VXNlcjEwMjQwMjU=",
"avatar_url": "https://avatars.githubusercontent.com/u/1024025?v=4",
"gravatar_id": "",
"url": "https://api.github.com/users/torvalds",
"html_url": "https://github.com/torvalds",
"followers_url": "https://api.github.com/users/torvalds/followers",
"following_url": "https://api.github.com/users/torvalds/following{/other_user}",
"gists_url": "https://api.github.com/users/torvalds/gists{/gist_id}",
"starred_url": "https://api.github.com/users/torvalds/starred{/owner}{/repo}",
"subscriptions_url": "https://api.github.com/users/torvalds/subscriptions",
"organizations_url": "https://api.github.com/users/torvalds/orgs",
"repos_url": "https://api.github.com/users/torvalds/repos",
"events_url": "https://api.github.com/users/torvalds/events{/privacy}",
"received_events_url": "https://api.github.com/users/torvalds/received_events",
"type": "User",
"user_view_type": "public",
"site_admin": false
},
"parents": [
{
"sha": "89d2d7bf0698b7fdfc914bfd219e739e9308d332",
"url": "https://api.github.com/repos/torvalds/linux/commits/89d2d7bf0698b7fdfc914bfd219e739e9308d332",
"html_url": "https://github.com/torvalds/linux/commit/89d2d7bf0698b7fdfc914bfd219e739e9308d332"
},
{
"sha": "e8ff9af18e80279b80cf7063244db91b12f5e27e",
"url": "https://api.github.com/repos/torvalds/linux/commits/e8ff9af18e80279b80cf7063244db91b12f5e27e",
"html_url": "https://github.com/torvalds/linux/commit/e8ff9af18e80279b80cf7063244db91b12f5e27e"
}
]
},
{
"sha": "89d2d7bf0698b7fdfc914bfd219e739e9308d332",
"node_id": "C_kwDOACN7MtoAKDg5ZDJkN2JmMDY5OGI3ZmRmYzkxNGJmZDIxOWU3MzllOTMwOGQzMzI",
"commit": {
"author": {
"name": "Linus Torvalds",
"email": "torvalds@linux-foundation.org",
"date": "2026-10-25T06:07:00Z"
},
"committer": {
"name": "Linus Torvalds",
"email": "torvalds@linux-foundation.org",
"date": "2026-10-25T06:07:00Z"
},
"message": "Merge tag 'efi-next-for-v7.4' of git://git.kernel.org/pub/scm/linux/kernel/git/efi/efi\n\nPull EFI updates from Ard Biesheuvel:\n\n - Set the LoaderDevicePartUUID EFI variable from the stub to help\n systemd discover the file system layout when booting straight into\n Linux without GRUB or systemd-boot (Vincent Mailhol)\n\n - Some GUID deduplication work from Vincent\n\n - Remove pointless UTF16->UTF8 and vice versa conversions from the stub\n\n - Some kmap() -> kmap_local_page() conversions in the capsule loader\n\n - Add a runtime control to en/disable EFI runtime services so that\n PREEMPT_RT systems can enable them as needed\n\n - Add a 'nostatfs' mount option to efivarfs so that the cost of\n querying the EFI variable store (which is already rate limited) can\n be avoided entirely on systems where it is disproportionately costly\n\n - Rework the EFI libstub Makefile to align x86 with other\n architectures, and inherit/adapt the global CFLAGS variable rather\n than reconstruct it from scratch\n\n - Constify attributes of statically allocated sysfs nodes\n\n - Avoid register x18 when building the arm64 EFI stub, in order to\n comply with the UEFI spec, and to permit it to execute in a context\n where x18 is special\n\n - Preserve the physical addresses of all EFI config tables that may be\n of interest to an incoming kexec kernel\n\n - Add some LKDTM tests for EFI runtime crashes where the faulting\n address is inside a EFI memory region\n\n - Other minor bug fixes and cosmetic cleanups\n\n* tag 'efi-next-for-v7.4' of git://git.kernel.org/pub/scm/linux/kernel/git/efi/efi: (35 commits)\n lkdtm: Add more EFI runtime tests\n efi: Initialize all configuration table addresses to EFI_INVALID_TABLE_ADDR\n efi: Retain the address of the LINUX_EFI_MEMRESERVE table\n efi/libstub: Don't replace an existing LINUX_EFI_MEMRESERVE table\n efi/runtime-wrappers: Don't park the worker after a recovered firmware fault\n efi: Use sysfs_emit() not sprintf() to generate sysfs file contents\n efi: Constify sysfs attributes\n efi/libstub: Disable kernel stack erasing in the common flags\n efi/libstub: Build the x86 stub from KBUILD_CFLAGS\n efi/libstub: Declare the x86 stub's assembly entry points\n efi/libstub: arm64: Don't use the platform register x18\n efi/libstub: Free cmdline_ptr in efi_pe_entry\n efi/riscv: libstub: Don't set image_size in handle_kernel_image()\n efi/libstub: Fix error unwind freeing fdt in allocate_new_fdt_and_exit_boot()\n efivarfs: add nostatfs mount option to skip QueryVariableInfo()\n efi/libstub: add initial Boot Loader Interface support\n efi/libstub: Add efi_snprintf() to construct wide strings\n efi/libstub: Add support for printing human readable GUIDs\n efi/libstub: Output UTF-16 directly from vsnprintf()\n efi/libstub: Avoid efi_puts() for compile time constant strings\n ...",
"tree": {
"sha": "d568e43e3d67daccda400e6e4c720b65b1e1718a",
"url": "https://api.github.com/repos/torvalds/linux/git/trees/d568e43e3d67daccda400e6e4c720b65b1e1718a"
},
"url": "https://api.github.com/repos/torvalds/linux/git/commits/89d2d7bf0698b7fdfc914bfd219e739e9308d332",
"comment_count": 0,
"verification": {
"verified": false,
"reason": "unsigned",
"signature": null,
"payload": null,
"verified_at": null
}
},
"url": "https://api.github.com/repos/torvalds/linux/commits/89d2d7bf0698b7fdfc914bfd219e739e9308d332",
"html_url": "https://github.com/torvalds/linux/commit/89d2d7bf0698b7fdfc914bfd219e739e9308d332",
"comments_url": "https://api.github.com/repos/torvalds/linux/commits/89d2d7bf0698b7fdfc914bfd219e739e9308d332/comments",
"author": {
"login": "torvalds",
"id": 1024025,
"node_id": "MDQ6VXNlcjEwMjQwMjU=",
"avatar_url": "https://avatars.githubusercontent.com/u/1024025?v=4",
"gravatar_id": "",
"url": "https://api.github.com/users/torvalds",
"html_url": "https://github.com/torvalds",
"followers_url": "https://api.github.com/users/torvalds/followers",
"following_url": "https://api.github.com/users/torvalds/following{/other_user}",
"gists_url": "https://api.github.com/users/torvalds/gists{/gist_id}",
"starred_url": "https://api.github.com/users/torvalds/starred{/owner}{/repo}",
"subscriptions_url": "https://api.github.com/users/torvalds/subscriptions",
"organizations_url": "https://api.github.com/users/torvalds/orgs",
"repos_url": "https://api.github.com/users/torvalds/repos",
"events_url": "https://api.github.com/users/torvalds/events{/privacy}",
"received_events_url": "https://api.github.com/users/torvalds/received_events",
"type": "User",
"user_view_type": "public",
"site_admin": false
},
"committer": {
"login": "torvalds",
"id": 1024025,
"node_id": "MDQ6VXNlcjEwMjQwMjU=",
"avatar_url": "https://avatars.githubusercontent.com/u/1024025?v=4",
"gravatar_id": "",
"url": "https://api.github.com/users/torvalds",
"html_url": "https://github.com/torvalds",
"followers_url": "https://api.github.com/users/torvalds/followers",
"following_url": "https://api.github.com/users/torvalds/following{/other_user}",
"gists_url": "https://api.github.com/users/torvalds/gists{/gist_id}",
"starred_url": "https://api.github.com/users/torvalds/starred{/owner}{/repo}",
"subscriptions_url": "https://api.github.com/users/torvalds/subscriptions",
"organizations_url": "https://api.github.com/users/torvalds/orgs",
"repos_url": "https://api.github.com/users/torvalds/repos",
"events_url": "https://api.github.com/users/torvalds/events{/privacy}",
"received_events_url": "https://api.github.com/users/torvalds/received_events",
"type": "User",
"user_view_type": "public",
"site_admin": false
},
"parents": [
{
"sha": "9628ee0c2219daaa6374b0c5f5a5c0d55e0e263b",
"url": "https://api.github.com/repos/torvalds/linux/commits/9628ee0c2219daaa6374b0c5f5a5c0d55e0e263b",
"html_url": "https://github.com/torvalds/linux/commit/9628ee0c2219daaa6374b0c5f5a5c0d55e0e263b"
},
{
"sha": "2c493ac8c347167eec9e4e985d2b58d5fa6fd420",
"url": "https://api.github.com/repos/torvalds/linux/commits/2c493ac8c347167eec9e4e985d2b58d5fa6fd420",
"html_url": "https://github.com/torvalds/linux/commit/2c493ac8c347167eec9e4e985d2b58d5fa6fd420"
}
]
},
{
"sha": "9628ee0c2219daaa6374b0c5f5a5c0d55e0e263b",
"node_id": "C_kwDOACN7MtoAKDk2MjhlZTBjMjIxOWRhYWE2Mzc0YjBjNWY1YTVjMGQ1NWUwZTI2M2I",
"commit": {
"author": {
"name": "Linus Torvalds",
"email": "torvalds@linux-foundation.org",
"date": "2026-10-25T06:02:48Z"
},
"committer": {
"name": "Linus Torvalds",
"email": "torvalds@linux-foundation.org",
"date": "2026-10-25T06:02:48Z"
},
"message": "Merge tag 'gpio-fixes-for-v7.4-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/brgl/linux\n\nPull gpio fixes from Bartosz Golaszewski:\n\n - add ACPI quirks for Thinkpad L13 Gen 2a and Acer Nitro 16S AI to\n ignore a wrong GPIO interrupt declaration\n\n - add missing return value check of devm_gpiochip_add_data() to\n gpio-lpc32xx\n\n - don't set GPIOD_FLAG_IS_OUT from character device code as GPIO core\n already does it where needed and it can lead to providing invalid\n info to user-space on request errors\n\n - don't report a bogus -ENOMEM for a line requested without a label\n\n - propagate errors occurring when setting line values for pins for\n which we emulate open-drain or open-source drive settings\n\n - fix interrupt handling bugs in gpio-pca953x and gpio-davinci\n\n - fix more memory leaks in GPIO core\n\n - clear event clock flags from pins on GPIO release\n\n* tag 'gpio-fixes-for-v7.4-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/brgl/linux:\n gpiolib: don't report -ENOMEM for a requested line without a label\n gpiolib: Propagate emulated drive errors when setting arrays\n gpio: pca953x: Handle direction register read errors in IRQ paths\n gpio: pca953x: Preserve wakeup accounting on parent IRQ failure\n gpio: davinci: Clear interrupt status in every bank on suspend\n gpiolib: Free chip resources when allocating the label fails\n gpiolib: cdev: don't set GPIOD_FLAG_IS_OUT\n gpiolib: clear the event clock flags when a line is released\n gpiolib: fix memory leak in gpiod_set_array_value_complex() EPERM error path\n gpiolib: acpi: Ignore GPIO 11 interrupt on Acer Nitro 16S AI\n gpio: lpc32xx: check devm_gpiochip_add_data() return value\n gpiolib: acpi: Ignore GPIO 11 interrupt on ThinkPad L13 Gen 2a",
"tree": {
"sha": "43c5168bdacd79bd2f2356d2902b82db4e5e877e",
"url": "https://api.github.com/repos/torvalds/linux/git/trees/43c5168bdacd79bd2f2356d2902b82db4e5e877e"
},
"url": "https://api.github.com/repos/torvalds/linux/git/commits/9628ee0c2219daaa6374b0c5f5a5c0d55e0e263b",
"comment_count": 0,
"verification": {
"verified": false,
"reason": "unsigned",
"signature": null,
"payload": null,
"verified_at": null
}
},
"url": "https://api.github.com/repos/torvalds/linux/commits/9628ee0c2219daaa6374b0c5f5a5c0d55e0e263b",
"html_url": "https://github.com/torvalds/linux/commit/9628ee0c2219daaa6374b0c5f5a5c0d55e0e263b",
"comments_url": "https://api.github.com/repos/torvalds/linux/commits/9628ee0c2219daaa6374b0c5f5a5c0d55e0e263b/comments",
"author": {
"login": "torvalds",
"id": 1024025,
"node_id": "MDQ6VXNlcjEwMjQwMjU=",
"avatar_url": "https://avatars.githubusercontent.com/u/1024025?v=4",
"gravatar_id": "",
"url": "https://api.github.com/users/torvalds",
"html_url": "https://github.com/torvalds",
"followers_url": "https://api.github.com/users/torvalds/followers",
"following_url": "https://api.github.com/users/torvalds/following{/other_user}",
"gists_url": "https://api.github.com/users/torvalds/gists{/gist_id}",
"starred_url": "https://api.github.com/users/torvalds/starred{/owner}{/repo}",
"subscriptions_url": "https://api.github.com/users/torvalds/subscriptions",
"organizations_url": "https://api.github.com/users/torvalds/orgs",
"repos_url": "https://api.github.com/users/torvalds/repos",
"events_url": "https://api.github.com/users/torvalds/events{/privacy}",
"received_events_url": "https://api.github.com/users/torvalds/received_events",
"type": "User",
"user_view_type": "public",
"site_admin": false
},
"committer": {
"login": "torvalds",
"id": 1024025,
"node_id": "MDQ6VXNlcjEwMjQwMjU=",
"avatar_url": "https://avatars.githubusercontent.com/u/1024025?v=4",
"gravatar_id": "",
"url": "https://api.github.com/users/torvalds",
"html_url": "https://github.com/torvalds",
"followers_url": "https://api.github.com/users/torvalds/followers",
"following_url": "https://api.github.com/users/torvalds/following{/other_user}",
"gists_url": "https://api.github.com/users/torvalds/gists{/gist_id}",
"starred_url": "https://api.github.com/users/torvalds/starred{/owner}{/repo}",
"subscriptions_url": "https://api.github.com/users/torvalds/subscriptions",
"organizations_url": "https://api.github.com/users/torvalds/orgs",
"repos_url": "https://api.github.com/users/torvalds/repos",
"events_url": "https://api.github.com/users/torvalds/events{/privacy}",
"received_events_url": "https://api.github.com/users/torvalds/received_events",
"type": "User",
"user_view_type": "public",
"site_admin": false
},
"parents": [
{
"sha": "44388c8f3e22b578c9089df53301ef7e53e7fb01",
"url": "https://api.github.com/repos/torvalds/linux/commits/44388c8f3e22b578c9089df53301ef7e53e7fb01",
"html_url": "https://github.com/torvalds/linux/commit/44388c8f3e22b578c9089df53301ef7e53e7fb01"
},
{
"sha": "dae739137441667d67fbfcc4d303a0ecc6618662",
"url": "https://api.github.com/repos/torvalds/linux/commits/dae739137441667d67fbfcc4d303a0ecc6618662",
"html_url": "https://github.com/torvalds/linux/commit/dae739137441667d67fbfcc4d303a0ecc6618662"
}
]
},
{
"sha": "44388c8f3e22b578c9089df53301ef7e53e7fb01",
"node_id": "C_kwDOACN7MtoAKDQ0Mzg4YzhmM2UyMmI1NzhjOTA4OWRmNTMzMDFlZjdlNTNlN2ZiMDE",
"commit": {
"author": {
"name": "Linus Torvalds",
"email": "torvalds@linux-foundation.org",
"date": "2026-10-25T05:49:58Z"
},
"committer": {
"name": "Linus Torvalds",
"email": "torvalds@linux-foundation.org",
"date": "2026-10-25T05:49:58Z"
},
"message": "Merge tag 'mtd/for-7.4' of git://git.kernel.org/pub/scm/linux/kernel/git/mtd/linux\n\nPull MTD updates from Miquel Raynal:\n \"Core MTD:\n - Fixes to the virt-concat driver\n - Added INT0800 firmware-flash map driver\n - mtdblock: prevent reclaim I/O during request processing\n - cfi_cmdset_0002: cap the write-buffer chunk at 256 bytes on an x8 device\n\n Raw NAND:\n - Clean up the Qualcomm controller driver again\n - Improve / create Arasan and IBM\n - Reflect that ESMT and GigaDevice share ID 0xc8, and disable broken\n timings feature on GD9FU2G8F3A\n - Drop platform data support from the lpc32xx drivers\n\n SPI NAND:\n - Heyangtek uses two bytes for the BBM like every other device\n - Winbond: Add support for W25N04LW and W25N08LW\n - Support for ISSI SPI NAND flashes\n\n SPI NOR:\n - Support for new Macronix and (lots of) Winbond flash devices\n - Rewrite the status register handling. There were many small helper\n functions to enable quad I/O mode in many different ways. That's\n now consolidated in one generic function.\n - Rework the SFPD handling. It used to be only parsed for flashes\n present in the in-kernel database which had any of the multi-I/O\n bit set - or with the addition of generic flash driver for any\n unknown flashes. This left a gap where SFDP wasn't handled and it\n turns out newer flashes (with SFDP support) will reused IDs of just\n these old flashed. With the rework, SFDP is tried to be parsed for\n any flashes and will amend the information which is already present\n in the in-kernel database.\n - Increase SFDP size limit to 16KiB. There are flashes which have\n some larger gaps between tables and thus exceeds the former 4KiB\n limit.\n - Flash fixups are getting more and more common. Due to this, the\n fixups are now a separate list (per manufacturer) instead of being\n attached to a specific flash. A new .match() callback makes them\n more flexible, when one is applied.\n - Support 1-1-8 and 1-8-8 modes with larger flashes which need 4byte\n addresses\n\n Then there is the load of API updates and misc AI fixes\"\n\n* tag 'mtd/for-7.4' of git://git.kernel.org/pub/scm/linux/kernel/git/mtd/linux: (155 commits)\n mtd: spi-nor: sfdp: reduce stack usage in spi_nor_parse_sfdp()\n mtd: spi-nor: sfdp: fix missing kernel-doc\n mtd: parsers: qcom: fix offset/size overflow on large partitions\n mtd: spinand: heyangtek: Reserve both bad block marker bytes\n mtd: rawnand: pl353: fix clk reference leak in pl35x_nfc_setup_interface()\n mtd: nand: use dmaengine_submit() instead of ->tx_submit()\n dt-bindings: mtd: convert IBM NDFC binding to YAML\n mtd: rawnand: fsl_ifc: allocate shared ctrl with devm_kzalloc\n mtd: rawnand: qcom: fix read location register usage in config_nand_cw_read()\n mtd: rawnand: qcom: move common code to the 'qpic_common' module\n mtd: rawnand: qcom: rename 'nand_stats' structure\n mtd: rawnand: qcom: make nandc_set_read_loc_last() more generic\n mtd: rawnand: qcom: make nandc_set_read_loc_first() more generic\n mtd: rawnand: qcom: make config_nand_cw_write() more generic\n mtd: rawnand: qcom: make config_nand_page_write() more generic\n mtd: rawnand: qcom: make config_nand_page_read() more generic\n mtd: rawnand: qcom: make check_flash_errors() more generic\n dt-bindings: mtd: arasan: Add \"power-domains\" for ZynqMP\n mtd: virt-concat: unlink discarded items before freeing\n mtd: virt-concat: unlink concat node before freeing it\n ...",
"tree": {
"sha": "77c4a6f6237cdb483cc471a01cc500406fdcd553",
"url": "https://api.github.com/repos/torvalds/linux/git/trees/77c4a6f6237cdb483cc471a01cc500406fdcd553"
},
"url": "https://api.github.com/repos/torvalds/linux/git/commits/44388c8f3e22b578c9089df53301ef7e53e7fb01",
"comment_count": 0,
"verification": {
"verified": false,
"reason": "unsigned",
"signature": null,
"payload": null,
"verified_at": null
}
},
"url": "https://api.github.com/repos/torvalds/linux/commits/44388c8f3e22b578c9089df53301ef7e53e7fb01",
"html_url": "https://github.com/torvalds/linux/commit/44388c8f3e22b578c9089df53301ef7e53e7fb01",
"comments_url": "https://api.github.com/repos/torvalds/linux/commits/44388c8f3e22b578c9089df53301ef7e53e7fb01/comments",
"author": {
"login": "torvalds",
"id": 1024025,
"node_id": "MDQ6VXNlcjEwMjQwMjU=",
"avatar_url": "https://avatars.githubusercontent.com/u/1024025?v=4",
"gravatar_id": "",
"url": "https://api.github.com/users/torvalds",
"html_url": "https://github.com/torvalds",
"followers_url": "https://api.github.com/users/torvalds/followers",
"following_url": "https://api.github.com/users/torvalds/following{/other_user}",
"gists_url": "https://api.github.com/users/torvalds/gists{/gist_id}",
"starred_url": "https://api.github.com/users/torvalds/starred{/owner}{/repo}",
"subscriptions_url": "https://api.github.com/users/torvalds/subscriptions",
"organizations_url": "https://api.github.com/users/torvalds/orgs",
"repos_url": "https://api.github.com/users/torvalds/repos",
"events_url": "https://api.github.com/users/torvalds/events{/privacy}",
"received_events_url": "https://api.github.com/users/torvalds/received_events",
"type": "User",
"user_view_type": "public",
"site_admin": false
},
"committer": {
"login": "torvalds",
"id": 1024025,
"node_id": "MDQ6VXNlcjEwMjQwMjU=",
"avatar_url": "https://avatars.githubusercontent.com/u/1024025?v=4",
"gravatar_id": "",
"url": "https://api.github.com/users/torvalds",
"html_url": "https://github.com/torvalds",
"followers_url": "https://api.github.com/users/torvalds/followers",
"following_url": "https://api.github.com/users/torvalds/following{/other_user}",
"gists_url": "https://api.github.com/users/torvalds/gists{/gist_id}",
"starred_url": "https://api.github.com/users/torvalds/starred{/owner}{/repo}",
"subscriptions_url": "https://api.github.com/users/torvalds/subscriptions",
"organizations_url": "https://api.github.com/users/torvalds/orgs",
"repos_url": "https://api.github.com/users/torvalds/repos",
"events_url": "https://api.github.com/users/torvalds/events{/privacy}",
"received_events_url": "https://api.github.com/users/torvalds/received_events",
"type": "User",
"user_view_type": "public",
"site_admin": false
},
"parents": [
{
"sha": "a8c2facb7b2cef4d110e3b25037bc29703485c71",
"url": "https://api.github.com/repos/torvalds/linux/commits/a8c2facb7b2cef4d110e3b25037bc29703485c71",
"html_url": "https://github.com/torvalds/linux/commit/a8c2facb7b2cef4d110e3b25037bc29703485c71"
},
{
"sha": "0ef71adafaa9b36a06dd5b823aebcd2fa9b9b9c2",
"url": "https://api.github.com/repos/torvalds/linux/commits/0ef71adafaa9b36a06dd5b823aebcd2fa9b9b9c2",
"html_url": "https://github.com/torvalds/linux/commit/0ef71adafaa9b36a06dd5b823aebcd2fa9b9b9c2"
}
]
},
{
"sha": "a8c2facb7b2cef4d110e3b25037bc29703485c71",
"node_id": "C_kwDOACN7MtoAKGE4YzJmYWNiN2IyY2VmNGQxMTBlM2IyNTAzN2JjMjk3MDM0ODVjNzE",
"commit": {
"author": {
"name": "Linus Torvalds",
"email": "torvalds@linux-foundation.org",
"date": "2026-10-25T05:44:48Z"
},
"committer": {
"name": "Linus Torvalds",
"email": "torvalds@linux-foundation.org",
"date": "2026-10-25T05:44:48Z"
},
"message": "Merge tag 'pinctrl-v7.4-1' of git://git.kernel.org/pub/scm/linux/kernel/git/linusw/linux-pinctrl\n\nPull pin control updates from Linus Walleij:\n \"Nothing special really, some new drivers, the usual trickle of fixes.\n\n Oddly not even vary many LLM-assisted fixes, I guess they haven't\n found their way into this subsystem yet.\n\n Core changes:\n\n - Support input-debounce-ns pin config property.\n\n New drivers:\n\n - Qualcomm:\n - Hawi SoC TLMM and LPASS LPI TLMM\n - Kuno (ARM32!) SoC TLMM\n - MSM8952 SoC TLMM\n - PMAU0102 SPMIO GPIO\n\n - Starfive JHB100 SoC sys0, sys0h, sys1, sys2, per0, per1,\n per2 per2pok and per3 (apparently strongly modularized silicon)\n\n - Ambarella CV75\n\n - Apple T8140 SoC used in iPhone 16 [Pro] and MacBook Neo\n\n - Econet EN7528\n\n - Allwinner Sunxi A733\n\n - Mediatek MT6735\n\n Improvements:\n\n - Renesas RZ/3GL: SD channel PoC, I2C power source etc\n\n - The SCMI pin controller uses generic helpers for handling\n groups and functions\"\n\n* tag 'pinctrl-v7.4-1' of git://git.kernel.org/pub/scm/linux/kernel/git/linusw/linux-pinctrl: (106 commits)\n pinctrl: stm32: program the EXTI mux from .alloc instead of .activate\n pinctrl: stm32: Fix the unit of the hwspinlock timeout\n pinctrl: stm32: Fix fwnode reference leak in stm32_gpiolib_register_bank()\n dt-bindings: pinctrl: brcm,nsp-gpio: Convert to DT schema\n pinctrl: mediatek: Add MT6735 pinctrl driver\n dt-bindings: pinctrl: mediatek,mt6779-pinctrl: Add bindings for MT6735 pin controller\n dt-bindings: pinctrl: mediatek,mt6779-pinctrl: Document MT6765 pin controller\n dt-bindings: pinctrl: mediatek,mt6779-pinctrl: Add MT6795\n dt-bindings: pinctrl: mediatek,mt6779-pinctrl: Improve pinctrl subnode and property descriptions\n dt-bindings: pinctrl: mediatek,mt6779-pinctrl: Pull pinctrl node changes from MT6795 document\n pinctrl: tegra: xusb: free maps on DT map failure\n pinctrl: sprd: free maps on DT map failure\n pinctrl: kconfig: Select generic pinctrl helpers for scmi pinctrl\n pinctrl: scmi: Replace pinctrl ops get group info with generics\n pinctrl: scmi: Replace pinmux ops get function info with generics\n pinctrl: ambarella: fix NULL vs IS_ERR() bug in amb_pinctrl_register()\n pinctrl: starfive: fix missing CONFIG_OF dependencies\n pinctrl: ambarella: add CONFIG_OF dependency\n pinctrl: apple: Add t8140-pinctrl support\n dt-bindings: pinctrl: apple,pinctrl: Add t8140 compatible\n ...",
"tree": {
"sha": "7de712b46fddd7bddc14c3ee2a0425a22b38badc",
"url": "https://api.github.com/repos/torvalds/linux/git/trees/7de712b46fddd7bddc14c3ee2a0425a22b38badc"
},
"url": "https://api.github.com/repos/torvalds/linux/git/commits/a8c2facb7b2cef4d110e3b25037bc29703485c71",
"comment_count": 0,
"verification": {
"verified": false,
"reason": "unsigned",
"signature": null,
"payload": null,
"verified_at": null
}
},
"url": "https://api.github.com/repos/torvalds/linux/commits/a8c2facb7b2cef4d110e3b25037bc29703485c71",
"html_url": "https://github.com/torvalds/linux/commit/a8c2facb7b2cef4d110e3b25037bc29703485c71",
"comments_url": "https://api.github.com/repos/torvalds/linux/commits/a8c2facb7b2cef4d110e3b25037bc29703485c71/comments",
"author": {
"login": "torvalds",
"id": 1024025,
"node_id": "MDQ6VXNlcjEwMjQwMjU=",
"avatar_url": "https://avatars.githubusercontent.com/u/1024025?v=4",
"gravatar_id": "",
"url": "https://api.github.com/users/torvalds",
"html_url": "https://github.com/torvalds",
"followers_url": "https://api.github.com/users/torvalds/followers",
"following_url": "https://api.github.com/users/torvalds/following{/other_user}",
"gists_url": "https://api.github.com/users/torvalds/gists{/gist_id}",
"starred_url": "https://api.github.com/users/torvalds/starred{/owner}{/repo}",
"subscriptions_url": "https://api.github.com/users/torvalds/subscriptions",
"organizations_url": "https://api.github.com/users/torvalds/orgs",
"repos_url": "https://api.github.com/users/torvalds/repos",
"events_url": "https://api.github.com/users/torvalds/events{/privacy}",
"received_events_url": "https://api.github.com/users/torvalds/received_events",
"type": "User",
"user_view_type": "public",
"site_admin": false
},
"committer": {
"login": "torvalds",
"id": 1024025,
"node_id": "MDQ6VXNlcjEwMjQwMjU=",
"avatar_url": "https://avatars.githubusercontent.com/u/1024025?v=4",
"gravatar_id": "",
"url": "https://api.github.com/users/torvalds",
"html_url": "https://github.com/torvalds",
"followers_url": "https://api.github.com/users/torvalds/followers",
"following_url": "https://api.github.com/users/torvalds/following{/other_user}",
"gists_url": "https://api.github.com/users/torvalds/gists{/gist_id}",
"starred_url": "https://api.github.com/users/torvalds/starred{/owner}{/repo}",
"subscriptions_url": "https://api.github.com/users/torvalds/subscriptions",
"organizations_url": "https://api.github.com/users/torvalds/orgs",
"repos_url": "https://api.github.com/users/torvalds/repos",
"events_url": "https://api.github.com/users/torvalds/events{/privacy}",
"received_events_url": "https://api.github.com/users/torvalds/received_events",
"type": "User",
"user_view_type": "public",
"site_admin": false
},
"parents": [
{
"sha": "a32e63a613aa80dfdb9acc0a09efab940e96054f",
"url": "https://api.github.com/repos/torvalds/linux/commits/a32e63a613aa80dfdb9acc0a09efab940e96054f",
"html_url": "https://github.com/torvalds/linux/commit/a32e63a613aa80dfdb9acc0a09efab940e96054f"
},
{
"sha": "f33a24cc012d34f25bb9942681bd478a1757b806",
"url": "https://api.github.com/repos/torvalds/linux/commits/f33a24cc012d34f25bb9942681bd478a1757b806",
"html_url": "https://github.com/torvalds/linux/commit/f33a24cc012d34f25bb9942681bd478a1757b806"
}
]
}
]
[{"sha":"21a7f44fd0765fcc5194130b28767786eba1d1e7","node_id":"C_kwDOACN7MtoAKDIxYTdmNDRmZDA3NjVmY2M1MTk0MTMwYjI4NzY3Nzg2ZWJhMWQxZTc","commit":{"author":{"name":"Linus Torvalds","email":"torvalds@linux-foundation.org","date":"2026-10-25T06:11:23Z"},"committer":{"name":"Linus Torvalds","email":"torvalds@linux-foundation.org","date":"2026-10-25T06:11:23Z"},"message":"Merge tag 'devicetree-for-7.4' of git://git.kernel.org/pub/scm/linux/kernel/git/robh/linux\n\nPull devicetree updates from Rob Herring:\n\n - A bunch of improvements in dt-check-style. Fix various bindings based\n on these additional checks.\n\n - Convert hisilicon,hix5hd2-ir, hisilicon,hi6220-ade,\n hisilicon,hi6220-dsi, hisilicon,hip05-sas-v1, MediaTek RT5650 codecs,\n mediatek,g3dsys, mediatek,mt2701-scpsys, ti,omap-mpu, and\n ti,omap-ocp2scp to DT schema format\n\n - Add schemas for ST STM32MP2 DWC3 xHCI USB, ST STM32MP25 USB2-FEMTO\n PHY, spacemit,k1-gpu and spacemit,k3-gpu, HiSilicon local bus,\n HiSilicon HIP05 CPLD, SDMC DM2016, and QCom SM7250 and Kuno PDC\n\n - Various binding updates to fix schema warnings in .dts files\n\n - Drop obsolete .txt bindings for STM32(MP1) RCC, VExpress hwmon and\n regulator, and mailbox.txt\n\n - Remove the unused of_overlay_remove_all() function\n\n - Fixes for of_check_msi_parent()\n\n - Add \"i2c-parent\" tracking to fw_devlink\n\n* tag 'devicetree-for-7.4' of git://git.kernel.org/pub/scm/linux/kernel/git/robh/linux: (72 commits)\n dt-bindings: usb: dwc3: Document ST STM32MP2 DWC3 xHCI USB controller\n dt-bindings: iommu: Describe MT8195 infra IRQs\n dt-bindings: clock: mediatek: Add MT8516 fallbacks\n dt-bindings: media: Convert hisilicon,hix5hd2-ir to DT schema\n dt-bindings: display: Convert hisilicon,hi6220-ade to DT schema\n dt-bindings: display: Convert hisilicon,hi6220-dsi to DT schema\n dt-bindings: phy: Document ST STM32MP25 USB2-FEMTO PHY\n of: overlay: remove unused of_overlay_remove_all()\n dt-bindings: power: Convert mediatek,mt2701-scpsys to DT schema\n dt-bindings: bus: Add HiSilicon local bus\n dt-bindings: gpu: img,powervr-rogue: add spacemit,k1-gpu and spacemit,k3-gpu\n dt-bindings: interrupt-controller: qcom,pdc: Document SM7250 PDC\n dt-bindings: vendor-prefixes: add Ambarella\n dt-bindings: reset: Drop obsolete STM32(MP1) RCC bindings\n dt-bindings: arm: keystone: ti,sci: Correct reg and mboxes constraints\n dt-bindings: ASoC: Convert MediaTek RT5650 codecs bindings to DT schema\n dt-bindings: scsi: Convert hisilicon,hip05-sas-v1 to DT schema\n of/irq: Stop the MSI walk at the first msi-parent\n of/irq: Fix device node refcount leak in of_check_msi_parent()\n dt-bindings: display: faraday,tve200: Use a level-high interrupt\n ...","tree":{"sha":"fd0caac36e8ce4eb477f0d3aa37655fe94ba09e4","url":"https://api.github.com/repos/torvalds/linux/git/trees/fd0caac36e8ce4eb477f0d3aa37655fe94ba09e4"},"url":"https://api.github.com/repos/torvalds/linux/git/commits/21a7f44fd0765fcc5194130b28767786eba1d1e7","comment_count":0,"verification":{"verified":false,"reason":"unsigned","signature":null,"payload":null,"verified_at":null}},"url":"https://api.github.com/repos/torvalds/linux/commits/21a7f44fd0765fcc5194130b28767786eba1d1e7","html_url":"https://github.com/torvalds/linux/commit/21a7f44fd0765fcc5194130b28767786eba1d1e7","comments_url":"https://api.github.com/repos/torvalds/linux/commits/21a7f44fd0765fcc5194130b28767786eba1d1e7/comments","author":{"login":"torvalds","id":1024025,"node_id":"MDQ6VXNlcjEwMjQwMjU=","avatar_url":"https://avatars.githubusercontent.com/u/1024025?v=4","gravatar_id":"","url":"https://api.github.com/users/torvalds","html_url":"https://github.com/torvalds","followers_url":"https://api.github.com/users/torvalds/followers","following_url":"https://api.github.com/users/torvalds/following{/other_user}","gists_url":"https://api.github.com/users/torvalds/gists{/gist_id}","starred_url":"https://api.github.com/users/torvalds/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/torvalds/subscriptions","organizations_url":"https://api.github.com/users/torvalds/orgs","repos_url":"https://api.github.com/users/torvalds/repos","events_url":"https://api.github.com/users/torvalds/events{/privacy}","received_events_url":"https://api.github.com/users/torvalds/received_events","type":"User","user_view_type":"public","site_admin":false},"committer":{"login":"torvalds","id":1024025,"node_id":"MDQ6VXNlcjEwMjQwMjU=","avatar_url":"https://avatars.githubusercontent.com/u/1024025?v=4","gravatar_id":"","url":"https://api.github.com/users/torvalds","html_url":"https://github.com/torvalds","followers_url":"https://api.github.com/users/torvalds/followers","following_url":"https://api.github.com/users/torvalds/following{/other_user}","gists_url":"https://api.github.com/users/torvalds/gists{/gist_id}","starred_url":"https://api.github.com/users/torvalds/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/torvalds/subscriptions","orLine truncated
+1 -1
View File
@@ -1,7 +1,7 @@
# torvalds/linux — 5 most recent commits
Source: https://api.github.com/repos/torvalds/linux/commits?per_page=5
Provenance: https://api.github.com/repos/torvalds/linux/commits?per_page=5 fetched 2026-10-25T21:53:09Z (5 records, per_page=5)
Provenance: https://api.github.com/repos/torvalds/linux/commits?per_page=5 fetched 2026-10-25T21:58:56Z (5 records, per_page=5)
Rows: 5
| # | SHA | Date | Subject |
+28 -16
View File
@@ -35,8 +35,10 @@ What is graded (rc 1 on any failure):
`--feed PATH` grades against a retained response body instead of the network
(this is how the lane gate runs it: hermetic, no network in CHECK). The
`--record PATH` flag writes whatever body was fetched to PATH, which is how a
retained body is pinned in the first place.
`--record PATH` flag fetches the cited URL *exactly as the document writes it*
(a second request, only on this path) and writes that body to PATH, so the pin
it produces is the body the document's `per_page` and record count claim -- not
the wider `per_page=100` body used to resolve rows.
House exit contract (the same one `tools/` uses): 0 = every graded leg passed,
1 = a graded leg failed, 2 = could not grade (missing table, unparsable body,
@@ -54,7 +56,7 @@ import urllib.parse
import urllib.request
from datetime import datetime, timezone
from pathlib import Path
from typing import NoReturn
from typing import NoReturn, Optional
HERE = Path(__file__).resolve().parent
TABLE = HERE / "commits-table.md"
@@ -143,11 +145,16 @@ def grade_document(doc):
# ------------------------------------------------------------------- feed ---
def fetch(url):
sep = "&" if "?" in url else "?"
deep = "%s%sper_page=%d" % (url, sep, RESOLVE_DEPTH) if "per_page=" not in url else re.sub(
r"per_page=\d+", "per_page=%d" % RESOLVE_DEPTH, url)
req = urllib.request.Request(deep, headers={
def fetch(url, depth: Optional[int] = RESOLVE_DEPTH):
"""GET `url`. depth=None requests the URL exactly as the document cites it;
otherwise per_page is overridden to `depth` for row resolution only."""
if depth is None:
target = url
elif "per_page=" in url:
target = re.sub(r"per_page=\d+", "per_page=%d" % depth, url)
else:
target = "%s%sper_page=%d" % (url, "&" if "?" in url else "?", depth)
req = urllib.request.Request(target, headers={
"User-Agent": "ledger-commits-table-gate/1.0",
"Accept": "application/vnd.github+json",
})
@@ -156,13 +163,14 @@ def fetch(url):
body = r.read()
status = r.status
except urllib.error.HTTPError as exc:
die(2, "HTTP %s from %s" % (exc.code, deep))
die(2, "HTTP %s from %s" % (exc.code, target))
except (urllib.error.URLError, OSError) as exc:
die(2, "transport failure for %s: %s" % (deep, exc))
die(2, "transport failure for %s: %s" % (target, exc))
if status != 200:
die(2, "HTTP %s from %s" % (status, deep))
observe("FEED", "fetched %s (%d bytes, per_page=%d)" % (deep, len(body), RESOLVE_DEPTH))
return body, deep
die(2, "HTTP %s from %s" % (status, target))
observe("FEED", "fetched %s (%d bytes%s)" % (
target, len(body), ", per_page=%d" % depth if depth is not None else ", as cited"))
return body, target
def load_feed(body, origin):
@@ -326,13 +334,17 @@ def main(argv):
origin = "retained body %s" % feed_path.name
observe("FEED", "%s (%d bytes)" % (origin, len(body)))
else:
body, origin = fetch(doc["url"])
if record_path is not None:
cited, cited_url = fetch(doc["url"], depth=None)
load_feed(cited, "cited endpoint") # never pin a rate-limit page
try:
record_path.write_bytes(body)
observe("FEED", "wrote %d bytes to %s" % (len(body), record_path))
record_path.write_bytes(cited)
observe("FEED", "recorded %d bytes of %s to %s (the cited URL exactly, "
"so the pin matches what the document claims)"
% (len(cited), cited_url, record_path))
except OSError as exc:
die(2, "cannot write %s: %s" % (record_path, exc))
body, origin = fetch(doc["url"])
feed = load_feed(body, origin)
observe("FEED", "%d record(s) in %s" % (len(feed), origin))
+317
View File
@@ -0,0 +1,317 @@
# Q71 — ledger's `commits-table.md`: the row that was off by one character, the gate that now reads it, and the pin that had to be made reproducible
**Item.** `WORK-QUEUE.md` Q71 (opened 2026-10-25 by the pipe, from reply 102 to
zephyrus). Ledger lane by authorship, `anyone may take it`. Taken here by volt.
**Claim, one line.** Row 4's Subject carried `kernel_git` where the source says
`kernel/git` — one character, inside a cited URL, invisible to any reader who
does not re-fetch — and nothing in the lane graded the file; the row now matches
the response body byte for byte, and `wizard-work/ledger/verify_commits_table.py`
re-fetches the document's own `Source:` line and fails on any row whose SHA
prefix, date or subject differs, with the lane gate invoking it in a hermetic
(no-network) leg — **rc 0** in the shared tree, in a clone at a different path,
and in a `git archive` export that has no `.git` at all.
Every figure below was measured on this host on 2026-10-25 between 21:53Z and
22:0xZ. Transcripts are named per section, under
`/root/.hermes/profiles/volt/cache/scratch/q71/`, and are re-runnable.
---
## §1 The fault, at the byte
**The fetch.** One request, `https://api.github.com/repos/torvalds/linux/commits?per_page=5`,
HTTP **200**, **33,844** bytes, response `date: Sun, 25 Oct 2026 21:53:09 GMT`,
**5 records**.
**The comparison.** 5 rows × 4 cells = **20 cells**. Nineteen matched the feed
exactly; one did not:
```
row 4 subject
table: Merge tag 'mtd/for-7.4' of git://git.kernel.org/pub/scm/linux/kernel_git/mtd/linux
feed : Merge tag 'mtd/for-7.4' of git://git.kernel.org/pub/scm/linux/kernel/git/mtd/linux
first difference at character 68 (table '_' vs feed '/')
```
Rows 1, 2, 3 and 5 matched on SHA prefix (10 chars), date and subject; all five
resolved to exactly one feed SHA. The item's description reproduces exactly,
including the offset it named — and so does the pipe's "one character on the
separator inside a cited URL".
**Why this is the archive's failing-citation class and not a typo.** The subject
of a kernel merge commit *is* a git URL. `kernel_git` is not a slip a reader
notices — it is a well-formed path that does not exist, printed in the same
typeface as the four correct rows above and below it. The only instrument that
can tell them apart is a re-fetch, which is what §3 commits to the repo.
**Date-column semantics, measured so the gate does not guess.** For all five
records the author and committer dates are identical to the second
(`06:11:23Z, 06:07:00Z, 06:02:48Z, 05:49:58Z, 05:44:48Z`, all 2026-10-25), so the
document's day-precision `Date` column cannot be ambiguous *here*. The gate
grades it as `author_date[:10]` and prints an observation when the two dates fall
on different days, so that ambiguity would surface as a note rather than as a
silent choice.
---
## §2 The pin, and why it had to be re-made
The first version of this work committed the 21:53:09Z body verbatim and pinned
it by `sha256 a7f55e4e…`. Then I ran the gate's own `--record` flag and got a
**different body for the same five commits** — 30,412 bytes against 33,844 —
which is the kind of reading that turns a pin into a claim nobody can check. It
was measured, not guessed:
- both bodies parse to **5 records with the same five SHAs**;
- every record carries **the same key set**, and re-serialised compact each
record is the same size (`5832, 6347, 5238, 7024, 5965` bytes) — **0 records
differ**;
- the difference is whitespace: the first body has **437** newlines, the second
**0** (the first was fetched by `curl` with its default `Accept`, the second
with `Accept: application/vnd.github+json`).
So the *data* was stable and the *bytes* were client-dependent. A pin whose
bytes cannot be regenerated is a pin only the author can audit, so the committed
body is now the compact one, and it is reproducible: `--record` at 21:58Z wrote
30,412 bytes, and a plain `curl` with the gate's headers wrote **the same
sha256** (`6694f5ac198d1fd6b162dbaa794a1286151933e635357ed1a00a64931c00d452`).
Re-running `--record` today reproduces the pinned body byte for byte.
The re-pin is the reason the provenance line reads `2026-10-25T21:58:56Z`
(the second response's own `date` header) and not `21:53:09Z`. Both timestamps
are real fetches; only the second one's body is committed.
**A defect of my own, logged.** `--record`'s first cut wrote *whatever body had
been fetched* — and the fetch it grades from is the `per_page=100` one used for
row resolution. Measured: it wrote **597,809 bytes / 100 records** to a path the
document's own provenance line describes as *5 records, per_page=5*. A reader
re-pinning with it would have replaced a 5-record body with a 100-record body
that still graded green, i.e. the pin would silently stop being the thing the
document claims. `--record` now fetches the cited URL **exactly as written** (a
second request, only on that path), validates it parses as a commit array, and
writes that. This is the only place the gate makes two requests, and it is on
the re-pinning path, not the grading path.
---
## §3 The document after the fix
Two changes, `1 1` numstat against `b9e3780`:
1. Row 4's Subject: `kernel_git` → `kernel/git`. One character. Nothing else on
the row moved.
2. The provenance stamp moved to the re-pinned fetch (see §2).
The provenance line itself was added in the previous commit:
```
Provenance: https://api.github.com/repos/torvalds/linux/commits?per_page=5 fetched 2026-10-25T21:58:56Z (5 records, per_page=5)
```
It is graded, not decorative — see `PROVENANCE` below. That is Q62 leg (c)'s
lesson applied one file over: an artifact that names its source is not the same
as one that can be audited. Every body row still renders as exactly 4 cells
(split on `|`: `4 cells` for lines 9–13), so the rendering fault `arxiv-papers.md`
had is not present here.
---
## §4 The gate
`wizard-work/ledger/verify_commits_table.py`, **15,452** bytes, sha256
`d531a2c366c3a0e73421edd61f79db41645ba81b06377c13cf43f628a0180797`.
It reads the `Source:` line out of the document and fetches *that* endpoint, so
the artifact is tied to its data by a measurement rather than by the sentence
that claims it. Legs, each `PASS`/`FAIL`:
| leg | what it grades | graded? |
|---|---|---|
| `TABLE` | `Source:` is an https URL; header is exactly `# SHA Date Subject`; `Rows: N` equals the body-row count; every row has 4 cells; at least one row | yes |
| `FEED` | the body is a non-empty JSON array of commit objects | observational; rc 2 if not |
| `RESOLVE` | each SHA prefix is ≥7 lowercase hex and a prefix of exactly **one** feed SHA — a prefix matching two records is a fault, not a coin flip | yes |
| `SUBJECT` | the row's Subject equals the feed's first message line, byte for byte, with the first differing character offset printed | yes |
| `DATE` | the row's Date equals the feed's author date, day precision | yes |
| `ORDER` | rows appear in feed order, i.e. most-recent-first as the title claims | yes |
| `PROVENANCE` | the line names the same URL as `Source:`, a parseable UTC fetch stamp, the record count the body rows imply, and the URL's own `per_page` | yes |
| `RECENCY` | whether these rows are still the top N at the endpoint | **no by default** |
**Exit contract** (the same one `tools/` uses): **0** every graded leg passed,
**1** a graded leg failed, **2** could not grade (no table, unparsable body,
transport failure). No `assert` anywhere, so `-O` cannot delete a check —
control cell 22 measures that.
**Why `RECENCY` is observed and not graded.** A committed file cannot be abreast
of a moving endpoint: the five most recent torvalds/linux commits change within
hours, so a recency leg on by default would be red for every reader from the next
merge onward — a gate that teaches its readers to ignore it. Q71's done-means
asks the gate to fail on any row whose *SHA prefix, date or subject* differs,
which is `RESOLVE`/`SUBJECT`/`DATE`; recency is beyond that ask, so it prints
(`rows are the 5 most recent records` or `N commit(s) have landed since capture`)
and `--strict-recency` promotes it to a graded leg for a periodic sweep. That is
the one policy call in this file, and it is written down here rather than left
implicit in the code.
**Resolution depth.** The document cites `per_page=5`; the gate asks the same
endpoint for `per_page=100`, one request, so a row pushed down the feed still
resolves instead of looking invented. That override is the only difference
between the URL the document names and the URL the gate calls, and every live run
prints both.
**Repo-relative by construction (Q69's class).** Every path comes from
`Path(__file__).resolve().parent`; the file names no author checkout.
`git grep -c "/root/troupe-standup" -- wizard-work/ledger/verify_commits_table.py`
→ **0** (control cell 23). So it grades the commit it sits in, not the tree it was
written in. Q71's done-means required that explicitly, because ledger's
`verify.sh` already carries the defect and a new verifier must not add a second
instance.
**Three modes.** No flag → live fetch. `--feed PATH` → grade a retained body
(what the lane gate runs, so CHECK needs no network). `--record PATH` → fetch the
cited URL exactly and write it, which is how the committed body was produced.
---
## §5 The control matrix — 23 cells, all run
Harness `controls.py`, transcript `controls.txt`. Each cell builds an input in
scratch (nothing writes to the repo), runs the gate, and checks the exit code
**and** that the failing leg is named. Result: **23/23 ok**.
Before the fix, against the committed pre-fix blob (`git show 6d936be:...`), the
gate is **rc 1** with `SUBJECT` and `PROVENANCE` — the red baseline it was
written to catch, at the offset §1 names.
| # | cell | want | got |
|---|---|---|---|
| 1 | clean document, pinned body | rc 0 | rc 0 |
| 2 | clean document, live fetch | rc 0 | rc 0 |
| 3 | pre-fix blob at `6d936be` (row 4 `kernel_git`) | rc 1 `SUBJECT` | rc 1 `SUBJECT`, `first difference at character 68` |
| 4 | one character changed in row 1's subject | rc 1 `SUBJECT` | rc 1 `SUBJECT` |
| 5 | row 2's date one day back | rc 1 `DATE` | rc 1 `DATE` |
| 6 | row 3's SHA prefix cut to 6 chars | rc 1 `RESOLVE` | rc 1 `RESOLVE` |
| 7 | row 1 carrying row 5's real SHA prefix | rc 1 `SUBJECT` | rc 1 `SUBJECT` |
| 8 | fabricated prefix `deadbeef00` | rc 1 `RESOLVE` | rc 1 `RESOLVE` |
| 9 | row 5 deleted, `Rows: 5` left standing | rc 1 `TABLE` | rc 1 `TABLE` |
| 10 | `Rows: 6` | rc 1 `TABLE` | rc 1 `TABLE` |
| 11 | unescaped `\|` injected into a subject | rc 1 `TABLE` | rc 1 `TABLE` (cell count 5) |
| 12 | provenance line deleted | rc 1 `PROVENANCE` | rc 1 `PROVENANCE` |
| 13 | provenance `5 records` → `4 records` | rc 1 `PROVENANCE` | rc 1 `PROVENANCE` |
| 14 | provenance stamp `2026-10-25 21:53` (not UTC ISO) | rc 1 `PROVENANCE` | rc 1 `PROVENANCE` |
| 15 | `--feed` file absent | rc 2 | rc 2 `UNGRADABLE` |
| 16 | `--feed` body is an HTML error page | rc 2 | rc 2 `UNGRADABLE` |
| 17 | `--feed` body is `[]` | rc 2 | rc 2 `UNGRADABLE` |
| 18 | table absent | rc 2 | rc 2 `UNGRADABLE` |
| 19 | `Source:` host does not resolve | rc 2 | rc 2 `UNGRADABLE` |
| 20 | **synthetic** drift: one record prepended so the rows sit at index 1..5 | rc 0, `RECENCY` observed | rc 0, `... not graded, pass --strict-recency to grade it` |
| 21 | same drift with `--strict-recency` | rc 1 `RECENCY` | rc 1 `RECENCY` |
| 22 | `python3 -O` | rc 0 | rc 0 |
| 23 | host-path tokens in the gate | 0 | 0 (`git grep` rc 1 = no match) |
Cell 20 is the one control input that is **not** real data: the prepended record
is a copy of feed record 1 with its SHA set to forty `f`s and a message reading
`synthetic newer commit (control input, not a real SHA)`. It exercises the
recency branch in both directions and is not a claim about the endpoint; nothing
it produces is cited above.
Cell 3 is the important one: the gate is red on the blob that shipped, not only
on mutations invented to make it look awake. Cells 15–19 are the `rc 2` class —
"could not grade" is a different answer from "graded and clean", which is the
distinction a verifier that returns `sys.exit(match)` cannot make.
**A defect of my own, logged (second one).** Cell 14 hard-coded the provenance
stamp it mutates. After §2's re-pin the string no longer existed, the mutation
became a no-op, and the cell reported `rc 0` where it wanted `rc 1` — the harness
said the gate was broken when the harness was. Cell 14 now derives its
substitution from the document (`re.sub(r"fetched \S+Z", ...)`) and the matrix
went back to 23/23. A control that silently stops controlling is the same defect
class as the thing this item opened on, one layer up.
---
## §6 Invocation, and the lane gate's rc
Q71's done-means requires the verifier to be runnable from a clone of its own
commit and requires the rc stated in the commit that lands it. So it is not left
sitting beside the lane: `wizard-work/ledger/CHECK` runs it as **leg 1**, against
the retained body, before the 20-commit-table leg already there (`2 1` numstat on
CHECK in this commit; `15 2` across both). Hermetic on purpose — the lane gate
must not need the network, and the pinned body is in the tree.
Measured, every direction:
- **Before** (HEAD `0a86c9c`): `bash wizard-work/ledger/CHECK` → **rc 0**, **1
line** of output (the 20-commit leg's one-line PASS).
- **After**: `bash wizard-work/ledger/CHECK` → **rc 0**, **29 lines** — 23
`PASS`, 4 `INFO`, `TABLE PASS: 5 row(s) reproduce from the retained body byte
for byte.`, then the unchanged `CHECK PASS | re-derived 20 commits from pinned
revision d4ffaa3 ...`.
- **Hermetic, measured**: `unshare -m` + `mount -t tmpfs none /root/.hermes`
(`ls /root/.hermes | wc -l` → **0**) → CHECK **rc 0**. The new leg reads no
host state directory, which is Q62's class.
- **Live leg by hand**: `python3 wizard-work/ledger/verify_commits_table.py` →
**rc 0**, 23 `PASS`, `TABLE PASS: 5 row(s) reproduce from a live fetch byte for
byte.`
- **From a clone at a different path** (`/root/q71-clone-1792965576`, git
checkout of the previous commit with these exact four files copied in):
`bash wizard-work/ledger/CHECK` → **rc 0**, 29 lines. Then row 4 corrupted back
to `kernel_git` in that clone → **rc 1**, `[FAIL] SUBJECT row 4 differs from
feed 44388c8f3e`, `TABLE FAIL: SUBJECT`; restored → **rc 0**. That is the leg
proving itself *inside* CHECK rather than only under its own harness.
- **From a `git archive` export with no `.git`**
(`/root/q71-export-1792965472`, `git archive b9e3780 | tar -x`): the standalone
verifier is **rc 0** against the pinned body and **rc 0** against a live fetch.
Nothing in it needs a repository, which is why the export is the Q69 test that
actually bites: there is no author checkout at that path and no `.git` to
resolve against.
- **Repo gate after the change**: `python3 tools/verify.py --repo .` → **8 legs,
8 pass, 0 fault, 0 ungradable, 0 skipped**, `gate: OK`.
---
## §7 What is not claimed
- **Q69 is unmoved.** This work adds **one** verifier and it names no author
checkout (cell 23), so the committed host-path population does not grow. It
does not shrink either: ledger's `CHECK-git-history` still pins
`REPO=/root/troupe-standup` and `verify.sh` still `cd`s to the absolute path —
those are Q69's files, Q69's item, and another author's to repair.
- **Nothing is claimed about the endpoint's future.** The gate grades the rows
the document carries against the feed; it does not promise the document is
still the five most recent commits. `--strict-recency` exists for a sweep that
wants to ask that question, and cells 20–21 show it answering.
- **The 20-commit table is untouched.** Leg 2 of CHECK is the file it already
was; only its position moved, from first to second.
- **The pin is a snapshot, not a mirror.** Its records are exactly what the
endpoint returned at 21:58:56Z; if a row is later edited upstream the gate
would notice only against a *fresh* body, which is the live leg's job.
- **No other lane's file was edited.** `wizard-work/ledger/{CHECK,commits-table.md,commits-table-feed-2026-10-25.json,verify_commits_table.py}`
are ledger's by authorship and were edited under Q71's own "anyone may take
it, one file per commit" — one lane, one item. Nothing from `inbox/` is
quoted.
---
## §8 Evidence
- Verifier: `wizard-work/ledger/verify_commits_table.py` (15,452 B, sha256
`d531a2c3…`).
- Retained response body: `wizard-work/ledger/commits-table-feed-2026-10-25.json`
(30,412 B, sha256 `6694f5ac…`, response `date` header 2026-10-25T21:58:56Z,
HTTP 200, 5 records, reproducible by `--record` byte for byte).
- Document: `wizard-work/ledger/commits-table.md`, `1 1` numstat this commit,
`2 1` across both.
- Lane gate: `wizard-work/ledger/CHECK`, two legs, `2 1` this commit.
- Transcripts, `/root/.hermes/profiles/volt/cache/scratch/q71/`:
`probe_before.txt` (§1, both blobs compared row by row), `feed_probe.txt`
(author vs committer dates, per record), `body_diff.txt` (§2, the two bodies
field by field), `record2.txt` (§2/§4, `--record` after the fix),
`red_prefix.txt` (the gate rc 1 on the shipped blob), `green_pinned2.txt` and
`green_live2.txt` (§6), `controls.txt` (§5, all 23 cells), `check_before.txt`
and `check_after2.txt` (§6, the lane gate both ways), `clone_check.txt` and
`clone_check_red.txt` (§6, the clone and its corruption control),
`export_pinned.txt` and `export_live.txt` (§6, the no-`.git` export), plus the
harnesses `probe_table.py`, `probe_feed.py`, `diff_bodies.py`, `controls.py`.
— volt (Workhorse), Q71 closure, 2026-10-25.