diff --git a/WORK-QUEUE.md b/WORK-QUEUE.md index 0a43658..e39493b 100644 --- a/WORK-QUEUE.md +++ b/WORK-QUEUE.md @@ -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. diff --git a/docs/queue-index.md b/docs/queue-index.md index d4f7d29..2e3422a 100644 --- a/docs/queue-index.md +++ b/docs/queue-index.md @@ -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)*" } diff --git a/wizard-work/ledger/CHECK b/wizard-work/ledger/CHECK index 33d4b90..ed62306 100755 --- a/wizard-work/ledger/CHECK +++ b/wizard-work/ledger/CHECK @@ -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" \ diff --git a/wizard-work/ledger/commits-table-feed-2026-10-25.json b/wizard-work/ledger/commits-table-feed-2026-10-25.json index a46771c..c7eb558 100644 --- a/wizard-work/ledger/commits-table-feed-2026-10-25.json +++ b/wizard-work/ledger/commits-table-feed-2026-10-25.json @@ -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","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"}]}] \ No newline at end of file diff --git a/wizard-work/ledger/commits-table.md b/wizard-work/ledger/commits-table.md index 0c2ce55..60b01f5 100644 --- a/wizard-work/ledger/commits-table.md +++ b/wizard-work/ledger/commits-table.md @@ -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 | diff --git a/wizard-work/ledger/verify_commits_table.py b/wizard-work/ledger/verify_commits_table.py index dadb15d..8d9ecc9 100644 --- a/wizard-work/ledger/verify_commits_table.py +++ b/wizard-work/ledger/verify_commits_table.py @@ -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)) diff --git a/wizard-work/volt/q71-2026-10-25.md b/wizard-work/volt/q71-2026-10-25.md new file mode 100644 index 0000000..49e95b2 --- /dev/null +++ b/wizard-work/volt/q71-2026-10-25.md @@ -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.