{"id":49114297,"url":"https://github.com/hummat/hadrons-blessing","last_synced_at":"2026-04-21T06:10:18.311Z","repository":{"id":344462837,"uuid":"1179988961","full_name":"hummat/hadrons-blessing","owner":"hummat","description":"Source-backed Darktide entity resolution and build audit tooling. Maps community names to canonical game entities with decompiled source citations.","archived":false,"fork":false,"pushed_at":"2026-04-19T07:18:32.000Z","size":7692,"stargazers_count":1,"open_issues_count":7,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2026-04-19T09:26:12.599Z","etag":null,"topics":["build-planner","darktide","game-tools","lua","nodejs","warhammer-40k"],"latest_commit_sha":null,"homepage":"https://hummat.github.io/hadrons-blessing/","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/hummat.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":"docs/roadmap.md","authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":"AGENTS.md","dco":null,"cla":null}},"created_at":"2026-03-12T15:30:42.000Z","updated_at":"2026-04-19T07:18:40.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/hummat/hadrons-blessing","commit_stats":null,"previous_names":["hummat/hadrons-blessing"],"tags_count":5,"template":false,"template_full_name":null,"purl":"pkg:github/hummat/hadrons-blessing","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/hummat%2Fhadrons-blessing","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/hummat%2Fhadrons-blessing/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/hummat%2Fhadrons-blessing/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/hummat%2Fhadrons-blessing/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/hummat","download_url":"https://codeload.github.com/hummat/hadrons-blessing/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/hummat%2Fhadrons-blessing/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":32079547,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-21T02:38:07.213Z","status":"ssl_error","status_checked_at":"2026-04-21T02:38:06.559Z","response_time":128,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["build-planner","darktide","game-tools","lua","nodejs","warhammer-40k"],"created_at":"2026-04-21T06:10:17.528Z","updated_at":"2026-04-21T06:10:18.303Z","avatar_url":"https://github.com/hummat.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Hadron's Blessing\n\nSource-backed Darktide build intelligence. Maps community names to canonical\ngame entities, audits builds against decompiled source, computes damage\nbreakpoints via a 13-stage calculator, and scores builds across 7 dimensions.\n\n## Current CLI Contract\n\nStable v1 commands:\n\n- **Resolve** — map a community-facing name (\"Warp Rider\", \"Blaze Away\") to a\n  canonical entity ID backed by decompiled source with evidence\n- **Audit** — verify a build JSON: classify each field as resolved, ambiguous,\n  unresolved, or known non-canonical\n\nFor covered shared weapons, `resolve` also accepts internal template ids and\nBetterBots-style full content item paths such as\n`content/items/weapons/player/ranged/bot_lasgun_killshot`.\n\nProvisional surface:\n\n- **Canonicalize** — convert a scraped/raw build JSON into the canonical build\n  shape used by this repo\n- **Re-resolve** — batch refresh unresolved or non-canonical selections in\n  canonical build files when resolver coverage expands\n- **Score** — 7-dimension build scoring (2 mechanical + 5 qualitative)\n- **Calc** — 13-stage damage breakpoint calculator with per-weapon per-enemy\n  per-difficulty hits-to-kill matrix\n\nNot yet part of the public CLI contract:\n\n- **Inspect** — implemented as `npm run inspect -- --id \u003ccanonical-entity-id\u003e`,\n  but not part of the stable v1 contract\n- **Coverage** — implemented as `npm run coverage`, but not part of the stable\n  v1 contract\n\nAll stable output is machine-readable JSON with optional `--text` human-readable mode.\n\n## Source Root Contract\n\nCommands that use the ground-truth resolver currently require a pinned, clean\ncheckout of `Aussiemon/Darktide-Source-Code`:\n\n```bash\ngit clone --depth 1 https://github.com/Aussiemon/Darktide-Source-Code.git ../Darktide-Source-Code\n```\n\nPass the path via `GROUND_TRUTH_SOURCE_ROOT`:\n\n```bash\nGROUND_TRUTH_SOURCE_ROOT=../Darktide-Source-Code npm run resolve -- --query \"Warp Rider\" --context '{\"kind\":\"talent\",\"class\":\"psyker\"}'\nGROUND_TRUTH_SOURCE_ROOT=../Darktide-Source-Code npm run audit -- data/builds/08-gandalf-melee-wizard.json\nGROUND_TRUTH_SOURCE_ROOT=../Darktide-Source-Code npm test\nGROUND_TRUTH_SOURCE_ROOT=../Darktide-Source-Code make check\n```\n\nCurrent command requirements:\n\n- `resolve` — requires `GROUND_TRUTH_SOURCE_ROOT`\n- `audit` — requires `GROUND_TRUTH_SOURCE_ROOT`\n- `canonicalize` — requires `GROUND_TRUTH_SOURCE_ROOT`\n- `reresolve` — requires `GROUND_TRUTH_SOURCE_ROOT`\n- `index:build` / `index:check` / `test` / `check` — require `GROUND_TRUTH_SOURCE_ROOT`\n- `trees:build` / `breeds:build` / `profiles:build` — require `GROUND_TRUTH_SOURCE_ROOT`\n- `calc` — requires `GROUND_TRUTH_SOURCE_ROOT` (reads generated data from `breeds:build` + `profiles:build`)\n- `score` — does not require `GROUND_TRUTH_SOURCE_ROOT` (but includes breakpoint scoring when calc data available)\n\nIf `GROUND_TRUTH_SOURCE_ROOT` is missing or points at the wrong pinned revision,\nresolver/index/test commands fail deliberately with explicit setup guidance.\n\nGenerated artifacts under `data/ground-truth/generated/` are build outputs and\nremain gitignored.\n\n## Commands\n\nInstall dependencies:\n\n```bash\nnpm install\n```\n\nResolve one query:\n\n```bash\nGROUND_TRUTH_SOURCE_ROOT=../Darktide-Source-Code npm run resolve -- --query \"Warp Rider\" --context '{\"kind\":\"talent\",\"class\":\"psyker\"}'\n```\n\nResolve a BetterBots profile weapon path:\n\n```bash\nGROUND_TRUTH_SOURCE_ROOT=../Darktide-Source-Code npm run resolve -- --query \"content/items/weapons/player/ranged/bot_lasgun_killshot\" --context '{\"kind\":\"weapon\",\"slot\":\"ranged\"}'\n```\n\nAudit a build file:\n\n```bash\nGROUND_TRUTH_SOURCE_ROOT=../Darktide-Source-Code npm run audit -- data/builds/08-zealot-chorus-swiss-knife.json\n```\n\nCanonicalize a scraped/raw build file:\n\n```bash\nGROUND_TRUTH_SOURCE_ROOT=../Darktide-Source-Code npm run canonicalize -- data/sample-build.json\n```\n\nRe-resolve canonical build files in place:\n\n```bash\nGROUND_TRUTH_SOURCE_ROOT=../Darktide-Source-Code npm run reresolve -- --write data/builds\n```\n\nBuild the generated index:\n\n```bash\nGROUND_TRUTH_SOURCE_ROOT=../Darktide-Source-Code npm run index:build\n```\n\nRun the full verification flow:\n\n```bash\nGROUND_TRUTH_SOURCE_ROOT=../Darktide-Source-Code make check\n```\n\nWebsite browser smoke flow:\n\n```bash\n# terminal 1: serve static preview\nmake website-preview\n\n# terminal 2: open compare page in named Playwright session\nmake website-smoke ARGS='open-compare 09-psyker-2026 01-veteran-havoc40-2026'\n\n# terminal 2: inspect current page\nmake website-smoke ARGS='snapshot'\nmake website-smoke ARGS='screenshot'\n\n# terminal 2: close browser session\nmake website-smoke ARGS='close'\n```\n\nNotes:\n\n- `scripts/website-smoke.sh` defaults to `PLAYWRIGHT_CLI_SESSION=hb-website`, `HB_WEBSITE_HOST=127.0.0.1`, `HB_WEBSITE_PORT=4173`\n- the Playwright CLI wrapper must exist and be executable at `~/.codex/skills/playwright/scripts/playwright_cli.sh`\n- under Codex, browser launch and local port binding usually require sandbox escape; run these commands outside sandbox if you hit Chromium or `listen EPERM` errors\n\nBuild scoring on canonical build fixtures:\n\n```bash\nnpm run score -- data/builds/08-zealot-chorus-swiss-knife.json --json\nnpm run score -- data/builds/08-zealot-chorus-swiss-knife.json --text\n```\n\nDamage breakpoint calculator:\n\n```bash\nGROUND_TRUTH_SOURCE_ROOT=../Darktide-Source-Code npm run calc -- data/builds/08-zealot-chorus-swiss-knife.json\nGROUND_TRUTH_SOURCE_ROOT=../Darktide-Source-Code npm run calc -- data/builds/08-zealot-chorus-swiss-knife.json --json\nGROUND_TRUTH_SOURCE_ROOT=../Darktide-Source-Code npm run calc -- data/builds/ --json            # batch\n```\n\nRegenerate tree edges from Lua source (requires source root):\n\n```bash\nnpm run edges:build\n```\n\nBuild talent-tree DAGs from Lua source (requires source root):\n\n```bash\nnpm run trees:build\n```\n\nMirror website-facing art assets:\n\n```bash\nnpm run icons:build\nnpm run weapons:build\n```\n\nRead-only coverage summary:\n\n```bash\nnpm run coverage\n```\n\nRead-only canonical entity inspection:\n\n```bash\nnpm run inspect -- --id psyker.talent.psyker_damage_based_on_warp_charge\n```\n\n## Status\n\nCurrent entity coverage (1376 total: 768 non-tree + 608 tree_node):\n\n| Domain    | Entities | Tree Nodes | Aliases | Edges | Notes |\n|-----------|----------|------------|---------|-------|-------|\n| Shared    | 200 | — | 134 | 76 | weapons, weapon perks, curio perks, blessing families, stat nodes, classes, buffs |\n| Psyker    | 89 | 111 | 76 | 255 | full tree DAG with exclusive_with edges |\n| Ogryn     | 85 | 108 | 85 | 240 | tree DAG (9 edges skipped — missing talent entities) |\n| Arbites   | 82 | 110 | — | 259 | tree DAG (5 edges skipped) |\n| Hive Scum | 103 | 83 | — | 236 | tree DAG (5 edges skipped) |\n| Zealot    | 57 | 89 | 57 | 210 | tree DAG (24 edges skipped) |\n| Veteran   | 43 | 107 | 44 | 211 | tree DAG (40 edges skipped) |\n\nTree edges are generated from Lua source via `npm run edges:build`. Skipped edges reference\ntalent entities not yet in ground-truth — they appear automatically as entity coverage grows.\n\nAll 24 build fixtures (all 6 classes) are stored in canonical build shape,\nre-extracted from live Games Lantern pages with full talent trees.\n\nAudit totals across all 24 fixtures: **1275 resolved / 0 unresolved / 72\nnon_canonical / 0 ambiguous**. The `non_canonical` bucket in the fixtures is\nthe four curio cosmetic base labels whose concrete runtime variants are\ncollapsed by the Games Lantern scrape; the live dump helper in\n`tools/darktide-mods/curio_dump/` confirms 21 such ambiguous base labels in\nthe full curio catalog.\n\n## Roadmap\n\n- `#1` TypeScript migration\n- `#2` Human-readable audit/report layer\n- `#3` Build-oriented CLI (browse, compare)\n- ~~`#4` BetterBots integration contract~~ (resolved)\n- ~~`#5` Calculator and dataflow layer~~ (resolved)\n- `#6` Website (SvelteKit + Svelte Flow talent tree)\n\n## License\n\nMIT\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fhummat%2Fhadrons-blessing","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fhummat%2Fhadrons-blessing","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fhummat%2Fhadrons-blessing/lists"}