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.
- 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 +6 -6
- package/core/.claude/hooks/worktree-remove.js +4 -4
- 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/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/.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 +1 -1
- 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 +21 -6
- 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 +11 -11
- package/core/dev/scripts/kenaz-session.js +3 -3
- package/core/dev/scripts/peer-identity-e2e.js +3 -3
- 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 +97 -0
- package/core/plugins/kenaz/guidance.md +1 -0
- package/core/plugins/kenaz/hooks/core-resolve.js +1 -1
- package/core/plugins/kenaz/hooks/kenaz-hook.js +52 -4
- package/core/plugins/kenaz/scripts/kenaz.test.js +72 -5
- package/lib/cli.js +9 -5
- package/package.json +6 -6
- package/vendor/install-kenaz-cli.js +21 -6
- 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
|
@@ -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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
2762
|
+
let statusSummary = statusOrder
|
|
2751
2763
|
.map(s => `${statusLabels[s]}: ${dirCounts[s] || 0}`)
|
|
2752
2764
|
.join(' | ');
|
|
2753
|
-
|
|
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
|
|
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:
|
|
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
|
|
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,
|
|
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
|
-
-
|
|
186
|
-
-
|
|
187
|
-
|
|
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.
|
|
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
|
-
"
|
|
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
|
}
|
|
@@ -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
|
|
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
|
|
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,
|
|
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
|