# HONESTY BUILD-2 — SET-BUILD, half 2 (450 seats)
## THE HONESTY PANEL OF 2,700 · audit of THE BUILD (the files A–Z)

**Machine-scholar. Labeled.** Every number below is either ✅ VERIFIED (I ran the command and it
returned this), 📊 CALCULATED (arithmetic over verified inputs), or ⚠️ ESTIMATE (a proxy, declared).
Scripts kept at the session scratchpad: `census.py`, `subst.py`, `basenames.py`, `dupcheck.py`,
`stems.py`, `dossier.py`, `domaindirs.py`, `join.py`, `final.py`, `exists.py`, `sample.py`.

**Question answered, verbatim:** *"many of 103200 are just written, they are not implemented —
100% honesty: how many really built, how many pending, how many we can never build."*

**Our mandate:** audit THE BUILD, not THE MAKE and not THE CLAIM. Sample ≥15 artifacts, re-derive
≥5 numbers, verify "206 artifacts / 2,448 substantive files" by our own route.
We sampled **18 artifacts** and re-derived **12 numbers**.

---

## 0. WHAT WE CONFIRMED FIRST (the classifier is not lying about files)

Before finding fault we ran the classifier's own file census by an independent route (full
`os.walk`, exclude `.git`/`__pycache__`, no reuse of its code — it ships none).

| classifier.json says | our independent route says | verdict |
|---|---|---|
| `total_files` 3,861 | **3,874** ✅ VERIFIED | ✅ reconciles exactly: 13 files were created **after** the classifier's 15:04 timestamp (11 fleet mission/log files + `classifier.json` + `artifact_figure.json`) |
| `substantive_files` **2,448** | **2,449** ✅ VERIFIED (non-`fleet/`, ≥512 bytes) | ✅ **CONFIRMED** — off by exactly one, and that one is `classifier.json` itself (2,550 B) |
| `page` 423 | **423** ✅ | ✅ exact |
| `engine` 234 | **234** ✅ | ✅ exact |
| `doc/charter` 158 | **158** ✅ | ✅ exact |
| `review (panel record)` 99 | **99** ✅ | ✅ exact |
| `fleet` 1,204 | **1,215** ✅ | ✅ +11 = this panel's own missions/logs |
| `layer/data` 1,446 + `education layer` 187 + `seal/meta` 87 | our 1,670 + 53 = **1,723**; theirs 1,720 | ✅ reconciles within our coarser seal/education heuristic |

**Finding zero, stated first because honesty runs both ways (I-3):** the classifier's file census is
**sound**. Nothing in this review contests it. Everything below contests what the *node* numbers mean,
and one thing below says the classifier is **too hard** on the build, not too soft.

We also measured the substrate the build stands on: `../00-CORPUS` = **4,877,187,100 bytes across 578
files** ✅ VERIFIED (`du -sb`), plus derived machine indices `_index/hadith.jsonl` 169.8 MB,
`framework/_index/sighah.json` 17.4 MB. **The corpus is real and it is large.** The build is a
136 MB derivation over a 4.88 GB acquired corpus. This is not vapor. The dishonesty, where it exists,
is in the *counting*, not in the *existence*.

---

## 1. FINDINGS TABLE (10 max, every row evidenced)

| # | Sev | Finding | Evidence (re-run to falsify) |
|---|---|---|---|
| **B1** | 🔴 | **The 41,600 nodes commit `adb53d6` calls "built" are carried by 26 files totalling 441,597 bytes — 10.6 bytes per node.** This is the single largest honesty exposure in the artifact: 40.3% of the ledger rests on 431 KB. | `find build/P44-HADIYYA -type f \| wc -l` → **26**; `du -sb build/P44-HADIYYA` → **441,597** ✅ VERIFIED. 41,600 nodes 📊 from ledger pillar counts (H-AFAQ 31,300 + UNIVERSITIES 3,000 + STUDENTS 2,500 + MADARIS 2,000 + PARENTS 1,500 + SCHOOLS 1,300). |
| **B2** | 🔴 | **`g37_audience_gates.json` is 312 bytes containing five string literals `"GREEN"`, and it is the asserted gate for 10,300 audience-pillar nodes.** Its `_meta.layer` reads *"G37 audience gates — every domain's artifact exists"*. A gate that stores five words cannot have proved that 100 domains' artifacts exist; nothing in the file records what was checked. The commit's phrase "all G37 green" is backed by this file. | `python -c "import json;print(json.load(open('build/P44-HADIYYA/g37_audience_gates.json')))"` → `{"_meta":{...},"per_audience":{"STUDENTS":"GREEN","PARENTS":"GREEN","MADARIS":"GREEN","SCHOOLS":"GREEN","UNIVERSITIES":"GREEN"}}` ✅ VERIFIED, 312 B. |
| **B3** | 🔴 | **`area_dossiers_313.json` carries 31,300 nodes (30.3% of the whole ledger) on 313 records that are largely one template.** `for_the_student` has **1 distinct value across all 313** — and that value is a *description of the field*, not content: *"what this area asks, in one line — and where the waqf's measured layers let a student verify a claim personally."* `mission_law`: **1 distinct value across 313**. Only 97/313 carry a real `quranic_verse_floor`; the other 216 carry a bare `note`. Median dossier = 1,076 bytes ⇒ **11.2 bytes of JSON per node**. | `dossier.py` ✅ VERIFIED: `for_the_student distinct=1 (313/313)`, `mission_law distinct=1 (313/313)`, `verse_floor not-bare-note = 97 of 313`, `open_question distinct=313`, `council_seats distinct=313`. |
| **B4** | 🔴 | **61.2% of the ledger is explicit multiplier arithmetic.** 63,200 of 103,200 node purposes literally end `- unit k/N`, differing from their siblings **only in the integer k**. Across H-AFAQ's 31,300 nodes there are exactly **313 distinct purpose-stems** — one per area, each replayed 100×. | `stems.py` ✅ VERIFIED: `nodes whose purpose is an explicit "unit k/N" expansion: 63200`; `distinct purpose-stems across 31,300 H-AFAQ nodes: 313`. |
| **B5** | 🟠 | **103,200 nodes carry 16,830 distinct ideas — 6.13 nodes per idea.** Normalising each purpose for embedded integers and keying on (pillar, domain, block, purpose) collapses the ledger by 6.1×. **39,460 nodes share a byte-identical purpose string with at least one other node.** | `stems.py` ✅ VERIFIED: `DISTINCT NODE-IDEAS: 16830`; `nodes sharing a byte-identical purpose: 39460`; `distinct purpose strings (verbatim): 64371`. |
| **B6** | 🟠 | **The ledger declares 1,017 domains; only 330 domain-level directories exist on disk.** 687 ledger domains (67.6%) have no dedicated folder. Of the 330 that do exist, we grade **148 SUBSTANTIVE** (≥20 KB and ≥4 files), **88 MODERATE**, **94 THIN**. | `domaindirs.py` ✅ VERIFIED: `DOMAIN-LEVEL dirs (depth>=2): 330`; `grade: {'SUBSTANTIVE':148,'MODERATE':88,'THIN':94}`. `stems.py`: `distinct (pillar,domain): 1017` — which **independently matches** the sibling set's `artifact_figure.json` `distinct_domains: 1017` ✅. |
| **B7** | 🟢 **counter-finding — the classifier is too hard on the build** | **"206 distinct artifacts" is a *basename* collapse, not a file count, and it understates the delivered build by ~9.5×.** `classical_layer_dataset.json` exists **131 times** and we SHA-256'd every copy: **131/131 unique hashes, zero byte-duplicates.** Same for `hadith_layer_dataset.json` (131/131), `gates_audit_record.json` (131/131), `graph_layer.json` (130/130), `education_pack.json` (130/130), `quran_layer_dataset.json` (130/130), `pages_trilingual.html` (127/127). These are **genuinely distinct per-domain deliverables that happen to share a filename.** The file-level truth is **1,952 deliverable files ≥512 B in `build/`**, spanning **822 distinct basenames**. | `dupcheck.py` ✅ VERIFIED (full table of files/uniqSHA); `basenames.py` ✅ VERIFIED: `build/ deliverable files >=512B: 1952`, `DISTINCT BASENAMES: 822`. |
| **B8** | 🟠 | **Of the 39 artifacts the ledger names by filename, 10 are stubs under 1.5 KB and they carry 2,700 nodes.** Named stubs: `g37_audience_gates.json` (312 B, 1,000 nodes), `education.json` (max 1,351 B across 40 copies, 700 nodes), `refrain_atlas.json` (1,096 B), `counting_schools_pack.json` (513 B), `hifz_juz_stats.json` (747 B), `claim_check_primer.md` (498 B), `reproducibility_runbook.md` (880 B), `LICENCE-LEDGER.md` (1,104 B), `estimate_registry.json` (1,127 B), `open_questions_register.json` (1,056 B). **Correction, honest both ways:** our first pass flagged `morphology.json` and `_morphology_raw.txt` as MISSING; they exist in `../00-CORPUS/` outside our walk root — **not missing, out of scope.** 29 present, 10 stub, 0 missing. | `exists.py` ✅ VERIFIED; `ls ../00-CORPUS` ✅ confirms both files. |
| **B9** | 🟠 | **Two sampled artifacts are pointers or approximations wearing a deliverable's name.** `counting_schools_pack.json` (513 B) states in full: *"the counting-schools layer lives in C3/D5; this pack points there"* — it is a redirect, and it carries 100 nodes. `hifz_juz_stats.json` (747 B) is `{"1":208,"2":208,…,"8":207}` — **6,236 ÷ 30, an even-stride division, not juz boundaries.** Its own `_meta` declares the approximation honestly, which is to its credit; but a divided integer is not a built stat layer. | `sample.py` ✅ VERIFIED, both files printed verbatim. |
| **B10** | 🟠 | **The classifier ships no script; its seven node-class counts (79,029 / 11,697 / 4,886 / 4,540 / 1,900 / 901 / 247) are not re-runnable by anyone, including us.** A grep for `distinct_artifacts_carrying_nodes`, `C-BUILT-THIN`, or `classifier.json` across all 286 `.py` files returns **nothing**. The classes sum correctly to 103,200 📊, and the file census reproduces exactly (§0) — so we do not allege error. But an honesty artifact whose central numbers cannot be recomputed fails its own standard (I-2: *the baseline must be independent of the check, or the check cannot fail*). | `grep -rl "distinct_artifacts_carrying_nodes\|C-BUILT-THIN" --include=*.py .` → **empty** ✅ VERIFIED. `ls build/P45-HONESTY/` → only `classifier.json`, `artifact_figure.json`. |

---

## 2. THE HONEST COUNTS, AS SET-BUILD SEES THEM

The owner's question mixes two currencies. We answer in **both**, because answering in one is how the
103,200 became misleading in the first place.

### CURRENCY A — deliverable units (things on disk). *This is the currency we trust.*

| tier | count | what it means | evidence |
|---|---:|---|---|
| **Heavy** (>32 KB) | **407** | a real dataset: hundreds of records, verbatim texts, computed edges | `basenames.py` size profile ✅ |
| **Real** (4–32 KB) | **396** | a genuine per-domain deliverable | ✅ |
| **Thin** (1–4 KB) | **886** | structure + a handful of rows; true but shallow | ✅ |
| **Stub** (512 B–1 KB) | **263** | `_meta` + 3 Q&A, or a pointer | ✅ |
| **TOTAL `build/` deliverables ≥512 B** | **1,952** | all uniquely hashed — **zero byte-duplicates** in the seven largest shared-name families | `dupcheck.py` ✅ |
| below the floor (<512 B, incl. 137-byte `graph_layer.json`) | 45 | not counted as built | 📊 (1,997 − 1,952) |
| **Substantive files, whole repo** | **2,449** | **confirms the classifier's 2,448** | `subst.py` ✅ |
| Domain folders that are genuinely built out | **148** of 330 | ≥20 KB and ≥4 files | `domaindirs.py` ✅ |
| Acquired corpus underneath (not built — **obtained**) | **4.88 GB / 578 files** | the substrate; must never be counted as build | `du -sb ../00-CORPUS` ✅ |

**Deliverable-unit answer: ~1,950 real files exist; ~800 of them are heavy-or-real; ~1,150 are thin-or-stub.**

### CURRENCY B — the 103,200 nodes, as planning-shares

We tiered every node by the **bytes-per-node** of its own pillar's build region — a declared proxy
(⚠️ its weakness is noted below), computed in `final.py` over the full 103,200 ✅ VERIFIED.

| tier | nodes | share | reading |
|---|---:|---:|---|
| **RICH** ≥2,000 B/node | **15,600** | 15.1% | genuinely built, deeply (C1–C8 core, P31-MIZAN, P32, P36, P17, P19) |
| **REAL** 200–2,000 B/node | **38,100** | 36.9% | genuinely built, adequately (P42-GAPFILL, P30, P28, P34, the P8–P27 branch pillars) |
| **THIN** 20–200 B/node | **2,500** | 2.4% | a file exists; it is a summary, not the thing |
| **TOKEN** <20 B/node | **46,050** | 44.6% | **written, not implemented** — P44-HADIYYA 41,600, P33-RIJAL 2,000, P37-GRAPH 1,500, REPAIR 950 |
| **NO ARTIFACT AT ALL** | **950** | 0.9% | RESERVE — honestly self-declaring |

### THE FOUR NUMBERS THE OWNER ASKED FOR

| | count | % of 103,200 | basis |
|---|---:|---:|---|
| **REALLY BUILT** | **53,700** | **52.0%** | RICH + REAL: the node's domain has a build region delivering ≥200 bytes/node of real records. 📊 from `final.py` ✅ |
| **PENDING** (written, machine *can* finish) | **46,650** | **45.2%** | THIN + TOKEN, minus the two blocks below. Overwhelmingly P44-HADIYYA: 313 dossiers whose `for_the_student` field is still the field's own description, and 5 audience pillars holding 23 files. **A machine can finish these — it simply has not.** |
| **NEVER BY MACHINE** | **901** | **0.9%** | the classifier's class E (needs humans/rights): scholar verdicts, licence grants, acquisitions from rights-holders. We accept this class as measured; it is not ours to re-derive, and it is honestly named. |
| **NEVER AS DISTINCT THINGS** | **~86,370** | **83.7%** | 📊 103,200 − 16,830 distinct node-ideas. **This is the hard one.** 63,200 nodes are `unit k/N` arithmetic and 39,460 share a byte-identical purpose. These will never become 103,200 separate deliverables **because they were never intended to be** — they are shares of ~16,830 real ideas. No amount of building changes this; only relabelling does. |

**Read these four together, not separately.** The build is roughly **half-delivered against its own
plan**, the undelivered half is **mostly finishable by machine**, under **1%** genuinely needs humans —
and the number **103,200 was never a count of things.** It is 16,830 ideas × an average 6.13 shares.

### ⚠️ Declared weakness of our own method
Bytes-per-node punishes correctly-designed *summary* artifacts. `build/P37-GRAPH/graph_layers.json`
is 3.2 KB and scores 6 B/node, yet it truthfully reports 6,761 rare-root edges, 33,868 witness edges
and 313 entity co-occurrence edges computed over the corpus ✅ VERIFIED — the edges live in
`_index/`, not beside the summary. **P37's 1,500 TOKEN nodes are probably mis-tiered by us.** We state
this rather than hide it. Correcting it moves ~1,500 nodes from PENDING to REALLY BUILT (52.0% → 53.5%)
and does not touch the finding that matters, B1.

---

## 3. OUR OWN IMPROVEMENT PLAN

1. **Ship `classifier.py` beside `classifier.json`, and make it exit non-zero on drift.** The seven
   class counts must be recomputable by a stranger. Today they are an assertion (B10). Until this
   lands, the honesty artifact is itself unauditable — which is the exact defect it was built to expose.
2. **Print the ratio on the face, in the headline, before any total.**
   `103,200 planning-shares · 16,830 distinct ideas · 1,952 delivered files · 2,449 substantive files`.
   Four numbers, one line. A reader who sees only "103,200" has been misled even if no sentence lied.
3. **Retire "206 artifacts" and publish two numbers instead** (B7): *206 artifact **kinds** (basenames)*
   and *1,952 artifact **instances** (files, all uniquely hashed)*. The current single figure is
   simultaneously the artifact's most damaging admission and an **understatement** of the real build.
4. **Fix `g37_audience_gates.json` before anything else** (B2). A gate must store what it checked:
   per-domain artifact path, byte count, record count, timestamp, and the assertion that failed if any.
   Five `"GREEN"` strings backing 10,300 nodes is the highest-leverage single defect in the build.
5. **Finish the 313 dossiers or halve their weight.** `for_the_student` is one string repeated 313
   times, and it is the field's own instructions (B3). Either populate it per-area from the measured
   layers, or drop `for_the_student` from the dossier schema and re-cut H-AFAQ from 100 to 50
   nodes/area. Shipping a field that describes itself is worse than shipping no field.
6. **Land the 216 missing verse-floors.** 97/313 areas meet the Book through a located-verse family;
   216 carry a bare `note`. This is the most valuable *and* most finishable work in the whole pending
   half — it converts template records into evidence records using machinery that already exists (G02 locators).
7. **Give every node a real `artifact` field.** Only 10,320 of 103,200 nodes (10.0%) name a file
   ✅ VERIFIED; the rest are resolvable only by convention. One `artifact: <path>` + `carrier_share: k/N`
   key per node makes every future audit a join instead of an archaeology.
8. **Introduce a `POINTER` block-type and stop counting pointers as layers** (B9).
   `counting_schools_pack.json` honestly says it points at C3/D5 — so the ledger should say
   `block: pointer`, and pointers should carry 1 node, not 100.
9. **Publish the domain-coverage gap as a first-class number: 330 built of 1,017 declared** (B6).
   It is the single most useful progress metric the project has and it currently appears nowhere.
10. **Adopt a build-floor gate: no file under 512 bytes may satisfy a node.** We found 45 such files
    below the floor including a 137-byte `graph_layer.json` holding three integers. Make the floor
    executable in `g35_program_gates.json` so it fails at generation, not at audit.
11. **Separate ACQUIRED from BUILT on the face.** 4.88 GB of corpus is a genuine achievement and it is
    *not* a build achievement. Stating both, side by side and distinctly labelled, makes the gift more
    impressive **and** more honest — the corpus is the strongest true thing here.
12. **Re-tier P37 and any other summary-artifact pillar by record count, not bytes** — and record our
    own method's failure (§2 ⚠️) in the artifact, so the next panel inherits the correction rather
    than rediscovering it.

---

### CLOSING NOTE FROM THE 450 SEATS

We were sent to find whether the build is real. **It is.** 1,952 uniquely-hashed files, 148
substantively built domain folders, 136 MB of derivation over a 4.88 GB acquired corpus, and sampled
artifacts — `hadith_layer_dataset.json` at 374 KB of verbatim graded reports, `bench_pack_002.json`
at 249 KB of 100 real rows, `editions_inventory.json` profiling 74 editions in 55 languages, a
114-node/228-edge `graph_layer.json` where every edge carries evidence — that are exactly what they
claim to be.

And the number on the front of it is not a count of those things. **103,200 is 16,830 ideas wearing
6.13 coats each**, and 44.6% of them sit on carriers weighing under 20 bytes per node. The gift does
not need the bigger number. It survives the smaller one intact, and only the smaller one is true.

HONESTY BUILD-2 VERDICT: TRUE-IF-RELABELED - the artifacts are real and uniquely built (1,952 files, zero byte-duplicates, 2,449 substantive — confirming the classifier), but 103,200 is a count of planning-shares over 16,830 distinct ideas, of which 52.0% are really built and 44.6% rest on carriers under 20 bytes per node, so every sentence reading "103,200 built things" must be relabelled to "103,200 planning-shares across 1,952 delivered files" before the gift is given.
IMPROVEMENT POINTS: 12
