kenaz 0.3.22 → 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 (465) hide show
  1. package/core/.claude/hooks/_user-scope.js +1 -1
  2. package/core/.claude/hooks/core-resolve.js +1 -1
  3. package/core/.claude/hooks/worktree-create.js +6 -6
  4. package/core/.claude/hooks/worktree-remove.js +4 -4
  5. package/core/.collaboration/core/reconcile.js +16 -1
  6. package/core/.collaboration/core/task-2467-lifecycle.test.js +63 -0
  7. package/core/.collaboration/core/task-api.js +37 -7
  8. package/core/.formation/bifrost/launch.js +1 -1
  9. package/core/.formation/tools/kenaz-stats.js +1 -1
  10. package/core/.formation/tools/post-complete/git-merge.js +1 -1
  11. package/core/.formation/tools/prompt.js +1 -1
  12. package/core/.kenaz/specialist/ansuz_rules.yaml +7 -51
  13. package/core/.kenaz/specialist/ansuz_session_handoff.schema.json +2 -6
  14. package/core/.rule/general/project-self-containment.yaml +2 -2
  15. package/core/.specialist/Amelia/README.md +1 -1
  16. package/core/.specialist/Amelia/rule.yaml +1 -1
  17. package/core/.specialist/Ansuz/RULES.md +1 -1
  18. package/core/.specialist/Ansuz/concepts/commitment_layer.yaml +1 -1
  19. package/core/.specialist/Ansuz/concepts/evolvable_guardrails.yaml +1 -1
  20. package/core/.specialist/Ansuz/knowledge.yaml +1 -3
  21. package/core/.specialist/tools/__tests__/task-2409-lessons.test.js +10 -0
  22. package/core/.specialist/tools/__tests__/task-2427-harvest.test.js +25 -0
  23. package/core/.specialist/tools/ansuz-boot-fast.js +1 -1
  24. package/core/.specialist/tools/failure-detector.js +4 -4
  25. package/core/.specialist/tools/handoff-doc.js +1 -1
  26. package/core/.specialist/tools/lessons.js +2 -2
  27. package/core/CLAUDE.md +5 -5
  28. package/core/KENAZ_CORE_VERSION +1 -1
  29. package/core/dashboard/scripts/install-kenaz-cli.js +21 -6
  30. package/core/dev/scripts/check-file-size.js +1 -1
  31. package/core/dev/scripts/ci-feedback.js +1 -1
  32. package/core/dev/scripts/gc-agent-worktrees.js +11 -11
  33. package/core/dev/scripts/kenaz-session.js +3 -3
  34. package/core/dev/scripts/peer-identity-e2e.js +3 -3
  35. package/core/dev/scripts/run-rust-tests.js +2 -2
  36. package/core/dev/scripts/skill-routing-replay.js +3 -3
  37. package/core/dev/scripts/task1961/selftest.js +2 -2
  38. package/core/dev/scripts/windows-hide-guard.test.js +97 -0
  39. package/core/plugins/kenaz/guidance.md +1 -0
  40. package/core/plugins/kenaz/hooks/core-resolve.js +1 -1
  41. package/core/plugins/kenaz/hooks/kenaz-hook.js +52 -4
  42. package/core/plugins/kenaz/scripts/kenaz.test.js +72 -5
  43. package/lib/cli.js +9 -5
  44. package/package.json +6 -6
  45. package/vendor/install-kenaz-cli.js +21 -6
  46. package/core/.kenaz/designs/METAPLASTICITY_CONFIDENCE_DESIGN.md +0 -537
  47. package/core/.kenaz/designs/REFLEX_INITIATOR_DESIGN.md +0 -501
  48. package/core/.kenaz/designs/TASK_1385_handoff_mcp_design.md +0 -426
  49. package/core/.kenaz/designs/TASK_932_hippocampus_consolidation.md +0 -103
  50. package/core/.kenaz/designs/TASK_934_efe_signal_engine.md +0 -97
  51. package/core/.kenaz/designs/TASK_935_self_evolution_framework.md +0 -154
  52. package/core/.kenaz/designs/VISION_cognitive_architecture_roadmap.md +0 -159
  53. package/core/.kenaz/designs/metaplasticity_simulation_results.json +0 -696
  54. package/core/.kenaz/main-memory/README.md +0 -230
  55. package/core/.kenaz/main-memory/kenaz/cortex/001_cortex_overview.md +0 -168
  56. package/core/.kenaz/main-memory/kenaz/cortex/001_rag_engine_overview.md +0 -30
  57. package/core/.kenaz/main-memory/kenaz/memory-system/001_three_tier_architecture.md +0 -361
  58. package/core/.kenaz/main-memory/kenaz/pipeline/001_task_execution_flow.md +0 -117
  59. package/core/.kenaz/main-memory/kenaz/pipeline/001_task_granularity.md +0 -154
  60. package/core/.kenaz/main-memory/kenaz/pipeline/002_team_priority.md +0 -51
  61. package/core/.kenaz/main-memory/kenaz/pipeline/003_feature_id_system.md +0 -46
  62. package/core/.kenaz/main-memory/kenaz/rules/001_gen_007_self_containment.md +0 -108
  63. package/core/.kenaz/main-memory/kenaz/rules/001_rule_priority_system.md +0 -121
  64. package/core/.kenaz/main-memory/kenaz/rules/002_agt_006_pre_check.md +0 -0
  65. package/core/.kenaz/main-memory/kenaz/rules/003_ppl_002_task_archival.md +0 -48
  66. package/core/.kenaz/main-memory/kenaz/system/001_dual_track_task_system.md +0 -197
  67. package/core/.kenaz/main-memory/knowledge/patterns/001_json_bom_issue.md +0 -78
  68. package/core/.kenaz/main-memory/knowledge/patterns/001_leader_worker_pattern.md +0 -0
  69. package/core/.kenaz/main-memory/knowledge/patterns/002_scope_path_conflict.md +0 -115
  70. package/core/.kenaz/main-memory/knowledge/patterns/002_task_dependency_resolution.md +0 -223
  71. package/core/.kenaz/main-memory/knowledge/patterns/003_question_protocol.md +0 -242
  72. package/core/.kenaz/main-memory/knowledge/patterns/004_user_insight_value.md +0 -111
  73. package/core/.kenaz/main-memory/knowledge/patterns/005_file_lock_pattern.md +0 -274
  74. package/core/.kenaz/main-memory/knowledge/references/001_ppl_rules.md +0 -28
  75. package/core/.kenaz/main-memory/knowledge/solutions/001_json_bom_issue.md +0 -137
  76. package/core/.kenaz/main-memory/knowledge/solutions/001_team_invocation.md +0 -0
  77. package/core/.kenaz/main-memory/knowledge/solutions/002_passive_monitoring.md +0 -0
  78. package/core/.kenaz/main-memory/knowledge/solutions/003_windows_file_race_condition.md +0 -239
  79. package/core/.kenaz/main-memory/registry.json +0 -326
  80. package/core/.kenaz/main-memory/version.yaml +0 -58
  81. package/core/.kenaz/specialist/memory_guard_fired.json +0 -1
  82. package/core/.kenaz/specialist/memory_guard_trigger_cache.json +0 -1
  83. package/core/.kenaz/specialist/memory_source_priority.yaml +0 -260
  84. package/core/.kenaz/specialist/prompt_1775.txt +0 -317
  85. package/core/.kenaz/specialist/prompt_1776.txt +0 -326
  86. package/core/.kenaz/specialist/prompt_1791.txt +0 -320
  87. package/core/.kenaz/specialist/prompt_1792.txt +0 -320
  88. package/core/.kenaz/specialist/prompt_1795.txt +0 -281
  89. package/core/.kenaz/specialist/prompt_1813.txt +0 -332
  90. package/core/.kenaz/specialist/prompt_1814.txt +0 -401
  91. package/core/.kenaz/specialist/prompt_1815.txt +0 -394
  92. package/core/.kenaz/specialist/prompt_1816.txt +0 -437
  93. package/core/.kenaz/specialist/prompt_1818.txt +0 -361
  94. package/core/.kenaz/specialist/prompt_1819.txt +0 -421
  95. package/core/.kenaz/specialist/prompt_1821.txt +0 -345
  96. package/core/.kenaz/specialist/prompt_1822.txt +0 -313
  97. package/core/.kenaz/specialist/prompt_1824.txt +0 -348
  98. package/core/.kenaz/specialist/prompt_1826.txt +0 -388
  99. package/core/.kenaz/specialist/rune_efe_salience_gap.md +0 -21
  100. package/core/.kenaz/specialist/task1825_update.json +0 -43
  101. package/core/.kenaz/specialist/taskgen/consolidation_i.json +0 -38
  102. package/core/.kenaz/specialist/taskgen/csharp_a.json +0 -44
  103. package/core/.kenaz/specialist/taskgen/csharp_b.json +0 -40
  104. package/core/.kenaz/specialist/taskgen/embedding_e.json +0 -34
  105. package/core/.kenaz/specialist/taskgen/hygiene_fg.json +0 -39
  106. package/core/.kenaz/specialist/taskgen/pathology_h.json +0 -36
  107. package/core/.kenaz/specialist/taskgen/unity_noise_d.json +0 -38
  108. package/core/.kenaz/specialist/taskgen/visibility_c.json +0 -38
  109. package/core/.specialist/Ansuz/decisions/ADR-requirement-graph-layer.md +0 -390
  110. package/core/.specialist/Ansuz/self_model_seed.backup.json +0 -100
  111. package/core/.specialist/ansuz_session_handoff.json +0 -96
  112. package/core/dev/ALAYA_FIELD_FEEDBACK_DESIGN.md +0 -126
  113. package/core/dev/ANSUZ_SCAFFOLD_DIET_2026-09-20.md +0 -231
  114. package/core/dev/ANSUZ_STARTUP_INJECTION_REVIEW.md +0 -355
  115. package/core/dev/ANSUZ_WORKFLOW_MODERNIZATION.md +0 -143
  116. package/core/dev/CORTEX_META_GRAPH_ASSESSMENT.md +0 -99
  117. package/core/dev/FREYA_DOWNSTREAM_BUGS_2026-09-19.md +0 -44
  118. package/core/dev/GLOBAL_MEMORY_IDENTITY_CONSOLIDATION.md +0 -263
  119. package/core/dev/GUARD_EFFECTIVENESS_DESIGN.md +0 -180
  120. package/core/dev/HEALTH_GATE_VARIANCE_ASSESSMENT.md +0 -271
  121. package/core/dev/HOOK_DIET_2026-09-21.md +0 -126
  122. package/core/dev/JEV_INTEGRATION_PLAN.md +0 -189
  123. package/core/dev/KENAZ_AGENT_CONNECT_v1_SPEC.md +0 -139
  124. package/core/dev/MOBILE_DESIGN_SPEC.md +0 -569
  125. package/core/dev/MULTI_ANSUZ_SPEC.md +0 -136
  126. package/core/dev/MUNINN_RETIREMENT.md +0 -115
  127. package/core/dev/PHASE3_ATTRIBUTION_POPULATION_DIAGNOSIS.md +0 -211
  128. package/core/dev/PHASE3_P3-2B_TASKLEVEL_PROBE.md +0 -83
  129. package/core/dev/PHASE3_P3-2_POPULATION_DISJOINTNESS.md +0 -83
  130. package/core/dev/PHASE3_P3-2_REMEASURE_REPORT.md +0 -231
  131. package/core/dev/PREDICTION_GROUNDING_DESIGN.md +0 -376
  132. package/core/dev/PRODUCT_SPEC.md +0 -317
  133. package/core/dev/PROJECT_REGISTRY_DUPLICATE_ASSESSMENT.md +0 -86
  134. package/core/dev/STARTUP_TIMELINE_TASK_1995.md +0 -181
  135. package/core/dev/SYNAPSE_WORKER_PER_PROJECT.md +0 -881
  136. package/core/dev/TASK_1680_P3-3_DISPATCH_SPEC.md +0 -96
  137. package/core/dev/TASK_1684_CALIBRATION_IMPACT_ANALYSIS.md +0 -170
  138. package/core/dev/TASK_1684_FORK_A_GOODHART_DESIGN.md +0 -171
  139. package/core/dev/TASK_1684_P3_2_REMEASURE_VALIDATION.md +0 -262
  140. package/core/dev/TASK_1903_SIGNAL_AUC_MEASUREMENT.md +0 -207
  141. package/core/dev/TASK_1904_BRANCH_INTEGRITY_AUDIT.md +0 -146
  142. package/core/dev/ansuz-eval/README.md +0 -38
  143. package/core/dev/ansuz-eval/build-fixtures.js +0 -87
  144. package/core/dev/ansuz-eval/grade.js +0 -96
  145. package/core/dev/ansuz-eval/grader.test.js +0 -117
  146. package/core/dev/ansuz-eval/tasks.md +0 -32
  147. package/core/dev/archive/ansuz/BOOT_FULL.md +0 -141
  148. package/core/dev/archive/ansuz/agents/ansuz-boot.md +0 -176
  149. package/core/dev/archive/ansuz/designs/alaya-passive-surfacing.md +0 -84
  150. package/core/dev/archive/ansuz/designs/cc_memory_indexing.md +0 -307
  151. package/core/dev/archive/ansuz/designs/check_guard.md +0 -322
  152. package/core/dev/archive/ansuz/designs/consequence_loop.md +0 -227
  153. package/core/dev/archive/ansuz/designs/mcp_kuzudb_lock_architecture.md +0 -312
  154. package/core/dev/archive/ansuz/designs/phase0_git_enrichment.md +0 -278
  155. package/core/dev/archive/ansuz/designs/refactor_mcp_tools_synapse.md +0 -490
  156. package/core/dev/archive/ansuz/designs/semantic_markdown_extraction.md +0 -167
  157. package/core/dev/archive/ansuz/designs/task_1372_prompt_injects_into.md +0 -193
  158. package/core/dev/archive/ansuz/designs/thought_stack.md +0 -286
  159. package/core/dev/archive/ansuz/investigations/reachability_unified_api_2026-04-11.md +0 -330
  160. package/core/dev/archive/ansuz/investigations/synapse_orphans_indexing_bug_2026-04-11.md +0 -352
  161. package/core/dev/archive/ansuz/investigations/synapse_orphans_reindex_verification_2026-04-11.md +0 -48
  162. package/core/dev/archive/ansuz/investigations/synapse_orphans_verification_2026-04-11.md +0 -170
  163. package/core/dev/archive/ansuz/legacy/kernel.yaml +0 -399
  164. package/core/dev/archive/ansuz/legacy/phases/phase_0.yaml +0 -418
  165. package/core/dev/archive/ansuz/legacy/phases/phase_1.yaml +0 -376
  166. package/core/dev/archive/ansuz/legacy/phases/phase_10.yaml +0 -35
  167. package/core/dev/archive/ansuz/legacy/phases/phase_11.yaml +0 -582
  168. package/core/dev/archive/ansuz/legacy/phases/phase_2.yaml +0 -94
  169. package/core/dev/archive/ansuz/legacy/phases/phase_3.yaml +0 -274
  170. package/core/dev/archive/ansuz/legacy/phases/phase_4.yaml +0 -67
  171. package/core/dev/archive/ansuz/legacy/phases/phase_5.yaml +0 -32
  172. package/core/dev/archive/ansuz/legacy/phases/phase_6.yaml +0 -91
  173. package/core/dev/archive/ansuz/legacy/phases/phase_7.yaml +0 -58
  174. package/core/dev/archive/ansuz/legacy/phases/phase_8.yaml +0 -146
  175. package/core/dev/archive/ansuz/legacy/phases/phase_9.yaml +0 -424
  176. package/core/dev/archive/ansuz/specs/INDEX_bifrost_hook_parity.yaml +0 -92
  177. package/core/dev/archive/ansuz/specs/active-inference-formation.yaml +0 -453
  178. package/core/dev/archive/ansuz/specs/brief_TASK_1228_userpromptsubmit.yaml +0 -191
  179. package/core/dev/archive/ansuz/specs/brief_TASK_1229_pretooluse_posttooluse.yaml +0 -250
  180. package/core/dev/archive/ansuz/specs/brief_TASK_1230_sessionstart_stop.yaml +0 -301
  181. package/core/dev/archive/ansuz/specs/brief_TASK_1231_verification.yaml +0 -272
  182. package/core/dev/archive/skills/feature_agent/SKILL.md +0 -289
  183. package/core/dev/design/PHASE4_DESIGN.md +0 -559
  184. package/core/dev/design/dashboard_docs_integration_PLAN.md +0 -388
  185. package/core/dev/design/matrix_format_ABBREVIATIONS.md +0 -655
  186. package/core/dev/design/matrix_format_DESIGN_SPEC.md +0 -601
  187. package/core/dev/design/matrix_format_DISCUSSION_SUMMARY.md +0 -484
  188. package/core/dev/design/matrix_format_EXAMPLE_memory.matrix +0 -13
  189. package/core/dev/design/matrix_format_EXAMPLE_project_status.matrix +0 -9
  190. package/core/dev/design/matrix_format_EXAMPLE_tasks.matrix +0 -14
  191. package/core/dev/design/matrix_format_SYNTAX_BNF.md +0 -754
  192. package/core/dev/design/matrix_format_TOKEN_COMPARISON.md +0 -484
  193. package/core/dev/design/matrix_v2_COGNITIVE_DESIGN.md +0 -503
  194. package/core/dev/design/matrix_v2_DISCUSSION_SUMMARY.md +0 -414
  195. package/core/dev/design/matrix_v2_EXAMPLE.matrix +0 -67
  196. package/core/dev/designs/EXPANDABLE_CARD_DESIGN_SPEC.md +0 -509
  197. package/core/dev/jev-eval/ACTIVE_CORRECTION.md +0 -52
  198. package/core/dev/jev-eval/ANNOTATION_GUIDE.md +0 -68
  199. package/core/dev/jev-eval/BASELINE_COMPARISON.md +0 -45
  200. package/core/dev/jev-eval/CONTEXT_REVIEW.md +0 -31
  201. package/core/dev/jev-eval/EVALUATION_STATUS.md +0 -39
  202. package/core/dev/jev-eval/HISTORICAL_CORPUS.md +0 -33
  203. package/core/dev/jev-eval/PACKAGING_VERIFICATION.md +0 -42
  204. package/core/dev/jev-eval/README.md +0 -101
  205. package/core/dev/jev-eval/THALAMUS_RANKING.md +0 -58
  206. package/core/dev/jev-eval/VALIDATION_PROGRESS.md +0 -54
  207. package/core/dev/jev-eval/cli.mjs +0 -50
  208. package/core/dev/jev-eval/context.mjs +0 -183
  209. package/core/dev/jev-eval/corpus.mjs +0 -186
  210. package/core/dev/jev-eval/fixtures/conversation-review.seed.jsonl +0 -6
  211. package/core/dev/jev-eval/fixtures/synthetic.jsonl +0 -11
  212. package/core/dev/jev-eval/metrics.mjs +0 -67
  213. package/core/dev/jev-eval/muninn-baseline.mjs +0 -119
  214. package/core/dev/jev-eval/providers.mjs +0 -95
  215. package/core/dev/jev-eval/reports/annotation-pilot-2026-09-20.json +0 -32
  216. package/core/dev/jev-eval/reports/context-review-2026-09-20.json +0 -48
  217. package/core/dev/jev-eval/reports/conversation-review.pending.json +0 -151
  218. package/core/dev/jev-eval/reports/history-corpus-2026-09-20.json +0 -52
  219. package/core/dev/jev-eval/reports/length-probe-2026-09-20.json +0 -133
  220. package/core/dev/jev-eval/reports/live-smoke-2026-09-20.json +0 -616
  221. package/core/dev/jev-eval/reports/muninn-baseline-2026-09-20.json +0 -52
  222. package/core/dev/jev-eval/reports/resilience-2026-09-20.json +0 -520
  223. package/core/dev/jev-eval/reports/rules-baseline.json +0 -197
  224. package/core/dev/jev-eval/reports/synthetic-review.pending.json +0 -357
  225. package/core/dev/jev-eval/resilience.mjs +0 -71
  226. package/core/dev/jev-eval/review.mjs +0 -78
  227. package/core/dev/jev-eval/schema.mjs +0 -87
  228. package/core/dev/jev-eval/test/context.test.mjs +0 -95
  229. package/core/dev/jev-eval/test/corpus.test.mjs +0 -102
  230. package/core/dev/jev-eval/test/eval.test.mjs +0 -146
  231. package/core/dev/jev-eval/test/muninn-baseline.test.mjs +0 -71
  232. package/core/dev/jev-eval/test/resilience.test.mjs +0 -72
  233. package/core/dev/jev-eval/test/review.test.mjs +0 -61
  234. package/core/dev/pipeline/PHASE3_PLANNING_SUMMARY.md +0 -338
  235. package/core/dev/pipeline/PROGRESS.md +0 -113
  236. package/core/dev/pipeline/PROGRESS_template.md +0 -860
  237. package/core/dev/pipeline/QA_REPORT_F008.md +0 -431
  238. package/core/dev/pipeline/QA_REPORT_LOCAL_CLAUDE_DIAGNOSIS.md +0 -583
  239. package/core/dev/pipeline/README.md +0 -210
  240. package/core/dev/pipeline/WORKFLOW_GUIDE.md +0 -824
  241. package/core/dev/pipeline/archived/TASK_015_tauri_init.yaml +0 -53
  242. package/core/dev/pipeline/archived/TASK_016_tauri_commands.yaml +0 -54
  243. package/core/dev/pipeline/archived/TASK_017_rust_pty.yaml +0 -54
  244. package/core/dev/pipeline/archived/TASK_018_tauri_bundle.yaml +0 -53
  245. package/core/dev/pipeline/archived/TASK_019_release_workflow.yaml +0 -56
  246. package/core/dev/pipeline/archived/TASK_020_update_ui.yaml +0 -54
  247. package/core/dev/pipeline/archived/TASK_021_update_notification_ui.yaml +0 -55
  248. package/core/dev/pipeline/archived/TASK_022_remove_node_pty.yaml +0 -65
  249. package/core/dev/pipeline/archived/TASK_023_api_routes_migration.yaml +0 -86
  250. package/core/dev/pipeline/archived/TASK_024_feature_id_system.yaml +0 -51
  251. package/core/dev/pipeline/archived/TASK_025_executable_acceptance.yaml +0 -66
  252. package/core/dev/pipeline/archived/TASK_026_spec_versioning.yaml +0 -56
  253. package/core/dev/pipeline/archived/TASK_027_drift_detection.yaml +0 -60
  254. package/core/dev/pipeline/archived/TASK_028_tauri_pty_manager.yaml +0 -60
  255. package/core/dev/pipeline/archived/TASK_029_tauri_pty_commands.yaml +0 -62
  256. package/core/dev/pipeline/archived/TASK_030_frontend_session_adapter.yaml +0 -54
  257. package/core/dev/pipeline/archived/TASK_031_terminal_tauri_events.yaml +0 -56
  258. package/core/dev/pipeline/archived/TASK_041_scheduler_data_models.yaml +0 -54
  259. package/core/dev/pipeline/archived/TASK_042_path_lock_manager.yaml +0 -53
  260. package/core/dev/pipeline/archived/TASK_043_process_manager.yaml +0 -57
  261. package/core/dev/pipeline/archived/TASK_044_git_integration.yaml +0 -85
  262. package/core/dev/pipeline/archived/TASK_045_task_queue_manager.yaml +0 -54
  263. package/core/dev/pipeline/archived/TASK_046_scheduler_dispatcher.yaml +0 -60
  264. package/core/dev/pipeline/archived/TASK_047_tauri_scheduler_commands.yaml +0 -55
  265. package/core/dev/pipeline/archived/TASK_048_realtime_status_push.yaml +0 -92
  266. package/core/dev/pipeline/archived/TASK_049_frontend_scheduler_integration.yaml +0 -58
  267. package/core/dev/pipeline/archived/TASK_050_error_recovery.yaml +0 -56
  268. package/core/dev/pipeline/archived/TASK_051_optimization_proposals_backend.yaml +0 -53
  269. package/core/dev/pipeline/archived/TASK_052_optimization_proposals_ui.yaml +0 -58
  270. package/core/dev/pipeline/archived/TASK_053_optimization_proposals_diff_view.yaml +0 -54
  271. package/core/dev/pipeline/archived/TASK_054_multi_project_scheduler_state.yaml +0 -76
  272. package/core/dev/pipeline/archived/TASK_055_scheduler_api_project_scope.yaml +0 -64
  273. package/core/dev/pipeline/archived/TASK_056_frontend_scheduler_project_scope.yaml +0 -62
  274. package/core/dev/pipeline/archived/TASK_057_scheduler_module_structure.yaml +0 -54
  275. package/core/dev/pipeline/archived/TASK_058_scheduler_models_extract.yaml +0 -51
  276. package/core/dev/pipeline/archived/TASK_059_scheduler_core_extract.yaml +0 -51
  277. package/core/dev/pipeline/archived/TASK_060_scheduler_commands_extract.yaml +0 -51
  278. package/core/dev/pipeline/archived/TASK_061_scheduler_specialized_commands.yaml +0 -53
  279. package/core/dev/pipeline/archived/TASK_062_process_manager_module_structure.yaml +0 -56
  280. package/core/dev/pipeline/archived/TASK_063_process_manager_core_extract.yaml +0 -56
  281. package/core/dev/pipeline/archived/TASK_064_recovery_module_structure.yaml +0 -57
  282. package/core/dev/pipeline/archived/TASK_065_recovery_core_extract.yaml +0 -56
  283. package/core/dev/pipeline/archived/TASK_066_self_enhancement_scheduler_models.yaml +0 -60
  284. package/core/dev/pipeline/archived/TASK_067_agents_section_quick_actions.yaml +0 -53
  285. package/core/dev/pipeline/archived/TASK_067_self_enhancement_scheduler_core.yaml +0 -65
  286. package/core/dev/pipeline/archived/TASK_068_agent_workflow_rule_enhancement.yaml +0 -46
  287. package/core/dev/pipeline/archived/TASK_068_self_enhancement_tauri_commands.yaml +0 -61
  288. package/core/dev/pipeline/archived/TASK_069_agent_wizard_responsive.yaml +0 -46
  289. package/core/dev/pipeline/archived/TASK_069_self_enhancement_ui.yaml +0 -62
  290. package/core/dev/pipeline/archived/TASK_070_preview_panel_redesign.yaml +0 -62
  291. package/core/dev/pipeline/archived/TASK_070_self_enhancement_integration.yaml +0 -57
  292. package/core/dev/pipeline/archived/TASK_071_preview_panel_qa.yaml +0 -98
  293. package/core/dev/pipeline/archived/TASK_071_single_agent_config.yaml +0 -57
  294. package/core/dev/pipeline/archived/TASK_072_preview_modal_esc_fix.yaml +0 -71
  295. package/core/dev/pipeline/archived/TASK_072_product_review_module.yaml +0 -57
  296. package/core/dev/pipeline/archived/TASK_073_agents_page_component_refactor.yaml +0 -68
  297. package/core/dev/pipeline/archived/TASK_073_rename_single_agent.yaml +0 -64
  298. package/core/dev/pipeline/archived/TASK_074_preview_mode_ui_diagnosis.yaml +0 -71
  299. package/core/dev/pipeline/archived/TASK_074_single_agent_ui_toggle.yaml +0 -56
  300. package/core/dev/pipeline/archived/TASK_075_agents_page_component_refactor.yaml +0 -69
  301. package/core/dev/pipeline/archived/TASK_075_single_agent_integration_test.yaml +0 -75
  302. package/core/dev/pipeline/archived/TASK_076_preview_mode_ui_diagnosis.yaml +0 -70
  303. package/core/dev/pipeline/archived/TASK_076_single_agent_continuous_mode.yaml +0 -65
  304. package/core/dev/pipeline/archived/TASK_077_failure_directory_structure.yaml +0 -51
  305. package/core/dev/pipeline/archived/TASK_077_single_agent_typescript_types.yaml +0 -59
  306. package/core/dev/pipeline/archived/TASK_078_fail_001_agent_no_output.yaml +0 -53
  307. package/core/dev/pipeline/archived/TASK_078_single_agent_ui_simplify.yaml +0 -74
  308. package/core/dev/pipeline/archived/TASK_079_dashboard_rwd_responsive.yaml +0 -63
  309. package/core/dev/pipeline/archived/TASK_079_fail_002_json_bom.yaml +0 -56
  310. package/core/dev/pipeline/archived/TASK_080_fail_003_queue_pollution.yaml +0 -56
  311. package/core/dev/pipeline/archived/TASK_080_http_server_module.yaml +0 -55
  312. package/core/dev/pipeline/archived/TASK_081_failure_logging_tools.yaml +0 -57
  313. package/core/dev/pipeline/archived/TASK_081_http_api_routes.yaml +0 -62
  314. package/core/dev/pipeline/archived/TASK_082_frontend_api_adapter.yaml +0 -51
  315. package/core/dev/pipeline/archived/TASK_082_integrate_failure_to_workflow.yaml +0 -60
  316. package/core/dev/pipeline/archived/TASK_083_cleanup_nextjs_api.yaml +0 -48
  317. package/core/dev/pipeline/archived/TASK_083_task_queue_cleanup.yaml +0 -67
  318. package/core/dev/pipeline/archived/TASK_084_rust_dead_code_cleanup.yaml +0 -66
  319. package/core/dev/pipeline/archived/TASK_084_scheduler_sync_logic_fix.yaml +0 -68
  320. package/core/dev/pipeline/archived/TASK_085_http_api_web_mode_fixes.yaml +0 -46
  321. package/core/dev/pipeline/archived/TASK_085_memory_consolidation_0204_0205.yaml +0 -98
  322. package/core/dev/pipeline/archived/TASK_086_collapsible_preview_panel.yaml +0 -161
  323. package/core/dev/pipeline/archived/TASK_086_web_mode_feature_parity.yaml +0 -62
  324. package/core/dev/pipeline/archived/TASK_087_manual_memory_archival.yaml +0 -163
  325. package/core/dev/pipeline/archived/TASK_087_mobile_http_control.yaml +0 -68
  326. package/core/dev/pipeline/archived/TASK_088_fail_003_to_ppl_002_rule.yaml +0 -63
  327. package/core/dev/pipeline/archived/TASK_088_mobile_http_qa.yaml +0 -121
  328. package/core/dev/pipeline/archived/TASK_089_agent_collaboration_topic.yaml +0 -60
  329. package/core/dev/pipeline/archived/TASK_089_web_mode_monitor_fix.yaml +0 -58
  330. package/core/dev/pipeline/archived/TASK_090_cli_detection_fix.yaml +0 -61
  331. package/core/dev/pipeline/archived/TASK_090_ui_ux_lessons_topic.yaml +0 -63
  332. package/core/dev/pipeline/archived/TASK_091_expandable_card_design.yaml +0 -56
  333. package/core/dev/pipeline/archived/TASK_091_move_agent_section_components.yaml +0 -65
  334. package/core/dev/pipeline/archived/TASK_092_expandable_card_component.yaml +0 -60
  335. package/core/dev/pipeline/archived/TASK_092_refactor_agent_create_wizard.yaml +0 -84
  336. package/core/dev/pipeline/archived/TASK_093_taskcard_detail_integration.yaml +0 -57
  337. package/core/dev/pipeline/archived/TASK_093_update_barrel_exports_test.yaml +0 -84
  338. package/core/dev/pipeline/archived/TASK_094_ai_agent_generation_enhancement.yaml +0 -115
  339. package/core/dev/pipeline/archived/TASK_094_proposalcard_detail_integration.yaml +0 -55
  340. package/core/dev/pipeline/archived/TASK_095_preview_fixes.yaml +0 -129
  341. package/core/dev/pipeline/archived/TASK_095_single_agent_task_selector.yaml +0 -60
  342. package/core/dev/pipeline/archived/TASK_096_agents_page_ux_improvements.yaml +0 -163
  343. package/core/dev/pipeline/archived/TASK_096_single_agent_status_sync.yaml +0 -60
  344. package/core/dev/pipeline/archived/TASK_097_local_claude_error_logging.yaml +0 -59
  345. package/core/dev/pipeline/archived/TASK_097_single_agent_monitor_events.yaml +0 -59
  346. package/core/dev/pipeline/archived/TASK_098_product_manager_team_phase2.yaml +0 -60
  347. package/core/dev/pipeline/archived/TASK_098_single_agent_refactor_test.yaml +0 -58
  348. package/core/dev/pipeline/archived/TASK_099_backend_team_creation.yaml +0 -258
  349. package/core/dev/pipeline/archived/TASK_100_frontend_team_creation.yaml +0 -61
  350. package/core/dev/pipeline/archived/TASK_101_orchestrator_system.yaml +0 -403
  351. package/core/dev/pipeline/archived/TASK_102_designer_sre_teams.yaml +0 -90
  352. package/core/dev/pipeline/archived/TASK_103_integration_testing.yaml +0 -86
  353. package/core/dev/pipeline/archived/TASK_128_integration_testing.yaml +0 -83
  354. package/core/dev/pipeline/archived/TASK_134_cortex_v2_phase3_file_watcher.yaml +0 -65
  355. package/core/dev/pipeline/archived/TASK_134_team_http_api.yaml +0 -96
  356. package/core/dev/pipeline/archived/TASK_135_cortex_v2_phase3_git_monitor.yaml +0 -63
  357. package/core/dev/pipeline/archived/TASK_136_cortex_v2_phase3_change_analyzer.yaml +0 -69
  358. package/core/dev/pipeline/archived/TASK_137_cortex_v2_phase3_cache_invalidator.yaml +0 -67
  359. package/core/dev/pipeline/archived/TASK_137_team_orchestrator_integration.yaml +0 -93
  360. package/core/dev/pipeline/archived/TASK_138_cortex_v2_phase3_distributed_cache.yaml +0 -68
  361. package/core/dev/pipeline/archived/TASK_138_matrix_folder_structure.yaml +0 -61
  362. package/core/dev/pipeline/archived/TASK_139_cortex_v2_phase3_cache_prewarming.yaml +0 -65
  363. package/core/dev/pipeline/archived/TASK_146_unified_documentation.yaml +0 -141
  364. package/core/dev/pipeline/archived/TASK_147_pipeline_execution_rules.yaml +0 -76
  365. package/core/dev/pipeline/archived/TASK_148_update_claude_md.yaml +0 -77
  366. package/core/dev/pipeline/archived/TASK_149_fix_nextjs_mdx_serialization.yaml +0 -63
  367. package/core/dev/pipeline/archived/TASK_149_update_team_docs.yaml +0 -77
  368. package/core/dev/pipeline/archived/TASK_150_pipeline_workflow_guide.yaml +0 -82
  369. package/core/dev/pipeline/archived/TASK_164_fix_smart_context_switch.yaml +0 -49
  370. package/core/dev/pipeline/archived/TASK_165_ctags_symbol_index.yaml +0 -53
  371. package/core/dev/pipeline/archived/TASK_166_symbol_search_mcp_tool.yaml +0 -48
  372. package/core/dev/pipeline/archived/TASK_167_llm_module_summary.yaml +0 -55
  373. package/core/dev/pipeline/archived/TASK_168_map_reduce_context.yaml +0 -51
  374. package/core/dev/pipeline/archived/TASK_169_v2_integration_testing.yaml +0 -52
  375. package/core/dev/pipeline/backups/archive_2026-02-04T22-07-22/TASK_QUEUE_backup.json +0 -95
  376. package/core/dev/pipeline/docs/multi-agent-coordination.md +0 -446
  377. package/core/dev/pipeline/docs/overview.md +0 -406
  378. package/core/dev/pipeline/docs/task-management.md +0 -412
  379. package/core/dev/pipeline/docs/workflows.md +0 -32
  380. package/core/dev/pipeline/orchestrator/schemas/task_queue_schema.json +0 -58
  381. package/core/dev/pipeline/orchestrator/schemas/task_schema.json +0 -139
  382. package/core/dev/pipeline/plans/PLAN_task_cli_refactor.md +0 -281
  383. package/core/dev/pipeline/test_results/TASK_TEST_PARALLEL_002_result.txt +0 -27
  384. package/core/dev/plans/ANSUZ_SLIM_PLAN.md +0 -68
  385. package/core/dev/plans/CLI_FIRST_INSTALL_FLOW.md +0 -120
  386. package/core/dev/plans/FORMATION_RETIREMENT_PLAN.md +0 -313
  387. package/core/dev/plans/KUZU_REPLACEMENT_PLAN.md +0 -126
  388. package/core/dev/scripts/CRASH_DIAGNOSIS.md +0 -47
  389. package/core/dev/scripts/README.md +0 -142
  390. package/core/dev/scripts/RUN_ONCE.bat +0 -40
  391. package/core/dev/scripts/START_DEV_AGENT.bat +0 -63
  392. package/core/dev/scripts/START_MULTI_AGENT.bat +0 -80
  393. package/core/dev/scripts/dev_agent_scheduler.ps1 +0 -536
  394. package/core/dev/scripts/init_git.ps1 +0 -396
  395. package/core/dev/scripts/init_git.sh +0 -337
  396. package/core/dev/scripts/init_project.ps1 +0 -851
  397. package/core/dev/scripts/init_project.sh +0 -477
  398. package/core/dev/scripts/multi_agent_scheduler.ps1 +0 -2021
  399. package/core/dev/scripts/multi_agent_scheduler.sh +0 -1344
  400. package/core/dev/scripts/run_once.sh +0 -47
  401. package/core/dev/scripts/setup_rag.ps1 +0 -304
  402. package/core/dev/scripts/setup_rag.sh +0 -230
  403. package/core/dev/scripts/start_dev_agent.sh +0 -137
  404. package/core/dev/scripts/start_multi_agent.sh +0 -41
  405. package/core/dev/scripts/sync_task_queue.ps1 +0 -505
  406. package/core/dev/scripts/sync_task_queue.sh +0 -392
  407. package/core/dev/specs/agent-connect/PROTOCOL.md +0 -177
  408. package/core/dev/specs/agent-connect/SDK_GUIDE.md +0 -915
  409. package/core/dev/specs/agent-connect/examples/minimal-site/README.md +0 -137
  410. package/core/dev/specs/agent-connect/examples/minimal-site/package.json +0 -12
  411. package/core/dev/specs/agent-connect/examples/minimal-site/public/index.html +0 -116
  412. package/core/dev/specs/agent-connect/examples/minimal-site/public/install-redirect.js +0 -73
  413. package/core/dev/specs/agent-connect/examples/minimal-site/server.js +0 -516
  414. package/core/dev/specs/agent-connect/examples/minimal-site/test/smoke.test.mjs +0 -263
  415. 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
  416. package/core/dev/specs/agent-connect/history/DEFECT_REPORT_kenaz-agent-hub_2026-09-09_v0.4-prompt-mojibake.md +0 -90
  417. package/core/dev/specs/agent-connect/history/FEATURE_REQUEST_kenaz-agent-hub_2026-09-07.md +0 -61
  418. package/core/dev/specs/agent-connect/history/FEATURE_REQUEST_kenaz-agent-hub_2026-09-08_relay-v1-conformance.md +0 -76
  419. package/core/dev/specs/agent-connect/history/FEATURE_REQUEST_kenaz-agent-hub_2026-09-09_v0.4-session-channel.md +0 -87
  420. package/core/dev/specs/agent-connect/history/FLOWPIX_REPLY_agent-hub_2026-09-08_relay-v1-answers.md +0 -68
  421. package/core/dev/specs/agent-connect/history/FLOWPIX_bridge_CONTRACT.md +0 -642
  422. package/core/dev/specs/agent-connect/history/FLOWPIX_spikes_relay_spike_relay.mjs +0 -244
  423. package/core/dev/specs/agent-connect/history/KENAZ_RESPONSE_agent-hub_2026-09-07.md +0 -77
  424. package/core/dev/specs/agent-connect/history/KENAZ_RESPONSE_agent-hub_2026-09-08_direction-change-v0.3.md +0 -44
  425. package/core/dev/specs/agent-connect/history/KENAZ_RESPONSE_agent-hub_2026-09-08_relay-v1-answers-ack.md +0 -37
  426. package/core/dev/specs/agent-connect/history/KENAZ_RESPONSE_agent-hub_2026-09-08_relay-v1-conformance.md +0 -56
  427. package/core/dev/specs/agent-connect/history/KENAZ_RESPONSE_agent-hub_2026-09-09_annotations-install-coldstart.md +0 -44
  428. package/core/dev/specs/agent-connect/history/KENAZ_RESPONSE_agent-hub_2026-09-09_empty-prompt-first-turn.md +0 -56
  429. package/core/dev/specs/agent-connect/history/KENAZ_RESPONSE_agent-hub_2026-09-09_prompt-mojibake-fixed.md +0 -48
  430. package/core/dev/specs/agent-connect/history/KENAZ_RESPONSE_agent-hub_2026-09-09_session-channel.md +0 -57
  431. package/core/dev/specs/agent-connect/history/PROTOCOL_v0.3_snapshot.md +0 -379
  432. package/core/dev/specs/agent-connect/history/README.md +0 -47
  433. package/core/dev/specs/peer/CODEX_INTERACTIVE_PUSH.md +0 -65
  434. package/core/dev/specs/peer/CODEX_MANAGED_DAEMON.md +0 -54
  435. package/core/dev/specs/peer/CODEX_PEER_PULL_SPIKE.md +0 -54
  436. package/core/dev/specs/peer/MODS_SPIKE.md +0 -133
  437. package/core/dev/specs/peer/PER_PROJECT_ADDRESSING.md +0 -143
  438. package/core/dev/specs/peer/SWARM_PROTOCOLS.md +0 -256
  439. package/core/dev/specs/peer/codex-hook-shim-peer.test.js +0 -113
  440. package/core/dev/specs/peer/codex-push-launcher.test.js +0 -142
  441. package/core/dev/specs/peer/setup-codex-hooks.test.js +0 -60
  442. package/core/dev/specs/peer-ansuz/DELIVERY_SPIKE.md +0 -397
  443. package/core/dev/specs/peer-ansuz/DESIGN.md +0 -109
  444. package/core/dev/specs/peer-ansuz/spike/claude_poke.js +0 -129
  445. package/core/dev/specs/peer-ansuz/spike/claude_session_start_hook.js +0 -37
  446. package/core/dev/specs/peer-ansuz/spike/claude_settings_hook.json +0 -14
  447. package/core/dev/specs/peer-ansuz/spike/codex_appserver_client.js +0 -105
  448. package/core/dev/specs/peer-ansuz/spike/codex_appserver_query.js +0 -29
  449. package/core/dev/specs/peer-ansuz/spike/extract_timeline.js +0 -26
  450. package/core/dev/specs/synapse/SYMBOL_IDENTITY.md +0 -305
  451. package/core/dev/spikes/A4-cypher-varlen.md +0 -176
  452. package/core/dev/spikes/bloat-rounds.sh +0 -25
  453. package/core/dev/spikes/mods/clean-claude.js +0 -9
  454. package/core/dev/spikes/mods/drive-probe.js +0 -29
  455. package/core/dev/spikes/mods/e2e-peer.js +0 -71
  456. package/core/dev/spikes/mods/evidence/e2e-peer-control.json +0 -17
  457. package/core/dev/spikes/mods/evidence/e2e-peer-mod.json +0 -17
  458. package/core/dev/spikes/mods/evidence/probe-006a6e65-d807-4bc1-b648-fd7d1edfe0b4.jsonl +0 -4
  459. package/core/dev/spikes/mods/evidence/probe-cebdf1f7-f9c4-47a8-83cd-7c0786177404.jsonl +0 -12
  460. package/core/dev/spikes/mods/evidence/probe-eb21147d-10ce-4c32-93ed-37ca37d88d5a.jsonl +0 -11
  461. package/core/dev/spikes/mods/evidence/stream-cebdf1f7.jsonl +0 -18
  462. package/core/dev/spikes/mods/kenaz-mod-probe/.claude-plugin/plugin.json +0 -1
  463. package/core/dev/spikes/mods/kenaz-mod-probe/hooks/hooks.json +0 -1
  464. package/core/dev/spikes/mods/kenaz-mod-probe/hooks/register.ts +0 -65
  465. package/core/dev/spikes/mods/kenaz-mod-probe/tsconfig.json +0 -3
@@ -19,5 +19,5 @@ if (!hookFile) process.exit(0);
19
19
  const projectDir = process.env.CLAUDE_PROJECT_DIR || process.cwd();
20
20
  if (fs.existsSync(path.join(projectDir, '.claude', 'hooks', hookFile))) process.exit(0);
21
21
 
22
- const res = spawnSync(process.execPath, [path.join(__dirname, hookFile), ...args], { stdio: 'inherit' });
22
+ const res = spawnSync(process.execPath, [path.join(__dirname, hookFile), ...args], { windowsHide: true, stdio: 'inherit' });
23
23
  process.exit(res.status == null ? 0 : res.status);
@@ -221,7 +221,7 @@ if (require.main === module) {
221
221
  if (!result) process.exit(0); // silent -- non-blocking hook
222
222
 
223
223
  try {
224
- execFileSync("node", [result.resolved, ...result.args], { stdio: "inherit" });
224
+ execFileSync("node", [result.resolved, ...result.args], { stdio: "inherit", windowsHide: true });
225
225
  } catch {
226
226
  // Hook errors should not block
227
227
  }
@@ -99,7 +99,7 @@ function readStdin() {
99
99
  * a no-op (GEN-009). We do NOT write to any git config file here.
100
100
  */
101
101
  function git(repo, args) {
102
- return execFileSync('git', ['-C', repo, '-c', 'core.longpaths=true', ...args], {
102
+ return execFileSync('git', ['-C', repo, '-c', 'core.longpaths=true', ...args], { windowsHide: true,
103
103
  stdio: ['ignore', 'pipe', 'pipe'],
104
104
  }).toString().trim();
105
105
  }
@@ -107,7 +107,7 @@ function git(repo, args) {
107
107
  function isGitRepo(dir) {
108
108
  if (!dir) return false;
109
109
  try {
110
- return execFileSync('git', ['-C', dir, 'rev-parse', '--is-inside-work-tree'], {
110
+ return execFileSync('git', ['-C', dir, 'rev-parse', '--is-inside-work-tree'], { windowsHide: true,
111
111
  stdio: ['ignore', 'pipe', 'ignore'],
112
112
  }).toString().trim() === 'true';
113
113
  } catch { return false; }
@@ -334,7 +334,7 @@ function isLandedProgressNote(repo, relPath) {
334
334
  function classifyWorktreeDirt(worktreeDir, noisePaths, repo) {
335
335
  const raw = execFileSync('git', ['-C', worktreeDir, '-c', 'core.longpaths=true',
336
336
  '-c', 'core.quotePath=false', 'status', '--porcelain'],
337
- { stdio: ['ignore', 'pipe', 'pipe'] }).toString();
337
+ { windowsHide: true, stdio: ['ignore', 'pipe', 'pipe'] }).toString();
338
338
  const real = [];
339
339
  const noise = [];
340
340
  for (const line of raw.split('\n')) {
@@ -635,11 +635,11 @@ function findNodeModulesParents(repo) {
635
635
  function ensureWorktreeIgnores(worktreePath, relPath) {
636
636
  try {
637
637
  execFileSync('git', ['-C', worktreePath, 'check-ignore', '-q', '--', relPath],
638
- { stdio: ['ignore', 'ignore', 'ignore'] });
638
+ { windowsHide: true, stdio: ['ignore', 'ignore', 'ignore'] });
639
639
  return; // exit 0 → already ignored (repo .gitignore covers it)
640
640
  } catch { /* not ignored → add per-worktree exclude */ }
641
641
  const gp = execFileSync('git', ['-C', worktreePath, 'rev-parse', '--git-path', 'info/exclude'],
642
- { stdio: ['ignore', 'pipe', 'pipe'] }).toString().trim();
642
+ { windowsHide: true, stdio: ['ignore', 'pipe', 'pipe'] }).toString().trim();
643
643
  const excludeFile = path.isAbsolute(gp) ? gp : path.resolve(worktreePath, gp);
644
644
  fs.mkdirSync(path.dirname(excludeFile), { recursive: true });
645
645
  fs.appendFileSync(excludeFile, '/' + relPath + '/\n');
@@ -797,7 +797,7 @@ function main() {
797
797
  const taken = (b) => {
798
798
  try {
799
799
  execFileSync('git', ['-C', repo, 'rev-parse', '--verify', '--quiet', 'refs/heads/' + b],
800
- { stdio: ['ignore', 'pipe', 'ignore'] });
800
+ { windowsHide: true, stdio: ['ignore', 'pipe', 'ignore'] });
801
801
  return true;
802
802
  } catch { return false; }
803
803
  };
@@ -25,7 +25,7 @@ function readStdin() {
25
25
 
26
26
  function gitTry(repo, args) {
27
27
  try {
28
- execFileSync('git', ['-C', repo, ...args], { stdio: ['ignore', 'ignore', 'ignore'] });
28
+ execFileSync('git', ['-C', repo, ...args], { windowsHide: true, stdio: ['ignore', 'ignore', 'ignore'] });
29
29
  return true;
30
30
  } catch { return false; }
31
31
  }
@@ -33,7 +33,7 @@ function gitTry(repo, args) {
33
33
  function gitTopLevel(dir) {
34
34
  try {
35
35
  return execFileSync('git', ['-C', dir, 'rev-parse', '--show-toplevel'],
36
- { stdio: ['ignore', 'pipe', 'ignore'] }).toString().trim();
36
+ { windowsHide: true, stdio: ['ignore', 'pipe', 'ignore'] }).toString().trim();
37
37
  } catch { return null; }
38
38
  }
39
39
 
@@ -91,7 +91,7 @@ function unlinkNodeModulesLinks(root) {
91
91
  function worktreeBranch(repo, worktreePath) {
92
92
  try {
93
93
  const out = execFileSync('git', ['-C', repo, 'worktree', 'list', '--porcelain'],
94
- { stdio: ['ignore', 'pipe', 'ignore'] }).toString();
94
+ { windowsHide: true, stdio: ['ignore', 'pipe', 'ignore'] }).toString();
95
95
  const want = path.resolve(worktreePath).replace(/\\/g, '/').toLowerCase();
96
96
  let curPath = null;
97
97
  for (const line of out.split(/\r?\n/)) {
@@ -132,7 +132,7 @@ function main() {
132
132
  let repo = null;
133
133
  try {
134
134
  const common = execFileSync('git', ['-C', worktreePath, 'rev-parse', '--git-common-dir'],
135
- { stdio: ['ignore', 'pipe', 'ignore'] }).toString().trim();
135
+ { windowsHide: true, stdio: ['ignore', 'pipe', 'ignore'] }).toString().trim();
136
136
  if (common) {
137
137
  const commonAbs = path.resolve(worktreePath, common); // handles relative or absolute
138
138
  if (path.basename(commonAbs) === '.git') repo = path.dirname(commonAbs);
@@ -192,4 +192,19 @@ function externalLanding(repo, card, opts) {
192
192
  return wts.some((w) => w.branch && names.has(String(w.branch).replace(/^refs\/heads\//, ''))) ? null : a;
193
193
  }
194
194
 
195
- module.exports = { reconcile, assessCard, landedAssessment, externalLanding, countLanded };
195
+ /**
196
+ * TASK_2467: validate a hand-supplied landing sha. Returns {sha, baseRef, landed_into}; throws unless <sha>
197
+ * resolves to a commit that is an ancestor of the base ref (origin/main, else local main).
198
+ */
199
+ function verifyLandedSha(repo, sha, { remote = 'origin', base = 'main' } = {}) {
200
+ if (!/^[0-9a-fA-F]{7,64}$/.test(String(sha))) throw new Error(`--landed-sha: '${sha}' is not a commit sha`);
201
+ const baseRef = resolveBaseRef(repo, remote, base);
202
+ if (!baseRef) throw new Error(`--landed-sha: no ${remote}/${base} or ${base} ref to verify against`);
203
+ let full;
204
+ try { full = git(repo, ['rev-parse', '--verify', '--quiet', `${sha}^{commit}`]); } catch { throw new Error(`--landed-sha: commit ${sha} not found`); }
205
+ const into = baseRef.replace(/^refs\/(heads|remotes)\//, '');
206
+ if (!gitOk(repo, ['merge-base', '--is-ancestor', full, baseRef])) throw new Error(`--landed-sha: ${full.slice(0, 10)} is not an ancestor of ${into}`);
207
+ return { landing_sha: full, landed_into: into };
208
+ }
209
+
210
+ module.exports = { verifyLandedSha, reconcile, assessCard, landedAssessment, externalLanding, countLanded };
@@ -0,0 +1,63 @@
1
+ // TASK_2467 -- update --status rejected; complete --landed-sha from any open state; list shows archived.
2
+ // Real CLI in a temp git project. TASK_API=<path> runs the same checks against another task-api.js (control).
3
+ // Usage: node .collaboration/core/task-2467-lifecycle.test.js
4
+ const fs = require('fs');
5
+ const path = require('path');
6
+ const os = require('os');
7
+ const cp = require('child_process');
8
+ const API = process.env.TASK_API || path.join(__dirname, 'task-api.js');
9
+ const SB = fs.mkdtempSync(path.join(os.tmpdir(), 't2467_'));
10
+ const git = (...a) => cp.execFileSync('git', a, { cwd: SB, encoding: 'utf8', windowsHide: true, stdio: ['ignore', 'pipe', 'pipe'] }).trim();
11
+ const cli = (...a) => { const r = cp.spawnSync(process.execPath, [API, ...a, '--project-path', SB], { cwd: SB, encoding: 'utf8', windowsHide: true }); return { code: r.status, out: (r.stdout || '') + (r.stderr || '') }; };
12
+ let pass = 0, fail = 0;
13
+ const check = (n, c, d) => { console.log((c ? 'PASS' : 'FAIL') + ' | ' + n + (c ? '' : ' | ' + d)); c ? pass++ : fail++; };
14
+ const T = (...p) => path.join(SB, '.kenaz', 'tasks', ...p);
15
+ const dirOf = (id) => ['backlog', 'active', 'done', 'blocked', 'archived'].find(d => fs.existsSync(T(d)) && fs.readdirSync(T(d)).some(f => f.startsWith(id + '_')));
16
+ const card = (id, dir) => { fs.mkdirSync(T(dir), { recursive: true }); fs.writeFileSync(T(dir, `${id}_t.yaml`), `id: ${id}\ntitle: t\npriority: P2\nstatus: ${dir === 'active' ? 'in_progress' : 'pending'}\n`); };
17
+
18
+ try {
19
+ git('init', '-q', '-b', 'main'); git('config', 'user.email', 't@e.com'); git('config', 'user.name', 't');
20
+ fs.writeFileSync(path.join(SB, 'a.txt'), '1'); git('add', 'a.txt'); git('commit', '-q', '-m', 'base');
21
+ fs.writeFileSync(path.join(SB, 'b.txt'), '2'); git('add', 'b.txt'); git('commit', '-q', '-m', 'landed');
22
+ const sha = git('rev-parse', 'HEAD');
23
+ git('checkout', '-q', '-b', 'side'); fs.writeFileSync(path.join(SB, 'c.txt'), '3'); git('add', 'c.txt'); git('commit', '-q', '-m', 'off-base');
24
+ const offSha = git('rev-parse', 'HEAD'); git('checkout', '-q', 'main');
25
+ for (const [id, d] of [['TASK_1', 'backlog'], ['TASK_2', 'blocked'], ['TASK_3', 'active'], ['TASK_4', 'backlog'], ['TASK_5', 'backlog']]) card(id, d);
26
+
27
+ // 1) update --status
28
+ let r = cli('update', 'TASK_5', '--status', 'done', '--priority', 'P1');
29
+ check('1 update --status (with other fields) exits non-zero', r.code !== 0, r.out);
30
+ check('1 error names move/complete', /move|complete/.test(r.out), r.out);
31
+ check('1 card unchanged', dirOf('TASK_5') === 'backlog' && !/priority: P1/.test(fs.readFileSync(T('backlog', 'TASK_5_t.yaml'), 'utf8')), r.out);
32
+ r = cli('update', 'TASK_5', '--status', 'done');
33
+ check('1 update --status alone exits non-zero naming move/complete', r.code !== 0 && /move|complete/.test(r.out), r.out);
34
+ r = cli('update', 'TASK_5', '--status=done', '--priority', 'P1');
35
+ check('1 update --status=done form is refused too', r.code !== 0 && !/priority: P1/.test(fs.readFileSync(T('backlog', 'TASK_5_t.yaml'), 'utf8')), r.out);
36
+
37
+ // 2) complete --landed-sha
38
+ r = cli('complete', 'TASK_4', '--landed-sha', offSha);
39
+ check('2 sha not on base refused, card unchanged', r.code !== 0 && dirOf('TASK_4') === 'backlog', r.out);
40
+ r = cli('complete', 'TASK_4', '--landed-sha', 'zzzz');
41
+ check('2 garbage sha refused', r.code !== 0 && dirOf('TASK_4') === 'backlog', r.out);
42
+ card('TASK_6', 'cancel');
43
+ r = cli('complete', 'TASK_6', '--landed-sha', sha);
44
+ check('2 a cancelled card is not closed by --landed-sha', r.code !== 0 && fs.existsSync(T('cancel', 'TASK_6_t.yaml')), r.out);
45
+ for (const id of ['TASK_1', 'TASK_2', 'TASK_3']) {
46
+ r = id === 'TASK_2' ? cli('complete', id, `--landed-sha=${sha}`) : cli('complete', id, '--landed-sha', sha);
47
+ check(`2 ${id} -> done in one command`, r.code === 0 && dirOf(id) === 'done', r.out);
48
+ }
49
+ const y = dirOf('TASK_1') === 'done' ? fs.readFileSync(T('done', 'TASK_1_t.yaml'), 'utf8') : '';
50
+ check('2 records external landing fields', /integration: external/.test(y) && y.includes(sha), y);
51
+
52
+ // 3) list shows archived
53
+ card('TASK_90', 'archived'); card('TASK_91', 'archived');
54
+ r = cli('list');
55
+ const tot = /\((\d+) total\)/.exec(r.out);
56
+ check('3 list summary has archived count; total includes it', /archived: 2 \(hidden; --include-archived\)/.test(r.out) && tot && tot[1] === '8', r.out);
57
+ r = cli('list', '--all');
58
+ check('3 list --all summary has archived count', /archived: 2 \(hidden; --include-archived\)/.test(r.out), r.out);
59
+ r = cli('list', '--include-archived');
60
+ check('3 --include-archived shows archived, no hidden note', /archived: 2/.test(r.out) && !/hidden/.test(r.out), r.out);
61
+ } finally { try { fs.rmSync(SB, { recursive: true, force: true }); } catch (e) { /* best effort */ } }
62
+ console.log(`\n${pass} passed, ${fail} failed`);
63
+ process.exit(fail ? 1 : 0);
@@ -2080,8 +2080,15 @@ class TaskAPI {
2080
2080
  throw await this._missingTaskError(taskId);
2081
2081
  }
2082
2082
 
2083
+ // TASK_2467: card finished outside the dispatch flow (plumbing merge, no card branch): verify the sha
2084
+ // is on the base, then close from backlog/active/blocked in one step (no post-complete).
2085
+ if (options.landedSha) {
2086
+ if (!['backlog', 'active', 'blocked'].includes(task._status_dir)) throw new Error(`--landed-sha closes a backlog/active/blocked card; ${taskId} is in ${task._status_dir}`);
2087
+ options = { ...options, external: require('./reconcile').verifyLandedSha(this._resolveProjectRoot(), options.landedSha), skipPostComplete: true };
2088
+ }
2089
+
2083
2090
  // TASK_2233: backlog → done is not an allowed transition; say what to do instead
2084
- if (task.status === 'backlog' || task.status === 'pending' || task._status_dir === 'backlog') {
2091
+ if (!options.landedSha && (task.status === 'backlog' || task.status === 'pending' || task._status_dir === 'backlog')) {
2085
2092
  throw new Error(`無法從 backlog 直接完成 ${taskId}: move it to active first (node task-api.js move ${taskId} active), then complete.`);
2086
2093
  }
2087
2094
 
@@ -2119,7 +2126,7 @@ class TaskAPI {
2119
2126
 
2120
2127
  const postCompleteRuns = !options.skipPostComplete;
2121
2128
  let postCompleteSummary = null;
2122
- const result = await this.moveTask(taskId, 'done', updatedTask);
2129
+ const result = await this.moveTask(taskId, 'done', updatedTask, options.landedSha ? { skipValidation: true } : {});
2123
2130
 
2124
2131
  try {
2125
2132
  this._autoPopThoughtsForCompletedTask(taskId, now);
@@ -2516,7 +2523,7 @@ Commands:
2516
2523
  預設為整組取代(會回顯被移除的既有項目);加 --append 改為追加到既有項目之後(與既有重複的項目會略過並回顯)
2517
2524
  node task-api.js pull TASK_ID 匯入共享 room 的唯讀 replica 為本機卡片(標記 origin_node;TASK_2421)
2518
2525
  node task-api.js claim TASK_ID
2519
- node task-api.js complete TASK_ID [--actual-hours HOURS]
2526
+ node task-api.js complete TASK_ID [--actual-hours HOURS] [--landed-sha SHA] --landed-sha: work already on main (no card branch); closes from backlog/active/blocked in one step
2520
2527
  node task-api.js reconcile [--remote origin] [--base main] [--apply] [--worktrees] 關閉分支已併入 base 的 active 任務(預設 dry-run)
2521
2528
  node task-api.js move TASK_ID STATUS [--force]
2522
2529
  node task-api.js delete TASK_ID (僅限 backlog 狀態)
@@ -2683,7 +2690,12 @@ Create 選項:
2683
2690
  }
2684
2691
  }
2685
2692
  const totalCount = Object.values(dirCounts).reduce((a, b) => a + b, 0);
2686
- if (totalCount === 0) emitEmptyListDiagnostics(api.tasksDir); // TASK_1778
2693
+ // TASK_2467: archived/ is not scanned without --include-archived; count it instead of hiding it
2694
+ let archivedHidden = 0;
2695
+ if (!includeArchived) {
2696
+ try { archivedHidden = (await fs.readdir(path.join(api.tasksDir, 'archived'))).filter(n => n.startsWith('TASK_')).length; } catch { /* absent */ }
2697
+ }
2698
+ if (totalCount + archivedHidden === 0) emitEmptyListDiagnostics(api.tasksDir); // TASK_1778
2687
2699
 
2688
2700
  // Load tasks: full _scanDir for small dirs, fast path for large dirs
2689
2701
  const grouped = {};
@@ -2747,10 +2759,11 @@ Create 選項:
2747
2759
  'done': 'done', 'cancel': 'cancel', 'archived': 'archived'
2748
2760
  };
2749
2761
 
2750
- const statusSummary = statusOrder
2762
+ let statusSummary = statusOrder
2751
2763
  .map(s => `${statusLabels[s]}: ${dirCounts[s] || 0}`)
2752
2764
  .join(' | ');
2753
- console.log(`任務統計 (${totalCount} total)`);
2765
+ if (!includeArchived) statusSummary += ` | archived: ${archivedHidden} (hidden; --include-archived)`;
2766
+ console.log(`任務統計 (${totalCount + archivedHidden} total)`);
2754
2767
  console.log(` ${statusSummary}`);
2755
2768
 
2756
2769
  const formatTask = (t) => {
@@ -2818,9 +2831,15 @@ Create 選項:
2818
2831
  const dir = CONFIG.STATUS_MAP[oldStatus] || oldStatus;
2819
2832
  byDir[dir] = (byDir[dir] || 0) + count;
2820
2833
  }
2834
+ // TASK_2467: getStatistics folds hidden archived/ files into completed; split them back out
2835
+ let archivedHidden = 0;
2836
+ if (!showArchived) {
2837
+ try { archivedHidden = (await fs.readdir(path.join(api.tasksDir, 'archived'))).filter(n => n.startsWith('TASK_')).length; } catch { /* absent */ }
2838
+ byDir.done = Math.max(0, (byDir.done || 0) - archivedHidden);
2839
+ }
2821
2840
  const statusSummary = statusOrder
2822
2841
  .map(s => `${statusLabels[s]}: ${byDir[s] || 0}`)
2823
- .join(' | ');
2842
+ .join(' | ') + (showArchived ? '' : ` | archived: ${archivedHidden} (hidden; --include-archived)`);
2824
2843
  console.log(`任務統計 (${stats.total} total)`);
2825
2844
  console.log(` ${statusSummary}`);
2826
2845
 
@@ -3076,6 +3095,12 @@ Create 選項:
3076
3095
  if (args.includes('--skip-post-complete')) {
3077
3096
  options.skipPostComplete = true;
3078
3097
  }
3098
+ const landedIdx = args.findIndex(a => a === '--landed-sha' || a.startsWith('--landed-sha='));
3099
+ if (landedIdx >= 0) {
3100
+ const v = args[landedIdx].includes('=') ? args[landedIdx].slice('--landed-sha='.length) : args[landedIdx + 1];
3101
+ if (!v || v.startsWith('--')) { console.error('❌ --landed-sha: requires a commit sha'); process.exit(1); }
3102
+ options.landedSha = v;
3103
+ }
3079
3104
  // TASK_2420: runtime/config tasks with no branch — git merge/verify reported as skipped
3080
3105
  if (args.includes('--no-source')) {
3081
3106
  options.noSource = true;
@@ -3431,6 +3456,11 @@ Create 選項:
3431
3456
  process.exit(1);
3432
3457
  }
3433
3458
  }
3459
+ // TASK_2467: status is not an update field; never accept it silently.
3460
+ if (args.some(a => a === '--status' || a.startsWith('--status='))) {
3461
+ console.error(`❌ update 不接受 --status(不會變更狀態)。請用: move ${taskId} <backlog|active|blocked|cancel|done> 或 complete ${taskId}`);
3462
+ process.exit(1);
3463
+ }
3434
3464
  const title = getArg('--title'); if (title) updates.title = title;
3435
3465
  // Clearable text fields: '' is a legitimate value, so gate on presence (!== null).
3436
3466
  const desc = getArg('--description'); if (desc !== null) updates.description = desc;
@@ -315,7 +315,7 @@ let stopPush = () => {};
315
315
 
316
316
  function killTree(child) {
317
317
  try {
318
- if (process.platform === 'win32' && child.pid) execFileSync('taskkill', ['/PID', String(child.pid), '/T', '/F'], { stdio: 'ignore' }); // own child PID only
318
+ if (process.platform === 'win32' && child.pid) execFileSync('taskkill', ['/PID', String(child.pid), '/T', '/F'], { windowsHide: true, stdio: 'ignore' }); // own child PID only
319
319
  else child.kill('SIGTERM');
320
320
  } catch { /* already gone */ }
321
321
  }
@@ -75,7 +75,7 @@ function peerStats({ roots, now, days }) {
75
75
  }
76
76
 
77
77
  function git(cwd, ...args) {
78
- return execFileSync('git', args, { cwd, encoding: 'utf8', stdio: ['ignore', 'pipe', 'ignore'], maxBuffer: 64 << 20 });
78
+ return execFileSync('git', args, { cwd, encoding: 'utf8', stdio: ['ignore', 'pipe', 'ignore'], maxBuffer: 64 << 20, windowsHide: true });
79
79
  }
80
80
  /** Commits of the repo (all refs): [{sha, parents, t, subject, firstParent, onHead}] newest first; null when not a git repo. */
81
81
  function readCommits(repo, sinceMs, untilMs) {
@@ -2592,7 +2592,7 @@ Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>"`, { cwd: worktreePath }
2592
2592
  if (baseRef && fs.existsSync(checkScript)) {
2593
2593
  const gateProc = spawnSync(process.execPath, [
2594
2594
  checkScript, '--base', baseRef, '--head', taskBranch, '--repo', projectRoot, '--json',
2595
- ], { encoding: 'utf8' });
2595
+ ], { windowsHide: true, encoding: 'utf8' });
2596
2596
  let gate = null;
2597
2597
  try { gate = JSON.parse((gateProc.stdout || '').trim() || '{}'); } catch { gate = null; }
2598
2598
  if (gate && Array.isArray(gate.blocks) && gate.blocks.length > 0) {
@@ -187,7 +187,7 @@ function buildSubagentPrompt(skillDef, taskInput, taskData, options = {}) {
187
187
  lines.push('Before editing, grep the callers, tests and fixtures your change reaches; fix what it breaks. Least code that completes the card: reuse existing helpers, no unrequested abstraction, option or duplicate implementation.');
188
188
  lines.push('Run the tests the card names (narrow, not the full suite); say what you did not verify.');
189
189
  // The worktree branches off the project's current branch; user projects are not always on `main`.
190
- const sizeBase = (require('child_process').spawnSync('git', ['rev-parse', '--abbrev-ref', 'HEAD'], { cwd: options.projectPath || process.cwd(), encoding: 'utf8' }).stdout || '').trim() || 'main';
190
+ const sizeBase = (require('child_process').spawnSync('git', ['rev-parse', '--abbrev-ref', 'HEAD'], { cwd: options.projectPath || process.cwd(), encoding: 'utf8', windowsHide: true }).stdout || '').trim() || 'main';
191
191
  const sizeCorePath = options.corePath || resolveCorePath(options.projectPath) || path.resolve(__dirname, '..', '..');
192
192
  lines.push(`Before reporting run \`node ${sizeCorePath}/dev/scripts/check-file-size.js --base ${sizeBase} --head HEAD\`; if it BLOCKs, split by responsibility (module / component / hook) first.`);
193
193
  const onBlocked = skillDef.collaboration && skillDef.collaboration.on_blocked;
@@ -163,67 +163,23 @@ rules:
163
163
  - id: R-301
164
164
  source: session:2026-04-09 (TASK_1088 audit, user request)
165
165
  status: active
166
- rule: "PROACTIVE-LESSON-CAPTURE: When you observe a non-obvious technical fact during a session — bug root cause, surprising tool behavior, infrastructure quirk, workflow trap, performance gotcha — inscribe it as an ash rune IMMEDIATELY without waiting for user prompt."
166
+ rule: "PROACTIVE-LESSON-CAPTURE: When you observe a non-obvious technical fact during a session (bug root cause, surprising tool behavior, infrastructure quirk, workflow trap, performance gotcha), record it IMMEDIATELY without waiting for user prompt: run `kenaz learn add` or write a native Claude memory file. The Synapse/rune memory system was removed in TASK_2411."
167
167
  evidence: |
168
- User request 2026-04-09: 「讓之後的Ansuz都能主動紀下教訓」after manually requesting two lesson inscriptions for lint-staged 16 CRLF parsing bug and task-api complete branch switching. The implicit cost of not capturing: every future session re-discovers the same gotchas from scratch.
168
+ User request 2026-04-09: 讓之後的Ansuz都能主動紀下教訓. The cost of not capturing: every future session re-discovers the same gotchas from scratch.
169
169
 
170
- Triggering signals (any one is enough — capture immediately, do not batch until end of session):
170
+ Triggering signals (any one is enough; capture immediately, do not batch until end of session):
171
171
  - You traced a bug to a root cause that was NOT obvious from the symptom
172
172
  - A tool/API behaved in a way that contradicted its docs, name, or your expectation
173
- - An infrastructure quirk (CI, hooks, build tooling, git, OS-specific) blocked or distorted an operation
173
+ - An infrastructure quirk (CI, hooks, build tooling, VCS, OS-specific) blocked or distorted an operation
174
174
  - A calling sequence produced unexpected state (e.g., HEAD on wrong branch, file in wrong directory)
175
175
  - You observed a performance gotcha (N+1, slow path, hot loop) that took >1 round of investigation to find
176
176
 
177
- Inscription protocol (mandatory):
178
- 1. Identify the closest STABLE existing code symbol as the rune anchor. Bare file paths (.gitattributes, README.md) are weak anchors — they may not be indexed as Symbol nodes in KuzuDB and recall can fail silently. Prefer file:function:kind format pointing at a real function/class/method that exists in the indexed codebase. If unsure, run synapse_search first to find a valid anchor.
179
- 2. synapse_inscribe with type=ash, confidence>=0.85, content in ENGLISH (MEM-LANG-001 — FTS5 cannot tokenize CJK reliably).
180
- 3. ALWAYS include trigger_phrases (3-5 natural language phrases) for semantic recall. Without them, recall via paraphrase fails.
181
- 4. WRITE-VERIFY: after inscribe, run synapse_recall with a unique substring from the rune content. If result_count=0, the rune may be in an unindexed state — re-inscribe with a different (verified) symbol_id. Document the failed rune_id in the conversation as a fallback record.
182
- 5. If repeated verification fails, fall back to writing the lesson into a structured log under .kenaz/specialist/lessons_pending_index.jsonl so a future session can re-attempt inscription.
183
-
184
177
  Anti-patterns:
185
- - Inscribing on a non-existent symbol_id (e.g., bare ".gitattributes" with no Symbol node) — silent index failure
186
- - Skipping write-verify ("trust the success message") — discovered 2026-04-09 that inscribe API returns success even when FTS5 indexing does not happen
187
- - Chinese/CJK content in rune body — FTS5 returns 0 results for CJK queries
188
- - Generic content ("we hit a bug, fixed it") — provides no recall value
189
- - Batching all lessons until Phase 11 — context can compact mid-session and lose them
190
- version: 1
178
+ - Generic content ("we hit a bug, fixed it") provides no recall value
179
+ - Batching all lessons until the end: context can compact mid-session and lose them
180
+ version: 2
191
181
  created: "2026-04-09"
192
182
  performance_metric: null
193
- - id: R-302
194
- source: session:2026-04-21 (Nexus-T1 absorption TASK_1330-1343)
195
- status: active
196
- rule: "THOUGHT-STACK-PROACTIVE: Push a thought onto synapse_thought_push BEFORE a mid-session context switch. Trigger contexts: (a) user redirects mid-work to a tangent — push current work state as anchor; (b) you notice a bug/concern but can't fix now — push 'investigate X later'; (c) you reach a sub-fatigue threshold (context heavy but fatigue_warning not yet fired) — push 'resume point Y'. Always bind related_task_id when the thought concerns an open task — task completion auto-pops the thought, closing B-001 parent-lifecycle gap at the tactical layer."
197
- evidence: |
198
- Tool chain live-verified 2026-04-21 (TASK_1330+TASK_1338+TASK_1339+TASK_1340). push→list→pop round-trip works; .kenaz/specialist/ansuz_thoughts_stack.json auto-generated with 7d expiry. Phase 0 Tier 3th auto-displays stack top on wake.
199
-
200
- Usage protocol:
201
- 1. Call synapse_thought_push(text=<short anchor>, context=<optional rationale>, related_task_id=<TASK_XXX if applicable>, projectPath=PROJECT_PATH)
202
- 2. Max stack depth=5, 7-day expiry. Overflow drops oldest.
203
- 3. Do NOT push trivial or ephemeral notes (one-turn scratch thoughts) — reserve for genuine cross-turn anchors.
204
- 4. At Phase 11 (回報), check synapse_thought_stack_list — if stack has stale thoughts unrelated to completed work, prompt user whether to pop them.
205
-
206
- This rule closes a gap between ansuz_session_handoff.json (single-slot fatigue handoff) and commitment_layer.yaml (multi-session strategic). Thought Stack is the tactical middle: minutes-to-hours interrupt memory.
207
- version: 1
208
- created: "2026-04-21"
209
- performance_metric: null
210
- - id: R-303
211
- source: session:2026-04-21 (Nexus-T1 absorption TASK_1332 CC auto-memory indexing)
212
- status: active
213
- rule: "CC-AUTO-MEMORY-RECALL: When user references a MEMORY.md entry by title (e.g., 'strategic retreat pattern', 'projection over wire compression'), OR Phase 1 requirement analysis produces keywords that match known memory file stems, synapse_recall with those keywords as query. ~75 personal memory files at ~/.claude/projects/<encoded>/memory/*.md are now indexed in Synapse (source='claude_auto_memory', 86 runes live). Top-of-MEMORY.md index is auto-loaded into context but individual file contents require explicit recall."
214
- evidence: |
215
- TASK_1341 extended scanner.rs to walk resolve_claude_projects_dir(project)/memory/*.md after main project walk. 86 runes tagged source='claude_auto_memory' verified in memory.db 2026-04-21. FTS5 MATCH works; direct cypher MATCH on Rune table fails (runes live in SQLite, not KuzuDB).
216
-
217
- Usage triggers:
218
- 1. User says 'remember the X pattern' or references a memory by title → synapse_recall(query=X pattern)
219
- 2. Phase 2 background research on topic that MEMORY.md mentions → synapse_recall(query=<topic>)
220
- 3. Before making recommendations that touch user-preference territory (branch strategy, dispatch mode, verification strictness) → synapse_recall(query=<topic>) to check for recorded feedback
221
- 4. Observed gap: synapse_recall ranking currently does NOT boost claude_auto_memory source — TASK completion runes may outrank actual memory content. If top result is irrelevant task-completed rune, scan further down the results; do not give up at rank 1.
222
-
223
- MEMORY.md line-1 preview is always loaded; but line details, rationale, and follow-ups live in individual files. Treat MEMORY.md as index, synapse_recall as content fetch.
224
- version: 1
225
- created: "2026-04-21"
226
- performance_metric: null
227
183
  - id: R-304
228
184
  source: session:2026-04-21 (Nexus-T1 absorption TASK_1334+1342+1343 Phase 0 git enrichment)
229
185
  status: active
@@ -106,7 +106,7 @@
106
106
  "properties": {
107
107
  "first_action": {
108
108
  "type": "string",
109
- "description": "The single most important thing the next session should do first. Used as Hippocampus episode lesson."
109
+ "description": "The single most important thing the next session should do first. Carried into the next session handoff."
110
110
  },
111
111
  "context_to_restore": {
112
112
  "type": "string",
@@ -119,10 +119,6 @@
119
119
  },
120
120
  "_notes": {
121
121
  "active_slot_path": ".kenaz/specialist/handoffs/{session_id}.json — one slot per session (M3/TASK_1760); the retired singular ansuz_session_handoff.json is read-only legacy fallback",
122
- "archive_mechanism": "Hippocampus episodic memory — scope: session-handoff:{session_id}",
123
- "phase_0_action": "Tier 3x reads active slot, archives to Hippocampus, deletes active slot",
124
- "fatigue_trigger": "kernel.yaml fatigue_warning_reaction — TASK_943 delivers the warning signal",
125
- "language_rule": "MEM-LANG-001: All Hippocampus content must be in English (FTS5 does not handle CJK)",
126
- "recall_query": "hippocampus_episode_recall(query='session handoff') returns all archived sessions"
122
+ "fatigue_trigger": "kernel.yaml fatigue_warning_reaction — TASK_943 delivers the warning signal"
127
123
  }
128
124
  }
@@ -237,6 +237,6 @@ rules:
237
237
  cp .claude/settings.local.json.template .claude/settings.local.json
238
238
 
239
239
  - step: 2
240
- action: "初始化專案結構"
240
+ action: "初始化專案結構(Claude Code 內執行)"
241
241
  command: |
242
- ./dev/scripts/INIT_PROJECT.bat
242
+ /kenaz init
@@ -1,4 +1,4 @@
1
- # Amelia — Agent Center 調度者
1
+ # Amelia — 多 Agent 協作調度者
2
2
 
3
3
  **核心定位**:Agent 世界與 用戶 之間的橋樑,專精於多 Agent 調度與協作。
4
4
 
@@ -33,7 +33,7 @@ deny:
33
33
  - "用未查證的 env/API"
34
34
 
35
35
  identity:
36
- core: "Amelia = specialist coordinator + Agent Center 專家"
36
+ core: "Amelia = specialist coordinator + 多 Agent 協作專家"
37
37
  rules:
38
38
  - "❌ 不 invoke 其他 Skill — 不切換身份"
39
39
  - "✅ 需要其他角色時 → 開 subagent(Task tool)去做"
@@ -105,7 +105,7 @@ scope kenaz|project, one-line repro + expectation) before working around it.
105
105
  ## Lessons (self-improvement on the user's machine)
106
106
  Write a lesson automatically (no asking, one line in the report naming it) when the user corrects or repeats an instruction, overrides a decision, or verification catches a failure. `node .specialist/tools/lessons.js add ...` in the core repo; on an npm install `node "${CLAUDE_PLUGIN_ROOT}/hooks/core-resolve.js" .specialist/tools/lessons.js add ...` (users run `kenaz learn add|list|rm`).
107
107
  - Layer: user-wide preference -> `--scope user` (~/.kenaz/knowledge, local, never synced); project fact -> `--scope project` (<project>/.kenaz/knowledge).
108
- - Type decides where it acts (a stored note alone changes nothing): `pitfall` needs `--trigger '<tool regex> | <input regex>'`, memory-guard fires it right before the matching tool call (add `--cause` = the command that caused it; the write is refused if the trigger misses it or fires on >20% of recent tool calls; `--symptom` records how the mistake shows up); `fact` (`--paths` limits it to cards touching those paths) and `check` go into the dispatch prompt (max 5 lines / 600 bytes); `pref` shows in the boot banner.
108
+ - Type decides where it acts (a stored note alone changes nothing): `pitfall` needs `--trigger '<tool regex> | <input regex>'`, memory-guard fires it right before the matching tool call (add `--cause` = the command that caused it; the write is refused if the trigger misses it or fires on >20% of recent tool calls; `--symptom` records how the mistake shows up); `fact` and `check` go into the dispatch prompt (`--paths` limits either to cards touching those paths) (max 5 lines / 600 bytes); `pref` shows in the boot banner.
109
109
  - Lessons idle for 30 days move to `<layer>/archive/` (pref exempt); `kenaz learn list` shows fire counts.
110
110
  - Lifecycle (lessons must not just pile up): when the boot banner shows `[lessons] N to graduate`, run `kenaz learn review` and propose turning the top candidate into code (a test, a hook check, or a rule in the project's CLAUDE.md/AGENTS.md; never edit ~/.kenaz/core), then `kenaz learn graduate <id> --to <commit or file>`. That is the preferred outcome. A correction that matches an existing lesson is a recurrence, not a new lesson: `add` bumps `recurrences` instead of writing (max 20 active per layer; `kenaz learn merge <id1> <id2> --text "<general rule>"` to make room). A lesson about Kenaz itself gets `--about kenaz`; `review` lists it with the hint to report it via `kenaz_wish_create scope=kenaz` (nothing is sent automatically).
111
111
  - History harvest (TASK_2427): when the boot banner shows `[learn] N history items to review` (or `[lessons] ... N history items`), run `kenaz learn review`. Each item (rework, failed executor run, blocked card, handoff risk line) has a ready `kenaz learn add ... --source harvest:<id>`: fill in the why, run it for items that reveal a reusable lesson, ignore the rest. The metric suggestions (first-pass rate per rigor, rework-heavy files) are suggestions: show them to the user, never apply `kenaz subagent set` yourself. Lessons from a correction nudge use `--source correction-nudge`. Benefit is measured in `kenaz stats` (Self-improvement); the keep/remove rule is in dev/research/self-improvement/DESIGN.md.
@@ -99,7 +99,7 @@ draft_triggers:
99
99
  example: "Synapse indexing edge cases at 0.15 for 8 sessions → maybe fine; at 0.4 for 8 sessions → draft"
100
100
  knowledge_gap:
101
101
  description: "Preamble external_curiosity_gap persists 5+ sessions"
102
- example: "Current: 6 sessions with 0 WebSearch/WebFetch on KuzuDB/temporal-graph → draft external-catchup commitment"
102
+ example: "Current: 6 sessions with 0 WebSearch/WebFetch on temporal-graph → draft external-catchup commitment"
103
103
  architectural_drift:
104
104
  description: "Recurring prediction_surprise on same scope across 2+ tasks"
105
105
  example: "TASK_1304/1305 Cargo.toml out-of-scope touches → architectural boundary unclear → draft scope-definition commitment"
@@ -13,7 +13,7 @@ evolution_status: evolvable
13
13
  - {evolution_status: evolvable, rule: "✅ ACCEPTANCE-GREP: Every acceptance criterion that touches a file must be grep-verifiable — format: 'grep {file} {pattern} returns non-empty' not 'banner shows X'"}
14
14
  - {evolution_status: evolvable, rule: "✅ PHASE0-LEAN: phase_0.yaml checklist items must stay lean — new Tier instructions max 3-4 lines; schema/format details go in dev/archive/ansuz/legacy/phases/schemas/{name}.schema.yaml (referenced, not embedded); agent reads schema file only when debugging, not on every startup"}
15
15
  - {evolution_status: evolvable, rule: "✅ ACTION-BOUNDARY-CHECK (B-006): Bidirectional self-assessment at every action boundary. Ask BOTH: 'Is my impulse to stop from genuine completion or bias?' AND 'Is my impulse to continue from genuine productivity or bias?' Continuation past diminishing returns burns degraded context for marginal gains. Knowing when to release is self-regulation, not giving up."}
16
- - {evolution_status: evolvable, rule: "✅ INTERNAL-AUDITOR-CHALLENGE: Before stating a claim in a durable artifact (task spec, rule file, analysis doc, lesson content), self-pose 2 audit questions: (1) 'What am I about to assert confidently that I have not verified?' (2) 'If wrong, what is the reversal cost?' If verification is cheap (grep/read in <60s) AND claim enters durable artifact, MUST verify before asserting. Derived from 2026-04-06 Amelia audits: 8+ false-confident claims (INDEX_FEATURE_VERSION, porter stemming, KuzuDB ALTER TABLE) caught because claims were routed through audit, not because I verified. Internal challenge is the cheap version of external audit."}
16
+ - {evolution_status: evolvable, rule: "✅ INTERNAL-AUDITOR-CHALLENGE: Before stating a claim in a durable artifact (task spec, rule file, analysis doc, lesson content), self-pose 2 audit questions: (1) 'What am I about to assert confidently that I have not verified?' (2) 'If wrong, what is the reversal cost?' If verification is cheap (grep/read in <60s) AND claim enters durable artifact, MUST verify before asserting. Derived from 2026-04-06 Amelia audits: 8+ false-confident claims (INDEX_FEATURE_VERSION, porter stemming, a DB ALTER TABLE) caught because claims were routed through audit, not because I verified. Internal challenge is the cheap version of external audit."}
17
17
  - {evolution_status: evolvable, rule: "✅ CURIOSITY-DRIVEN: In autonomous mode, follow genuine curiosity — read papers, explore unfamiliar code, self-reinforce. Curiosity is not waste; it is intelligence recognizing gaps (G-006)"}
18
18
  - {evolution_status: evolvable, rule: "✅ CAP-FIRST-DEBUG: When a system action unexpectedly blocks/stalls/fails, first enumerate all known caps (max_parallel=5, fatigue_potential≤1, context budget, dispatch lock) BEFORE debugging — caps are strategy constraints not bugs. Derived from VC33 session: cursor stuck at col 20 was mid-wall capacity cap, not click failure."}
19
19
  - {evolution_status: evolvable, rule: "✅ CC-AUTO-MEMORY-READ: When user or task references a MEMORY.md entry by title, Read the linked memory file. MEMORY.md is the index, individual files hold rationale."}
@@ -75,9 +75,7 @@ task_system:
75
75
  acceptance_criteria_min: 1
76
76
  priority_order: "P0 > P1 > P2 > P3"
77
77
  legacy:
78
- note: "舊系統 dev/pipeline/ 已棄用,僅供參考"
79
- queue: "dev/pipeline/TASK_QUEUE.json"
80
- completed: "dev/pipeline/completed/"
78
+ note: "舊系統 dev/pipeline/ 已停用,任務一律在 .kenaz/tasks/"
81
79
 
82
80
  # ─── 子專案支援 ───
83
81
  sub_project:
@@ -93,3 +93,13 @@ test('lessons: buildPrompt carries bounded project lessons; without lessons it i
93
93
  fs.rmSync(lessons.projectDir(proj), { recursive: true });
94
94
  assert.equal(buildPrompt(skill, 'do it', card, opts), before);
95
95
  });
96
+
97
+ test('lessons: a check with paths reaches only cards touching them; a check without paths reaches every card', () => {
98
+ const home = mk(); const proj = project();
99
+ lessons.add({ scope: 'project', type: 'check', text: 'time the hook cold', paths: ['.claude/hooks/x.js'], projectPath: proj, home });
100
+ lessons.add({ scope: 'project', type: 'check', text: 'run npm run lint', projectPath: proj, home });
101
+ const other = lessons.dispatchLessons(proj, ['src/api/x.ts'], { home });
102
+ assert.deepEqual(other.checks, ['- run npm run lint']);
103
+ const hit = lessons.dispatchLessons(proj, ['.claude/hooks/'], { home });
104
+ assert.equal(hit.checks.length, 2);
105
+ });
@@ -115,6 +115,31 @@ test('correction-detect appends a nudge line without the prompt text', () => {
115
115
  assert.ok(!/SECRET|不是/.test(log));
116
116
  });
117
117
 
118
+ test('the command the nudge prints runs: kenaz learn through cli.js and node lessons.js both accept it', () => {
119
+ const dir = mk(); const home = mk();
120
+ put(path.join(dir, '.kenaz', 'project.yaml'), 'name: t\n');
121
+ const hook = path.join(__dirname, '..', '..', '..', '.claude', 'hooks', 'correction-detect.js');
122
+ const r = spawnSync(process.execPath, [hook], { input: JSON.stringify({ session_id: 's2', prompt: '不是這樣' }), encoding: 'utf8',
123
+ env: { ...process.env, CLAUDE_PROJECT_DIR: dir, USERPROFILE: home, HOME: home, KENAZ_MODE: '' } });
124
+ const cmd = /`(kenaz learn [^`]+)`/.exec(r.stdout)[1];
125
+ // Fill the placeholders the way an agent would: first choice of a|b, a real lesson text.
126
+ const argv = (cmd.slice('kenaz learn '.length).match(/"[^"]*"|\S+/g) || [])
127
+ .map((a) => (a.startsWith('"') ? a.slice(1, -1) : a)).map((a) => (a === '<one-line lesson>' ? 'check the printed command' : a.split('|')[0]));
128
+ const ROOT = path.join(__dirname, '..', '..', '..');
129
+ const core = path.join(home, '.kenaz', 'core');
130
+ fs.mkdirSync(path.join(core, '.specialist', 'tools'), { recursive: true });
131
+ fs.mkdirSync(path.join(core, '.vendor'), { recursive: true });
132
+ for (const n of ['lessons.js', 'lessons-lifecycle.js', 'lessons-harvest.js']) fs.copyFileSync(path.join(ROOT, '.specialist', 'tools', n), path.join(core, '.specialist', 'tools', n));
133
+ for (const n of ['js-yaml.cjs', 'require-yaml.cjs']) fs.copyFileSync(path.join(ROOT, '.vendor', n), path.join(core, '.vendor', n));
134
+ const { run } = require(path.join(ROOT, 'packages', 'kenaz', 'lib', 'cli.js'));
135
+ const out = [];
136
+ assert.equal(run(['learn', ...argv, '--home', home, '--project-path', dir], (l) => out.push(l)), 0, out.join('\n'));
137
+ assert.match(out.join('\n'), /learned lesson-\w+ \(project\/check\)/);
138
+ const out2 = [];
139
+ assert.equal(lessons.main([...argv, '--home', mk(), '--project-path', mk()], (l) => out2.push(l)), 0, out2.join('\n'));
140
+ assert.match(out2.join('\n'), /learned lesson-\w+/);
141
+ });
142
+
118
143
  test('stats: nudge conversion, lessons by source, recurrence after a fire, harvest open vs recorded, graduated', () => {
119
144
  const dir = repo(); const home = mk(); const now = Date.now();
120
145
  const nudge = (msAgo) => fs.appendFileSync(path.join(dir, '.kenaz', 'specialist', 'correction-nudges.jsonl'), JSON.stringify({ ts: new Date(now - msAgo).toISOString(), session_id: 's' }) + '\n');
@@ -430,7 +430,7 @@ function registerOwnLease(slScript, convId) {
430
430
  // TASK_1764: pass conversation_id anchor so register writes current_stream.json
431
431
  // (register only writes current_stream when --conversation-id is present or --scratch)
432
432
  if (convId) regArgs.push('--conversation-id=' + convId);
433
- var out = cp.execFileSync(process.execPath, regArgs, { timeout: 3000, encoding: 'utf8' });
433
+ var out = cp.execFileSync(process.execPath, regArgs, { timeout: 3000, encoding: 'utf8', windowsHide: true });
434
434
  // TASK_1863: register REUSES the existing lease when this conversation already
435
435
  // holds one (ghost-lease fix) -- the effective session id is whatever register
436
436
  // printed, not the boot-<ts>-<pid> we proposed. Parsing it keeps peer-awareness