DEFENSIVE_CLASS_CANON_READ.md

systems/DEFENSIVE_CLASS_CANON_READ.md

defensive_class — THE CANON READ, 72 of 72

Canon 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
csv module, against registries/T0_Weapon_Registry [DRAFT v0.1]/Sheet1.csv, with the scoped
docs/fidelity_baseline.json refresh (--emit-baseline) in the same commit, per the Vector-C
landing path already declared at docs/registry_extensions.json defensive-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).

---

0. DERIVATION

DERIVED FROM

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).

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"*).

the 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)"*.

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.

"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.

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.

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.

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.

qualified <qualifier>_class. defensive_class complies as named; no rename needed.

T0_Weapon_Registry.defensive_class"*; docs/fk_spec.json L997 — the same answer-home mapping.

not hold until Ch 3+ … shield/block is Ch-3 Manggarai"* — the identification of the Ch-3 grant with

the Shield, stated outside T1.

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.

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.

*"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.

---

1. WHAT THE COLUMN IS, AND WHY THE GATE CANNOT SEE PAST IT

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.

---

2. THE VALUE VOCABULARY, DERIVED

2.1 The five members, each with its canon warrant

valuewhat it means in canoncanon warrantparry-family per gate L91
nonethe weapon carries no defensive mechanicthe 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
blocka held, resource-paid guard — *"Stamina-based active block, hold to maintain"*, and a planted fortificationT1_Combat_System_Spec L443-450, § Block Mechanic, a section of its ownno
parrya defensive TIMING WINDOW on the weapon — *"Weapon-based defensive timing window"*T1_Combat_System_Spec L452-454, and L456's *"dedicated parry mechanic"*yes
catcha 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 Catchyes
ripostea 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 weaponsyes

Every one of the five is a word canon uses, in a sentence canon writes, about a mechanic canon owns.

None is minted here.

2.2 CORRECTION TO THE §7 BRIEF: the vocabulary is FIVE members, not four

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.

(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.

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.

2.3 THE TRAP, EXECUTED AND EVIDENCED

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 rulerows it yieldsverdict against the canon read
damage_type == GUARDWPN_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-HANDWPN_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 == BRUTE36meaningless — 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.

2.4 Naming-law compliance

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.

---

3. THE TWO INTERPRETIVE CALLS, RULED WITH THEIR ALTERNATIVES

3.1 WPN_033 Shield — parry, not block

The 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.

parry** until the count is kept."* The shield is in hand and the action canon names is a parry.

here … 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.

first off-hand Shield and ground the CH_03 main boss's PARRY verb."*

whose four-ability pool draws on the caci's read-and-turn discipline (the clean parry, the kept

count, the answering pass)."*

CH_03 is the earliest weapon acquisition in the entire 72-row registry (measured). It is the only

weapon that can make L685 true.

*"shield/block is Ch-3 Manggarai."*

Options, stated.

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.** 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.

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.**

3.2 WPN_011 Long Sword — riposte, not parry

Canon (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.

---

4. THE 72 ROWS

WPN_001 .. WPN_072, in registry order, every cell cited.

weapon_idweapon_namePROPOSED defensive_classcitation
WPN_001KnucklesnoneNot 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_002GauntletnoneNot 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_003CestusnoneNot 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_004Axe (1H)noneNot 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_005CutlassriposteT1_Combat_System_Spec L458 — "Cutlass Parry Riposte — block then counter". Canon names the riposte on this weapon.
WPN_006ScimitarnoneNot 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_007Hook SwordsnoneNot 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_008RapierparryT1_Combat_System_Spec L456 — "Rapier Parry ability — dedicated parry mechanic". A dedicated timing window, no counter attached.
WPN_009Axe (2H)noneNot 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_010KatananoneNot 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_011Long SwordriposteT1_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_012Great SwordnoneNot 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_013Sickle (2H)noneNot 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_014Twin SabrenoneNot 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_015SpearnoneNot 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_016ClubnoneNot 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_017Mace (2H)noneNot 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_018Hammer (1H)noneNot 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_019Hammer (2H)noneNot 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_020FalchionnoneNot 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_021Throwing AxenoneNot 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_022JavelinnoneNot 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_023ShotgunnoneNot 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_024Machine GunnoneNot 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_025CarbinenoneNot 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_026RiflenoneNot 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_027Assault RiflenoneNot 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_028Long BownoneNot 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_029Cross BownoneNot 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_030Rocket LaunchernoneNot 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_031Missile LaunchernoneNot 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_032XiphosnoneNot 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_033ShieldparryT1_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_034Great ShieldblockT1_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_035ShotelnoneNot 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_036MacuahuitlnoneNot 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_037Magic KnucklesnoneNot 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_038ClawsnoneNot 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_039DaggernoneNot 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_040ChakramnoneNot 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_041Sickle (1H)noneNot 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_042MaducatchT1_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_043Sword (1H)riposteT1_Combat_System_Spec L460 — "Sword (1H) Riposte — parry and counter in one motion".
WPN_044ScepternoneNot 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_045NunchuksnoneNot 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_046Mace (1H)noneNot 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_047WhipnoneNot 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_048FlailnoneNot 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_049StaffnoneNot 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_050ShurikennoneNot 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_051Throwing KnivesnoneNot 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_052BoomerangnoneNot 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_053Woven ClothnoneNot 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_054Fan (1H)noneNot 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_055SlingnoneNot 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_056SlingshotnoneNot 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_057Light BownoneNot 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_058HandgunnoneNot 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_059Sub-Machine GunnoneNot 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_060Fan (2H)noneNot 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_061Hand CannonnoneNot 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_062Sniper RiflenoneNot 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_063Talisman CardsnoneNot 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_064WandnoneT1_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_065Dragon ColumnnoneNot 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_066BellnoneNot 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_067HarpnoneNot 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_068FlutenoneNot 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_069OrbnoneT1_Combat_System_Spec L226 (Sorcery Off-Hand Canonical Lock) — "Neither has direct damage capability. Both cannot block." CITED negative.
WPN_070TombnoneT1_Combat_System_Spec L226 — the same sentence, the Tomb half of the Orb-and-Tomb pair. CITED negative.
WPN_071Reindeer-Antler KnifenoneNot 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_072WoomeranoneNot 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.

---

5. COUNTS

valuecountrows
none65everything 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)
parry2WPN_008 Rapier (CH_28) · WPN_033 Shield (CH_03)
riposte3WPN_005 Cutlass (CH_33) · WPN_011 Long Sword (CH_27) · WPN_043 Sword (1H) (CH_21)
catch1WPN_042 Madu (CH_07)
block1WPN_034 Great Shield (CH_27)
total72

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.

---

6. THE WPN_033 VERDICT — the §7 brief's claim, tested

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.

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.

---

7. FINDINGS FOR THE DIRECTOR

idfindingconsequenceminimal action
D1The §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).
D2The 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.
D3The 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.
D4Resolver 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.
D5The 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_refNO_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.
D6The 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.
D7Roster-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).
D8Corroboration 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.

---

8. WHAT THIS LANE DID NOT DO

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.

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