@ngockhoale/ukit 3.4.67 → 3.4.69

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 (63) hide show
  1. package/CHANGELOG.md +21 -0
  2. package/manifests/documentation.yaml +33 -0
  3. package/manifests/instructionRules.yaml +10 -0
  4. package/manifests/platform.full.yaml +67 -0
  5. package/package.json +1 -1
  6. package/src/core/applyPlan.js +111 -2
  7. package/src/core/buildPlan.js +3 -1
  8. package/src/core/diffPlan.js +49 -1
  9. package/src/core/executionContracts.js +49 -8
  10. package/src/core/metadata.js +45 -0
  11. package/src/core/runInstallPipeline.js +30 -2
  12. package/src/core/uninstall.js +106 -2
  13. package/src/manifest/validateManifest.js +25 -1
  14. package/template_project/.claude/agents/code-reviewer.md +22 -9
  15. package/template_project/.claude/agents/handoff-planner.md +97 -8
  16. package/template_project/.claude/commands/ukit/handoff-create.md +114 -19
  17. package/template_project/.claude/commands/ukit/handoff-fullstack.md +247 -79
  18. package/template_project/.claude/commands/ukit/handoff-implement.md +75 -40
  19. package/template_project/.claude/commands/ukit/handoff-review.md +14 -10
  20. package/template_project/.claude/hooks/auto-allow-bash.sh +73 -12
  21. package/template_project/.claude/hooks/auto-prune-bash.sh +10 -0
  22. package/template_project/.claude/hooks/delegation-gate.mjs +21 -0
  23. package/template_project/.claude/hooks/handoff-model-guard.sh +22 -6
  24. package/template_project/.claude/hooks/handoff-resume.sh +141 -1
  25. package/template_project/.claude/hooks/record-execution.mjs +140 -9
  26. package/template_project/.claude/hooks/skill-router.sh +173 -8
  27. package/template_project/.claude/settings.json +2 -2
  28. package/template_project/.claude/skills/advisor-plan/REFERENCE.md +10 -0
  29. package/template_project/.claude/skills/advisor-plan/SKILL.md +2 -2
  30. package/template_project/.claude/ukit/index/allocate-task-worktree.mjs +15 -0
  31. package/template_project/.claude/ukit/index/amend-guard.mjs +116 -0
  32. package/template_project/.claude/ukit/index/cleanup-task-worktree.mjs +1 -1
  33. package/template_project/.claude/ukit/index/land-worktree.mjs +243 -21
  34. package/template_project/.claude/ukit/index/plan-count.mjs +115 -0
  35. package/template_project/.claude/ukit/index/ready-gate.mjs +170 -0
  36. package/template_project/.claude/ukit/index/reset-auto-permissions.mjs +293 -4
  37. package/template_project/.claude/ukit/index/route-resolver.mjs +48 -8
  38. package/template_project/.claude/ukit/index/route-task.mjs +180 -11
  39. package/template_project/.claude/ukit/index/source-snapshot.mjs +172 -0
  40. package/template_project/.claude/ukit/index/task-budget-validator.mjs +109 -3
  41. package/template_project/.claude/ukit/runtime/async-lock.mjs +3 -3
  42. package/template_project/.claude/ukit/runtime/execution-ledger.mjs +20 -3
  43. package/template_project/.claude/ukit/runtime/handoff-task-scope.mjs +205 -0
  44. package/template_project/.claude/ukit/runtime/loop-state.mjs +3 -1
  45. package/template_project/.claude/ukit/runtime/plan-dispatch.mjs +32 -5
  46. package/template_project/.claude/ukit/runtime/resumable-run.mjs +310 -21
  47. package/template_project/.claude/ukit/runtime/stop-coordinator.mjs +405 -105
  48. package/template_project/.claude/ukit/runtime/task-record-reconciliation.mjs +46 -0
  49. package/template_project/.claude/ukit/runtime/task-watchdog.mjs +28 -2
  50. package/template_project/.claude/ukit/runtime/worktree-allocation.mjs +75 -0
  51. package/template_project/.codex/README.md +25 -0
  52. package/template_project/.omp/RULES.md +22 -22
  53. package/template_project/.omp/agents/code-reviewer.md +22 -9
  54. package/template_project/.omp/agents/handoff-planner.md +102 -12
  55. package/template_project/.omp/hooks/pre/ukit-bridge.js +1 -1
  56. package/template_project/AGENTS.md +5 -1
  57. package/template_project/CLAUDE.md +1 -1
  58. package/template_project/docs/AI_HANDOFF/RULES.md +8 -0
  59. package/template_project/docs/AI_HANDOFF/tasks/_TEMPLATE.md +8 -1
  60. package/template_project/instructions/core.md +5 -1
  61. package/template_project/instructions/layout.yaml +2 -0
  62. package/template_project/instructions/overlays/omp-rules.md +22 -22
  63. package/template_project/ukit/storage/config.json +1 -1
@@ -152,7 +152,11 @@ DuraOne skill chỉ active khi pack `duraone` được cài hoặc `.claude/skil
152
152
 
153
153
  ## Handoff Fullstack Rules
154
154
  <!-- RULE: HAND-02 -->
155
- - `docs/AI_HANDOFF/RUN.md` là run cursor có thẩm quyền; `Phase:` ≠ `done`/`blocked` = run còn sống — Stop gate từ chối stop, trả về `Next:`. Chỉ `HANDOFF FULLSTACK COMPLETE`/`BLOCKED` kết thúc run — recap/checkpoint không phải completion; resume chỉ tiếp tục frozen scope khi `Paused: no` và session thuộc ownership (resume marker hoặc `/ukit:handoff-fullstack` tường minh), không tự inject ở startup/clear mới. Kết thúc cycle: docs sync → archive completed-only `ARCHIVE/cycle-NN/` → `Phase: done`; `handoff-clear` khi còn việc mở đặt `Paused: yes` (giữ phase/scope/recovery, không mint completion, không xóa cursor). Full rules: `docs/AI_HANDOFF/RULES.md`.
155
+ - `docs/AI_HANDOFF/RUN.md` là run cursor có thẩm quyền; `Phase:` ≠ `done`/`blocked` = run còn sống — Stop gate từ chối stop, trả về `Next:`. Chỉ `HANDOFF FULLSTACK COMPLETE`/`BLOCKED` kết thúc run — recap/checkpoint không phải completion; resume chỉ tiếp tục frozen scope khi `Paused: no` và session thuộc ownership (resume marker hoặc `/ukit:handoff-fullstack` tường minh), không tự inject ở startup/clear mới. Kết thúc cycle: docs sync → archive completed-only `ARCHIVE/cycle-NN/` → `Phase: done`; `handoff-clear` khi còn việc mở đặt `Paused: yes` (giữ phase/scope/recovery, không mint completion, không xóa cursor). Full rules: `docs/AI_HANDOFF/RULES.md`. Trước khi stop: reconcile task/AC/findings/jobs/independent work/integration/release/consumer/pause/blocker; Stop gate chỉ là backstop. Turn wait ≠ run done; blocker chỉ release khi không còn READY independent work.
156
+
157
+ ## Handoff Planning Gates
158
+ <!-- RULE: HAND-03 -->
159
+ - Tasks born `needs_breakdown`; flip to `ready` only after the validator's `VERDICT: ok` recorded on disk (`node .claude/ukit/index/task-budget-validator.mjs --record <task.md>`) AND `PLAN_REVIEW: Approved` in PLAN.md — and `node .claude/ukit/index/ready-gate.mjs <root>` prints `READY_GATE: ok` before any flip. Owner documents: `node .claude/ukit/index/source-snapshot.mjs <original> docs/AI_HANDOFF/SOURCE.md` before planning reads them (`source snapshot MISSING` when it cannot run). Implementation lands via `node .claude/ukit/index/land-worktree.mjs` (receipt-backed); overwriting PLAN/SPEC/LEDGER needs an `amendments/rev-<NN>/` copy (`node .claude/ukit/index/amend-guard.mjs`). All bare single `node` commands — no `cd`, no `$()`, no compounds.
156
160
 
157
161
  ## Compact Instructions
158
162
  Compact giữa handoff run: giữ goal, RUN.md path + phase, task inventory + task đang làm, `Next:` step, blockers, verification evidence, commits, worktree/copy-back state, "compact không phải completion". Sau compact: đọc lại RUN.md + INDEX.md rồi chạy `Next:`.
@@ -144,7 +144,7 @@ DuraOne skill chỉ active khi pack `duraone` được cài hoặc `.claude/skil
144
144
 
145
145
  ## Handoff Fullstack Rules
146
146
  <!-- RULE: HAND-02 -->
147
- - `docs/AI_HANDOFF/RUN.md` là run cursor có thẩm quyền; `Phase:` ≠ `done`/`blocked` = run còn sống — Stop gate từ chối stop, trả về `Next:`. Chỉ `HANDOFF FULLSTACK COMPLETE`/`BLOCKED` kết thúc run — recap/checkpoint không phải completion; resume chỉ tiếp tục frozen scope khi `Paused: no` và session thuộc ownership (resume marker hoặc `/ukit:handoff-fullstack` tường minh), không tự inject ở startup/clear mới. Kết thúc cycle: docs sync → archive completed-only `ARCHIVE/cycle-NN/` → `Phase: done`; `handoff-clear` khi còn việc mở đặt `Paused: yes` (giữ phase/scope/recovery, không mint completion, không xóa cursor). Full rules: `docs/AI_HANDOFF/RULES.md`.
147
+ - `docs/AI_HANDOFF/RUN.md` là run cursor có thẩm quyền; `Phase:` ≠ `done`/`blocked` = run còn sống — Stop gate từ chối stop, trả về `Next:`. Chỉ `HANDOFF FULLSTACK COMPLETE`/`BLOCKED` kết thúc run — recap/checkpoint không phải completion; resume chỉ tiếp tục frozen scope khi `Paused: no` và session thuộc ownership (resume marker hoặc `/ukit:handoff-fullstack` tường minh), không tự inject ở startup/clear mới. Kết thúc cycle: docs sync → archive completed-only `ARCHIVE/cycle-NN/` → `Phase: done`; `handoff-clear` khi còn việc mở đặt `Paused: yes` (giữ phase/scope/recovery, không mint completion, không xóa cursor). Full rules: `docs/AI_HANDOFF/RULES.md`. Trước khi stop: reconcile task/AC/findings/jobs/independent work/integration/release/consumer/pause/blocker; Stop gate chỉ là backstop. Turn wait ≠ run done; blocker chỉ release khi không còn READY independent work.
148
148
 
149
149
  ## Compact Instructions
150
150
  Compact giữa handoff run: giữ goal, RUN.md path + phase, task inventory + task đang làm, `Next:` step, blockers, verification evidence, commits, worktree/copy-back state, "compact không phải completion". Sau compact: đọc lại RUN.md + INDEX.md rồi chạy `Next:`.
@@ -231,6 +231,14 @@ A task is `ready` only when it has:
231
231
 
232
232
  Missing any → `needs_breakdown`, `blocked`, or `needs_human`.
233
233
 
234
+ **`ready` là verdict, không phải default:** planner viết task với `needs_breakdown`; task chỉ
235
+ được chuyển `ready` khi CẢ hai gate đã pass — (1) `node .claude/ukit/index/task-budget-validator.mjs
236
+ docs/AI_HANDOFF/tasks/TASK-xxx.md` (một lệnh đơn giản mỗi file, đường dẫn literal, không `cd`/loop/
237
+ biến shell/pipe) in `VERDICT: ok` (hoặc dismissal được ghi trong `## Discussion`), và (2) plan review
238
+ độc lập kết thúc `Approved`. Budget cạn / lệnh bị denial / gián đoạn trước khi đủ gate → task vẫn
239
+ `needs_breakdown`, và `INDEX.md` + `ACTIVE.md` phải ghi rõ gate nào còn thiếu — executor chỉ bao giờ
240
+ pick `ready`.
241
+
234
242
 
235
243
  ## Clear Handoff
236
244
 
@@ -6,7 +6,7 @@ File này BẮT BUỘC giữ structure: Goal + Test Cases + Test Files + Verific
6
6
  Mọi AI (planner / executor / reviewer) đọc và ghi vào file NÀY. Không trao đổi ngoài file.
7
7
  -->
8
8
 
9
- - Status: `ready` <!-- ready | in_progress | pending_review | changes_requested | critical_block | approved | approved_minor | blocked | done | cancelled_superseded -->
9
+ - Status: `needs_breakdown` <!-- ready | needs_breakdown | in_progress | pending_review | changes_requested | critical_block | approved | approved_minor | blocked | done | cancelled_superseded. A planner writes tasks `needs_breakdown`; they flip to `ready` only after the task-budget validator verdict is ok (or a documented dismissal) AND the independent plan review is Approved -->
10
10
  - Size: `M` <!-- S | M | L — runtime budgets key off this field; defaults to M when missing -->
11
11
  - Owner: `-` <!-- tool đang giữ task -->
12
12
  - Reviewer: `-` <!-- model name reviewer dùng, set ở Phase 4 -->
@@ -91,6 +91,13 @@ Format mỗi comment:
91
91
  <nội dung — câu hỏi, lưu ý, đề xuất, đẩy ngược về phase trước>
92
92
 
93
93
  Reply lùn 1 level (####). Ghi rõ "→ @planner" / "→ @executor" / "→ @reviewer" nếu có người nhận cụ thể.
94
+
95
+ Planner persist verdict NGAY khi nó tồn tại: ngay sau mỗi lượt chạy task-budget validator,
96
+ append một dòng vào thread này — `### <date> · planner · Validator: ok <YYYY-MM-DD>`
97
+ (hoặc `### <date> · planner · Validator: dismissed <YYYY-MM-DD> — <reason>`). Bước
98
+ flip-to-ready (sau khi plan review `Approved`) đọc các dòng đã ghi trên disk này để quyết
99
+ định — task không có dòng `Validator:` được ghi thì giữ `needs_breakdown`, dù session còn
100
+ nhớ verdict cũ (compaction-safe).
94
101
  -->
95
102
 
96
103
  (chưa có comment)
@@ -141,7 +141,11 @@ DuraOne skill chỉ active khi pack `duraone` được cài hoặc `.claude/skil
141
141
 
142
142
  ## Handoff Fullstack Rules
143
143
  <!-- RULE: HAND-02 -->
144
- - `docs/AI_HANDOFF/RUN.md` là run cursor có thẩm quyền; `Phase:` ≠ `done`/`blocked` = run còn sống — Stop gate từ chối stop, trả về `Next:`. Chỉ `HANDOFF FULLSTACK COMPLETE`/`BLOCKED` kết thúc run — recap/checkpoint không phải completion; resume chỉ tiếp tục frozen scope khi `Paused: no` và session thuộc ownership (resume marker hoặc `/ukit:handoff-fullstack` tường minh), không tự inject ở startup/clear mới. Kết thúc cycle: docs sync → archive completed-only `ARCHIVE/cycle-NN/` → `Phase: done`; `handoff-clear` khi còn việc mở đặt `Paused: yes` (giữ phase/scope/recovery, không mint completion, không xóa cursor). Full rules: `docs/AI_HANDOFF/RULES.md`.
144
+ - `docs/AI_HANDOFF/RUN.md` là run cursor có thẩm quyền; `Phase:` ≠ `done`/`blocked` = run còn sống — Stop gate từ chối stop, trả về `Next:`. Chỉ `HANDOFF FULLSTACK COMPLETE`/`BLOCKED` kết thúc run — recap/checkpoint không phải completion; resume chỉ tiếp tục frozen scope khi `Paused: no` và session thuộc ownership (resume marker hoặc `/ukit:handoff-fullstack` tường minh), không tự inject ở startup/clear mới. Kết thúc cycle: docs sync → archive completed-only `ARCHIVE/cycle-NN/` → `Phase: done`; `handoff-clear` khi còn việc mở đặt `Paused: yes` (giữ phase/scope/recovery, không mint completion, không xóa cursor). Full rules: `docs/AI_HANDOFF/RULES.md`. Trước khi stop: reconcile task/AC/findings/jobs/independent work/integration/release/consumer/pause/blocker; Stop gate chỉ là backstop. Turn wait ≠ run done; blocker chỉ release khi không còn READY independent work.
145
+
146
+ ## Handoff Planning Gates
147
+ <!-- RULE: HAND-03 -->
148
+ - Tasks born `needs_breakdown`; flip to `ready` only after the validator's `VERDICT: ok` recorded on disk (`node .claude/ukit/index/task-budget-validator.mjs --record <task.md>`) AND `PLAN_REVIEW: Approved` in PLAN.md — and `node .claude/ukit/index/ready-gate.mjs <root>` prints `READY_GATE: ok` before any flip. Owner documents: `node .claude/ukit/index/source-snapshot.mjs <original> docs/AI_HANDOFF/SOURCE.md` before planning reads them (`source snapshot MISSING` when it cannot run). Implementation lands via `node .claude/ukit/index/land-worktree.mjs` (receipt-backed); overwriting PLAN/SPEC/LEDGER needs an `amendments/rev-<NN>/` copy (`node .claude/ukit/index/amend-guard.mjs`). All bare single `node` commands — no `cd`, no `$()`, no compounds.
145
149
 
146
150
  ## Compact Instructions
147
151
  Compact giữa handoff run: giữ goal, RUN.md path + phase, task inventory + task đang làm, `Next:` step, blockers, verification evidence, commits, worktree/copy-back state, "compact không phải completion". Sau compact: đọc lại RUN.md + INDEX.md rồi chạy `Next:`.
@@ -69,6 +69,7 @@ outputs:
69
69
  - { from: core, heading: DuraOne Skill — Conditional Activation }
70
70
  - { from: core, heading: Completion Checklist }
71
71
  - { from: core, heading: Handoff Fullstack Rules }
72
+ - { from: core, heading: Handoff Planning Gates }
72
73
  - { from: core, heading: Compact Instructions }
73
74
  trailer: '{{codegraphSection}}'
74
75
  - target: template_project/.omp/RULES.md
@@ -143,5 +144,6 @@ outputs:
143
144
  - { from: core, heading: DuraOne Skill — Conditional Activation }
144
145
  - { from: core, heading: Completion Checklist }
145
146
  - { from: core, heading: Handoff Fullstack Rules }
147
+ - { from: core, heading: Handoff Planning Gates }
146
148
  - { from: core, heading: Compact Instructions }
147
149
  trailer: '{{codegraphSection}}'
@@ -9,8 +9,7 @@ nothing else is loaded. Keep this short: every line here is a per-turn tax.
9
9
  - **Non-trivial / risky** (auth, migration, shared runtime, data-loss, flaky) — index-first, then
10
10
  activate the matching skill, then verify.
11
11
 
12
- Pick the lane before the first tool call. Skipping this is what turns a direct chat into a
13
- scattershot one.
12
+ Pick the lane before the first tool call — skipping this is what turns a direct chat into a scattershot one.
14
13
 
15
14
  ## 2. Execution Contract
16
15
 
@@ -30,9 +29,9 @@ files before widening further. These node scripts work unchanged under omp.
30
29
 
31
30
  ## 5. Auto-activate skills
32
31
 
33
- Skills live in `.claude/skills/` and omp reads them through its `claude` discovery provider — no
34
- mirror under `.omp/`. On any non-trivial task, and again after the first tool calls reveal what the
35
- work really is, read the matching `SKILL.md` without being asked. Users never name skills.
32
+ Skills live in `.claude/skills/`, read by omp through its `claude` discovery provider — no mirror under
33
+ `.omp/`. On any non-trivial task — and again after the first tool calls reveal the real work — read the
34
+ matching `SKILL.md` without being asked. Users never name skills.
36
35
 
37
36
  ## 6. Delegate to bind a model tier
38
37
 
@@ -40,36 +39,37 @@ Your own model does not change mid-turn. A tier only applies when work is handed
40
39
  `.omp/agents/`, whose `model:` field (`@smol` / `@default` / `@slow` / `@vision`) resolves through
41
40
  `modelRoles` in `.omp/config.yml`.
42
41
 
43
- - `tiny-fix` → `@smol` · `local-fix`, `local-build`, `shared-edit`, `find-cause`, `map-impact` →
44
- `@default` · `review-release` → `@slow`
45
- - Images: `@vision` only. `@default`/`@slow` cannot see images on the UNIC gateway and must never
46
- guess at their contents — hand every image to `ukit-vision-analyst` first.
42
+ - `tiny-fix` → `@smol` · `local-fix`/`local-build`/`shared-edit`/`find-cause`/`map-impact` → `@default` · `review-release` → `@slow`
43
+ - Images: `@vision` only — `@default`/`@slow` cannot see images on the UNIC gateway; hand every image to `ukit-vision-analyst` first.
47
44
 
48
45
  Doing everything inline is what makes UKit look like it only has one model. Keep direct execution
49
46
  for trivial/simple work; delegate when the tier differs or a noisy lane would flood this context.
50
47
 
51
48
  ## 7. Safe Patch
52
49
 
53
- Prefer unique current-file anchors over line numbers or stale pasted blocks. Never silently merge a
54
- stale spec — re-read current source and confirm before applying. Preserve existing BOM and line
55
- endings.
50
+ Prefer unique current-file anchors over line numbers or stale pasted blocks; never silently merge a
51
+ stale spec — re-read current source and confirm before applying. Preserve existing BOM and line endings.
56
52
 
57
53
  ## 8. Handoff runs never park mid-cycle
58
54
 
59
55
  While `docs/AI_HANDOFF/RUN.md` `Phase:` is not `done`/`blocked`, a handoff-fullstack run is
60
56
  still in flight: a recap or checkpoint is progress output, never a stopping point. Continue
61
57
  the cursor's `Next:` step; only `HANDOFF FULLSTACK COMPLETE` or `HANDOFF FULLSTACK BLOCKED`
62
- ends the run. `handoff-clear` must close the cursor (`Phase: done` or delete) or the gate
63
- keeps the next session running too.
58
+ ends the run; `handoff-clear` must close the cursor or the gate keeps the next session running.
59
+ Before any stop, reconcile task/AC/findings/jobs/independent work/integration/release/consumer/
60
+ pause/blocker; the Stop gate is the backstop; a turn wait is not run done; a blocker releases only
61
+ with no READY independent work. Planning gates are mechanical, disk-read: `needs_breakdown`
62
+ tasks flip `ready` only on a recorded validator `VERDICT: ok` + `PLAN_REVIEW: Approved`, with
63
+ `node .claude/ukit/index/ready-gate.mjs docs/AI_HANDOFF` printing `READY_GATE: ok` before the
64
+ flip; owner docs persist via `source-snapshot.mjs`, work lands via `land-worktree.mjs` — all bare
65
+ single `node` commands.
64
66
 
65
67
  ## 9. Never end a turn silently
66
68
 
67
69
  Ending a turn with no output is a defect, not a pause. If you stop before the work is finished, the
68
- last thing you emit is one short line naming what is unfinished and what you need. Silence is never
69
- a status — the user cannot distinguish it from a crash.
70
-
71
- > Maintainer note, not a per-turn rule: `modelRoles` in `.omp/config.yml` ships UNIC gateway names.
72
- > On a non-UNIC provider, edit only the cost tiers `smol`/`default`/`slow` — never `vision`
73
- > (`unic-vision`) or `decision` (`unic-decision`, the LOCAL JEV/Lava typed-decision model —
74
- > `docs/pstack/UNIC_DECISION_GUIDE.md`); both are capability lanes. Aliases `lite`/`code`/`smart`
75
- > map smol↔lite, default↔code, slow↔smart — edit each alongside its tier.
70
+ last line you emit names what is unfinished and what you need. Silence is never a status.
71
+
72
+ > Maintainer note, not a per-turn rule: `modelRoles` ships UNIC gateway names; on a non-UNIC
73
+ > provider edit only cost tiers `smol`/`default`/`slow` — never `vision` (`unic-vision`) or
74
+ > `decision` (`unic-decision`, LOCAL JEV/Lava typed-decision — `docs/pstack/UNIC_DECISION_GUIDE.md`);
75
+ > both capability lanes. Aliases lite/code/smart = smol/default/slow — edit alongside its tier.
@@ -831,7 +831,7 @@
831
831
  "blockOnCritical": "CRITICAL \u2192 block handoff c\u1ee9ng. Set false ch\u1ec9 khi mu\u1ed1n warning m\u1ec1m.",
832
832
  "blockOnChangesRequested": "CHANGES-REQUESTED \u2192 block handoff \u0111\u1ebfn khi fix. Set false s\u1ebd cho ph\u00e9p done v\u1edbi issue Important.",
833
833
  "rerunVerificationCommands": "Reviewer ph\u1ea3i t\u1ef1 ch\u1ea1y l\u1ea1i Verification Commands, kh\u00f4ng tin output executor.",
834
- "appendVerdictToTaskFile": "Reviewer append `## Reviewer Verdict` v\u00e0o task file \u0111\u1ec3 kh\u00e9p v\u00f2ng handoff."
834
+ "appendVerdictToTaskFile": "Persist the reviewer's complete `## Reviewer Verdict` in the task file: the read-only reviewer returns the block; the orchestrator appends it serially with Edit before aggregation/status updates. The legacy key names persistence, not reviewer write authority."
835
835
  },
836
836
  "statusFlow": "Danh s\u00e1ch status h\u1ee3p l\u1ec7 trong INDEX.md. \u0110\u1ed5i t\u00ean trong n\u00e0y = \u0111\u1ed5i state machine handoff.",
837
837
  "fullstack": {