kenaz 0.3.18 → 0.3.19
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/commands/agent-worker.md +1 -1
- package/core/.claude/commands/architect.md +1 -2
- package/core/.claude/commands/spec.md +1 -1
- package/core/.claude/commands//347/224/242/345/223/201.md +1 -1
- package/core/.claude/hooks/__tests__/task-1977-dedupe-guard.test.js +8 -8
- package/core/.claude/skills/architect_agent/SKILL.md +11 -92
- package/core/.claude/skills/assessment_agent/SKILL.md +0 -1
- package/core/.claude/skills/backend_engineer/SKILL.md +3 -6
- package/core/.claude/skills/code_reviewer/SKILL.md +1 -1
- package/core/.claude/skills/code_reviewer/patterns.yaml +1 -1
- package/core/.claude/skills/designer/SKILL.md +3 -6
- package/core/.claude/skills/dev_agent/SKILL.md +30 -491
- package/core/.claude/skills/developer/SKILL.md +3 -6
- package/core/.claude/skills/feature_agent/SKILL.md +3 -17
- package/core/.claude/skills/product_manager/SKILL.md +29 -1064
- package/core/.claude/skills/qa_engineer/SKILL.md +12 -17
- package/core/.claude/skills/spec_optimizer/SKILL.md +25 -275
- package/core/.claude/skills/sre_agent/SKILL.md +3 -6
- package/core/.collaboration/README.md +2 -3
- package/core/.collaboration/core/task-api.js +5 -138
- package/core/.collaboration/docs/CLI.md +0 -2
- package/core/.failure/INDEX.yaml +6 -40
- package/core/.failure/agent-execution/FAIL-013-search-cwd-drift-and-case-mismatch.yaml +1 -1
- package/core/.failure/tools/README.md +9 -227
- package/core/.formation/bifrost/launch.js +1 -6
- package/core/.formation/bifrost/launch.test.js +1 -1
- package/core/.formation/bifrost/shared/ansuz-boot-policy.js +3 -3
- package/core/.formation/bifrost/shared/ansuz-boot-policy.test.js +1 -2
- package/core/.formation/tools/__tests__/m1-hmap-convid.test.js +1 -124
- package/core/.formation/tools/dispatch.js +1 -1
- package/core/.formation/tools/loader.js +17 -140
- package/core/.formation/tools/post-complete.js +0 -31
- package/core/.rule/INDEX.yaml +0 -18
- package/core/.rule/general/agent-workflow.yaml +14 -164
- package/core/.rule/general/project-self-containment.yaml +8 -19
- package/core/.rule/general/rust-verify-target.yaml +6 -5
- package/core/.rule/general/synapse-code-intelligence.yaml +3 -3
- package/core/.specialist/Amelia/capability.yaml +12 -12
- package/core/.specialist/Amelia/workflow.yaml +2 -2
- package/core/.specialist/Ansuz/SYSTEM_DOC.md +20 -578
- package/core/.specialist/Ansuz/cognitive_principles.yaml +2 -3
- package/core/.specialist/Ansuz/concepts/boot_rules_summary.yaml +0 -1
- package/core/.specialist/Ansuz/concepts/deep_knowledge_pointers.yaml +1 -2
- package/core/.specialist/Ansuz/core.yaml +6 -108
- package/core/.specialist/Ansuz/guards/lesson_guards.yaml +0 -3
- package/core/.specialist/Ansuz/identity_contract.yaml +0 -1
- package/core/.specialist/Ansuz/knowledge.yaml +0 -4
- package/core/.specialist/Ansuz/rule.yaml +0 -1
- package/core/.specialist/Ansuz/tools/handoff-session-identity.test.js +6 -150
- package/core/.specialist/tests/runtime-discovery/README.md +1 -1
- package/core/.specialist/tools/__tests__/task-2374-usage-counter.test.js +1 -12
- package/core/.specialist/tools/prompt-files.test.js +1 -0
- package/core/.specialist/tools/task-bridge.js +1 -66
- package/core/.system/README.md +11 -552
- package/core/.system/collaboration/README.md +10 -174
- package/core/CLAUDE.md +1 -6
- package/core/KENAZ_CORE_VERSION +1 -1
- package/core/dev/scripts/js-yaml-resolution.test.js +1 -1
- package/core/dev/scripts/run-rust-tests.js +9 -45
- package/core/dev/scripts/rust-verify-worktree.js +4 -4
- package/core/dev/scripts/verify-target-dir.js +6 -6
- package/core/plugins/kenaz/INVENTORY.md +8 -8
- package/core/plugins/kenaz/commands/architect.md +1 -2
- package/core/plugins/kenaz/commands/spec.md +1 -1
- package/core/plugins/kenaz/commands//347/224/242/345/223/201.md +1 -1
- package/core/plugins/kenaz/guidance.md +1 -1
- package/core/plugins/kenaz/scripts/sync.js +1 -1
- package/core/plugins/kenaz/skills/architect_agent/SKILL.md +11 -92
- package/core/plugins/kenaz/skills/assessment_agent/SKILL.md +0 -1
- package/core/plugins/kenaz/skills/backend_engineer/SKILL.md +3 -6
- package/core/plugins/kenaz/skills/code_reviewer/SKILL.md +1 -1
- package/core/plugins/kenaz/skills/code_reviewer/patterns.yaml +1 -1
- package/core/plugins/kenaz/skills/designer/SKILL.md +3 -6
- package/core/plugins/kenaz/skills/dev_agent/SKILL.md +30 -491
- package/core/plugins/kenaz/skills/developer/SKILL.md +3 -6
- package/core/plugins/kenaz/skills/feature_agent/SKILL.md +3 -17
- package/core/plugins/kenaz/skills/product_manager/SKILL.md +29 -1064
- package/core/plugins/kenaz/skills/qa_engineer/SKILL.md +12 -17
- package/core/plugins/kenaz/skills/spec_optimizer/SKILL.md +25 -275
- package/core/plugins/kenaz/skills/sre_agent/SKILL.md +3 -6
- package/package.json +6 -6
- package/core/.claude/commands/archive.md +0 -24
- package/core/.claude/commands/init.md +0 -112
- package/core/.claude/commands/legacy_dev.md +0 -18
- package/core/.claude/commands/product-review.md +0 -131
- package/core/.claude/commands/strategy.md +0 -141
- package/core/.claude/commands/sunny.md +0 -1
- package/core/.claude/commands//347/224/242/345/223/201/346/252/242/350/246/226.md +0 -129
- package/core/.claude/commands//351/200/262/345/272/246.md +0 -15
- package/core/.claude/hooks/__tests__/substrate.test.js +0 -122
- package/core/.claude/hooks/_substrate-paths.js +0 -95
- package/core/.claude/hooks/context-check.js +0 -51
- package/core/.claude/hooks/fatigue-check.js +0 -52
- package/core/.claude/hooks/handoff-snapshot-on-commit.js +0 -154
- package/core/.claude/hooks/handoff-snapshot-on-question.js +0 -158
- package/core/.claude/hooks/handoff-staleness.js +0 -197
- package/core/.claude/hooks/jev-thalamus-context.js +0 -17
- package/core/.claude/hooks/jev-thalamus-context.test.js +0 -41
- package/core/.claude/hooks/lease-release.js +0 -119
- package/core/.claude/hooks/lease-touch.js +0 -96
- package/core/.claude/hooks/reflex-feedback.js +0 -5
- package/core/.claude/hooks/session-init.ps1 +0 -49
- package/core/.claude/hooks/sound-event.js +0 -70
- package/core/.claude/hooks/sound-event.sh +0 -37
- package/core/.claude/hooks/stream-delta.js +0 -169
- package/core/.claude/no-hooks.settings.json +0 -3
- package/core/.claude/skills/legacy_dev/SKILL.md +0 -202
- package/core/.claude/skills/sunny/SKILL.md +0 -74
- package/core/.collaboration/cli/commands/assign.js +0 -39
- package/core/.collaboration/cli/commands/claim.js +0 -33
- package/core/.collaboration/cli/commands/complete.js +0 -44
- package/core/.collaboration/cli/commands/create.js +0 -110
- package/core/.collaboration/cli/commands/get.js +0 -83
- package/core/.collaboration/cli/commands/index.js +0 -52
- package/core/.collaboration/cli/commands/list.js +0 -51
- package/core/.collaboration/cli/commands/lock.js +0 -45
- package/core/.collaboration/cli/commands/rebuild.js +0 -39
- package/core/.collaboration/cli/commands/search.js +0 -61
- package/core/.collaboration/cli/commands/stats.js +0 -61
- package/core/.collaboration/cli/commands/transfer.js +0 -41
- package/core/.collaboration/cli/commands/unlock.js +0 -48
- package/core/.collaboration/cli/formatters/help-formatter.js +0 -70
- package/core/.collaboration/cli/formatters/index.js +0 -7
- package/core/.collaboration/cli/task-cli.js +0 -46
- package/core/.collaboration/cli/utils/arg-parser.js +0 -74
- package/core/.collaboration/cli/utils/git-user.js +0 -25
- package/core/.collaboration/cli/utils/index.js +0 -9
- package/core/.collaboration/cli/utils/output.js +0 -10
- package/core/.collaboration/config/default.yaml +0 -189
- package/core/.collaboration/core/conflict-resolver.js +0 -461
- package/core/.collaboration/core/conflict-resolver.test.js +0 -389
- package/core/.collaboration/core/migrate-legacy.js +0 -260
- package/core/.collaboration/docs/API.md +0 -787
- package/core/.collaboration/docs/ARCHITECTURE.md +0 -596
- package/core/.collaboration/docs/FAQ.md +0 -695
- package/core/.collaboration/docs/MIGRATION.md +0 -804
- package/core/.collaboration/docs/examples/README.md +0 -320
- package/core/.collaboration/docs/examples/advanced-queries.js +0 -261
- package/core/.collaboration/docs/examples/basic-usage.js +0 -184
- package/core/.collaboration/docs/examples/team-workflow.js +0 -352
- package/core/.failure/agent-execution/FAIL-001-agent-no-output.yaml +0 -391
- package/core/.failure/agent-execution/FAIL-007-pm-lead-wrong-team-invocation.yaml +0 -0
- package/core/.failure/agent-execution/FAIL-010-phase0-poem-format-skipped.yaml +0 -28
- package/core/.failure/agent-execution/FAIL-010-skipping-cognitive-checkpoint-after-verification.yaml +0 -59
- package/core/.failure/agent-execution/FAIL-012-grep-shortcut-during-investigation.yaml +0 -85
- package/core/.failure/architecture/FAIL-006-python-version-compatibility.yaml +0 -445
- package/core/.failure/pipeline/FAIL-003-queue-pollution.yaml +0 -335
- package/core/.failure/pipeline/README.md +0 -95
- package/core/.failure/retired/FAIL-009-skipping-synapse-pulse-before-code-change.yaml +0 -49
- package/core/.failure/tools/USAGE_GUIDE.md +0 -323
- package/core/.failure/tools/check_failures.ps1 +0 -387
- package/core/.failure/tools/log_failure.ps1 +0 -474
- package/core/.formation/.episode-input.json +0 -10
- package/core/.formation/.merge-lock +0 -1
- package/core/.formation/lead.yaml +0 -118
- package/core/.formation/legacy.bak/designer.yaml +0 -57
- package/core/.formation/legacy.bak/pm.yaml +0 -57
- package/core/.formation/legacy.bak/qa.yaml +0 -57
- package/core/.formation/legacy.bak/review.yaml +0 -62
- package/core/.formation/legacy.bak/scheduler.yaml +0 -129
- package/core/.formation/legacy.bak/sre.yaml +0 -57
- package/core/.formation/role-map.yaml +0 -274
- package/core/.formation/roles/_shared/modules/code_review.yaml +0 -98
- package/core/.formation/roles/_shared/modules/security.yaml +0 -103
- package/core/.formation/roles/_shared/modules/testing.yaml +0 -14
- package/core/.formation/roles/backend/role.yaml +0 -93
- package/core/.formation/roles/code_reviewer/role.yaml +0 -102
- package/core/.formation/roles/database_optimizer/role.yaml +0 -107
- package/core/.formation/roles/designer/role.yaml +0 -66
- package/core/.formation/roles/developer/role.yaml +0 -75
- package/core/.formation/roles/frontend/role.yaml +0 -134
- package/core/.formation/roles/incident_response/role.yaml +0 -89
- package/core/.formation/roles/qa/role.yaml +0 -89
- package/core/.formation/roles/security/role.yaml +0 -87
- package/core/.formation/roles/sre/role.yaml +0 -66
- package/core/.formation/skills/coordinator.yaml +0 -52
- package/core/.formation/solo/diagnosis.yaml +0 -78
- package/core/.formation/solo/strategy.yaml +0 -121
- package/core/.formation/tests/hello.txt +0 -2
- package/core/.formation/tools/coordinator.js +0 -350
- package/core/.formation/tools/jev-correction.js +0 -214
- package/core/.formation/tools/jev-correction.test.js +0 -178
- package/core/.formation/tools/log-reader.js +0 -232
- package/core/.formation/tools/revert-daemon-state.js +0 -162
- package/core/.formation/tools/test-drift.js +0 -148
- package/core/.formation/unit/heimdall.yaml +0 -96
- package/core/.formation/unit/plan.yaml +0 -67
- package/core/.formation/unit/think.yaml +0 -58
- package/core/.kenaz/MUNINN_SNAPSHOT9_EPISODE.json +0 -32
- package/core/.kenaz/MUNINN_SNAPSHOT9_RUNE.json +0 -23
- package/core/.kenaz/MUNINN_SNAPSHOT9_SUMMARY.md +0 -89
- package/core/.kenaz/ash_TASK_1428-20260507.json +0 -14
- package/core/.kenaz/muninn_episode_write.ps1 +0 -17
- package/core/.kenaz/muninn_snapshot11_rune_candidates.md +0 -63
- package/core/.kenaz/muninn_snapshot1_rune_candidates.md +0 -49
- package/core/.kenaz/runes_TASK_1428.json +0 -57
- package/core/.kenaz/tmp_heimdall_proposal_8d3e392.json +0 -13
- package/core/.kenaz/tmp_props.json +0 -1
- package/core/.kenaz/tmp_sounddrop_t1_prompt.txt +0 -371
- package/core/.rule/MECHANIZED.md +0 -61
- package/core/.rule/general/cortex-memory-recall.yaml +0 -446
- package/core/.rule/general/pipeline.yaml +0 -246
- package/core/.rule/general/sunny-access-control.yaml +0 -60
- package/core/.rule/general/system-invariants.yaml +0 -231
- package/core/.rule/pipeline/PPL-002-completed-task-archival.yaml +0 -528
- package/core/.rule/pipeline/auto-update.yaml +0 -282
- package/core/.rule/pipeline/task-execution.yaml +0 -365
- package/core/.specialist/Ansuz/concepts/phase_protocol.yaml +0 -65
- package/core/.specialist/Ansuz/experiments/boot_ablation_replay.js +0 -197
- package/core/.specialist/Ansuz/tools/bootstrap-anchors.js +0 -289
- package/core/.specialist/Ansuz/workflow.yaml +0 -1225
- package/core/.specialist/experiments/rg_benchmark.js +0 -523
- package/core/.specialist/experiments/rg_benchmark_results.json +0 -27
- package/core/.specialist/tools/jev-optional-context.js +0 -107
- package/core/.specialist/tools/jev-optional-context.test.js +0 -152
- package/core/.specialist/tools/memory-action-log.js +0 -839
- package/core/.specialist/tools/phase-gate.js +0 -3534
- package/core/.specialist/tools/phase-gate.test.js +0 -85
- package/core/.specialist/tools/precompute-runner.js +0 -444
- package/core/.specialist/tools/rule-engine.js +0 -621
- package/core/.specialist/tools/task-bridge-jev.test.js +0 -170
- package/core/.synapse/memory-shared.json.sync +0 -1
- package/core/.system/agent-skills/README.md +0 -724
- package/core/.system/cli-tools/README.md +0 -724
- package/core/.system/cortex/MODULES.md +0 -1046
- package/core/.system/dashboard/FRONTEND.md +0 -812
- package/core/.system/dashboard/README.md +0 -737
- package/core/.system/failure/README.md +0 -723
- package/core/.system/formation/LEGACY_SKILLS.md +0 -974
- package/core/.system/formation/POST_COMPLETE.md +0 -602
- package/core/.system/formation/README.md +0 -1094
- package/core/.system/formation/TOOLS_REFERENCE.md +0 -1145
- package/core/.system/kenaz/README.md +0 -787
- package/core/.system/memory/README.md +0 -719
- package/core/.system/pipeline/README.md +0 -712
- package/core/.system/rule/README.md +0 -794
- package/core/.system/sunny/README.md +0 -476
- package/core/.system/sunny/RULES.json +0 -89
- package/core/.system/sunny/knowledge/INDEX.md +0 -37
- package/core/.system/sunny/knowledge/agent-teams-api.md +0 -0
- package/core/.system/sunny/knowledge/ansuz-specialist.md +0 -500
- package/core/.system/sunny/knowledge/claude-cli-spawn.md +0 -177
- package/core/.system/sunny/knowledge/collaboration-api.md +0 -925
- package/core/.system/sunny/teammates/README.md +0 -107
- package/core/.system/sunny/teammates/how_to_use.yaml +0 -101
- package/core/.system/sunny/teammates/tools/headless/launcher.js +0 -318
- package/core/.system/sunny/teammates/tools/powershell/launcher.js +0 -241
- package/core/.system/sunny/teammates/tools/powershell/start.bat +0 -50
- package/core/.system/sunny/teammates/tools/utils/env.js +0 -96
- package/core/.system/sunny/teammates/tools/utils/format-output.js +0 -329
- package/core/.system/sunny/tools.json +0 -101
- package/core/dev/scripts/cleanup-queue.js +0 -184
- package/core/dev/scripts/cleanup_queue.js +0 -86
- package/core/dev/scripts/legacy/README.md +0 -39
- package/core/dev/scripts/legacy/dev_agent_scheduler.ps1.bak +0 -536
- package/core/dev/scripts/legacy/multi_agent_scheduler.ps1.bak +0 -1978
- package/core/dev/scripts/matrix/CLI_README.md +0 -214
- package/core/dev/scripts/matrix/README.md +0 -310
- package/core/dev/scripts/matrix/package-lock.json +0 -4266
- package/core/dev/scripts/matrix/package.json +0 -55
- package/core/dev/scripts/matrix/src/abbreviations.ts +0 -295
- package/core/dev/scripts/matrix/src/cli/commands/convert.ts +0 -211
- package/core/dev/scripts/matrix/src/cli/commands/create.ts +0 -95
- package/core/dev/scripts/matrix/src/cli/commands/delete.ts +0 -102
- package/core/dev/scripts/matrix/src/cli/commands/list-tags.ts.wip +0 -140
- package/core/dev/scripts/matrix/src/cli/commands/manage-tags.ts.wip +0 -173
- package/core/dev/scripts/matrix/src/cli/commands/query.ts +0 -261
- package/core/dev/scripts/matrix/src/cli/commands/read.ts +0 -77
- package/core/dev/scripts/matrix/src/cli/commands/stats.ts.wip +0 -168
- package/core/dev/scripts/matrix/src/cli/commands/tokens.ts.wip +0 -126
- package/core/dev/scripts/matrix/src/cli/commands/update.ts +0 -147
- package/core/dev/scripts/matrix/src/cli/commands/validate.ts +0 -275
- package/core/dev/scripts/matrix/src/cli/index.ts +0 -350
- package/core/dev/scripts/matrix/src/cli/utils/file-handler.ts +0 -72
- package/core/dev/scripts/matrix/src/cli/utils/logger.ts +0 -65
- package/core/dev/scripts/matrix/src/index.ts +0 -62
- package/core/dev/scripts/matrix/src/indexer/tag-indexer.ts +0 -165
- package/core/dev/scripts/matrix/src/parser.ts +0 -281
- package/core/dev/scripts/matrix/src/serializer.ts +0 -151
- package/core/dev/scripts/matrix/src/validator.ts +0 -301
- package/core/dev/scripts/matrix/tests/abbreviations.test.ts +0 -122
- package/core/dev/scripts/matrix/tests/cli.test.ts +0 -177
- package/core/dev/scripts/matrix/tests/convert.test.ts +0 -143
- package/core/dev/scripts/matrix/tests/parser.test.ts +0 -203
- package/core/dev/scripts/matrix/tests/query.test.ts +0 -85
- package/core/dev/scripts/matrix/tests/serializer.test.ts +0 -197
- package/core/dev/scripts/matrix/tests/validate.test.ts +0 -141
- package/core/dev/scripts/matrix/tests/validator.test.ts +0 -167
- package/core/dev/scripts/matrix/tsconfig.json +0 -20
- package/core/dev/scripts/matrix/types/index.d.ts +0 -111
- package/core/dev/scripts/matrix/types/index.d.ts.map +0 -1
- package/core/dev/scripts/matrix/types/index.js +0 -8
- package/core/dev/scripts/matrix/types/index.js.map +0 -1
- package/core/dev/scripts/matrix/types/index.ts +0 -124
- package/core/dev/scripts/memory-usage-report.js +0 -152
- package/core/dev/scripts/probe/ansuz-scaffold-ablation.js +0 -579
- package/core/dev/scripts/probe/ansuz-scaffold-ablation.test.js +0 -244
- package/core/dev/scripts/probe/hook-latency-probe.js +0 -315
- package/core/dev/scripts/probe/hook-latency-probe.test.js +0 -105
- package/core/dev/scripts/probe/prediction-signal-auc.js +0 -483
- package/core/dev/scripts/probe/prediction-signal-auc.test.js +0 -200
- package/core/dev/scripts/test-pty-ws-tunnel.js +0 -229
- package/core/dev/scripts/validate_pipeline.js +0 -197
- package/core/dev/spikes/task2145-evidence-20261004/backend-log-excerpt.txt +0 -56
- package/core/dev/spikes/task2145-evidence-20261004/graph.shadow +0 -0
- package/core/dev/spikes/task2145-evidence-20261004/graph.wal +0 -0
- package/core/dev/spikes/task2145-evidence-20261004/graph_corrupt_suspect.marker +0 -1
- package/core/plugins/kenaz/commands/strategy.md +0 -141
package/core/.failure/INDEX.yaml
CHANGED
|
@@ -41,11 +41,6 @@ categories:
|
|
|
41
41
|
description: "架構決策失敗(設計缺陷、技術選型錯誤)"
|
|
42
42
|
icon: "🏗️"
|
|
43
43
|
|
|
44
|
-
pipeline:
|
|
45
|
-
path: "pipeline/"
|
|
46
|
-
description: "Pipeline 系統失敗(任務管理、佇列、統計)"
|
|
47
|
-
icon: "⚙️"
|
|
48
|
-
|
|
49
44
|
data_integrity:
|
|
50
45
|
path: "data-integrity/"
|
|
51
46
|
description: "數據完整性問題(JSON 損壞、編碼錯誤)"
|
|
@@ -83,7 +78,7 @@ failure_template: |
|
|
|
83
78
|
|
|
84
79
|
_meta:
|
|
85
80
|
id: "FAIL-XXX"
|
|
86
|
-
category: "agent_execution | code_quality | architecture |
|
|
81
|
+
category: "agent_execution | code_quality | architecture | data_integrity"
|
|
87
82
|
severity: "critical | high | medium | low"
|
|
88
83
|
date: "YYYY-MM-DD"
|
|
89
84
|
related_tasks: ["TASK_XXX"]
|
|
@@ -118,7 +113,7 @@ failure_template: |
|
|
|
118
113
|
- [ ] 檢查項目 1
|
|
119
114
|
- [ ] 檢查項目 2
|
|
120
115
|
|
|
121
|
-
###
|
|
116
|
+
### 三級預防
|
|
122
117
|
prevention:
|
|
123
118
|
primary: "防止再發 — 架構加固、測試覆蓋、代碼重構"
|
|
124
119
|
secondary: "早期偵測 — 監控指標、日誌告警、健康檢查"
|
|
@@ -137,18 +132,10 @@ failure_template: |
|
|
|
137
132
|
# 載入順序(按嚴重程度)
|
|
138
133
|
# ============================================================
|
|
139
134
|
load_order:
|
|
140
|
-
- path: "agent-execution/FAIL-001-agent-no-output.yaml"
|
|
141
|
-
title: "Agent 執行無輸出問題"
|
|
142
|
-
severity: "critical"
|
|
143
|
-
|
|
144
135
|
- path: "data-integrity/FAIL-002-json-bom.yaml"
|
|
145
136
|
title: "JSON BOM 編碼問題"
|
|
146
137
|
severity: "high"
|
|
147
138
|
|
|
148
|
-
- path: "pipeline/FAIL-003-queue-pollution.yaml"
|
|
149
|
-
title: "TASK_QUEUE 污染問題"
|
|
150
|
-
severity: "high"
|
|
151
|
-
|
|
152
139
|
- path: "agent-execution/FAIL-004_agent_platform_specific_commands.md"
|
|
153
140
|
title: "Agent 使用平台特定命令導致失敗"
|
|
154
141
|
severity: "high"
|
|
@@ -157,18 +144,10 @@ load_order:
|
|
|
157
144
|
title: "背景 Agent 無寫入權限"
|
|
158
145
|
severity: "critical"
|
|
159
146
|
|
|
160
|
-
- path: "architecture/FAIL-006-python-version-compatibility.yaml"
|
|
161
|
-
title: "Python 3.14 依賴兼容性問題"
|
|
162
|
-
severity: "high"
|
|
163
|
-
|
|
164
147
|
- path: "agent-execution/FAIL-008-bypass-api-direct-yaml-write.yaml"
|
|
165
148
|
title: "Agent 繞過 API 直接寫 YAML 任務檔案"
|
|
166
149
|
severity: "high"
|
|
167
150
|
|
|
168
|
-
- path: "agent-execution/FAIL-010-phase0-poem-format-skipped.yaml"
|
|
169
|
-
title: "Phase 0 記憶之烏鴉歸巢段落持續缺失"
|
|
170
|
-
severity: "medium"
|
|
171
|
-
|
|
172
151
|
- path: "agent-execution/FAIL-014-shared-worktree-premature-death-verdict.yaml"
|
|
173
152
|
title: "並發 Agent worktree 共用路徑被提前清理 + 沉默誤判死亡 → 重複派工"
|
|
174
153
|
severity: "high"
|
|
@@ -178,19 +157,11 @@ load_order:
|
|
|
178
157
|
# 統計數據
|
|
179
158
|
# ============================================================
|
|
180
159
|
statistics:
|
|
181
|
-
total_failures:
|
|
160
|
+
total_failures: 5
|
|
182
161
|
by_category:
|
|
183
|
-
agent_execution:
|
|
162
|
+
agent_execution: 4
|
|
184
163
|
data_integrity: 1
|
|
185
|
-
|
|
186
|
-
architecture: 1
|
|
187
|
-
by_severity:
|
|
188
|
-
critical: 2
|
|
189
|
-
high: 5
|
|
190
|
-
medium: 1
|
|
191
|
-
low: 0
|
|
192
|
-
resolved: 7
|
|
193
|
-
converted_to_rules: 2 # 已轉化為 .rule/ 規則
|
|
164
|
+
resolved: 5
|
|
194
165
|
|
|
195
166
|
# ============================================================
|
|
196
167
|
# Agent 使用指南
|
|
@@ -220,12 +191,7 @@ system_integration:
|
|
|
220
191
|
priority_order: |
|
|
221
192
|
1. .rule/ (最高優先級 - 必須遵守的規則)
|
|
222
193
|
2. .failure/ (失敗經驗 - 應避免的模式)
|
|
223
|
-
3. .
|
|
224
|
-
4. CLAUDE.md (專案指導)
|
|
194
|
+
3. CLAUDE.md (專案指導)
|
|
225
195
|
|
|
226
196
|
workflow: |
|
|
227
197
|
失敗 → 記錄到 .failure/ → 分析根因 → 如重複發生 → 提升為 .rule/
|
|
228
|
-
|
|
229
|
-
example:
|
|
230
|
-
failure: "FAIL-003: TASK_QUEUE 被 completed 任務污染"
|
|
231
|
-
rule: "PPL-002: 已完成任務必須封存到 .memory/"
|
|
@@ -1,230 +1,12 @@
|
|
|
1
|
-
#
|
|
1
|
+
# .failure/tools
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
Small Node helpers for the JSON/BOM failure pattern (`data-integrity/FAIL-002-json-bom.yaml`). All take a file or directory path.
|
|
4
4
|
|
|
5
|
-
|
|
5
|
+
| Tool | Use |
|
|
6
|
+
|---|---|
|
|
7
|
+
| `check_bom.js <file\|dir> [--recursive]` | Report files that start with a UTF-8 BOM |
|
|
8
|
+
| `remove_bom.js <file>` | Strip the BOM |
|
|
9
|
+
| `fix_json.js <file>` | Strip the BOM, validate, and reformat a JSON file |
|
|
10
|
+
| `validate_json.js <file>` | Exit non-zero if the file is not valid JSON |
|
|
6
11
|
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
### 1. log_failure.ps1
|
|
10
|
-
自動化建立失敗記錄文件的 PowerShell 腳本。
|
|
11
|
-
|
|
12
|
-
#### 使用方式
|
|
13
|
-
```powershell
|
|
14
|
-
# 互動式建立失敗記錄
|
|
15
|
-
.\.failure\tools\log_failure.ps1
|
|
16
|
-
|
|
17
|
-
# 指定參數建立
|
|
18
|
-
.\.failure\tools\log_failure.ps1 `
|
|
19
|
-
-Category "pipeline" `
|
|
20
|
-
-Title "TASK_QUEUE 污染問題" `
|
|
21
|
-
-Severity "high" `
|
|
22
|
-
-TaskID "TASK_088"
|
|
23
|
-
```
|
|
24
|
-
|
|
25
|
-
#### 功能
|
|
26
|
-
- 自動生成 FAIL-XXX ID(根據 INDEX.yaml 中的最大 ID)
|
|
27
|
-
- 根據分類選擇正確的目錄
|
|
28
|
-
- 使用標準模板建立 YAML 文件
|
|
29
|
-
- 自動更新 INDEX.yaml 的 load_order 和統計數據
|
|
30
|
-
- 支援互動式和參數化兩種模式
|
|
31
|
-
|
|
32
|
-
### 2. check_failures.ps1
|
|
33
|
-
檢查當前任務是否匹配已知失敗模式的腳本。
|
|
34
|
-
|
|
35
|
-
#### 使用方式
|
|
36
|
-
```powershell
|
|
37
|
-
# 檢查特定任務的失敗模式
|
|
38
|
-
.\.failure\tools\check_failures.ps1 -TaskID "TASK_077"
|
|
39
|
-
|
|
40
|
-
# 檢查特定類型的任務
|
|
41
|
-
.\.failure\tools\check_failures.ps1 -AgentType "developer"
|
|
42
|
-
|
|
43
|
-
# 檢查特定路徑的失敗模式
|
|
44
|
-
.\.failure\tools\check_failures.ps1 -ScopePath "dev/pipeline/"
|
|
45
|
-
|
|
46
|
-
# 使用關鍵詞搜尋
|
|
47
|
-
.\.failure\tools\check_failures.ps1 -Keywords "JSON,BOM,encoding"
|
|
48
|
-
|
|
49
|
-
# 過濾特定分類和嚴重程度
|
|
50
|
-
.\.failure\tools\check_failures.ps1 -Category "pipeline" -Severity "critical"
|
|
51
|
-
```
|
|
52
|
-
|
|
53
|
-
#### 功能
|
|
54
|
-
- 根據任務 ID 自動載入 TASK_QUEUE.json 詳情
|
|
55
|
-
- 根據 agent_type 匹配相關失敗記錄
|
|
56
|
-
- 根據 scope_paths 匹配相關失敗記錄
|
|
57
|
-
- 支援關鍵詞模糊搜尋
|
|
58
|
-
- 輸出預防檢查清單和解決方案參考
|
|
59
|
-
- 按嚴重程度排序顯示結果
|
|
60
|
-
|
|
61
|
-
### 3. validate_json.js
|
|
62
|
-
驗證 JSON 文件完整性的 Node.js 腳本。
|
|
63
|
-
|
|
64
|
-
#### 使用方式
|
|
65
|
-
```bash
|
|
66
|
-
# 驗證單個文件
|
|
67
|
-
node .failure/tools/validate_json.js dev/pipeline/TASK_QUEUE.json
|
|
68
|
-
```
|
|
69
|
-
|
|
70
|
-
#### 功能
|
|
71
|
-
- 驗證 JSON 語法正確性
|
|
72
|
-
- 檢測 BOM (Byte Order Mark)
|
|
73
|
-
- 提供錯誤診斷提示
|
|
74
|
-
|
|
75
|
-
### 3.1 remove_bom.js
|
|
76
|
-
移除 UTF-8 文件開頭的 BOM (Byte Order Mark)。
|
|
77
|
-
|
|
78
|
-
#### 使用方式
|
|
79
|
-
```bash
|
|
80
|
-
# 移除 BOM
|
|
81
|
-
node .failure/tools/remove_bom.js dev/pipeline/TASK_QUEUE.json
|
|
82
|
-
```
|
|
83
|
-
|
|
84
|
-
#### 功能
|
|
85
|
-
- 檢測並移除 BOM (0xFEFF)
|
|
86
|
-
- 不修改其他內容
|
|
87
|
-
- 無 BOM 時不做任何操作
|
|
88
|
-
|
|
89
|
-
### 3.2 fix_json.js
|
|
90
|
-
一鍵修復 JSON 文件(移除 BOM + 驗證 + 重新格式化)。
|
|
91
|
-
|
|
92
|
-
#### 使用方式
|
|
93
|
-
```bash
|
|
94
|
-
# 修復 JSON 文件
|
|
95
|
-
node .failure/tools/fix_json.js dev/pipeline/TASK_QUEUE.json
|
|
96
|
-
```
|
|
97
|
-
|
|
98
|
-
#### 功能
|
|
99
|
-
- 自動移除 BOM
|
|
100
|
-
- 驗證 JSON 語法
|
|
101
|
-
- 重新格式化(統一縮排 2 空格)
|
|
102
|
-
- 寫回無 BOM 的 UTF-8 文件
|
|
103
|
-
|
|
104
|
-
### 3.3 check_bom.js
|
|
105
|
-
批量檢查 JSON 文件是否有 BOM(用於 CI/CD 或 pre-commit hook)。
|
|
106
|
-
|
|
107
|
-
#### 使用方式
|
|
108
|
-
```bash
|
|
109
|
-
# 檢查單個文件
|
|
110
|
-
node .failure/tools/check_bom.js dev/pipeline/TASK_QUEUE.json
|
|
111
|
-
|
|
112
|
-
# 遞迴檢查目錄中所有 JSON 文件
|
|
113
|
-
node .failure/tools/check_bom.js dev/pipeline --recursive
|
|
114
|
-
```
|
|
115
|
-
|
|
116
|
-
#### 功能
|
|
117
|
-
- 批量檢查 JSON 文件
|
|
118
|
-
- 遞迴掃描目錄(使用 --recursive)
|
|
119
|
-
- 列出所有有 BOM 的文件
|
|
120
|
-
- 退出碼:0(無 BOM)或 1(檢測到 BOM)
|
|
121
|
-
|
|
122
|
-
#### Pre-commit Hook 整合
|
|
123
|
-
```bash
|
|
124
|
-
#!/bin/bash
|
|
125
|
-
# .git/hooks/pre-commit
|
|
126
|
-
node .failure/tools/check_bom.js dev/pipeline --recursive || exit 1
|
|
127
|
-
```
|
|
128
|
-
|
|
129
|
-
### 4. failure-report.ps1 (計劃中)
|
|
130
|
-
生成失敗經驗報告的腳本。
|
|
131
|
-
|
|
132
|
-
#### 使用方式
|
|
133
|
-
```powershell
|
|
134
|
-
# 生成完整報告
|
|
135
|
-
.\.failure\tools\failure-report.ps1
|
|
136
|
-
|
|
137
|
-
# 只生成特定分類的報告
|
|
138
|
-
.\.failure\tools\failure-report.ps1 -Category "pipeline"
|
|
139
|
-
|
|
140
|
-
# 只生成特定嚴重程度的報告
|
|
141
|
-
.\.failure\tools\failure-report.ps1 -Severity "critical,high"
|
|
142
|
-
|
|
143
|
-
# 輸出為 Markdown 格式
|
|
144
|
-
.\.failure\tools\failure-report.ps1 -Format "markdown" -Output "failure-report.md"
|
|
145
|
-
```
|
|
146
|
-
|
|
147
|
-
#### 功能(計劃中)
|
|
148
|
-
- 統計失敗記錄數量
|
|
149
|
-
- 按分類和嚴重程度分組
|
|
150
|
-
- 列出已轉化為規則的失敗
|
|
151
|
-
- 生成 Markdown 報告
|
|
152
|
-
|
|
153
|
-
### 5. failure-to-rule.ps1 (計劃中)
|
|
154
|
-
將重複發生的失敗轉化為規則的輔助工具。
|
|
155
|
-
|
|
156
|
-
#### 使用方式
|
|
157
|
-
```powershell
|
|
158
|
-
# 檢查哪些失敗應該轉化為規則
|
|
159
|
-
.\.failure\tools\failure-to-rule.ps1 -Analyze
|
|
160
|
-
|
|
161
|
-
# 將特定失敗轉化為規則
|
|
162
|
-
.\.failure\tools\failure-to-rule.ps1 -FailureID "FAIL-003" -RuleID "PPL-002"
|
|
163
|
-
```
|
|
164
|
-
|
|
165
|
-
#### 功能(計劃中)
|
|
166
|
-
- 分析失敗記錄,建議哪些應該轉化為規則
|
|
167
|
-
- 自動生成規則文件草稿
|
|
168
|
-
- 更新失敗記錄的 `converted_to_rules` 狀態
|
|
169
|
-
- 更新 INDEX.yaml 統計數據
|
|
170
|
-
|
|
171
|
-
## 開發新工具
|
|
172
|
-
|
|
173
|
-
如果需要開發新的失敗學習工具,請遵循以下指南:
|
|
174
|
-
|
|
175
|
-
### 1. 工具命名規範
|
|
176
|
-
- PowerShell 腳本:`action-noun.ps1`(如 `check-failure-patterns.ps1`)
|
|
177
|
-
- Node.js 腳本:`action-noun.js`(如 `validate-json.js`)
|
|
178
|
-
- Python 腳本:`action_noun.py`(如 `analyze_failures.py`)
|
|
179
|
-
|
|
180
|
-
### 2. 必須包含的功能
|
|
181
|
-
- **幫助訊息**:`-Help` 或 `--help` 參數
|
|
182
|
-
- **錯誤處理**:優雅處理錯誤,提供清晰的錯誤訊息
|
|
183
|
-
- **日誌輸出**:使用一致的日誌格式
|
|
184
|
-
- **返回碼**:成功返回 0,失敗返回非 0
|
|
185
|
-
|
|
186
|
-
### 3. 文檔要求
|
|
187
|
-
- 在此 README.md 中添加工具說明
|
|
188
|
-
- 在腳本開頭添加註解說明用途和使用方式
|
|
189
|
-
- 提供使用範例
|
|
190
|
-
|
|
191
|
-
### 4. 測試要求
|
|
192
|
-
- 提供測試用例
|
|
193
|
-
- 在 `.failure/tools/tests/` 目錄中
|
|
194
|
-
|
|
195
|
-
## 工具使用最佳實踐
|
|
196
|
-
|
|
197
|
-
### Agent 使用場景
|
|
198
|
-
|
|
199
|
-
#### 任務開始前
|
|
200
|
-
```powershell
|
|
201
|
-
# 檢查相關失敗模式
|
|
202
|
-
.\.failure\tools\check_failures.ps1 -TaskID $TASK_ID
|
|
203
|
-
```
|
|
204
|
-
|
|
205
|
-
#### 任務執行中
|
|
206
|
-
```bash
|
|
207
|
-
# 驗證 JSON 文件
|
|
208
|
-
node .failure/tools/validate_json.js dev/pipeline/TASK_QUEUE.json
|
|
209
|
-
```
|
|
210
|
-
|
|
211
|
-
#### 任務失敗後
|
|
212
|
-
```powershell
|
|
213
|
-
# 建立失敗記錄
|
|
214
|
-
.\.failure\tools\log_failure.ps1 -Interactive
|
|
215
|
-
```
|
|
216
|
-
|
|
217
|
-
### 定期維護
|
|
218
|
-
```powershell
|
|
219
|
-
# 每週生成失敗報告
|
|
220
|
-
.\failure\tools\failure-report.ps1 -Output "weekly-failure-report.md"
|
|
221
|
-
|
|
222
|
-
# 分析哪些失敗應該轉化為規則
|
|
223
|
-
.\failure\tools\failure-to-rule.ps1 -Analyze
|
|
224
|
-
```
|
|
225
|
-
|
|
226
|
-
## 相關資源
|
|
227
|
-
|
|
228
|
-
- **失敗記錄索引**:`.failure/INDEX.yaml`
|
|
229
|
-
- **規則系統**:`.rule/INDEX.yaml`
|
|
230
|
-
- **Agent 工作流程**:`.rule/general/agent-workflow.yaml`
|
|
12
|
+
Looking up known failures: read `.failure/INDEX.yaml`, then Grep `.failure/` for the task's scope or error text. Record a new failure by adding a YAML file from the template in INDEX.yaml and listing it in `load_order`; lessons that are not reproducible failure patterns go to `kenaz learn add`.
|
|
@@ -286,12 +286,7 @@ function renderOverride(prompt, bootContext, { policy = BOOT_POLICY, projectPath
|
|
|
286
286
|
const content = `${projectInstruction}${bootContext}${memoryStartupDoc}${codexDdxInjection}You have been activated as ${policy.specialist} via Bifröst.
|
|
287
287
|
|
|
288
288
|
IMPORTANT — Shell compatibility (you are running under Codex which uses PowerShell on Windows):
|
|
289
|
-
-
|
|
290
|
-
- Instead: write JSON to a temp file, then use --data-file=path. Example:
|
|
291
|
-
1. Write: Set-Content -Path _phase_data.json -Value '{"ash_loaded":true,"poem_displayed":true,"session_handoff_loaded":false}'
|
|
292
|
-
2. Run: node .specialist/tools/phase-gate.js exit --phase=0 --data-file=_phase_data.json
|
|
293
|
-
3. Cleanup: Remove-Item _phase_data.json
|
|
294
|
-
- This applies to ALL phase-gate.js exit calls, not just Phase 0.
|
|
289
|
+
- Do not pass inline JSON on the command line; PowerShell mangles JSON quotes. Write it to a temp file and pass the path instead.
|
|
295
290
|
|
|
296
291
|
${prompt}
|
|
297
292
|
|
|
@@ -104,7 +104,7 @@ test('override ends with fast precedence and retains full project pin', () => {
|
|
|
104
104
|
assert.equal((fast.match(/## Codex Bootstrap Policy/g) || []).length, 1);
|
|
105
105
|
assert.ok(fast.includes(`projectPath="${projectPath}"`));
|
|
106
106
|
const full = api.renderOverride('fixture', '', { projectPath, policy: resolveBootPolicy({ depth: 'kernel' }) });
|
|
107
|
-
assert.ok(full.includes(
|
|
107
|
+
assert.ok(full.includes(`projectPath="${projectPath}"`));
|
|
108
108
|
assert.match(full, /HALT and emit recovery/);
|
|
109
109
|
assert.doesNotMatch(full, /Ansuz fast boot/);
|
|
110
110
|
});
|
|
@@ -19,11 +19,11 @@ function renderBootstrap({ policy, projectPath, port = '18080', contextual = fal
|
|
|
19
19
|
const fast = [
|
|
20
20
|
'Ansuz fast boot (elixir) is the default. This bootstrap policy supersedes any older instruction to run Phase 0, including the Phase 0 sentence inside elixir.',
|
|
21
21
|
'Check kenaz_ping with the active projectPath when available. If unavailable, report that the Kenaz server is unavailable and continue only read-only inspection and analysis using local evidence.',
|
|
22
|
-
'Lightweight Phase 0 uses the supplied boot context and local project evidence; do not run
|
|
22
|
+
'Lightweight Phase 0 uses the supplied boot context and local project evidence; do not run Phase 0 boot rituals in fast mode. This also supersedes legacy handoff instructions that promise Phase 0 archival. When offline, defer state-changing execution and memory-dependent work until the required service is restored.',
|
|
23
23
|
'Existing authorization, scope, verification, task tracking, and merge restrictions remain in force.',
|
|
24
24
|
].join('\n');
|
|
25
|
-
const
|
|
26
|
-
|
|
25
|
+
const full = `Before starting Phase 0, call kenaz_ping with the active projectPath${projectPath ? ` ("${projectPath}")` : ''}. If it errors or times out, HALT and emit recovery: confirm the Kenaz server on port ${port}, re-run setup-codex, and restart the Codex session.
|
|
26
|
+
Execute Phase 0 initialization now using the supplied boot context and local project evidence.`;
|
|
27
27
|
if (contextual) return `## Codex Bootstrap Policy\n\nFor Ansuz without an explicit full boot or legacy depth:\n${fast}\n\nFor explicit --full / --boot-mode full or kernel depth, and for other specialists: retain the full bootstrap guard; call kenaz_ping before Phase 0 and HALT with recovery instructions if it is unavailable. Use the active specialist and project-path for Phase 0.\n`;
|
|
28
28
|
return `## Codex Bootstrap Policy (${policy.mode})\n\n${policy.mode === 'fast' ? fast : full}\n`;
|
|
29
29
|
}
|
|
@@ -28,8 +28,7 @@ test('renderer preserves full project pin and limits fast offline work without r
|
|
|
28
28
|
const projectPath = 'C:\\example project\\quotation';
|
|
29
29
|
const full = renderBootstrap({ policy: resolveBootPolicy({ full: true }), projectPath });
|
|
30
30
|
assert.match(full, /HALT/);
|
|
31
|
-
assert.ok(full.includes(
|
|
32
|
-
assert.match(full, /--specialist=ansuz/);
|
|
31
|
+
assert.ok(full.includes(`"${projectPath}"`));
|
|
33
32
|
const fast = renderBootstrap({ policy: resolveBootPolicy() });
|
|
34
33
|
assert.match(fast, /Lightweight Phase 0/);
|
|
35
34
|
assert.match(fast, /supersedes any older instruction/);
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
// TASK_1764 AMEND + TASK_1766 validation: scratch_<convId>.json as bind source.
|
|
2
|
-
// Tests REG-0
|
|
2
|
+
// Tests REG-0, T11 (resolveOwnBinding), T15 (dispatch scope gate). The lease-touch/lease-release hook cases were removed with those hooks.
|
|
3
3
|
// Usage: node .formation/tools/__tests__/m1-hmap-convid.test.js
|
|
4
4
|
// Exit 0 = all pass, non-zero = failure.
|
|
5
5
|
'use strict';
|
|
@@ -17,8 +17,6 @@ function resolveRoot() {
|
|
|
17
17
|
throw new Error('Cannot resolve root from ' + __dirname);
|
|
18
18
|
}
|
|
19
19
|
const WT = resolveRoot();
|
|
20
|
-
const LEASE_TOUCH = path.join(WT, '.claude/hooks/lease-touch.js');
|
|
21
|
-
const LEASE_RELEASE = path.join(WT, '.claude/hooks/lease-release.js');
|
|
22
20
|
const STREAM_LEASE = path.join(WT, '.specialist/tools/stream-lease.js');
|
|
23
21
|
const SESSION_IDENT = path.join(WT, '.claude/hooks/_session-identity.js');
|
|
24
22
|
const SB = path.join(os.tmpdir(), 'hmap_convid_' + process.pid);
|
|
@@ -34,7 +32,6 @@ function check(name, cond, detail) {
|
|
|
34
32
|
cond ? pass++ : fail++;
|
|
35
33
|
}
|
|
36
34
|
const baseEnv = { ...process.env, CLAUDE_PROJECT_DIR: SB, KENAZ_SOURCE_DIR: SB };
|
|
37
|
-
function runHook(hp, sj) { return cp.spawnSync(process.execPath, [hp], { input: JSON.stringify(sj), encoding: 'utf8', env: baseEnv, timeout: 5000 }); }
|
|
38
35
|
function sbSL(a) { return cp.spawnSync(process.execPath, [path.join(SB, '.specialist/tools/stream-lease.js'), ...a], { encoding: 'utf8', env: baseEnv, timeout: 5000 }); }
|
|
39
36
|
function readHmap(id) { try { return JSON.parse(fs.readFileSync(path.join(SB, '.kenaz/specialist/sessions/hmap_' + id + '.json'), 'utf8')); } catch { return null; } }
|
|
40
37
|
function hmapExists(id) { return fs.existsSync(path.join(SB, '.kenaz/specialist/sessions/hmap_' + id + '.json')); }
|
|
@@ -52,96 +49,6 @@ console.log('\n--- REG-0: register writes scratch ---');
|
|
|
52
49
|
check('REG-0b: scratch.session_id', sc&&sc.session_id===s, JSON.stringify(sc));
|
|
53
50
|
check('REG-0c: scratch.conversation_id', sc&&sc.conversation_id===c, JSON.stringify(sc));
|
|
54
51
|
try{sbSL(['release','--session-id='+s]);}catch(_){} }
|
|
55
|
-
// --- REG-1: hmap bind source is scratch (TASK_1766) ---
|
|
56
|
-
console.log('\n--- REG-1: hmap bind source is scratch ---');
|
|
57
|
-
{ const cA='conv-aaa-111', sA='sid-aaa-001'; reg(sA,cA);
|
|
58
|
-
runHook(LEASE_TOUCH, { session_id: 'harness-abc', transcript_path: '/fake/'+cA+'.jsonl' });
|
|
59
|
-
const h=readHmap(cA);
|
|
60
|
-
check('REG-1a: hmap created after first touch', !!h, 'file not found');
|
|
61
|
-
check('REG-1b: hmap.conversation_id', h&&h.conversation_id===cA, JSON.stringify(h));
|
|
62
|
-
check('REG-1c: hmap.boot_sid=sA', h&&h.boot_sid===sA, JSON.stringify(h));
|
|
63
|
-
check('REG-1d: no hmap_harness-abc', !fs.existsSync(path.join(SB,'.kenaz/specialist/sessions/hmap_harness-abc.json')),'');
|
|
64
|
-
runHook(LEASE_TOUCH, { session_id: 'harness-xyz', transcript_path: '/fake/'+cA+'.jsonl' });
|
|
65
|
-
const h2=readHmap(cA);
|
|
66
|
-
check('REG-2a: hmap still present after rotated session_id', !!h2,'');
|
|
67
|
-
check('REG-2b: boot_sid unchanged', h2&&h2.boot_sid===sA, JSON.stringify(h2));
|
|
68
|
-
try{sbSL(['release','--session-id='+sA]);}catch(_){} }
|
|
69
|
-
// --- T1: transcript conv has no scratch -> no bind ---
|
|
70
|
-
console.log('\n--- T1: transcript conv has no scratch -> no bind ---');
|
|
71
|
-
{ const cA='conv-aaa-bind-guard', cB='conv-bbb-different', sA='sid-t1-aaa'; reg(sA,cA);
|
|
72
|
-
runHook(LEASE_TOUCH, { transcript_path: '/fake/'+cB+'.jsonl' });
|
|
73
|
-
check('T1: no hmap for convBBB (no scratch)', !hmapExists(cB), 'hmap_'+cB+' created');
|
|
74
|
-
try{sbSL(['release','--session-id='+sA]);}catch(_){} }
|
|
75
|
-
// --- T2: lease-release resolves hmap by convId ---
|
|
76
|
-
console.log('\n--- T2: lease-release resolves hmap by convId ---');
|
|
77
|
-
{ const cC='conv-ccc-release', sC='sid-ccc-003'; reg(sC,cC); writeHmap(cC,sC);
|
|
78
|
-
check('T2-pre: sC lease exists', leaseExists(sC), '');
|
|
79
|
-
runHook(LEASE_RELEASE, { hook_event_name:'SessionEnd', source:'logout', transcript_path:'/fake/'+cC+'.jsonl' });
|
|
80
|
-
check('T2: lease removed', !leaseExists(sC), 'still present');
|
|
81
|
-
check('T2: hmap cleaned', !hmapExists(cC), ''); }
|
|
82
|
-
// --- T3: SessionEnd source=resume -> no release ---
|
|
83
|
-
console.log('\n--- T3: SessionEnd source=resume -> no release ---');
|
|
84
|
-
{ const cD='conv-ddd-resume', sD='sid-ddd-004'; reg(sD,cD); writeHmap(cD,sD);
|
|
85
|
-
check('T3-pre: sD lease exists', leaseExists(sD), '');
|
|
86
|
-
runHook(LEASE_RELEASE, { hook_event_name:'SessionEnd', source:'resume', transcript_path:'/fake/'+cD+'.jsonl' });
|
|
87
|
-
check('T3: lease NOT released on source=resume', leaseExists(sD), 'deleted');
|
|
88
|
-
check('T3: hmap NOT cleaned', hmapExists(cD), '');
|
|
89
|
-
try{sbSL(['release','--session-id='+sD]);}catch(_){} }
|
|
90
|
-
// --- T4: no transcript_path -> headless no-op (BUG-10) ---
|
|
91
|
-
console.log('\n--- T4: no transcript_path -> headless no-op ---');
|
|
92
|
-
{ const sH='sid-headless-005'; reg(sH,null); writeStream(sH,null);
|
|
93
|
-
const t4=runHook(LEASE_TOUCH, { tool_name:'UserPromptSubmit' });
|
|
94
|
-
check('T4: hook exits cleanly', t4.status===0||t4.signal===null, 'status='+t4.status);
|
|
95
|
-
try{sbSL(['release','--session-id='+sH]);}catch(_){} }
|
|
96
|
-
// --- T5: SessionEnd no transcript_path -> no-op ---
|
|
97
|
-
console.log('\n--- T5: SessionEnd no transcript_path -> no-op ---');
|
|
98
|
-
{ const cE='conv-eee-noop', sE='sid-eee-006'; reg(sE,cE); writeStream(sE,cE);
|
|
99
|
-
check('T5-pre: sE lease exists', leaseExists(sE), '');
|
|
100
|
-
runHook(LEASE_RELEASE, { hook_event_name:'SessionEnd', source:'logout' });
|
|
101
|
-
check('T5: lease present (no transcript_path -> no-op)', leaseExists(sE), 'deleted');
|
|
102
|
-
try{sbSL(['release','--session-id='+sE]);}catch(_){} }
|
|
103
|
-
// --- T8: compact rotation - session_id rotates, hmap key stays convId ---
|
|
104
|
-
console.log('\n--- T8: compact rotation ---');
|
|
105
|
-
{ const cF='conv-fff-compact', sF1='sid-fff-pre-compact', sF2='sid-fff-post-compact';
|
|
106
|
-
reg(sF1,cF);
|
|
107
|
-
runHook(LEASE_TOUCH, { session_id:sF1, transcript_path:'/fake/'+cF+'.jsonl' });
|
|
108
|
-
const hPre=readHmap(cF);
|
|
109
|
-
check('T8-pre: hmap written with sF1', hPre&&hPre.boot_sid===sF1, JSON.stringify(hPre));
|
|
110
|
-
reg(sF2,cF);
|
|
111
|
-
runHook(LEASE_TOUCH, { session_id:sF2, transcript_path:'/fake/'+cF+'.jsonl' });
|
|
112
|
-
const hPost=readHmap(cF);
|
|
113
|
-
check('T8-post: hmap still exists', !!hPost, 'missing');
|
|
114
|
-
check('T8-post: boot_sid unchanged (sF1)', hPost&&hPost.boot_sid===sF1, JSON.stringify(hPost));
|
|
115
|
-
check('T8-post: no orphan hmap for sF2', !fs.existsSync(path.join(SB,'.kenaz/specialist/sessions/hmap_'+sF2+'.json')), '');
|
|
116
|
-
check('T8-pre-release: sF1 lease exists', leaseExists(sF1), '');
|
|
117
|
-
runHook(LEASE_RELEASE, { hook_event_name:'SessionEnd', source:'logout', transcript_path:'/fake/'+cF+'.jsonl' });
|
|
118
|
-
check('T8: sF1 lease removed', !leaseExists(sF1), 'sF1.json still exists');
|
|
119
|
-
check('T8: hmap cleaned', !hmapExists(cF), '');
|
|
120
|
-
try{sbSL(['release','--session-id='+sF2]);}catch(_){} }
|
|
121
|
-
// --- T9 (BUG-8): dual register A-first -> both bind independently ---
|
|
122
|
-
console.log('\n--- T9 (BUG-8): dual register A-first -> both bind ---');
|
|
123
|
-
{ const cG1='conv-g1-dual-a', sG1='sid-g1-stream-a', cG2='conv-g2-dual-b', sG2='sid-g2-stream-b';
|
|
124
|
-
reg(sG1,cG1); reg(sG2,cG2);
|
|
125
|
-
runHook(LEASE_TOUCH, { transcript_path:'/fake/'+cG1+'.jsonl' });
|
|
126
|
-
runHook(LEASE_TOUCH, { transcript_path:'/fake/'+cG2+'.jsonl' });
|
|
127
|
-
const hG1=readHmap(cG1), hG2=readHmap(cG2);
|
|
128
|
-
check('T9a: stream-A hmap created (not starved)', !!hG1, 'hmap missing for cG1');
|
|
129
|
-
check('T9b: stream-A boot_sid=sG1', hG1&&hG1.boot_sid===sG1, JSON.stringify(hG1));
|
|
130
|
-
check('T9c: stream-B hmap created independently', !!hG2, 'hmap missing for cG2');
|
|
131
|
-
check('T9d: stream-B boot_sid=sG2', hG2&&hG2.boot_sid===sG2, JSON.stringify(hG2));
|
|
132
|
-
try{sbSL(['release','--session-id='+sG1]);}catch(_){} try{sbSL(['release','--session-id='+sG2]);}catch(_){} }
|
|
133
|
-
// --- T10 (BUG-8 reverse): register B first then A -> both bind ---
|
|
134
|
-
console.log('\n--- T10 (BUG-8 reverse): register B first then A -> both bind ---');
|
|
135
|
-
{ const cH1='conv-h1-rev-a', sH1='sid-h1-stream-a', cH2='conv-h2-rev-b', sH2='sid-h2-stream-b';
|
|
136
|
-
reg(sH2,cH2); reg(sH1,cH1);
|
|
137
|
-
runHook(LEASE_TOUCH, { transcript_path:'/fake/'+cH1+'.jsonl' });
|
|
138
|
-
runHook(LEASE_TOUCH, { transcript_path:'/fake/'+cH2+'.jsonl' });
|
|
139
|
-
const hH1=readHmap(cH1), hH2=readHmap(cH2);
|
|
140
|
-
check('T10a: stream-A hmap exists', !!hH1, 'missing');
|
|
141
|
-
check('T10b: stream-A boot_sid', hH1&&hH1.boot_sid===sH1, JSON.stringify(hH1));
|
|
142
|
-
check('T10c: stream-B hmap exists', !!hH2, 'missing');
|
|
143
|
-
check('T10d: stream-B boot_sid', hH2&&hH2.boot_sid===sH2, JSON.stringify(hH2));
|
|
144
|
-
try{sbSL(['release','--session-id='+sH1]);}catch(_){} try{sbSL(['release','--session-id='+sH2]);}catch(_){} }
|
|
145
52
|
// --- T11 (BUG-9): resolveOwnBinding ignores current_stream singleton ---
|
|
146
53
|
console.log('\n--- T11 (BUG-9): resolveOwnBinding ignores current_stream ---');
|
|
147
54
|
{ const cI1='conv-i1-a', sI1='sid-i1-a', cI2='conv-i2-b', sI2='sid-i2-b', cI3='conv-i3-c', sI3='sid-i3-c';
|
|
@@ -158,36 +65,6 @@ console.log('\n--- T11 (BUG-9): resolveOwnBinding ignores current_stream ---');
|
|
|
158
65
|
check('T11d: resolveOwnBinding via scratch (no hmap)', bI3.bootSid===sI3, JSON.stringify(bI3));
|
|
159
66
|
check('T11e: source=scratch', bI3.source==='scratch', JSON.stringify(bI3));
|
|
160
67
|
try{sbSL(['release','--session-id='+sI1]);}catch(_){} try{sbSL(['release','--session-id='+sI2]);}catch(_){} try{sbSL(['release','--session-id='+sI3]);}catch(_){} }
|
|
161
|
-
// --- T12 (BUG-10): foreign convId -> lease-touch no-op ---
|
|
162
|
-
console.log('\n--- T12 (BUG-10): foreign convId -> no-op ---');
|
|
163
|
-
{ const cJ='conv-j1-main', sJ='sid-j1-main', cJC='conv-jchild';
|
|
164
|
-
reg(sJ,cJ); writeHmap(cJ,sJ);
|
|
165
|
-
const lb=leaseExists(sJ);
|
|
166
|
-
runHook(LEASE_TOUCH, { transcript_path:'/fake/'+cJC+'.jsonl' });
|
|
167
|
-
check('T12a: main lease untouched after child hook', leaseExists(sJ)===lb, 'missing');
|
|
168
|
-
check('T12b: no hmap for child convId', !hmapExists(cJC), 'created unexpectedly');
|
|
169
|
-
try{sbSL(['release','--session-id='+sJ]);}catch(_){} }
|
|
170
|
-
// --- T13 (open-question repro + FIXED): stream bind blocked by current_stream overwrite ---
|
|
171
|
-
console.log('\n--- T13 (open-question): bind blocked by current_stream -> FIXED ---');
|
|
172
|
-
{ const cK1='conv-k1-a', sK1='sid-k1-a', cK2='conv-k2-b', sK2='sid-k2-b';
|
|
173
|
-
reg(sK1,cK1); reg(sK2,cK2);
|
|
174
|
-
runHook(LEASE_TOUCH, { transcript_path:'/fake/'+cK1+'.jsonl' });
|
|
175
|
-
const hK1=readHmap(cK1);
|
|
176
|
-
check('T13a: stream-A hmap created despite stream-B overwriting current_stream (BUG-8 FIXED)', !!hK1, 'hmap missing');
|
|
177
|
-
check('T13b: stream-A boot_sid=sK1', hK1&&hK1.boot_sid===sK1, JSON.stringify(hK1));
|
|
178
|
-
runHook(LEASE_TOUCH, { transcript_path:'/fake/'+cK2+'.jsonl' });
|
|
179
|
-
const hK2=readHmap(cK2);
|
|
180
|
-
check('T13c: stream-B hmap created', !!hK2, 'missing');
|
|
181
|
-
check('T13d: stream-B boot_sid=sK2', hK2&&hK2.boot_sid===sK2, JSON.stringify(hK2));
|
|
182
|
-
try{sbSL(['release','--session-id='+sK1]);}catch(_){} try{sbSL(['release','--session-id='+sK2]);}catch(_){} }
|
|
183
|
-
// --- T14: lease-release cleans up scratch ---
|
|
184
|
-
console.log('\n--- T14: lease-release cleans scratch ---');
|
|
185
|
-
{ const cL='conv-l1-cleanup', sL='sid-l1-cleanup'; reg(sL,cL); writeHmap(cL,sL);
|
|
186
|
-
check('T14-pre: scratch exists', scratchExists(cL), 'not found');
|
|
187
|
-
runHook(LEASE_RELEASE, { hook_event_name:'SessionEnd', source:'logout', transcript_path:'/fake/'+cL+'.jsonl' });
|
|
188
|
-
check('T14a: lease removed', !leaseExists(sL), 'still present');
|
|
189
|
-
check('T14b: hmap cleaned', !hmapExists(cL), '');
|
|
190
|
-
check('T14c: scratch cleaned', !scratchExists(cL), 'scratch still present'); }
|
|
191
68
|
// --- dispatch.js env name ---
|
|
192
69
|
// --- T15 (TASK_1767): empty scope_paths must not bypass same-task-id guard ---
|
|
193
70
|
console.log('\n--- T15: empty-scope same-task gate (TASK_1767) ---');
|
|
@@ -813,7 +813,7 @@ Options:
|
|
|
813
813
|
(with --release-lock: release a lock this session
|
|
814
814
|
cannot prove it owns)
|
|
815
815
|
|
|
816
|
-
Skills: unit: do
|
|
816
|
+
Skills: unit: do.
|
|
817
817
|
|
|
818
818
|
Sub-agent dispatch (Ansuz billing-aware path):
|
|
819
819
|
node .formation/tools/dispatch.js --skill=do --task=TASK_172 --dispatch-mode=subagent
|