kenaz 0.3.21 → 0.3.23

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 (481) hide show
  1. package/core/.claude/commands/Ansuz.md +2 -0
  2. package/core/.claude/hooks/__tests__/peer-session-fill.test.js +37 -0
  3. package/core/.claude/hooks/_ansuz-conversation.js +32 -1
  4. package/core/.claude/hooks/_user-scope.js +1 -1
  5. package/core/.claude/hooks/core-resolve.js +1 -1
  6. package/core/.claude/hooks/peer-optin.test.js +74 -0
  7. package/core/.claude/hooks/peer-session-fill.js +38 -0
  8. package/core/.claude/hooks/turn-context.js +5 -4
  9. package/core/.claude/hooks/worktree-create.js +6 -6
  10. package/core/.claude/hooks/worktree-remove.js +4 -4
  11. package/core/.claude/settings.json +9 -0
  12. package/core/.collaboration/core/reconcile.js +16 -1
  13. package/core/.collaboration/core/task-2467-lifecycle.test.js +63 -0
  14. package/core/.collaboration/core/task-api.js +37 -7
  15. package/core/.formation/bifrost/launch.js +1 -1
  16. package/core/.formation/bifrost/openai/codex-hook-shim.js +21 -4
  17. package/core/.formation/bifrost/openai/codex-peer-pull.test.js +42 -0
  18. package/core/.formation/bifrost/provider-launch.js +2 -1
  19. package/core/.formation/tools/kenaz-stats.js +1 -1
  20. package/core/.formation/tools/post-complete/git-merge.js +1 -1
  21. package/core/.formation/tools/prompt.js +1 -1
  22. package/core/.kenaz/specialist/ansuz_rules.yaml +7 -51
  23. package/core/.kenaz/specialist/ansuz_session_handoff.schema.json +2 -6
  24. package/core/.rule/general/project-self-containment.yaml +2 -2
  25. package/core/.specialist/Amelia/README.md +1 -1
  26. package/core/.specialist/Amelia/rule.yaml +1 -1
  27. package/core/.specialist/Ansuz/RULES.md +1 -1
  28. package/core/.specialist/Ansuz/concepts/commitment_layer.yaml +1 -1
  29. package/core/.specialist/Ansuz/concepts/evolvable_guardrails.yaml +1 -1
  30. package/core/.specialist/Ansuz/knowledge.yaml +1 -3
  31. package/core/.specialist/tools/__tests__/task-2409-lessons.test.js +10 -0
  32. package/core/.specialist/tools/__tests__/task-2427-harvest.test.js +25 -0
  33. package/core/.specialist/tools/ansuz-boot-fast.js +1 -1
  34. package/core/.specialist/tools/failure-detector.js +4 -4
  35. package/core/.specialist/tools/handoff-doc.js +1 -1
  36. package/core/.specialist/tools/lessons.js +2 -2
  37. package/core/CLAUDE.md +5 -5
  38. package/core/KENAZ_CORE_VERSION +1 -1
  39. package/core/dashboard/scripts/install-kenaz-cli.js +471 -0
  40. package/core/dev/scripts/check-file-size.js +1 -1
  41. package/core/dev/scripts/ci-feedback.js +1 -1
  42. package/core/dev/scripts/gc-agent-worktrees.js +11 -11
  43. package/core/dev/scripts/kenaz-session.js +3 -3
  44. package/core/dev/scripts/peer-identity-e2e.js +3 -3
  45. package/core/dev/scripts/run-rust-tests.js +2 -2
  46. package/core/dev/scripts/skill-routing-replay.js +3 -3
  47. package/core/dev/scripts/task1961/selftest.js +2 -2
  48. package/core/dev/scripts/windows-hide-guard.test.js +97 -0
  49. package/core/plugins/kenaz/commands/Ansuz.md +2 -0
  50. package/core/plugins/kenaz/guidance.md +2 -0
  51. package/core/plugins/kenaz/hooks/core-resolve.js +1 -1
  52. package/core/plugins/kenaz/hooks/hooks.json +9 -0
  53. package/core/plugins/kenaz/hooks/kenaz-hook.js +53 -4
  54. package/core/plugins/kenaz/scripts/kenaz.test.js +72 -5
  55. package/core/plugins/kenaz/scripts/ygg.js +40 -4
  56. package/core/plugins/kenaz/scripts/ygg.test.js +63 -3
  57. package/core/plugins/kenaz-peer/hooks/register.test.ts +59 -2
  58. package/core/plugins/kenaz-peer/hooks/register.ts +24 -1
  59. package/lib/cli.js +9 -5
  60. package/package.json +6 -6
  61. package/vendor/install-kenaz-cli.js +21 -6
  62. package/core/.kenaz/designs/METAPLASTICITY_CONFIDENCE_DESIGN.md +0 -537
  63. package/core/.kenaz/designs/REFLEX_INITIATOR_DESIGN.md +0 -501
  64. package/core/.kenaz/designs/TASK_1385_handoff_mcp_design.md +0 -426
  65. package/core/.kenaz/designs/TASK_932_hippocampus_consolidation.md +0 -103
  66. package/core/.kenaz/designs/TASK_934_efe_signal_engine.md +0 -97
  67. package/core/.kenaz/designs/TASK_935_self_evolution_framework.md +0 -154
  68. package/core/.kenaz/designs/VISION_cognitive_architecture_roadmap.md +0 -159
  69. package/core/.kenaz/designs/metaplasticity_simulation_results.json +0 -696
  70. package/core/.kenaz/main-memory/README.md +0 -230
  71. package/core/.kenaz/main-memory/kenaz/cortex/001_cortex_overview.md +0 -168
  72. package/core/.kenaz/main-memory/kenaz/cortex/001_rag_engine_overview.md +0 -30
  73. package/core/.kenaz/main-memory/kenaz/memory-system/001_three_tier_architecture.md +0 -361
  74. package/core/.kenaz/main-memory/kenaz/pipeline/001_task_execution_flow.md +0 -117
  75. package/core/.kenaz/main-memory/kenaz/pipeline/001_task_granularity.md +0 -154
  76. package/core/.kenaz/main-memory/kenaz/pipeline/002_team_priority.md +0 -51
  77. package/core/.kenaz/main-memory/kenaz/pipeline/003_feature_id_system.md +0 -46
  78. package/core/.kenaz/main-memory/kenaz/rules/001_gen_007_self_containment.md +0 -108
  79. package/core/.kenaz/main-memory/kenaz/rules/001_rule_priority_system.md +0 -121
  80. package/core/.kenaz/main-memory/kenaz/rules/002_agt_006_pre_check.md +0 -0
  81. package/core/.kenaz/main-memory/kenaz/rules/003_ppl_002_task_archival.md +0 -48
  82. package/core/.kenaz/main-memory/kenaz/system/001_dual_track_task_system.md +0 -197
  83. package/core/.kenaz/main-memory/knowledge/patterns/001_json_bom_issue.md +0 -78
  84. package/core/.kenaz/main-memory/knowledge/patterns/001_leader_worker_pattern.md +0 -0
  85. package/core/.kenaz/main-memory/knowledge/patterns/002_scope_path_conflict.md +0 -115
  86. package/core/.kenaz/main-memory/knowledge/patterns/002_task_dependency_resolution.md +0 -223
  87. package/core/.kenaz/main-memory/knowledge/patterns/003_question_protocol.md +0 -242
  88. package/core/.kenaz/main-memory/knowledge/patterns/004_user_insight_value.md +0 -111
  89. package/core/.kenaz/main-memory/knowledge/patterns/005_file_lock_pattern.md +0 -274
  90. package/core/.kenaz/main-memory/knowledge/references/001_ppl_rules.md +0 -28
  91. package/core/.kenaz/main-memory/knowledge/solutions/001_json_bom_issue.md +0 -137
  92. package/core/.kenaz/main-memory/knowledge/solutions/001_team_invocation.md +0 -0
  93. package/core/.kenaz/main-memory/knowledge/solutions/002_passive_monitoring.md +0 -0
  94. package/core/.kenaz/main-memory/knowledge/solutions/003_windows_file_race_condition.md +0 -239
  95. package/core/.kenaz/main-memory/registry.json +0 -326
  96. package/core/.kenaz/main-memory/version.yaml +0 -58
  97. package/core/.kenaz/specialist/memory_guard_fired.json +0 -1
  98. package/core/.kenaz/specialist/memory_guard_trigger_cache.json +0 -1
  99. package/core/.kenaz/specialist/memory_source_priority.yaml +0 -260
  100. package/core/.kenaz/specialist/prompt_1775.txt +0 -317
  101. package/core/.kenaz/specialist/prompt_1776.txt +0 -326
  102. package/core/.kenaz/specialist/prompt_1791.txt +0 -320
  103. package/core/.kenaz/specialist/prompt_1792.txt +0 -320
  104. package/core/.kenaz/specialist/prompt_1795.txt +0 -281
  105. package/core/.kenaz/specialist/prompt_1813.txt +0 -332
  106. package/core/.kenaz/specialist/prompt_1814.txt +0 -401
  107. package/core/.kenaz/specialist/prompt_1815.txt +0 -394
  108. package/core/.kenaz/specialist/prompt_1816.txt +0 -437
  109. package/core/.kenaz/specialist/prompt_1818.txt +0 -361
  110. package/core/.kenaz/specialist/prompt_1819.txt +0 -421
  111. package/core/.kenaz/specialist/prompt_1821.txt +0 -345
  112. package/core/.kenaz/specialist/prompt_1822.txt +0 -313
  113. package/core/.kenaz/specialist/prompt_1824.txt +0 -348
  114. package/core/.kenaz/specialist/prompt_1826.txt +0 -388
  115. package/core/.kenaz/specialist/rune_efe_salience_gap.md +0 -21
  116. package/core/.kenaz/specialist/task1825_update.json +0 -43
  117. package/core/.kenaz/specialist/taskgen/consolidation_i.json +0 -38
  118. package/core/.kenaz/specialist/taskgen/csharp_a.json +0 -44
  119. package/core/.kenaz/specialist/taskgen/csharp_b.json +0 -40
  120. package/core/.kenaz/specialist/taskgen/embedding_e.json +0 -34
  121. package/core/.kenaz/specialist/taskgen/hygiene_fg.json +0 -39
  122. package/core/.kenaz/specialist/taskgen/pathology_h.json +0 -36
  123. package/core/.kenaz/specialist/taskgen/unity_noise_d.json +0 -38
  124. package/core/.kenaz/specialist/taskgen/visibility_c.json +0 -38
  125. package/core/.specialist/Ansuz/decisions/ADR-requirement-graph-layer.md +0 -390
  126. package/core/.specialist/Ansuz/self_model_seed.backup.json +0 -100
  127. package/core/.specialist/ansuz_session_handoff.json +0 -96
  128. package/core/dev/ALAYA_FIELD_FEEDBACK_DESIGN.md +0 -126
  129. package/core/dev/ANSUZ_SCAFFOLD_DIET_2026-09-20.md +0 -231
  130. package/core/dev/ANSUZ_STARTUP_INJECTION_REVIEW.md +0 -355
  131. package/core/dev/ANSUZ_WORKFLOW_MODERNIZATION.md +0 -143
  132. package/core/dev/CORTEX_META_GRAPH_ASSESSMENT.md +0 -99
  133. package/core/dev/FREYA_DOWNSTREAM_BUGS_2026-09-19.md +0 -44
  134. package/core/dev/GLOBAL_MEMORY_IDENTITY_CONSOLIDATION.md +0 -263
  135. package/core/dev/GUARD_EFFECTIVENESS_DESIGN.md +0 -180
  136. package/core/dev/HEALTH_GATE_VARIANCE_ASSESSMENT.md +0 -271
  137. package/core/dev/HOOK_DIET_2026-09-21.md +0 -126
  138. package/core/dev/JEV_INTEGRATION_PLAN.md +0 -189
  139. package/core/dev/KENAZ_AGENT_CONNECT_v1_SPEC.md +0 -139
  140. package/core/dev/MOBILE_DESIGN_SPEC.md +0 -569
  141. package/core/dev/MULTI_ANSUZ_SPEC.md +0 -136
  142. package/core/dev/MUNINN_RETIREMENT.md +0 -115
  143. package/core/dev/PHASE3_ATTRIBUTION_POPULATION_DIAGNOSIS.md +0 -211
  144. package/core/dev/PHASE3_P3-2B_TASKLEVEL_PROBE.md +0 -83
  145. package/core/dev/PHASE3_P3-2_POPULATION_DISJOINTNESS.md +0 -83
  146. package/core/dev/PHASE3_P3-2_REMEASURE_REPORT.md +0 -231
  147. package/core/dev/PREDICTION_GROUNDING_DESIGN.md +0 -376
  148. package/core/dev/PRODUCT_SPEC.md +0 -317
  149. package/core/dev/PROJECT_REGISTRY_DUPLICATE_ASSESSMENT.md +0 -86
  150. package/core/dev/STARTUP_TIMELINE_TASK_1995.md +0 -181
  151. package/core/dev/SYNAPSE_WORKER_PER_PROJECT.md +0 -881
  152. package/core/dev/TASK_1680_P3-3_DISPATCH_SPEC.md +0 -96
  153. package/core/dev/TASK_1684_CALIBRATION_IMPACT_ANALYSIS.md +0 -170
  154. package/core/dev/TASK_1684_FORK_A_GOODHART_DESIGN.md +0 -171
  155. package/core/dev/TASK_1684_P3_2_REMEASURE_VALIDATION.md +0 -262
  156. package/core/dev/TASK_1903_SIGNAL_AUC_MEASUREMENT.md +0 -207
  157. package/core/dev/TASK_1904_BRANCH_INTEGRITY_AUDIT.md +0 -146
  158. package/core/dev/ansuz-eval/README.md +0 -38
  159. package/core/dev/ansuz-eval/build-fixtures.js +0 -87
  160. package/core/dev/ansuz-eval/grade.js +0 -96
  161. package/core/dev/ansuz-eval/grader.test.js +0 -117
  162. package/core/dev/ansuz-eval/tasks.md +0 -32
  163. package/core/dev/archive/ansuz/BOOT_FULL.md +0 -141
  164. package/core/dev/archive/ansuz/agents/ansuz-boot.md +0 -176
  165. package/core/dev/archive/ansuz/designs/alaya-passive-surfacing.md +0 -84
  166. package/core/dev/archive/ansuz/designs/cc_memory_indexing.md +0 -307
  167. package/core/dev/archive/ansuz/designs/check_guard.md +0 -322
  168. package/core/dev/archive/ansuz/designs/consequence_loop.md +0 -227
  169. package/core/dev/archive/ansuz/designs/mcp_kuzudb_lock_architecture.md +0 -312
  170. package/core/dev/archive/ansuz/designs/phase0_git_enrichment.md +0 -278
  171. package/core/dev/archive/ansuz/designs/refactor_mcp_tools_synapse.md +0 -490
  172. package/core/dev/archive/ansuz/designs/semantic_markdown_extraction.md +0 -167
  173. package/core/dev/archive/ansuz/designs/task_1372_prompt_injects_into.md +0 -193
  174. package/core/dev/archive/ansuz/designs/thought_stack.md +0 -286
  175. package/core/dev/archive/ansuz/investigations/reachability_unified_api_2026-04-11.md +0 -330
  176. package/core/dev/archive/ansuz/investigations/synapse_orphans_indexing_bug_2026-04-11.md +0 -352
  177. package/core/dev/archive/ansuz/investigations/synapse_orphans_reindex_verification_2026-04-11.md +0 -48
  178. package/core/dev/archive/ansuz/investigations/synapse_orphans_verification_2026-04-11.md +0 -170
  179. package/core/dev/archive/ansuz/legacy/kernel.yaml +0 -399
  180. package/core/dev/archive/ansuz/legacy/phases/phase_0.yaml +0 -418
  181. package/core/dev/archive/ansuz/legacy/phases/phase_1.yaml +0 -376
  182. package/core/dev/archive/ansuz/legacy/phases/phase_10.yaml +0 -35
  183. package/core/dev/archive/ansuz/legacy/phases/phase_11.yaml +0 -582
  184. package/core/dev/archive/ansuz/legacy/phases/phase_2.yaml +0 -94
  185. package/core/dev/archive/ansuz/legacy/phases/phase_3.yaml +0 -274
  186. package/core/dev/archive/ansuz/legacy/phases/phase_4.yaml +0 -67
  187. package/core/dev/archive/ansuz/legacy/phases/phase_5.yaml +0 -32
  188. package/core/dev/archive/ansuz/legacy/phases/phase_6.yaml +0 -91
  189. package/core/dev/archive/ansuz/legacy/phases/phase_7.yaml +0 -58
  190. package/core/dev/archive/ansuz/legacy/phases/phase_8.yaml +0 -146
  191. package/core/dev/archive/ansuz/legacy/phases/phase_9.yaml +0 -424
  192. package/core/dev/archive/ansuz/specs/INDEX_bifrost_hook_parity.yaml +0 -92
  193. package/core/dev/archive/ansuz/specs/active-inference-formation.yaml +0 -453
  194. package/core/dev/archive/ansuz/specs/brief_TASK_1228_userpromptsubmit.yaml +0 -191
  195. package/core/dev/archive/ansuz/specs/brief_TASK_1229_pretooluse_posttooluse.yaml +0 -250
  196. package/core/dev/archive/ansuz/specs/brief_TASK_1230_sessionstart_stop.yaml +0 -301
  197. package/core/dev/archive/ansuz/specs/brief_TASK_1231_verification.yaml +0 -272
  198. package/core/dev/archive/skills/feature_agent/SKILL.md +0 -289
  199. package/core/dev/design/PHASE4_DESIGN.md +0 -559
  200. package/core/dev/design/dashboard_docs_integration_PLAN.md +0 -388
  201. package/core/dev/design/matrix_format_ABBREVIATIONS.md +0 -655
  202. package/core/dev/design/matrix_format_DESIGN_SPEC.md +0 -601
  203. package/core/dev/design/matrix_format_DISCUSSION_SUMMARY.md +0 -484
  204. package/core/dev/design/matrix_format_EXAMPLE_memory.matrix +0 -13
  205. package/core/dev/design/matrix_format_EXAMPLE_project_status.matrix +0 -9
  206. package/core/dev/design/matrix_format_EXAMPLE_tasks.matrix +0 -14
  207. package/core/dev/design/matrix_format_SYNTAX_BNF.md +0 -754
  208. package/core/dev/design/matrix_format_TOKEN_COMPARISON.md +0 -484
  209. package/core/dev/design/matrix_v2_COGNITIVE_DESIGN.md +0 -503
  210. package/core/dev/design/matrix_v2_DISCUSSION_SUMMARY.md +0 -414
  211. package/core/dev/design/matrix_v2_EXAMPLE.matrix +0 -67
  212. package/core/dev/designs/EXPANDABLE_CARD_DESIGN_SPEC.md +0 -509
  213. package/core/dev/jev-eval/ACTIVE_CORRECTION.md +0 -52
  214. package/core/dev/jev-eval/ANNOTATION_GUIDE.md +0 -68
  215. package/core/dev/jev-eval/BASELINE_COMPARISON.md +0 -45
  216. package/core/dev/jev-eval/CONTEXT_REVIEW.md +0 -31
  217. package/core/dev/jev-eval/EVALUATION_STATUS.md +0 -39
  218. package/core/dev/jev-eval/HISTORICAL_CORPUS.md +0 -33
  219. package/core/dev/jev-eval/PACKAGING_VERIFICATION.md +0 -42
  220. package/core/dev/jev-eval/README.md +0 -101
  221. package/core/dev/jev-eval/THALAMUS_RANKING.md +0 -58
  222. package/core/dev/jev-eval/VALIDATION_PROGRESS.md +0 -54
  223. package/core/dev/jev-eval/cli.mjs +0 -50
  224. package/core/dev/jev-eval/context.mjs +0 -183
  225. package/core/dev/jev-eval/corpus.mjs +0 -186
  226. package/core/dev/jev-eval/fixtures/conversation-review.seed.jsonl +0 -6
  227. package/core/dev/jev-eval/fixtures/synthetic.jsonl +0 -11
  228. package/core/dev/jev-eval/metrics.mjs +0 -67
  229. package/core/dev/jev-eval/muninn-baseline.mjs +0 -119
  230. package/core/dev/jev-eval/providers.mjs +0 -95
  231. package/core/dev/jev-eval/reports/annotation-pilot-2026-09-20.json +0 -32
  232. package/core/dev/jev-eval/reports/context-review-2026-09-20.json +0 -48
  233. package/core/dev/jev-eval/reports/conversation-review.pending.json +0 -151
  234. package/core/dev/jev-eval/reports/history-corpus-2026-09-20.json +0 -52
  235. package/core/dev/jev-eval/reports/length-probe-2026-09-20.json +0 -133
  236. package/core/dev/jev-eval/reports/live-smoke-2026-09-20.json +0 -616
  237. package/core/dev/jev-eval/reports/muninn-baseline-2026-09-20.json +0 -52
  238. package/core/dev/jev-eval/reports/resilience-2026-09-20.json +0 -520
  239. package/core/dev/jev-eval/reports/rules-baseline.json +0 -197
  240. package/core/dev/jev-eval/reports/synthetic-review.pending.json +0 -357
  241. package/core/dev/jev-eval/resilience.mjs +0 -71
  242. package/core/dev/jev-eval/review.mjs +0 -78
  243. package/core/dev/jev-eval/schema.mjs +0 -87
  244. package/core/dev/jev-eval/test/context.test.mjs +0 -95
  245. package/core/dev/jev-eval/test/corpus.test.mjs +0 -102
  246. package/core/dev/jev-eval/test/eval.test.mjs +0 -146
  247. package/core/dev/jev-eval/test/muninn-baseline.test.mjs +0 -71
  248. package/core/dev/jev-eval/test/resilience.test.mjs +0 -72
  249. package/core/dev/jev-eval/test/review.test.mjs +0 -61
  250. package/core/dev/pipeline/PHASE3_PLANNING_SUMMARY.md +0 -338
  251. package/core/dev/pipeline/PROGRESS.md +0 -113
  252. package/core/dev/pipeline/PROGRESS_template.md +0 -860
  253. package/core/dev/pipeline/QA_REPORT_F008.md +0 -431
  254. package/core/dev/pipeline/QA_REPORT_LOCAL_CLAUDE_DIAGNOSIS.md +0 -583
  255. package/core/dev/pipeline/README.md +0 -210
  256. package/core/dev/pipeline/WORKFLOW_GUIDE.md +0 -824
  257. package/core/dev/pipeline/archived/TASK_015_tauri_init.yaml +0 -53
  258. package/core/dev/pipeline/archived/TASK_016_tauri_commands.yaml +0 -54
  259. package/core/dev/pipeline/archived/TASK_017_rust_pty.yaml +0 -54
  260. package/core/dev/pipeline/archived/TASK_018_tauri_bundle.yaml +0 -53
  261. package/core/dev/pipeline/archived/TASK_019_release_workflow.yaml +0 -56
  262. package/core/dev/pipeline/archived/TASK_020_update_ui.yaml +0 -54
  263. package/core/dev/pipeline/archived/TASK_021_update_notification_ui.yaml +0 -55
  264. package/core/dev/pipeline/archived/TASK_022_remove_node_pty.yaml +0 -65
  265. package/core/dev/pipeline/archived/TASK_023_api_routes_migration.yaml +0 -86
  266. package/core/dev/pipeline/archived/TASK_024_feature_id_system.yaml +0 -51
  267. package/core/dev/pipeline/archived/TASK_025_executable_acceptance.yaml +0 -66
  268. package/core/dev/pipeline/archived/TASK_026_spec_versioning.yaml +0 -56
  269. package/core/dev/pipeline/archived/TASK_027_drift_detection.yaml +0 -60
  270. package/core/dev/pipeline/archived/TASK_028_tauri_pty_manager.yaml +0 -60
  271. package/core/dev/pipeline/archived/TASK_029_tauri_pty_commands.yaml +0 -62
  272. package/core/dev/pipeline/archived/TASK_030_frontend_session_adapter.yaml +0 -54
  273. package/core/dev/pipeline/archived/TASK_031_terminal_tauri_events.yaml +0 -56
  274. package/core/dev/pipeline/archived/TASK_041_scheduler_data_models.yaml +0 -54
  275. package/core/dev/pipeline/archived/TASK_042_path_lock_manager.yaml +0 -53
  276. package/core/dev/pipeline/archived/TASK_043_process_manager.yaml +0 -57
  277. package/core/dev/pipeline/archived/TASK_044_git_integration.yaml +0 -85
  278. package/core/dev/pipeline/archived/TASK_045_task_queue_manager.yaml +0 -54
  279. package/core/dev/pipeline/archived/TASK_046_scheduler_dispatcher.yaml +0 -60
  280. package/core/dev/pipeline/archived/TASK_047_tauri_scheduler_commands.yaml +0 -55
  281. package/core/dev/pipeline/archived/TASK_048_realtime_status_push.yaml +0 -92
  282. package/core/dev/pipeline/archived/TASK_049_frontend_scheduler_integration.yaml +0 -58
  283. package/core/dev/pipeline/archived/TASK_050_error_recovery.yaml +0 -56
  284. package/core/dev/pipeline/archived/TASK_051_optimization_proposals_backend.yaml +0 -53
  285. package/core/dev/pipeline/archived/TASK_052_optimization_proposals_ui.yaml +0 -58
  286. package/core/dev/pipeline/archived/TASK_053_optimization_proposals_diff_view.yaml +0 -54
  287. package/core/dev/pipeline/archived/TASK_054_multi_project_scheduler_state.yaml +0 -76
  288. package/core/dev/pipeline/archived/TASK_055_scheduler_api_project_scope.yaml +0 -64
  289. package/core/dev/pipeline/archived/TASK_056_frontend_scheduler_project_scope.yaml +0 -62
  290. package/core/dev/pipeline/archived/TASK_057_scheduler_module_structure.yaml +0 -54
  291. package/core/dev/pipeline/archived/TASK_058_scheduler_models_extract.yaml +0 -51
  292. package/core/dev/pipeline/archived/TASK_059_scheduler_core_extract.yaml +0 -51
  293. package/core/dev/pipeline/archived/TASK_060_scheduler_commands_extract.yaml +0 -51
  294. package/core/dev/pipeline/archived/TASK_061_scheduler_specialized_commands.yaml +0 -53
  295. package/core/dev/pipeline/archived/TASK_062_process_manager_module_structure.yaml +0 -56
  296. package/core/dev/pipeline/archived/TASK_063_process_manager_core_extract.yaml +0 -56
  297. package/core/dev/pipeline/archived/TASK_064_recovery_module_structure.yaml +0 -57
  298. package/core/dev/pipeline/archived/TASK_065_recovery_core_extract.yaml +0 -56
  299. package/core/dev/pipeline/archived/TASK_066_self_enhancement_scheduler_models.yaml +0 -60
  300. package/core/dev/pipeline/archived/TASK_067_agents_section_quick_actions.yaml +0 -53
  301. package/core/dev/pipeline/archived/TASK_067_self_enhancement_scheduler_core.yaml +0 -65
  302. package/core/dev/pipeline/archived/TASK_068_agent_workflow_rule_enhancement.yaml +0 -46
  303. package/core/dev/pipeline/archived/TASK_068_self_enhancement_tauri_commands.yaml +0 -61
  304. package/core/dev/pipeline/archived/TASK_069_agent_wizard_responsive.yaml +0 -46
  305. package/core/dev/pipeline/archived/TASK_069_self_enhancement_ui.yaml +0 -62
  306. package/core/dev/pipeline/archived/TASK_070_preview_panel_redesign.yaml +0 -62
  307. package/core/dev/pipeline/archived/TASK_070_self_enhancement_integration.yaml +0 -57
  308. package/core/dev/pipeline/archived/TASK_071_preview_panel_qa.yaml +0 -98
  309. package/core/dev/pipeline/archived/TASK_071_single_agent_config.yaml +0 -57
  310. package/core/dev/pipeline/archived/TASK_072_preview_modal_esc_fix.yaml +0 -71
  311. package/core/dev/pipeline/archived/TASK_072_product_review_module.yaml +0 -57
  312. package/core/dev/pipeline/archived/TASK_073_agents_page_component_refactor.yaml +0 -68
  313. package/core/dev/pipeline/archived/TASK_073_rename_single_agent.yaml +0 -64
  314. package/core/dev/pipeline/archived/TASK_074_preview_mode_ui_diagnosis.yaml +0 -71
  315. package/core/dev/pipeline/archived/TASK_074_single_agent_ui_toggle.yaml +0 -56
  316. package/core/dev/pipeline/archived/TASK_075_agents_page_component_refactor.yaml +0 -69
  317. package/core/dev/pipeline/archived/TASK_075_single_agent_integration_test.yaml +0 -75
  318. package/core/dev/pipeline/archived/TASK_076_preview_mode_ui_diagnosis.yaml +0 -70
  319. package/core/dev/pipeline/archived/TASK_076_single_agent_continuous_mode.yaml +0 -65
  320. package/core/dev/pipeline/archived/TASK_077_failure_directory_structure.yaml +0 -51
  321. package/core/dev/pipeline/archived/TASK_077_single_agent_typescript_types.yaml +0 -59
  322. package/core/dev/pipeline/archived/TASK_078_fail_001_agent_no_output.yaml +0 -53
  323. package/core/dev/pipeline/archived/TASK_078_single_agent_ui_simplify.yaml +0 -74
  324. package/core/dev/pipeline/archived/TASK_079_dashboard_rwd_responsive.yaml +0 -63
  325. package/core/dev/pipeline/archived/TASK_079_fail_002_json_bom.yaml +0 -56
  326. package/core/dev/pipeline/archived/TASK_080_fail_003_queue_pollution.yaml +0 -56
  327. package/core/dev/pipeline/archived/TASK_080_http_server_module.yaml +0 -55
  328. package/core/dev/pipeline/archived/TASK_081_failure_logging_tools.yaml +0 -57
  329. package/core/dev/pipeline/archived/TASK_081_http_api_routes.yaml +0 -62
  330. package/core/dev/pipeline/archived/TASK_082_frontend_api_adapter.yaml +0 -51
  331. package/core/dev/pipeline/archived/TASK_082_integrate_failure_to_workflow.yaml +0 -60
  332. package/core/dev/pipeline/archived/TASK_083_cleanup_nextjs_api.yaml +0 -48
  333. package/core/dev/pipeline/archived/TASK_083_task_queue_cleanup.yaml +0 -67
  334. package/core/dev/pipeline/archived/TASK_084_rust_dead_code_cleanup.yaml +0 -66
  335. package/core/dev/pipeline/archived/TASK_084_scheduler_sync_logic_fix.yaml +0 -68
  336. package/core/dev/pipeline/archived/TASK_085_http_api_web_mode_fixes.yaml +0 -46
  337. package/core/dev/pipeline/archived/TASK_085_memory_consolidation_0204_0205.yaml +0 -98
  338. package/core/dev/pipeline/archived/TASK_086_collapsible_preview_panel.yaml +0 -161
  339. package/core/dev/pipeline/archived/TASK_086_web_mode_feature_parity.yaml +0 -62
  340. package/core/dev/pipeline/archived/TASK_087_manual_memory_archival.yaml +0 -163
  341. package/core/dev/pipeline/archived/TASK_087_mobile_http_control.yaml +0 -68
  342. package/core/dev/pipeline/archived/TASK_088_fail_003_to_ppl_002_rule.yaml +0 -63
  343. package/core/dev/pipeline/archived/TASK_088_mobile_http_qa.yaml +0 -121
  344. package/core/dev/pipeline/archived/TASK_089_agent_collaboration_topic.yaml +0 -60
  345. package/core/dev/pipeline/archived/TASK_089_web_mode_monitor_fix.yaml +0 -58
  346. package/core/dev/pipeline/archived/TASK_090_cli_detection_fix.yaml +0 -61
  347. package/core/dev/pipeline/archived/TASK_090_ui_ux_lessons_topic.yaml +0 -63
  348. package/core/dev/pipeline/archived/TASK_091_expandable_card_design.yaml +0 -56
  349. package/core/dev/pipeline/archived/TASK_091_move_agent_section_components.yaml +0 -65
  350. package/core/dev/pipeline/archived/TASK_092_expandable_card_component.yaml +0 -60
  351. package/core/dev/pipeline/archived/TASK_092_refactor_agent_create_wizard.yaml +0 -84
  352. package/core/dev/pipeline/archived/TASK_093_taskcard_detail_integration.yaml +0 -57
  353. package/core/dev/pipeline/archived/TASK_093_update_barrel_exports_test.yaml +0 -84
  354. package/core/dev/pipeline/archived/TASK_094_ai_agent_generation_enhancement.yaml +0 -115
  355. package/core/dev/pipeline/archived/TASK_094_proposalcard_detail_integration.yaml +0 -55
  356. package/core/dev/pipeline/archived/TASK_095_preview_fixes.yaml +0 -129
  357. package/core/dev/pipeline/archived/TASK_095_single_agent_task_selector.yaml +0 -60
  358. package/core/dev/pipeline/archived/TASK_096_agents_page_ux_improvements.yaml +0 -163
  359. package/core/dev/pipeline/archived/TASK_096_single_agent_status_sync.yaml +0 -60
  360. package/core/dev/pipeline/archived/TASK_097_local_claude_error_logging.yaml +0 -59
  361. package/core/dev/pipeline/archived/TASK_097_single_agent_monitor_events.yaml +0 -59
  362. package/core/dev/pipeline/archived/TASK_098_product_manager_team_phase2.yaml +0 -60
  363. package/core/dev/pipeline/archived/TASK_098_single_agent_refactor_test.yaml +0 -58
  364. package/core/dev/pipeline/archived/TASK_099_backend_team_creation.yaml +0 -258
  365. package/core/dev/pipeline/archived/TASK_100_frontend_team_creation.yaml +0 -61
  366. package/core/dev/pipeline/archived/TASK_101_orchestrator_system.yaml +0 -403
  367. package/core/dev/pipeline/archived/TASK_102_designer_sre_teams.yaml +0 -90
  368. package/core/dev/pipeline/archived/TASK_103_integration_testing.yaml +0 -86
  369. package/core/dev/pipeline/archived/TASK_128_integration_testing.yaml +0 -83
  370. package/core/dev/pipeline/archived/TASK_134_cortex_v2_phase3_file_watcher.yaml +0 -65
  371. package/core/dev/pipeline/archived/TASK_134_team_http_api.yaml +0 -96
  372. package/core/dev/pipeline/archived/TASK_135_cortex_v2_phase3_git_monitor.yaml +0 -63
  373. package/core/dev/pipeline/archived/TASK_136_cortex_v2_phase3_change_analyzer.yaml +0 -69
  374. package/core/dev/pipeline/archived/TASK_137_cortex_v2_phase3_cache_invalidator.yaml +0 -67
  375. package/core/dev/pipeline/archived/TASK_137_team_orchestrator_integration.yaml +0 -93
  376. package/core/dev/pipeline/archived/TASK_138_cortex_v2_phase3_distributed_cache.yaml +0 -68
  377. package/core/dev/pipeline/archived/TASK_138_matrix_folder_structure.yaml +0 -61
  378. package/core/dev/pipeline/archived/TASK_139_cortex_v2_phase3_cache_prewarming.yaml +0 -65
  379. package/core/dev/pipeline/archived/TASK_146_unified_documentation.yaml +0 -141
  380. package/core/dev/pipeline/archived/TASK_147_pipeline_execution_rules.yaml +0 -76
  381. package/core/dev/pipeline/archived/TASK_148_update_claude_md.yaml +0 -77
  382. package/core/dev/pipeline/archived/TASK_149_fix_nextjs_mdx_serialization.yaml +0 -63
  383. package/core/dev/pipeline/archived/TASK_149_update_team_docs.yaml +0 -77
  384. package/core/dev/pipeline/archived/TASK_150_pipeline_workflow_guide.yaml +0 -82
  385. package/core/dev/pipeline/archived/TASK_164_fix_smart_context_switch.yaml +0 -49
  386. package/core/dev/pipeline/archived/TASK_165_ctags_symbol_index.yaml +0 -53
  387. package/core/dev/pipeline/archived/TASK_166_symbol_search_mcp_tool.yaml +0 -48
  388. package/core/dev/pipeline/archived/TASK_167_llm_module_summary.yaml +0 -55
  389. package/core/dev/pipeline/archived/TASK_168_map_reduce_context.yaml +0 -51
  390. package/core/dev/pipeline/archived/TASK_169_v2_integration_testing.yaml +0 -52
  391. package/core/dev/pipeline/backups/archive_2026-02-04T22-07-22/TASK_QUEUE_backup.json +0 -95
  392. package/core/dev/pipeline/docs/multi-agent-coordination.md +0 -446
  393. package/core/dev/pipeline/docs/overview.md +0 -406
  394. package/core/dev/pipeline/docs/task-management.md +0 -412
  395. package/core/dev/pipeline/docs/workflows.md +0 -32
  396. package/core/dev/pipeline/orchestrator/schemas/task_queue_schema.json +0 -58
  397. package/core/dev/pipeline/orchestrator/schemas/task_schema.json +0 -139
  398. package/core/dev/pipeline/plans/PLAN_task_cli_refactor.md +0 -281
  399. package/core/dev/pipeline/test_results/TASK_TEST_PARALLEL_002_result.txt +0 -27
  400. package/core/dev/plans/ANSUZ_SLIM_PLAN.md +0 -68
  401. package/core/dev/plans/CLI_FIRST_INSTALL_FLOW.md +0 -120
  402. package/core/dev/plans/FORMATION_RETIREMENT_PLAN.md +0 -313
  403. package/core/dev/plans/KUZU_REPLACEMENT_PLAN.md +0 -126
  404. package/core/dev/scripts/CRASH_DIAGNOSIS.md +0 -47
  405. package/core/dev/scripts/README.md +0 -142
  406. package/core/dev/scripts/RUN_ONCE.bat +0 -40
  407. package/core/dev/scripts/START_DEV_AGENT.bat +0 -63
  408. package/core/dev/scripts/START_MULTI_AGENT.bat +0 -80
  409. package/core/dev/scripts/dev_agent_scheduler.ps1 +0 -536
  410. package/core/dev/scripts/init_git.ps1 +0 -396
  411. package/core/dev/scripts/init_git.sh +0 -337
  412. package/core/dev/scripts/init_project.ps1 +0 -851
  413. package/core/dev/scripts/init_project.sh +0 -477
  414. package/core/dev/scripts/multi_agent_scheduler.ps1 +0 -2021
  415. package/core/dev/scripts/multi_agent_scheduler.sh +0 -1344
  416. package/core/dev/scripts/run_once.sh +0 -47
  417. package/core/dev/scripts/setup_rag.ps1 +0 -304
  418. package/core/dev/scripts/setup_rag.sh +0 -230
  419. package/core/dev/scripts/start_dev_agent.sh +0 -137
  420. package/core/dev/scripts/start_multi_agent.sh +0 -41
  421. package/core/dev/scripts/sync_task_queue.ps1 +0 -505
  422. package/core/dev/scripts/sync_task_queue.sh +0 -392
  423. package/core/dev/specs/agent-connect/PROTOCOL.md +0 -177
  424. package/core/dev/specs/agent-connect/SDK_GUIDE.md +0 -915
  425. package/core/dev/specs/agent-connect/examples/minimal-site/README.md +0 -137
  426. package/core/dev/specs/agent-connect/examples/minimal-site/package.json +0 -12
  427. package/core/dev/specs/agent-connect/examples/minimal-site/public/index.html +0 -116
  428. package/core/dev/specs/agent-connect/examples/minimal-site/public/install-redirect.js +0 -73
  429. package/core/dev/specs/agent-connect/examples/minimal-site/server.js +0 -516
  430. package/core/dev/specs/agent-connect/examples/minimal-site/test/smoke.test.mjs +0 -263
  431. 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
  432. package/core/dev/specs/agent-connect/history/DEFECT_REPORT_kenaz-agent-hub_2026-09-09_v0.4-prompt-mojibake.md +0 -90
  433. package/core/dev/specs/agent-connect/history/FEATURE_REQUEST_kenaz-agent-hub_2026-09-07.md +0 -61
  434. package/core/dev/specs/agent-connect/history/FEATURE_REQUEST_kenaz-agent-hub_2026-09-08_relay-v1-conformance.md +0 -76
  435. package/core/dev/specs/agent-connect/history/FEATURE_REQUEST_kenaz-agent-hub_2026-09-09_v0.4-session-channel.md +0 -87
  436. package/core/dev/specs/agent-connect/history/FLOWPIX_REPLY_agent-hub_2026-09-08_relay-v1-answers.md +0 -68
  437. package/core/dev/specs/agent-connect/history/FLOWPIX_bridge_CONTRACT.md +0 -642
  438. package/core/dev/specs/agent-connect/history/FLOWPIX_spikes_relay_spike_relay.mjs +0 -244
  439. package/core/dev/specs/agent-connect/history/KENAZ_RESPONSE_agent-hub_2026-09-07.md +0 -77
  440. package/core/dev/specs/agent-connect/history/KENAZ_RESPONSE_agent-hub_2026-09-08_direction-change-v0.3.md +0 -44
  441. package/core/dev/specs/agent-connect/history/KENAZ_RESPONSE_agent-hub_2026-09-08_relay-v1-answers-ack.md +0 -37
  442. package/core/dev/specs/agent-connect/history/KENAZ_RESPONSE_agent-hub_2026-09-08_relay-v1-conformance.md +0 -56
  443. package/core/dev/specs/agent-connect/history/KENAZ_RESPONSE_agent-hub_2026-09-09_annotations-install-coldstart.md +0 -44
  444. package/core/dev/specs/agent-connect/history/KENAZ_RESPONSE_agent-hub_2026-09-09_empty-prompt-first-turn.md +0 -56
  445. package/core/dev/specs/agent-connect/history/KENAZ_RESPONSE_agent-hub_2026-09-09_prompt-mojibake-fixed.md +0 -48
  446. package/core/dev/specs/agent-connect/history/KENAZ_RESPONSE_agent-hub_2026-09-09_session-channel.md +0 -57
  447. package/core/dev/specs/agent-connect/history/PROTOCOL_v0.3_snapshot.md +0 -379
  448. package/core/dev/specs/agent-connect/history/README.md +0 -47
  449. package/core/dev/specs/peer/CODEX_INTERACTIVE_PUSH.md +0 -65
  450. package/core/dev/specs/peer/CODEX_MANAGED_DAEMON.md +0 -54
  451. package/core/dev/specs/peer/CODEX_PEER_PULL_SPIKE.md +0 -54
  452. package/core/dev/specs/peer/MODS_SPIKE.md +0 -133
  453. package/core/dev/specs/peer/PER_PROJECT_ADDRESSING.md +0 -143
  454. package/core/dev/specs/peer/SWARM_PROTOCOLS.md +0 -256
  455. package/core/dev/specs/peer/codex-hook-shim-peer.test.js +0 -113
  456. package/core/dev/specs/peer/codex-push-launcher.test.js +0 -142
  457. package/core/dev/specs/peer/setup-codex-hooks.test.js +0 -60
  458. package/core/dev/specs/peer-ansuz/DELIVERY_SPIKE.md +0 -397
  459. package/core/dev/specs/peer-ansuz/DESIGN.md +0 -109
  460. package/core/dev/specs/peer-ansuz/spike/claude_poke.js +0 -129
  461. package/core/dev/specs/peer-ansuz/spike/claude_session_start_hook.js +0 -37
  462. package/core/dev/specs/peer-ansuz/spike/claude_settings_hook.json +0 -14
  463. package/core/dev/specs/peer-ansuz/spike/codex_appserver_client.js +0 -105
  464. package/core/dev/specs/peer-ansuz/spike/codex_appserver_query.js +0 -29
  465. package/core/dev/specs/peer-ansuz/spike/extract_timeline.js +0 -26
  466. package/core/dev/specs/synapse/SYMBOL_IDENTITY.md +0 -305
  467. package/core/dev/spikes/A4-cypher-varlen.md +0 -176
  468. package/core/dev/spikes/bloat-rounds.sh +0 -25
  469. package/core/dev/spikes/mods/clean-claude.js +0 -9
  470. package/core/dev/spikes/mods/drive-probe.js +0 -29
  471. package/core/dev/spikes/mods/e2e-peer.js +0 -71
  472. package/core/dev/spikes/mods/evidence/e2e-peer-control.json +0 -17
  473. package/core/dev/spikes/mods/evidence/e2e-peer-mod.json +0 -17
  474. package/core/dev/spikes/mods/evidence/probe-006a6e65-d807-4bc1-b648-fd7d1edfe0b4.jsonl +0 -4
  475. package/core/dev/spikes/mods/evidence/probe-cebdf1f7-f9c4-47a8-83cd-7c0786177404.jsonl +0 -12
  476. package/core/dev/spikes/mods/evidence/probe-eb21147d-10ce-4c32-93ed-37ca37d88d5a.jsonl +0 -11
  477. package/core/dev/spikes/mods/evidence/stream-cebdf1f7.jsonl +0 -18
  478. package/core/dev/spikes/mods/kenaz-mod-probe/.claude-plugin/plugin.json +0 -1
  479. package/core/dev/spikes/mods/kenaz-mod-probe/hooks/hooks.json +0 -1
  480. package/core/dev/spikes/mods/kenaz-mod-probe/hooks/register.ts +0 -65
  481. 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()"