feat(monk): 2014 Way of Shadow — four-spell 2-ki Shadow Arts, Cloak of Shadows at L11, Opportunist - #1732
Conversation
|
Claude finished @Sandersland's task in 4m 59s —— View job Code Review: feat(monk): 2014 Way of Shadow
SummarySolid implementation of a genuinely-forked 2014 subclass. The edition-tagging discipline is tight, the two rules-accuracy corrections (Cloak of Shadows at L11 not L13; Pass without Trace concentrates) are verified and correctly applied, and the integration-test coverage for the new mechanics is thorough. Two issues warrant a fix before merge. Findings1. Stale comment —
|
…f Shadows at L11, Opportunist (#1502) Slice 4/7 of the 2014 Monk epic (#1313), depends on #1500 (merged). Way of Shadow is not in SRD 5.1 — content transcribed from PHB'14 pp.79-80. - New Subclass row "Way of Shadow" (EDITION_2014, slug monk-way-of-shadow), a DISTINCT slug from Warrior of Shadow (now retagged EDITION_2024) — added to SUBCLASS_SLUGS/SUBCLASS_IDENTITY and monk.ts's subclasses map. - shadow-arts.ts (seed): widened ShadowArtSeed with per-row costPoolKey/ costBase (the field that genuinely forks); authored the real four-spell menu (Darkness/Darkvision/Pass without Trace/Silence, 2 ki each, PHB'14 pp.79-80) plus the retagged EDITION_2024 Darkness row. seedShadowArts reads cost fields per-row instead of hardcoding focus/1. - monk-features.ts: Warrior of Shadow's 4 rows tagged EDITION_2024; new WAY_OF_SHADOW_RAW (4 EDITION_2014 rows: Shadow Arts L3, Shadow Step L6 with no free unarmed strike, Cloak of Shadows L11 with no resource cost, Opportunist L17). - actions.ts: shadowStep/shadowArts/cloakOfShadows (2024) tagged EDITION_2024 explicitly; four new EDITION_2014 rows under the SAME action keys (disambiguated by edition + grantSubclassSlugs: ["monk-way-of-shadow"]) plus a new "opportunist" key (no 2024 counterpart). - shadow-arts.ts (lib): shadowArtEffectSpec's concentration is now name-keyed (every Shadow Art concentrates except "Shadow Arts: Darkvision" — verified against real PHB'14 spell durations: Darkness/Pass without Trace/Silence are all "Concentration, up to ..."; Darkvision is a flat 8-hour duration). activateCloakOfShadows is edition-branched: 2014 costs nothing (AbilityCost {kind:"none"}, not a fake 0-base pool spend), 2024 still costs 3 focus. Gate-rejection error text now names the edition-correct subclass/level. - subclass-granted-spells.ts: Way of Shadow's own Minor Illusion grant (EDITION_2014, L3, Wisdom), mirroring the 2024 grant. RULES-ACCURACY CORRECTIONS against the issue as filed (verified against PHB'14 text, not guessed): - Cloak of Shadows is PHB'14's 11th-level Monastic Tradition feature, not 13th — 2014 monk subclasses gate at 3/6/11/17 uniformly; no monk subclass feature exists at 13. Implemented at L11. - Concentration: the issue's brief said "only darkness and silence concentrate" — Pass without Trace is also a concentration spell ("Duration: Concentration, up to 1 hour"); only Darkvision (8 hours, no concentration prefix) is exempt. Implemented as Darkness/Pass without Trace/Silence concentrate, Darkvision does not. TDD: red tests first for the DERIVED_ACTIONS gates (actions.test.ts, would have failed with "expected undefined to be defined" pre-implementation, and did), then made green. Backend suite green (364 test files, 4418 tests, 14 pre-existing skips); typecheck and lint clean across all workspaces; `prisma db seed` verified idempotent (ran twice, second run silent — no stale-row drops); assertEverySubclassEditionPopulated and scripts/check-catalog-id-edition-guard.sh both pass; fallow audit verdict "pass" (0 dead code, 0 new complexity, 0 new duplication). Fixed the two stale pre-#1415 comments in granted-ability-fork-reseed.test.ts per the issue's own scope item, and added a new describe block proving the REAL SHADOW_ARTS catalog (not a fixture) round-trips two seed-equivalent runs. seed-data.test.ts's SHADOW_ARTS uniqueness test now keys on (name, edition) instead of name alone, matching CHANNEL_DIVINITIES/FEATS' own convention. Closes #1502 Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_018rre9Ho8Vx8zNtzzKkpvFn
2bb5631 to
a5ca96c
Compare
|
Claude finished @Sandersland's task in 3m 7s —— View job Code Review: feat(monk): 2014 Way of Shadow
SummaryThis is a re-review following a PR sync. Both major findings from the prior review have been addressed in this update. The implementation is solid and rules-accurate; one minor semantic residue remains. Prior findings — status1. Stale comment —
|
Summary
Slice 4/7 of the 2014 Monk epic (#1313), depends on #1500 (merged). Way of Shadow is not in SRD 5.1 — content transcribed from PHB'14 pp.79-80, per the 2026-08-04 execution decision on #1502.
Subclassrow "Way of Shadow" (EDITION_2014, slugmonk-way-of-shadow) — a distinct slug from Warrior of Shadow (now explicitly retaggedEDITION_2024), added toSUBCLASS_SLUGS/SUBCLASS_IDENTITYandmonk.ts'ssubclassesmap.shadow-arts.ts(seed): widenedShadowArtSeedwith per-rowcostPoolKey/costBase(the field that genuinely forks between editions); authored the real four-spell menu (Darkness/Darkvision/Pass without Trace/Silence, 2 ki each) plus the retagged 2024 Darkness row.seedShadowArtsreads cost fields per-row instead of hardcodingfocus/1.monk-features.ts: Warrior of Shadow's 4 rows taggedEDITION_2024; newWAY_OF_SHADOW_RAW(4EDITION_2014rows — Shadow Arts L3, Shadow Step L6 with no free unarmed strike, Cloak of Shadows L11 with no resource cost, Opportunist L17).actions.ts:shadowStep/shadowArts/cloakOfShadows(2024) taggedEDITION_2024explicitly; four newEDITION_2014rows under the same action keys, disambiguated byedition+grantSubclassSlugs: ["monk-way-of-shadow"], plus a newopportunistkey (no 2024 counterpart).shadow-arts.ts(lib):shadowArtEffectSpec's concentration is now name-keyed — every Shadow Art concentrates except"Shadow Arts: Darkvision".activateCloakOfShadowsis edition-branched: 2014 costs nothing (AbilityCost {kind:"none"}, not a fake 0-base pool spend), 2024 still costs 3 focus. Gate-rejection error text names the edition-correct subclass/level.subclass-granted-spells.ts: Way of Shadow's own Minor Illusion grant (EDITION_2014, L3, Wisdom).Rules-accuracy corrections against the issue as filed
Verified against PHB'14 text (web search), not guessed:
Both corrections are called out prominently for the mandatory Opus rules-accuracy pass.
Test plan
DERIVED_ACTIONSgates (actions.test.ts) — confirmed failing ("expected undefined to be defined") before implementation, green after.npm run typecheckandnpm run lintclean across all workspaces (backend, frontend, contracts, shared-types).prisma db seedverified idempotent — ran twice from a fresh worktree DB, second run produced no stale-row drops.assertEverySubclassEditionPopulatedpasses;scripts/check-catalog-id-edition-guard.shpasses unmodified (symbol-stable allowlist entry).fallow audit --base c610a898verdict pass — 0 dead code, 0 new complexity findings, 0 new duplication introduced.granted-ability-fork-reseed.test.tsper the issue's own scope item, and added a new describe block proving the realSHADOW_ARTScatalog (not a fixture) round-trips two seed-equivalent runs (5 rows: 4×2014 + 1×2024, "Shadow Arts: Darkness" once per edition).seed-data.test.ts'sSHADOW_ARTSuniqueness test now keys on(name, edition)instead of name alone, matchingCHANNEL_DIVINITIES/FEATS' own convention.shadow-arts-cast.test.tsfor the real 2014 mechanics: 2-ki spend regardless of which spell, per-spell concentration (including the Darkvision exception), level gates at 3/6/11/17, freecloakOfShadows,opportunistas a reminder-only reaction, and the edition-scoped picker route.Closes #1502
🤖 Generated with Claude Code
https://claude.ai/code/session_018rre9Ho8Vx8zNtzzKkpvFn