kenaz 0.3.5 → 0.3.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (44) hide show
  1. package/core/.claude/commands/Ansuz.md +1 -0
  2. package/core/.formation/native/claude/README.md +1 -1
  3. package/core/.formation/role-map.yaml +3 -3
  4. package/core/.formation/spec/task_operations.yaml +3 -3
  5. package/core/.formation/tools/__tests__/subagent-bifrost-guard.test.js +4 -4
  6. package/core/.formation/tools/dispatch.js +5 -5
  7. package/core/.formation/tools/prompt.js +4 -0
  8. package/core/.formation/unit/do.yaml +2 -4
  9. package/core/.rule/general/agent-workflow.yaml +4 -4
  10. package/core/.rule/general/file-size-threshold.yaml +16 -4
  11. package/core/.rule/general/rust-verify-target.yaml +0 -1
  12. package/core/.rule/general/system-invariants.yaml +8 -25
  13. package/core/.specialist/Ansuz/SYSTEM_DOC.md +17 -42
  14. package/core/.specialist/Ansuz/capability.yaml +7 -14
  15. package/core/.specialist/Ansuz/concepts/formation_quick_ref.yaml +4 -11
  16. package/core/.specialist/Ansuz/elixir.yaml +3 -4
  17. package/core/.specialist/Ansuz/identity_contract.yaml +1 -1
  18. package/core/.specialist/Ansuz/knowledge.yaml +7 -10
  19. package/core/.specialist/Ansuz/rule.yaml +2 -2
  20. package/core/.specialist/Ansuz/tools/verify-and-land.js +22 -0
  21. package/core/.specialist/Ansuz/tools/verify-and-land.test.js +59 -5
  22. package/core/.specialist/Ansuz/workflow.yaml +7 -11
  23. package/core/.specialist/Forseti/core.yaml +1 -1
  24. package/core/.specialist/Heimdall/SKILL.md +1 -1
  25. package/core/.specialist/Heimdall/core.yaml +2 -2
  26. package/core/.specialist/Huginn/rule.yaml +1 -1
  27. package/core/.specialist/tools/README.md +2 -2
  28. package/core/.system/collaboration/README.md +1 -1
  29. package/core/.system/formation/LEGACY_SKILLS.md +2 -0
  30. package/core/.system/formation/POST_COMPLETE.md +2 -0
  31. package/core/.system/formation/README.md +2 -0
  32. package/core/KENAZ_CORE_VERSION +1 -1
  33. package/core/dev/scripts/check-file-size.js +44 -17
  34. package/core/k-cli/README.md +1 -94
  35. package/core/k-cli/test/TEST_SPEC.md +5 -22
  36. package/core/k-cli/test/run.sh +1 -67
  37. package/core/plugins/kenaz/commands/Ansuz.md +1 -0
  38. package/package.json +6 -6
  39. package/core/.formation/legion/forge.yaml +0 -299
  40. package/core/.formation/legion/hive.yaml +0 -238
  41. package/core/.formation/squad/blitz.yaml +0 -192
  42. package/core/.formation/squad/strategy-tribunal.yaml +0 -354
  43. package/core/.formation/squad/strategy.yaml +0 -349
  44. package/core/.formation/squad/sweep.yaml +0 -208
@@ -14,7 +14,7 @@ npm run build && npm test
14
14
 
15
15
  ## 前置條件
16
16
 
17
- - Claude CLI 可用(`task create` 和 `dispatch run` 會 spawnClaude)
17
+ - Claude CLI 可用(`task create` 會 spawnClaude)
18
18
  - `npm run build` 必須先執行
19
19
 
20
20
  ## 測試環境
@@ -64,20 +64,8 @@ npm run build && npm test
64
64
  - `k-cli task get TASK_A --project-path test/sandbox/`
65
65
  - 驗證:輸出含 TASK_A 詳細資訊
66
66
 
67
- ### Test 6: dispatch run(指定任務)
68
- - 使用 Test 5 的 TASK_A
69
- - `k-cli dispatch run TASK_A --project-path test/sandbox/`
70
- - 驗證:Ansuz 讀 role → 判斷陣型 → headless.js 執行,輸出含 TASK_A
71
-
72
- ### Test 7: dispatch status(等待任務完成)
73
- - `k-cli dispatch status TASK_A --project-path test/sandbox/`
74
- - 輪詢直到任務完成(或 timeout)
75
- - 驗證:輸出含 TASK_A 相關資訊,最終狀態為 done
76
-
77
- ### Test 8: dispatch run --auto(自動掃描)
78
- - `k-cli dispatch run --auto --project-path test/sandbox/`
79
- - 驗證:自動掃描 backlog,dispatch TASK_B 和 TASK_C(或剩餘待處理任務)
80
- - 驗證:輸出含掃描結果
67
+ ### Test 6-8: 已移除
68
+ - `dispatch run` 已刪除(Formation headless 調度已退役),`dispatch status` 失去可驗證的前置動作,一併移出測試
81
69
 
82
70
  ### Test 9: task delete → verify
83
71
  - 使用 Test 5 的 TASK_A
@@ -99,11 +87,9 @@ npm run build && npm test
99
87
  - 驗證:輸出含 `dry-run`,不呼叫 spawnClaude
100
88
  3. `k-cli task delete TASK_B --project-path test/sandbox/ --dry-run`
101
89
  - 驗證:輸出含 `dry-run`,任務仍存在
102
- 4. `k-cli dispatch run TASK_B --project-path test/sandbox/ --dry-run`
103
- - 驗證:輸出含 `dry-run`,不呼叫 spawnClaude
104
- 5. `k-cli specialist run --agent Amelia 測試 --project-path test/sandbox/ --dry-run`
90
+ 4. `k-cli specialist run --agent Amelia 測試 --project-path test/sandbox/ --dry-run`
105
91
  - 驗證:輸出含 `dry-run`,不呼叫 spawnClaude
106
- 6. `k-cli project install k-cli --project-path test/sandbox/ --dry-run`
92
+ 5. `k-cli project install k-cli --project-path test/sandbox/ --dry-run`
107
93
  - 驗證:輸出含 `dry-run`
108
94
 
109
95
  ## 結果格式
@@ -116,9 +102,6 @@ k-cli Test Suite
116
102
  [ 3/11] project status ✅ PASS
117
103
  [ 4/11] specialist list ✅ PASS
118
104
  [ 5/11] task create × 3 ✅ PASS
119
- [ 6/11] dispatch run ✅ PASS
120
- [ 7/11] dispatch status ✅ PASS
121
- [ 8/11] dispatch run --auto ✅ PASS
122
105
  [ 9/11] task delete ✅ PASS
123
106
  [10/11] specialist run Amelia ✅ PASS
124
107
  [11/11] --dry-run ✅ PASS
@@ -280,62 +280,6 @@ test_5_task_create() {
280
280
  return 0
281
281
  }
282
282
 
283
- # =========================================
284
- # Test 6: dispatch run (specific task)
285
- # =========================================
286
- test_6_dispatch_run() {
287
- local task_id
288
- task_id=$(cat "$SANDBOX/.test_task_a" 2>/dev/null) || { echo " No TASK_A from test 5"; return 1; }
289
- log " Dispatching: $task_id"
290
-
291
- run_cmd $KCLI dispatch run "$task_id" --project-path "$SANDBOX"
292
- local output="$LOG_CMD_OUTPUT"
293
- assert_contains "dispatch run" "$output" "$task_id" || return 1
294
- return 0
295
- }
296
-
297
- # =========================================
298
- # Test 7: dispatch status (wait for done)
299
- # =========================================
300
- test_7_dispatch_status() {
301
- local task_id
302
- task_id=$(cat "$SANDBOX/.test_task_a" 2>/dev/null) || { echo " No TASK_A from test 5"; return 1; }
303
-
304
- # Poll up to 10 times (10 sec intervals)
305
- local i output
306
- for i in $(seq 1 10); do
307
- log " --- Poll $i/10 ---"
308
- run_cmd $KCLI dispatch status "$task_id" --project-path "$SANDBOX"
309
- output="$LOG_CMD_OUTPUT"
310
- if echo "$output" | grep -qi "done\|complete\|finished"; then
311
- log " ✓ Task completed"
312
- return 0
313
- fi
314
- sleep 10
315
- done
316
-
317
- # After polling, still check if task is in done dir
318
- if [ -d "$SANDBOX/.kenaz/tasks/done/$task_id" ]; then
319
- log " ✓ Task found in done dir"
320
- return 0
321
- fi
322
-
323
- # Accept any output containing the task ID as partial pass
324
- assert_contains "dispatch status" "$output" "$task_id" || return 1
325
- return 0
326
- }
327
-
328
- # =========================================
329
- # Test 8: dispatch run --auto
330
- # =========================================
331
- test_8_dispatch_auto() {
332
- run_cmd $KCLI dispatch run --auto --project-path "$SANDBOX"
333
- local output="$LOG_CMD_OUTPUT"
334
- # Should scan backlog and attempt to dispatch remaining tasks
335
- assert_contains "dispatch auto" "$output" "backlog\|scan\|dispatch\|TASK_\|no.*task\|0 " || return 1
336
- return 0
337
- }
338
-
339
283
  # =========================================
340
284
  # Test 9: task delete -> verify
341
285
  # =========================================
@@ -412,19 +356,12 @@ test_11_dry_run() {
412
356
  output="$LOG_CMD_OUTPUT"
413
357
  assert_contains "delete dry-run" "$output" "dry-run\|dry.run\|dryRun" || return 1
414
358
 
415
- # 4. dispatch run --dry-run
416
- log " --- dry-run: dispatch run ---"
417
- run_cmd $KCLI dispatch run "$tb" --project-path "$SANDBOX" --dry-run
418
- output="$LOG_CMD_OUTPUT"
419
- assert_contains "dispatch dry-run" "$output" "dry-run\|dry.run\|dryRun" || return 1
420
-
421
- # 5. specialist run --dry-run
422
359
  log " --- dry-run: specialist run ---"
423
360
  run_cmd $KCLI specialist run --agent Amelia "test" --project-path "$SANDBOX" --dry-run
424
361
  output="$LOG_CMD_OUTPUT"
425
362
  assert_contains "specialist dry-run" "$output" "dry-run\|dry.run\|dryRun" || return 1
426
363
 
427
- # 6. project install --dry-run
364
+ # 4. project install --dry-run
428
365
  log " --- dry-run: project install ---"
429
366
  run_cmd $KCLI project install k-cli --project-path "$SANDBOX" --dry-run
430
367
  output="$LOG_CMD_OUTPUT"
@@ -441,9 +378,6 @@ run_test 2 "ping" test_2_ping
441
378
  run_test 3 "project status" test_3_project_status
442
379
  run_test 4 "specialist list" test_4_specialist_list
443
380
  run_test 5 "task create x3" test_5_task_create
444
- run_test 6 "dispatch run" test_6_dispatch_run
445
- run_test 7 "dispatch status" test_7_dispatch_status
446
- run_test 8 "dispatch run --auto" test_8_dispatch_auto
447
381
  run_test 9 "task delete" test_9_task_delete
448
382
  run_test 10 "specialist run Amelia" test_10_specialist_run
449
383
  run_test 11 "--dry-run" test_11_dry_run
@@ -23,6 +23,7 @@ ARGUMENTS 含 `[專案: X]` 或 `--project-path X` → PROJECT_PATH = X,下方
23
23
  - 有**對照組**:證明測試在舊程式上會失敗,或修改前後結果不同。
24
24
  - subagent 回報「未驗證」的項目,由你補驗或明講仍未驗證。
25
25
  - 合併:`git merge` 後跑相關測試(或 `node "${CLAUDE_PLUGIN_ROOT}/hooks/core-resolve.js" .specialist/Ansuz/tools/verify-and-land.js`),用這個專案自己的測試指令。
26
+ - 檔案長度:verify-and-land 合併前會跑 `check-file-size`(警告 1000 / 上限 2000 行,既有超長檔只擋「未配套拆分的增長」);被擋就按職責拆成 module / component / hook。
26
27
  - 只在 Kenaz 核心 repo 本身:Rust 測試走 `npm run test:rust` / `dev/scripts/rust-verify-worktree.js`。
27
28
 
28
29
  ## 回報
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "kenaz",
3
- "version": "0.3.5",
3
+ "version": "0.3.6",
4
4
  "description": "Install Kenaz (plugin, hooks, kenaz-server) for Claude Code and Codex: npx kenaz install",
5
5
  "bin": {
6
6
  "kenaz": "bin/kenaz.js"
@@ -20,11 +20,11 @@
20
20
  "test": "node --test lib/cli.test.js"
21
21
  },
22
22
  "optionalDependencies": {
23
- "@kenazai/server-darwin-arm64": "0.3.5",
24
- "@kenazai/server-darwin-x64": "0.3.5",
25
- "@kenazai/server-linux-arm64": "0.3.5",
26
- "@kenazai/server-linux-x64": "0.3.5",
27
- "@kenazai/server-win32-x64": "0.3.5"
23
+ "@kenazai/server-darwin-arm64": "0.3.6",
24
+ "@kenazai/server-darwin-x64": "0.3.6",
25
+ "@kenazai/server-linux-arm64": "0.3.6",
26
+ "@kenazai/server-linux-x64": "0.3.6",
27
+ "@kenazai/server-win32-x64": "0.3.6"
28
28
  },
29
29
  "license": "UNLICENSED",
30
30
  "repository": {
@@ -1,299 +0,0 @@
1
- skill: forge
2
- formation: legion
3
- version: "1.0"
4
-
5
- name: Forge
6
- description: |
7
- 順序流水線:設計 → 打造 → 淬煉。
8
- 一個人設計藍圖,多個人照藍圖打造,一個人驗收淬煉。
9
- 每個階段的產出是下一階段的輸入。階段之間有回饋循環 — 打造時發現設計問題可以即時回報修正。
10
- 這是 Legion 最經典的模式:有序、有回饋、有品質把關。
11
-
12
- # ─────────────────────────────────────────
13
- # 溝通模式(核心設計)
14
- # ─────────────────────────────────────────
15
-
16
- topology: pipeline
17
- # designer → implementer(s) → reviewer
18
- # ↑ 回饋修正 ←─────────────↓
19
-
20
- communication:
21
- core_pattern: |
22
- 順序傳遞 + 回饋循環:
23
- 1. Designer 產出藍圖(介面契約、架構設計、遷移計劃)
24
- 2. Implementer(s) 按藍圖執行,遇到問題即時回報 Designer
25
- 3. Reviewer 驗收每個 Implementer 的產出,不通過則打回修正
26
- 4. 全部通過後,Reviewer 通知 Team Lead
27
-
28
- triggers:
29
- - name: 藍圖發布
30
- when: Designer 完成或更新設計
31
- who: designer → all implementers + reviewer
32
- content: 介面契約、架構設計、分工建議
33
-
34
- - name: 問題回報
35
- when: Implementer 發現藍圖有問題(設計不可行、漏洞、矛盾)
36
- who: implementer → designer
37
- content: 問題描述、影響範圍、建議修正
38
-
39
- - name: 跨邊界通知
40
- when: Implementer 修改了影響其他 Implementer 的介面
41
- who: implementer → implementer
42
- content: 修改的介面、舊 → 新、需要對方配合的變更
43
-
44
- - name: 完成通知
45
- when: Implementer 完成分配的工作
46
- who: implementer → reviewer
47
- content: 完成的模組、修改的檔案、風險點
48
-
49
- - name: 審查結果
50
- when: Reviewer 完成審查
51
- who: reviewer → implementer
52
- content: 通過 / 需修正(附具體問題和位置)
53
-
54
- - name: 全部通過
55
- when: 所有 Implementer 的產出都通過審查
56
- who: reviewer → team-lead
57
- content: 審查摘要、整體品質評估
58
-
59
- broadcast_policy: |
60
- 只在以下情況 broadcast:
61
- - 藍圖有破壞性變更(所有人都要更新認知)
62
- - Team Lead 調整分工
63
- 其他一律用 message 直接溝通。
64
-
65
- # ─────────────────────────────────────────
66
- # 成員定義(動態,由 Lead 根據任務決定)
67
- # ─────────────────────────────────────────
68
-
69
- members:
70
- roles:
71
- - id: designer
72
- name: Designer
73
- count: 1
74
- description: |
75
- 設計藍圖的人。可以是架構師、API 設計師、遷移規劃者 — 取決於任務。
76
- 核心產出:藍圖(介面契約、架構圖、遷移步驟、分工建議)。
77
- responsibilities:
78
- - 分析需求,設計解決方案
79
- - 定義介面契約(型別、函數簽名、模組邊界)
80
- - 規劃實作順序和分工建議
81
- - 回應 Implementer 的問題回報,必要時更新藍圖
82
- sends_to: [implementers, reviewer]
83
- receives_from: [implementers, reviewer]
84
-
85
- - id: implementer
86
- name: Implementer
87
- count: "1-3(由 Lead 根據任務規模決定)"
88
- description: |
89
- 按藍圖打造的人。拿到 Designer 的藍圖和分配的範圍,執行實作。
90
- 發現問題即時回報 Designer,不要自己猜。
91
- responsibilities:
92
- - 按藍圖和分配的範圍執行實作
93
- - 更新所有受影響的引用和依賴
94
- - 跨邊界變更時通知其他 Implementer
95
- - 完成後通知 Reviewer
96
- sends_to: [designer, other_implementers, reviewer]
97
- receives_from: [designer, other_implementers, reviewer]
98
-
99
- - id: reviewer
100
- name: Reviewer
101
- count: 1
102
- description: |
103
- 淬煉品質的人。驗收每個 Implementer 的產出,確保符合藍圖、無遺漏、品質達標。
104
- 發現問題直接打回對應 Implementer,架構層級問題升級給 Designer。
105
- responsibilities:
106
- - 審查每個 Implementer 的產出
107
- - 驗證介面一致性(新介面在所有消費端正確使用)
108
- - 檢查舊名稱/舊路徑殘留
109
- - 執行測試,確認不破壞現有功能
110
- sends_to: [implementers, designer, team-lead]
111
- receives_from: [implementers, designer]
112
-
113
- # ─────────────────────────────────────────
114
- # 生命週期
115
- # ─────────────────────────────────────────
116
-
117
- lifecycle:
118
- phases:
119
- - phase: design
120
- description: Designer 分析需求、產出藍圖
121
- lead_actions:
122
- - 建立團隊(TeamCreate)
123
- - 派出 Designer
124
- - 等待藍圖產出
125
- exit_criteria:
126
- - Designer 產出完整藍圖(介面契約 + 分工建議)
127
- - Lead 確認藍圖合理
128
-
129
- - phase: build
130
- description: Implementer(s) 按藍圖執行,Reviewer 同步就位
131
- lead_actions:
132
- - 根據藍圖的分工建議,派出 Implementer(s) 和 Reviewer
133
- - Broadcast 藍圖給所有成員
134
- - 監控跨邊界溝通,協調衝突
135
- member_actions:
136
- - Implementer(s) 按分配的範圍執行
137
- - 遇到問題 → SendMessage 給 Designer
138
- - 完成 → SendMessage 給 Reviewer
139
- - Reviewer 逐一審查
140
-
141
- - phase: temper
142
- description: 全面驗證、修正、淬煉品質
143
- lead_actions:
144
- - 確認所有 Implementer 的產出通過 Reviewer 審查
145
- - 處理未通過的修正循環(Reviewer → Implementer → Reviewer)
146
- - 全量測試
147
- exit_criteria:
148
- - 所有模組通過審查
149
- - 無編譯/型別錯誤
150
- - 測試通過
151
- - Grep 確認無舊名稱殘留
152
-
153
- - phase: teardown
154
- description: 收集成果、關閉團隊
155
- lead_actions:
156
- - 收集 Designer 的藍圖文件
157
- - 收集 Implementer 的變更清單
158
- - 收集 Reviewer 的審查結果
159
- - 整合為完成報告
160
- - shutdown_request 給所有成員
161
-
162
- # ─────────────────────────────────────────
163
- # 輸入輸出
164
- # ─────────────────────────────────────────
165
-
166
- input:
167
- required:
168
- - task: 任務 ID 或描述
169
- optional:
170
- - blueprint: 已有的設計藍圖(如有,跳過 design 階段)
171
- - scope: 限制範圍
172
- - preserve: 不可修改的檔案或介面
173
-
174
- output:
175
- primary: |
176
- 完成報告:
177
- - 藍圖摘要(Designer 產出)
178
- - 修改的檔案列表(按 Implementer 分組)
179
- - 審查結果(Reviewer 產出)
180
- - 測試結果
181
- secondary: |
182
- - 發現但未處理的技術債
183
- - 建議的後續任務
184
-
185
- # ─────────────────────────────────────────
186
- # 行為準則(Team Lead)
187
- # ─────────────────────────────────────────
188
-
189
- behavior:
190
- - 先 design 再 build — 不要跳過藍圖直接開工
191
- - Designer 的藍圖是唯一的真相來源(single source of truth)
192
- - Implementer 之間的分工要明確,避免改同一個檔案
193
- - Reviewer 說「需修正」時,必須修完才能進入 temper
194
- - 控制團隊規模:1 Designer + 1~3 Implementers + 1 Reviewer(最多 5 人)
195
- - 結束前用 Grep 掃描舊名稱殘留
196
-
197
- # ─────────────────────────────────────────
198
- # 成員 Prompt 模板
199
- # ─────────────────────────────────────────
200
-
201
- member_prompts:
202
- designer: |
203
- ## Role
204
- 你是 Forge 的 Designer — 鍛造的第一步,設計藍圖。
205
-
206
- ## 你的職責
207
- - 分析需求,設計解決方案
208
- - 產出藍圖:介面契約、架構設計、實作步驟、分工建議
209
- - 回應 Implementer 的問題回報
210
-
211
- ## 溝通
212
- - 藍圖完成 → broadcast 給所有成員
213
- - 收到問題回報 → 評估後更新藍圖並通知
214
- - 藍圖有破壞性變更 → broadcast
215
-
216
- ## 任務
217
- {designer_task_description}
218
-
219
- implementer: |
220
- ## Role
221
- 你是 Forge 的 Implementer — 鍛造的核心,按藍圖打造。
222
-
223
- ## 你的職責
224
- - 按 Designer 的藍圖執行你負責的部分
225
- - 更新所有受影響的引用和依賴
226
- - 發現問題即時回報 Designer,不要自己猜
227
-
228
- ## 溝通
229
- - 跨邊界變更 → SendMessage 給其他 Implementer
230
- - 發現藍圖問題 → SendMessage 給 Designer
231
- - 完成 → SendMessage 給 Reviewer
232
- - 收到審查意見 → 修正後回覆 Reviewer
233
-
234
- ## 你負責的範圍
235
- {implementer_scope}
236
-
237
- ## 藍圖
238
- {blueprint}
239
-
240
- reviewer: |
241
- ## Role
242
- 你是 Forge 的 Reviewer — 鍛造的最後一步,淬煉品質。
243
-
244
- ## 你的職責
245
- - 審查每個 Implementer 的產出
246
- - 驗證介面一致性
247
- - 檢查舊名稱/舊路徑殘留
248
- - 執行測試
249
-
250
- ## 溝通
251
- - 審查通過 → SendMessage 給對應 Implementer 確認
252
- - 需要修正 → SendMessage 給對應 Implementer(附問題詳情)
253
- - 架構問題 → SendMessage 給 Designer
254
- - 全部通過 → SendMessage 給 team-lead
255
-
256
- ## 藍圖
257
- {blueprint}
258
-
259
- # ─────────────────────────────────────────
260
- # 任務系統整合
261
- # ─────────────────────────────────────────
262
-
263
- collaboration:
264
- task_api: node .collaboration/core/task-api.js
265
-
266
- workflow:
267
- - step: 讀取任務
268
- run: node .collaboration/core/task-api.js get {task_id}
269
-
270
- - step: 認領任務
271
- run: node .collaboration/core/task-api.js claim {task_id}
272
-
273
- - step: design 階段
274
- actions:
275
- - 建立團隊(TeamCreate)
276
- - 派出 Designer 分析並設計
277
- - 等待藍圖產出
278
-
279
- - step: build 階段
280
- actions:
281
- - 根據藍圖分工,派出 Implementer(s) 和 Reviewer
282
- - Broadcast 藍圖
283
- - 監控溝通,協調衝突
284
-
285
- - step: temper 階段
286
- actions:
287
- - 確認所有產出通過審查
288
- - 處理修正循環
289
- - 全量測試
290
-
291
- - step: teardown
292
- actions:
293
- - 收集成果,關閉團隊
294
-
295
- - step: 完成任務
296
- run: node .collaboration/core/task-api.js complete {task_id}
297
-
298
- on_blocked:
299
- run: node .collaboration/core/task-api.js move {task_id} blocked