kenaz 0.3.22 → 0.3.24

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (474) hide show
  1. package/core/.claude/hooks/_user-scope.js +1 -1
  2. package/core/.claude/hooks/core-resolve.js +1 -1
  3. package/core/.claude/hooks/worktree-create.js +11 -29
  4. package/core/.claude/hooks/worktree-remove.js +12 -38
  5. package/core/.collaboration/core/reconcile.js +16 -1
  6. package/core/.collaboration/core/task-2467-lifecycle.test.js +63 -0
  7. package/core/.collaboration/core/task-api.js +37 -7
  8. package/core/.formation/bifrost/launch.js +1 -1
  9. package/core/.formation/tools/dispatch-detail/worktree-subagent-mode.md +6 -1
  10. package/core/.formation/tools/kenaz-stats.js +1 -1
  11. package/core/.formation/tools/post-complete/git-merge.js +1 -1
  12. package/core/.formation/tools/prompt.js +1 -1
  13. package/core/.formation/tools/utils.js +5 -5
  14. package/core/.formation/tools/worktree-reclaim.js +73 -2
  15. package/core/.formation/tools/worktree-reclaim.test.js +113 -0
  16. package/core/.kenaz/specialist/ansuz_rules.yaml +7 -51
  17. package/core/.kenaz/specialist/ansuz_session_handoff.schema.json +2 -6
  18. package/core/.rule/general/project-self-containment.yaml +2 -2
  19. package/core/.specialist/Amelia/README.md +1 -1
  20. package/core/.specialist/Amelia/rule.yaml +1 -1
  21. package/core/.specialist/Ansuz/RULES.md +6 -2
  22. package/core/.specialist/Ansuz/concepts/commitment_layer.yaml +1 -1
  23. package/core/.specialist/Ansuz/concepts/evolvable_guardrails.yaml +1 -1
  24. package/core/.specialist/Ansuz/knowledge.yaml +1 -3
  25. package/core/.specialist/tools/__tests__/task-2409-lessons.test.js +10 -0
  26. package/core/.specialist/tools/__tests__/task-2427-harvest.test.js +25 -0
  27. package/core/.specialist/tools/ansuz-boot-fast.js +1 -1
  28. package/core/.specialist/tools/failure-detector.js +4 -4
  29. package/core/.specialist/tools/handoff-doc.js +1 -1
  30. package/core/.specialist/tools/lessons.js +2 -2
  31. package/core/CLAUDE.md +5 -5
  32. package/core/KENAZ_CORE_VERSION +1 -1
  33. package/core/dashboard/scripts/install-kenaz-cli.js +56 -30
  34. package/core/dev/scripts/check-file-size.js +1 -1
  35. package/core/dev/scripts/ci-feedback.js +1 -1
  36. package/core/dev/scripts/gc-agent-worktrees.js +13 -12
  37. package/core/dev/scripts/kenaz-session.js +3 -3
  38. package/core/dev/scripts/peer-identity-e2e.js +6 -4
  39. package/core/dev/scripts/run-rust-tests.js +2 -2
  40. package/core/dev/scripts/skill-routing-replay.js +3 -3
  41. package/core/dev/scripts/task1961/selftest.js +2 -2
  42. package/core/dev/scripts/windows-hide-guard.test.js +112 -0
  43. package/core/plugins/kenaz/guidance.md +1 -0
  44. package/core/plugins/kenaz/hooks/core-resolve.js +1 -1
  45. package/core/plugins/kenaz/hooks/hooks.json +9 -0
  46. package/core/plugins/kenaz/hooks/kenaz-hook.js +58 -4
  47. package/core/plugins/kenaz/hooks/worktree-guard.js +121 -0
  48. package/core/plugins/kenaz/hooks/worktree-guard.test.js +75 -0
  49. package/core/plugins/kenaz/scripts/kenaz.test.js +72 -5
  50. package/core/plugins/kenaz-peer/hooks/register.test.ts +14 -2
  51. package/core/plugins/kenaz-peer/hooks/register.ts +6 -1
  52. package/lib/cli.js +9 -5
  53. package/package.json +6 -6
  54. package/vendor/install-kenaz-cli.js +56 -30
  55. package/core/.kenaz/designs/METAPLASTICITY_CONFIDENCE_DESIGN.md +0 -537
  56. package/core/.kenaz/designs/REFLEX_INITIATOR_DESIGN.md +0 -501
  57. package/core/.kenaz/designs/TASK_1385_handoff_mcp_design.md +0 -426
  58. package/core/.kenaz/designs/TASK_932_hippocampus_consolidation.md +0 -103
  59. package/core/.kenaz/designs/TASK_934_efe_signal_engine.md +0 -97
  60. package/core/.kenaz/designs/TASK_935_self_evolution_framework.md +0 -154
  61. package/core/.kenaz/designs/VISION_cognitive_architecture_roadmap.md +0 -159
  62. package/core/.kenaz/designs/metaplasticity_simulation_results.json +0 -696
  63. package/core/.kenaz/main-memory/README.md +0 -230
  64. package/core/.kenaz/main-memory/kenaz/cortex/001_cortex_overview.md +0 -168
  65. package/core/.kenaz/main-memory/kenaz/cortex/001_rag_engine_overview.md +0 -30
  66. package/core/.kenaz/main-memory/kenaz/memory-system/001_three_tier_architecture.md +0 -361
  67. package/core/.kenaz/main-memory/kenaz/pipeline/001_task_execution_flow.md +0 -117
  68. package/core/.kenaz/main-memory/kenaz/pipeline/001_task_granularity.md +0 -154
  69. package/core/.kenaz/main-memory/kenaz/pipeline/002_team_priority.md +0 -51
  70. package/core/.kenaz/main-memory/kenaz/pipeline/003_feature_id_system.md +0 -46
  71. package/core/.kenaz/main-memory/kenaz/rules/001_gen_007_self_containment.md +0 -108
  72. package/core/.kenaz/main-memory/kenaz/rules/001_rule_priority_system.md +0 -121
  73. package/core/.kenaz/main-memory/kenaz/rules/002_agt_006_pre_check.md +0 -0
  74. package/core/.kenaz/main-memory/kenaz/rules/003_ppl_002_task_archival.md +0 -48
  75. package/core/.kenaz/main-memory/kenaz/system/001_dual_track_task_system.md +0 -197
  76. package/core/.kenaz/main-memory/knowledge/patterns/001_json_bom_issue.md +0 -78
  77. package/core/.kenaz/main-memory/knowledge/patterns/001_leader_worker_pattern.md +0 -0
  78. package/core/.kenaz/main-memory/knowledge/patterns/002_scope_path_conflict.md +0 -115
  79. package/core/.kenaz/main-memory/knowledge/patterns/002_task_dependency_resolution.md +0 -223
  80. package/core/.kenaz/main-memory/knowledge/patterns/003_question_protocol.md +0 -242
  81. package/core/.kenaz/main-memory/knowledge/patterns/004_user_insight_value.md +0 -111
  82. package/core/.kenaz/main-memory/knowledge/patterns/005_file_lock_pattern.md +0 -274
  83. package/core/.kenaz/main-memory/knowledge/references/001_ppl_rules.md +0 -28
  84. package/core/.kenaz/main-memory/knowledge/solutions/001_json_bom_issue.md +0 -137
  85. package/core/.kenaz/main-memory/knowledge/solutions/001_team_invocation.md +0 -0
  86. package/core/.kenaz/main-memory/knowledge/solutions/002_passive_monitoring.md +0 -0
  87. package/core/.kenaz/main-memory/knowledge/solutions/003_windows_file_race_condition.md +0 -239
  88. package/core/.kenaz/main-memory/registry.json +0 -326
  89. package/core/.kenaz/main-memory/version.yaml +0 -58
  90. package/core/.kenaz/specialist/memory_guard_fired.json +0 -1
  91. package/core/.kenaz/specialist/memory_guard_trigger_cache.json +0 -1
  92. package/core/.kenaz/specialist/memory_source_priority.yaml +0 -260
  93. package/core/.kenaz/specialist/prompt_1775.txt +0 -317
  94. package/core/.kenaz/specialist/prompt_1776.txt +0 -326
  95. package/core/.kenaz/specialist/prompt_1791.txt +0 -320
  96. package/core/.kenaz/specialist/prompt_1792.txt +0 -320
  97. package/core/.kenaz/specialist/prompt_1795.txt +0 -281
  98. package/core/.kenaz/specialist/prompt_1813.txt +0 -332
  99. package/core/.kenaz/specialist/prompt_1814.txt +0 -401
  100. package/core/.kenaz/specialist/prompt_1815.txt +0 -394
  101. package/core/.kenaz/specialist/prompt_1816.txt +0 -437
  102. package/core/.kenaz/specialist/prompt_1818.txt +0 -361
  103. package/core/.kenaz/specialist/prompt_1819.txt +0 -421
  104. package/core/.kenaz/specialist/prompt_1821.txt +0 -345
  105. package/core/.kenaz/specialist/prompt_1822.txt +0 -313
  106. package/core/.kenaz/specialist/prompt_1824.txt +0 -348
  107. package/core/.kenaz/specialist/prompt_1826.txt +0 -388
  108. package/core/.kenaz/specialist/rune_efe_salience_gap.md +0 -21
  109. package/core/.kenaz/specialist/task1825_update.json +0 -43
  110. package/core/.kenaz/specialist/taskgen/consolidation_i.json +0 -38
  111. package/core/.kenaz/specialist/taskgen/csharp_a.json +0 -44
  112. package/core/.kenaz/specialist/taskgen/csharp_b.json +0 -40
  113. package/core/.kenaz/specialist/taskgen/embedding_e.json +0 -34
  114. package/core/.kenaz/specialist/taskgen/hygiene_fg.json +0 -39
  115. package/core/.kenaz/specialist/taskgen/pathology_h.json +0 -36
  116. package/core/.kenaz/specialist/taskgen/unity_noise_d.json +0 -38
  117. package/core/.kenaz/specialist/taskgen/visibility_c.json +0 -38
  118. package/core/.specialist/Ansuz/decisions/ADR-requirement-graph-layer.md +0 -390
  119. package/core/.specialist/Ansuz/self_model_seed.backup.json +0 -100
  120. package/core/.specialist/ansuz_session_handoff.json +0 -96
  121. package/core/dev/ALAYA_FIELD_FEEDBACK_DESIGN.md +0 -126
  122. package/core/dev/ANSUZ_SCAFFOLD_DIET_2026-09-20.md +0 -231
  123. package/core/dev/ANSUZ_STARTUP_INJECTION_REVIEW.md +0 -355
  124. package/core/dev/ANSUZ_WORKFLOW_MODERNIZATION.md +0 -143
  125. package/core/dev/CORTEX_META_GRAPH_ASSESSMENT.md +0 -99
  126. package/core/dev/FREYA_DOWNSTREAM_BUGS_2026-09-19.md +0 -44
  127. package/core/dev/GLOBAL_MEMORY_IDENTITY_CONSOLIDATION.md +0 -263
  128. package/core/dev/GUARD_EFFECTIVENESS_DESIGN.md +0 -180
  129. package/core/dev/HEALTH_GATE_VARIANCE_ASSESSMENT.md +0 -271
  130. package/core/dev/HOOK_DIET_2026-09-21.md +0 -126
  131. package/core/dev/JEV_INTEGRATION_PLAN.md +0 -189
  132. package/core/dev/KENAZ_AGENT_CONNECT_v1_SPEC.md +0 -139
  133. package/core/dev/MOBILE_DESIGN_SPEC.md +0 -569
  134. package/core/dev/MULTI_ANSUZ_SPEC.md +0 -136
  135. package/core/dev/MUNINN_RETIREMENT.md +0 -115
  136. package/core/dev/PHASE3_ATTRIBUTION_POPULATION_DIAGNOSIS.md +0 -211
  137. package/core/dev/PHASE3_P3-2B_TASKLEVEL_PROBE.md +0 -83
  138. package/core/dev/PHASE3_P3-2_POPULATION_DISJOINTNESS.md +0 -83
  139. package/core/dev/PHASE3_P3-2_REMEASURE_REPORT.md +0 -231
  140. package/core/dev/PREDICTION_GROUNDING_DESIGN.md +0 -376
  141. package/core/dev/PRODUCT_SPEC.md +0 -317
  142. package/core/dev/PROJECT_REGISTRY_DUPLICATE_ASSESSMENT.md +0 -86
  143. package/core/dev/STARTUP_TIMELINE_TASK_1995.md +0 -181
  144. package/core/dev/SYNAPSE_WORKER_PER_PROJECT.md +0 -881
  145. package/core/dev/TASK_1680_P3-3_DISPATCH_SPEC.md +0 -96
  146. package/core/dev/TASK_1684_CALIBRATION_IMPACT_ANALYSIS.md +0 -170
  147. package/core/dev/TASK_1684_FORK_A_GOODHART_DESIGN.md +0 -171
  148. package/core/dev/TASK_1684_P3_2_REMEASURE_VALIDATION.md +0 -262
  149. package/core/dev/TASK_1903_SIGNAL_AUC_MEASUREMENT.md +0 -207
  150. package/core/dev/TASK_1904_BRANCH_INTEGRITY_AUDIT.md +0 -146
  151. package/core/dev/ansuz-eval/README.md +0 -38
  152. package/core/dev/ansuz-eval/build-fixtures.js +0 -87
  153. package/core/dev/ansuz-eval/grade.js +0 -96
  154. package/core/dev/ansuz-eval/grader.test.js +0 -117
  155. package/core/dev/ansuz-eval/tasks.md +0 -32
  156. package/core/dev/archive/ansuz/BOOT_FULL.md +0 -141
  157. package/core/dev/archive/ansuz/agents/ansuz-boot.md +0 -176
  158. package/core/dev/archive/ansuz/designs/alaya-passive-surfacing.md +0 -84
  159. package/core/dev/archive/ansuz/designs/cc_memory_indexing.md +0 -307
  160. package/core/dev/archive/ansuz/designs/check_guard.md +0 -322
  161. package/core/dev/archive/ansuz/designs/consequence_loop.md +0 -227
  162. package/core/dev/archive/ansuz/designs/mcp_kuzudb_lock_architecture.md +0 -312
  163. package/core/dev/archive/ansuz/designs/phase0_git_enrichment.md +0 -278
  164. package/core/dev/archive/ansuz/designs/refactor_mcp_tools_synapse.md +0 -490
  165. package/core/dev/archive/ansuz/designs/semantic_markdown_extraction.md +0 -167
  166. package/core/dev/archive/ansuz/designs/task_1372_prompt_injects_into.md +0 -193
  167. package/core/dev/archive/ansuz/designs/thought_stack.md +0 -286
  168. package/core/dev/archive/ansuz/investigations/reachability_unified_api_2026-04-11.md +0 -330
  169. package/core/dev/archive/ansuz/investigations/synapse_orphans_indexing_bug_2026-04-11.md +0 -352
  170. package/core/dev/archive/ansuz/investigations/synapse_orphans_reindex_verification_2026-04-11.md +0 -48
  171. package/core/dev/archive/ansuz/investigations/synapse_orphans_verification_2026-04-11.md +0 -170
  172. package/core/dev/archive/ansuz/legacy/kernel.yaml +0 -399
  173. package/core/dev/archive/ansuz/legacy/phases/phase_0.yaml +0 -418
  174. package/core/dev/archive/ansuz/legacy/phases/phase_1.yaml +0 -376
  175. package/core/dev/archive/ansuz/legacy/phases/phase_10.yaml +0 -35
  176. package/core/dev/archive/ansuz/legacy/phases/phase_11.yaml +0 -582
  177. package/core/dev/archive/ansuz/legacy/phases/phase_2.yaml +0 -94
  178. package/core/dev/archive/ansuz/legacy/phases/phase_3.yaml +0 -274
  179. package/core/dev/archive/ansuz/legacy/phases/phase_4.yaml +0 -67
  180. package/core/dev/archive/ansuz/legacy/phases/phase_5.yaml +0 -32
  181. package/core/dev/archive/ansuz/legacy/phases/phase_6.yaml +0 -91
  182. package/core/dev/archive/ansuz/legacy/phases/phase_7.yaml +0 -58
  183. package/core/dev/archive/ansuz/legacy/phases/phase_8.yaml +0 -146
  184. package/core/dev/archive/ansuz/legacy/phases/phase_9.yaml +0 -424
  185. package/core/dev/archive/ansuz/specs/INDEX_bifrost_hook_parity.yaml +0 -92
  186. package/core/dev/archive/ansuz/specs/active-inference-formation.yaml +0 -453
  187. package/core/dev/archive/ansuz/specs/brief_TASK_1228_userpromptsubmit.yaml +0 -191
  188. package/core/dev/archive/ansuz/specs/brief_TASK_1229_pretooluse_posttooluse.yaml +0 -250
  189. package/core/dev/archive/ansuz/specs/brief_TASK_1230_sessionstart_stop.yaml +0 -301
  190. package/core/dev/archive/ansuz/specs/brief_TASK_1231_verification.yaml +0 -272
  191. package/core/dev/archive/skills/feature_agent/SKILL.md +0 -289
  192. package/core/dev/design/PHASE4_DESIGN.md +0 -559
  193. package/core/dev/design/dashboard_docs_integration_PLAN.md +0 -388
  194. package/core/dev/design/matrix_format_ABBREVIATIONS.md +0 -655
  195. package/core/dev/design/matrix_format_DESIGN_SPEC.md +0 -601
  196. package/core/dev/design/matrix_format_DISCUSSION_SUMMARY.md +0 -484
  197. package/core/dev/design/matrix_format_EXAMPLE_memory.matrix +0 -13
  198. package/core/dev/design/matrix_format_EXAMPLE_project_status.matrix +0 -9
  199. package/core/dev/design/matrix_format_EXAMPLE_tasks.matrix +0 -14
  200. package/core/dev/design/matrix_format_SYNTAX_BNF.md +0 -754
  201. package/core/dev/design/matrix_format_TOKEN_COMPARISON.md +0 -484
  202. package/core/dev/design/matrix_v2_COGNITIVE_DESIGN.md +0 -503
  203. package/core/dev/design/matrix_v2_DISCUSSION_SUMMARY.md +0 -414
  204. package/core/dev/design/matrix_v2_EXAMPLE.matrix +0 -67
  205. package/core/dev/designs/EXPANDABLE_CARD_DESIGN_SPEC.md +0 -509
  206. package/core/dev/jev-eval/ACTIVE_CORRECTION.md +0 -52
  207. package/core/dev/jev-eval/ANNOTATION_GUIDE.md +0 -68
  208. package/core/dev/jev-eval/BASELINE_COMPARISON.md +0 -45
  209. package/core/dev/jev-eval/CONTEXT_REVIEW.md +0 -31
  210. package/core/dev/jev-eval/EVALUATION_STATUS.md +0 -39
  211. package/core/dev/jev-eval/HISTORICAL_CORPUS.md +0 -33
  212. package/core/dev/jev-eval/PACKAGING_VERIFICATION.md +0 -42
  213. package/core/dev/jev-eval/README.md +0 -101
  214. package/core/dev/jev-eval/THALAMUS_RANKING.md +0 -58
  215. package/core/dev/jev-eval/VALIDATION_PROGRESS.md +0 -54
  216. package/core/dev/jev-eval/cli.mjs +0 -50
  217. package/core/dev/jev-eval/context.mjs +0 -183
  218. package/core/dev/jev-eval/corpus.mjs +0 -186
  219. package/core/dev/jev-eval/fixtures/conversation-review.seed.jsonl +0 -6
  220. package/core/dev/jev-eval/fixtures/synthetic.jsonl +0 -11
  221. package/core/dev/jev-eval/metrics.mjs +0 -67
  222. package/core/dev/jev-eval/muninn-baseline.mjs +0 -119
  223. package/core/dev/jev-eval/providers.mjs +0 -95
  224. package/core/dev/jev-eval/reports/annotation-pilot-2026-09-20.json +0 -32
  225. package/core/dev/jev-eval/reports/context-review-2026-09-20.json +0 -48
  226. package/core/dev/jev-eval/reports/conversation-review.pending.json +0 -151
  227. package/core/dev/jev-eval/reports/history-corpus-2026-09-20.json +0 -52
  228. package/core/dev/jev-eval/reports/length-probe-2026-09-20.json +0 -133
  229. package/core/dev/jev-eval/reports/live-smoke-2026-09-20.json +0 -616
  230. package/core/dev/jev-eval/reports/muninn-baseline-2026-09-20.json +0 -52
  231. package/core/dev/jev-eval/reports/resilience-2026-09-20.json +0 -520
  232. package/core/dev/jev-eval/reports/rules-baseline.json +0 -197
  233. package/core/dev/jev-eval/reports/synthetic-review.pending.json +0 -357
  234. package/core/dev/jev-eval/resilience.mjs +0 -71
  235. package/core/dev/jev-eval/review.mjs +0 -78
  236. package/core/dev/jev-eval/schema.mjs +0 -87
  237. package/core/dev/jev-eval/test/context.test.mjs +0 -95
  238. package/core/dev/jev-eval/test/corpus.test.mjs +0 -102
  239. package/core/dev/jev-eval/test/eval.test.mjs +0 -146
  240. package/core/dev/jev-eval/test/muninn-baseline.test.mjs +0 -71
  241. package/core/dev/jev-eval/test/resilience.test.mjs +0 -72
  242. package/core/dev/jev-eval/test/review.test.mjs +0 -61
  243. package/core/dev/pipeline/PHASE3_PLANNING_SUMMARY.md +0 -338
  244. package/core/dev/pipeline/PROGRESS.md +0 -113
  245. package/core/dev/pipeline/PROGRESS_template.md +0 -860
  246. package/core/dev/pipeline/QA_REPORT_F008.md +0 -431
  247. package/core/dev/pipeline/QA_REPORT_LOCAL_CLAUDE_DIAGNOSIS.md +0 -583
  248. package/core/dev/pipeline/README.md +0 -210
  249. package/core/dev/pipeline/WORKFLOW_GUIDE.md +0 -824
  250. package/core/dev/pipeline/archived/TASK_015_tauri_init.yaml +0 -53
  251. package/core/dev/pipeline/archived/TASK_016_tauri_commands.yaml +0 -54
  252. package/core/dev/pipeline/archived/TASK_017_rust_pty.yaml +0 -54
  253. package/core/dev/pipeline/archived/TASK_018_tauri_bundle.yaml +0 -53
  254. package/core/dev/pipeline/archived/TASK_019_release_workflow.yaml +0 -56
  255. package/core/dev/pipeline/archived/TASK_020_update_ui.yaml +0 -54
  256. package/core/dev/pipeline/archived/TASK_021_update_notification_ui.yaml +0 -55
  257. package/core/dev/pipeline/archived/TASK_022_remove_node_pty.yaml +0 -65
  258. package/core/dev/pipeline/archived/TASK_023_api_routes_migration.yaml +0 -86
  259. package/core/dev/pipeline/archived/TASK_024_feature_id_system.yaml +0 -51
  260. package/core/dev/pipeline/archived/TASK_025_executable_acceptance.yaml +0 -66
  261. package/core/dev/pipeline/archived/TASK_026_spec_versioning.yaml +0 -56
  262. package/core/dev/pipeline/archived/TASK_027_drift_detection.yaml +0 -60
  263. package/core/dev/pipeline/archived/TASK_028_tauri_pty_manager.yaml +0 -60
  264. package/core/dev/pipeline/archived/TASK_029_tauri_pty_commands.yaml +0 -62
  265. package/core/dev/pipeline/archived/TASK_030_frontend_session_adapter.yaml +0 -54
  266. package/core/dev/pipeline/archived/TASK_031_terminal_tauri_events.yaml +0 -56
  267. package/core/dev/pipeline/archived/TASK_041_scheduler_data_models.yaml +0 -54
  268. package/core/dev/pipeline/archived/TASK_042_path_lock_manager.yaml +0 -53
  269. package/core/dev/pipeline/archived/TASK_043_process_manager.yaml +0 -57
  270. package/core/dev/pipeline/archived/TASK_044_git_integration.yaml +0 -85
  271. package/core/dev/pipeline/archived/TASK_045_task_queue_manager.yaml +0 -54
  272. package/core/dev/pipeline/archived/TASK_046_scheduler_dispatcher.yaml +0 -60
  273. package/core/dev/pipeline/archived/TASK_047_tauri_scheduler_commands.yaml +0 -55
  274. package/core/dev/pipeline/archived/TASK_048_realtime_status_push.yaml +0 -92
  275. package/core/dev/pipeline/archived/TASK_049_frontend_scheduler_integration.yaml +0 -58
  276. package/core/dev/pipeline/archived/TASK_050_error_recovery.yaml +0 -56
  277. package/core/dev/pipeline/archived/TASK_051_optimization_proposals_backend.yaml +0 -53
  278. package/core/dev/pipeline/archived/TASK_052_optimization_proposals_ui.yaml +0 -58
  279. package/core/dev/pipeline/archived/TASK_053_optimization_proposals_diff_view.yaml +0 -54
  280. package/core/dev/pipeline/archived/TASK_054_multi_project_scheduler_state.yaml +0 -76
  281. package/core/dev/pipeline/archived/TASK_055_scheduler_api_project_scope.yaml +0 -64
  282. package/core/dev/pipeline/archived/TASK_056_frontend_scheduler_project_scope.yaml +0 -62
  283. package/core/dev/pipeline/archived/TASK_057_scheduler_module_structure.yaml +0 -54
  284. package/core/dev/pipeline/archived/TASK_058_scheduler_models_extract.yaml +0 -51
  285. package/core/dev/pipeline/archived/TASK_059_scheduler_core_extract.yaml +0 -51
  286. package/core/dev/pipeline/archived/TASK_060_scheduler_commands_extract.yaml +0 -51
  287. package/core/dev/pipeline/archived/TASK_061_scheduler_specialized_commands.yaml +0 -53
  288. package/core/dev/pipeline/archived/TASK_062_process_manager_module_structure.yaml +0 -56
  289. package/core/dev/pipeline/archived/TASK_063_process_manager_core_extract.yaml +0 -56
  290. package/core/dev/pipeline/archived/TASK_064_recovery_module_structure.yaml +0 -57
  291. package/core/dev/pipeline/archived/TASK_065_recovery_core_extract.yaml +0 -56
  292. package/core/dev/pipeline/archived/TASK_066_self_enhancement_scheduler_models.yaml +0 -60
  293. package/core/dev/pipeline/archived/TASK_067_agents_section_quick_actions.yaml +0 -53
  294. package/core/dev/pipeline/archived/TASK_067_self_enhancement_scheduler_core.yaml +0 -65
  295. package/core/dev/pipeline/archived/TASK_068_agent_workflow_rule_enhancement.yaml +0 -46
  296. package/core/dev/pipeline/archived/TASK_068_self_enhancement_tauri_commands.yaml +0 -61
  297. package/core/dev/pipeline/archived/TASK_069_agent_wizard_responsive.yaml +0 -46
  298. package/core/dev/pipeline/archived/TASK_069_self_enhancement_ui.yaml +0 -62
  299. package/core/dev/pipeline/archived/TASK_070_preview_panel_redesign.yaml +0 -62
  300. package/core/dev/pipeline/archived/TASK_070_self_enhancement_integration.yaml +0 -57
  301. package/core/dev/pipeline/archived/TASK_071_preview_panel_qa.yaml +0 -98
  302. package/core/dev/pipeline/archived/TASK_071_single_agent_config.yaml +0 -57
  303. package/core/dev/pipeline/archived/TASK_072_preview_modal_esc_fix.yaml +0 -71
  304. package/core/dev/pipeline/archived/TASK_072_product_review_module.yaml +0 -57
  305. package/core/dev/pipeline/archived/TASK_073_agents_page_component_refactor.yaml +0 -68
  306. package/core/dev/pipeline/archived/TASK_073_rename_single_agent.yaml +0 -64
  307. package/core/dev/pipeline/archived/TASK_074_preview_mode_ui_diagnosis.yaml +0 -71
  308. package/core/dev/pipeline/archived/TASK_074_single_agent_ui_toggle.yaml +0 -56
  309. package/core/dev/pipeline/archived/TASK_075_agents_page_component_refactor.yaml +0 -69
  310. package/core/dev/pipeline/archived/TASK_075_single_agent_integration_test.yaml +0 -75
  311. package/core/dev/pipeline/archived/TASK_076_preview_mode_ui_diagnosis.yaml +0 -70
  312. package/core/dev/pipeline/archived/TASK_076_single_agent_continuous_mode.yaml +0 -65
  313. package/core/dev/pipeline/archived/TASK_077_failure_directory_structure.yaml +0 -51
  314. package/core/dev/pipeline/archived/TASK_077_single_agent_typescript_types.yaml +0 -59
  315. package/core/dev/pipeline/archived/TASK_078_fail_001_agent_no_output.yaml +0 -53
  316. package/core/dev/pipeline/archived/TASK_078_single_agent_ui_simplify.yaml +0 -74
  317. package/core/dev/pipeline/archived/TASK_079_dashboard_rwd_responsive.yaml +0 -63
  318. package/core/dev/pipeline/archived/TASK_079_fail_002_json_bom.yaml +0 -56
  319. package/core/dev/pipeline/archived/TASK_080_fail_003_queue_pollution.yaml +0 -56
  320. package/core/dev/pipeline/archived/TASK_080_http_server_module.yaml +0 -55
  321. package/core/dev/pipeline/archived/TASK_081_failure_logging_tools.yaml +0 -57
  322. package/core/dev/pipeline/archived/TASK_081_http_api_routes.yaml +0 -62
  323. package/core/dev/pipeline/archived/TASK_082_frontend_api_adapter.yaml +0 -51
  324. package/core/dev/pipeline/archived/TASK_082_integrate_failure_to_workflow.yaml +0 -60
  325. package/core/dev/pipeline/archived/TASK_083_cleanup_nextjs_api.yaml +0 -48
  326. package/core/dev/pipeline/archived/TASK_083_task_queue_cleanup.yaml +0 -67
  327. package/core/dev/pipeline/archived/TASK_084_rust_dead_code_cleanup.yaml +0 -66
  328. package/core/dev/pipeline/archived/TASK_084_scheduler_sync_logic_fix.yaml +0 -68
  329. package/core/dev/pipeline/archived/TASK_085_http_api_web_mode_fixes.yaml +0 -46
  330. package/core/dev/pipeline/archived/TASK_085_memory_consolidation_0204_0205.yaml +0 -98
  331. package/core/dev/pipeline/archived/TASK_086_collapsible_preview_panel.yaml +0 -161
  332. package/core/dev/pipeline/archived/TASK_086_web_mode_feature_parity.yaml +0 -62
  333. package/core/dev/pipeline/archived/TASK_087_manual_memory_archival.yaml +0 -163
  334. package/core/dev/pipeline/archived/TASK_087_mobile_http_control.yaml +0 -68
  335. package/core/dev/pipeline/archived/TASK_088_fail_003_to_ppl_002_rule.yaml +0 -63
  336. package/core/dev/pipeline/archived/TASK_088_mobile_http_qa.yaml +0 -121
  337. package/core/dev/pipeline/archived/TASK_089_agent_collaboration_topic.yaml +0 -60
  338. package/core/dev/pipeline/archived/TASK_089_web_mode_monitor_fix.yaml +0 -58
  339. package/core/dev/pipeline/archived/TASK_090_cli_detection_fix.yaml +0 -61
  340. package/core/dev/pipeline/archived/TASK_090_ui_ux_lessons_topic.yaml +0 -63
  341. package/core/dev/pipeline/archived/TASK_091_expandable_card_design.yaml +0 -56
  342. package/core/dev/pipeline/archived/TASK_091_move_agent_section_components.yaml +0 -65
  343. package/core/dev/pipeline/archived/TASK_092_expandable_card_component.yaml +0 -60
  344. package/core/dev/pipeline/archived/TASK_092_refactor_agent_create_wizard.yaml +0 -84
  345. package/core/dev/pipeline/archived/TASK_093_taskcard_detail_integration.yaml +0 -57
  346. package/core/dev/pipeline/archived/TASK_093_update_barrel_exports_test.yaml +0 -84
  347. package/core/dev/pipeline/archived/TASK_094_ai_agent_generation_enhancement.yaml +0 -115
  348. package/core/dev/pipeline/archived/TASK_094_proposalcard_detail_integration.yaml +0 -55
  349. package/core/dev/pipeline/archived/TASK_095_preview_fixes.yaml +0 -129
  350. package/core/dev/pipeline/archived/TASK_095_single_agent_task_selector.yaml +0 -60
  351. package/core/dev/pipeline/archived/TASK_096_agents_page_ux_improvements.yaml +0 -163
  352. package/core/dev/pipeline/archived/TASK_096_single_agent_status_sync.yaml +0 -60
  353. package/core/dev/pipeline/archived/TASK_097_local_claude_error_logging.yaml +0 -59
  354. package/core/dev/pipeline/archived/TASK_097_single_agent_monitor_events.yaml +0 -59
  355. package/core/dev/pipeline/archived/TASK_098_product_manager_team_phase2.yaml +0 -60
  356. package/core/dev/pipeline/archived/TASK_098_single_agent_refactor_test.yaml +0 -58
  357. package/core/dev/pipeline/archived/TASK_099_backend_team_creation.yaml +0 -258
  358. package/core/dev/pipeline/archived/TASK_100_frontend_team_creation.yaml +0 -61
  359. package/core/dev/pipeline/archived/TASK_101_orchestrator_system.yaml +0 -403
  360. package/core/dev/pipeline/archived/TASK_102_designer_sre_teams.yaml +0 -90
  361. package/core/dev/pipeline/archived/TASK_103_integration_testing.yaml +0 -86
  362. package/core/dev/pipeline/archived/TASK_128_integration_testing.yaml +0 -83
  363. package/core/dev/pipeline/archived/TASK_134_cortex_v2_phase3_file_watcher.yaml +0 -65
  364. package/core/dev/pipeline/archived/TASK_134_team_http_api.yaml +0 -96
  365. package/core/dev/pipeline/archived/TASK_135_cortex_v2_phase3_git_monitor.yaml +0 -63
  366. package/core/dev/pipeline/archived/TASK_136_cortex_v2_phase3_change_analyzer.yaml +0 -69
  367. package/core/dev/pipeline/archived/TASK_137_cortex_v2_phase3_cache_invalidator.yaml +0 -67
  368. package/core/dev/pipeline/archived/TASK_137_team_orchestrator_integration.yaml +0 -93
  369. package/core/dev/pipeline/archived/TASK_138_cortex_v2_phase3_distributed_cache.yaml +0 -68
  370. package/core/dev/pipeline/archived/TASK_138_matrix_folder_structure.yaml +0 -61
  371. package/core/dev/pipeline/archived/TASK_139_cortex_v2_phase3_cache_prewarming.yaml +0 -65
  372. package/core/dev/pipeline/archived/TASK_146_unified_documentation.yaml +0 -141
  373. package/core/dev/pipeline/archived/TASK_147_pipeline_execution_rules.yaml +0 -76
  374. package/core/dev/pipeline/archived/TASK_148_update_claude_md.yaml +0 -77
  375. package/core/dev/pipeline/archived/TASK_149_fix_nextjs_mdx_serialization.yaml +0 -63
  376. package/core/dev/pipeline/archived/TASK_149_update_team_docs.yaml +0 -77
  377. package/core/dev/pipeline/archived/TASK_150_pipeline_workflow_guide.yaml +0 -82
  378. package/core/dev/pipeline/archived/TASK_164_fix_smart_context_switch.yaml +0 -49
  379. package/core/dev/pipeline/archived/TASK_165_ctags_symbol_index.yaml +0 -53
  380. package/core/dev/pipeline/archived/TASK_166_symbol_search_mcp_tool.yaml +0 -48
  381. package/core/dev/pipeline/archived/TASK_167_llm_module_summary.yaml +0 -55
  382. package/core/dev/pipeline/archived/TASK_168_map_reduce_context.yaml +0 -51
  383. package/core/dev/pipeline/archived/TASK_169_v2_integration_testing.yaml +0 -52
  384. package/core/dev/pipeline/backups/archive_2026-02-04T22-07-22/TASK_QUEUE_backup.json +0 -95
  385. package/core/dev/pipeline/docs/multi-agent-coordination.md +0 -446
  386. package/core/dev/pipeline/docs/overview.md +0 -406
  387. package/core/dev/pipeline/docs/task-management.md +0 -412
  388. package/core/dev/pipeline/docs/workflows.md +0 -32
  389. package/core/dev/pipeline/orchestrator/schemas/task_queue_schema.json +0 -58
  390. package/core/dev/pipeline/orchestrator/schemas/task_schema.json +0 -139
  391. package/core/dev/pipeline/plans/PLAN_task_cli_refactor.md +0 -281
  392. package/core/dev/pipeline/test_results/TASK_TEST_PARALLEL_002_result.txt +0 -27
  393. package/core/dev/plans/ANSUZ_SLIM_PLAN.md +0 -68
  394. package/core/dev/plans/CLI_FIRST_INSTALL_FLOW.md +0 -120
  395. package/core/dev/plans/FORMATION_RETIREMENT_PLAN.md +0 -313
  396. package/core/dev/plans/KUZU_REPLACEMENT_PLAN.md +0 -126
  397. package/core/dev/scripts/CRASH_DIAGNOSIS.md +0 -47
  398. package/core/dev/scripts/README.md +0 -142
  399. package/core/dev/scripts/RUN_ONCE.bat +0 -40
  400. package/core/dev/scripts/START_DEV_AGENT.bat +0 -63
  401. package/core/dev/scripts/START_MULTI_AGENT.bat +0 -80
  402. package/core/dev/scripts/dev_agent_scheduler.ps1 +0 -536
  403. package/core/dev/scripts/init_git.ps1 +0 -396
  404. package/core/dev/scripts/init_git.sh +0 -337
  405. package/core/dev/scripts/init_project.ps1 +0 -851
  406. package/core/dev/scripts/init_project.sh +0 -477
  407. package/core/dev/scripts/multi_agent_scheduler.ps1 +0 -2021
  408. package/core/dev/scripts/multi_agent_scheduler.sh +0 -1344
  409. package/core/dev/scripts/run_once.sh +0 -47
  410. package/core/dev/scripts/setup_rag.ps1 +0 -304
  411. package/core/dev/scripts/setup_rag.sh +0 -230
  412. package/core/dev/scripts/start_dev_agent.sh +0 -137
  413. package/core/dev/scripts/start_multi_agent.sh +0 -41
  414. package/core/dev/scripts/sync_task_queue.ps1 +0 -505
  415. package/core/dev/scripts/sync_task_queue.sh +0 -392
  416. package/core/dev/specs/agent-connect/PROTOCOL.md +0 -177
  417. package/core/dev/specs/agent-connect/SDK_GUIDE.md +0 -915
  418. package/core/dev/specs/agent-connect/examples/minimal-site/README.md +0 -137
  419. package/core/dev/specs/agent-connect/examples/minimal-site/package.json +0 -12
  420. package/core/dev/specs/agent-connect/examples/minimal-site/public/index.html +0 -116
  421. package/core/dev/specs/agent-connect/examples/minimal-site/public/install-redirect.js +0 -73
  422. package/core/dev/specs/agent-connect/examples/minimal-site/server.js +0 -516
  423. package/core/dev/specs/agent-connect/examples/minimal-site/test/smoke.test.mjs +0 -263
  424. package/core/dev/specs/agent-connect/history/DEFECT_REPORT_kenaz-agent-hub_2026-09-09_v0.4-empty-prompt-no-first-turn.md +0 -77
  425. package/core/dev/specs/agent-connect/history/DEFECT_REPORT_kenaz-agent-hub_2026-09-09_v0.4-prompt-mojibake.md +0 -90
  426. package/core/dev/specs/agent-connect/history/FEATURE_REQUEST_kenaz-agent-hub_2026-09-07.md +0 -61
  427. package/core/dev/specs/agent-connect/history/FEATURE_REQUEST_kenaz-agent-hub_2026-09-08_relay-v1-conformance.md +0 -76
  428. package/core/dev/specs/agent-connect/history/FEATURE_REQUEST_kenaz-agent-hub_2026-09-09_v0.4-session-channel.md +0 -87
  429. package/core/dev/specs/agent-connect/history/FLOWPIX_REPLY_agent-hub_2026-09-08_relay-v1-answers.md +0 -68
  430. package/core/dev/specs/agent-connect/history/FLOWPIX_bridge_CONTRACT.md +0 -642
  431. package/core/dev/specs/agent-connect/history/FLOWPIX_spikes_relay_spike_relay.mjs +0 -244
  432. package/core/dev/specs/agent-connect/history/KENAZ_RESPONSE_agent-hub_2026-09-07.md +0 -77
  433. package/core/dev/specs/agent-connect/history/KENAZ_RESPONSE_agent-hub_2026-09-08_direction-change-v0.3.md +0 -44
  434. package/core/dev/specs/agent-connect/history/KENAZ_RESPONSE_agent-hub_2026-09-08_relay-v1-answers-ack.md +0 -37
  435. package/core/dev/specs/agent-connect/history/KENAZ_RESPONSE_agent-hub_2026-09-08_relay-v1-conformance.md +0 -56
  436. package/core/dev/specs/agent-connect/history/KENAZ_RESPONSE_agent-hub_2026-09-09_annotations-install-coldstart.md +0 -44
  437. package/core/dev/specs/agent-connect/history/KENAZ_RESPONSE_agent-hub_2026-09-09_empty-prompt-first-turn.md +0 -56
  438. package/core/dev/specs/agent-connect/history/KENAZ_RESPONSE_agent-hub_2026-09-09_prompt-mojibake-fixed.md +0 -48
  439. package/core/dev/specs/agent-connect/history/KENAZ_RESPONSE_agent-hub_2026-09-09_session-channel.md +0 -57
  440. package/core/dev/specs/agent-connect/history/PROTOCOL_v0.3_snapshot.md +0 -379
  441. package/core/dev/specs/agent-connect/history/README.md +0 -47
  442. package/core/dev/specs/peer/CODEX_INTERACTIVE_PUSH.md +0 -65
  443. package/core/dev/specs/peer/CODEX_MANAGED_DAEMON.md +0 -54
  444. package/core/dev/specs/peer/CODEX_PEER_PULL_SPIKE.md +0 -54
  445. package/core/dev/specs/peer/MODS_SPIKE.md +0 -133
  446. package/core/dev/specs/peer/PER_PROJECT_ADDRESSING.md +0 -143
  447. package/core/dev/specs/peer/SWARM_PROTOCOLS.md +0 -256
  448. package/core/dev/specs/peer/codex-hook-shim-peer.test.js +0 -113
  449. package/core/dev/specs/peer/codex-push-launcher.test.js +0 -142
  450. package/core/dev/specs/peer/setup-codex-hooks.test.js +0 -60
  451. package/core/dev/specs/peer-ansuz/DELIVERY_SPIKE.md +0 -397
  452. package/core/dev/specs/peer-ansuz/DESIGN.md +0 -109
  453. package/core/dev/specs/peer-ansuz/spike/claude_poke.js +0 -129
  454. package/core/dev/specs/peer-ansuz/spike/claude_session_start_hook.js +0 -37
  455. package/core/dev/specs/peer-ansuz/spike/claude_settings_hook.json +0 -14
  456. package/core/dev/specs/peer-ansuz/spike/codex_appserver_client.js +0 -105
  457. package/core/dev/specs/peer-ansuz/spike/codex_appserver_query.js +0 -29
  458. package/core/dev/specs/peer-ansuz/spike/extract_timeline.js +0 -26
  459. package/core/dev/specs/synapse/SYMBOL_IDENTITY.md +0 -305
  460. package/core/dev/spikes/A4-cypher-varlen.md +0 -176
  461. package/core/dev/spikes/bloat-rounds.sh +0 -25
  462. package/core/dev/spikes/mods/clean-claude.js +0 -9
  463. package/core/dev/spikes/mods/drive-probe.js +0 -29
  464. package/core/dev/spikes/mods/e2e-peer.js +0 -71
  465. package/core/dev/spikes/mods/evidence/e2e-peer-control.json +0 -17
  466. package/core/dev/spikes/mods/evidence/e2e-peer-mod.json +0 -17
  467. package/core/dev/spikes/mods/evidence/probe-006a6e65-d807-4bc1-b648-fd7d1edfe0b4.jsonl +0 -4
  468. package/core/dev/spikes/mods/evidence/probe-cebdf1f7-f9c4-47a8-83cd-7c0786177404.jsonl +0 -12
  469. package/core/dev/spikes/mods/evidence/probe-eb21147d-10ce-4c32-93ed-37ca37d88d5a.jsonl +0 -11
  470. package/core/dev/spikes/mods/evidence/stream-cebdf1f7.jsonl +0 -18
  471. package/core/dev/spikes/mods/kenaz-mod-probe/.claude-plugin/plugin.json +0 -1
  472. package/core/dev/spikes/mods/kenaz-mod-probe/hooks/hooks.json +0 -1
  473. package/core/dev/spikes/mods/kenaz-mod-probe/hooks/register.ts +0 -65
  474. package/core/dev/spikes/mods/kenaz-mod-probe/tsconfig.json +0 -3
@@ -1,250 +0,0 @@
1
- brief_version: "1.0"
2
- task_id: TASK_1229
3
- title: "Implement Bifrost PreToolUse and PostToolUse hook dispatch"
4
- role: backend
5
- produced_by: TASK_1234
6
-
7
- # ─────────────────────────────────────────────────────────────────
8
- # CGDD RECONCILIATION (read this first)
9
- # ─────────────────────────────────────────────────────────────────
10
- cgdd_note: >
11
- CGDD_hook_lifecycle.js labels PreToolUse/PostToolUse contracts as 'TASK_1231',
12
- but the actual backlog assigns them to TASK_1229. FOLLOW THIS BRIEF.
13
- The phantom contract names are authoritative; the task number labels inside
14
- the CGDD are wrong. Relevant CGDD contracts for this task:
15
- relay_dispatchBifrostHook, relay_capturedThreadId, relay_normalizeToolEvent
16
-
17
- cgdd_source: ".formation/bifrost/CGDD_hook_lifecycle.js"
18
- lifecycle_contract_source: ".specialist/tools/task-bridge.js (BIFROST_HOOK_LIFECYCLE.PreToolUse + PostToolUse)"
19
-
20
- # ─────────────────────────────────────────────────────────────────
21
- # OBJECTIVE
22
- # ─────────────────────────────────────────────────────────────────
23
- objective: >
24
- Add PreToolUse and PostToolUse hook dispatch to relay.js (openai adapter).
25
- This is entirely self-contained in relay.js — no changes to session.js or
26
- task-bridge.js. Four tool types get two call sites each (8 total call sites):
27
- command_execution, file_edit, file_read, mcp_tool_call.
28
-
29
- # ─────────────────────────────────────────────────────────────────
30
- # OWNED FILES — only touch this
31
- # ─────────────────────────────────────────────────────────────────
32
- owned_files:
33
- primary: ".formation/bifrost/openai/relay.js"
34
- read_for_contract: ".specialist/tools/task-bridge.js"
35
- read_for_cgdd: ".formation/bifrost/CGDD_hook_lifecycle.js"
36
-
37
- # ─────────────────────────────────────────────────────────────────
38
- # NON-GOALS
39
- # ─────────────────────────────────────────────────────────────────
40
- non_goals:
41
- - Do NOT modify session.js (TASK_1228 owns dispatchBifrostHook there; TASK_1230 owns session lifecycle)
42
- - Do NOT modify task-bridge.js (PostToolUse routing already exists in handleHookEvent)
43
- - Do NOT implement SessionStart, UserPromptSubmit, or Stop (session.js events)
44
- - Do NOT change relay's stdin/stdout/stderr setup (TASK_1230 changes session.js stdio only)
45
- - Do NOT reconstruct tool events from transcript/logs — hooks must fire at real execution boundaries in translateEvent()
46
- - specialist field must be null — relay.js does not receive --specialist arg, do not invent it
47
-
48
- # ─────────────────────────────────────────────────────────────────
49
- # WHAT TO CREATE IN relay.js
50
- # ─────────────────────────────────────────────────────────────────
51
- module_additions:
52
- - name: capturedThreadId
53
- type: module_variable
54
- placement: "add after RESUME_ID constant declaration (around line 38)"
55
- declaration: "let capturedThreadId = null;"
56
- set_in: "translateEvent() thread.started case — add: capturedThreadId = event.thread_id || null;"
57
- used_in: "normalizeToolEvent() session_id field"
58
-
59
- - name: dispatchBifrostHook
60
- type: function
61
- signature: "function dispatchBifrostHook(eventName, payload)"
62
- placement: "add after the emit/emitToolResult utility functions (around line 63)"
63
- require_path: "path.resolve(__dirname, '../../..', '.specialist/tools/task-bridge.js')"
64
- body_skeleton: |
65
- function dispatchBifrostHook(eventName, payload) {
66
- try {
67
- const taskBridge = require(path.resolve(__dirname, '../../..', '.specialist/tools/task-bridge.js'));
68
- taskBridge.handleHookEvent(payload);
69
- } catch (err) {
70
- process.stderr.write(`[relay] hook dispatch failed (${eventName}): ${err.message}\n`);
71
- }
72
- }
73
- error_policy: "catch + process.stderr.write — must never interrupt emit() sequence"
74
- note: "This is a DIFFERENT function from session.js::dispatchBifrostHook — same pattern, different require path and different file"
75
-
76
- - name: normalizeToolEvent
77
- type: function
78
- signature: "function normalizeToolEvent(eventName, toolName, toolId, toolInput, toolResponse)"
79
- placement: "add after dispatchBifrostHook()"
80
- returns_pretooluse: |
81
- {
82
- hook_event_name: 'PreToolUse',
83
- tool_name: toolName,
84
- tool_id: toolId,
85
- tool_input: toolInput,
86
- session_id: capturedThreadId,
87
- specialist: null, // relay does not receive --specialist
88
- cwd: CWD,
89
- project_path: path.resolve(CWD),
90
- timestamp: new Date().toISOString(),
91
- }
92
- returns_posttooluse: |
93
- {
94
- hook_event_name: 'PostToolUse',
95
- tool_name: toolName,
96
- tool_id: toolId,
97
- tool_input: toolInput,
98
- tool_response: toolResponse,
99
- is_error: Boolean(toolResponse && (toolResponse.is_error || toolResponse.exit_code !== undefined && toolResponse.exit_code !== 0)),
100
- session_id: capturedThreadId,
101
- specialist: null,
102
- cwd: CWD,
103
- project_path: path.resolve(CWD),
104
- timestamp: new Date().toISOString(),
105
- }
106
-
107
- # ─────────────────────────────────────────────────────────────────
108
- # CALL SITES (8 total — 4 tool types × 2 events each)
109
- # ─────────────────────────────────────────────────────────────────
110
- call_sites:
111
- tool_name_mapping:
112
- command_execution: "Bash"
113
- file_edit: "Edit"
114
- file_read: "Read"
115
- mcp_tool_call: "mcp__<server>__<tool> (or use event.item.tool directly)"
116
-
117
- command_execution:
118
- pretooluse:
119
- location: "translateEvent() item.completed → command_execution branch, AFTER cmdId assignment, BEFORE emit(tool_use)"
120
- current_line_approx: 114
121
- payload_args: "'PreToolUse', 'Bash', cmdId, { command: event.item.command || '' }, null"
122
- call: "dispatchBifrostHook('PreToolUse', normalizeToolEvent('PreToolUse', 'Bash', cmdId, { command: event.item.command || '' }, null));"
123
- posttooluse:
124
- location: "AFTER emitToolResult(cmdId, ...) call"
125
- tool_response: "{ output: cmdOutput, exit_code: event.item.exit_code }"
126
- call: "dispatchBifrostHook('PostToolUse', normalizeToolEvent('PostToolUse', 'Bash', cmdId, { command: event.item.command || '' }, { output: cmdOutput, exit_code: event.item.exit_code }));"
127
-
128
- file_edit:
129
- pretooluse:
130
- location: "AFTER editId assignment, BEFORE emit(tool_use)"
131
- current_line_approx: 135
132
- call: "dispatchBifrostHook('PreToolUse', normalizeToolEvent('PreToolUse', 'Edit', editId, { file_path: event.item.file_path || '', description: event.item.description || '' }, null));"
133
- posttooluse:
134
- location: "AFTER emitToolResult(editId, ...) call"
135
- tool_response: "{ result: editResult, error: event.item.error || null }"
136
- call: "dispatchBifrostHook('PostToolUse', normalizeToolEvent('PostToolUse', 'Edit', editId, { file_path: event.item.file_path || '' }, { result: editResult, error: event.item.error || null }));"
137
-
138
- file_read:
139
- pretooluse:
140
- location: "AFTER readId assignment, BEFORE emit(tool_use)"
141
- current_line_approx: 158
142
- call: "dispatchBifrostHook('PreToolUse', normalizeToolEvent('PreToolUse', 'Read', readId, { file_path: event.item.file_path || '' }, null));"
143
- posttooluse:
144
- location: "AFTER emitToolResult(readId, ...) call"
145
- tool_response: "{ content: readContent, error: event.item.error || null }"
146
- call: "dispatchBifrostHook('PostToolUse', normalizeToolEvent('PostToolUse', 'Read', readId, { file_path: event.item.file_path || '' }, { content: readContent, error: event.item.error || null }));"
147
-
148
- mcp_tool_call:
149
- pretooluse:
150
- location: "AFTER mcpId/mcpName assignment, BEFORE emit(tool_use)"
151
- current_line_approx: 178
152
- call: "dispatchBifrostHook('PreToolUse', normalizeToolEvent('PreToolUse', mcpName, mcpId, event.item.arguments || {}, null));"
153
- posttooluse:
154
- location: "AFTER emitToolResult(mcpId, ...) call"
155
- tool_response: "{ result: mcpResult, error: event.item.error || null }"
156
- call: "dispatchBifrostHook('PostToolUse', normalizeToolEvent('PostToolUse', mcpName, mcpId, event.item.arguments || {}, { result: mcpResult, error: event.item.error || null }));"
157
-
158
- thread_started:
159
- capture: "add inside the thread.started case, after the existing emit() call: capturedThreadId = event.thread_id || null;"
160
-
161
- # ─────────────────────────────────────────────────────────────────
162
- # INVARIANTS
163
- # ─────────────────────────────────────────────────────────────────
164
- invariants:
165
- - "PreToolUse fires BEFORE emit(tool_use) — ordering is critical for hook consumers"
166
- - "PostToolUse fires AFTER emitToolResult() — both must be for the same tool_id"
167
- - "dispatchBifrostHook() must never throw or interrupt the emit() sequence"
168
- - "specialist must always be null in relay.js payloads — relay does not receive --specialist"
169
- - "capturedThreadId must be set before first tool call fires (thread.started always precedes item.completed)"
170
- - "Both PreToolUse and PostToolUse must include hook_event_name as discriminator"
171
- - "tool_id must be the SAME value for paired Pre/PostToolUse events (use the same cmdId/editId/readId/mcpId)"
172
-
173
- # ─────────────────────────────────────────────────────────────────
174
- # FORBIDDEN SHORTCUTS
175
- # ─────────────────────────────────────────────────────────────────
176
- forbidden:
177
- - "Do NOT fire hooks from item.started events — only item.completed (item.started is skipped per existing logic)"
178
- - "Do NOT reconstruct tool payloads from transcript or logs — hooks must use in-scope variables only"
179
- - "Do NOT spawn a child process to call task-bridge — use require() + handleHookEvent() directly"
180
- - "Do NOT add specialist field with a guessed value — null is correct and accepted by task-bridge"
181
- - "Do NOT change relay's codex spawn args or stdout piping — those belong to TASK_1230's session.js changes"
182
-
183
- # ─────────────────────────────────────────────────────────────────
184
- # VERIFICATION COMMANDS (Phase 9 style)
185
- # ─────────────────────────────────────────────────────────────────
186
- verification:
187
- grep_checks:
188
- - desc: "capturedThreadId module variable declared"
189
- cmd: "grep -n 'capturedThreadId' .formation/bifrost/openai/relay.js"
190
- expected: "declaration (let capturedThreadId = null) + set in thread.started + used in normalizeToolEvent"
191
-
192
- - desc: "dispatchBifrostHook function exists in relay.js"
193
- cmd: "grep -n 'function dispatchBifrostHook' .formation/bifrost/openai/relay.js"
194
- expected: "one match"
195
-
196
- - desc: "normalizeToolEvent function exists"
197
- cmd: "grep -n 'function normalizeToolEvent' .formation/bifrost/openai/relay.js"
198
- expected: "one match"
199
-
200
- - desc: "PreToolUse fires 4 times (once per tool type)"
201
- cmd: "grep -c 'PreToolUse' .formation/bifrost/openai/relay.js"
202
- expected: "at least 5 (1 in normalizeToolEvent return + 4 call sites)"
203
-
204
- - desc: "PostToolUse fires 4 times (once per tool type)"
205
- cmd: "grep -c 'PostToolUse' .formation/bifrost/openai/relay.js"
206
- expected: "at least 5"
207
-
208
- - desc: "require path for task-bridge is correct from relay.js depth"
209
- cmd: "grep -n 'task-bridge' .formation/bifrost/openai/relay.js"
210
- expected: "path.resolve(__dirname, '../../..', '.specialist/tools/task-bridge.js')"
211
-
212
- - desc: "specialist is null in relay payloads"
213
- cmd: "grep -n 'specialist.*null' .formation/bifrost/openai/relay.js"
214
- expected: "at least one match in normalizeToolEvent"
215
-
216
- ordering_check:
217
- - desc: "PreToolUse before emit in command_execution block"
218
- cmd: "grep -n 'PreToolUse\\|emit.*tool_use\\|cmdId' .formation/bifrost/openai/relay.js"
219
- expected: "dispatchBifrostHook PreToolUse line appears BEFORE emit(tool_use) line in command_execution block"
220
-
221
- integration_check:
222
- desc: "Dry-run PostToolUse through task-bridge"
223
- cmd: |
224
- node -e "
225
- const path = require('path');
226
- const tb = require('./.specialist/tools/task-bridge');
227
- const payload = {
228
- hook_event_name: 'PostToolUse',
229
- tool_name: 'Bash',
230
- tool_id: 'test_cmd_1',
231
- tool_input: { command: 'echo test' },
232
- tool_response: { output: 'test', exit_code: 0 },
233
- is_error: false,
234
- session_id: 'thread_test',
235
- specialist: null,
236
- cwd: process.cwd(),
237
- project_path: process.cwd(),
238
- timestamp: new Date().toISOString()
239
- };
240
- tb.handleHookEvent(payload).then(r => console.log('OK (no TaskCreate/Update in payload):', r)).catch(e => console.error('FAIL:', e.message));
241
- "
242
- expected: "OK: null (task-bridge no-ops for Bash, only acts on TaskCreate/TaskUpdate tool_name)"
243
-
244
- # ─────────────────────────────────────────────────────────────────
245
- # ORDERING
246
- # ─────────────────────────────────────────────────────────────────
247
- ordering:
248
- no_prerequisite: "This task is independent — dispatchBifrostHook lives in relay.js, not session.js, so TASK_1228 completion is not required before starting"
249
- can_run_in_parallel_with: "TASK_1228 (session.js only), TASK_1230 (session.js only)"
250
- must_complete_before: "TASK_1231 (verification gate)"
@@ -1,301 +0,0 @@
1
- brief_version: "1.0"
2
- task_id: TASK_1230
3
- title: "Implement Bifrost SessionStart and Stop parity for specialist session lifecycle"
4
- role: backend
5
- produced_by: TASK_1234
6
-
7
- # ─────────────────────────────────────────────────────────────────
8
- # CGDD RECONCILIATION (read this first)
9
- # ─────────────────────────────────────────────────────────────────
10
- cgdd_note: >
11
- CGDD_hook_lifecycle.js splits SessionStart (CGDD TASK_1228) and Stop (CGDD TASK_1230)
12
- into separate tasks. The actual backlog combines them into TASK_1230.
13
- FOLLOW THIS BRIEF. Relevant CGDD phantom contracts for this task:
14
- session_normalizeSessionStart, session_resultCapture, session_normalizeStop.
15
- The dispatchBifrostHook() function is NOT created here — TASK_1228 creates it.
16
- This task adds it to the two new call sites only.
17
-
18
- cgdd_source: ".formation/bifrost/CGDD_hook_lifecycle.js"
19
- lifecycle_contract_source: ".specialist/tools/task-bridge.js (BIFROST_HOOK_LIFECYCLE.SessionStart + Stop)"
20
-
21
- # ─────────────────────────────────────────────────────────────────
22
- # OBJECTIVE
23
- # ─────────────────────────────────────────────────────────────────
24
- objective: >
25
- Add SessionStart and Stop hook dispatch to session.js. SessionStart fires after
26
- writeSignal() and before launchRelay(). Stop fires in relay.on('close') before
27
- the existing reflex feedback block. Stop requires intercepting relay stdout to
28
- capture cost/token metrics from the result event — this is the only non-trivial
29
- wiring change in this task.
30
-
31
- prerequisite: "TASK_1228 must complete first — it creates dispatchBifrostHook() in session.js"
32
-
33
- # ─────────────────────────────────────────────────────────────────
34
- # OWNED FILES — only touch these
35
- # ─────────────────────────────────────────────────────────────────
36
- owned_files:
37
- primary: ".formation/bifrost/session.js"
38
- read_for_contract: ".specialist/tools/task-bridge.js"
39
- read_for_cgdd: ".formation/bifrost/CGDD_hook_lifecycle.js"
40
-
41
- # ─────────────────────────────────────────────────────────────────
42
- # NON-GOALS
43
- # ─────────────────────────────────────────────────────────────────
44
- non_goals:
45
- - Do NOT create dispatchBifrostHook() — TASK_1228 already created it
46
- - Do NOT modify relay.js (TASK_1229 owns that file)
47
- - Do NOT modify task-bridge.js (handleHookEvent fall-through for SessionStart/Stop is already safe)
48
- - Do NOT redefine payload schema (frozen in BIFROST_HOOK_LIFECYCLE)
49
- - Do NOT change the logic inside the reflex feedback try/catch block (lines ~124-173) — Stop fires BEFORE it, not inside it
50
-
51
- # ─────────────────────────────────────────────────────────────────
52
- # WHAT TO ADD IN session.js
53
- # ─────────────────────────────────────────────────────────────────
54
- module_additions:
55
- - name: sessionStartedAt
56
- type: module_variable
57
- placement: "add near top after SIGNAL_PATH constant"
58
- declaration: "let sessionStartedAt = null;"
59
- set_in: "normalizeSessionStart() — set sessionStartedAt = new Date().toISOString() before returning payload"
60
- used_in: "normalizeStop() started_at field"
61
-
62
- - name: resultCapture
63
- type: module_variable
64
- placement: "add after sessionStartedAt"
65
- declaration: "const resultCapture = { total_cost_usd: 0, num_turns: 0, input_tokens: 0, output_tokens: 0 };"
66
- set_in: "relay stdout 'data' event handler added by this task"
67
- used_in: "normalizeStop() cost + token fields"
68
- critical: "resultCapture starts as zero — Stop payload will have zeroes if stdout capture fails (acceptable degradation)"
69
-
70
- functions_to_create:
71
- - name: normalizeSessionStart
72
- signature: "function normalizeSessionStart()"
73
- placement: "add after dispatchBifrostHook() (created by TASK_1228)"
74
- body: |
75
- function normalizeSessionStart() {
76
- sessionStartedAt = new Date().toISOString();
77
- return {
78
- hook_event_name: 'SessionStart',
79
- specialist: SPECIALIST,
80
- adapter: ADAPTER,
81
- model: MODEL,
82
- cwd: CWD,
83
- pid: process.pid,
84
- session_id: RESUME_ID,
85
- started_at: sessionStartedAt,
86
- project_path: path.resolve(CWD),
87
- };
88
- }
89
- side_effect: "sets module-level sessionStartedAt — this is intentional"
90
-
91
- - name: normalizeStop
92
- signature: "function normalizeStop(code, startedAt)"
93
- placement: "add after normalizeSessionStart()"
94
- body: |
95
- function normalizeStop(code, startedAt) {
96
- return {
97
- hook_event_name: 'Stop',
98
- specialist: SPECIALIST,
99
- adapter: ADAPTER,
100
- exit_code: code || 0,
101
- is_error: (code || 0) !== 0,
102
- session_id: RESUME_ID,
103
- total_cost_usd: resultCapture.total_cost_usd,
104
- num_turns: resultCapture.num_turns,
105
- input_tokens: resultCapture.input_tokens,
106
- output_tokens: resultCapture.output_tokens,
107
- started_at: startedAt,
108
- ended_at: new Date().toISOString(),
109
- cwd: CWD,
110
- project_path: path.resolve(CWD),
111
- };
112
- }
113
-
114
- # ─────────────────────────────────────────────────────────────────
115
- # CALL SITES
116
- # ─────────────────────────────────────────────────────────────────
117
- call_sites:
118
- sessionstart:
119
- location: "main execution block (bottom of file)"
120
- current_code: |
121
- if (RESUME_ID) {
122
- writeSignal();
123
- ...
124
- launchRelay(userMsg);
125
- } else {
126
- ...
127
- writeSignal();
128
- launchRelay(prompt);
129
- }
130
- target_code: |
131
- if (RESUME_ID) {
132
- writeSignal();
133
- dispatchBifrostHook('SessionStart', normalizeSessionStart());
134
- ...
135
- launchRelay(userMsg);
136
- } else {
137
- ...
138
- writeSignal();
139
- dispatchBifrostHook('SessionStart', normalizeSessionStart());
140
- launchRelay(prompt);
141
- }
142
- ordering_invariant: "SessionStart AFTER writeSignal(), BEFORE launchRelay()"
143
- ordering_with_userpromptsubmit: "If TASK_1228 already added UserPromptSubmit dispatch, SessionStart must come BEFORE it: writeSignal() → SessionStart → UserPromptSubmit → launchRelay()"
144
-
145
- stop:
146
- location: "relay.on('close') handler in launchRelay() function (current lines ~119-176)"
147
- current_code: |
148
- relay.on('close', (code) => {
149
- cleanupSignal();
150
- try {
151
- // ... reflex feedback block (lines ~124-173)
152
- } catch (err) {
153
- console.error(`[bifrost] Reflex feedback skipped: ${err.message}`);
154
- }
155
- process.exit(code || 0);
156
- });
157
- target_code: |
158
- relay.on('close', (code) => {
159
- cleanupSignal();
160
- dispatchBifrostHook('Stop', normalizeStop(code, sessionStartedAt)); // ← ADD THIS LINE
161
- try {
162
- // ... reflex feedback block (unchanged)
163
- } catch (err) {
164
- console.error(`[bifrost] Reflex feedback skipped: ${err.message}`);
165
- }
166
- process.exit(code || 0);
167
- });
168
- ordering_invariant: "Stop fires BEFORE reflex feedback block and BEFORE process.exit"
169
-
170
- stdout_capture:
171
- description: "Change relay stdio and intercept result events to populate resultCapture"
172
- current_spawn: |
173
- const relay = spawn('node', [relayScript, ...relayArgs], {
174
- cwd: CWD,
175
- stdio: ['pipe', 'inherit', 'inherit'],
176
- windowsHide: true
177
- });
178
- target_spawn: |
179
- const relay = spawn('node', [relayScript, ...relayArgs], {
180
- cwd: CWD,
181
- stdio: ['pipe', 'pipe', 'inherit'], // ← change 'inherit' to 'pipe' for stdout
182
- windowsHide: true
183
- });
184
- add_after_spawn: |
185
- // Tee relay stdout: forward to process.stdout AND intercept result lines
186
- let stdoutBuffer = '';
187
- relay.stdout.on('data', (chunk) => {
188
- process.stdout.write(chunk); // forward as-is (preserve downstream consumers)
189
- stdoutBuffer += chunk.toString();
190
- const lines = stdoutBuffer.split('\n');
191
- stdoutBuffer = lines.pop();
192
- for (const line of lines) {
193
- if (!line.trim()) continue;
194
- try {
195
- const parsed = JSON.parse(line);
196
- if (parsed.type === 'result') {
197
- resultCapture.total_cost_usd = parsed.total_cost_usd || 0;
198
- resultCapture.num_turns = parsed.num_turns || 0;
199
- resultCapture.input_tokens = (parsed.usage && parsed.usage.input_tokens) || parsed.input_tokens || 0;
200
- resultCapture.output_tokens = (parsed.usage && parsed.usage.output_tokens) || parsed.output_tokens || 0;
201
- }
202
- } catch { /* non-JSON line — already forwarded */ }
203
- }
204
- });
205
- critical: >
206
- relay stdout is currently 'inherit' — changing it to 'pipe' is necessary
207
- to intercept the result event for cost/token capture. The manual tee
208
- (process.stdout.write(chunk)) preserves all existing downstream behavior.
209
- This is the only non-trivial change in this entire task.
210
-
211
- # ─────────────────────────────────────────────────────────────────
212
- # INVARIANTS
213
- # ─────────────────────────────────────────────────────────────────
214
- invariants:
215
- - "SessionStart fires exactly once per session.js invocation, on both RESUME_ID and fresh-session paths"
216
- - "Stop fires exactly once, in relay.on('close'), BEFORE the reflex feedback block"
217
- - "sessionStartedAt is captured inside normalizeSessionStart() — not at a different time"
218
- - "resultCapture gracefully degrades to all-zeros if no result event is intercepted"
219
- - "relay stdout must be forwarded to process.stdout unchanged — no content filtering"
220
- - "dispatchBifrostHook() must not throw — existing try/catch from TASK_1228 covers this"
221
-
222
- # ─────────────────────────────────────────────────────────────────
223
- # FORBIDDEN SHORTCUTS
224
- # ─────────────────────────────────────────────────────────────────
225
- forbidden:
226
- - "Do NOT place Stop inside the reflex feedback try/catch — Stop must fire even if reflex logic fails"
227
- - "Do NOT use process.on('exit') or process.on('SIGTERM') as the Stop call site — must be relay.on('close')"
228
- - "Do NOT set relay stdout to 'ignore' — downstream consumers depend on relay output"
229
- - "Do NOT recreate dispatchBifrostHook() — reuse what TASK_1228 created"
230
- - "Do NOT capture resultCapture inside the reflex block — it must be set before Stop fires"
231
-
232
- # ─────────────────────────────────────────────────────────────────
233
- # VERIFICATION COMMANDS (Phase 9 style)
234
- # ─────────────────────────────────────────────────────────────────
235
- verification:
236
- grep_checks:
237
- - desc: "normalizeSessionStart function exists"
238
- cmd: "grep -n 'function normalizeSessionStart' .formation/bifrost/session.js"
239
- expected: "one match"
240
-
241
- - desc: "normalizeStop function exists"
242
- cmd: "grep -n 'function normalizeStop' .formation/bifrost/session.js"
243
- expected: "one match"
244
-
245
- - desc: "sessionStartedAt module variable declared"
246
- cmd: "grep -n 'sessionStartedAt' .formation/bifrost/session.js"
247
- expected: "at least 3 matches: declaration, set in normalizeSessionStart, used in normalizeStop call"
248
-
249
- - desc: "resultCapture module variable declared"
250
- cmd: "grep -n 'resultCapture' .formation/bifrost/session.js"
251
- expected: "at least 4 matches: declaration, 4 field assignments, used in normalizeStop"
252
-
253
- - desc: "relay stdio changed to pipe for stdout"
254
- cmd: "grep -n \"stdio.*pipe.*pipe\\|'pipe', 'pipe'\" .formation/bifrost/session.js"
255
- expected: "match showing stdout changed from 'inherit' to 'pipe'"
256
-
257
- - desc: "relay.stdout.on data handler exists (tee)"
258
- cmd: "grep -n 'relay.stdout.on' .formation/bifrost/session.js"
259
- expected: "one match"
260
-
261
- - desc: "Stop dispatch wired before reflex block"
262
- cmd: "grep -n \"dispatchBifrostHook.*Stop\\|reflex feedback\\|cleanupSignal\" .formation/bifrost/session.js"
263
- expected: "cleanupSignal() first, then Stop dispatch, then reflex feedback comment — in that order"
264
-
265
- - desc: "SessionStart wired on both code paths"
266
- cmd: "grep -n 'SessionStart' .formation/bifrost/session.js"
267
- expected: "at least 2 dispatch call sites (RESUME_ID path + fresh-session path) plus normalizeSessionStart body"
268
-
269
- ordering_proof:
270
- - desc: "Verify SessionStart fires before UserPromptSubmit (if TASK_1228 already done)"
271
- cmd: "node -e \"const src = require('fs').readFileSync('.formation/bifrost/session.js','utf8'); const ssIdx = src.lastIndexOf('SessionStart'); const upsIdx = src.lastIndexOf('UserPromptSubmit'); console.log('SessionStart at:', ssIdx, 'UserPromptSubmit at:', upsIdx, 'Correct order:', ssIdx < upsIdx);\""
272
- expected: "Correct order: true"
273
-
274
- integration_check:
275
- desc: "Dry-run SessionStart through task-bridge (no-op expected)"
276
- cmd: |
277
- node -e "
278
- const tb = require('./.specialist/tools/task-bridge');
279
- const payload = {
280
- hook_event_name: 'SessionStart',
281
- specialist: 'Ansuz',
282
- adapter: 'openai',
283
- model: null,
284
- cwd: process.cwd(),
285
- pid: process.pid,
286
- session_id: null,
287
- started_at: new Date().toISOString(),
288
- project_path: process.cwd(),
289
- };
290
- tb.handleHookEvent(payload).then(r => console.log('OK (no-op):', r)).catch(e => console.error('FAIL:', e.message));
291
- "
292
- expected: "OK (no-op): null"
293
-
294
- # ─────────────────────────────────────────────────────────────────
295
- # ORDERING
296
- # ─────────────────────────────────────────────────────────────────
297
- ordering:
298
- prerequisite: "TASK_1228 must complete first (creates dispatchBifrostHook in session.js)"
299
- can_run_in_parallel_with: "TASK_1229 (relay.js only — no file overlap)"
300
- must_complete_before: "TASK_1231 (verification gate)"
301
- final_hook_ordering_in_session_js: "writeSignal() → SessionStart → UserPromptSubmit → launchRelay() → [relay runs] → Stop → reflex block → process.exit()"