$ pnpm data:test # cwd /Users/king/Desktop/Workspace/SRO/zoen # exit 1 > zoen@0.1.0 data:test /Users/king/Desktop/Workspace/SRO/zoen > pnpm --filter @zoen/game-data test > @zoen/game-data@0.1.0 test /Users/king/Desktop/Workspace/SRO/zoen/packages/game-data > node --test "tests/*.test.mjs" TAP version 13 # Subtest: art library has items and unique ids ok 1 - art library has items and unique ids --- duration_ms: 8.762875 type: 'test' ... # Subtest: every web image exists, is WebP and is small ok 2 - every web image exists, is WebP and is small --- duration_ms: 408.73175 type: 'test' ... # Subtest: every original still exists inside zoen with the recorded hash (originals untouched) ok 3 - every original still exists inside zoen with the recorded hash (originals untouched) --- duration_ms: 2312.878917 type: 'test' ... # Subtest: art request ids unique and prioritised ok 4 - art request ids unique and prioritised --- duration_ms: 1.02325 type: 'test' ... # Subtest: every reference image exists (so Codex can compare with current art) ok 5 - every reference image exists (so Codex can compare with current art) --- duration_ms: 42.442041 type: 'test' ... # Subtest: every iconRequest in game data has an art request ok 6 - every iconRequest in game data has an art request --- duration_ms: 48.39425 type: 'test' ... # Subtest: markdown files exist for every category and prompts are non-trivial ok 7 - markdown files exist for every category and prompts are non-trivial --- duration_ms: 0.75075 type: 'test' ... # node:fs:560 # return binding.open( # ^ # Error: ENOENT: no such file or directory, open '/Users/king/Desktop/Workspace/SRO/zoen/art/source/skill-icons/ART-SKL-talon-pounce.png' # at Object.openSync (node:fs:560:18) # at Object.readFileSync (node:fs:444:35) # at sha (file:///Users/king/Desktop/Workspace/SRO/zoen/tools/art-sync.mjs:71:58) # at requestSha (file:///Users/king/Desktop/Workspace/SRO/zoen/tools/art-sync.mjs:74:66) # at file:///Users/king/Desktop/Workspace/SRO/zoen/tools/art-sync.mjs:84:89 # at ModuleJob.run (node:internal/modules/esm/module_job:343:25) # at async onImport.tracePromise.__proto__ (node:internal/modules/esm/loader:681:26) # at async asyncRunEntryPointWithESMLoader (node:internal/modules/run_main:117:5) { # errno: -2, # code: 'ENOENT', # syscall: 'open', # path: '/Users/king/Desktop/Workspace/SRO/zoen/art/source/skill-icons/ART-SKL-talon-pounce.png' # } # Node.js v22.23.1 # node:fs:560 # return binding.open( # ^ # Error: ENOENT: no such file or directory, open '/Users/king/Desktop/Workspace/SRO/zoen/art/source/vfx-textures/vfx_core_flipbooks/fixture.png' # at Object.openSync (node:fs:560:18) # at Object.readFileSync (node:fs:444:35) # at requestSha (file:///Users/king/Desktop/Workspace/SRO/zoen/tools/art-sync.mjs:79:17) # at file:///Users/king/Desktop/Workspace/SRO/zoen/tools/art-sync.mjs:84:89 # at ModuleJob.run (node:internal/modules/esm/module_job:343:25) # at async onImport.tracePromise.__proto__ (node:internal/modules/esm/loader:681:26) # at async asyncRunEntryPointWithESMLoader (node:internal/modules/run_main:117:5) { # errno: -2, # code: 'ENOENT', # syscall: 'open', # path: '/Users/king/Desktop/Workspace/SRO/zoen/art/source/vfx-textures/vfx_core_flipbooks/fixture.png' # } # Node.js v22.23.1 # Subtest: art requests carry delivery path, status, filesystem references and update instructions ok 8 - art requests carry delivery path, status, filesystem references and update instructions --- duration_ms: 252.677542 type: 'test' ... # Subtest: art-sync (dry run) matches a delivered file to its request and plans the data update not ok 9 - art-sync (dry run) matches a delivered file to its request and plans the data update --- duration_ms: 1960.024333 type: 'test' location: '/Users/king/Desktop/Workspace/SRO/zoen/packages/game-data/tests/art-sync.test.mjs:28:1' failureType: 'testCodeFailure' error: |- Command failed: /Users/king/.nvm/versions/node/v22.23.1/bin/node /Users/king/Desktop/Workspace/SRO/zoen/tools/art-sync.mjs --dry-run --json node:fs:560 return binding.open( ^ Error: ENOENT: no such file or directory, open '/Users/king/Desktop/Workspace/SRO/zoen/art/source/skill-icons/ART-SKL-talon-pounce.png' at Object.openSync (node:fs:560:18) at Object.readFileSync (node:fs:444:35) at sha (file:///Users/king/Desktop/Workspace/SRO/zoen/tools/art-sync.mjs:71:58) at requestSha (file:///Users/king/Desktop/Workspace/SRO/zoen/tools/art-sync.mjs:74:66) at file:///Users/king/Desktop/Workspace/SRO/zoen/tools/art-sync.mjs:84:89 at ModuleJob.run (node:internal/modules/esm/module_job:343:25) at async onImport.tracePromise.__proto__ (node:internal/modules/esm/loader:681:26) at async asyncRunEntryPointWithESMLoader (node:internal/modules/run_main:117:5) { errno: -2, code: 'ENOENT', syscall: 'open', path: '/Users/king/Desktop/Workspace/SRO/zoen/art/source/skill-icons/ART-SKL-talon-pounce.png' } Node.js v22.23.1 code: 'ERR_TEST_FAILURE' stack: |- Object.openSync (node:fs:560:18) Object.readFileSync (node:fs:444:35) sha (file:///Users/king/Desktop/Workspace/SRO/zoen/tools/art-sync.mjs:71:58) requestSha (file:///Users/king/Desktop/Workspace/SRO/zoen/tools/art-sync.mjs:74:66) file:///Users/king/Desktop/Workspace/SRO/zoen/tools/art-sync.mjs:84:89 ModuleJob.run (node:internal/modules/esm/module_job:343:25) async onImport.tracePromise.__proto__ (node:internal/modules/esm/loader:681:26) async asyncRunEntryPointWithESMLoader (node:internal/modules/run_main:117:5) { genericNodeError (node:internal/errors:983:15) wrappedFn (node:internal/errors:537:14) checkExecSyncError (node:child_process:916:11) execFileSync (node:child_process:952:15) TestContext. (file:///Users/king/Desktop/Workspace/SRO/zoen/packages/game-data/tests/art-sync.test.mjs:45:28) Test.runInAsyncScope (node:async_hooks:214:14) Test.run (node:internal/test_runner/test:1047:25) Test.processPendingSubtests (node:internal/test_runner/test:744:18) Test.postRun (node:internal/test_runner/test:1173:19) Test.run (node:internal/test_runner/test:1101:12) ... # Subtest: art-sync (dry run) matches nested files to wildcard bundle requests not ok 10 - art-sync (dry run) matches nested files to wildcard bundle requests --- duration_ms: 509.4075 type: 'test' location: '/Users/king/Desktop/Workspace/SRO/zoen/packages/game-data/tests/art-sync.test.mjs:59:1' failureType: 'testCodeFailure' error: |- Command failed: /Users/king/.nvm/versions/node/v22.23.1/bin/node /Users/king/Desktop/Workspace/SRO/zoen/tools/art-sync.mjs --dry-run --json node:fs:560 return binding.open( ^ Error: ENOENT: no such file or directory, open '/Users/king/Desktop/Workspace/SRO/zoen/art/source/vfx-textures/vfx_core_flipbooks/fixture.png' at Object.openSync (node:fs:560:18) at Object.readFileSync (node:fs:444:35) at requestSha (file:///Users/king/Desktop/Workspace/SRO/zoen/tools/art-sync.mjs:79:17) at file:///Users/king/Desktop/Workspace/SRO/zoen/tools/art-sync.mjs:84:89 at ModuleJob.run (node:internal/modules/esm/module_job:343:25) at async onImport.tracePromise.__proto__ (node:internal/modules/esm/loader:681:26) at async asyncRunEntryPointWithESMLoader (node:internal/modules/run_main:117:5) { errno: -2, code: 'ENOENT', syscall: 'open', path: '/Users/king/Desktop/Workspace/SRO/zoen/art/source/vfx-textures/vfx_core_flipbooks/fixture.png' } Node.js v22.23.1 code: 'ERR_TEST_FAILURE' stack: |- Object.openSync (node:fs:560:18) Object.readFileSync (node:fs:444:35) requestSha (file:///Users/king/Desktop/Workspace/SRO/zoen/tools/art-sync.mjs:79:17) file:///Users/king/Desktop/Workspace/SRO/zoen/tools/art-sync.mjs:84:89 ModuleJob.run (node:internal/modules/esm/module_job:343:25) async onImport.tracePromise.__proto__ (node:internal/modules/esm/loader:681:26) async asyncRunEntryPointWithESMLoader (node:internal/modules/run_main:117:5) { genericNodeError (node:internal/errors:983:15) wrappedFn (node:internal/errors:537:14) checkExecSyncError (node:child_process:916:11) execFileSync (node:child_process:952:15) TestContext. (file:///Users/king/Desktop/Workspace/SRO/zoen/packages/game-data/tests/art-sync.test.mjs:67:28) Test.runInAsyncScope (node:async_hooks:214:14) Test.run (node:internal/test_runner/test:1047:25) Test.processPendingSubtests (node:internal/test_runner/test:744:18) Test.postRun (node:internal/test_runner/test:1173:19) Test.run (node:internal/test_runner/test:1101:12) ... # Subtest: size and composition ok 11 - size and composition --- duration_ms: 3.346083 type: 'test' ... # Subtest: every edge endpoint exists, no duplicate or self edges, graph is connected ok 12 - every edge endpoint exists, no duplicate or self edges, graph is connected --- duration_ms: 1.399292 type: 'test' ... # Subtest: no two nodes overlap (≥ 12 units clear between rims) ok 13 - no two nodes overlap (≥ 12 units clear between rims) --- duration_ms: 36.98275 type: 'test' ... # Subtest: no path passes under a node it does not connect (≥ 6 units clear) ok 14 - no path passes under a node it does not connect (≥ 6 units clear) --- duration_ms: 3273.051375 type: 'test' ... # Subtest: no two paths cross each other ok 15 - no two paths cross each other --- duration_ms: 25126.407708 type: 'test' ... # Subtest: arc edges really are circular and start/end on their nodes ok 16 - arc edges really are circular and start/end on their nodes --- duration_ms: 94.615583 type: 'test' ... # Subtest: every mastery reachable from every origin without crossing another start ok 17 - every mastery reachable from every origin without crossing another start --- duration_ms: 5.417292 type: 'test' ... # Subtest: path identity: own pure masteries cheapest, hybrids cost more, far poles cost most ok 18 - path identity: own pure masteries cheapest, hybrids cost more, far poles cost most --- duration_ms: 9.840625 type: 'test' ... # Subtest: every build’s recommended origin can wield an item-level-40 weapon within 45 points ok 19 - every build’s recommended origin can wield an item-level-40 weapon within 45 points --- duration_ms: 12.364584 type: 'test' ... # Subtest: icons on nodes exist; nodes without icons carry an art request ok 20 - icons on nodes exist; nodes without icons carry an art request --- duration_ms: 4.064875 type: 'test' ... # Subtest: opportunity cost: far-pole weapons need ~2× the points of the native origin ok 21 - opportunity cost: far-pole weapons need ~2× the points of the native origin --- duration_ms: 3.84375 type: 'test' ... # Subtest: gen-atlas.mjs is deterministic ok 22 - gen-atlas.mjs is deterministic --- duration_ms: 371.176959 type: 'test' ... # Subtest: gen-progression.mjs is deterministic ok 23 - gen-progression.mjs is deterministic --- duration_ms: 304.954083 type: 'test' ... # Subtest: 11 equipment slots: helmet, main hand, off hand, gloves, boots, armour, belt, necklace, earring, 2 rings ok 24 - 11 equipment slots: helmet, main hand, off hand, gloves, boots, armour, belt, necklace, earring, 2 rings --- duration_ms: 1.483083 type: 'test' ... # Subtest: rarity is the affix count; affix tiers climb T5 < T4 < T3 ok 25 - rarity is the affix count; affix tiers climb T5 < T4 < T3 --- duration_ms: 0.958791 type: 'test' ... # Subtest: example items are legal: affix count = rarity, ≤3 prefixes/suffixes, slot, tier by ilvl, value in range, sockets ≤ cap ok 26 - example items are legal: affix count = rarity, ≤3 prefixes/suffixes, slot, tier by ilvl, value in range, sockets ≤ cap --- duration_ms: 2.748541 type: 'test' ... # Subtest: orbs and shards stack to 999 and have icons; gems have icons ok 27 - orbs and shards stack to 999 and have icons; gems have icons --- duration_ms: 1.127667 type: 'test' ... # Subtest: consumables: potions, cleanses, elixirs, food and the travel/speed/reset scrolls exist; vendors are real NPCs ok 28 - consumables: potions, cleanses, elixirs, food and the travel/speed/reset scrolls exist; vendors are real NPCs --- duration_ms: 0.424125 type: 'test' ... # Subtest: materials: exactly 2 per monster, wired into bestiary drops, sell for gold ok 29 - materials: exactly 2 per monster, wired into bestiary drops, sell for gold --- duration_ms: 0.645708 type: 'test' ... # Subtest: mounts: four desert mounts at 10/20/30/40, faster and pricier each step ok 30 - mounts: four desert mounts at 10/20/30/40, faster and pricier each step --- duration_ms: 0.149083 type: 'test' ... # Subtest: vendors: blacksmith sells only real white bases; every vendor NPC exists ok 31 - vendors: blacksmith sells only real white bases; every vendor NPC exists --- duration_ms: 0.641916 type: 'test' ... # Subtest: rulesets: alpha is the live game × multipliers (no custom kit); keys are single-use ok 32 - rulesets: alpha is the live game × multipliers (no custom kit); keys are single-use --- duration_ms: 22.713709 type: 'test' ... # Subtest: inventory window contract: 11 slots on a 12×7 grid without overlap, weapons 2×6, armour 2×3, belt 2×1, bag 12×5 ok 33 - inventory window contract: 11 slots on a 12×7 grid without overlap, weapons 2×6, armour 2×3, belt 2×1, bag 12×5 --- duration_ms: 1.615208 type: 'test' ... # Subtest: round 5: orbs coloured by rarity, gems by socket colour (Jade Caravan rule) ok 34 - round 5: orbs coloured by rarity, gems by socket colour (Jade Caravan rule) --- duration_ms: 5.253625 type: 'test' ... # Subtest: round 5: every published equipment icon has inventory fit data (tools/build-icon-fit.py) ok 35 - round 5: every published equipment icon has inventory fit data (tools/build-icon-fit.py) --- duration_ms: 6.223708 type: 'test' ... # Subtest: round 7: every stackable drop class rolls a random quantity; the market stays capped, bound and helper-only ok 36 - round 7: every stackable drop class rolls a random quantity; the market stays capped, bound and helper-only --- duration_ms: 1.54275 type: 'test' ... # Subtest: feel tiers: low → ultra, layers only grow, ultra-only screen effects ok 37 - feel tiers: low → ultra, layers only grow, ultra-only screen effects --- duration_ms: 4.066792 type: 'test' ... # Subtest: feel rules: presentation only, no global time-scale, telegraphs never culled; haptics for every impact ok 38 - feel rules: presentation only, no global time-scale, telegraphs never culled; haptics for every impact --- duration_ms: 0.637084 type: 'test' ... # Subtest: audio requests: every skill, weapon family, hit material and zone has a prompt; prompts never name another game ok 39 - audio requests: every skill, weapon family, hit material and zone has a prompt; prompts never name another game --- duration_ms: 40.199334 type: 'test' ... # Subtest: shared combat hit requests describe short separable layers ok 40 - shared combat hit requests describe short separable layers --- duration_ms: 4.24125 type: 'test' ... # Subtest: platform caps (owner, round 4): browser ≤ Mid; apps up to Ultra ok 41 - platform caps (owner, round 4): browser ≤ Mid; apps up to Ultra --- duration_ms: 0.5045 type: 'test' ... # --at needs an ISO date/time, got "not-a-date" # Subtest: cost estimate uses the pricing table (Opus 5.5 list prices) ok 42 - cost estimate uses the pricing table (Opus 5.5 list prices) --- duration_ms: 1.216208 type: 'test' ... # Subtest: time: wall clock includes stoppages, active counts only short gaps ok 43 - time: wall clock includes stoppages, active counts only short gaps --- duration_ms: 23.601375 type: 'test' ... # Subtest: codex ledger reads only zoen/ sessions, dedupes usage records and counts image calls ok 44 - codex ledger reads only zoen/ sessions, dedupes usage records and counts image calls --- duration_ms: 248.813416 type: 'test' ... # Subtest: token windows can be limited to one session (concurrent sessions are not double-counted) ok 45 - token windows can be limited to one session (concurrent sessions are not double-counted) --- duration_ms: 0.770417 type: 'test' ... # Subtest: task-log records --session and a back-dated --at start without counting flags as text ok 46 - task-log records --session and a back-dated --at start without counting flags as text --- duration_ms: 1449.623417 type: 'test' ... # Subtest: incremental transcript cache gives the same totals as a full parse ok 47 - incremental transcript cache gives the same totals as a full parse --- duration_ms: 794.266958 type: 'test' ... # Subtest: roadmap: unique ids, deps exist, every M0–M2 task has a test and evidence ok 48 - roadmap: unique ids, deps exist, every M0–M2 task has a test and evidence --- duration_ms: 1.891917 type: 'test' ... # Subtest: glossary terms unique and defined ok 49 - glossary terms unique and defined --- duration_ms: 9.700583 type: 'test' ... # Subtest: HUD rects inside the screen, art pieces exist as art requests, no desktop overlap of core widgets ok 50 - HUD rects inside the screen, art pieces exist as art requests, no desktop overlap of core widgets --- duration_ms: 16.468 type: 'test' ... # Subtest: stack: every layer has a choice, version and cost line; setup steps numbered ok 51 - stack: every layer has a choice, version and cost line; setup steps numbered --- duration_ms: 4.142833 type: 'test' ... # Subtest: glossary: every term links to a wiki screen; popups use known kinds ok 52 - glossary: every term links to a wiki screen; popups use known kinds --- duration_ms: 1.733792 type: 'test' ... # Subtest: team position events: ≥ 3 proposals, each with ≥ 3 positions, a job, abilities and a build cost; owner decision OPEN-8 ok 53 - team position events: ≥ 3 proposals, each with ≥ 3 positions, a job, abilities and a build cost; owner decision OPEN-8 --- duration_ms: 0.496167 type: 'test' ... # Subtest: release versioning: semver current version on a known channel; shown on the loading screen ok 54 - release versioning: semver current version on a known channel; shown on the loading screen --- duration_ms: 0.432291 type: 'test' ... # Subtest: cosmetic side quests: every cosmetic has a source, every questline rewards a catalog cosmetic, boss-only drops name a real boss ok 55 - cosmetic side quests: every cosmetic has a source, every questline rewards a catalog cosmetic, boss-only drops name a real boss --- duration_ms: 6.077958 type: 'test' ... # Subtest: GM room covers the owner test needs; web activity feed is free in alpha, premium later, read-only ok 56 - GM room covers the owner test needs; web activity feed is free in alpha, premium later, read-only --- duration_ms: 2.877041 type: 'test' ... # Subtest: round 6: security rules — only "certain" rules ban at once; appeal-only review; patching plan per platform ok 57 - round 6: security rules — only "certain" rules ban at once; appeal-only review; patching plan per platform --- duration_ms: 1.334666 type: 'test' ... # Subtest: exactly 8 skill picks by level 40, all at or before 40 ok 58 - exactly 8 skill picks by level 40, all at or before 40 --- duration_ms: 16.498875 type: 'test' ... # Subtest: 45 atlas points at 40 (39 level points + 6 quest points) ok 59 - 45 atlas points at 40 (39 level points + 6 quest points) --- duration_ms: 0.261666 type: 'test' ... # Subtest: xp to next level strictly increases; 175 effective hours to 40 ok 60 - xp to next level strictly increases; 175 effective hours to 40 --- duration_ms: 11.350416 type: 'test' ... # Subtest: pace: nobody reaches 40 in under 7 days, even online 24/7; typical player takes about a month ok 61 - pace: nobody reaches 40 in under 7 days, even online 24/7; typical player takes about a month --- duration_ms: 0.354875 type: 'test' ... # Subtest: alpha ruleset (live × multipliers) reaches 40 in under 2 hours, quests carrying most XP ok 62 - alpha ruleset (live × multipliers) reaches 40 in under 2 hours, quests carrying most XP --- duration_ms: 66.683041 type: 'test' ... # Subtest: origins sum to 40 base attributes and portraits exist ok 63 - origins sum to 40 base attributes and portraits exist --- duration_ms: 14.247 type: 'test' ... # Subtest: desktop bindings: required keys bound once each ok 64 - desktop bindings: required keys bound once each --- duration_ms: 4.460792 type: 'test' ... # Subtest: public-data is exactly the allow-listed files and up to date ok 65 - public-data is exactly the allow-listed files and up to date --- duration_ms: 166.902125 type: 'test' ... # Subtest: no internal keys anywhere (prompts, briefs, AI internals, tuning, prices, flags) ok 66 - no internal keys anywhere (prompts, briefs, AI internals, tuning, prices, flags) --- duration_ms: 3.595625 type: 'test' ... # Subtest: canaries: production briefs, mood text, art prompts, roadmap internals and proposed names never appear ok 67 - canaries: production briefs, mood text, art prompts, roadmap internals and proposed names never appear --- duration_ms: 443.722 type: 'test' ... # Subtest: no tuning numbers in public text not ok 68 - no tuning numbers in public text --- duration_ms: 28.038125 type: 'test' location: '/Users/king/Desktop/Workspace/SRO/zoen/packages/game-data/tests/public-export.test.mjs:59:1' failureType: 'testCodeFailure' error: |- Expected values to be strictly deep-equal: + actual - expected + [ + 'roadmap.json $.milestones[9].summary: Zoen 1.0 on Windows, Android, iOS and the browser.', + 'roadmap.json $.milestones[9].summary: Zoen 1.0 on Windows, Android, iOS and the browser.' + ] - [] code: 'ERR_ASSERTION' name: 'AssertionError' expected: actual: 0: 'roadmap.json $.milestones[9].summary: Zoen 1.0 on Windows, Android, iOS and the browser.' 1: 'roadmap.json $.milestones[9].summary: Zoen 1.0 on Windows, Android, iOS and the browser.' operator: 'deepStrictEqual' stack: |- TestContext. (file:///Users/king/Desktop/Workspace/SRO/zoen/packages/game-data/tests/public-export.test.mjs:62:10) Test.runInAsyncScope (node:async_hooks:214:14) Test.run (node:internal/test_runner/test:1047:25) Test.processPendingSubtests (node:internal/test_runner/test:744:18) Test.postRun (node:internal/test_runner/test:1173:19) Test.run (node:internal/test_runner/test:1101:12) async Test.processPendingSubtests (node:internal/test_runner/test:744:7) ... # Subtest: every build reference resolves to a public skill or a sealed tile ok 69 - every build reference resolves to a public skill or a sealed tile --- duration_ms: 1.117291 type: 'test' ... # Subtest: public roadmap: plain entries, known statuses, no dates or budgets ok 70 - public roadmap: plain entries, known statuses, no dates or budgets --- duration_ms: 0.806292 type: 'test' ... # Subtest: 144 unique skills: 18 weapon codices × 7 + 3 pole codices × 6 ok 71 - 144 unique skills: 18 weapon codices × 7 + 3 pole codices × 6 --- duration_ms: 0.957291 type: 'test' ... # Subtest: each weapon codex unlocks at 1/3/6/10/15/20/27: level-1 chain skill, level-20 signature, level-27 finisher ok 72 - each weapon codex unlocks at 1/3/6/10/15/20/27: level-1 chain skill, level-20 signature, level-27 finisher --- duration_ms: 4.072042 type: 'test' ... # Subtest: finishers: conditional, high damage, condition is a known state ok 73 - finishers: conditional, high damage, condition is a known state --- duration_ms: 1.414958 type: 'test' ... # Subtest: pole codices: 3 self buffs and 3 team buffs each; every buff or aura has a scope ok 74 - pole codices: 3 self buffs and 3 team buffs each; every buff or aura has a scope --- duration_ms: 0.342167 type: 'test' ... # Subtest: scenario tags are valid, and only attack skills are chainable ok 75 - scenario tags are valid, and only attack skills are chainable --- duration_ms: 0.411875 type: 'test' ... # Subtest: every skill has timings, 4 facets, and anim/vfx/sfx briefs ok 76 - every skill has timings, 4 facets, and anim/vfx/sfx briefs --- duration_ms: 1.702958 type: 'test' ... # Subtest: icons: reused icons exist, otherwise an art request id is set; no icon used twice ok 77 - icons: reused icons exist, otherwise an art request id is set; no icon used twice --- duration_ms: 2.8805 type: 'test' ... # Subtest: specials and applied states are defined in combat-states.json ok 78 - specials and applied states are defined in combat-states.json --- duration_ms: 0.558708 type: 'test' ... # Subtest: 18 builds: 3 per Atlas path, one build per weapon family ok 79 - 18 builds: 3 per Atlas path, one build per weapon family --- duration_ms: 0.872833 type: 'test' ... # Subtest: every build has a real choice (more candidates than picks) and exactly 8 legal picks ok 80 - every build has a real choice (more candidates than picks) and exactly 8 legal picks --- duration_ms: 1.183917 type: 'test' ... # Subtest: hotbars: Mouse1 chain holds ≤ 8 learned attack skills; Q–C any learned skill or buff; quick slots hold buffs ok 81 - hotbars: Mouse1 chain holds ≤ 8 learned attack skills; Q–C any learned skill or buff; quick slots hold buffs --- duration_ms: 4.663583 type: 'test' ... # Subtest: weapon bases: requirements follow the formula; icons or requests exist ok 82 - weapon bases: requirements follow the formula; icons or requests exist --- duration_ms: 98.737459 type: 'test' ... # Subtest: origin starter weapons are the families of that pole ok 83 - origin starter weapons are the families of that pole --- duration_ms: 29.159042 type: 'test' ... # Subtest: every skill has a player-facing description ok 84 - every skill has a player-facing description --- duration_ms: 15.606125 type: 'test' ... # Subtest: map is 4096 m and every zone sits inside it ok 85 - map is 4096 m and every zone sits inside it --- duration_ms: 2.347458 type: 'test' ... # Subtest: monsters live in a zone whose level band fits them; art exists ok 86 - monsters live in a zone whose level band fits them; art exists --- duration_ms: 2.824875 type: 'test' ... # Subtest: every weapon base drops from a real monster ok 87 - every weapon base drops from a real monster --- duration_ms: 0.366667 type: 'test' ... # Subtest: quests: 47 in level order, valid zones/givers/targets ok 88 - quests: 47 in level order, valid zones/givers/targets --- duration_ms: 0.675625 type: 'test' ... # Subtest: quest Atlas points land exactly where progression expects them ok 89 - quest Atlas points land exactly where progression expects them --- duration_ms: 0.222167 type: 'test' ... # Subtest: choices pause Auto-Quest; boss quest offers a solo route ok 90 - choices pause Auto-Quest; boss quest offers a solo route --- duration_ms: 0.291416 type: 'test' ... # Subtest: click-to-travel contract: auto-mount threshold, region-wide paths, cancel rules match mounts ok 91 - click-to-travel contract: auto-mount threshold, region-wide paths, cancel rules match mounts --- duration_ms: 1.057667 type: 'test' ... 1..91 # tests 91 # suites 0 # pass 88 # fail 3 # cancelled 0 # skipped 0 # todo 0 # duration_ms 29592.853167 /Users/king/Desktop/Workspace/SRO/zoen/packages/game-data:  ERR_PNPM_RECURSIVE_RUN_FIRST_FAIL  @zoen/game-data@0.1.0 test: `node --test "tests/*.test.mjs"` Exit status 1  WARN  Local package.json exists, but node_modules missing, did you mean to install?  ELIFECYCLE  Command failed with exit code 1.