systems/DEFENSIVE_CLASS_CANON_READ.md
defensive_class — THE CANON READ, 72 of 72Canon parent:T1_Combat_System_Spec(at_source/01_Tier_1_Foundation/) §Block L445-448 ·
§Parry L452-462 · L645 (the column-minting sentence) · L685.
PROPOSED ONLY. THIS DOCUMENT WRITES NOTHING. No registry cell, no fidelity baseline, no canon
file, no harness file was touched by this lane. The column is applied by the DIRECTOR, with the
csvmodule, againstregistries/T0_Weapon_Registry [DRAFT v0.1]/Sheet1.csv, with the scoped
docs/fidelity_baseline.jsonrefresh (--emit-baseline) in the same commit, per the Vector-C
landing path already declared atdocs/registry_extensions.jsondefensive-properties.
CANON SUBORDINATION — this document is PROPOSAL-TIER: it serves canon and never outranks it.
Canon here is _source/01_Tier_1_Foundation/T1_Combat_System_Spec [ACTIVE v1.0].md,
docs/spine/CH_03.md,_source/02_Tier_2_Region_Pages/flores_island.md, and the T0 registry rows
themselves. If this document disagrees with any of them, CANON WINS and this document is the defect.
Lane A of the combat-schema wave. Work order: harness/counter_class_coverage_scorecard.md L12 —
*"A1 parry universe UNREACHABLE: T0_Weapon_Registry carries no defensive_class column … Every
parry_only rail row will FAIL as unjudgeable rather than pass."* The schema brief is
docs/proposals/boss_rail_exemplar/BOSS_RAIL_EXEMPLAR_BE_0002.md §7. This document is the
per-weapon canon read that brief's own closing paragraph demands, and it corrects the brief in
two places (§2.2 and §6).
---
DERIVED FROM
_source/01_Tier_1_Foundation/T1_Combat_System_Spec [ACTIVE v1.0].md — read in full.Mechanic (*"Shield-based active defense with Stamina cost"*), L447 the Shield row, L448 the Great
Shield row. L452-462 § Parry Mechanic, L454 *"Weapon-based defensive timing window. Successful
parry generates Stamina or Vril per weapon class. Canonical parry-capable weapons per
pre-restructure source:"*, L456 Rapier, L457 Long Sword, L458 Cutlass, L459 Madu, L460 Sword (1H),
L462 the Madu uniqueness line. L472 § Defensive Layer Integration — block, parry and dodge as
one family of defensive successes on one mitigation scale.
parry-capable weapon, and the weapon side of that answer is T0_Weapon_Registry defensive_class"*
(the sentence that mints this column); L651 the seven data tokens; L653-660 the elemental
parry; L662-671 the mitigation scale; L685 *"the parry class enters at Ch 3 and later"*;
L692-694 the registry anchors and the enforcing gate.
block."* § Wand Canonical Lock L232 — *"Cannot block."* The only three CITED NEGATIVES in the
corpus.
read per weapon to place every roster row in its family; L153 OFF-HAND (3): Xiphos, Shield,
Great Shield; L216 OFF-HAND (2): Orb, Tomb.
pipeline-driven column-expansion principle this column lands under.
finding D6: those docs are one-line stubs, so T1 § Parry / § Block plus the spine and the region
pages ARE the whole per-weapon defensive canon that exists today).
docs/spine/CH_03.md — L144 *"take the shield first and turn each cracking arc on the clean parry until the count is kept"*; L145 systems: [boss:BE_0003.P1, object:wpn_033_shield];
L97 BE_0003 *"primary PARRY"*; L258 *"chapter_anchored_weapon_add WPN_033 Shield (BRUTE,
OFF-HAND) roots here — the caci whip-and-shield seating the player's first off-hand Shield,
grounding the main boss's parry (whip-and-shield rhythm) verb"*; L28 the chapter prose
(*"the shielded parry"*).
_source/02_Tier_2_Region_Pages/flores_island.md § Section 6 — L672-673 *"the caci rounds seatthe player's first off-hand Shield and ground the CH_03 main boss's PARRY verb"*; L690-693 the
legendary seat, *"a legendary defensive weapon whose four-ability pool draws on the caci's
read-and-turn discipline (the clean parry, the kept count, the answering pass)"*.
registries/T0_Weapon_Registry [DRAFT v0.1]/Sheet1.csv — **all 72 rows, all 32 columns, read cell-by-cell.** The cells this read relied on per row: weapon_id, weapon_name, weapon_class,
weapon_subclass, damage_type, canonical_chapter_acquisition. Measured facts used below:
damage_type = GUARD on exactly 3 rows (WPN_033, WPN_034, WPN_042); canonical_chapter_acquisition
blank on exactly 4 rows (WPN_015, WPN_016, WPN_022, WPN_037); the earliest acquisition in the whole
roster is WPN_033 Shield at CH_03.
harness/check_counter_class_coverage.py — L91 `PARRY_DEFENSIVE_CLASSES = {"parry", "catch", "riposte"}; L573-585 the grant resolver (min(canonical_chapter_acquisition)` over parry-family
rows, and the UNREACHABLE branch when the column is absent); L188-208 the A1 verdicts a resolved
grant chapter produces.
harness/counter_class_coverage_scorecard.md L12 — the work order, quoted above.docs/proposals/boss_rail_exemplar/BOSS_RAIL_EXEMPLAR_BE_0002.md §7 (L361-387) — the schema brief, read in full, including its closing trap (*"Do not populate defensive_class by inference from
weapon_class or damage_type"*), which §2.3 below executes and evidences.
docs/pipeline_review/MINT_DESIGN_B_ITEM_ALLY_2026-07-27.md L1204-1222 — the earlier, wider five-member enum proposal (none · block · parry · catch · riposte), its default = none
justification, and the Madu-as-catch seed. Proposal-tier; used as the vocabulary CANDIDATE that
§2.2 then verifies against T1 canon.
docs/registry_extensions.json defensive-properties (L161, L164) — the declared Vector-C landing path: five columns on T0_Weapon_Registry/Sheet1, landed by extending the stub_superseded
candidate_header and re-pinning, with NO added_columns key. The director's ritual, named so the
apply has an address.
docs/REGISTRY_ROW_STRUCT_SPEC.md §2.1 THE NAMING LAW (L63-92) — new canon columns are always qualified <qualifier>_class. defensive_class complies as named; no rename needed.
docs/COMBAT_ENCOUNTER_SYSTEM.md L295 — *"parry_only — a parry-capable weapon, read from T0_Weapon_Registry.defensive_class"*; docs/fk_spec.json L997 — the same answer-home mapping.
docs/FUN_REBUILD_PLAN.md L88-95 (R2.2) — *"canon gates it to parry-capable weapons the player doesnot hold until Ch 3+ … shield/block is Ch-3 Manggarai"* — the identification of the Ch-3 grant with
the Shield, stated outside T1.
docs/PILLAR10_REGIONAL_COMBAT_VOCAB.md L172 and its guard_yield row — *"the parry-capable roster in T1_Combat_System_Spec § Parry Mechanic keeps its defensive_class"*, and guard_yield = *"the
window a guard holds and the resource a successful defence returns"*, warranted on flores_island's
seating of the Shield.
_source/01_Tier_1_Foundation/T1_Build_Pipeline_Contracts [ACTIVE v1.0].md L2752 — weapon_sfx_id_ref_array *"covering hit, block, parry, ranged release…"*: the audio contract
already assumed a per-weapon defensive property. Corroboration for the vocabulary's shape.
docs/proposals/combat/WEAPON_PROFILES.json (subordinate, provenance only) — class_notes.GUARD *"for receiving — which is a damage class in a game with a parry"*, and census.by_damage_class
GUARD 3. It carries no defensive column and authored nothing here.
(T6_Weapons_Brute_Detailed, T6_Weapons_Trickery_Detailed, T6_Weapons_Master_Index) are
one-line title stubs; no region page or spine node names the Xiphos at all; the Madu is named
twice — docs/spine/CH_07.md L284 (*"won by catch-and-redirect"*) and docs/spine/CH_31.md L271
(*"the Madu parry-weapon"*), both corroborating WPN_042 = catch; the only
defensive-verb hits across the spine nodes and the region pages are CH_03's shield-parry, CH_07
L190/L279 (*"the honorable kalari duel's parry-riposte primary"* — a chapter combat MODE, not a
weapon property), and CH_11 L140 plus west_africa.md L1768 (a demanded parry-riposte ANSWER with
no weapon named).
NOT DERIVED (authored judgment, and why it had no canon home)
1. Which of the three parry-family tokens each canon-named parry weapon takes (§3.2). Canon names
five parry-capable weapons and five distinct mechanics; the token set has three members. Rapier,
Cutlass, Madu and Sword (1H) map by canon's own words (*"Parry ability"*, *"Parry Riposte"*,
*"Horn Catch"*, *"Riposte"*). The Long Sword does not: *"simultaneously attack and defend"* has
no token of its own. The reading is argued at §3.2, the alternative is stated, and **the gate treats
all three tokens identically (L91), so nothing downstream turns on it.**
2. The none default on the 62 rows canon is silent about. Canon states no defensive property for
them and states no negative either. none is the reading MINT_DESIGN_B L1210 defends as
reproducing current canon exactly (today's runtime bParryCapable = false on every weapon), and it
is the only value that does not invent a capability. Each such row carries its own silence as its
citation rather than a borrowed one.
---
T1_Combat_System_Spec L645 mints it in one sentence: *"Parry-only — the attack cannot be dodged
because it is too sweeping, too indirect, or too large. Answered by a parry-capable weapon, and the
weapon side of that answer is T0_Weapon_Registry defensive_class."*
The consumer is harness/check_counter_class_coverage.py L573-585. It resolves the earliest parry
grant as min(canonical_chapter_acquisition) over rows whose `defensive_class ∈ {parry, catch,
riposte}` (L91), and — finding the column absent — declares the parry universe UNREACHABLE and
FAILs every parry_only rail row as unjudgeable (L196-199). *"A search that cannot match must never
report a clean pass."* That is the whole blocker: the answer universe for one of the seven ruled
response classes does not exist as data.
---
| value | what it means in canon | canon warrant | parry-family per gate L91 |
|---|---|---|---|
none | the weapon carries no defensive mechanic | the absence of a § Parry / § Block naming, plus the three CITED negatives at T1_Combat_System_Spec L226 and L232 (*"Both cannot block"* / *"Cannot block"*) | no |
block | a held, resource-paid guard — *"Stamina-based active block, hold to maintain"*, and a planted fortification | T1_Combat_System_Spec L443-450, § Block Mechanic, a section of its own | no |
parry | a defensive TIMING WINDOW on the weapon — *"Weapon-based defensive timing window"* | T1_Combat_System_Spec L452-454, and L456's *"dedicated parry mechanic"* | yes |
catch | a parry that CATCHES and REDIRECTS rather than turning — *"catch redirects creates opening"* | T1_Combat_System_Spec L459, canon's own noun for the Madu's Horn Catch | yes |
riposte | a parry with the counter attached — *"block then counter"*, *"parry and counter in one motion"* | T1_Combat_System_Spec L458 and L460, canon's own noun on two weapons | yes |
Every one of the five is a word canon uses, in a sentence canon writes, about a mechanic canon owns.
None is minted here.
BOSS_RAIL_EXEMPLAR_BE_0002.md §7 (L376-379) proposes *"parry | catch | riposte | none — the
gate's own three-member parry family plus a non-parry value."* Canon disagrees, and canon wins.
T1_Combat_System_Spec gives BLOCK its own section (L443-450), parallel and equal to § Parry(L452-462), with its own resource (Stamina), its own verb (*"hold to maintain"*), its own two named
weapons, and its own formula placement (L450, *"Block reduces incoming damage application before
integrity-band and RNG sigma factors apply"*). A vocabulary that cannot say block cannot record a
mechanic canon spends a section on.
block:L226 *"Both cannot block"* (Orb, Tomb) and L232 *"Cannot block"* (Wand). A four-member set turns
three positive canon statements into indistinguishable silence.
first-class member of the surface this column describes.
docs/pipeline_review/MINT_DESIGN_B_ITEM_ALLY_2026-07-27.md L1210 (`none · block · parry · catch ·
riposte, default none`). The §7 brief's four-member set is the narrower of two live proposals and
the one canon does not support.
Cost of the correction: zero. block is not in the gate's PARRY_DEFENSIVE_CLASSES (L91), so
adding the member changes no A1 verdict. It only stops the column from lying about the Great Shield.
The §7 brief warns (L385-387): *"Do not populate defensive_class by inference from weapon_class or
damage_type. GUARD, BRUTE and OFF-HAND are three different axes and none of them means 'parries'."*
This lane read the canon per weapon. Here is the measured proof that the shortcut would have been
wrong, computed over the live CSV:
| inference rule | rows it yields | verdict against the canon read |
|---|---|---|
damage_type == GUARD | WPN_033, WPN_034, WPN_042 (3) | misses 4 of 7 — Cutlass (SLASH), Rapier (PIERCE), Long Sword (SLASH) and Sword 1H (SLASH) are all canon-named parry weapons carrying a striking damage type |
weapon_subclass == OFF-HAND | WPN_032, WPN_033, WPN_034, WPN_069, WPN_070 (5) | 3 of 5 are wrong — Xiphos has no defensive canon at all, and Orb and Tomb are canon-stated CANNOT BLOCK (L226). The rule would arm the two weapons canon explicitly disarms. |
weapon_class == BRUTE | 36 | meaningless — the Madu, canon's *"only Trickery dedicated parry weapon"* (L459), is TRICKERY |
damage_type = GUARD agrees on all three rows it covers, but it is NOT independent evidence:
harness/emit_weapon_profiles.py L61 derives GUARD by name-token from "shield" / "madu", so it fires
because of the row's name, not a separate canon read. It is recorded as agreement, not corroboration —
and it recovers only 43 per cent of the defensive roster regardless. The column is a canon read, and
this is the measurement that says so.
docs/REGISTRY_ROW_STRUCT_SPEC.md §2.1 (L63-92): *"New canon columns are always qualified —
<qualifier>_class … never a bare C++/UE keyword."* defensive_class is already qualified and is the
name canon itself uses at L645. No rename, no alias, no §4 escape hatch needed.
---
parry, not blockThe problem. T1_Combat_System_Spec files the Shield under § Block (L447: *"Stamina-based
active block, hold to maintain"*) and omits it from § Parry's canonical parry-capable list (L454-460).
Read on T1 alone, the Shield is block — and block is not parry-family, so the earliest parry grant
would resolve to CH_07 (WPN_042 Madu), and every parry_only row authored at Ch 3, 4, 5 or 6
would FAIL A1 as unanswerable.
The canon that decides it is downstream of T1 and more specific than T1.
docs/spine/CH_03.md L144: *"take the shield first and turn each cracking arc on the **cleanparry** until the count is kept."* The shield is in hand and the action canon names is a parry.
docs/spine/CH_03.md L258: *"chapter_anchored_weapon_add WPN_033 Shield (BRUTE, OFF-HAND) rootshere … grounding the main boss's parry (whip-and-shield rhythm) verb."* The spine states the
causal link between this weapon row and a PARRY verb explicitly, and cites `T0_Weapon_Registry @
WPN_033` while doing it.
_source/02_Tier_2_Region_Pages/flores_island.md L672-673: *"the caci rounds seat the player'sfirst off-hand Shield and ground the CH_03 main boss's PARRY verb."*
flores_island.md L691-692: the legendary Shield line is *"a legendary defensive weaponwhose four-ability pool draws on the caci's read-and-turn discipline (the clean parry, the kept
count, the answering pass)."*
T1_Combat_System_Spec L685: *"the parry class enters at Ch 3 and later."* WPN_033 Shield atCH_03 is the earliest weapon acquisition in the entire 72-row registry (measured). It is the only
weapon that can make L685 true.
docs/FUN_REBUILD_PLAN.md L94 makes the same identification from the other side:*"shield/block is Ch-3 Manggarai."*
Options, stated.
parry. RECOMMENDED and applied. One column, one value, and the resolver returns parry_only → 3, which is exactly what L685 says. No harness edit. The Shield's block mechanic is
not lost: it is L447's canonical text, and the four companion Vector-C columns
(parry_window_ms, parry_stamina_cost, parry_generate, riposte_followup_ref) are where the
hold-and-Stamina detail lands. block stays a live member of the vocabulary, held by the Great
Shield.
block, and the director widens PARRY_DEFENSIVE_CLASSES (gate L91) to include block.** Also lands the grant at CH_03, and is arguably the more literal read of T1 § Block. Costs
a harness edit this lane may not make and the director must remember to make; a column shipped
without the matching gate edit silently moves the parry grant from Ch 3 to Ch 7 — and it silently
arms WPN_034 Great Shield (block, CH_27) as a parry_only answer, which no canon supports — a
second reason (A) is the better landing.
block, gate unchanged. The honest-looking option and the destructive one: the parry grant becomes CH_07, parry_only becomes illegal at Ch 3-6, **BE_0003 (the Ch-3 parry
exemplar this entire wave exists to unblock) cannot author a single parry row**, and spine canon at
CH_03 L144 becomes unreachable in data. Rejected.
The strongest objection to (A), answered. *T1 is Tier-1 authority and it puts the Shield under
Block; the spine is downstream and cannot re-file a T1 mechanic.* Answered on three grounds. First,
the two texts do not conflict: L454's list is prefaced *"Canonical parry-capable weapons per
pre-restructure source"* — an inherited enumeration, not an exhaustive closure — and L472 puts
block and parry on one scale rather than in opposition. Second, the spine and the region page are not
re-filing a mechanic; they state a per-weapon fact (*this weapon, in its own chapter, performs a
parry*), which is precisely the per-weapon grain this column records and precisely the grain T1 L43
delegates away from itself. Third, a reading that makes T1's own L685 unsatisfiable by any weapon in
the roster is the weaker reading of T1. It is reversible in one cell.
A conflicting sibling proposal, found by the critic and rejected here.
docs/proposals/combat/A7_WEAPON_EXEMPLAR_WPN_033.md L491 proposes a multi-valued cell,
parry;cover. REJECTED on two grounds: cover is a counter-class token whose canon home is declared
at T1_Combat_System_Spec L647 as T0_Environment_Grammar_Registry tactical_affordance_class, not
this column; and a multi-valued cell fails the gate's set-membership test
(check_counter_class_coverage.py L576 — "parry;cover" is not in PARRY_DEFENSIVE_CLASSES), which
would silently resolve the parry grant to CH_07 — exactly the drift D2 warns about. **The applied
cell is single-valued parry, no delimiter.**
riposte, not parryCanon (L457): *"Long Sword Halbschwerter and Meisterhau — half-swording and master cuts
simultaneously attack and defend."* Canon's own definition of riposte on the neighbouring rows is
*"block then counter"* (L458) and *"parry and counter in one motion"* (L460). A defence with the
counter carried in the same action is the riposte register — tighter than Sword (1H)'s *"one motion"*
rather than looser. Alternative reading: parry, on the ground that riposte implies a sequence
(defend, THEN counter) while the Meisterhau is genuinely simultaneous and canon mints no token for
that. Why it does not matter downstream: parry, catch and riposte are one set to the gate
(L91), so the grant chapter, every A1 verdict and every rail row are identical under either reading.
Recorded here so a later reader meets the reasoning rather than re-deriving it.
---
WPN_001 .. WPN_072, in registry order, every cell cited.
| weapon_id | weapon_name | PROPOSED defensive_class | citation |
|---|---|---|---|
| WPN_001 | Knuckles | none | Not named in T1_Combat_System_Spec §Parry L454-460 (the canonical parry-capable roster) nor §Block L445-448 (the canonical block roster). Registry row carries damage_type CRUSH / weapon_subclass FIST — neither is a defensive property (§2.3). Canon silence, read as none. |
| WPN_002 | Gauntlet | none | Not named in T1_Combat_System_Spec §Parry L454-460 (the canonical parry-capable roster) nor §Block L445-448 (the canonical block roster). Registry row carries damage_type CRUSH / weapon_subclass FIST — neither is a defensive property (§2.3). Canon silence, read as none. |
| WPN_003 | Cestus | none | Not named in T1_Combat_System_Spec §Parry L454-460 (the canonical parry-capable roster) nor §Block L445-448 (the canonical block roster). Registry row carries damage_type CRUSH / weapon_subclass FIST — neither is a defensive property (§2.3). Canon silence, read as none. |
| WPN_004 | Axe (1H) | none | Not named in T1_Combat_System_Spec §Parry L454-460 (the canonical parry-capable roster) nor §Block L445-448 (the canonical block roster). Registry row carries damage_type CLEAVE / weapon_subclass SHORT BLADES — neither is a defensive property (§2.3). Canon silence, read as none. |
| WPN_005 | Cutlass | riposte | T1_Combat_System_Spec L458 — "Cutlass Parry Riposte — block then counter". Canon names the riposte on this weapon. |
| WPN_006 | Scimitar | none | Not named in T1_Combat_System_Spec §Parry L454-460 (the canonical parry-capable roster) nor §Block L445-448 (the canonical block roster). Registry row carries damage_type SLASH / weapon_subclass SHORT BLADES — neither is a defensive property (§2.3). Canon silence, read as none. |
| WPN_007 | Hook Swords | none | Not named in T1_Combat_System_Spec §Parry L454-460 (the canonical parry-capable roster) nor §Block L445-448 (the canonical block roster). Registry row carries damage_type SLASH / weapon_subclass SHORT BLADES — neither is a defensive property (§2.3). Canon silence, read as none. |
| WPN_008 | Rapier | parry | T1_Combat_System_Spec L456 — "Rapier Parry ability — dedicated parry mechanic". A dedicated timing window, no counter attached. |
| WPN_009 | Axe (2H) | none | Not named in T1_Combat_System_Spec §Parry L454-460 (the canonical parry-capable roster) nor §Block L445-448 (the canonical block roster). Registry row carries damage_type CLEAVE / weapon_subclass SHORT BLADES — neither is a defensive property (§2.3). Canon silence, read as none. |
| WPN_010 | Katana | none | Not named in T1_Combat_System_Spec §Parry L454-460 (the canonical parry-capable roster) nor §Block L445-448 (the canonical block roster). Registry row carries damage_type SLASH / weapon_subclass SHORT BLADES — neither is a defensive property (§2.3). Canon silence, read as none. |
| WPN_011 | Long Sword | riposte | T1_Combat_System_Spec L457 — "Long Sword Halbschwerter and Meisterhau — half-swording and master cuts simultaneously attack and defend". Defence and counter in one action; alternative reading argued at §3.2. |
| WPN_012 | Great Sword | none | Not named in T1_Combat_System_Spec §Parry L454-460 (the canonical parry-capable roster) nor §Block L445-448 (the canonical block roster). Registry row carries damage_type SLASH / weapon_subclass LONG BLADES — neither is a defensive property (§2.3). Canon silence, read as none. |
| WPN_013 | Sickle (2H) | none | Not named in T1_Combat_System_Spec §Parry L454-460 (the canonical parry-capable roster) nor §Block L445-448 (the canonical block roster). Registry row carries damage_type SLASH / weapon_subclass LONG BLADES — neither is a defensive property (§2.3). Canon silence, read as none. |
| WPN_014 | Twin Sabre | none | Not named in T1_Combat_System_Spec §Parry L454-460 (the canonical parry-capable roster) nor §Block L445-448 (the canonical block roster). Registry row carries damage_type SLASH / weapon_subclass LONG BLADES — neither is a defensive property (§2.3). Canon silence, read as none. |
| WPN_015 | Spear | none | Not named in T1_Combat_System_Spec §Parry L454-460 (the canonical parry-capable roster) nor §Block L445-448 (the canonical block roster). Registry row carries damage_type PIERCE / weapon_subclass LONG BLADES — neither is a defensive property (§2.3). Canon silence, read as none. |
| WPN_016 | Club | none | Not named in T1_Combat_System_Spec §Parry L454-460 (the canonical parry-capable roster) nor §Block L445-448 (the canonical block roster). Registry row carries damage_type CRUSH / weapon_subclass BLUNT — neither is a defensive property (§2.3). Canon silence, read as none. |
| WPN_017 | Mace (2H) | none | Not named in T1_Combat_System_Spec §Parry L454-460 (the canonical parry-capable roster) nor §Block L445-448 (the canonical block roster). Registry row carries damage_type CRUSH / weapon_subclass BLUNT — neither is a defensive property (§2.3). Canon silence, read as none. |
| WPN_018 | Hammer (1H) | none | Not named in T1_Combat_System_Spec §Parry L454-460 (the canonical parry-capable roster) nor §Block L445-448 (the canonical block roster). Registry row carries damage_type CRUSH / weapon_subclass BLUNT — neither is a defensive property (§2.3). Canon silence, read as none. |
| WPN_019 | Hammer (2H) | none | Not named in T1_Combat_System_Spec §Parry L454-460 (the canonical parry-capable roster) nor §Block L445-448 (the canonical block roster). Registry row carries damage_type CRUSH / weapon_subclass BLUNT — neither is a defensive property (§2.3). Canon silence, read as none. |
| WPN_020 | Falchion | none | Not named in T1_Combat_System_Spec §Parry L454-460 (the canonical parry-capable roster) nor §Block L445-448 (the canonical block roster). Registry row carries damage_type CLEAVE / weapon_subclass SHORT BLADES — neither is a defensive property (§2.3). Canon silence, read as none. |
| WPN_021 | Throwing Axe | none | Not named in T1_Combat_System_Spec §Parry L454-460 (the canonical parry-capable roster) nor §Block L445-448 (the canonical block roster). Registry row carries damage_type CLEAVE / weapon_subclass THROWN — neither is a defensive property (§2.3). Canon silence, read as none. |
| WPN_022 | Javelin | none | Not named in T1_Combat_System_Spec §Parry L454-460 (the canonical parry-capable roster) nor §Block L445-448 (the canonical block roster). Registry row carries damage_type PIERCE / weapon_subclass THROWN — neither is a defensive property (§2.3). Canon silence, read as none. |
| WPN_023 | Shotgun | none | Not named in T1_Combat_System_Spec §Parry L454-460 (the canonical parry-capable roster) nor §Block L445-448 (the canonical block roster). Registry row carries damage_type BALLISTIC / weapon_subclass RANGE — neither is a defensive property (§2.3). Canon silence, read as none. |
| WPN_024 | Machine Gun | none | Not named in T1_Combat_System_Spec §Parry L454-460 (the canonical parry-capable roster) nor §Block L445-448 (the canonical block roster). Registry row carries damage_type BALLISTIC / weapon_subclass RANGE — neither is a defensive property (§2.3). Canon silence, read as none. |
| WPN_025 | Carbine | none | Not named in T1_Combat_System_Spec §Parry L454-460 (the canonical parry-capable roster) nor §Block L445-448 (the canonical block roster). Registry row carries damage_type BALLISTIC / weapon_subclass RANGE — neither is a defensive property (§2.3). Canon silence, read as none. |
| WPN_026 | Rifle | none | Not named in T1_Combat_System_Spec §Parry L454-460 (the canonical parry-capable roster) nor §Block L445-448 (the canonical block roster). Registry row carries damage_type BALLISTIC / weapon_subclass RANGE — neither is a defensive property (§2.3). Canon silence, read as none. |
| WPN_027 | Assault Rifle | none | Not named in T1_Combat_System_Spec §Parry L454-460 (the canonical parry-capable roster) nor §Block L445-448 (the canonical block roster). Registry row carries damage_type BALLISTIC / weapon_subclass RANGE — neither is a defensive property (§2.3). Canon silence, read as none. |
| WPN_028 | Long Bow | none | Not named in T1_Combat_System_Spec §Parry L454-460 (the canonical parry-capable roster) nor §Block L445-448 (the canonical block roster). Registry row carries damage_type BALLISTIC / weapon_subclass LONG RANGE — neither is a defensive property (§2.3). Canon silence, read as none. |
| WPN_029 | Cross Bow | none | Not named in T1_Combat_System_Spec §Parry L454-460 (the canonical parry-capable roster) nor §Block L445-448 (the canonical block roster). Registry row carries damage_type BALLISTIC / weapon_subclass LONG RANGE — neither is a defensive property (§2.3). Canon silence, read as none. |
| WPN_030 | Rocket Launcher | none | Not named in T1_Combat_System_Spec §Parry L454-460 (the canonical parry-capable roster) nor §Block L445-448 (the canonical block roster). Registry row carries damage_type BALLISTIC / weapon_subclass LONG RANGE — neither is a defensive property (§2.3). Canon silence, read as none. |
| WPN_031 | Missile Launcher | none | Not named in T1_Combat_System_Spec §Parry L454-460 (the canonical parry-capable roster) nor §Block L445-448 (the canonical block roster). Registry row carries damage_type BALLISTIC / weapon_subclass LONG RANGE — neither is a defensive property (§2.3). Canon silence, read as none. |
| WPN_032 | Xiphos | none | Not named in T1_Combat_System_Spec §Parry L454-460 (the canonical parry-capable roster) nor §Block L445-448 (the canonical block roster). Registry row carries damage_type SLASH / weapon_subclass OFF-HAND — neither is a defensive property (§2.3). Canon silence, read as none. |
| WPN_033 | Shield | parry | T1_Combat_System_Spec L447 (§Block, the Shield row) + docs/spine/CH_03.md L144 "turn each cracking arc on the clean parry" and L258 "grounding the main boss's parry (whip-and-shield rhythm) verb" + flores_island.md L672-673 and L691-692. Full argument at §3.1. |
| WPN_034 | Great Shield | block | T1_Combat_System_Spec L448 — "Great Shield (Ch 27 Central Europe): pavise and tower shield. Plant mechanic creates portable fortification." A planted fortification is a hold, not a timing window; no canon names a parry on it. |
| WPN_035 | Shotel | none | Not named in T1_Combat_System_Spec §Parry L454-460 (the canonical parry-capable roster) nor §Block L445-448 (the canonical block roster). Registry row carries damage_type CLEAVE / weapon_subclass SHORT BLADES — neither is a defensive property (§2.3). Canon silence, read as none. |
| WPN_036 | Macuahuitl | none | Not named in T1_Combat_System_Spec §Parry L454-460 (the canonical parry-capable roster) nor §Block L445-448 (the canonical block roster). Registry row carries damage_type CLEAVE / weapon_subclass SHORT BLADES — neither is a defensive property (§2.3). Canon silence, read as none. |
| WPN_037 | Magic Knuckles | none | Not named in T1_Combat_System_Spec §Parry L454-460 (the canonical parry-capable roster) nor §Block L445-448 (the canonical block roster). Registry row carries damage_type CRUSH / weapon_subclass FIST — neither is a defensive property (§2.3). Canon silence, read as none. |
| WPN_038 | Claws | none | Not named in T1_Combat_System_Spec §Parry L454-460 (the canonical parry-capable roster) nor §Block L445-448 (the canonical block roster). Registry row carries damage_type PIERCE / weapon_subclass FIST — neither is a defensive property (§2.3). Canon silence, read as none. |
| WPN_039 | Dagger | none | Not named in T1_Combat_System_Spec §Parry L454-460 (the canonical parry-capable roster) nor §Block L445-448 (the canonical block roster). Registry row carries damage_type PIERCE / weapon_subclass BLADES — neither is a defensive property (§2.3). Canon silence, read as none. |
| WPN_040 | Chakram | none | Not named in T1_Combat_System_Spec §Parry L454-460 (the canonical parry-capable roster) nor §Block L445-448 (the canonical block roster). Registry row carries damage_type SLASH / weapon_subclass BLADES — neither is a defensive property (§2.3). Canon silence, read as none. |
| WPN_041 | Sickle (1H) | none | Not named in T1_Combat_System_Spec §Parry L454-460 (the canonical parry-capable roster) nor §Block L445-448 (the canonical block roster). Registry row carries damage_type SLASH / weapon_subclass BLADES — neither is a defensive property (§2.3). Canon silence, read as none. |
| WPN_042 | Madu | catch | T1_Combat_System_Spec L459 — "Madu Horn Catch — only Trickery dedicated parry weapon, catch redirects creates opening"; L462 "the only Trickery weapon designed primarily for parry rather than offense". Registry damage_type GUARD corroborates. |
| WPN_043 | Sword (1H) | riposte | T1_Combat_System_Spec L460 — "Sword (1H) Riposte — parry and counter in one motion". |
| WPN_044 | Scepter | none | Not named in T1_Combat_System_Spec §Parry L454-460 (the canonical parry-capable roster) nor §Block L445-448 (the canonical block roster). Registry row carries damage_type FOCUS / weapon_subclass BLADES — neither is a defensive property (§2.3). Canon silence, read as none. |
| WPN_045 | Nunchuks | none | Not named in T1_Combat_System_Spec §Parry L454-460 (the canonical parry-capable roster) nor §Block L445-448 (the canonical block roster). Registry row carries damage_type FLEX_IMPACT / weapon_subclass BLUNT — neither is a defensive property (§2.3). Canon silence, read as none. |
| WPN_046 | Mace (1H) | none | Not named in T1_Combat_System_Spec §Parry L454-460 (the canonical parry-capable roster) nor §Block L445-448 (the canonical block roster). Registry row carries damage_type CRUSH / weapon_subclass BLUNT — neither is a defensive property (§2.3). Canon silence, read as none. |
| WPN_047 | Whip | none | Not named in T1_Combat_System_Spec §Parry L454-460 (the canonical parry-capable roster) nor §Block L445-448 (the canonical block roster). Registry row carries damage_type FLEX_IMPACT / weapon_subclass BLUNT — neither is a defensive property (§2.3). Canon silence, read as none. |
| WPN_048 | Flail | none | Not named in T1_Combat_System_Spec §Parry L454-460 (the canonical parry-capable roster) nor §Block L445-448 (the canonical block roster). Registry row carries damage_type FLEX_IMPACT / weapon_subclass BLUNT — neither is a defensive property (§2.3). Canon silence, read as none. |
| WPN_049 | Staff | none | Not named in T1_Combat_System_Spec §Parry L454-460 (the canonical parry-capable roster) nor §Block L445-448 (the canonical block roster). Registry row carries damage_type CRUSH / weapon_subclass BLUNT — neither is a defensive property (§2.3). Canon silence, read as none. |
| WPN_050 | Shuriken | none | Not named in T1_Combat_System_Spec §Parry L454-460 (the canonical parry-capable roster) nor §Block L445-448 (the canonical block roster). Registry row carries damage_type PIERCE / weapon_subclass THROWN — neither is a defensive property (§2.3). Canon silence, read as none. |
| WPN_051 | Throwing Knives | none | Not named in T1_Combat_System_Spec §Parry L454-460 (the canonical parry-capable roster) nor §Block L445-448 (the canonical block roster). Registry row carries damage_type PIERCE / weapon_subclass THROWN — neither is a defensive property (§2.3). Canon silence, read as none. |
| WPN_052 | Boomerang | none | Not named in T1_Combat_System_Spec §Parry L454-460 (the canonical parry-capable roster) nor §Block L445-448 (the canonical block roster). Registry row carries damage_type FLEX_IMPACT / weapon_subclass THROWN — neither is a defensive property (§2.3). Canon silence, read as none. |
| WPN_053 | Woven Cloth | none | Not named in T1_Combat_System_Spec §Parry L454-460 (the canonical parry-capable roster) nor §Block L445-448 (the canonical block roster). Registry row carries damage_type ENTANGLE / weapon_subclass RANGE — neither is a defensive property (§2.3). Canon silence, read as none. |
| WPN_054 | Fan (1H) | none | Not named in T1_Combat_System_Spec §Parry L454-460 (the canonical parry-capable roster) nor §Block L445-448 (the canonical block roster). Registry row carries damage_type SLASH / weapon_subclass RANGE — neither is a defensive property (§2.3). Canon silence, read as none. |
| WPN_055 | Sling | none | Not named in T1_Combat_System_Spec §Parry L454-460 (the canonical parry-capable roster) nor §Block L445-448 (the canonical block roster). Registry row carries damage_type BALLISTIC / weapon_subclass RANGE — neither is a defensive property (§2.3). Canon silence, read as none. |
| WPN_056 | Slingshot | none | Not named in T1_Combat_System_Spec §Parry L454-460 (the canonical parry-capable roster) nor §Block L445-448 (the canonical block roster). Registry row carries damage_type BALLISTIC / weapon_subclass RANGE — neither is a defensive property (§2.3). Canon silence, read as none. |
| WPN_057 | Light Bow | none | Not named in T1_Combat_System_Spec §Parry L454-460 (the canonical parry-capable roster) nor §Block L445-448 (the canonical block roster). Registry row carries damage_type BALLISTIC / weapon_subclass RANGE — neither is a defensive property (§2.3). Canon silence, read as none. |
| WPN_058 | Handgun | none | Not named in T1_Combat_System_Spec §Parry L454-460 (the canonical parry-capable roster) nor §Block L445-448 (the canonical block roster). Registry row carries damage_type BALLISTIC / weapon_subclass RANGE — neither is a defensive property (§2.3). Canon silence, read as none. |
| WPN_059 | Sub-Machine Gun | none | Not named in T1_Combat_System_Spec §Parry L454-460 (the canonical parry-capable roster) nor §Block L445-448 (the canonical block roster). Registry row carries damage_type BALLISTIC / weapon_subclass RANGE — neither is a defensive property (§2.3). Canon silence, read as none. |
| WPN_060 | Fan (2H) | none | Not named in T1_Combat_System_Spec §Parry L454-460 (the canonical parry-capable roster) nor §Block L445-448 (the canonical block roster). Registry row carries damage_type SLASH / weapon_subclass LONG RANGE — neither is a defensive property (§2.3). Canon silence, read as none. |
| WPN_061 | Hand Cannon | none | Not named in T1_Combat_System_Spec §Parry L454-460 (the canonical parry-capable roster) nor §Block L445-448 (the canonical block roster). Registry row carries damage_type BALLISTIC / weapon_subclass LONG RANGE — neither is a defensive property (§2.3). Canon silence, read as none. |
| WPN_062 | Sniper Rifle | none | Not named in T1_Combat_System_Spec §Parry L454-460 (the canonical parry-capable roster) nor §Block L445-448 (the canonical block roster). Registry row carries damage_type BALLISTIC / weapon_subclass LONG RANGE — neither is a defensive property (§2.3). Canon silence, read as none. |
| WPN_063 | Talisman Cards | none | Not named in T1_Combat_System_Spec §Parry L454-460 (the canonical parry-capable roster) nor §Block L445-448 (the canonical block roster). Registry row carries damage_type FOCUS / weapon_subclass MAGIC — neither is a defensive property (§2.3). Canon silence, read as none. |
| WPN_064 | Wand | none | T1_Combat_System_Spec L232 (Wand Canonical Lock) — "No physical damage capability. Cannot block." Canon states the negative directly; this none is CITED, not defaulted. |
| WPN_065 | Dragon Column | none | Not named in T1_Combat_System_Spec §Parry L454-460 (the canonical parry-capable roster) nor §Block L445-448 (the canonical block roster). Registry row carries damage_type FOCUS / weapon_subclass MAGIC — neither is a defensive property (§2.3). Canon silence, read as none. |
| WPN_066 | Bell | none | Not named in T1_Combat_System_Spec §Parry L454-460 (the canonical parry-capable roster) nor §Block L445-448 (the canonical block roster). Registry row carries damage_type RESONANCE / weapon_subclass SOUND — neither is a defensive property (§2.3). Canon silence, read as none. |
| WPN_067 | Harp | none | Not named in T1_Combat_System_Spec §Parry L454-460 (the canonical parry-capable roster) nor §Block L445-448 (the canonical block roster). Registry row carries damage_type RESONANCE / weapon_subclass SOUND — neither is a defensive property (§2.3). Canon silence, read as none. |
| WPN_068 | Flute | none | Not named in T1_Combat_System_Spec §Parry L454-460 (the canonical parry-capable roster) nor §Block L445-448 (the canonical block roster). Registry row carries damage_type RESONANCE / weapon_subclass SOUND — neither is a defensive property (§2.3). Canon silence, read as none. |
| WPN_069 | Orb | none | T1_Combat_System_Spec L226 (Sorcery Off-Hand Canonical Lock) — "Neither has direct damage capability. Both cannot block." CITED negative. |
| WPN_070 | Tomb | none | T1_Combat_System_Spec L226 — the same sentence, the Tomb half of the Orb-and-Tomb pair. CITED negative. |
| WPN_071 | Reindeer-Antler Knife | none | Not named in T1_Combat_System_Spec §Parry L454-460 (the canonical parry-capable roster) nor §Block L445-448 (the canonical block roster). Registry row carries damage_type PIERCE / weapon_subclass BLADES — neither is a defensive property (§2.3). Canon silence, read as none. |
| WPN_072 | Woomera | none | Not named in T1_Combat_System_Spec §Parry L454-460 (the canonical parry-capable roster) nor §Block L445-448 (the canonical block roster). Registry row carries damage_type BALLISTIC / weapon_subclass RANGE — neither is a defensive property (§2.3). Canon silence, read as none. |
---
| value | count | rows |
|---|---|---|
none | 65 | everything not listed below. Three of the 65 are CITED negatives rather than silences: WPN_064 Wand, WPN_069 Orb, WPN_070 Tomb (T1_Combat_System_Spec L226, L232) |
parry | 2 | WPN_008 Rapier (CH_28) · WPN_033 Shield (CH_03) |
riposte | 3 | WPN_005 Cutlass (CH_33) · WPN_011 Long Sword (CH_27) · WPN_043 Sword (1H) (CH_21) |
catch | 1 | WPN_042 Madu (CH_07) |
block | 1 | WPN_034 Great Shield (CH_27) |
| total | 72 |
Parry-family (parry + catch + riposte, the set the gate reads): 6 rows. Non-none: 7 rows.
Canon-named defensive weapons in T1_Combat_System_Spec: 5 parry (L456-460) + 2 block (L447-448) = 7.
The read produces exactly the canon roster and not one row more.
What the resolver returns after apply. Parry-family acquisition chapters: CH_03 (Shield), CH_07
(Madu), CH_21 (Sword 1H), CH_27 (Long Sword), CH_28 (Rapier), CH_33 (Cutlass). min = 3 →
grant_chapter["parry_only"] = 3, matching T1_Combat_System_Spec L685 exactly. The UNREACHABLE
branch at gate L581-585 stops firing, and parry_only rows at CH_03 and later become judged
instead of failed.
---
The brief states (L376-379): *"One column, defensive_class, over the gate's own three-member parry
family plus a non-parry value — parry | catch | riposte | none — populated across the 72 rows, **with
WPN_033 the first non-none cell.** That single row makes the resolver return parry_only → 3."*
Verdict: the operative half is CONFIRMED; the literal half is REFUTED as stated.
Shield at canonical_chapter_acquisition = CH_03 is the earliest acquisition of ANY weapon in the
whole 72-row roster, defensive or not (next: WPN_039 Dagger CH_04, WPN_041 Sickle 1H CH_05, then the
CH_07 cluster). It is therefore necessarily the earliest parry-family row, and min() over the six
parry-family rows resolves to 3 because of it and only because of it. Remove it and the grant jumps
to CH_07 (Madu), stranding parry_only at Ch 3-6.
none cell in the file. In registry row order the first non-none cell is WPN_005 Cutlass (riposte), then WPN_008 Rapier (parry), then WPN_011 Long
Sword (riposte) — three rows before WPN_033 is reached. The brief's sentence is true only if
"first" means *earliest by acquisition chapter*, which is the sense the resolver uses and evidently
the sense intended, but it is not what the sentence says. Anyone applying the column by walking rows
top-down and expecting the first hit at WPN_033 will conclude the read is wrong.
parry-family value BY ELIMINATION rather than by a canon read.** With no block member available, a
Shield that canon files under § Block can only be recorded as parry / catch / riposte or as
none; the brief's own trap (*"GUARD … does not mean parries"*) is then unenforceable on the one row
where the question is live. Under the five-member vocabulary the Shield's parry is an **argued
canon read** (§3.1: spine CH_03 L144 and L258, flores_island L672-673 and L691-692) rather than a
default, and the Great Shield can be recorded honestly as block instead of being flattened into the
same value.
---
| id | finding | consequence | minimal action | |
|---|---|---|---|---|
| D1 | The §7 brief's vocabulary is four members; canon supports five (§2.2). | A four-member column cannot record § Block (L443-450) or the three cited *"cannot block"* negatives (L226, L232). | apply the five-member set. Zero gate impact — block is outside PARRY_DEFENSIVE_CLASSES (L91). | |
| D2 | The Shield's value is the single load-bearing cell in the file (§3.1). | Option (C) — block with the gate unchanged — moves the parry grant to CH_07 and makes BE_0003, the Ch-3 parry exemplar this wave is sequenced around, unauthorable. | land option (A) parry, or option (B) plus the gate L91 edit — but decide it explicitly, because the failure mode of drifting into (C) is silent. | |
| D3 | The other four Vector-C columns are NOT authored here. docs/registry_extensions.json L161/L164 declares five: defensive_class, parry_window_ms, parry_stamina_cost, parry_generate, riposte_followup_ref. | T0_Imprint_Affix IMP_0005 (catch-window width, `applies_to_tags = defensive_class=parry\ | catch) resolves the moment defensive_class` lands; the ms and cost columns stay Phase-5M-blank under the magnitude firewall. | land defensive_class alone now. One canon read is already sitting for a companion column and is named so it is not lost: parry_generate = stamina on WPN_042 Madu — L459, *"every successful catch generates Stamina at Mastery 8"* — against L454's *"generates Stamina or Vril per weapon class"*, which is exactly why it must be a column and not a constant. |
| D4 | Resolver blind spot. Gate L577-579 skips any parry-family row whose canonical_chapter_acquisition does not parse (if n is not None). Four rows are blank today: WPN_015 Spear, WPN_016 Club, WPN_022 Javelin, WPN_037 Magic Knuckles. | All four are none, so nothing is wrong today — but a future parry-family weapon with a blank acquisition would be silently dropped from the grant computation rather than reported, which is the same defect class the UNREACHABLE branch was written to prevent. | harness-lane finding: WARN on a parry-family row with an unparseable acquisition chapter. | |
| D5 | The Shield row has no origin. WPN_033 carries regional_bonus_class = NO_ORIGIN_REGION and an EMPTY cultural_region_ref, while flores_island.md L669-673 names it the region's chapter-anchored weapon add and docs/PILLAR10_REGIONAL_COMBAT_VOCAB.md assigns flores_island the guard_yield token — *"the window a guard holds and the resource a successful defence returns"* — warranted on that very seating. No row in the registry carries guard_yield (measured over all 72). | Already declared at docs/PILLAR10_REGIONAL_COMBAT_VOCAB.md §4.1 L206-216, verbatim, and the value is CORRECT by that doc's own derivation rule (L200-201: empty cultural_region_ref → NO_ORIGIN_REGION) — so this is a declared composition gap, not a defect, and re-running the emitter changes nothing. | The only open question is whether WPN_033 should carry cultural_region_ref = flores_island at all — A7_WEAPON_EXEMPLAR_WPN_033.md L493 says no. Weapon-lane item, no action here. | |
| D6 | The Tier-6 per-weapon docs are one-line title stubs. T1_Combat_System_Spec L43 and L725 delegate all per-weapon detail to T6_Weapons_Brute_Detailed, T6_Weapons_Trickery_Detailed and T6_Weapons_Master_Index; all three files are a single heading line. | 65 of the 72 rows resolve on canon SILENCE rather than on a positive per-weapon statement, because there is no deeper per-weapon canon in the corpus to read. Honest today, stale the day Tier 6 is authored. | re-sweep defensive_class when the Tier-6 docs are authored: a weapon that gains a defensive ability there gains a cell here. | |
| D7 | Roster-vs-taxonomy divergence, pre-existing. T1_Combat_System_Spec L149 lists BLUNT (5) including a *"Hammer Sword"* that no registry row carries; the live registry files WPN_020 Falchion under SHORT BLADES, making BRUTE SHORT BLADES 10 and BRUTE BLUNT 4 against the spec's 7 and 5. | Not defensive-class-bearing — none of the affected rows carries a defensive mechanic in canon — but the spec's group taxonomy and the registry's weapon_subclass no longer agree, and a later lane reading the taxonomy will not find Hammer Sword. | living-source reconciliation owned by the weapon lane. Flagged, not touched (it is a canon edit). | |
| D8 | Corroboration rather than a defect: T1_Build_Pipeline_Contracts L2752 already reserves weapon_sfx_id_ref_array slots *"covering hit, block, parry, ranged release…"* per weapon. | The audio contract assumed a per-weapon defensive property before the registry modelled one. | none — independent evidence that the five-member vocabulary is the shape the pipeline already expects. |
---
No canon was changed: not T1_Combat_System_Spec, not the spine, not a region page, not a registry
row, not the CVD, not a numerical, naming, hard-line or §17 cell. **No registry cell was written, no
docs/fidelity_baseline.json was touched, no gate was run, docs/DOC_MAP.md was not edited, and
nothing was committed.** The two interpretive calls (§3.1, §3.2) are ruled on the record with their
alternatives, their recommendations and their strongest objections; §3.1 is reversible by the director
in one cell and §3.2 changes no gate verdict at all. Nothing here is put to Josh.
The apply, for the director. One column defensive_class appended to
registries/T0_Weapon_Registry [DRAFT v0.1]/Sheet1.csv via the csv module, values per §4 (the
WPN_033 cell single-valued parry, no delimiter), landing by the Vector-C path at
docs/registry_extensions.json defensive-properties L161/L164 (extend the stub_superseded
candidate_header and re-pin; NO added_columns key and NO extension_hashes key), with
docs/fidelity_baseline.json refreshed via --emit-baseline in the same commit and
python harness/run_gates.py exiting 0. Expected gate-28 delta: the *"A1 parry universe UNREACHABLE"*
declared-not-armed note disappears, and parry_answer first granted in chapter reads 3 instead of
UNREACHABLE. NOTE (critic F4): a green fidelity gate on T0_Weapon_Registry is VACUOUS — the
frozen reference xlsx carries ONE column against 32 live (docs/DOC_MAP.md L760), so nothing is
compared. The apply's real evidence is the counter_class_coverage scorecard flipping from UNREACHABLE
to parry_answer first granted in chapter 3, plus a pre/post byte-compare of all 32 existing columns
— not the gate's exit code.