pipelines/RESIDUE_CLASSIFICATION_2026-07-27.md
Sources enumerated: C:/dev/humanity-forgotten/docs/PRE_5090_BUILD_PLAN.md ▶ PROGRESS LEDGER
entries 2026-07-26g … 2026-07-27b (the residue list is at lines 145-151, entry 26g), the full
residue batch restated at C:/dev/humanity-forgotten/docs/archive/SESSION_HANDOFF_2026-07-26_ACCOUNT_SWITCH.md
lines 36-71, and C:/dev/Humanity/Humanity/TODO_CANON.md flag/rider/placeholder sections
(lines 125-158, 690-733, 847-862, 1004-1053, 1104-1272).
Canon HEAD at audit time: da6b29c (ledger entry 2026-07-27c — one entry NEWER than the 27b
named in the brief; it lands docs/proposals/QA_WATCHING_PROGRAM.md).
Canon working tree is DIRTY by design — 5 modified files, all belonging to the in-flight
natural-voice lane (see item 22).
Verdict key: SEED = doctrine/flag exists, data or code does not · PARTIAL = some rows/columns/code
landed · BUILT = done, verified · STALE = superseded or already closed.
Tally: 15 SEED · 6 PARTIAL · 1 BUILT · 1 STALE (23 items).
---
| # | Item | Verdict | Size | Evidence (absolute paths) |
|---|---|---|---|---|
| 1 | Ch-5 unlock_chapter_ref rows | SEED | M | C:/dev/humanity-forgotten/registries/T0_Ability_Tree_Registry [ACTIVE v0.1]/Sheet1.csv |
| 2 | Boss display_name (16 rows) | PARTIAL | S+S | same file col 46; C:/dev/Humanity/Humanity/Source/Humanity/Public/Data/BossEncounterRegistryRow.h |
| 3 | Chapter-title game import | PARTIAL | S | .../registries/T0_Chapter_Index [ACTIVE v1.2]/T0_Chapter_Index DRAFT v1.1.csv; .../Public/Data/ChapterIndexRow.h:24 |
| 4 | DT_Clue game-import + per-clue trigger wiring | PARTIAL | M | .../Private/Discovery/HumanityClueSubsystem.cpp:48-106; .../Tools/registry_import_manifest.json |
| 5 | Manggarai proverb cycle (S3) | SEED | M | .../Private/Combat/HumanityEncounterVolume.cpp:494-506; .../build/spine_rows/CH_03/boss.csv |
| 6 | S2 crew rosters | SEED | M | .../registries/T0_Character_Index [ACTIVE v1.1]/…csv; C:/dev/Humanity/Humanity/TODO_CANON.md:1018-1025 |
| 7 | status_immunity roster column | SEED | S | .../registries/T0_Creature_Roster [DRAFT v0.1]/Sheet1.csv (52 cols) |
| 8 | presentation_tier_ref column | SEED | S | docs-only; .../docs/COMBAT_PROGRAM_ADDENDUM.md |
| 9 | magnitude extension columns | SEED | M | .../registries/T0_Ability_Tree_Registry [ACTIVE v0.1]/Sheet1.csv (34 cols) |
| 10 | ability_class→composure routing (JOSH) | SEED · UNFILED | S | .../docs/spine/DECISIONS_PENDING_JOSH.md (absent) |
| 11 | compang bbox split (JOSH) | SEED · UNFILED | S+S | C:/dev/humanity-forgotten/build/zones/flores_island.csv lines 6 & 8 |
| 12 | uluwatu terrace mesh | SEED | L | C:/dev/Humanity/Humanity/TODO_CANON.md:1187-1192; .../Tools/sculpt/pads_bali.json:5 |
| 13 | §7 tier-bonus schema | SEED | L | doctrine _source/01_Tier_1_Foundation/T1_Combat_System_Spec…§12; no registry column |
| 14 | §8 imprint schema | PARTIAL | L | .../registries/T0_Rune_Registry [DRAFT v0.1]/Sheet1.csv RN_0018 |
| 15 | §9 loadout / spec schema | SEED | L | .../registries/T0_Worldstate_Variables [ACTIVE v0.1]/Sheet1.csv WS_036 |
| 16 | §10 universal pools + sweeps harness | SEED | L+L | C:/dev/humanity-forgotten/harness/gates_config.json |
| 17 | §11 role tags | SEED | M | no role_tag/build_role/combat_role in any registry |
| 18 | §12 ally stat spreads + INT axis | SEED | L | .../registries/T0_Familiar_Registry [DRAFT v0.1]/Sheet1.csv (40 cols, 22 rows) |
| 19 | BUG-0006/7/8 moot-check vs UMG HUD | STALE | S | C:/dev/Humanity/Humanity/QA/bugs/BUG-000{6,7,8}.json; .../Private/UI/HumanityDebugHUD.cpp:523 |
| 20 | Guardian-station scene-lifetime bleed | SEED · UNRECORDED | S-M | .../Private/Combat/HumanityEncounterVolume.cpp:611-621; .../Private/QA/HumanityQACaptureSubsystem.cpp:951-955,1176 |
| 21 | psutil soak memory sampling | PARTIAL | S | C:/dev/Humanity/Humanity/Tools/run_soak.py:46-49,70-92 |
| 22 | Natural-voice pass targets | PARTIAL (in flight, uncommitted) | S remaining | C:/dev/humanity-forgotten/docs/spine/player_strings/CH_0{2,3,4,5}.csv |
| 23 | Nightly soak cadence | BUILT (docs stale) | — | Windows task HumanityNightlySoak; .../Tools/nightly_soak.cmd:6 |
---
unlock_chapter_ref rows — SEED (M)registries/T0_Ability_Tree_Registry [ACTIVE v0.1]/Sheet1.csv, 185 rows. Parsed distribution of
unlock_chapter_ref: Ch_02=4 · Ch_03=2 · Ch_04=5 · Ch_05=0 · Ch_06=4 · Ch_07=2 · Ch_10=1 ·
Ch_15=5 · Ch_16=1 · Ch_19=1 · Ch_21=1 · Ch_38=3 · Ch_46=1 · Ch_55=1 · Ch_65=1 · blank=153.
POSITIVE CONTROL: the identical column parse returns non-zero for Ch_06 (4) and Ch_15 (5) — the
zero at Ch_05 is real data, not a failed match. Matches TODO_CANON:1232-1235 ("an honest 0").
Work: author the Ch-5 unlock set grounded in CH_05's staged systems (Datu/Naga Padoha/Mahakala/
devaraja), critic-gate, fidelity re-emit, then Tools/import_all_registries.py.
display_name (16 rows landed 26h) — PARTIAL (S canon + S game)T0_Boss_Encounter_Registry [DRAFT v0.1]/Sheet1.csv col 46 of 46,281 rows, 16 filled (BE_0002 · BE_0002_S1/S2 · BE_0003 + S1/S2/S3 · BE_0004 + S1/S2/S3 ·
BE_0005 + S1/S2/S3/S4 — exactly the Ch 2-5 slice).
c85ad1c, whose own message records the derivationrule "replacing a fresh critic under the budget constraint"; ledger 26h line 128-129 says "the
next session's critic pass may tighten". No critic artifact exists for it.
Source/Humanity/Public/Data/BossEncounterRegistryRow.h has no display_name member. POSITIVE CONTROL: the same file *does* carry defeat_protected at
line 54, so the header genuinely lags the CSV by ≥2 columns (hitzone_parts is also missing).
Consumer still hardcoded: Source/Humanity/Private/Core/HumanityBossCharacter.cpp:1165-1172 —
two literal names (BE_0002 → "Rangku Wera", BE_0003 → "Kaba Lomes") + the
"a hostile presence" fallback, with the TODO comment naming the column at :1167-1168.
natural-voice lane (see item 22) — so any critic pass should run on the NEW values, not the 26h ones.
T0_Chapter_Index [ACTIVE v1.2]/T0_Chapter_Index DRAFT v1.1.csv — title populated79/79 (CH_02 = "Ch 2 — Flores Island: Liang Bua Cave").
ChapterIndexRow.h:24 declares FText title; Content/Data/Registries/DT_ChapterIndex.uasset exists; the manifest entry is live in
Tools/registry_import_manifest.json.
grep -rn "ChapterIndexRow|DT_ChapterIndex" Source/ returns only the header's own self-references — no .cpp reads the struct, and grep "->title|ChapterTitle" Source/**/*.cpp
= 0. POSITIVE CONTROL: the same grep style over BossEncounterRegistryRow finds real
consumers in HumanityBossCharacter.cpp. Also no hardcoded chapter title in the UI/quest code
(grep "Flores Island|Liang Bua|Chapter 2" over Private/UI/ + Private/Quest/ = 0).
kind=chapter in the docs/spine/player_strings/CH_NN.csv sidecars, whose README asserts "consumer: the W10 UI wave
reads it at import" — it does not. Decide which of the two is the shipping title before wiring.
Source/Humanity/Public/Data/ClueRow.h (9 cols mirroring clues.csv, with the player-surface firewall documented on player_text); UHumanityClueSubsystem loads
/Game/Data/Registries/DT_Clue.DT_Clue at HumanityClueSubsystem.cpp:50, with a greybox seed
fallback at :102-106 and a test seam (LoadFromTable).
DT_Clue is absent from Tools/registry_import_manifest.json (46 entries =39 registries + 7 spine tables: Beat/Site/Fork/ForkOption/SceneAnchor/SideQuestBeat/BossPhase —
clues is not among them), and no DT_Clue.uasset exists under Content/Data/.
POSITIVE CONTROL: the same find Content/Data -iname "*Clue*" pattern style finds
DT_BossEncounter.uasset / DT_ChapterIndex.uasset, so Content is searchable.
C:/dev/humanity-forgotten/build/spine_rows/*/clues.csv carries **10 player_text rows total —
every one of them CH_02.** CH_03/CH_04/CH_05 clues.csv are header-only (verified by cat:
chapter_id,clue_id,chain,source_kind,beat_scope,trigger_context,player_text,status,src and
nothing else). So the import would land 10 rows for one chapter.
trigger_context is designer prose and has no consumer;the HUD's clue-staged objective layer is a TODO at
Source/Humanity/Private/UI/HumanityPlayerHUDWidget.cpp:413.
Source/Humanity/Private/Combat/HumanityEncounterVolume.cpp:494-506 — struct FProverbWave { Twist; Choices[3]; Correct; } with GProverbWaves[] = 3 hard-coded
waves; the DECODE/EXPOSE loop is real (:511-605) and test-covered
(Humanity.W9.DecodeExposeMechanic).
build/spine_rows/CH_03/boss.csv describes BE_0003_S3 framing("the Twisted-Word Sorcerer's proverb-constructs, Tombo Holes (DECODE/EXPOSE, 20/50/30 …)") but
carries zero proverb lines. No proverb registry, no untwisted-register lines for Elder Bernardus.
POSITIVE CONTROL: grep -c Bernardus on T0_Character_Index [ACTIVE v1.1]/…csv = 1
(CHAR_0016 exists), so the character is real — only his lines are missing.
C:/dev/Humanity/Humanity/TODO_CANON.md:1026-1032. Needs real Manggarai proverbsourcing + a care-register pass (living culture, §17.1) + localized string-table copy.
grep -c "Poka" on registries/T0_Character_Index [ACTIVE v1.1]/T0_Character_Index DRAFT v1.1.csv = 0. POSITIVE CONTROL: grep -c "Bernardus" on the SAME file = 1. So the search method
works; Poka Puar (the BE_0003_S2 scout-captain) genuinely has no character row.
grep -ril conscript registries/ matches only Boss_Encounter / Chapter_Index / Theme_Registryprose — no conscript roster rows anywhere.
Tools/stage_flores_ch03.py stages CR_0005 (Flores monitor) as the human-crew placeholder; MarkingLineNodes=3 and ConscriptCount=2 are illustrative
(TODO_CANON:1018-1025, restated at :847-852 as "STILL OPEN").
status_immunity roster column — SEED (S)grep -ril "status_immunity" registries/ → 0 files. POSITIVE CONTROL: the identical
invocation grep -ril "defeat_protected" registries/ → T0_Boss_Encounter_Registry [DRAFT v0.1]/Sheet1.csv.
T0_Creature_Roster [DRAFT v0.1]/Sheet1.csv header (52 columns, read in full) has no immunity field.
Game greybox: IsCreatureImmuneTo hardcodes CR_0001 (Komodo) immune to its own septic/poison
(TODO_CANON:1252-1254).
presentation_tier_ref column — SEED (S)Ripgrep over the whole canon repo finds presentation_tier_ref in exactly 3 files, all docs:
docs/PRE_5090_BUILD_PLAN.md, docs/archive/SESSION_HANDOFF_2026-07-26_ACCOUNT_SWITCH.md,
docs/COMBAT_PROGRAM_ADDENDUM.md. Zero registries. Game synthesizes the key as
"<element>_T<tier>" (TODO_CANON:1268-1272). This is the DR-2 asset-contract key, so it should land
BEFORE the 5090 asset freeze.
T0_Ability_Tree_Registry header (34 columns) carries only bucket/class fields —
tier_numerical, tier_name, vril_cost_class, resource_cost, mastery_point_cost,
cooldown_class. No magnitude, damage, cooldown-seconds, or animation/VFX/GameplayCue FK column.
POSITIVE CONTROL: the same header scan finds cast_pattern (col 24), which the foundry does
consume — so the header parse is live. Long-standing: this is real-kit FLAG #3/#4
(TODO_CANON:147-151), re-raised by the foundry at :1240-1242.
ability_class → composure routing (JOSH call) — SEED, and UNFILED (S)UHumanityAbilityFoundry::ModeTagForAbilityClass —combat/combat_control/mobility → Direct; defensive → VrilManagement; stealth → Stealth;
social → Character (TODO_CANON:1236-1239). No canon column specifies it.
grep -n -i composure docs/spine/DECISIONS_PENDING_JOSH.md returns8 hits, all the historical R4/R8 composure-node rulings (lines 718-766) — none is this question;
grep -n ability_class on that file = 0 (it matches only docs/PRE_5090_BUILD_PLAN.md:171).
POSITIVE CONTROL: grep -c -i mythic on the same decisions file = 10 (D-MYTHIC-GATE is
live there), so the file is searchable and the absence is real.
recommendation), not the bare ledger line it has today.
C:/dev/humanity-forgotten/build/zones/flores_island.csv line 6 (manggarai_village_edge) and line 8 (compang_lingko_fields) carry byte-identical
zone_bounds_wgs84 = w=120.36445;s=-8.59321;e=120.38445;n=-8.57321. Mirrored at
_source/02_Tier_2_Region_Pages/flores_island.md:54. So every bbox-resolving tool lands the
compang anchor on the shared manggarai post, ~500 m off the real lingko fan.
C:/dev/Humanity/Humanity/Saved/Terrain/flores_island_params.json region_bbox w 120.26417 / s -8.895 / e 121.83667 / n -8.51061 wholly contains it.
Side finding: that params file lists only 4 geo_anchored_zones and is dated 2026-07-23 while
the catalog now carries 10 rows (2026-07-25) — compang never contributed to the derived tile bounds.
Tools/flores_geo.py:39-43 COMPANG_MOVE_OFFSET_CM = (50000.0, 0.0) (+500 m E), applied identically at
Tools/audit_encounter_spaces.py:52-53 and Tools/sculpt/pads_flores.json:78-84; symptom recorded
at QA/SPACE_AUDIT_FLORES.md:112; named as an open rider in game commit 9872544.
DECISIONS_PENDING_JOSH.md (grep -c compang = 0; positive control MYTHIC = 10).Design flag only: C:/dev/Humanity/Humanity/TODO_CANON.md:1187-1192 — the one Bali SEVERE footprint
is an INTENTIONAL seacliff; a heightmap cut-and-fill measurably WORSENS the cliff-edge max
(49° → 52°), so it wants "a built-out temple-terrace MESH prop … NOT a landscape flatten".
Tools/sculpt/pads_bali.json:5 is intentionally empty with that note in _note.
Staged today as a marker only (Tools/stage_bali_ch04.py:85; capture shot
Tools/qa/capture_script_bali.json:28-30; audit QA/SPACE_AUDIT_BALI.md:26 = SEVERE 22.3/49.0°).
No asset: find Content -iname "*uluwatu*" -o -iname "*terrace*" -o -iname "*seacliff*" = 0.
POSITIVE CONTROL: find Content -name "*.uasset" = 309 files, so Content is populated and
the search reaches it. This is a DR-2 / 5090 asset-pass item, and not in DECISIONS_PENDING_JOSH.
Doctrine landed today at canon b8dc09e (T1_Combat_System_Spec §12 bonus lanes). Data home: none.
grep -ril "bonus" registries/ → 0 files (positive control: defeat_protected → Boss_Encounter).
A token scan of all 41 registry headers for bonus|pool|spread|apex yields exactly one hit —
trait_halo_pool in T0_Creature_Roster (creature temperament, a false friend).
Nearest scaffolding without payload: T0_Ability_Tree_Registry tier_numerical/tier_name/
mastery_point_cost; T0_Trade_Registry twelve_tier_quest_gates (quest IDs only, e.g.
gate_1_neophyte:Q_TR1_NEO … gate_12_magus:Q_TR1_MGS); T0_School_Registry.tier_role (free prose);
T0_Weapon_Registry (18 cols) has no tier column at all. Neither the incremental lane
(cast-time / pierce / superiority / crit) nor the transformative quest-gate lane exists in data.
The only residue item with real rows.
registries/T0_Rune_Registry [DRAFT v0.1]/Sheet1.csv — 18 columns, 19 rows (RN_0001…RN_0019):`rune_id, rune_name, rune_lane, consumption_model, operator_family, operator_token, rarity_class,
element_affinity, physical_transition, trade_source, mastery_tier_gate, acquisition_source,
acquisition_chapter_ref, rng_drop_ref, reroll_model, care_firewall_flag, effect_summary, source_ref`.
rune_lane=enchantment, consumption_model=note, rarity_class=none, reroll_model=cheap-rising-lockable-floor, mastery_tier_gate=tier-6,
acquisition_source=crafted-and-bounded-drop.
effect_summary ("slots per item tier1/2/3/4 for Common/Rare/Epic/Legendary; re-roll a cheap deterministic cost rising per consecutive
re-roll with a hard lockable-affix floor after ~5"). No imprint_*, roll_*, or affix_* column.
rarity_class is populated with common, rare, epic, legendary, none — no mythic valueanywhere in registries (the §10 apex has no data representation).
T0_RNG_Drop_Table [DRAFT v0.1]/Sheet1.csv = 18 columns (base_rate_mean, sigma_floor_rolls, sigma_ceiling_rolls, mastery_tier_gate, …) and **ZERO data
rows**; RN_0018's rng_drop_ref is blank.
registries/T0_Worldstate_Variables [ACTIVE v0.1]/Sheet1.csv **WS_036 worn_rune_loadout**, type=object, domain "combat-spellcraft runtime state", note
"WS7 systems-wiring anchor (DRAFT)" — an untyped placeholder (contrast WS_027/WS_041, which
carry full field lists). It IS live at runtime: build/spine_rows/CH_15/beats.csv writes
ws.worn_rune_loadout=crown_device_force_bound. So the key exists, the schema does not.
spec_purpose /regen-per-sec / HoT / personal-vs-AoE (header token scan, all 41 CSVs).
T0_Vril_Site_Registry [ACTIVE v0.1]/Sheet1.csv (25 cols, 42 rows) site_class enum = ceremony_anchor · dimensional_threshold · megalith · obelisk ·
orb · pyramid · site_reservoir · songline_path · tomb · underground_facility · vimana_facility ·
vortex_anchor · waterfall. grep -ic "sanctum\|loadout" on that file = 0.
pool returns exactly one column, trait_halo_pool (creature ecology) — unrelated.
grep -riEl "build_space|sweep|balance" --include=*.py harness/ → 5 files, all false positives: check_ws_value_form.py (a ws.* value-form corpus sweep),
scan_migration_integrity.py ("0.F sweep"), condition_expr.py ("unbalanced parens"),
check_grand_sage_silence.py (literal-substring sweep), rag/triage_floor.py. No build_space
token exists in any .py.
harness/gates_config.json's roster (stress, fidelity, scan, topography,layer_register, no_dead_end, …) has no balance/pick-rate gate — the AAAAA "a never-picked pool
option is a balance defect" rule currently has zero teeth, which is exactly the class of
doctrine this repo normally arms.
mythic hits in registries are prose — mythic-monster encounter, MYTHIC_MALEVOLENT_BEING_FOUGHT_NON_VELHEIM, book titles).
grep -riEl "role_tag|build_role|combat_role" registries/ → 0 files.
POSITIVE CONTROL: identical invocation with defeat_protected → matches Boss_Encounter;
second control with rarity_class → matches Flora, Mineral, Rune registries.
Every existing role-named column is narrative or ecological, not a player build axis:
T0_Character_Index.role (persona descriptors, e.g. abhayagiri_monk_heterodox_mahayana_…),
T0_Creature_Roster.trophic_role, T0_School_Registry.tier_role.
T0_Boss_Encounter_Registry carries encounter shape (`boss_kind, primary_verb, secondary_verb,
axis_split, defender_element), never a player-role axis. T0_Familiar_Registry` has no role column.
registries/T0_Familiar_Registry [DRAFT v0.1]/Sheet1.csv — 40 columns, 22 rows (the 22 canonical familiar slots). No str/int/agi, no stat_spread, no ai_intelligence, no
specialty, no combat_style. abilities_granted is BLANK on all 22 rows. The one
"intelligence" hit in the file is prose ("Rotational Flying familiar, intelligence/trickster type").
T0_Character_Index (30 cols, 163 rows) carries `loyalty_model, loyalty_state,loyalty_belief_axis, loyalty_departure_threshold, attackability_tier` — a bond ledger, no stats.
docs/registry_extensions.json _deferred holds exactly one address (familiar-bond-ladder,a 110-row bond_abilities child table). None of §§7-12 is registered even as a deferred extension
— i.e. the doctrine landed in tier docs with no corresponding entry on the extension rail.
All three exist and all three still read status: open, but the defects are moot on the player path:
QA/bugs/BUG-0006.json:3 — DebugHUD left PLAYER column overlaps center WORLD TENSION (HumanityDebugHUD.cpp:556, :677).
QA/bugs/BUG-0007.json:3 — AnswerPruning lever occluded by the Composure bar (:686, :934).
QA/bugs/BUG-0008.json:3 — demand levers show press-time latched values while d_local decays live (:681, :686).
HumanityDebugHUD.cpp:70-74 declares cvar humanity.DebugHUD default 0, and :523 early-returns when it is 0 — every cited line sits after that return; the file comment
at :66-69 states the overlay is retired on the player path.
AnswerPruning|Lever|d_local|Tension over Source/Humanity/Private/UI/HumanityPlayerHUDWidget.cpp = 0. POSITIVE CONTROL: the same
grep on the same file matches Composure at 42/206/508/521 — the widget has a boss Composure bar
but no lever/tension column at all.
QA/bugs/INDEX.md:9,27-29 still counts them open. Action: close as moot/superseded via theregenerator (a records edit, not engineering).
This item appears in the handoff (line 69-70) but exists nowhere in either repo's trackers:
QA/bugs/INDEX.md (17 records). POSITIVE CONTROL: the same grep family over QA/bugs/ matches real teardown work — BUG-0009.json:3 (teardown hang), BUG-0011.json:3 (leaked
standalone GameInstance).
TODO_CANON.md: regex bleed|outlive|leak|lifetime matched 9 other real lines(e.g. :1146 soak in-process leak, :1015 offscope-boss leak tooth) but nothing about a guardian
or part-break actor outliving its scene.
grep -rniE "scene.?lifetime" over Source/Tools/QA/TODO_CANON/CLAUDE/PLAYTEST = 0. POSITIVE CONTROL: grep -rniE "scene sub.?system" over the same set hits TODO_CANON:748 and
QA/bugs/INDEX.md:26.
Source/Humanity/Private/Combat/HumanityEncounterVolume.cpp:611-621 resets transient meters only —
explicitly "never bSpawned / bGuardiansWithdrawn / the enemy roster / any world state";
Source/Humanity/Private/QA/HumanityQACaptureSubsystem.cpp:951-955 mirrors it, and
FrameGuardianVolume (:1176) spawns idempotently and never destroys the serpents.
AHumanityEncounterVolume has no EndPlay override — POSITIVE CONTROL:
grep -rn "EndPlay" --include=*.cpp Source returns exactly one site,
Source/Humanity/Private/World/HumanityVrilRechargeZone.cpp:79.
(bug record + regression test), then add the teardown hook.
Tools/run_soak.py:46-49 imports psutil guarded (except: psutil = None); :70-92 walks p.memory_info().rss across the process + p.children(recursive=True) on a 3.0 s
poll; consumed at :137, :151, :155; growth delta at :164-167, :204.
python -c "import psutil" raises ImportError, and the live artifact Saved/QA/Soak/soak_2026-07-26_053721.md:5 reads "psutil memory sampling: OFF
(psutil not installed -- memory n/a)" (emitted by run_soak.py:181).
find . -maxdepth 3 -iname "requirements*" = 0; no pyproject.toml / setup.py / Pipfile / environment.yml. POSITIVE CONTROL: the identical find
for run_soak.py returns ./Tools/run_soak.py, and grep -rln "DEFAULT_BELT" --include=*.py .
returns the same file. The dep is simply undeclared.
pip install psutil + declare it (a requirements file is the missing durable half).The rewrite is not pending — it is 93 % authored in the working tree right now, unstaged by
design. Canon HEAD da6b29c's own commit message states: "the natural-voice lane's in-flight sidecar
edits are deliberately NOT staged."
The string sidecars are at C:/dev/humanity-forgotten/docs/spine/player_strings/CH_NN.csv
(columns kind,key,player_text; merged into build/spine_rows/ by harness/extract_spine_rows.py;
contract in that folder's README.md).
Real counts for the slice:
| Chapter | chapter title | beat objectives | fork options | site names | total authored | rewritten in tree |
|---|---|---|---|---|---|---|
| CH_02 | 1 | 10 | 3 | 5 | 19 | 19 / 19 |
| CH_03 | 1 | 12 | 4 | 7 | 24 | 21 / 24 |
| CH_04 | 1 | 12 | 4 | 7 | 24 | 24 / 24 |
| CH_05 | 1 | 12 | 7 | 9 | 29 | 29 / 29 |
| Total | 4 | 46 | 18 | 28 | 96 | 93 / 96 |
Plus:
(e.g. the hunter → the one who tracks me; the bound serpent → Naga Padoha, the earth-shaker;
the court official → the one who keeps the water back).
TOTAL natural-voice surface for the Ch 2-5 slice = 96 + 16 + 10 = 122 strings, of which
104 are already rewritten and uncommitted.
Remaining work is downstream, not authoring: (a) the 3 unchanged CH_03 rows,
(b) re-run the merge — build/spine_rows/CH_02/beats.csv still carries the OLD text
("Wake in the dark of the cave. Get to your feet and climb toward the daylight.") while the sidecar
now reads "It bit me and ran, and from the crack in the rock I watched it stop moving…", so
harness/extract_spine_rows.py has not been re-run, (c) the reveal/natural-voice critic pass,
(d) fidelity re-emit + gates + commit, (e) game re-import (DT_Beat/DT_Site/DT_ForkOption).
Handoff item 3 and TODO_CANON.md:1148-1150 both say nightly scheduling "is the director's" and a
task "*should*" be created. It already exists: Windows scheduled task HumanityNightlySoak,
State Ready, daily trigger StartBoundary 2026-07-27T04:00:00, action
C:\dev\Humanity\Humanity\Tools\nightly_soak.cmd (which runs the explicit 7-map belt at :6),
NextRunTime 7/27/2026 4:00 AM, LastTaskResult 267011 (0x41303 = has not yet run). Armed by game
commit 0e69c4e. POSITIVE CONTROL / method note: schtasks /query under Git Bash returned
0 tasks (a FALSE ZERO — Git Bash mangles /query into a path); PowerShell Get-ScheduledTask
returned 204 tasks and found it. Worth remembering as a false-zero class.
Note it will run with memory sampling OFF until item 21 is closed.
---
1. None of the 23 residue items is registered in C:/dev/humanity-forgotten/docs/DESIGN_GAP_REGISTER.md
(295 lines). Greps for compang / uluwatu / status_immunity / presentation_tier / display_name /
DT_Clue all return 0 there. POSITIVE CONTROL: grep -ic gap on that file = 24, so the file is
real and searchable. The residue lives only in the ledger + TODO_CANON + the handoff — a wiring gap
against the standing anti-orphan rule.
2. Three items tagged "a JOSH call" have no decision brief. ability_class→composure routing,
the compang bbox split, and the uluwatu terrace mesh are all absent from
docs/spine/DECISIONS_PENDING_JOSH.md (positive control: D-MYTHIC-GATE / mythic = 10 hits).
The standing protocol requires a full brief with alternatives + recommendation, never a bare line.
3. The §§7-12 doctrine landed with zero extension-rail registration. Canon commit b8dc09e
touched only 4 .md tier docs + baselines/scorecards — no registry CSV, no harness logic, and
docs/registry_extensions.json _deferred names only familiar-bond-ladder.
4. The game's row structs lag the canon CSVs. BossEncounterRegistryRow.h is missing both
display_name and hitzone_parts, which are live columns in the CSV. Any residue that adds a
column also needs Tools/gen_row_struct.py + Tools/import_all_registries.py, so batching the
column work (items 2, 7, 8, 9) into one reimport is the efficient shape.