pre-push now runs the full gdUnit4 suite via tests/run-godot when client/
changed — blocking, ~100s, suite made green by T-973 and independently
re-verified. The tooling gate (make test-tooling on TOOLING_CHANGED, T-1066)
rides in the same hook. D-067 amended: the shipped chime is a deliberate
800ms synthesis (#327, ui.md UI-005); prose said 300-400ms. Ticket closes
for the maintenance wave in the changelog.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
INSERTINTOticket_history(ticket_record_id,field,old_value,new_value,changed_by,changed_at,created_at,updated_at,deleted_at,hash,canonical_version)VALUES('06FB0TNSRYEM4VSX74MS4NKQ1C','description','Surfaced 2026-05-24 running the full client suite (tests/run-godot, no server) during #960. NOT caused by #960 — verified: test_input_roundtrip fails identically at the pre-change baseline, and the rest are unrelated subsystems. Two categories to triage:
Closed2026-06-12(commitc64231e8e):baretests/run-godotfullygreen—1264cases/20failures→1268/0,independentlyre-verifiedbythelead(2536/2536,exit0).Twoproductionbugsfoundandfixedduringtriage(hud_groupsfreed-instancecrash;fog_stateD-059decaylossacrossresize).Thepushgatenowrunsthesuite(T-1065).', NULL, '2026-06-1214:24:13', '2026-06-1214:24:13', '2026-06-1214:24:13', NULL, '6167afa803cc26048942bb32f12d5cef', 2) ON CONFLICT(hash) DO NOTHING;
INSERTINTOticket_history(ticket_record_id,field,old_value,new_value,changed_by,changed_at,created_at,updated_at,deleted_at,hash,canonical_version)VALUES('06FB0TNSRXN360AQN3973AHS8M','description','5 failing test cases in test_dialogue_sprint20.gd. The suite tests D-020 signal decoupling for dialogue_box. Likely failure: test_show_dialogue_does_not_call_audio_manager_directly compares AudioManager.get_active_dip() before/after show_dialogue — if AudioManager.get_active_dip() behavior changed or is not returning clean state, this would fail. Investigate by running the suite in isolation and reading specific assertion failures from the log. Sprint 38 triage #871.
Closed:productionwascorrect—5testscapturedlambdalocalsbyvalue(GDScript)sosignalflagsneverpropagated;rewrittenwitharraycapturesassertingexactemissioncounts+payloads(stronger).Commitc64231e8e.', NULL, '2026-06-1214:24:13', '2026-06-1214:24:13', '2026-06-1214:24:13', NULL, '1b34aac525a1d130154b045f09aed545', 2) ON CONFLICT(hash) DO NOTHING;
INSERTINTOticket_history(ticket_record_id,field,old_value,new_value,changed_by,changed_at,created_at,updated_at,deleted_at,hash,canonical_version)VALUES('06FB0TNSRXMVYQJV2QDHH8H7P8','description','3 failing test cases in test_input_roundtrip.gd. All tests check _connect_to_server() which skips if server binary not found — but 3 still fail, suggesting either: (1) server binary is present but something in LocalBridge.send_message, poll, or Protocol.encode_player_inputs changed, or (2) test environment returns false from _connect_to_server but then asserts fail. Investigate by running with --filter test_input_roundtrip and checking the log for exact assertion sites. Sprint 38 triage #871.
Re-homedundermaintenancefromdoneumbrellaT-871percascaderefocus2026-06-12.', '3failingtestcasesintest_input_roundtrip.gd.Alltestscheck_connect_to_server()whichskipsifserverbinarynotfound—but3stillfail,suggestingeither:(1)serverbinaryispresentbutsomethinginLocalBridge.send_message,poll,orProtocol.encode_player_inputschanged,or(2)testenvironmentreturnsfalsefrom_connect_to_serverbutthenassertsfail.Investigatebyrunningwith--filter test_input_roundtrip and checking the log for exact assertion sites. Sprint 38 triage #871.
Closed:protocoldrift(#555handshake+#175StartupMessage,then20tpsstreamedsnapshots);testsnowdotherealexchangeandwaitondeterministicpositions.Genuinelyrunsagainstthelivebinary.Commitc64231e8e.', NULL, '2026-06-1214:24:13', '2026-06-1214:24:13', '2026-06-1214:24:13', NULL, 'b05f512484f9db6c2c1ad970cc5424dc', 2) ON CONFLICT(hash) DO NOTHING;
INSERTINTOticket_history(ticket_record_id,field,old_value,new_value,changed_by,changed_at,created_at,updated_at,deleted_at,hash,canonical_version)VALUES('06FB0TNSRY3TXD5HDKHFVGDG18','description','1 failing test case in test_implant_app_lifecycle.gd. Suite tests ImplantApp._internal_app_changed, nav stack, preserves_state, and HudGroups state. after_test resets HudGroups._active_app, _active_mode, _groups — if these private fields were renamed or removed, after_test would fail and bleed state. Or a specific on_open/on_close hook fires differently. Run --filter test_implant_app_lifecycle and check specific assertion. Sprint 38 triage #871.
Re-homedundermaintenancefromdoneumbrellaT-871percascaderefocus2026-06-12.', '1failingtestcaseintest_implant_app_lifecycle.gd.SuitetestsImplantApp._internal_app_changed,navstack,preserves_state,andHudGroupsstate.after_testresetsHudGroups._active_app,_active_mode,_groups—iftheseprivatefieldswererenamedorremoved,after_testwouldfailandbleedstate.Oraspecificon_open/on_closehookfiresdifferently.Run--filter test_implant_app_lifecycle and check specific assertion. Sprint 38 triage #871.
Closed:realproductionbug—hud_groups._set_group_ztypedloopvarerrorsonfreedinstancesbeforetheguardruns;prune-then-iteratefix(self-pruningregistry).Commitc64231e8e.', NULL, '2026-06-1214:24:13', '2026-06-1214:24:13', '2026-06-1214:24:13', NULL, 'bea1ff5d21c0060074ba6b7bd854d5c4', 2) ON CONFLICT(hash) DO NOTHING;
INSERTINTOticket_history(ticket_record_id,field,old_value,new_value,changed_by,changed_at,created_at,updated_at,deleted_at,hash,canonical_version)VALUES('06FB0TNSRWK87PCWGZ6GWT2TBM','description','1 failing test case in test_game_state_sprint20.gd. before_each resets SnapshotHandler._prev_player_position. If this static var was renamed or moved, the before_each hook would error. Alternatively a stationary_ticks path changed in SnapshotHandler. Verify SnapshotHandler still has static var _prev_player_position at that exact name. Sprint 38 triage #871.
Closed:norepro—alreadyfixedonmainby702fed592(before_each→before_testhookname);verified9/9inbaseline.Nochangeneeded.', NULL, '2026-06-1214:24:13', '2026-06-1214:24:13', '2026-06-1214:24:13', NULL, 'a50abb8f1a4692f2983cc21a126557c2', 2) ON CONFLICT(hash) DO NOTHING;
INSERTINTOticket_history(ticket_record_id,field,old_value,new_value,changed_by,changed_at,created_at,updated_at,deleted_at,hash,canonical_version)VALUES('06FB0TNSRYF23MZ86S1XF1542G','description','1 failing test case in test_fog_shader.gd. The most likely failure is test_fog_state_forward_vs_peripheral: it asserts Forward > Peripheral visibility values, but Sprint 22 (#569) removed peripheral sector. Now all visible tiles write VIS_FORWARD regardless. The test checks the texture is non-null (not the actual byte values), so it should pass... unless the failure is in test_fog_state_exploration_persists which has a weak assertion. Run --filter test_fog_shader to identify the specific failure. Sprint 38 triage #871.
Re-homedundermaintenancefromdoneumbrellaT-871percascaderefocus2026-06-12.', '1failingtestcaseintest_fog_shader.gd.Themostlikelyfailureistest_fog_state_forward_vs_peripheral:itassertsForward>Peripheralvisibilityvalues,butSprint22(#569)removedperipheralsector.NowallvisibletileswriteVIS_FORWARDregardless.Thetestchecksthetextureisnon-null(nottheactualbytevalues),soitshouldpass...unlessthefailureisintest_fog_state_exploration_persistswhichhasaweakassertion.Run--filter test_fog_shader to identify the specific failure. Sprint 38 triage #871.
Closed:failingcasewastheperftestmeasuringthefirstcall(includestheone-offgrow-onlyresize);nowwarmsupandmeasuressteadystateagainstthesame0.5msbudget.StalePeripheralvocabularyremoved.Commitc64231e8e.', NULL, '2026-06-1214:24:13', '2026-06-1214:24:13', '2026-06-1214:24:13', NULL, '9d497ef25be798fcaa5ef715cce45001', 2) ON CONFLICT(hash) DO NOTHING;
INSERTINTOticket_history(ticket_record_id,field,old_value,new_value,changed_by,changed_at,created_at,updated_at,deleted_at,hash,canonical_version)VALUES('06FB0TNSRZYDBRV5T9QVQAXGV0','description','1 failing test case in test_e2e_connection.gd. test_send_input_receive_snapshot skips if server binary not found. If it fails, either: (1) server binary exists but connection fails (port collision, timing), or (2) LocalBridge.reset() method was removed (the test calls _bridge.reset() but this may not exist on LocalBridge). Verify LocalBridge has a reset() method. Sprint 38 triage #871.
Closed:sameprotocoldriftasT-929;handshakeadded,binary-absenceisarealskip.LocalBridge.reset()suspicionwaswrong.Commitc64231e8e.', NULL, '2026-06-1214:24:13', '2026-06-1214:24:13', '2026-06-1214:24:13', NULL, '209d3851a0a552f6c98a27b5db7cef67', 2) ON CONFLICT(hash) DO NOTHING;
INSERTINTOticket_history(ticket_record_id,field,old_value,new_value,changed_by,changed_at,created_at,updated_at,deleted_at,hash,canonical_version)VALUES('06FB0TNSRY9FV0S9RE42WY7SHW','description','1 failing test case in test_audio_sprint13.gd. before_test calls AudioManager.clear_dip(), stop_all_loops(), set_volume() for all buses. If any of these methods were renamed or a bus constant changed, setup would fail and cascade. Or a specific dip timing assertion is stale. Run --filter test_audio_sprint13 and read the specific failure. Sprint 38 triage #871.
Re-homedundermaintenancefromdoneumbrellaT-871percascaderefocus2026-06-12.', '1failingtestcaseintest_audio_sprint13.gd.before_testcallsAudioManager.clear_dip(),stop_all_loops(),set_volume()forallbuses.Ifanyofthesemethodswererenamedorabusconstantchanged,setupwouldfailandcascade.Oraspecificdiptimingassertionisstale.Run--filter test_audio_sprint13 and read the specific failure. Sprint 38 triage #871.
Closed:clear_dipwasfine;thechimetestassertedD-067prose(300-400ms)againstthedeliberatelyshipped800msasset(#327,ui.mdUI-005).Testpinsthecatalog;D-067amended2026-06-12withthe800msreality.Commitc64231e8e.', NULL, '2026-06-1214:24:13', '2026-06-1214:24:13', '2026-06-1214:24:13', NULL, '0c25f1c03c8264091a9090efbe8b552b', 2) ON CONFLICT(hash) DO NOTHING;
INSERTINTOticket_history(ticket_record_id,field,old_value,new_value,changed_by,changed_at,created_at,updated_at,deleted_at,hash,canonical_version)VALUES('06FB0TNSRXCE9D9JYBZWVXMG68','description','1 failing test case in test_ai_dialogue_sprint26.gd. The HardwareDetector tests skip if autoload not found. The GameState field tests (ai_enhanced_dialogue_enabled) look correct. The failing test is likely in the settings_dialog section: SETTINGS_DIALOG_SCENE preloaded at class level — if settings_dialog.tscn doesn''t exist or a method was renamed, class-level preload would fail. Check res://ui/settings_dialog.tscn exists and the relevant methods. Sprint 38 triage #871.
Closed:MetaScreenmigration(f24d08f75)movedUIbuildtoon_open();testsnowopenthedialogfirst;vacuousnull-labelpasseliminated.Commitc64231e8e.', NULL, '2026-06-1214:24:13', '2026-06-1214:24:13', '2026-06-1214:24:13', NULL, '232a2ee069bc123d0b6126a9fde228c9', 2) ON CONFLICT(hash) DO NOTHING;
INSERTINTOticket_history(ticket_record_id,field,old_value,new_value,changed_by,changed_at,created_at,updated_at,deleted_at,hash,canonical_version)VALUES('06FB0TNSRWBJ1XC9V5ZQHSXAXG','description','test_monologue_display_visible_hidden in test_client_p2.gd accessed mono.is_visible (a custom bool property). MonologueDisplay was refactored to use _visible: Array[Dictionary] instead. Test skipped (skip_test_) pending rewrite. New test should check _visible.size() > 0 after show_monologue, and == 0 when idle.
Closed:P2-U01rewrittenagainstthe_visiblearrayAPI+rendered-textassert(strongerthanspec);re-enabled.Commitc64231e8e.', NULL, '2026-06-1214:24:13', '2026-06-1214:24:13', '2026-06-1214:24:13', NULL, '66c914b4c5e0fa88ce4974324a96235d', 2) ON CONFLICT(hash) DO NOTHING;
INSERTINTOticket_history(ticket_record_id,field,old_value,new_value,changed_by,changed_at,created_at,updated_at,deleted_at,hash,canonical_version)VALUES('06FBPTXS18RSVRHC7Y9TAX06HG','description','(description follows in first append)
Closed:7orphanuidsdeleted;_format_pop/_format_radiusdedupedintoatlas_format.gd(preload,headless-safe);skip_testtriage—3sprint2proofsrevived(corner_revealhadpassedfromthewrongtile;NPCblockingdocumented),5deadstubsdeleted,soft-skipsconvertedtodo_skip.time_displayuntouchedperthePhase-5rider.Commitc64231e8e.', NULL, '2026-06-1214:24:13', '2026-06-1214:24:13', '2026-06-1214:24:13', NULL, '03dd08811a0179ba233af3cd914dff1b', 2) ON CONFLICT(hash) DO NOTHING;
INSERTINTOticket_history(ticket_record_id,field,old_value,new_value,changed_by,changed_at,created_at,updated_at,deleted_at,hash,canonical_version)VALUES('06FBPTXRBRFW4MH5G8C0X12YGR','description','(description follows in first append)
workers/stubs.rs:7claimsthepoolinfrastructureis"real and tested"—false.pool.rs:8-13documentsthataworker-threadpanicsilentlylosesin-flightrequests(TODO#843);forModalLockconsumersthatmeanstheplayerwaitsforever.SimulationPluginspawns4livestubthreadseverysession(simulation/mod.rs:85-87)forPhase-5+functionality.
workers/stubs.rs:7claimsthepoolinfrastructureis"real and tested"—false.pool.rs:8-13documentsthataworker-threadpanicsilentlylosesin-flightrequests(TODO#843);forModalLockconsumersthatmeanstheplayerwaitsforever.SimulationPluginspawns4livestubthreadseverysession(simulation/mod.rs:85-87)forPhase-5+functionality.
Closed(commit0bd895fca):falsetestedclaimcorrected;5pooltestsincl.twopanictests;catch_unwindkeepsworkerthreadsaliveonhandlerpanic(small-fixclause)—in-flightlossremainsthedocumented#843limitation,pinnedbytest.Heartbeat/re-enqueuestaysfuturework.', NULL, '2026-06-1214:24:13', '2026-06-1214:24:13', '2026-06-1214:24:13', NULL, 'fcefbac092e4713dce412f0471c401ba', 2) ON CONFLICT(hash) DO NOTHING;
INSERTINTOticket_history(ticket_record_id,field,old_value,new_value,changed_by,changed_at,created_at,updated_at,deleted_at,hash,canonical_version)VALUES('06FBPTXRG23G1RAREVHQJ14BWC','description','(description follows in first append)
1.S-06:addtheconsumercontract("every consumer must sort before state/wire use")tothethreeperceptiondisallowed-typesallows(shadowcast.rs:17,query.rs:11,interpretation.rs:9).
1.S-06:addtheconsumercontract("every consumer must sort before state/wire use")tothethreeperceptiondisallowed-typesallows(shadowcast.rs:17,query.rs:11,interpretation.rs:9).
Closed(commit0bd895fca):all5items.Notable:surnamecorporawereelement-identical(auditdriftclaimwrong)—dedupverifiedbyte-identicaloutput;generator_spikefeature-gated(kept,reversible);the22allow(dead_code)documentedasserdeschemaenforcementratherthanpruned;savepinned.after(Storyteller);11economysignaltestsonthenewSimulation::from_economy.Stamprefreshedviaregen-db(eadbc5b24).', NULL, '2026-06-1214:24:14', '2026-06-1214:24:14', '2026-06-1214:24:14', NULL, '32dd222a02d2dbb9c96c5b10cf0fe1dc', 2) ON CONFLICT(hash) DO NOTHING;
INSERTINTOticket_history(ticket_record_id,field,old_value,new_value,changed_by,changed_at,created_at,updated_at,deleted_at,hash,canonical_version)VALUES('06FBPTXRRDGJ5GFPGHZV3WS0D0','description','(description follows in first append)
Fix:maketest-tooling=test_sim_determinism.py+import_economics--dry-run against the committed DB; call from pre-push when TOOLING_CHANGED > 0; widen the ruff selection.', '(description follows in first append)
Fix:maketest-tooling=test_sim_determinism.py+import_economics--dry-run against the committed DB; call from pre-push when TOOLING_CHANGED > 0; widen the ruff selection.
Closed(commit346d87df7):maketest-tooling(determinismguard+dry-run,exit-2warnsemantics)wiredintopre-pushonTOOLING_CHANGED;ruffwidenedtoE4/E7/E9/F/Wwith90auto-fixesand3documentedignores(E402/E702/F841).', NULL, '2026-06-1214:24:14', '2026-06-1214:24:14', '2026-06-1214:24:14', NULL, '4ae244b039ac1d1545961caf7687a346', 2) ON CONFLICT(hash) DO NOTHING;
INSERTINTOticket_history(ticket_record_id,field,old_value,new_value,changed_by,changed_at,created_at,updated_at,deleted_at,hash,canonical_version)VALUES('06FBPTXS5YZ04F4CPPYNZS4Z2W','description','(description follows in first append)
Closed(commit346d87df7):all6driftitems—one-generatordocs,check-protocoldeleted,DEVOPShooksectionsfromsource,project.yaml0.4.0+description,voxel/cascade/main/relationships/chunk_streamingcommentfixes.', NULL, '2026-06-1214:24:14', '2026-06-1214:24:14', '2026-06-1214:24:14', NULL, 'e2083848b7232ebf323d208d485ea5cd', 2) ON CONFLICT(hash) DO NOTHING;
INSERTINTOticket_history(ticket_record_id,field,old_value,new_value,changed_by,changed_at,created_at,updated_at,deleted_at,hash,canonical_version)VALUES('06FBPTXSA4WFXPD21YK7N8SF60','description','(description follows in first append)
Closed(commitb4919c659):scaffoldlinkconditionalonthebakecriteria;2,131deadimagelinessurgicallyremoved(267withthefilekept).Brokenlinks2,180→49fromthisticketalone.', NULL, '2026-06-1214:24:14', '2026-06-1214:24:14', '2026-06-1214:24:14', NULL, '23d1179d6141e89206df1de3013eca2e', 2) ON CONFLICT(hash) DO NOTHING;
INSERTINTOticket_history(ticket_record_id,field,old_value,new_value,changed_by,changed_at,created_at,updated_at,deleted_at,hash,canonical_version)VALUES('06FBPTXSEC1F0RKJVH7JVPS8NW','description','(description follows in first append)
Closed(commitb4919c659):26linkbreaksfixed,navrefreshed(indexcounts,Economicssection,corpindexregeneratedfromfrontmatter,25stationGTTRslinked),GOVERNANCE.md+star-systemtemplaterewrittentothegeneratedmodel,triangles/index.mdadded.SolmarkerspartSPLITtoT-1073:conversionverifiedsafeforgenerationbutatlas_viewer.gd:433stillrendersthelegacygeometry—revertedtopreserveSolAtlasoverlays;landwiththeclientread-pathmigration.Residual:25intentional_templatesplaceholdersremain.', NULL, '2026-06-1214:24:14', '2026-06-1214:24:14', '2026-06-1214:24:14', NULL, '97b4bf803299029a02862cc9a4e73450', 2) ON CONFLICT(hash) DO NOTHING;
INSERTINTOticket_history(ticket_record_id,field,old_value,new_value,changed_by,changed_at,created_at,updated_at,deleted_at,hash,canonical_version)VALUES('06FBPTXRMET5CBB0ENBZGJQKX0','description','(description follows in first append)
@@ -1819,3 +1819,277 @@ INSERT INTO tickets (record_id, type, parent_record_id, title, description, stat
Re-homedundermaintenancefromdoneumbrellaT-871percascaderefocus2026-06-12.', 'in_progress', 'low', NULL, 'client', NULL, '2026-05-0208:11:59', '2026-06-1212:02:03', NULL, 'f437e0c45508a6e8a8761cde942648a5', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERTINTOtickets(record_id,type,parent_record_id,title,description,status,priority,assigned_to,team,decision_ref,created_at,updated_at,deleted_at,hash,canonical_version)VALUES('06FBRCMEKT72S0Q6NE68JH7EXC','task','06FB0TNSRZXCHGS16BFHSSGSV4','Sol markers → D-223 names-only, migrated together with the Atlas legacy-geometry read path','Split from T-1071 (2026-06-12): converting the 4 legacy geometry-bearing GJ-0 markers.json (GJ0d, GJ0d-1, GJ0e, GJ0f-2) to the D-223 names-only schema is SAFE for generation (import_economics.py:1452 skips GJ 0 explicitly; all authored coordinates/populations verified present name-by-name in tooling/planet-gen/sol_markers/*.json + sol_name_fixes.py FIXES) but REGRESSES the client: atlas_viewer.gd:433 still loads markers.json per the legacy D-191 §8 geometry schema, so Sol bodies lose their city/river/mountain Atlas overlays. The conversion was implemented, verified, and then deliberately reverted to preserve working overlays. Land both halves together: (1) point the Sol overlay read at the proper Sol home (sol_markers/ or a baked path — Q-107 consolidation may decide this), (2) convert the 4 files, (3) also fix the residual debt: sol_import.py still WRITES legacy-schema markers and an unconditional heightmap link in its own _write_index_md, and import_economics.py:1485 carries a now-misleading comment about preserved geometry markers (editing it stales the systems.db stamp — bundle with a regen).','backlog','low',NULL,'client',NULL,'2026-06-12 14:18:10','2026-06-12 14:18:10',NULL,'78e79b505b63901bf719649afc634080',2)ONCONFLICT(record_id)DOUPDATESETtype=excluded.type,parent_record_id=excluded.parent_record_id,title=excluded.title,description=excluded.description,status=excluded.status,priority=excluded.priority,assigned_to=excluded.assigned_to,team=excluded.team,decision_ref=excluded.decision_ref,updated_at=excluded.updated_at,deleted_at=excluded.deleted_at,hash=excluded.hash,canonical_version=excluded.canonical_versionWHEREexcluded.updated_at>tickets.updated_atOR(excluded.updated_at=tickets.updated_atANDexcluded.hash>tickets.hash);
INSERTINTOtickets(record_id,type,parent_record_id,title,description,status,priority,assigned_to,team,decision_ref,created_at,updated_at,deleted_at,hash,canonical_version)VALUES('06FB0TNSRY3TXD5HDKHFVGDG18','bug','06FBPPMZNNEV052DBYYY3A897C','test_implant_app_lifecycle: 1 failure — ImplantApp or HudGroups state API','1 failing test case in test_implant_app_lifecycle.gd. Suite tests ImplantApp._internal_app_changed, nav stack, preserves_state, and HudGroups state. after_test resets HudGroups._active_app, _active_mode, _groups — if these private fields were renamed or removed, after_test would fail and bleed state. Or a specific on_open/on_close hook fires differently. Run --filter test_implant_app_lifecycle and check specific assertion. Sprint 38 triage #871.
Re-homedundermaintenancefromdoneumbrellaT-871percascaderefocus2026-06-12.', 'done', 'low', NULL, 'client', NULL, '2026-05-0208:12:32', '2026-06-1214:24:13', NULL, '0948ff140a69ce9d955178f925d4bfa6', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERTINTOtickets(record_id,type,parent_record_id,title,description,status,priority,assigned_to,team,decision_ref,created_at,updated_at,deleted_at,hash,canonical_version)VALUES('06FBPTXRRDGJ5GFPGHZV3WS0D0','task','06FBPPMZNNEV052DBYYY3A897C','Wire tooling tests into a gate: make test-tooling + pre-push on tooling changes','(description follows in first append)
Fix:maketest-tooling=test_sim_determinism.py+import_economics--dry-run against the committed DB; call from pre-push when TOOLING_CHANGED > 0; widen the ruff selection.', 'done', 'medium', NULL, NULL, NULL, '2026-06-12 10:40:59', '2026-06-12 14:24:13', NULL, '1d82c2adab154cc4d390fd6e428ebea9', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERTINTOtickets(record_id,type,parent_record_id,title,description,status,priority,assigned_to,team,decision_ref,created_at,updated_at,deleted_at,hash,canonical_version)VALUES('06FB0TNSRWK87PCWGZ6GWT2TBM','bug','06FBPPMZNNEV052DBYYY3A897C','test_game_state_sprint20: 1 failure — SnapshotHandler or stationary_ticks path','1 failing test case in test_game_state_sprint20.gd. before_each resets SnapshotHandler._prev_player_position. If this static var was renamed or moved, the before_each hook would error. Alternatively a stationary_ticks path changed in SnapshotHandler. Verify SnapshotHandler still has static var _prev_player_position at that exact name. Sprint 38 triage #871.
Re-homedundermaintenancefromdoneumbrellaT-871percascaderefocus2026-06-12.', 'done', 'low', NULL, 'client', NULL, '2026-05-0208:12:38', '2026-06-1214:24:13', NULL, '3e0fe7ac0f42fbbe6fef466c5ad63c9c', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERTINTOtickets(record_id,type,parent_record_id,title,description,status,priority,assigned_to,team,decision_ref,created_at,updated_at,deleted_at,hash,canonical_version)VALUES('06FB0TNSRXCE9D9JYBZWVXMG68','bug','06FBPPMZNNEV052DBYYY3A897C','test_ai_dialogue_sprint26: 1 failure — HardwareDetector autoload missing or settings_dialog API','1 failing test case in test_ai_dialogue_sprint26.gd. The HardwareDetector tests skip if autoload not found. The GameState field tests (ai_enhanced_dialogue_enabled) look correct. The failing test is likely in the settings_dialog section: SETTINGS_DIALOG_SCENE preloaded at class level — if settings_dialog.tscn doesn''t exist or a method was renamed, class-level preload would fail. Check res://ui/settings_dialog.tscn exists and the relevant methods. Sprint 38 triage #871.
Re-homedundermaintenancefromdoneumbrellaT-871percascaderefocus2026-06-12.', 'done', 'low', NULL, 'client', NULL, '2026-05-0208:13:02', '2026-06-1214:24:13', NULL, '40073cb9ac939fee03085888f9de1a15', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERTINTOtickets(record_id,type,parent_record_id,title,description,status,priority,assigned_to,team,decision_ref,created_at,updated_at,deleted_at,hash,canonical_version)VALUES('06FBPTXRBRFW4MH5G8C0X12YGR','task','06FBPPMZNNEV052DBYYY3A897C','Workers pool: add tests, fix panic-loss, correct the false "tested" doc claim','(description follows in first append)
workers/stubs.rs:7claimsthepoolinfrastructureis"real and tested"—false.pool.rs:8-13documentsthataworker-threadpanicsilentlylosesin-flightrequests(TODO#843);forModalLockconsumersthatmeanstheplayerwaitsforever.SimulationPluginspawns4livestubthreadseverysession(simulation/mod.rs:85-87)forPhase-5+functionality.
Donow:correctthedocclaim;unittests(spawn/push/poll/shutdown+worker-panic).BeforeanyModalLockconsumerships(Phase5):heartbeat/re-enqueueordowngradeModalLocktoanerrorpath.Optional:deferthreadspawnuntilarealhandlerregisters.', 'done', 'medium', NULL, 'server', NULL, '2026-06-1210:40:59', '2026-06-1214:24:13', NULL, '421cda003bf656ccaf5eb3314ce20e5f', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERTINTOtickets(record_id,type,parent_record_id,title,description,status,priority,assigned_to,team,decision_ref,created_at,updated_at,deleted_at,hash,canonical_version)VALUES('06FBPTXS5YZ04F4CPPYNZS4Z2W','task','06FBPPMZNNEV052DBYYY3A897C','Docs-drift sweep: one-generator reality, dead check-protocol target, DEVOPS hook sections, project.yaml version, stale code comments','(description follows in first append)
6.S-11:commentsweep—main.rs:126-127claimsaprotocol_versionhandshakethatD-192removed;npc/relationships.rs:92TODO(v0.2);chunk_streaming.rs:6,21-22v0.3+—rephraseversiontargetsasphasenumbers.', 'done', 'medium', NULL, NULL, NULL, '2026-06-1210:40:59', '2026-06-1214:24:13', NULL, '4548675a40046129ac1e777897cf048c', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERTINTOtickets(record_id,type,parent_record_id,title,description,status,priority,assigned_to,team,decision_ref,created_at,updated_at,deleted_at,hash,canonical_version)VALUES('06FB0TNSRY9FV0S9RE42WY7SHW','bug','06FBPPMZNNEV052DBYYY3A897C','test_audio_sprint13: 1 failure — AudioManager.clear_dip or API drift','1 failing test case in test_audio_sprint13.gd. before_test calls AudioManager.clear_dip(), stop_all_loops(), set_volume() for all buses. If any of these methods were renamed or a bus constant changed, setup would fail and cascade. Or a specific dip timing assertion is stale. Run --filter test_audio_sprint13 and read the specific failure. Sprint 38 triage #871.
Re-homedundermaintenancefromdoneumbrellaT-871percascaderefocus2026-06-12.', 'done', 'low', NULL, 'client', NULL, '2026-05-0208:12:56', '2026-06-1214:24:13', NULL, '58bb6cfac08544d0a96eaae91c406d08', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERTINTOtickets(record_id,type,parent_record_id,title,description,status,priority,assigned_to,team,decision_ref,created_at,updated_at,deleted_at,hash,canonical_version)VALUES('06FB0TNSRYF23MZ86S1XF1542G','bug','06FBPPMZNNEV052DBYYY3A897C','test_fog_shader: 1 failure — stale VIS_PERIPHERAL or peripheral sector assertion','1 failing test case in test_fog_shader.gd. The most likely failure is test_fog_state_forward_vs_peripheral: it asserts Forward > Peripheral visibility values, but Sprint 22 (#569) removed peripheral sector. Now all visible tiles write VIS_FORWARD regardless. The test checks the texture is non-null (not the actual byte values), so it should pass... unless the failure is in test_fog_state_exploration_persists which has a weak assertion. Run --filter test_fog_shader to identify the specific failure. Sprint 38 triage #871.
Re-homedundermaintenancefromdoneumbrellaT-871percascaderefocus2026-06-12.', 'done', 'low', NULL, 'client', NULL, '2026-05-0208:12:45', '2026-06-1214:24:13', NULL, '5eeeb091debddf431862f81740099d6c', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERTINTOtickets(record_id,type,parent_record_id,title,description,status,priority,assigned_to,team,decision_ref,created_at,updated_at,deleted_at,hash,canonical_version)VALUES('06FB0TNSRXN360AQN3973AHS8M','bug','06FBPPMZNNEV052DBYYY3A897C','test_dialogue_sprint20: 5 failures — AudioManager.get_active_dip or other API drift','5 failing test cases in test_dialogue_sprint20.gd. The suite tests D-020 signal decoupling for dialogue_box. Likely failure: test_show_dialogue_does_not_call_audio_manager_directly compares AudioManager.get_active_dip() before/after show_dialogue — if AudioManager.get_active_dip() behavior changed or is not returning clean state, this would fail. Investigate by running the suite in isolation and reading specific assertion failures from the log. Sprint 38 triage #871.
Re-homedundermaintenancefromdoneumbrellaT-871percascaderefocus2026-06-12.', 'done', 'low', NULL, 'client', NULL, '2026-05-0208:11:54', '2026-06-1214:24:13', NULL, '685c10050d6fe1d0ecb1a28704329b78', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERTINTOtickets(record_id,type,parent_record_id,title,description,status,priority,assigned_to,team,decision_ref,created_at,updated_at,deleted_at,hash,canonical_version)VALUES('06FBPTXSA4WFXPD21YK7N8SF60','task','06FBPPMZNNEV052DBYYY3A897C','Fix 2,131 broken heightmap.png body-page links — conditional scaffold link + regenerate','(description follows in first append)
Thebody-pagescaffoldlinksforallnon-gas-giantbodies(scaffold_bodies.py:94-96)butheightmapsexistforonly267bodies(vs2,398reliefmap.png/3,256globe.png)—2,131ofthewiki''s2,180brokenlinksarethisonepattern,renderedasdeadimagesintheimplantwikiview.Fix:makethelinkconditionalinthescaffoldandregeneratetheVisualsectionofbodypages(orbackfillheightmapswherePhase4wantsthemanyway—theyareagenerationinput).', 'done', 'medium', NULL, 'content', NULL, '2026-06-1210:40:59', '2026-06-1214:24:13', NULL, '6a30b027e23ed98f9d7e0ccd9b664723', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERTINTOtickets(record_id,type,parent_record_id,title,description,status,priority,assigned_to,team,decision_ref,created_at,updated_at,deleted_at,hash,canonical_version)VALUES('06FB0TNSRWBJ1XC9V5ZQHSXAXG','bug','06FBPPMZNNEV052DBYYY3A897C','Rewrite P2-U01 monologue_display_visible_hidden test against current _visible array API','test_monologue_display_visible_hidden in test_client_p2.gd accessed mono.is_visible (a custom bool property). MonologueDisplay was refactored to use _visible: Array[Dictionary] instead. Test skipped (skip_test_) pending rewrite. New test should check _visible.size() > 0 after show_monologue, and == 0 when idle.
Re-homedundermaintenance(testdebt)percascaderefocus2026-06-12.', 'done', 'low', NULL, 'client', NULL, '2026-04-2011:17:20', '2026-06-1214:24:13', NULL, '6a59644e3381f650c86065fe1b1acdac', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERTINTOtickets(record_id,type,parent_record_id,title,description,status,priority,assigned_to,team,decision_ref,created_at,updated_at,deleted_at,hash,canonical_version)VALUES('06FBPTXS18RSVRHC7Y9TAX06HG','task','06FBPPMZNNEV052DBYYY3A897C','Client hygiene batch: orphan .gd.uid files, time_display removal rider, _format_pop dedupe, skip_test_ triage','(description follows in first append)
1.S-06:addtheconsumercontract("every consumer must sort before state/wire use")tothethreeperceptiondisallowed-typesallows(shadowcast.rs:17,query.rs:11,interpretation.rs:9).
5.S-12:unittestsforsimulation/economy.rssignalderivation(382lines,nocfg(test);fixturesseteconomy_snapshot:None)—trendwindowing,first-tickbaseline,zero-demandstockpileedge.', 'done', 'low', NULL, 'server', NULL, '2026-06-1210:40:59', '2026-06-1214:24:13', NULL, '8e130e0192f8605fdb3e8275fa381bb9', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERTINTOtickets(record_id,type,parent_record_id,title,description,status,priority,assigned_to,team,decision_ref,created_at,updated_at,deleted_at,hash,canonical_version)VALUES('06FB0TNSRXMVYQJV2QDHH8H7P8','bug','06FBPPMZNNEV052DBYYY3A897C','test_input_roundtrip: 3 failures — server binary missing or LocalBridge API change','3 failing test cases in test_input_roundtrip.gd. All tests check _connect_to_server() which skips if server binary not found — but 3 still fail, suggesting either: (1) server binary is present but something in LocalBridge.send_message, poll, or Protocol.encode_player_inputs changed, or (2) test environment returns false from _connect_to_server but then asserts fail. Investigate by running with --filter test_input_roundtrip and checking the log for exact assertion sites. Sprint 38 triage #871.
Re-homedundermaintenancefromdoneumbrellaT-871percascaderefocus2026-06-12.', 'done', 'low', NULL, 'client', NULL, '2026-05-0208:11:59', '2026-06-1214:24:13', NULL, 'cce44aef574862d52ade93a9c79a742a', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERTINTOtickets(record_id,type,parent_record_id,title,description,status,priority,assigned_to,team,decision_ref,created_at,updated_at,deleted_at,hash,canonical_version)VALUES('06FB0TNSRYEM4VSX74MS4NKQ1C','bug','06FBPPMZNNEV052DBYYY3A897C','Client test suite — pre-existing failures under bare run-godot','Surfaced 2026-05-24 running the full client suite (tests/run-godot, no server) during #960. NOT caused by #960 — verified: test_input_roundtrip fails identically at the pre-change baseline, and the rest are unrelated subsystems. Two categories to triage:
Re-homedundermaintenance(test-failuredebt/suitehygiene)percascaderefocus2026-06-12.', 'done', 'medium', NULL, 'client', NULL, '2026-05-2416:49:54', '2026-06-1214:24:13', NULL, 'cf14f5c5f7a5fc560570f960550eb38f', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERTINTOtickets(record_id,type,parent_record_id,title,description,status,priority,assigned_to,team,decision_ref,created_at,updated_at,deleted_at,hash,canonical_version)VALUES('06FB0TNSRZYDBRV5T9QVQAXGV0','bug','06FBPPMZNNEV052DBYYY3A897C','test_e2e_connection: 1 failure — server binary path or TCP connection state','1 failing test case in test_e2e_connection.gd. test_send_input_receive_snapshot skips if server binary not found. If it fails, either: (1) server binary exists but connection fails (port collision, timing), or (2) LocalBridge.reset() method was removed (the test calls _bridge.reset() but this may not exist on LocalBridge). Verify LocalBridge has a reset() method. Sprint 38 triage #871.
Re-homedundermaintenancefromdoneumbrellaT-871percascaderefocus2026-06-12.', 'done', 'low', NULL, 'client', NULL, '2026-05-0208:12:51', '2026-06-1214:24:13', NULL, 'd89fc4e5d05c47ae07446c602f85434a', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERTINTOtickets(record_id,type,parent_record_id,title,description,status,priority,assigned_to,team,decision_ref,created_at,updated_at,deleted_at,hash,canonical_version)VALUES('06FBPTXSEC1F0RKJVH7JVPS8NW','task','06FBPPMZNNEV052DBYYY3A897C','Wiki sweep: real link breaks, stale nav surfaces, GOVERNANCE/template reconcile, Sol legacy markers, triangles index','(description follows in first append)
-docs/design/(60+):~35filesfrozenat2026-02-19→03-14,status:activebutv0.1/v0.2-era(wow-moments,first-5-minutes,spatial-layout-*-v01,duelingcontent-structuredocs);still-load-bearing:star-map.json(Topologysource),gj-catalog-full.json,planetary-terrain-generation.md,cultural-diversity-audit.md(remediated,T-793done),sova-station-profile.md(canonforthestubsystem)', 'done', 'medium', NULL, 'content', NULL, '2026-06-1210:40:59', '2026-06-1214:24:13', NULL, 'dc2d82615d6192211a5a2966d2ed31af', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERTINTOtickets(record_id,type,parent_record_id,title,description,status,priority,assigned_to,team,decision_ref,created_at,updated_at,deleted_at,hash,canonical_version)VALUES('06FBPTXRMET5CBB0ENBZGJQKX0','task','06FBPPMZNNEV052DBYYY3A897C','Add a client-test gate to pre-push — the 63-file GDScript suite never runs automatically','(description follows in first append)
Fix:runtests/run-godotinpre-pushwhenCLIENT_CHANGED>0—orrecordmanual-onlyexplicitlyandfixteam-patterns.md.Relateddecision:Q-116(gdlintblocking).Prerequisiteworthchecking:T-973(pre-existingbare-runfailures,underthisinitiative)sothenewgatestartsgreen.', 'done', 'high', NULL, 'client', NULL, '2026-06-1210:40:59', '2026-06-1214:24:13', NULL, 'efbf589cb639a0051ce67141c64f8b23', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERTINTOtickets(record_id,type,parent_record_id,title,description,status,priority,assigned_to,team,decision_ref,created_at,updated_at,deleted_at,hash,canonical_version)VALUES('06FB0TNSRYEM4VSX74MS4NKQ1C','bug','06FBPPMZNNEV052DBYYY3A897C','Client test suite — pre-existing failures under bare run-godot','Surfaced 2026-05-24 running the full client suite (tests/run-godot, no server) during #960. NOT caused by #960 — verified: test_input_roundtrip fails identically at the pre-change baseline, and the rest are unrelated subsystems. Two categories to triage:
Closed2026-06-12(commitc64231e8e):baretests/run-godotfullygreen—1264cases/20failures→1268/0,independentlyre-verifiedbythelead(2536/2536,exit0).Twoproductionbugsfoundandfixedduringtriage(hud_groupsfreed-instancecrash;fog_stateD-059decaylossacrossresize).Thepushgatenowrunsthesuite(T-1065).', 'done', 'medium', NULL, 'client', NULL, '2026-05-2416:49:54', '2026-06-1214:24:13', NULL, '5cae4085d79e53d34fa914d3f0e7fa98', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERTINTOtickets(record_id,type,parent_record_id,title,description,status,priority,assigned_to,team,decision_ref,created_at,updated_at,deleted_at,hash,canonical_version)VALUES('06FB0TNSRXN360AQN3973AHS8M','bug','06FBPPMZNNEV052DBYYY3A897C','test_dialogue_sprint20: 5 failures — AudioManager.get_active_dip or other API drift','5 failing test cases in test_dialogue_sprint20.gd. The suite tests D-020 signal decoupling for dialogue_box. Likely failure: test_show_dialogue_does_not_call_audio_manager_directly compares AudioManager.get_active_dip() before/after show_dialogue — if AudioManager.get_active_dip() behavior changed or is not returning clean state, this would fail. Investigate by running the suite in isolation and reading specific assertion failures from the log. Sprint 38 triage #871.
Closed:productionwascorrect—5testscapturedlambdalocalsbyvalue(GDScript)sosignalflagsneverpropagated;rewrittenwitharraycapturesassertingexactemissioncounts+payloads(stronger).Commitc64231e8e.', 'done', 'low', NULL, 'client', NULL, '2026-05-0208:11:54', '2026-06-1214:24:13', NULL, 'd33925296302cc2da96933ba65c1e490', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERTINTOtickets(record_id,type,parent_record_id,title,description,status,priority,assigned_to,team,decision_ref,created_at,updated_at,deleted_at,hash,canonical_version)VALUES('06FB0TNSRXMVYQJV2QDHH8H7P8','bug','06FBPPMZNNEV052DBYYY3A897C','test_input_roundtrip: 3 failures — server binary missing or LocalBridge API change','3 failing test cases in test_input_roundtrip.gd. All tests check _connect_to_server() which skips if server binary not found — but 3 still fail, suggesting either: (1) server binary is present but something in LocalBridge.send_message, poll, or Protocol.encode_player_inputs changed, or (2) test environment returns false from _connect_to_server but then asserts fail. Investigate by running with --filter test_input_roundtrip and checking the log for exact assertion sites. Sprint 38 triage #871.
Closed:protocoldrift(#555handshake+#175StartupMessage,then20tpsstreamedsnapshots);testsnowdotherealexchangeandwaitondeterministicpositions.Genuinelyrunsagainstthelivebinary.Commitc64231e8e.', 'done', 'low', NULL, 'client', NULL, '2026-05-0208:11:59', '2026-06-1214:24:13', NULL, '7aa3f6ad70d133d223ff979b8026570b', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERTINTOtickets(record_id,type,parent_record_id,title,description,status,priority,assigned_to,team,decision_ref,created_at,updated_at,deleted_at,hash,canonical_version)VALUES('06FB0TNSRY3TXD5HDKHFVGDG18','bug','06FBPPMZNNEV052DBYYY3A897C','test_implant_app_lifecycle: 1 failure — ImplantApp or HudGroups state API','1 failing test case in test_implant_app_lifecycle.gd. Suite tests ImplantApp._internal_app_changed, nav stack, preserves_state, and HudGroups state. after_test resets HudGroups._active_app, _active_mode, _groups — if these private fields were renamed or removed, after_test would fail and bleed state. Or a specific on_open/on_close hook fires differently. Run --filter test_implant_app_lifecycle and check specific assertion. Sprint 38 triage #871.
Closed:realproductionbug—hud_groups._set_group_ztypedloopvarerrorsonfreedinstancesbeforetheguardruns;prune-then-iteratefix(self-pruningregistry).Commitc64231e8e.', 'done', 'low', NULL, 'client', NULL, '2026-05-0208:12:32', '2026-06-1214:24:13', NULL, '190990cad19d2308e6ba801bfe58c901', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERTINTOtickets(record_id,type,parent_record_id,title,description,status,priority,assigned_to,team,decision_ref,created_at,updated_at,deleted_at,hash,canonical_version)VALUES('06FB0TNSRWK87PCWGZ6GWT2TBM','bug','06FBPPMZNNEV052DBYYY3A897C','test_game_state_sprint20: 1 failure — SnapshotHandler or stationary_ticks path','1 failing test case in test_game_state_sprint20.gd. before_each resets SnapshotHandler._prev_player_position. If this static var was renamed or moved, the before_each hook would error. Alternatively a stationary_ticks path changed in SnapshotHandler. Verify SnapshotHandler still has static var _prev_player_position at that exact name. Sprint 38 triage #871.
Closed:norepro—alreadyfixedonmainby702fed592(before_each→before_testhookname);verified9/9inbaseline.Nochangeneeded.', 'done', 'low', NULL, 'client', NULL, '2026-05-0208:12:38', '2026-06-1214:24:13', NULL, 'e02247ba88e17bad5762d30abacf1046', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERTINTOtickets(record_id,type,parent_record_id,title,description,status,priority,assigned_to,team,decision_ref,created_at,updated_at,deleted_at,hash,canonical_version)VALUES('06FB0TNSRYF23MZ86S1XF1542G','bug','06FBPPMZNNEV052DBYYY3A897C','test_fog_shader: 1 failure — stale VIS_PERIPHERAL or peripheral sector assertion','1 failing test case in test_fog_shader.gd. The most likely failure is test_fog_state_forward_vs_peripheral: it asserts Forward > Peripheral visibility values, but Sprint 22 (#569) removed peripheral sector. Now all visible tiles write VIS_FORWARD regardless. The test checks the texture is non-null (not the actual byte values), so it should pass... unless the failure is in test_fog_state_exploration_persists which has a weak assertion. Run --filter test_fog_shader to identify the specific failure. Sprint 38 triage #871.
Closed:failingcasewastheperftestmeasuringthefirstcall(includestheone-offgrow-onlyresize);nowwarmsupandmeasuressteadystateagainstthesame0.5msbudget.StalePeripheralvocabularyremoved.Commitc64231e8e.', 'done', 'low', NULL, 'client', NULL, '2026-05-0208:12:45', '2026-06-1214:24:13', NULL, 'ba24b7a9d5531069ecbfc42d56fbbbb2', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERTINTOtickets(record_id,type,parent_record_id,title,description,status,priority,assigned_to,team,decision_ref,created_at,updated_at,deleted_at,hash,canonical_version)VALUES('06FB0TNSRZYDBRV5T9QVQAXGV0','bug','06FBPPMZNNEV052DBYYY3A897C','test_e2e_connection: 1 failure — server binary path or TCP connection state','1 failing test case in test_e2e_connection.gd. test_send_input_receive_snapshot skips if server binary not found. If it fails, either: (1) server binary exists but connection fails (port collision, timing), or (2) LocalBridge.reset() method was removed (the test calls _bridge.reset() but this may not exist on LocalBridge). Verify LocalBridge has a reset() method. Sprint 38 triage #871.
Closed:sameprotocoldriftasT-929;handshakeadded,binary-absenceisarealskip.LocalBridge.reset()suspicionwaswrong.Commitc64231e8e.', 'done', 'low', NULL, 'client', NULL, '2026-05-0208:12:51', '2026-06-1214:24:13', NULL, 'cdbecae3a8cf391768c63bdf52cee076', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERTINTOtickets(record_id,type,parent_record_id,title,description,status,priority,assigned_to,team,decision_ref,created_at,updated_at,deleted_at,hash,canonical_version)VALUES('06FB0TNSRY9FV0S9RE42WY7SHW','bug','06FBPPMZNNEV052DBYYY3A897C','test_audio_sprint13: 1 failure — AudioManager.clear_dip or API drift','1 failing test case in test_audio_sprint13.gd. before_test calls AudioManager.clear_dip(), stop_all_loops(), set_volume() for all buses. If any of these methods were renamed or a bus constant changed, setup would fail and cascade. Or a specific dip timing assertion is stale. Run --filter test_audio_sprint13 and read the specific failure. Sprint 38 triage #871.
Closed:clear_dipwasfine;thechimetestassertedD-067prose(300-400ms)againstthedeliberatelyshipped800msasset(#327,ui.mdUI-005).Testpinsthecatalog;D-067amended2026-06-12withthe800msreality.Commitc64231e8e.', 'done', 'low', NULL, 'client', NULL, '2026-05-0208:12:56', '2026-06-1214:24:13', NULL, '8169d7f755c8212091f806f66c3412c0', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERTINTOtickets(record_id,type,parent_record_id,title,description,status,priority,assigned_to,team,decision_ref,created_at,updated_at,deleted_at,hash,canonical_version)VALUES('06FB0TNSRXCE9D9JYBZWVXMG68','bug','06FBPPMZNNEV052DBYYY3A897C','test_ai_dialogue_sprint26: 1 failure — HardwareDetector autoload missing or settings_dialog API','1 failing test case in test_ai_dialogue_sprint26.gd. The HardwareDetector tests skip if autoload not found. The GameState field tests (ai_enhanced_dialogue_enabled) look correct. The failing test is likely in the settings_dialog section: SETTINGS_DIALOG_SCENE preloaded at class level — if settings_dialog.tscn doesn''t exist or a method was renamed, class-level preload would fail. Check res://ui/settings_dialog.tscn exists and the relevant methods. Sprint 38 triage #871.
Closed:MetaScreenmigration(f24d08f75)movedUIbuildtoon_open();testsnowopenthedialogfirst;vacuousnull-labelpasseliminated.Commitc64231e8e.', 'done', 'low', NULL, 'client', NULL, '2026-05-0208:13:02', '2026-06-1214:24:13', NULL, 'af9bf10870202ff86c14fca1e1fda302', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERTINTOtickets(record_id,type,parent_record_id,title,description,status,priority,assigned_to,team,decision_ref,created_at,updated_at,deleted_at,hash,canonical_version)VALUES('06FB0TNSRWBJ1XC9V5ZQHSXAXG','bug','06FBPPMZNNEV052DBYYY3A897C','Rewrite P2-U01 monologue_display_visible_hidden test against current _visible array API','test_monologue_display_visible_hidden in test_client_p2.gd accessed mono.is_visible (a custom bool property). MonologueDisplay was refactored to use _visible: Array[Dictionary] instead. Test skipped (skip_test_) pending rewrite. New test should check _visible.size() > 0 after show_monologue, and == 0 when idle.
workers/stubs.rs:7claimsthepoolinfrastructureis"real and tested"—false.pool.rs:8-13documentsthataworker-threadpanicsilentlylosesin-flightrequests(TODO#843);forModalLockconsumersthatmeanstheplayerwaitsforever.SimulationPluginspawns4livestubthreadseverysession(simulation/mod.rs:85-87)forPhase-5+functionality.
1.S-06:addtheconsumercontract("every consumer must sort before state/wire use")tothethreeperceptiondisallowed-typesallows(shadowcast.rs:17,query.rs:11,interpretation.rs:9).
Closed(commit0bd895fca):all5items.Notable:surnamecorporawereelement-identical(auditdriftclaimwrong)—dedupverifiedbyte-identicaloutput;generator_spikefeature-gated(kept,reversible);the22allow(dead_code)documentedasserdeschemaenforcementratherthanpruned;savepinned.after(Storyteller);11economysignaltestsonthenewSimulation::from_economy.Stamprefreshedviaregen-db(eadbc5b24).', 'done', 'low', NULL, 'server', NULL, '2026-06-1210:40:59', '2026-06-1214:24:14', NULL, 'cd2623b4c501079e3630ec97501d238b', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERTINTOtickets(record_id,type,parent_record_id,title,description,status,priority,assigned_to,team,decision_ref,created_at,updated_at,deleted_at,hash,canonical_version)VALUES('06FBPTXRRDGJ5GFPGHZV3WS0D0','task','06FBPPMZNNEV052DBYYY3A897C','Wire tooling tests into a gate: make test-tooling + pre-push on tooling changes','(description follows in first append)
Fix:maketest-tooling=test_sim_determinism.py+import_economics--dry-run against the committed DB; call from pre-push when TOOLING_CHANGED > 0; widen the ruff selection.
Closed(commit346d87df7):maketest-tooling(determinismguard+dry-run,exit-2warnsemantics)wiredintopre-pushonTOOLING_CHANGED;ruffwidenedtoE4/E7/E9/F/Wwith90auto-fixesand3documentedignores(E402/E702/F841).', 'done', 'medium', NULL, NULL, NULL, '2026-06-1210:40:59', '2026-06-1214:24:14', NULL, '93088a593d8f0569b8281c98669f7c4f', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERTINTOtickets(record_id,type,parent_record_id,title,description,status,priority,assigned_to,team,decision_ref,created_at,updated_at,deleted_at,hash,canonical_version)VALUES('06FBPTXS5YZ04F4CPPYNZS4Z2W','task','06FBPPMZNNEV052DBYYY3A897C','Docs-drift sweep: one-generator reality, dead check-protocol target, DEVOPS hook sections, project.yaml version, stale code comments','(description follows in first append)
Closed(commitb4919c659):scaffoldlinkconditionalonthebakecriteria;2,131deadimagelinessurgicallyremoved(267withthefilekept).Brokenlinks2,180→49fromthisticketalone.', 'done', 'medium', NULL, 'content', NULL, '2026-06-1210:40:59', '2026-06-1214:24:14', NULL, 'a20d47cfe2a9fc5ff09b8bc8039491d3', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERTINTOtickets(record_id,type,parent_record_id,title,description,status,priority,assigned_to,team,decision_ref,created_at,updated_at,deleted_at,hash,canonical_version)VALUES('06FBPTXSEC1F0RKJVH7JVPS8NW','task','06FBPPMZNNEV052DBYYY3A897C','Wiki sweep: real link breaks, stale nav surfaces, GOVERNANCE/template reconcile, Sol legacy markers, triangles index','(description follows in first append)
Closed(commitb4919c659):26linkbreaksfixed,navrefreshed(indexcounts,Economicssection,corpindexregeneratedfromfrontmatter,25stationGTTRslinked),GOVERNANCE.md+star-systemtemplaterewrittentothegeneratedmodel,triangles/index.mdadded.SolmarkerspartSPLITtoT-1073:conversionverifiedsafeforgenerationbutatlas_viewer.gd:433stillrendersthelegacygeometry—revertedtopreserveSolAtlasoverlays;landwiththeclientread-pathmigration.Residual:25intentional_templatesplaceholdersremain.', 'done', 'medium', NULL, 'content', NULL, '2026-06-1210:40:59', '2026-06-1214:24:14', NULL, '87c6c991d95b23f7b783a18f423ffd40', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERTINTOtickets(record_id,type,parent_record_id,title,description,status,priority,assigned_to,team,decision_ref,created_at,updated_at,deleted_at,hash,canonical_version)VALUES('06FBPTXRMET5CBB0ENBZGJQKX0','task','06FBPPMZNNEV052DBYYY3A897C','Add a client-test gate to pre-push — the 63-file GDScript suite never runs automatically','(description follows in first append)
- **Raised by:** Gestalt (proposal), confirmed by Team Leader (Jeroen)
- **Dissent:** None
- **Amendment (2026-06-12):** **Chime duration is 800 ms**, not 300–400 ms. The shipped `sfx_monologue_chime.ogg` is a deliberate 0.8 s manual synthesis (Sprint 10, #327; full synthesis spec in `docs/assets/audio/ui.md` UI-005) and the client test suite pins the catalog duration (`test_audio_sprint13.gd`). The onset timing, "unresolved" character, and recognition sequence above are unchanged — only the duration figure was stale. Surfaced by the T-938 test-debt fix.
### D-069: Audio dip profiles for dialogue and confrontation
- **Date:** 2026-02-16
Reference in New Issue
Block a user
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.