# PANEL P40 — SEAT PX2 · THE EDITIONS SHELF, THE READING BENCH, AND THE INVITATION

**Seat**: PX2 · MACHINE-SCHOLAR, labeled · REVIEW ONLY (this pass wrote nothing to any build layer;
the only files it created are this report and `fleet/done/PX2.done`)
**Date**: 2026-09-04
**Laws applied**: `10-WAQF/skills/deep-audit/SKILL.md` — all 22
**Scope**:
`10-WAQF/build/P35-EDITIONS/editions_inventory.json` · `10-WAQF/framework/p35_editions.py` ·
`10-WAQF/build/P36-BENCH/bench_pack_0{02..11}.json` + `verdict_intake.json` ·
`10-WAQF/framework/p36_p28c.py` · `10-WAQF/build/P32-SHAHADAT/W-M/bench_pack_001.json` ·
`10-WAQF/build/P32-SHAHADAT/W-I/open_invitation.json` · `10-WAQF/build/P32-SHAHADAT/W-F/four_witness_v4.json` ·
`10-WAQF/framework/p34_wa_v2.py` · `10-WAQF/build/P32-SHAHADAT/W-J/wave3_quote_scan.json` ·
`10-WAQF/build/P31-MIZAN/PAGES/P35-EDITIONS--editions_inventory.html`
**Sources measured against**: `00-CORPUS/translations/*.json` (74 + `_manifest.json`) ·
`00-CORPUS/quran.json` · `00-CORPUS/hadith.json` · `00-CORPUS/hadith_shia.json` ·
`00-CORPUS/hadith_sunni_wave3.json`

**Method**: every number in this report was re-derived by this seat from the sealed sources with an
independently written probe, before the layer's own claim was read where possible (I-2 — the
baseline must be independent of the check, or the check cannot fail). Where a probe disagreed with
a layer, the checker was suspected first (LAW 18) — that discipline caught one of my own errors and
is recorded in §4 rather than hidden.

---

## VERDICT

**The DATA is clean. The DECLARATIONS are not. Nothing in this scope is fabricated; four things in
it are misstated on reader-facing artifacts, and one of those is the headline number the seal
itself is being asked to bless.**

The transmission fidelity is the strongest half of this review and should be said first and
plainly. All 74 held editions are profiled, none missing, none invented; a full 74-edition
recomputation of every profile field — language, version string, coverage, declared-empty, median
chars — returned **zero mismatches** against the source files. The Hilali known-positive
**reproduces**: 55:13 is in the 343-verse dual set, Hilali's rendering does carry a dual marker, and
this seat's independent recount of all three English censuses returned 103/50/36 — exactly the
published values. A six-row content-gate across two bench packs matched the sealed Qur'ān and both
hadith oceans **byte-for-byte**, all four text fields, zero drift. All 1,100 bench verdicts are
`PENDING` and untouched. G15 holds: not one ranking or condemnation token appears in the P35 output
or on its published page. And the three invitation answers that are *real* survive the hardest test
in this waqf's own skill file — LAW 16 — each on a run that occurs in exactly one verse of the
Qur'ān.

**But**: the invitation is published as *"9 answered"* on the face of `four_witness_v4.json`, and
the same file's own totals say **681 remaining** off a 684 baseline — which is **3**. Seven verses
are named as answered in `open_invitation.json`; **four of them carry zero witness of any kind** and
are not answered by any measurement in this repo. The P35 layer publishes to the reader, on an HTML
page, a guarantee — *"an English census run without its 55:13 anchor is refused"* — that **no
assertion in the engine enforces**; the only gate is a floor of `>=70` editions and `>=30` languages
against a measured truth of 74 and 55. And the reading bench, whose entire purpose is to carry a
verse–hadith pair to a human scholar for a verdict, **drops the transmitted grading string on 648 of
its 1,100 rows** and declares the absence on none of them.

None of these is a fabrication. Every one is a claim larger than the measurement that backs it, and
three of the four are already published. That is the exact failure class this waqf wrote LAW 5,
LAW 6, LAW 9 and I-1 to stop.

---

## 1. THE OCEAN, MEASURED FIRST (LAW 1)

| Container | Measured by this seat | Layer's claim | |
|---|---|---|---|
| `00-CORPUS/translations/*.json` | 74 editions + 1 manifest = 75 files | 74 profiled | ✅ |
| Distinct `language_iso_code` in sources | 55 | 55 | ✅ |
| P35 profiles | 74 | 74 | ✅ |
| Editions in sources but not profiled | **0** | — | ✅ |
| Profiles with no source file | **0** | — | ✅ |
| E7 pair registry | 9,775 rows | — | — |
| Strong queue (P36 filter, re-derived) | **1,142** | "1,042" (`p36_p28c.py:4`) | ❌ F7 |
| Bench rows packed, packs 001–011 | **1,100** (100 × 11) | — | ❌ F7 |
| Bench rows unpacked | **42** | "the full strong queue … packed" | ❌ F7 |
| Invitation list | 684 entries, 684 distinct | 684 | ✅ |
| Invitation remaining (recomputed live) | **681** | 681 | ✅ |
| Verses that left the invitation set | **3** | "9 answered" | ❌ F1 |

---

## 2. FINDINGS

### F1 — [HIGH] The invitation headline says 9 answered; the artifact's own numbers say 3

**File**: `10-WAQF/build/P32-SHAHADAT/W-F/four_witness_v4.json` · `10-WAQF/framework/p34_wa_v2.py:46`

The law string on the layer's face reads: *"the invitation set SHRINKS only by measured answers —
**9 answered** by waves 3-7, the remaining set listed."* The same file's `totals` reads
`"invitation_remaining": 681`. The baseline is 684. **684 − 681 = 3.**

The "9" is a hand-typed literal inside a prose string at `p34_wa_v2.py:46`. The engine never
computes it, never derives it, and never asserts it against `len(no23)` — the quantity it prints
two lines later. Nothing in the repo produces a set of 9.

This seat re-derived the remaining set from first principles using the same three inputs the engine
uses (`W-A/uncapped_links_per_verse.json`, `E3_sirah_census.json`, `quran.json`) and reproduced
**681 exactly** — the engine's *measurement* is sound. Only its *sentence* is wrong.

```
RECOMPUTED invitation_remaining (live): 681 | file says 681
MEASURED DELTA (684-set verses that now have a witness): 3 ['10:102', '3:115', '6:6']
```

**Severity: HIGH.** This is the number the panel's own charter states as the state of the build
("684→9 answered"). It is a published claim, on a waqf layer, three times larger than the
measurement beneath it. I-1.

---

### F2 — [HIGH] Four of the seven verses named as "answered" carry no witness at all

**File**: `10-WAQF/build/P32-SHAHADAT/W-I/open_invitation.json` → `first_answers.answered`

The layer names seven verses as answered. This seat opened the wave scans (as the charter directs)
and checked each against both the hadith-link layer and the sirah census:

| verse | in the 684 list | W-A hadith links | E3 sirah | wave-scan hit | answered? |
|---|---|---|---|---|---|
| 3:115 | yes | 1 | 0 | wave3 · MusnadAhmad #3760 | ✅ **yes** |
| 6:6 | yes | 1 | 0 | wave3 · MusnadAhmad #11163 | ✅ **yes** |
| 10:102 | yes | 1 | 0 | wave3 · MusnadAhmad #17135 | ✅ **yes** |
| 16:33 | yes | **0** | **0** | **none** | ❌ **no** |
| 32:28 | yes | **0** | **0** | **none** | ❌ **no** |
| 32:29 | yes | **0** | **0** | **none** | ❌ **no** |
| 35:23 | yes | **0** | **0** | **none** | ❌ **no** |

Neither `wave1_quote_scan.json` (1,201 rows) nor `wave3_quote_scan.json` (2,013 rows) contains a
single row for 16:33, 32:28, 32:29 or 35:23. The note beside the list says *"seven answers arrived
by acquisition in one morning (waves 3-6)"* — four of those seven did not arrive.

**Severity: HIGH.** The invitation is the waqf's public statement to the ummah about what its
shelves lack. Declaring a verse answered when nothing answers it is the one error this particular
artifact cannot afford. I-1.

---

### F3 — [HIGH] The 55:13 known-positive is published as an enforced guarantee and enforced by nothing

**File**: `10-WAQF/framework/p35_editions.py:57` and `:63` ·
published at `10-WAQF/build/P31-MIZAN/PAGES/P35-EDITIONS--editions_inventory.html`

The layer's law — printed verbatim **on the reader-facing HTML page**, under the heading *"The law
on this layer's face"* — states: *"known-positive law: an English census run without its 55:13
anchor is refused."*

`grep -n "55:13" framework/p35_editions.py` returns **one line: 57 — the law string itself.** There
is no anchor check anywhere in the engine. The only assertion in the file is:

```python
# p35_editions.py:63
assert len(profiles) >= 70 and len(langs) >= 30
```

That is a bare floor, and it is the exact thing LAW 5 names: *"A floor alone passes false zeroes."*
It is also set far below measured truth in violation of LAW 6 (*"floors are set AFTER measuring, to
the measured truth"*): measured 74 editions and 55 languages, floored at 70 and **30**. A run that
silently lost 25 of 55 languages would print `SELFTEST GREEN`.

Two further facts, both measured:

1. **The anchor itself is true.** 55:13 *is* in the 343-verse dual set, and Hilali's rendering
   (*"Then which of the Blessings of your Lord will you both (jinn and men) deny?"*) does fire the
   dual detector. The known-positive **reproduces** — it is simply never checked.
2. **The law as written would refuse two of the three censuses that were emitted.** Rwwad and
   Saheeh do **not** fire on 55:13 (Saheeh renders it without an English dual marker — which is the
   very phenomenon the census exists to surface). Their censuses were published anyway. So the law
   is not merely unenforced; if it were enforced as written it would be wrong.

**Severity: HIGH.** A guarantee on the face of a published page that the code does not keep. LAW 5,
LAW 6, I-2.

---

### F4 — [HIGH] The reading bench drops the transmitted grade on 648 of 1,100 rows and declares the absence on none

**File**: `10-WAQF/framework/p36_p28c.py:44-47` · all 11 packs

Measured across all 1,100 rows, resolving each row's hadith back to its source record:

```
source rows carrying a grade: 648 | without: 452
pack row keys carry grade field? False
src fieldset ('ar','book','en','grades','hadith_in_book','ur')            307
src fieldset ('ar','author','book',...,'grades','id','matn','sanad',...)  307
src fieldset ('ar','book','en','grades','hadith_in_book')                  34
```

The pack row is built from a fixed nine-key dict (`verse`, `verse_ar`, `verse_en`, `hadith`,
`class`, `tier`, `hadith_ar`, `hadith_en`, `bench_verdict`). `grades` is present on 648 source
records and carried on none. The 452 rows that genuinely have no grade are not declared as
ungraded either.

LAW 9 is unambiguous: *"grading strings are transmitted verbatim with the grader named by the
source; absence of a grade field is declared, never filled."* This layer does neither half. The
harm is concrete and specific to this artifact: `verdict_intake.json` demands a verdict carry *"the
basis (which usul)"* — and the human scholar being asked for that verdict is handed a matn with the
tradition's own grading stripped out of it.

**Severity: HIGH.** LAW 9, on the one layer in this scope that a human is meant to act on.

---

### F5 — [MEDIUM-HIGH] 242 Arabic and 271 English matns are silently truncated at 1,200 characters

**File**: `10-WAQF/framework/p36_p28c.py:46` — `(hr.get("ar") or "")[:1200]`

Measured across the 1,100 packed rows:

| | rows whose source text exceeds 1,200 chars | share |
|---|---|---|
| `hadith_ar` | **242** | 22.0% |
| `hadith_en` | **271** | 24.6% |

Worked example, verified against source — `bench_pack_003.json` row 99, 55:43,
`shia Mujam-al-Ahadith-al-Mutabara-Muhsini #441`:

```
had_ar_len 1200  src_len 2191     (45% of the Arabic matn absent)
had_en_len 1200  src_len 3766     (68% of the English absent)
```

There is no ellipsis, no `truncated: true` flag, no `full_length` field, and no note in the pack's
`_meta`. The row simply stops mid-sentence. The pack's own law says *"readable rows"* — a matn
amputated at an arbitrary byte, with the amputation unmarked, is the opposite. A scholar rendering
`legal-inference` on a report whose second half is missing, with no way to know it is missing,
renders it on a text that does not exist.

**Severity: MEDIUM-HIGH.** Not a fabrication — the retained 1,200 chars are byte-exact — but an
undisclosed mutilation on a quarter of a human-facing bench.

---

### F6 — [MEDIUM] Every layer in this scope carries a `source_sha` that hashes a file which is not its source

**Files**: `p35_editions.py:53`, `p36_p28c.py:49/54/98/104`, `p34_wa_v2.py:21/44` — all `SI._sha(SI.RAW)`
where `sighah_index.py:24` defines `RAW = 00-CORPUS/_morphology_raw.txt`

`editions_inventory.json`, `verdict_intake.json`, all ten bench packs, `four_witness_v4.json`,
X14 and X15 all carry the identical stamp `fbc8744a98b36eb…`. It is the SHA of the **morphology raw
text**. It is not the SHA of the 74 translation files, nor of the E7 registry, nor of the hadith
oceans, nor of anything any of these layers actually read.

The layers admit this themselves in `sources_note`: *"this layer's true sources = 00-CORPUS/
translations/*; source_sha remains the corpus-era stamp."* An honest admission — but it means the
integrity stamp certifies nothing about the certified data. A translation file could be edited and
every SHA in this scope would be unchanged.

**Aggravating**: the published HTML page prints `source_sha fbc8744a98b36edb` in its footer and
**does not carry the `sources_note` caveat at all** (`grep -c sources_note …html` → **0**). The
reader sees a bare provenance hash with the disclaimer removed.

**Severity: MEDIUM.** LAW 11 / provenance. A SHA that does not hash what it appears to hash is worse
than no SHA, because it is trusted.

---

### F7 — [MEDIUM] The "full" strong queue is 1,142; 1,100 are packed; 42 rows have no pack

**File**: `10-WAQF/framework/p36_p28c.py:4` (docstring), `:36` (`for pi in range(1, 11)`), `:108`

Re-deriving the candidate set with the engine's own filter and sort:

```
E7 registry rows: 9775
CAND (P36 filter): 1142
packed 001-011 = 1100 -> UNPACKED TAIL: 42
```

The docstring claims *"the full strong queue (**1,042**) packed in hundreds"*. The queue is **1,142**
— the stated total is wrong by exactly 100 — and the packing is not full: `range(1, 11)` hard-caps
at ten packs, so `cand[1100:1142]` reaches no bench. There is no `bench_pack_012.json`.

The engine's own gate cannot catch this: `assert packs >= 9` (`:108`) against a measured 10 — another
under-set floor (LAW 6). It would pass with pack 011 silently missing.

**Positive, and worth recording**: the packing itself is exact. This seat verified
`pack001 == cand[0:100]` and `pack002 == cand[100:200]` element-for-element in order, and measured
**0 duplicates** across all 1,100 rows and **0 overlap** between pack 001 and packs 002–011.

**Severity: MEDIUM.** 3.7% of the strong queue never reaches a scholar, under a docstring that says
the queue is fully packed.

---

### F8 — [MEDIUM] The published invitation list still contains all seven verses it declares answered

**File**: `10-WAQF/build/P32-SHAHADAT/W-I/open_invitation.json`

```
invitation list len: 684  distinct: 684
answered verses STILL PRESENT in the published 684 list: ['3:115','6:6','10:102','16:33','32:28','32:29','35:23']
declared remaining: 677 | list len: 684
```

The file declares `remaining: 677` but publishes a list of 684 — the list was never shrunk, so every
verse the layer says is answered is still being asked for. Three numbers now exist for one quantity
across two files: **684** (the published list), **677** (`first_answers.remaining`), **681**
(`four_witness_v4.totals`), and the later file reports *more* remaining than the earlier one despite
claiming *more* answers — under a law that says the set *"SHRINKS only by measured answers."*

**Severity: MEDIUM.** Compounds F1 and F2; the reader-facing invitation and its own summary disagree.

---

### F9 — [MEDIUM] A verse leaves the invitation on any link at all, with no tier or class filter

**File**: `10-WAQF/framework/p34_wa_v2.py:16-18` and `:40`

```python
for r in o["registry"]:
    WA.setdefault(r["v"], []).append({...})     # every row, no cls/tier filter
...
w2 = bool(WA.get(k))                            # any link at all
```

The wave-3 registry is 44% `cls: "minimal"` (790 of 2,013) and 89% `tier: T6w3` (1,797 of 2,013),
and none of its rows carries a unique-gram field. A single `minimal`/T6w3 hit is therefore enough to
remove a verse from the waqf's public statement that it holds no witness for that verse. Under LAW
16, a minimal match not shown to contain a gram unique to its verse is a *shared-head candidate*,
not evidence.

**Mitigating, and measured — this seat did not stop at the code path.** All three verses that
actually left the set were tested against every verse skeleton in the Qur'ān:

| verse | run | occurs in N verses | unique? |
|---|---|---|---|
| 3:115 | `كفروهواللهعليمبالمتقين` (22) | 1 | ✅ **YES** |
| 6:6 | `السماعليهممدراراو` (17) | 1 | ✅ **YES** |
| 10:102 | `الذينخلوامنقبلهم` (16) | 1 | ✅ **YES** |

All three pass LAW 16. So the three real answers are **sound**; the gate that admitted them is not.
It is a latent defect, not a live one.

**Severity: MEDIUM.** No wrong verse has left the set yet. The next wave has nothing stopping one.

---

### F10 — [MEDIUM] The dual-marker detector fires on any use of "both"

**File**: `10-WAQF/framework/p35_editions.py:16`

```python
DUAL_RX = re.compile(r"\byou two\b|\bboth of you\b|\bye twain\b|\btwain\b|\byou both\b|\bboth\b", re.I)
```

The final alternative `\bboth\b` subsumes three of the five that precede it and matches every
non-dual English use of "both". Measured contribution:

| edition | published dual count | with generic `both` removed | supplied by generic `both` |
|---|---|---|---|
| english_hilali_khan | 103/343 | 58 | **45 (44%)** |
| english_rwwad | 50/343 | 11 | **39 (78%)** |
| english_saheeh | 36/343 | 9 | **27 (75%)** |

The generic term supplies between 44% and 78% of the signal, and its share varies by a factor of
nearly two across editions. (This seat checked whether the ordering survives: it does — 58 > 11 > 9
preserves 103 > 50 > 36. So no reader is currently misled about relative position, and G15 is not
breached.) But the numbers are published as census facts about editions, and a *"dual marker"* count
that is three-quarters ordinary "both" is not measuring the dual.

**Severity: MEDIUM.** Precision, on a number presented as a measured surface fact.

---

### F11 — [LOW] Docstring says "106-lan"; the measured lan set is 100

**File**: `10-WAQF/framework/p35_editions.py:7`

*"The 343-dual and **106-lan** verse profiles land per edition."* This seat re-derived the lan set
from `tvf_v1.json` with the engine's own predicate: **100**. The layer's own output agrees with the
measurement, not the docstring — every published census reads `xx/100`. The 343-dual figure is
correct (verified: `dual_ayat` set size = 343).

---

### F12 — [LOW] An iyyā census is advertised in the docstring, computed as a dead zero, and never emitted

**File**: `10-WAQF/framework/p35_editions.py:6, 18, 39`

The docstring advertises *"the device census (dual/lan/**iyyā** markers under the known-positive
law)"*. `IYYA_RX` is compiled at `:18`, `y = 0` is assigned at `:39` — and `y` is never incremented,
never read, and never written to output. There is no iyyā census. Dead code advertising a layer that
does not exist.

---

### F13 — [LOW] The bench series is split across two build directories with no pointer

`bench_pack_001.json` lives in `build/P32-SHAHADAT/W-M/` (written by `p32_wm_pack.py`); packs
002–011 live in `build/P36-BENCH/` (written by `p36_p28c.py`). `build/P36-BENCH/` contains no
manifest, no index, and **zero references to P32-SHAHADAT** — an auditor opening the bench directory
sees a numbered series that begins at 002 with nothing explaining the absence. Two engines produce
one logical layer (LAW 11, SINGLE-SOURCE, in spirit).

*Note for the record*: the split is intentional and the docstring says "packs 002-011". The defect
is the missing pointer, not the split.

---

### F14 — [LOW] Two more floors set below measured truth

| assertion | file:line | floor | measured | headroom |
|---|---|---|---|---|
| `len(profiles) >= 70` | `p35_editions.py:63` | 70 | 74 | 4 |
| `len(langs) >= 30` | `p35_editions.py:63` | **30** | **55** | **25** |
| `packs >= 9` | `p36_p28c.py:108` | 9 | 10 | 1 |
| `len(x15) > 3000` | `p36_p28c.py:108` | 3,000 | **5,333** | **2,333** |
| `len(no23) < 690` | `p34_wa_v2.py:50` | 690 | 681 | 9 |

LAW 6. The language floor (30 vs 55) and the X15 floor (3,000 vs 5,333) would each pass a run that
had lost nearly half its output.

---

### F15 — [INFO] `by_language_top` (12) omits two languages that tie at its cut

`totals.by_language_top` lists twelve languages, seven of them with count 2 — but `sw` (swahili_barawani,
swahili_rwwad) and `uz` (uzbek_mansour, uzbek_rwwad) also have 2 and are excluded by
`most_common(12)`'s arbitrary tie-break. Cosmetic; the published page reproduces the same twelve.

### F16 — [INFO] QuranEnc is named once, inside a law string, not as publisher attribution

QuranEnc's terms (carried verbatim in `00-CORPUS/translations/_manifest.json`) require
*"clearly referring to the publisher and the source (QuranEnc.com)"* and *"mentioning the version
number when re-publishing."* **The version condition is fully met** — all 74 version strings are
carried verbatim (see §3). The attribution condition is met only obliquely: the string "QuranEnc"
occurs exactly once in the layer and once on the page, both inside the parenthetical *"version
strings carried (QuranEnc's condition)"*. No translator, publisher line, or source URL appears on
the published page. Registering it, not blocking on it.

---

## 3. THE MECHANICAL TABLE

### P35 — the editions shelf

| # | Check | Method | Result |
|---|---|---|---|
| 1 | Editions held vs profiled | `os.listdir` vs `profiles` keys | **74 / 74**, 0 missing, 0 extra ✅ |
| 2 | `language` vs source `language_iso_code` | all 74 | **0 mismatches** ✅ |
| 3 | `version` vs source `version`, exact string | all 74 | **0 mismatches — verbatim** ✅ |
| 4 | `coverage_verses` vs `len(ayat)` | all 74 | **0 mismatches** ✅ |
| 5 | `declared_empty` vs recomputed empties **and** source `n_empty` | all 74 | **0 mismatches** ✅ |
| 6 | `median_chars_per_verse` recomputed from source text | all 74 | **0 mismatches** ✅ |
| 7 | Distinct languages | recomputed from sources | **55 = 55** ✅ |
| 8 | Deep profile — english_hilali_khan (en, ltr) | field-by-field vs source | ver `1.1.2` verbatim, 6236, 0 empty, median 152.0 ✅ |
| 9 | Deep profile — **urdu_junagarhi (ur, RTL)** | field-by-field vs source | ver `1.1.3` verbatim, 6236, 0 empty, median 109.0 ✅ |
| 10 | Deep profile — **pashto_rwwad (ps, RTL)** | field-by-field vs source | ver `1.0.1` verbatim, 6236, 0 empty, median 98.0 ✅ |
| 11 | Deep profile — chinese_makin (zh) | field-by-field vs source | ver `1.0.2` verbatim, 6236, 0 empty, median 32.0 ✅ |
| 12 | Deep profile — tamil_baqavi (ta) | field-by-field vs source | ver `1.0.1` verbatim, 6236, 0 empty, median 176.0 ✅ |
| 13 | 55:13 present in the 343-verse dual set | `SI.dual_ayat()` | **True** ✅ |
| 14 | **Hilali known-positive reproduces** | independent recount, all 343 | **103/343 = published 103/343** ✅ |
| 15 | Rwwad / Saheeh censuses reproduce | independent recount | **50 and 36 = published** ✅ |
| 16 | 55:13 anchor **enforced** by an assertion | `grep "55:13" p35_editions.py` | **1 hit — the law string only** ❌ **F3** |
| 17 | Selftest is more than a floor | read `:63` | floor only, 70/30 vs 74/55 ❌ **F3, F14** |
| 18 | G15 — ranking/condemnation tokens in JSON | 21-term regex | **NONE** ✅ |
| 19 | G15 — ranking tokens on published page | 21-term regex over stripped HTML | **NONE** ✅ |
| 20 | Non-Latin / RTL text integrity | codepoint inspection | Urdu, Pashto, Chinese, Tamil intact; Hilali `U+00E2` is the edition's own *Allâh* transliteration, not mojibake ✅ |
| 21 | `source_sha` covers the layer's sources | trace `SI.RAW` | hashes `_morphology_raw.txt` ❌ **F6** |
| 22 | Page carries the `sources_note` caveat | `grep -c` | **0** ❌ **F6** |
| 23 | lan set size vs docstring | recomputed from `tvf_v1.json` | 100 vs "106" ❌ **F11** |
| 24 | iyyā census emitted | read `:18,:39` + output | defined, dead, never emitted ❌ **F12** |
| 25 | DUAL_RX precision | with/without generic `both` | 44–78% from generic `both` ❌ **F10** |

### P36 — the reading bench

| # | Check | Method | Result |
|---|---|---|---|
| 26 | Packs present in `P36-BENCH` | `ls` | 002–011 (10 packs); 001 is in P32-SHAHADAT/W-M ⚠️ **F13** |
| 27 | Rows per pack | count | 100 × 10 = 1,000; +100 in pack 001 = **1,100** ✅ |
| 28 | Duplicate rows within 002–011 | key set | **0** ✅ |
| 29 | Overlap between pack 001 and 002–011 | set intersection | **0** ✅ |
| 30 | Packs are exact slices of the sorted queue | `pack001 == cand[0:100]`, `pack002 == cand[100:200]` | **True, in order** ✅ |
| 31 | Strong queue fully packed | re-derive `cand` | 1,142 vs 1,100 packed → **42 unpacked** ❌ **F7** |
| 32 | **Content-gate, pack 003 row 0** — 32:17 · sunni tirmidhi #3197 | 4 text fields vs sources | **ALL BYTE-EXACT** ✅ |
| 33 | **Content-gate, pack 003 row 45** — 55:46 · shia Al-Kafi-Vol-2 #202 | 4 text fields vs sources | **ALL BYTE-EXACT** ✅ |
| 34 | **Content-gate, pack 003 row 99** — 55:43 · shia Mujam-al-Ahadith #441 | 4 text fields vs sources | exact **but truncated 2191→1200 / 3766→1200** ⚠️ **F5** |
| 35 | **Content-gate, pack 009 row 7** — 2:223 · sunni tirmidhi #2978 | 4 text fields vs sources | **ALL BYTE-EXACT** ✅ |
| 36 | **Content-gate, pack 009 row 50** — 33:37 · sunni tirmidhi #3212 | 4 text fields vs sources | **ALL BYTE-EXACT** ✅ |
| 37 | **Content-gate, pack 009 row 88** — 9:115 · shia Al-Kafi-Vol-1 #415 | 4 text fields vs sources | exact, en truncated 1251→1200 ⚠️ **F5** |
| 38 | **Content-gate total** | 6 rows × 4 fields | **6/6 match, 0 fail** ✅ |
| 39 | **PENDING verdicts untouched** | all 1,100 rows | **1,100 `PENDING`, 0 altered** ✅ |
| 40 | `verdict_intake.verdicts` | read | `[]` — schema published, no verdict entered ✅ (as designed) |
| 41 | Silent truncation at 1,200 chars | measure all 1,100 vs source | **242 ar / 271 en** ❌ **F5** |
| 42 | Grades transmitted (LAW 9) | measure all 1,100 vs source | **648 available, 0 carried, 452 absences undeclared** ❌ **F4** |
| 43 | X14 classes / X15 joins | read layers | 1,870 classed / 5,333 joins; floors under-set ⚠️ **F14** |

### The invitation

| # | Check | Method | Result |
|---|---|---|---|
| 44 | Invitation list size / distinctness | count | 684 / 684 distinct ✅ |
| 45 | `invitation_remaining` reproduces | independent re-derivation | **681 = 681** ✅ |
| 46 | Measured delta from the 684 baseline | set difference | **3** — not 9, not 7 ❌ **F1** |
| 47 | **Answer 1 verified in the wave scan** — 3:115 | open `wave3_quote_scan.json` | MusnadAhmad #3760, run 22 · **re-measured run = 22** ✅ |
| 48 | **Answer 2 verified in the wave scan** — 6:6 | open `wave3_quote_scan.json` | MusnadAhmad #11163, run 17 · **re-measured run = 17** ✅ |
| 49 | **Answer 3 verified in the wave scan** — 10:102 | open `wave3_quote_scan.json` | MusnadAhmad #17135, run 16 · **re-measured run = 16** ✅ |
| 50 | LAW 16 uniqueness on all three runs | test run against all 6,236 verse skeletons | **each occurs in exactly 1 verse** ✅ |
| 51 | The other four claimed answers | search both wave scans | **0 rows, 0 links, 0 sirah** ❌ **F2** |
| 52 | List shrunk by the answers | membership test | all 7 still published ❌ **F8** |
| 53 | Invitation gate filters by tier/class | read `p34_wa_v2.py:16-18,40` | no filter; any link suffices ❌ **F9** |

---

## 4. CHECK THE CHECKER (LAW 18) — this seat's own error, recorded

My first content-gate against `hadith_sunni_wave3.json` returned **`hadith found: False` and
`common run = 0` for all three invitation answers** — which, taken at face value, would have been
reported as a fabrication of the three answers and would have blocked the seal on a false charge.

LAW 18 says suspect the checker first. I did, and re-ran the SCHEMA-FIRST probe I had skipped
(LAW 2). The wave-3 corpus is a **dict-of-lists keyed on `num`**; my accessor was matching on `id`,
copied from the accessor that is correct for `hadith.json`. `id` is `None` on every wave-3 row.
Like-for-like re-run vindicated the engine completely: all three hadith present, all three run
lengths reproducing exactly.

Recorded here rather than deleted, because a seat that only publishes the probes that worked is
running the same gate the audit is criticising. The near-miss is also the second independent
confirmation this session that LAW 2 must not be skipped for "just one quick probe."

---

## 5. GAP-HIGHLIGHT — what this commission itself missed (LAW 13)

The owner's standing order is that the audit must name what the audit did not cover.

1. **The panel's own charter carries F1's error.** This seat was briefed to verify "684→9 answered"
   as a *premise*. It is not a premise; it is a false claim, and had I verified only "3 answers by
   opening the wave scans" as instructed, I would have confirmed three real answers and returned
   green while the number nine went unchallenged. **Charters transmit claims. A seat that only
   answers the question asked is the failure mode LAW 13 exists to catch.**
2. **My charter said "packs 001-011"; P36-BENCH holds 002-011.** Had I not gone looking, pack 001
   would have gone unreviewed — as it will for anyone who trusts the directory listing (F13).
3. **71 of 74 editions (96%) receive four surface numbers and no device census at all.** This is
   *honestly declared* ("earned by native review — registered, never guessed") and is the correct
   posture. But a layer titled "the editions inventory" is, in substance, an English-only device
   census with a 74-row length table beside it. No seat in this panel is scoped to say so.
4. **`direction`, `title`, `publisher`, `translator` and `terms` exist on all 74 source records and
   are carried into no profile.** The RTL flag in particular is present in the source and dropped —
   this seat had to read the source to know Urdu and Pashto were RTL at all.
5. **Not verified by this seat, and nobody's scope**: whether the 1,142-row queue's `use` axis
   (`non-liturgical…`) is itself sound — the entire bench inherits E7's `cls`/`tier`/`use` labels
   without this panel re-deriving one of them. The bench is only as good as a filter no seat checked.
6. **Not verified**: the ten pack files were last written 09:04 and read at 09:07 — quiescence
   satisfied (LAW 10) — but `p36_p28c.py` also writes P28-X14/X15 in the same run, and this seat
   reviewed those layers' totals without re-deriving them from the sirah corpora.

---

## 6. WHAT THIS SEAT WOULD REQUIRE BEFORE A SEAL

Ordered by cost, all mechanical, none requiring a rebuild of the data:

| # | Fix | Clears |
|---|---|---|
| 1 | Delete "9 answered" from `p34_wa_v2.py:46`; derive the delta in code and print it | F1 |
| 2 | Cut 16:33, 32:28, 32:29, 35:23 from `first_answers.answered`; state 3, evidenced | F2 |
| 3 | Add a real anchor: `assert DUAL_RX.search(ay["55:13"]["t"])` for Hilali; raise the floors to 74/55 | F3, F14 |
| 4 | Carry `grades` verbatim into the pack row; emit `"grade": null` + a declared-absence note on the 452 | F4 |
| 5 | Add `"truncated": true` + `"full_chars": N` to the 242/271 clipped rows, or raise the cap | F5 |
| 6 | Hash the actual inputs into `source_sha`, or rename the field `corpus_era_stamp` and put `sources_note` on the page | F6 |
| 7 | `range(1, 12)` → pack 012 (42 rows); correct "1,042" to the measured 1,142 | F7 |
| 8 | Shrink the published invitation list to the 681 that remain | F8 |
| 9 | Filter the invitation gate by tier/class, or require a unique gram (LAW 16) | F9 |
| 10 | Drop the bare `\bboth\b` alternative, or report it as a separate weak class | F10 |
| 11 | Correct "106-lan" → 100; delete `IYYA_RX` or implement it; add a pack-001 pointer to P36-BENCH | F11, F12, F13 |

Items 1–5 are the blocking set. Items 6–11 are registrable.

---

## SEAL VERDICT: **SEAL BLOCKED BY: F1 (the "9 answered" headline contradicted by the layer's own 681/684 = 3), F2 (four of seven verses declared answered carry zero witness), F3 (the 55:13 known-positive published on a reader-facing page and enforced by no assertion — floor-only selftest), F4 (transmitted grading dropped on 648 of 1,100 bench rows, absence undeclared on the other 452 — LAW 9), F5 (242 Arabic and 271 English matns silently truncated at 1,200 chars on a human-facing bench)**

The underlying data in this scope is sound and this seat says so without hedging: 74/74 editions
reproduce field-for-field, the Hilali known-positive reproduces exactly, six of six bench rows are
byte-exact against the sealed sources, 1,100 of 1,100 verdicts are untouched, G15 holds on both the
layer and its page, and all three real invitation answers survive LAW 16. **Nothing here is
fabricated.** What is blocked is not the build — it is the sentences printed on top of it. Five
claims are larger than their measurements, three of the five are already published to readers, and
one of them is the number this panel was convened to bless. The eleven fixes above are mechanical
and none touches the data. Re-run this bench after items 1–5 and this seat expects to return
SEAL MAY PROCEED.

---

*PX2 · machine-scholar bench, labeled · human review invited, never waited. Every count above is
re-derivable by running the probes named in the Method line against the sealed sources.*
