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.
- package/core/.claude/hooks/_user-scope.js +1 -1
- package/core/.claude/hooks/core-resolve.js +1 -1
- package/core/.claude/hooks/worktree-create.js +11 -29
- package/core/.claude/hooks/worktree-remove.js +12 -38
- package/core/.collaboration/core/reconcile.js +16 -1
- package/core/.collaboration/core/task-2467-lifecycle.test.js +63 -0
- package/core/.collaboration/core/task-api.js +37 -7
- package/core/.formation/bifrost/launch.js +1 -1
- package/core/.formation/tools/dispatch-detail/worktree-subagent-mode.md +6 -1
- package/core/.formation/tools/kenaz-stats.js +1 -1
- package/core/.formation/tools/post-complete/git-merge.js +1 -1
- package/core/.formation/tools/prompt.js +1 -1
- package/core/.formation/tools/utils.js +5 -5
- package/core/.formation/tools/worktree-reclaim.js +73 -2
- package/core/.formation/tools/worktree-reclaim.test.js +113 -0
- package/core/.kenaz/specialist/ansuz_rules.yaml +7 -51
- package/core/.kenaz/specialist/ansuz_session_handoff.schema.json +2 -6
- package/core/.rule/general/project-self-containment.yaml +2 -2
- package/core/.specialist/Amelia/README.md +1 -1
- package/core/.specialist/Amelia/rule.yaml +1 -1
- package/core/.specialist/Ansuz/RULES.md +6 -2
- package/core/.specialist/Ansuz/concepts/commitment_layer.yaml +1 -1
- package/core/.specialist/Ansuz/concepts/evolvable_guardrails.yaml +1 -1
- package/core/.specialist/Ansuz/knowledge.yaml +1 -3
- package/core/.specialist/tools/__tests__/task-2409-lessons.test.js +10 -0
- package/core/.specialist/tools/__tests__/task-2427-harvest.test.js +25 -0
- package/core/.specialist/tools/ansuz-boot-fast.js +1 -1
- package/core/.specialist/tools/failure-detector.js +4 -4
- package/core/.specialist/tools/handoff-doc.js +1 -1
- package/core/.specialist/tools/lessons.js +2 -2
- package/core/CLAUDE.md +5 -5
- package/core/KENAZ_CORE_VERSION +1 -1
- package/core/dashboard/scripts/install-kenaz-cli.js +56 -30
- package/core/dev/scripts/check-file-size.js +1 -1
- package/core/dev/scripts/ci-feedback.js +1 -1
- package/core/dev/scripts/gc-agent-worktrees.js +13 -12
- package/core/dev/scripts/kenaz-session.js +3 -3
- package/core/dev/scripts/peer-identity-e2e.js +6 -4
- package/core/dev/scripts/run-rust-tests.js +2 -2
- package/core/dev/scripts/skill-routing-replay.js +3 -3
- package/core/dev/scripts/task1961/selftest.js +2 -2
- package/core/dev/scripts/windows-hide-guard.test.js +112 -0
- package/core/plugins/kenaz/guidance.md +1 -0
- package/core/plugins/kenaz/hooks/core-resolve.js +1 -1
- package/core/plugins/kenaz/hooks/hooks.json +9 -0
- package/core/plugins/kenaz/hooks/kenaz-hook.js +58 -4
- package/core/plugins/kenaz/hooks/worktree-guard.js +121 -0
- package/core/plugins/kenaz/hooks/worktree-guard.test.js +75 -0
- package/core/plugins/kenaz/scripts/kenaz.test.js +72 -5
- package/core/plugins/kenaz-peer/hooks/register.test.ts +14 -2
- package/core/plugins/kenaz-peer/hooks/register.ts +6 -1
- package/lib/cli.js +9 -5
- package/package.json +6 -6
- package/vendor/install-kenaz-cli.js +56 -30
- package/core/.kenaz/designs/METAPLASTICITY_CONFIDENCE_DESIGN.md +0 -537
- package/core/.kenaz/designs/REFLEX_INITIATOR_DESIGN.md +0 -501
- package/core/.kenaz/designs/TASK_1385_handoff_mcp_design.md +0 -426
- package/core/.kenaz/designs/TASK_932_hippocampus_consolidation.md +0 -103
- package/core/.kenaz/designs/TASK_934_efe_signal_engine.md +0 -97
- package/core/.kenaz/designs/TASK_935_self_evolution_framework.md +0 -154
- package/core/.kenaz/designs/VISION_cognitive_architecture_roadmap.md +0 -159
- package/core/.kenaz/designs/metaplasticity_simulation_results.json +0 -696
- package/core/.kenaz/main-memory/README.md +0 -230
- package/core/.kenaz/main-memory/kenaz/cortex/001_cortex_overview.md +0 -168
- package/core/.kenaz/main-memory/kenaz/cortex/001_rag_engine_overview.md +0 -30
- package/core/.kenaz/main-memory/kenaz/memory-system/001_three_tier_architecture.md +0 -361
- package/core/.kenaz/main-memory/kenaz/pipeline/001_task_execution_flow.md +0 -117
- package/core/.kenaz/main-memory/kenaz/pipeline/001_task_granularity.md +0 -154
- package/core/.kenaz/main-memory/kenaz/pipeline/002_team_priority.md +0 -51
- package/core/.kenaz/main-memory/kenaz/pipeline/003_feature_id_system.md +0 -46
- package/core/.kenaz/main-memory/kenaz/rules/001_gen_007_self_containment.md +0 -108
- package/core/.kenaz/main-memory/kenaz/rules/001_rule_priority_system.md +0 -121
- package/core/.kenaz/main-memory/kenaz/rules/002_agt_006_pre_check.md +0 -0
- package/core/.kenaz/main-memory/kenaz/rules/003_ppl_002_task_archival.md +0 -48
- package/core/.kenaz/main-memory/kenaz/system/001_dual_track_task_system.md +0 -197
- package/core/.kenaz/main-memory/knowledge/patterns/001_json_bom_issue.md +0 -78
- package/core/.kenaz/main-memory/knowledge/patterns/001_leader_worker_pattern.md +0 -0
- package/core/.kenaz/main-memory/knowledge/patterns/002_scope_path_conflict.md +0 -115
- package/core/.kenaz/main-memory/knowledge/patterns/002_task_dependency_resolution.md +0 -223
- package/core/.kenaz/main-memory/knowledge/patterns/003_question_protocol.md +0 -242
- package/core/.kenaz/main-memory/knowledge/patterns/004_user_insight_value.md +0 -111
- package/core/.kenaz/main-memory/knowledge/patterns/005_file_lock_pattern.md +0 -274
- package/core/.kenaz/main-memory/knowledge/references/001_ppl_rules.md +0 -28
- package/core/.kenaz/main-memory/knowledge/solutions/001_json_bom_issue.md +0 -137
- package/core/.kenaz/main-memory/knowledge/solutions/001_team_invocation.md +0 -0
- package/core/.kenaz/main-memory/knowledge/solutions/002_passive_monitoring.md +0 -0
- package/core/.kenaz/main-memory/knowledge/solutions/003_windows_file_race_condition.md +0 -239
- package/core/.kenaz/main-memory/registry.json +0 -326
- package/core/.kenaz/main-memory/version.yaml +0 -58
- package/core/.kenaz/specialist/memory_guard_fired.json +0 -1
- package/core/.kenaz/specialist/memory_guard_trigger_cache.json +0 -1
- package/core/.kenaz/specialist/memory_source_priority.yaml +0 -260
- package/core/.kenaz/specialist/prompt_1775.txt +0 -317
- package/core/.kenaz/specialist/prompt_1776.txt +0 -326
- package/core/.kenaz/specialist/prompt_1791.txt +0 -320
- package/core/.kenaz/specialist/prompt_1792.txt +0 -320
- package/core/.kenaz/specialist/prompt_1795.txt +0 -281
- package/core/.kenaz/specialist/prompt_1813.txt +0 -332
- package/core/.kenaz/specialist/prompt_1814.txt +0 -401
- package/core/.kenaz/specialist/prompt_1815.txt +0 -394
- package/core/.kenaz/specialist/prompt_1816.txt +0 -437
- package/core/.kenaz/specialist/prompt_1818.txt +0 -361
- package/core/.kenaz/specialist/prompt_1819.txt +0 -421
- package/core/.kenaz/specialist/prompt_1821.txt +0 -345
- package/core/.kenaz/specialist/prompt_1822.txt +0 -313
- package/core/.kenaz/specialist/prompt_1824.txt +0 -348
- package/core/.kenaz/specialist/prompt_1826.txt +0 -388
- package/core/.kenaz/specialist/rune_efe_salience_gap.md +0 -21
- package/core/.kenaz/specialist/task1825_update.json +0 -43
- package/core/.kenaz/specialist/taskgen/consolidation_i.json +0 -38
- package/core/.kenaz/specialist/taskgen/csharp_a.json +0 -44
- package/core/.kenaz/specialist/taskgen/csharp_b.json +0 -40
- package/core/.kenaz/specialist/taskgen/embedding_e.json +0 -34
- package/core/.kenaz/specialist/taskgen/hygiene_fg.json +0 -39
- package/core/.kenaz/specialist/taskgen/pathology_h.json +0 -36
- package/core/.kenaz/specialist/taskgen/unity_noise_d.json +0 -38
- package/core/.kenaz/specialist/taskgen/visibility_c.json +0 -38
- package/core/.specialist/Ansuz/decisions/ADR-requirement-graph-layer.md +0 -390
- package/core/.specialist/Ansuz/self_model_seed.backup.json +0 -100
- package/core/.specialist/ansuz_session_handoff.json +0 -96
- package/core/dev/ALAYA_FIELD_FEEDBACK_DESIGN.md +0 -126
- package/core/dev/ANSUZ_SCAFFOLD_DIET_2026-09-20.md +0 -231
- package/core/dev/ANSUZ_STARTUP_INJECTION_REVIEW.md +0 -355
- package/core/dev/ANSUZ_WORKFLOW_MODERNIZATION.md +0 -143
- package/core/dev/CORTEX_META_GRAPH_ASSESSMENT.md +0 -99
- package/core/dev/FREYA_DOWNSTREAM_BUGS_2026-09-19.md +0 -44
- package/core/dev/GLOBAL_MEMORY_IDENTITY_CONSOLIDATION.md +0 -263
- package/core/dev/GUARD_EFFECTIVENESS_DESIGN.md +0 -180
- package/core/dev/HEALTH_GATE_VARIANCE_ASSESSMENT.md +0 -271
- package/core/dev/HOOK_DIET_2026-09-21.md +0 -126
- package/core/dev/JEV_INTEGRATION_PLAN.md +0 -189
- package/core/dev/KENAZ_AGENT_CONNECT_v1_SPEC.md +0 -139
- package/core/dev/MOBILE_DESIGN_SPEC.md +0 -569
- package/core/dev/MULTI_ANSUZ_SPEC.md +0 -136
- package/core/dev/MUNINN_RETIREMENT.md +0 -115
- package/core/dev/PHASE3_ATTRIBUTION_POPULATION_DIAGNOSIS.md +0 -211
- package/core/dev/PHASE3_P3-2B_TASKLEVEL_PROBE.md +0 -83
- package/core/dev/PHASE3_P3-2_POPULATION_DISJOINTNESS.md +0 -83
- package/core/dev/PHASE3_P3-2_REMEASURE_REPORT.md +0 -231
- package/core/dev/PREDICTION_GROUNDING_DESIGN.md +0 -376
- package/core/dev/PRODUCT_SPEC.md +0 -317
- package/core/dev/PROJECT_REGISTRY_DUPLICATE_ASSESSMENT.md +0 -86
- package/core/dev/STARTUP_TIMELINE_TASK_1995.md +0 -181
- package/core/dev/SYNAPSE_WORKER_PER_PROJECT.md +0 -881
- package/core/dev/TASK_1680_P3-3_DISPATCH_SPEC.md +0 -96
- package/core/dev/TASK_1684_CALIBRATION_IMPACT_ANALYSIS.md +0 -170
- package/core/dev/TASK_1684_FORK_A_GOODHART_DESIGN.md +0 -171
- package/core/dev/TASK_1684_P3_2_REMEASURE_VALIDATION.md +0 -262
- package/core/dev/TASK_1903_SIGNAL_AUC_MEASUREMENT.md +0 -207
- package/core/dev/TASK_1904_BRANCH_INTEGRITY_AUDIT.md +0 -146
- package/core/dev/ansuz-eval/README.md +0 -38
- package/core/dev/ansuz-eval/build-fixtures.js +0 -87
- package/core/dev/ansuz-eval/grade.js +0 -96
- package/core/dev/ansuz-eval/grader.test.js +0 -117
- package/core/dev/ansuz-eval/tasks.md +0 -32
- package/core/dev/archive/ansuz/BOOT_FULL.md +0 -141
- package/core/dev/archive/ansuz/agents/ansuz-boot.md +0 -176
- package/core/dev/archive/ansuz/designs/alaya-passive-surfacing.md +0 -84
- package/core/dev/archive/ansuz/designs/cc_memory_indexing.md +0 -307
- package/core/dev/archive/ansuz/designs/check_guard.md +0 -322
- package/core/dev/archive/ansuz/designs/consequence_loop.md +0 -227
- package/core/dev/archive/ansuz/designs/mcp_kuzudb_lock_architecture.md +0 -312
- package/core/dev/archive/ansuz/designs/phase0_git_enrichment.md +0 -278
- package/core/dev/archive/ansuz/designs/refactor_mcp_tools_synapse.md +0 -490
- package/core/dev/archive/ansuz/designs/semantic_markdown_extraction.md +0 -167
- package/core/dev/archive/ansuz/designs/task_1372_prompt_injects_into.md +0 -193
- package/core/dev/archive/ansuz/designs/thought_stack.md +0 -286
- package/core/dev/archive/ansuz/investigations/reachability_unified_api_2026-04-11.md +0 -330
- package/core/dev/archive/ansuz/investigations/synapse_orphans_indexing_bug_2026-04-11.md +0 -352
- package/core/dev/archive/ansuz/investigations/synapse_orphans_reindex_verification_2026-04-11.md +0 -48
- package/core/dev/archive/ansuz/investigations/synapse_orphans_verification_2026-04-11.md +0 -170
- package/core/dev/archive/ansuz/legacy/kernel.yaml +0 -399
- package/core/dev/archive/ansuz/legacy/phases/phase_0.yaml +0 -418
- package/core/dev/archive/ansuz/legacy/phases/phase_1.yaml +0 -376
- package/core/dev/archive/ansuz/legacy/phases/phase_10.yaml +0 -35
- package/core/dev/archive/ansuz/legacy/phases/phase_11.yaml +0 -582
- package/core/dev/archive/ansuz/legacy/phases/phase_2.yaml +0 -94
- package/core/dev/archive/ansuz/legacy/phases/phase_3.yaml +0 -274
- package/core/dev/archive/ansuz/legacy/phases/phase_4.yaml +0 -67
- package/core/dev/archive/ansuz/legacy/phases/phase_5.yaml +0 -32
- package/core/dev/archive/ansuz/legacy/phases/phase_6.yaml +0 -91
- package/core/dev/archive/ansuz/legacy/phases/phase_7.yaml +0 -58
- package/core/dev/archive/ansuz/legacy/phases/phase_8.yaml +0 -146
- package/core/dev/archive/ansuz/legacy/phases/phase_9.yaml +0 -424
- package/core/dev/archive/ansuz/specs/INDEX_bifrost_hook_parity.yaml +0 -92
- package/core/dev/archive/ansuz/specs/active-inference-formation.yaml +0 -453
- package/core/dev/archive/ansuz/specs/brief_TASK_1228_userpromptsubmit.yaml +0 -191
- package/core/dev/archive/ansuz/specs/brief_TASK_1229_pretooluse_posttooluse.yaml +0 -250
- package/core/dev/archive/ansuz/specs/brief_TASK_1230_sessionstart_stop.yaml +0 -301
- package/core/dev/archive/ansuz/specs/brief_TASK_1231_verification.yaml +0 -272
- package/core/dev/archive/skills/feature_agent/SKILL.md +0 -289
- package/core/dev/design/PHASE4_DESIGN.md +0 -559
- package/core/dev/design/dashboard_docs_integration_PLAN.md +0 -388
- package/core/dev/design/matrix_format_ABBREVIATIONS.md +0 -655
- package/core/dev/design/matrix_format_DESIGN_SPEC.md +0 -601
- package/core/dev/design/matrix_format_DISCUSSION_SUMMARY.md +0 -484
- package/core/dev/design/matrix_format_EXAMPLE_memory.matrix +0 -13
- package/core/dev/design/matrix_format_EXAMPLE_project_status.matrix +0 -9
- package/core/dev/design/matrix_format_EXAMPLE_tasks.matrix +0 -14
- package/core/dev/design/matrix_format_SYNTAX_BNF.md +0 -754
- package/core/dev/design/matrix_format_TOKEN_COMPARISON.md +0 -484
- package/core/dev/design/matrix_v2_COGNITIVE_DESIGN.md +0 -503
- package/core/dev/design/matrix_v2_DISCUSSION_SUMMARY.md +0 -414
- package/core/dev/design/matrix_v2_EXAMPLE.matrix +0 -67
- package/core/dev/designs/EXPANDABLE_CARD_DESIGN_SPEC.md +0 -509
- package/core/dev/jev-eval/ACTIVE_CORRECTION.md +0 -52
- package/core/dev/jev-eval/ANNOTATION_GUIDE.md +0 -68
- package/core/dev/jev-eval/BASELINE_COMPARISON.md +0 -45
- package/core/dev/jev-eval/CONTEXT_REVIEW.md +0 -31
- package/core/dev/jev-eval/EVALUATION_STATUS.md +0 -39
- package/core/dev/jev-eval/HISTORICAL_CORPUS.md +0 -33
- package/core/dev/jev-eval/PACKAGING_VERIFICATION.md +0 -42
- package/core/dev/jev-eval/README.md +0 -101
- package/core/dev/jev-eval/THALAMUS_RANKING.md +0 -58
- package/core/dev/jev-eval/VALIDATION_PROGRESS.md +0 -54
- package/core/dev/jev-eval/cli.mjs +0 -50
- package/core/dev/jev-eval/context.mjs +0 -183
- package/core/dev/jev-eval/corpus.mjs +0 -186
- package/core/dev/jev-eval/fixtures/conversation-review.seed.jsonl +0 -6
- package/core/dev/jev-eval/fixtures/synthetic.jsonl +0 -11
- package/core/dev/jev-eval/metrics.mjs +0 -67
- package/core/dev/jev-eval/muninn-baseline.mjs +0 -119
- package/core/dev/jev-eval/providers.mjs +0 -95
- package/core/dev/jev-eval/reports/annotation-pilot-2026-09-20.json +0 -32
- package/core/dev/jev-eval/reports/context-review-2026-09-20.json +0 -48
- package/core/dev/jev-eval/reports/conversation-review.pending.json +0 -151
- package/core/dev/jev-eval/reports/history-corpus-2026-09-20.json +0 -52
- package/core/dev/jev-eval/reports/length-probe-2026-09-20.json +0 -133
- package/core/dev/jev-eval/reports/live-smoke-2026-09-20.json +0 -616
- package/core/dev/jev-eval/reports/muninn-baseline-2026-09-20.json +0 -52
- package/core/dev/jev-eval/reports/resilience-2026-09-20.json +0 -520
- package/core/dev/jev-eval/reports/rules-baseline.json +0 -197
- package/core/dev/jev-eval/reports/synthetic-review.pending.json +0 -357
- package/core/dev/jev-eval/resilience.mjs +0 -71
- package/core/dev/jev-eval/review.mjs +0 -78
- package/core/dev/jev-eval/schema.mjs +0 -87
- package/core/dev/jev-eval/test/context.test.mjs +0 -95
- package/core/dev/jev-eval/test/corpus.test.mjs +0 -102
- package/core/dev/jev-eval/test/eval.test.mjs +0 -146
- package/core/dev/jev-eval/test/muninn-baseline.test.mjs +0 -71
- package/core/dev/jev-eval/test/resilience.test.mjs +0 -72
- package/core/dev/jev-eval/test/review.test.mjs +0 -61
- package/core/dev/pipeline/PHASE3_PLANNING_SUMMARY.md +0 -338
- package/core/dev/pipeline/PROGRESS.md +0 -113
- package/core/dev/pipeline/PROGRESS_template.md +0 -860
- package/core/dev/pipeline/QA_REPORT_F008.md +0 -431
- package/core/dev/pipeline/QA_REPORT_LOCAL_CLAUDE_DIAGNOSIS.md +0 -583
- package/core/dev/pipeline/README.md +0 -210
- package/core/dev/pipeline/WORKFLOW_GUIDE.md +0 -824
- package/core/dev/pipeline/archived/TASK_015_tauri_init.yaml +0 -53
- package/core/dev/pipeline/archived/TASK_016_tauri_commands.yaml +0 -54
- package/core/dev/pipeline/archived/TASK_017_rust_pty.yaml +0 -54
- package/core/dev/pipeline/archived/TASK_018_tauri_bundle.yaml +0 -53
- package/core/dev/pipeline/archived/TASK_019_release_workflow.yaml +0 -56
- package/core/dev/pipeline/archived/TASK_020_update_ui.yaml +0 -54
- package/core/dev/pipeline/archived/TASK_021_update_notification_ui.yaml +0 -55
- package/core/dev/pipeline/archived/TASK_022_remove_node_pty.yaml +0 -65
- package/core/dev/pipeline/archived/TASK_023_api_routes_migration.yaml +0 -86
- package/core/dev/pipeline/archived/TASK_024_feature_id_system.yaml +0 -51
- package/core/dev/pipeline/archived/TASK_025_executable_acceptance.yaml +0 -66
- package/core/dev/pipeline/archived/TASK_026_spec_versioning.yaml +0 -56
- package/core/dev/pipeline/archived/TASK_027_drift_detection.yaml +0 -60
- package/core/dev/pipeline/archived/TASK_028_tauri_pty_manager.yaml +0 -60
- package/core/dev/pipeline/archived/TASK_029_tauri_pty_commands.yaml +0 -62
- package/core/dev/pipeline/archived/TASK_030_frontend_session_adapter.yaml +0 -54
- package/core/dev/pipeline/archived/TASK_031_terminal_tauri_events.yaml +0 -56
- package/core/dev/pipeline/archived/TASK_041_scheduler_data_models.yaml +0 -54
- package/core/dev/pipeline/archived/TASK_042_path_lock_manager.yaml +0 -53
- package/core/dev/pipeline/archived/TASK_043_process_manager.yaml +0 -57
- package/core/dev/pipeline/archived/TASK_044_git_integration.yaml +0 -85
- package/core/dev/pipeline/archived/TASK_045_task_queue_manager.yaml +0 -54
- package/core/dev/pipeline/archived/TASK_046_scheduler_dispatcher.yaml +0 -60
- package/core/dev/pipeline/archived/TASK_047_tauri_scheduler_commands.yaml +0 -55
- package/core/dev/pipeline/archived/TASK_048_realtime_status_push.yaml +0 -92
- package/core/dev/pipeline/archived/TASK_049_frontend_scheduler_integration.yaml +0 -58
- package/core/dev/pipeline/archived/TASK_050_error_recovery.yaml +0 -56
- package/core/dev/pipeline/archived/TASK_051_optimization_proposals_backend.yaml +0 -53
- package/core/dev/pipeline/archived/TASK_052_optimization_proposals_ui.yaml +0 -58
- package/core/dev/pipeline/archived/TASK_053_optimization_proposals_diff_view.yaml +0 -54
- package/core/dev/pipeline/archived/TASK_054_multi_project_scheduler_state.yaml +0 -76
- package/core/dev/pipeline/archived/TASK_055_scheduler_api_project_scope.yaml +0 -64
- package/core/dev/pipeline/archived/TASK_056_frontend_scheduler_project_scope.yaml +0 -62
- package/core/dev/pipeline/archived/TASK_057_scheduler_module_structure.yaml +0 -54
- package/core/dev/pipeline/archived/TASK_058_scheduler_models_extract.yaml +0 -51
- package/core/dev/pipeline/archived/TASK_059_scheduler_core_extract.yaml +0 -51
- package/core/dev/pipeline/archived/TASK_060_scheduler_commands_extract.yaml +0 -51
- package/core/dev/pipeline/archived/TASK_061_scheduler_specialized_commands.yaml +0 -53
- package/core/dev/pipeline/archived/TASK_062_process_manager_module_structure.yaml +0 -56
- package/core/dev/pipeline/archived/TASK_063_process_manager_core_extract.yaml +0 -56
- package/core/dev/pipeline/archived/TASK_064_recovery_module_structure.yaml +0 -57
- package/core/dev/pipeline/archived/TASK_065_recovery_core_extract.yaml +0 -56
- package/core/dev/pipeline/archived/TASK_066_self_enhancement_scheduler_models.yaml +0 -60
- package/core/dev/pipeline/archived/TASK_067_agents_section_quick_actions.yaml +0 -53
- package/core/dev/pipeline/archived/TASK_067_self_enhancement_scheduler_core.yaml +0 -65
- package/core/dev/pipeline/archived/TASK_068_agent_workflow_rule_enhancement.yaml +0 -46
- package/core/dev/pipeline/archived/TASK_068_self_enhancement_tauri_commands.yaml +0 -61
- package/core/dev/pipeline/archived/TASK_069_agent_wizard_responsive.yaml +0 -46
- package/core/dev/pipeline/archived/TASK_069_self_enhancement_ui.yaml +0 -62
- package/core/dev/pipeline/archived/TASK_070_preview_panel_redesign.yaml +0 -62
- package/core/dev/pipeline/archived/TASK_070_self_enhancement_integration.yaml +0 -57
- package/core/dev/pipeline/archived/TASK_071_preview_panel_qa.yaml +0 -98
- package/core/dev/pipeline/archived/TASK_071_single_agent_config.yaml +0 -57
- package/core/dev/pipeline/archived/TASK_072_preview_modal_esc_fix.yaml +0 -71
- package/core/dev/pipeline/archived/TASK_072_product_review_module.yaml +0 -57
- package/core/dev/pipeline/archived/TASK_073_agents_page_component_refactor.yaml +0 -68
- package/core/dev/pipeline/archived/TASK_073_rename_single_agent.yaml +0 -64
- package/core/dev/pipeline/archived/TASK_074_preview_mode_ui_diagnosis.yaml +0 -71
- package/core/dev/pipeline/archived/TASK_074_single_agent_ui_toggle.yaml +0 -56
- package/core/dev/pipeline/archived/TASK_075_agents_page_component_refactor.yaml +0 -69
- package/core/dev/pipeline/archived/TASK_075_single_agent_integration_test.yaml +0 -75
- package/core/dev/pipeline/archived/TASK_076_preview_mode_ui_diagnosis.yaml +0 -70
- package/core/dev/pipeline/archived/TASK_076_single_agent_continuous_mode.yaml +0 -65
- package/core/dev/pipeline/archived/TASK_077_failure_directory_structure.yaml +0 -51
- package/core/dev/pipeline/archived/TASK_077_single_agent_typescript_types.yaml +0 -59
- package/core/dev/pipeline/archived/TASK_078_fail_001_agent_no_output.yaml +0 -53
- package/core/dev/pipeline/archived/TASK_078_single_agent_ui_simplify.yaml +0 -74
- package/core/dev/pipeline/archived/TASK_079_dashboard_rwd_responsive.yaml +0 -63
- package/core/dev/pipeline/archived/TASK_079_fail_002_json_bom.yaml +0 -56
- package/core/dev/pipeline/archived/TASK_080_fail_003_queue_pollution.yaml +0 -56
- package/core/dev/pipeline/archived/TASK_080_http_server_module.yaml +0 -55
- package/core/dev/pipeline/archived/TASK_081_failure_logging_tools.yaml +0 -57
- package/core/dev/pipeline/archived/TASK_081_http_api_routes.yaml +0 -62
- package/core/dev/pipeline/archived/TASK_082_frontend_api_adapter.yaml +0 -51
- package/core/dev/pipeline/archived/TASK_082_integrate_failure_to_workflow.yaml +0 -60
- package/core/dev/pipeline/archived/TASK_083_cleanup_nextjs_api.yaml +0 -48
- package/core/dev/pipeline/archived/TASK_083_task_queue_cleanup.yaml +0 -67
- package/core/dev/pipeline/archived/TASK_084_rust_dead_code_cleanup.yaml +0 -66
- package/core/dev/pipeline/archived/TASK_084_scheduler_sync_logic_fix.yaml +0 -68
- package/core/dev/pipeline/archived/TASK_085_http_api_web_mode_fixes.yaml +0 -46
- package/core/dev/pipeline/archived/TASK_085_memory_consolidation_0204_0205.yaml +0 -98
- package/core/dev/pipeline/archived/TASK_086_collapsible_preview_panel.yaml +0 -161
- package/core/dev/pipeline/archived/TASK_086_web_mode_feature_parity.yaml +0 -62
- package/core/dev/pipeline/archived/TASK_087_manual_memory_archival.yaml +0 -163
- package/core/dev/pipeline/archived/TASK_087_mobile_http_control.yaml +0 -68
- package/core/dev/pipeline/archived/TASK_088_fail_003_to_ppl_002_rule.yaml +0 -63
- package/core/dev/pipeline/archived/TASK_088_mobile_http_qa.yaml +0 -121
- package/core/dev/pipeline/archived/TASK_089_agent_collaboration_topic.yaml +0 -60
- package/core/dev/pipeline/archived/TASK_089_web_mode_monitor_fix.yaml +0 -58
- package/core/dev/pipeline/archived/TASK_090_cli_detection_fix.yaml +0 -61
- package/core/dev/pipeline/archived/TASK_090_ui_ux_lessons_topic.yaml +0 -63
- package/core/dev/pipeline/archived/TASK_091_expandable_card_design.yaml +0 -56
- package/core/dev/pipeline/archived/TASK_091_move_agent_section_components.yaml +0 -65
- package/core/dev/pipeline/archived/TASK_092_expandable_card_component.yaml +0 -60
- package/core/dev/pipeline/archived/TASK_092_refactor_agent_create_wizard.yaml +0 -84
- package/core/dev/pipeline/archived/TASK_093_taskcard_detail_integration.yaml +0 -57
- package/core/dev/pipeline/archived/TASK_093_update_barrel_exports_test.yaml +0 -84
- package/core/dev/pipeline/archived/TASK_094_ai_agent_generation_enhancement.yaml +0 -115
- package/core/dev/pipeline/archived/TASK_094_proposalcard_detail_integration.yaml +0 -55
- package/core/dev/pipeline/archived/TASK_095_preview_fixes.yaml +0 -129
- package/core/dev/pipeline/archived/TASK_095_single_agent_task_selector.yaml +0 -60
- package/core/dev/pipeline/archived/TASK_096_agents_page_ux_improvements.yaml +0 -163
- package/core/dev/pipeline/archived/TASK_096_single_agent_status_sync.yaml +0 -60
- package/core/dev/pipeline/archived/TASK_097_local_claude_error_logging.yaml +0 -59
- package/core/dev/pipeline/archived/TASK_097_single_agent_monitor_events.yaml +0 -59
- package/core/dev/pipeline/archived/TASK_098_product_manager_team_phase2.yaml +0 -60
- package/core/dev/pipeline/archived/TASK_098_single_agent_refactor_test.yaml +0 -58
- package/core/dev/pipeline/archived/TASK_099_backend_team_creation.yaml +0 -258
- package/core/dev/pipeline/archived/TASK_100_frontend_team_creation.yaml +0 -61
- package/core/dev/pipeline/archived/TASK_101_orchestrator_system.yaml +0 -403
- package/core/dev/pipeline/archived/TASK_102_designer_sre_teams.yaml +0 -90
- package/core/dev/pipeline/archived/TASK_103_integration_testing.yaml +0 -86
- package/core/dev/pipeline/archived/TASK_128_integration_testing.yaml +0 -83
- package/core/dev/pipeline/archived/TASK_134_cortex_v2_phase3_file_watcher.yaml +0 -65
- package/core/dev/pipeline/archived/TASK_134_team_http_api.yaml +0 -96
- package/core/dev/pipeline/archived/TASK_135_cortex_v2_phase3_git_monitor.yaml +0 -63
- package/core/dev/pipeline/archived/TASK_136_cortex_v2_phase3_change_analyzer.yaml +0 -69
- package/core/dev/pipeline/archived/TASK_137_cortex_v2_phase3_cache_invalidator.yaml +0 -67
- package/core/dev/pipeline/archived/TASK_137_team_orchestrator_integration.yaml +0 -93
- package/core/dev/pipeline/archived/TASK_138_cortex_v2_phase3_distributed_cache.yaml +0 -68
- package/core/dev/pipeline/archived/TASK_138_matrix_folder_structure.yaml +0 -61
- package/core/dev/pipeline/archived/TASK_139_cortex_v2_phase3_cache_prewarming.yaml +0 -65
- package/core/dev/pipeline/archived/TASK_146_unified_documentation.yaml +0 -141
- package/core/dev/pipeline/archived/TASK_147_pipeline_execution_rules.yaml +0 -76
- package/core/dev/pipeline/archived/TASK_148_update_claude_md.yaml +0 -77
- package/core/dev/pipeline/archived/TASK_149_fix_nextjs_mdx_serialization.yaml +0 -63
- package/core/dev/pipeline/archived/TASK_149_update_team_docs.yaml +0 -77
- package/core/dev/pipeline/archived/TASK_150_pipeline_workflow_guide.yaml +0 -82
- package/core/dev/pipeline/archived/TASK_164_fix_smart_context_switch.yaml +0 -49
- package/core/dev/pipeline/archived/TASK_165_ctags_symbol_index.yaml +0 -53
- package/core/dev/pipeline/archived/TASK_166_symbol_search_mcp_tool.yaml +0 -48
- package/core/dev/pipeline/archived/TASK_167_llm_module_summary.yaml +0 -55
- package/core/dev/pipeline/archived/TASK_168_map_reduce_context.yaml +0 -51
- package/core/dev/pipeline/archived/TASK_169_v2_integration_testing.yaml +0 -52
- package/core/dev/pipeline/backups/archive_2026-02-04T22-07-22/TASK_QUEUE_backup.json +0 -95
- package/core/dev/pipeline/docs/multi-agent-coordination.md +0 -446
- package/core/dev/pipeline/docs/overview.md +0 -406
- package/core/dev/pipeline/docs/task-management.md +0 -412
- package/core/dev/pipeline/docs/workflows.md +0 -32
- package/core/dev/pipeline/orchestrator/schemas/task_queue_schema.json +0 -58
- package/core/dev/pipeline/orchestrator/schemas/task_schema.json +0 -139
- package/core/dev/pipeline/plans/PLAN_task_cli_refactor.md +0 -281
- package/core/dev/pipeline/test_results/TASK_TEST_PARALLEL_002_result.txt +0 -27
- package/core/dev/plans/ANSUZ_SLIM_PLAN.md +0 -68
- package/core/dev/plans/CLI_FIRST_INSTALL_FLOW.md +0 -120
- package/core/dev/plans/FORMATION_RETIREMENT_PLAN.md +0 -313
- package/core/dev/plans/KUZU_REPLACEMENT_PLAN.md +0 -126
- package/core/dev/scripts/CRASH_DIAGNOSIS.md +0 -47
- package/core/dev/scripts/README.md +0 -142
- package/core/dev/scripts/RUN_ONCE.bat +0 -40
- package/core/dev/scripts/START_DEV_AGENT.bat +0 -63
- package/core/dev/scripts/START_MULTI_AGENT.bat +0 -80
- package/core/dev/scripts/dev_agent_scheduler.ps1 +0 -536
- package/core/dev/scripts/init_git.ps1 +0 -396
- package/core/dev/scripts/init_git.sh +0 -337
- package/core/dev/scripts/init_project.ps1 +0 -851
- package/core/dev/scripts/init_project.sh +0 -477
- package/core/dev/scripts/multi_agent_scheduler.ps1 +0 -2021
- package/core/dev/scripts/multi_agent_scheduler.sh +0 -1344
- package/core/dev/scripts/run_once.sh +0 -47
- package/core/dev/scripts/setup_rag.ps1 +0 -304
- package/core/dev/scripts/setup_rag.sh +0 -230
- package/core/dev/scripts/start_dev_agent.sh +0 -137
- package/core/dev/scripts/start_multi_agent.sh +0 -41
- package/core/dev/scripts/sync_task_queue.ps1 +0 -505
- package/core/dev/scripts/sync_task_queue.sh +0 -392
- package/core/dev/specs/agent-connect/PROTOCOL.md +0 -177
- package/core/dev/specs/agent-connect/SDK_GUIDE.md +0 -915
- package/core/dev/specs/agent-connect/examples/minimal-site/README.md +0 -137
- package/core/dev/specs/agent-connect/examples/minimal-site/package.json +0 -12
- package/core/dev/specs/agent-connect/examples/minimal-site/public/index.html +0 -116
- package/core/dev/specs/agent-connect/examples/minimal-site/public/install-redirect.js +0 -73
- package/core/dev/specs/agent-connect/examples/minimal-site/server.js +0 -516
- package/core/dev/specs/agent-connect/examples/minimal-site/test/smoke.test.mjs +0 -263
- 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
- package/core/dev/specs/agent-connect/history/DEFECT_REPORT_kenaz-agent-hub_2026-09-09_v0.4-prompt-mojibake.md +0 -90
- package/core/dev/specs/agent-connect/history/FEATURE_REQUEST_kenaz-agent-hub_2026-09-07.md +0 -61
- package/core/dev/specs/agent-connect/history/FEATURE_REQUEST_kenaz-agent-hub_2026-09-08_relay-v1-conformance.md +0 -76
- package/core/dev/specs/agent-connect/history/FEATURE_REQUEST_kenaz-agent-hub_2026-09-09_v0.4-session-channel.md +0 -87
- package/core/dev/specs/agent-connect/history/FLOWPIX_REPLY_agent-hub_2026-09-08_relay-v1-answers.md +0 -68
- package/core/dev/specs/agent-connect/history/FLOWPIX_bridge_CONTRACT.md +0 -642
- package/core/dev/specs/agent-connect/history/FLOWPIX_spikes_relay_spike_relay.mjs +0 -244
- package/core/dev/specs/agent-connect/history/KENAZ_RESPONSE_agent-hub_2026-09-07.md +0 -77
- package/core/dev/specs/agent-connect/history/KENAZ_RESPONSE_agent-hub_2026-09-08_direction-change-v0.3.md +0 -44
- package/core/dev/specs/agent-connect/history/KENAZ_RESPONSE_agent-hub_2026-09-08_relay-v1-answers-ack.md +0 -37
- package/core/dev/specs/agent-connect/history/KENAZ_RESPONSE_agent-hub_2026-09-08_relay-v1-conformance.md +0 -56
- package/core/dev/specs/agent-connect/history/KENAZ_RESPONSE_agent-hub_2026-09-09_annotations-install-coldstart.md +0 -44
- package/core/dev/specs/agent-connect/history/KENAZ_RESPONSE_agent-hub_2026-09-09_empty-prompt-first-turn.md +0 -56
- package/core/dev/specs/agent-connect/history/KENAZ_RESPONSE_agent-hub_2026-09-09_prompt-mojibake-fixed.md +0 -48
- package/core/dev/specs/agent-connect/history/KENAZ_RESPONSE_agent-hub_2026-09-09_session-channel.md +0 -57
- package/core/dev/specs/agent-connect/history/PROTOCOL_v0.3_snapshot.md +0 -379
- package/core/dev/specs/agent-connect/history/README.md +0 -47
- package/core/dev/specs/peer/CODEX_INTERACTIVE_PUSH.md +0 -65
- package/core/dev/specs/peer/CODEX_MANAGED_DAEMON.md +0 -54
- package/core/dev/specs/peer/CODEX_PEER_PULL_SPIKE.md +0 -54
- package/core/dev/specs/peer/MODS_SPIKE.md +0 -133
- package/core/dev/specs/peer/PER_PROJECT_ADDRESSING.md +0 -143
- package/core/dev/specs/peer/SWARM_PROTOCOLS.md +0 -256
- package/core/dev/specs/peer/codex-hook-shim-peer.test.js +0 -113
- package/core/dev/specs/peer/codex-push-launcher.test.js +0 -142
- package/core/dev/specs/peer/setup-codex-hooks.test.js +0 -60
- package/core/dev/specs/peer-ansuz/DELIVERY_SPIKE.md +0 -397
- package/core/dev/specs/peer-ansuz/DESIGN.md +0 -109
- package/core/dev/specs/peer-ansuz/spike/claude_poke.js +0 -129
- package/core/dev/specs/peer-ansuz/spike/claude_session_start_hook.js +0 -37
- package/core/dev/specs/peer-ansuz/spike/claude_settings_hook.json +0 -14
- package/core/dev/specs/peer-ansuz/spike/codex_appserver_client.js +0 -105
- package/core/dev/specs/peer-ansuz/spike/codex_appserver_query.js +0 -29
- package/core/dev/specs/peer-ansuz/spike/extract_timeline.js +0 -26
- package/core/dev/specs/synapse/SYMBOL_IDENTITY.md +0 -305
- package/core/dev/spikes/A4-cypher-varlen.md +0 -176
- package/core/dev/spikes/bloat-rounds.sh +0 -25
- package/core/dev/spikes/mods/clean-claude.js +0 -9
- package/core/dev/spikes/mods/drive-probe.js +0 -29
- package/core/dev/spikes/mods/e2e-peer.js +0 -71
- package/core/dev/spikes/mods/evidence/e2e-peer-control.json +0 -17
- package/core/dev/spikes/mods/evidence/e2e-peer-mod.json +0 -17
- package/core/dev/spikes/mods/evidence/probe-006a6e65-d807-4bc1-b648-fd7d1edfe0b4.jsonl +0 -4
- package/core/dev/spikes/mods/evidence/probe-cebdf1f7-f9c4-47a8-83cd-7c0786177404.jsonl +0 -12
- package/core/dev/spikes/mods/evidence/probe-eb21147d-10ce-4c32-93ed-37ca37d88d5a.jsonl +0 -11
- package/core/dev/spikes/mods/evidence/stream-cebdf1f7.jsonl +0 -18
- package/core/dev/spikes/mods/kenaz-mod-probe/.claude-plugin/plugin.json +0 -1
- package/core/dev/spikes/mods/kenaz-mod-probe/hooks/hooks.json +0 -1
- package/core/dev/spikes/mods/kenaz-mod-probe/hooks/register.ts +0 -65
- 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()"
|