CRITIC_schema_NO-GO.json

pipelines/CRITIC_schema_NO-GO.json

JSON did not parse: Unexpected UTF-8 BOM (decode using utf-8-sig): line 1 column 1 (char 0)

{"type":"result","key":"v2:4871ae0cf5931c58ed7cb48fdd516d03e49033dcb8eb03a81ace6926c4f54cb1","agentId":"add667f1a6ee16b13","result":{"verdict":"NO-GO","findings":[{"target":"scratchpad/arc_schema/registry_T0_Arc_Index.csv (21 familiar_bond rows, `notes`; ARC_0100 `notes`) + registry_T0_Arc_Grammar.csv (class `familiar`, `evidenced_by`) + fk_spec_additions.json (T0_Arc_Index `id_formats.arc_id._note`)","severity":"MAJOR","problem":"THE HOLDOUT IS ANNOUNCED INSIDE THE SHIPPED CSVs — automatic NO-GO under freeze rule 9. All 21 familiar_bond rows carry the identical notes cell: \"ONE OF TWENTY-ONE. The registry declares TWENTY-TWO slots. The twenty-second is the WAVE-5 ACCEPTANCE HOLDOUT: it is deliberately not minted, not typed, not referenced, and NO arc id is reserved for it, so that the Wave-5 instrument has to find it in the corpus unaided. See IMPORT_PROVENANCE.md.\" ARC_0100 adds \"THE FAMILIAR-SLOT CLAUSE IS EXCLUDED ... it belongs to the Wave-5 acceptance holdout.\" The familiar grammar row's evidenced_by adds \"The worked instance this grammar was shaped from is the Wave-5 acceptance HOLDOUT.\" fk_spec_additions.json adds \"NO ID IS RESERVED for the Wave-5 acceptance holdout ... the holdout has to be found in the corpus unaided.\" 25 hits on /Wave-?5/, 22 on /HOLDOUT/, 21 on /twenty-second/ and /TWENTY-TWO/ across four of the six artifacts. This is a two-hop hand-off, not a hint: T0_Arc_Index is THE table an arc extractor reads first, and the live registries/T0_Familiar_Registry FAM_22 row already carries chapter_first_encounter=CH_01 and chapter_bonding_window=CH_01;CH_58 on disk. The acceptance gate that must be able to fail structurally cannot after this. IMPORT_PROVENANCE.md §1 asserts the opposite twice — \"this section names the holdout, and it is the only artifact in this wave that does\" and \"The five CSVs and fk_spec_additions.json are clean and can go anywhere\" — both falsified. The cause is a search that cannot match reporting zero: _audit.py:35-52's FORBIDDEN list holds 15 patterns (CL-01, FAM_22, TL-05/06, ECV-02, 'childhood familiar', '22nd', 'twenty-second slot', 'slot 22', 'believed-dead', 'Antarctica reunion', 'binding-stone') and none of them matches any string above ('twenty-second is', 'TWENTY-TWO slots', 'HOLDOUT', 'Wave-5'), while its positive control is a single `any(re.search(p, probe))` over one synthetic string — proving one pattern fires, not that the set is adequate.","fix":"Strip every holdout reference from the shipped artifacts, then re-scan with an adequate ruler. (1) Replace the 21 familiar notes cells with the class-level fact carrying no arithmetic and no intent language: \"BOND is the only grammar stage with data; the four later stages are unpopulated at Wave 2.\" Delete the 21-of-22 count, the TWENTY-TWO sentence, the 'not minted / not typed / not referenced / NO arc id is reserved' clause and the IMPORT_PROVENANCE pointer. (2) Cut ARC_0100's second sentence back to \"the source's third clause is out of scope for this row.\" (3) Set the familiar grammar's evidenced_by to \"UNEVIDENCED AT WAVE 2 — teeth ship UNARMED\" and delete the sentence naming the worked instance. (4) Delete the fk_spec arc_id _note from \"NO ID IS RESERVED\" onward, keeping only the beat_id-permanence rule. (5) Widen _audit.py's FORBIDDEN set to include holdout|HOLDOUT|Wave.?5|WAVE.?5|twenty-second|TWENTY-TWO|21 of 22|ONE OF TWENTY|ACCEPTANCE|REUNION|THE_STAND|SUBSTITUTE_BONDS|deliberately not, and replace the `any()` control with a per-pattern loop asserting each pattern fires on its own probe. Keep the exclusion itself and record it only in IMPORT_PROVENANCE.md, which already carries the do-not-show-Wave-5 handling note."},{"target":"scratchpad/arc_schema/registry_T0_Arc_Grid.csv (ARC_0001 @ CH_01 and @ CH_13) vs registry_T0_Arc_Grammar.csv (class `family`, `stage_progression_map`)","severity":"MAJOR","problem":"§8.2's named rot surface is already live at mint: 2 of the 4 populated stage_role cells contradict the grammar's own mapping. The family map declares LOSS>TURN and INHERITED_OBJECT>ESCALATE; the grid carries CH_01 stage_role=LOSS with progression_stage=ESCALATE, and CH_13 stage_role=INHERITED_OBJECT with progression_stage=RESOLVE. §8.2's entire mitigation is \"the mapping lives in T0_Arc_Grammar as data with a gate assertion that every stage_role maps to exactly one legal progression_stage\" — that assertion fires on 50% of the artifact's authored cells on its first run. The map is not covered by the grammar row's COPY-ONLY provenance claim either: STORYDEPTH_STORY_CRAFT_LENS_FAMILY_2026-07-27.md:285 states the five stage names only, never a stage-to-enum mapping, so stage_progression_map is authored here and is the side free to move.","fix":"Correct the family row's stage_progression_map to match the built arc: BIRTHRIGHT>SEED|LOSS>ESCALATE|ABSENCE>PRESENT|INHERITED_OBJECT>RESOLVE|RECKONING>RESOLVE (many roles to one enum is legal — the companion map already sends COST and CHOICE both to TURN; one role to two enums is what §8.2 forbids). Then add the §8.2 assertion to gate 31 — every populated stage_role must map under its arc's grammar row to exactly the cell's progression_stage — and use these two rows as its must-fire fixture so the ruler is proven against the case that produced it."},{"target":"scratchpad/arc_schema/registry_T0_Arc_Index.csv — ARC_0008..ARC_0023 (T07-T19, T21, T22), `open_by_design` + `open_by_design_reason`","severity":"MAJOR","problem":"A boolean column carries its own opposite on 15 of 22 thread rows, and only a prose cell says so. All 15 no-resolution threads are set open_by_design=TRUE with a reason that opens \"NOT open by design -- UNRESOLVED AND UNDECLARED ... The value is set TRUE only so the arc is not silently counted as resolved.\" Every other class in the same table uses TRUE in the ordinary sense (10 trade_questline, 21 familiar_bond, 21 chain), so any gate, enrich pack or later wave counting open_by_design=TRUE as declared authorial intent mis-classifies exactly the 15 arcs the charter flags as its headline thread defect. It also pre-empts a live Josh fork: FORK J-2's option (a) is verbatim \"Every thread gets a declared disposition — resolve, or open_by_design with a reason,\" so shipping the 15 as TRUE-with-a-reason lands the recommended option before the ruling.","fix":"Add a `disposition_status` column with the closed enum UNDECLARED | OPEN_BY_DESIGN | RESOLVED; set the 15 threads to UNDECLARED and their open_by_design back to FALSE, moving the finding text to notes. Add a gate-31 assertion that no row may carry open_by_design=TRUE whose reason begins \"NOT open by design\", so the inversion can never re-enter. Record in IMPORT_PROVENANCE.md that the 15 are surfaced as an undeclared-disposition finding for FORK J-2 and not resolved by the mint."},{"target":"scratchpad/arc_schema/registry_T0_Arc_Grid.csv (`beat_refs`, `state_reads`, `state_writes`) + IMPORT_PROVENANCE.md","severity":"MAJOR","problem":"The charter's stated reason Arc_Grid is not a duplicate of Thread_Grid is empty on 70% of rows and declared nowhere. Measured: beat_refs 374/1231, state_reads 188/1231, state_writes 4/1231. By class, beat_refs and both state columns are ZERO on all 666 thread rows, all 62 antagonist rows, all 104 chain rows and all 25 familiar rows; only the 370 side-questline rows and ARC_0001's 4 rows carry any. §2.1 makes these columns the whole answer to §2.5's objection — \"Thread_Grid's six columns plus the v3.1 join that Thread_Grid lacks: beat_refs ... plus state_reads / state_writes, which is what makes promise→payoff machine-visible\" — so on the thread class, the pilot class, Arc_Grid is Thread_Grid re-keyed. IMPORT_PROVENANCE.md never mentions beat_refs, state_reads or state_writes (0 occurrences of each), and no row's notes declares the blank; the thread rows' notes explain only why content_summary is blank. This is the exact DECLARED-AND-EMPTY class the 

Generated by harness/site/structure_site.py — the URL path is the repo path. review root