P2 — confirmed 2/2 by adversarial review (see docs/reviews/2026-07-03-rules-layer-review.md, PR #19).
hthBonuses correctly accumulates every bonus key from hand-to-hand.json (test-asserted: hthBonuses("basic", 12) includes pullPunch: 4, rollWithImpact: 4, disarm: 1), but CombatProfile (combat.ts:144-162) and deriveSheet (character.ts) carry only strike/parry/dodge/damage. The content-backed bonuses never reach any sheet — and since the Convex layer (#6) and UI (#10) render exactly what deriveSheet returns, they can never reach the rendered sheet either.
Fix: carry all hthBonuses keys through CombatProfile (spread the record) or add explicit pullPunch/rollWithImpact/disarm/entangle fields. Basic grants pull punch +2 / roll +2 at level 1, so this affects every character from level 1.
P2 — confirmed 2/2 by adversarial review (see
docs/reviews/2026-07-03-rules-layer-review.md, PR #19).hthBonusescorrectly accumulates every bonus key fromhand-to-hand.json(test-asserted:hthBonuses("basic", 12)includespullPunch: 4, rollWithImpact: 4, disarm: 1), butCombatProfile(combat.ts:144-162) andderiveSheet(character.ts) carry only strike/parry/dodge/damage. The content-backed bonuses never reach any sheet — and since the Convex layer (#6) and UI (#10) render exactly whatderiveSheetreturns, they can never reach the rendered sheet either.Fix: carry all
hthBonuseskeys throughCombatProfile(spread the record) or add explicitpullPunch/rollWithImpact/disarm/entanglefields. Basic grants pull punch +2 / roll +2 at level 1, so this affects every character from level 1.