# PANEL SITTING — P31 AL-MIZAN THE VERIFICATION PILLAR (9,000 points)
**Window:** SP8 (Opus) — the 90-bench sitting over the P31 plan · 2026-09-03
**Sources read:**
- `10-WAQF/framework/gen_p31.py` — 90 domains + no-omission mapping (full read)
- `10-WAQF/framework/_FRAMEWORK-26400.json` — `_meta` + structure confirmed
- `10-WAQF/build/P30-SIGHAH/D-D9-CERTIFICATION/gap_register.json` — 85 rows + assigned_nodes_P31 (full read)
- `10-WAQF/reviews/PANEL-TAXONOMY-AUDIT.md` — external-taxonomy audit, 18 net rows (full read)
**Method:** adversarial; a clean pass must be earned; EVIDENCE LAW: every claim carries file+line or value
**Verdict at bottom.**

---

## SEAT 1 — COMPLETENESS

*Is ANY science of Quranic Arabic or Quranic verification missing from the 90 domains that the Gap Register or the classical tradition names?*

### Procedure
I assembled the complete list of classical disciplines relevant to Quranic Arabic and Quranic verification from three independent sources: (a) the 85 Gap Register rows, (b) the 9-wing taxonomy in `gen_p31.py` lines 25–191, (c) the classical madrasa curriculum (`'ulum al-Qur'an`, `'ulum al-hadith`, `'ulum al-'arabiyya`). I then looked for gaps in the 90 domains not already named in the register.

### Covered — no finding
The following families are present and fully distributed across Wings 1–9:

| Family | Coverage |
|---|---|
| Tajwid | L1–L3, L5 (madd, nun-sakinah, qalqalah, tafkhim, pausal) |
| Rasm | L4, L6, L7 (waqf signs, ta-marbuta, hamzat wasl/qat') |
| Script features | L8, L9, L10 (muqatta'at, seven ahruf, letter/word counts) |
| Sarf (morphology) | P1–P10 (all major morphological registers) |
| Lexicon | X1–X10 (gharib, wujuh, addad, mu'arrab, jamid/mushtaqq, drift, misreading) |
| I'rab (syntax roles) | S1–S10 (source acquisition, fa'il, five maf'uls, hal/tamyiz, nawasikh, idafa, tawabi', muqaddar, jumla, shart/qasam) |
| Balaghah/subtle constructs | T1–T10 (ma/waw types, la-types, tawkid, hadhf, iltifat, taqdim, ishtighal, damir al-fasl, fawasil) |
| Qira'at & verse-science | R1–R10 (ten-readings source, per-verse alignment, 'add al-ay, waqf/ibtida', Makki/Madani, nasikh/mansukh, muhkam/mutashabih, fada'il, asbab, audio joins) |
| Tafsir scale-up | M1–M10 (marfu', companion, successor strata, sirah placements, dossiers 6236, cross-tradition, TVF qualifier engine, carrier-verdict) |
| Translation verification | V1–V10 (detector suite, language profiles, TVF engine, book-wide TVF, coverage proof) |
| Certification | C1–C10 (gates G18–G25, dimension registers, 30-pillar sweep, collision ratchets, master index, three panel waves, grand certification, seal) |

### Finding F1 — CONFIRMED OMISSION: `'Ilm al-Bayan` (figurative speech register)

**What is missing:** The classical science of figurative speech — majāz (figurative use), istiʿārah (metaphor), tashbīh (simile), kināyah (metonymy) — is absent from all 90 domains AND from all 85 Gap Register rows. `gap_register.json` has no row with family "meaning" or "translation" that names any of these four categories. `gen_p31.py` has no dims entry in any D-tuple referencing them.

**Why it matters for verification:** The Translation Verification File engine (W8/V5, points 24801–24900) promises "per verse, the machine-checkable checklist (form features + fixed senses + required elements + hadhf + differences) any rendering in ANY language is tested against" (`gen_p31.py` line 172). Without a figurative-speech register, the engine cannot detect the most common class of semantic mistranslation: rendering a metaphor as a literal statement.

**Exemplar:** 2:187 `هُنَّ لِبَاسٌ لَّكُمْ` ("they are a garment for you") is a tashbīh mursal (compressed simile with no wajh al-shabah stated). Translations that reduce "garment" to "comfort/covering/protection" are making a figurative-rendering judgment. Without a tashbīh/majāz register per verse, the TVF has no entry to test against. The pillar cannot detect the difference.

**Scope:** Classical works treating this directly include Ibn al-Qayyim's *I'lam al-Muwaqqi'in*, Ibn Qutaybah's *Gharib al-Qur'an wa mushkiluhu*, Suyuti's *Itqan* (section on majaz) and Ibn al-Athir's *al-Mathal al-Sa'ir*. The Gap Register's "Gharib al-Qur'an register" (X1) is not a substitute — gharib registers rare/difficult words, not figurative usage of common ones.

**Required action before execution opens:** Either (a) add a gap register row `"'Ilm al-bayan (majaz/isti'arah/tasybih/kinayah) per verse"` with status ABSENT, priority 1, and assign it to a domain, OR (b) explicitly declare in the pillar's honest-limits section that the TVF does not yet cover figurative-speech rendering — which narrows the "no letter unverifiable" claim.

---

### Marginal finding — Istifhām types not explicitly named

The interrogative-particle science (distinguishing real question / rhetorical / taʿajjub / istinkārī / tamannī via `hal`, `a-`, `man`, `mā`, etc.) is not a named domain. T1 covers "the types of mā" which includes interrogative mā. Whether the `a-` (hamzat al-istifhām used rhetorically) is fully covered by T1–T3 or needs its own entry is a judgment call. Confidence: MEDIUM. Not a FIX-FIRST.

---

## SEAT 2 — PLACEMENT

*Is any register row assigned to a WRONG domain? 12 assignments verified end-to-end.*

### Verification table

For each row I check: gap_register dimension string → domain dims entry → node range → gap_register `assigned_nodes_P31` → all must agree.

Node range derivation: W1/L1 = 17401–17500, L2 = 17501–17600, ..., W2/P1 = 18401–18500, W3/X1 = 19401–19500, W4/S1 = 20401–20500, etc. Each domain is 100 points.

| # | Register dimension | Claimed by domain | Expected range | Register's `assigned_nodes_P31` | Verdict |
|---|---|---|---|---|---|
| 1 | `"Tajwid: madd classes per position"` | L1 · W1 | 17401–17500 | `["17401-17500"]` | ✅ EXACT |
| 2 | `"Tajwid: qalqalah positions"` | L3 · W1 | 17601–17700 | `["17601-17700"]` | ✅ EXACT |
| 3 | `"Tafkhim/tarqiq of ra' and lam"` | L3 · W1 | 17601–17700 | `["17601-17700"]` | ✅ EXACT |
| 4 | `"Waqf signs per position"` | L4 · W1 | 17701–17800 | `["17701-17800"]` | ✅ EXACT |
| 5 | `"Sajdah positions"` | L5 · W1 | 17801–17900 | `["17801-17900"]` | ✅ EXACT |
| 6 | `"Rasm: ta marbuta written open (rahmat/ni'mat...)"` | L6 · W1 | 17901–18000 | `["17901-18000"]` | ✅ EXACT |
| 7 | `"Noun patterns (awzan al-asma')"` | P1 · W2 | 18401–18500 | `["18401-18500"]` | ✅ EXACT |
| 8 | `"Multi-function particle disambiguation (the types of ma, waw, la, min)"` | T1 · W5 | 21401–21500 | `["21401-21500"]` | ✅ EXACT |
| 9 | `"Shart (conditional) structures"` | S10 · W4 | 21301–21400 | `["21301-21400"]` | ✅ EXACT |
| 10 | `"'Add al-ay per-verse school table"` | R3 · W6 | 22601–22700 | `["22601-22700"]` | ✅ EXACT |
| 11 | `"Tafsir-chain evaluation"` | M10 · W7 | 24301–24400 | `["24301-24400"]` | ✅ EXACT |
| 12 | `"Dual-noun & 1st/3rd-person dual detectors"` | V1 · W8 | 24401–24500 | `["24401-24500"]` | ✅ EXACT |

**All 12 placements: correct subject domain, correct node range, register-consistent.**

### Noted placement: Fawasil in Wing 5

`"Fawasil (verse-end rhythm) as a science"` is gap_register family `"verse"` (consistent with qira'at, 'add al-ay, waqf) but is assigned to T10 in Wing 5 (balaghah+nahw bench) → points 22301–22400. The placement is **defensible** — fawasil is primarily a rhetorical/balaghah phenomenon studied by the mufassirun as a literary science, not a reading-transmission science. Wing 5 (balaghah bench) is the better fit over Wing 6 (qira'at/transmission bench). No correction required; noted for the panel.

### Noted placement: Drift and Misreading registers in Wing 3

`"Drift register"` (X9) and `"Misreading register"` (X10) are gap_register family `"meaning"` but placed in Wing 3 (lexicography bench). Drift is a sense-shift phenomenon at the word level — lexicographic. Misreading is a word-level textual error — also lexicographic. The bench is correct even if the family label in the register says "meaning." No correction required.

---

## SEAT 3 — THE OUTCOME-CLAIM LAW

*Does any text overclaim? The pillar may only promise verifiability.*

### Pillar-face statement (gen_p31.py lines 9–11, _meta.v2.0.0)
> "this pillar delivers, for every letter, word and verse, the evidence to CHECK any rendering in any language and to DETECT mistranslation mechanically. It never claims to control a translator's pen — the waqf arms every reader; judgment stays with the scholars."

**Assessment:** CORRECTLY WORDED. Promises CHECK and DETECT, not PREVENT or CORRECT. ✅

### Domain-level scan

| Domain | Mission text (key phrase) | Overclaim? |
|---|---|---|
| W8/V1 | "passive-veil, jussive-denial, emphasis-stack, iltifat, hadhf, the full dual family" — describes a **detector suite** | None |
| W8/V5 | "the machine-checkable checklist… any rendering in ANY language is **tested against**" | None — "tested against" ≠ "guaranteed correct" |
| W8/V10 | "every letter-position of 6,236 ayat **reachable by at least one verification layer — measured, not claimed**" | None — the phrase "measured, not claimed" is explicit hedging |
| W9/C9 | "the whole-pillar sweep: every citation re-verified, **refusal on any failure**" | None — describes a gate, not a truth-claim |

### One nuance worth noting

The **pillar name** — "Al-Mizan — the Verification Pillar: **no letter unverifiable in any language**" — uses an absolute. This is aspirational (the goal state after V10 is done), not a present-tense assertion. The corresponding deliverable (W8/V10) honestly measures coverage rather than assuming it. However, given F1 (the missing 'ilm al-bayan layer), the "no letter unverifiable" name overstates what the current domain set can actually verify for figuratively-phrased verses. This reinforces F1 as a fix-first item — the name is only defensible once the majaz register is either present or its absence is declared in the honest-limits section.

**Overall: No overclaims found in the body text. The name carries conditional over-reach that resolves once F1 is addressed.**

---

## SEAT 4 — STRUCTURE

*Re-derive the six mechanical proofs independently.*

### Proof 1 — COUNTS: len(D) == 90

Independent count from gen_p31.py lines 25–191:

| Wing | Domains | Prefix |
|---|---|---|
| W1 | L1, L2, L3, L4, L5, L6, L7, L8, L9, L10 | 10 |
| W2 | P1, P2, P3, P4, P5, P6, P7, P8, P9, P10 | 10 |
| W3 | X1, X2, X3, X4, X5, X6, X7, X8, X9, X10 | 10 |
| W4 | S1, S2, S3, S4, S5, S6, S7, S8, S9, S10 | 10 |
| W5 | T1, T2, T3, T4, T5, T6, T7, T8, T9, T10 | 10 |
| W6 | R1, R2, R3, R4, R5, R6, R7, R8, R9, R10 | 10 |
| W7 | M1, M2, M3, M4, M5, M6, M7, M8, M9, M10 | 10 |
| W8 | V1, V2, V3, V4, V5, V6, V7, V8, V9, V10 | 10 |
| W9 | C1, C2, C3, C4, C5, C6, C7, C8, C9, C10 | 10 |
| **Total** | | **90** |

`assert len(D) == 90` at gen_p31.py line 197 is backed by this enumeration. **PROOF 1: PASS ✅**

### Proof 2 — CONTIGUITY: points 17401–26400, no gaps

Generator logic (gen_p31.py lines 215–226):
```python
n = 17400
for wing, title, mission, dims in D:   # 90 iterations
    for b in BLOCKS:                    # 10 blocks per domain
        for i in range(10):             # 10 units per block
            n += 1                      # increments by 1 each time
```
Total increments: 90 × 10 × 10 = 9,000. Starting n = 17,400. Final n = 26,400. The `assert n == 26400` at line 227 is correct. No gaps are possible because n is incremented by exactly 1 for every point. **PROOF 2: PASS ✅**

### Proof 3 — 90×100: each domain occupies exactly 100 points

Per the loop structure: for each domain, the inner loops run 10 BLOCKS × 10 units = 100 iterations with n += 1. The `lo = n + 1` captures the start, and after the loops `n = lo + 99`. The assigned range `"%d-%d" % (lo, n)` correctly spans 100 points. **PROOF 3: PASS ✅**

### Proof 4 — PATTERN_A: the block-unit inheritance

BLOCKS (gen_p31.py lines 20–22):
```python
BLOCKS = ["Sources & licences", "The registry", "The Qur'an layer", "The hadith layer",
          "The classical layer", "Graph & cross-links", "Pages, trilingual",
          "Education & print", "Gates & audit", "Panel review & seal"]
```
Exactly 10 blocks. PATTERN_A = 10 blocks × 10 units per domain = 100 points per domain = the same block-structure used in every pillar. This creates a uniform ledger: within any domain, block-unit (1,1) through (10,10) is always the same 10 topics. **PROOF 4: PASS ✅**

### Proof 5 — COVERAGE: 85/85 register dimensions mapped

I counted every dims entry across all 90 domains:

| Wing | Dims entries |
|---|---|
| W1 (L1–L10) | 13 |
| W2 (P1–P10) | 13 |
| W3 (X1–X10) | 10 |
| W4 (S1–S10) | 12 |
| W5 (T1–T10) | 10 |
| W6 (R1–R10) | 11 |
| W7 (M1–M10) | 6 |
| W8 (V1–V10) | 7 |
| W9 (C1–C10) | 3 |
| **Total** | **85** |

85 dims entries cover exactly the 85 unique register rows. Cross-verified against gap_register.json `"named_dimension_gaps": 85`. **PROOF 5: PASS ✅**

### Proof 6 — APPEND-ONLY: 17,400 prior points preserved

gen_p31.py line 195–196:
```python
src = json.load(io.open(os.path.join(HERE, "_FRAMEWORK-17400.json"), ...))
pts = list(src["points"]); assert len(pts) == 17400
```
The 17,400 prior points are loaded, asserted complete, then P31 points are appended. No prior point is modified. The `assert n == 26400` confirms the total. **PROOF 6: PASS ✅**

### Dead-code finding F2

**gen_p31.py lines 209–211:**
```python
STRUCTURAL = {r for r in unmapped if r in (
    "The basmalah's dropped alif",)}
```

This code looks for the short-form string `"The basmalah's dropped alif"` in `unmapped`. But no register row has this short form. The actual register dimension is `"Rasm: the basmalah's dropped alif"` — which is already covered by L6's explicit dims entry `"Rasm: the basmalah's dropped alif"` (exact match in the mapping loop). Therefore `"Rasm: the basmalah's dropped alif"` is in `mapped` before the STRUCTURAL check, and STRUCTURAL is always an empty set. The assertion `assert not (unmapped - STRUCTURAL)` reduces to `assert not unmapped` — which is the correct check, but the STRUCTURAL path is dead. **CORRECTNESS: UNAFFECTED. CODE SMELL: real.** Should be removed or corrected to avoid confusion about intent.

---

## SEAT 5 — SEQUENCING

*Are acquisition domains placed BEFORE their dependents?*

### Critical-path dependencies verified

| Dependency pair | Upstream domain | Downstream domains | Wings in order? |
|---|---|---|---|
| I'rab source → i'rab roles | S1 (W4, domain 1) | S2–S10 (W4, domains 2–10) | ✅ same wing, S1 first |
| I'rab source → subtle constructs | S1 (W4) | T1–T10 (W5) | ✅ W4 before W5 |
| Qira'at source → per-verse alignment | R1 (W6, domain 1) | R2–R10 (W6, domains 2–10) | ✅ same wing, R1 first |
| Waqf-sign layer → pausal forms | L4 (W1, domain 4) | L5 (W1, domain 5) | ✅ same wing, L4 before L5 |
| Waqf-sign layer → waqf/ibtida' quality | L4 (W1) | R4 (W6) | ✅ W1 before W6 |
| Tajwid layers → tajwid per reciter | L1–L3 (W1) | R10 (W6) | ✅ W1 before W6 |
| Tawkid engine → emphasis-stack detector | T4 (W5) | V1 (W8) | ✅ W5 before W8 |
| Hadhf harvest → implied-verb detector | T5 (W5) | V1 (W8) | ✅ W5 before W8 |
| Iltifat register → iltifat rendering detector | T6 (W5) | V1 (W8) | ✅ W5 before W8 |
| TVF engine (V5) → TVF 6,236 (V6) → coverage proof (V10) | V5 (W8, #5) | V6 (#6), V10 (#10) | ✅ same wing, ordered |
| All wings → Gates G18–G25 | W1–W8 | C1 (W9) | ✅ W9 is last wing |
| Panel waves A/B/C | W1–W8 done | C6, C7, C8 (W9) | ✅ W9 is last wing |

**All sequencing checks: PASS ✅**

### Pre-execution sequencing warning (not a plan failure, a planner note)

The 90 domains do NOT explicitly state inter-wing dependencies in their mission text. A planner reading only the domain names could sequence wings in any order. Two specific warnings must accompany execution opening:

1. **R1 (W6/domain 1) is a blocking acquisition.** No qira'at variant work (R2, R3, R4, …) can begin until an open ten-readings source is identified, hashed, and licence-recorded. No fallback is named. This is the single highest-risk sequential dependency in Wing 6.

2. **S1 (W4/domain 1) is a blocking acquisition.** No i'rab roles (S2–S10), no subtle constructs (T1–T10 that depend on role analysis), and no translation detectors (W8 V1 for iltifat/hadhf) can run until an open i'rab al-Qur'an text is acquired and aligned. The gap register entry for `"I'rab ROLES"` says status ABSENT (`gap_register.json` line ~487) and repair_program "acquire/align an open i'rab al-Qur'an source; never author roles ourselves." The word "never author" is a law, not a preference — if no open source is found, the entire S2–S10 and downstream T-family analysis cannot proceed.

---

## SEAT 6 — WHAT MUST CHANGE BEFORE EXECUTION OPENS

| # | Finding | Severity | Action required |
|---|---|---|---|
| **F1** | `'Ilm al-bayan` (majaz/isti'arah/tasybih/kinayah) absent from both the Gap Register (0 rows) and the 90 domains (0 domains). The TVF engine (W8/V5) cannot flag figurative-speech mistranslations without this layer. The pillar name "no letter unverifiable" is weakened. | **FIX-FIRST** | Add gap register row for `"'Ilm al-bayan (majaz/isti'arah/tasybih/kinayah) per verse"` with status ABSENT, priority 1. Assign to either a new W5 subdomain (replacing the empty T2 dims or expanding T8) or explicitly declare in the honest-limits block: "TVF does not yet verify figurative-speech renderings." |
| **F2** | STRUCTURAL exemption set in gen_p31.py lines 209–211 is dead code. Looks for `"The basmalah's dropped alif"` (short form, not in register); actual row `"Rasm: the basmalah's dropped alif"` is already mapped by L6. STRUCTURAL is always empty; the assertion reduces to `assert not unmapped`. | **SHOULD FIX** | Remove the STRUCTURAL block entirely or correct the exemption string to match an actual register row that genuinely needs structural exemption. No correctness impact; code-clarity impact is real. |
| **F3** | X8 "The root-sense lexicon joins" (points 20101–20200, W3/domain 8) has empty dims list `[]`. 100 framework points are generated but no gap register row claims them. The Mufradat path (Raghib al-Isfahani — the foundational Quranic root-sense lexicon) is a real verification dimension not yet registered. | **SHOULD FIX** | Add gap register row `"Root-sense lexicon (Mufradat al-Qur'an) joins per lemma"` status ABSENT, assign to X8 (20101–20200). Without it, X8's 100 points are structurally orphaned from the register. |
| **F4** | W8 detectors (V1–V10) have hard dependencies on W1–W7 being substantially complete first. Not stated in any domain's mission text. R1 and S1 are blocking acquisitions on the critical path with no stated fallback. | **EXECUTION WARNING** | Prepend an execution order note to the pillar's run plan: "Wing 8 is BLOCKED until R1 source is acquired and S1 source is acquired and aligned. Wings 1–7 must be substantially complete before V1 detectors can be calibrated." |
| **F5** | `"Fawasil (verse-end rhythm) as a science"` is gap-register family `"verse"` but placed in Wing 5 (balaghah+nahw bench, T10). Defensible; not a hard error. | **NOTE FOR PANEL** | The panel sitting for Wing 5 should explicitly affirm this placement. No pre-execution change required. |

---

## MECHANICAL PROOFS — SUMMARY TABLE

| Proof | Claim | Independently verified | Result |
|---|---|---|---|
| COUNTS | `len(D) == 90` | 9 wings × 10 domains = 90, enumerated | ✅ PASS |
| CONTIGUITY | Points 17401–26400 without gaps | 90 × 10 × 10 = 9,000 increments from 17400, `assert n==26400` | ✅ PASS |
| 90×100 | Each domain = 100 points | 10 BLOCKS × 10 units per domain, `lo` to `n` = 100 | ✅ PASS |
| PATTERN_A | 10 blocks inherited per domain | BLOCKS list = 10 items, same structure as every prior pillar | ✅ PASS |
| COVERAGE | 85/85 register rows mapped | Counted all dims entries: sum = 85 = gap_register `named_dimension_gaps` | ✅ PASS |
| APPEND-ONLY | 17,400 prior points untouched | `assert len(pts)==17400` before append; generator never edits prior points | ✅ PASS |

---

## 12-PLACEMENT VERIFICATION — SUMMARY

All 12 placements independently confirmed: subject correctly belongs in named domain; node range derived from the generator loop matches the `assigned_nodes_P31` in the register. **0 misplacements found.**

---

## OUTCOME-CLAIM AUDIT — SUMMARY

Body text: no overclaims. CHECKABLE and DETECTABLE, not CONTROLLED or PREVENTED. Pillar name "no letter unverifiable" is aspirational and becomes defensible only after F1 (ilm al-bayan omission) is resolved.

---

## VERDICT

### **FIX-FIRST**

**Numbered findings:**

1. **F1 [COMPLETENESS — FIX-FIRST]** `'Ilm al-bayan` (majaz/isti'arah/tasybih/kinayah) is absent from both the Gap Register and the 90 domains. The TVF engine at W8/V5 cannot detect figurative-speech mistranslations. Must be registered or its absence declared in the honest-limits block before execution of Wing 8 opens.

2. **F2 [STRUCTURE — SHOULD FIX]** gen_p31.py lines 209–211: STRUCTURAL exemption set is dead code. No correctness impact; should be removed before the generator is run again.

3. **F3 [REGISTER — SHOULD FIX]** X8 "The root-sense lexicon joins" has empty dims list. 100 points exist in the framework with no gap register row claiming them. Add a row for the Mufradat path.

4. **F4 [SEQUENCING — EXECUTION WARNING]** W8 detectors blocked on R1 and S1 acquisitions; not stated in domain text. Must be stated in the run plan.

5. **F5 [PLACEMENT — NOTE FOR PANEL]** Fawasil in Wing 5 (balaghah bench) rather than Wing 6 (verse bench) is defensible but should be explicitly affirmed at the Wing 5 panel sitting.

**Clean passes:** Placement (12/12 correct) · Outcome-claim law (body text correct) · All six mechanical proofs (independently re-derived, all PASS) · Sequencing (all wing-level dependencies correctly ordered).

**The plan is structurally sound. One genuine scientific omission (F1) must be resolved — either by adding the `'ilm al-bayan` register or by honest declaration — before the Translation Verification File (Wing 8) can claim full coverage.**

---
*SP8 · 2026-09-03 · `10-WAQF/reviews/PANEL-P31-PLAN.md`*
