@ngockhoale/ukit 3.1.0 → 3.1.2

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.
@@ -84,39 +84,67 @@
84
84
  "defaultModel": "claude-sonnet-5"
85
85
  },
86
86
  "routing": {
87
- "routeSchema": { "stage": "off" },
88
- "rigor": { "stage": "shadow" },
89
- "fastPath": { "stage": "shadow" },
90
- "escalation": { "stage": "shadow" }
87
+ "routeSchema": {
88
+ "stage": "off"
89
+ },
90
+ "rigor": {
91
+ "stage": "shadow"
92
+ },
93
+ "fastPath": {
94
+ "stage": "shadow"
95
+ },
96
+ "escalation": {
97
+ "stage": "shadow"
98
+ }
91
99
  },
92
100
  "decisionPlane": {
93
101
  "enabled": true,
94
102
  "stage": "off",
95
103
  "logicalModel": "unic-decision",
96
104
  "checkpoints": {
97
- "default": "unic-decision/laya-multilingual",
98
- "english": "unic-decision/laya",
99
- "unknownLanguage": "unic-decision/auto"
105
+ "default": "unic-decision",
106
+ "english": "unic-decision",
107
+ "unknownLanguage": "unic-decision"
100
108
  },
101
109
  "timeoutMs": 5000,
102
- "maxStateTokens": { "multilingual": 1024, "english": 512 },
110
+ "maxStateTokens": {
111
+ "multilingual": 1024,
112
+ "english": 512
113
+ },
103
114
  "maxEnumLabels": 11,
104
115
  "maxBatchQuestions": 8,
105
116
  "preflightRequired": true,
106
- "portableReasoningEfforts": ["low", "medium", "high", "max"],
107
- "leaseChoices": [1, 2, 5, 10],
117
+ "portableReasoningEfforts": [
118
+ "low",
119
+ "medium",
120
+ "high",
121
+ "max"
122
+ ],
123
+ "leaseChoices": [
124
+ 1,
125
+ 2,
126
+ 5,
127
+ 10
128
+ ],
108
129
  "cachePolicy": {
109
130
  "decideBeforeLane": true,
110
131
  "freezeCacheSensitiveFields": true,
111
132
  "requireVerifiedNativeUpdate": true
112
133
  },
113
- "circuitBreaker": { "failureThreshold": 3, "cooldownMs": 30000 },
134
+ "circuitBreaker": {
135
+ "failureThreshold": 3,
136
+ "cooldownMs": 30000
137
+ },
114
138
  "families": {}
115
139
  },
116
140
  "modelRoles": {
117
141
  "code": "code",
118
142
  "judgment": "smart",
119
- "review-panel": ["smart", "code", "lite"],
143
+ "review-panel": [
144
+ "smart",
145
+ "code",
146
+ "lite"
147
+ ],
120
148
  "fast-worker": "lite",
121
149
  "vision": "vision"
122
150
  },
@@ -195,7 +223,7 @@
195
223
  "ompRole": "vision",
196
224
  "fallbackModel": "claude-sonnet-5",
197
225
  "capabilityTier": true,
198
- "note": "Capability tier, not a cost tier. Orthogonal to lite/code/smart — never insert into escalation.tierOrder. fallbackModel is used when unicMode is off."
226
+ "note": "Capability tier, not a cost tier. Orthogonal to lite/code/smart \u2014 never insert into escalation.tierOrder. fallbackModel is used when unicMode is off."
199
227
  }
200
228
  },
201
229
  "escalation": {
@@ -211,7 +239,10 @@
211
239
  },
212
240
  "codeIntel": {
213
241
  "enabled": true,
214
- "router": { "enabled": true, "defaultMode": "auto" },
242
+ "router": {
243
+ "enabled": true,
244
+ "defaultMode": "auto"
245
+ },
215
246
  "budgets": {
216
247
  "peek": 500,
217
248
  "targeted": 2000,
@@ -220,29 +251,72 @@
220
251
  "deep_flow": 6000,
221
252
  "analogy": 4000
222
253
  },
223
- "freshness": { "guardLevel": "L0", "autoRefresh": false, "incremental": true },
254
+ "freshness": {
255
+ "guardLevel": "L0",
256
+ "autoRefresh": false,
257
+ "incremental": true
258
+ },
224
259
  "retriever": {
225
260
  "limit": 20,
226
- "bm25": { "k1": 1.2, "b": 0.75 },
261
+ "bm25": {
262
+ "k1": 1.2,
263
+ "b": 0.75
264
+ },
227
265
  "merge": "rrf",
228
266
  "rrfK": 60,
229
- "weights": { "exact": 1.0, "symbol": 1.2, "bm25": 0.8, "semantic": 1.0, "vector": 0.6 }
230
- },
231
- "impact": { "defaultDepth": 2, "maxDepth": 4, "maxNodes": 200 },
232
- "diagnostics": { "enabled": true, "timeoutMs": 8000 },
233
- "providers": { "semantic": "null" },
234
- "embedding": { "provider": "hashed", "dimensions": 256 },
235
- "analogy": { "enabled": true, "limit": 5 },
236
- "cochange": { "enabled": true, "maxCommits": 500, "minCount": 2, "timeoutMs": 5000 },
237
- "summaries": { "enabled": true, "maxItems": 5 },
238
- "graph": { "enabled": true, "store": "json" }
267
+ "weights": {
268
+ "exact": 1.0,
269
+ "symbol": 1.2,
270
+ "bm25": 0.8,
271
+ "semantic": 1.0,
272
+ "vector": 0.6
273
+ }
274
+ },
275
+ "impact": {
276
+ "defaultDepth": 2,
277
+ "maxDepth": 4,
278
+ "maxNodes": 200
279
+ },
280
+ "diagnostics": {
281
+ "enabled": true,
282
+ "timeoutMs": 8000
283
+ },
284
+ "providers": {
285
+ "semantic": "null"
286
+ },
287
+ "embedding": {
288
+ "provider": "hashed",
289
+ "dimensions": 256
290
+ },
291
+ "analogy": {
292
+ "enabled": true,
293
+ "limit": 5
294
+ },
295
+ "cochange": {
296
+ "enabled": true,
297
+ "maxCommits": 500,
298
+ "minCount": 2,
299
+ "timeoutMs": 5000
300
+ },
301
+ "summaries": {
302
+ "enabled": true,
303
+ "maxItems": 5
304
+ },
305
+ "graph": {
306
+ "enabled": true,
307
+ "store": "json"
308
+ }
239
309
  },
240
310
  "memoryV2": {
241
311
  "enabled": true,
242
312
  "autoMigrate": true,
243
313
  "episodeTtlDays": 90,
244
- "promotion": { "episodeToRuleRequiresApproval": true },
245
- "recall": { "maxRecords": 8 }
314
+ "promotion": {
315
+ "episodeToRuleRequiresApproval": true
316
+ },
317
+ "recall": {
318
+ "maxRecords": 8
319
+ }
246
320
  },
247
321
  "memory": {
248
322
  "enabled": true,
@@ -259,19 +333,43 @@
259
333
  "confidenceThreshold": 50
260
334
  },
261
335
  "learning": {
262
- "feedback": { "enabled": true, "maxEvents": 200 },
263
- "proposals": { "minCount": 3, "minSessions": 2 },
264
- "episodes": { "autoWrite": false },
265
- "tuning": { "enabled": true, "applyMode": "manual" },
266
- "candidates": { "stage": "off", "minOccurrences": 3 },
267
- "overlays": { "stage": "off" }
336
+ "feedback": {
337
+ "enabled": true,
338
+ "maxEvents": 200
339
+ },
340
+ "proposals": {
341
+ "minCount": 3,
342
+ "minSessions": 2
343
+ },
344
+ "episodes": {
345
+ "autoWrite": false
346
+ },
347
+ "tuning": {
348
+ "enabled": true,
349
+ "applyMode": "manual"
350
+ },
351
+ "candidates": {
352
+ "stage": "off",
353
+ "minOccurrences": 3
354
+ },
355
+ "overlays": {
356
+ "stage": "off"
357
+ }
268
358
  },
269
359
  "continuity": {
270
- "resumableRun": { "stage": "off" }
360
+ "resumableRun": {
361
+ "stage": "off"
362
+ }
271
363
  },
272
364
  "experiments": {
273
- "deliberation": { "enabled": false },
274
- "dynamicWorkflow": { "enabled": false, "maxAttemptsPerFailure": 2, "noProgressCap": 3 }
365
+ "deliberation": {
366
+ "enabled": false
367
+ },
368
+ "dynamicWorkflow": {
369
+ "enabled": false,
370
+ "maxAttemptsPerFailure": 2,
371
+ "noProgressCap": 3
372
+ }
275
373
  },
276
374
  "safePatch": {
277
375
  "enabled": true,
@@ -442,25 +540,25 @@
442
540
  },
443
541
  "_help": {
444
542
  "README": {
445
- "muc_dich": "Đây là file cấu hình runtime duy nhất của UKit, khi install sẽ nằm ở .ukit/storage/config.json. Không dùng .env để chỉnh UKit nữa.",
446
- "ai_nen_sua": "Người dùng bình thường vẫn chỉ cần nhớ `ukit install`. Maintainer hoặc power user mới cần sửa file JSON này để chỉnh cách UKit tự điều phối AI.",
447
- "cach_sua": "Chỉ sửa value, không đổi tên key. Đây là JSON chuẩn: string phải dùng dấu nháy kép, có dấu phẩy giữa các field, không dùng // comment.",
448
- "nguyen_tac_chat_luong": "Luôn theo UKit CoDev: chất lượng > an toàn > tốc độ > tiết kiệm token. Không chỉnh cho nhanh nếu làm AI trả lời kém hơn.",
449
- "sau_khi_sua": "Sau khi sửa file này, nên mở session AI mới. Nếu muốn refresh template trong repo thì chạy lại `ukit install`."
543
+ "muc_dich": "\u0110\u00e2y l\u00e0 file c\u1ea5u h\u00ecnh runtime duy nh\u1ea5t c\u1ee7a UKit, khi install s\u1ebd n\u1eb1m \u1edf .ukit/storage/config.json. Kh\u00f4ng d\u00f9ng .env \u0111\u1ec3 ch\u1ec9nh UKit n\u1eefa.",
544
+ "ai_nen_sua": "Ng\u01b0\u1eddi d\u00f9ng b\u00ecnh th\u01b0\u1eddng v\u1eabn ch\u1ec9 c\u1ea7n nh\u1edb `ukit install`. Maintainer ho\u1eb7c power user m\u1edbi c\u1ea7n s\u1eeda file JSON n\u00e0y \u0111\u1ec3 ch\u1ec9nh c\u00e1ch UKit t\u1ef1 \u0111i\u1ec1u ph\u1ed1i AI.",
545
+ "cach_sua": "Ch\u1ec9 s\u1eeda value, kh\u00f4ng \u0111\u1ed5i t\u00ean key. \u0110\u00e2y l\u00e0 JSON chu\u1ea9n: string ph\u1ea3i d\u00f9ng d\u1ea5u nh\u00e1y k\u00e9p, c\u00f3 d\u1ea5u ph\u1ea9y gi\u1eefa c\u00e1c field, kh\u00f4ng d\u00f9ng // comment.",
546
+ "nguyen_tac_chat_luong": "Lu\u00f4n theo UKit CoDev: ch\u1ea5t l\u01b0\u1ee3ng > an to\u00e0n > t\u1ed1c \u0111\u1ed9 > ti\u1ebft ki\u1ec7m token. Kh\u00f4ng ch\u1ec9nh cho nhanh n\u1ebfu l\u00e0m AI tr\u1ea3 l\u1eddi k\u00e9m h\u01a1n.",
547
+ "sau_khi_sua": "Sau khi s\u1eeda file n\u00e0y, n\u00ean m\u1edf session AI m\u1edbi. N\u1ebfu mu\u1ed1n refresh template trong repo th\u00ec ch\u1ea1y l\u1ea1i `ukit install`."
450
548
  },
451
549
  "cac_chinh_sua_thuong_gap": {
452
550
  "doi_model_noi_bo": {
453
551
  "field": "subagents.smallTaskModel",
454
552
  "mac_dinh": "unic-lite",
455
- "y_nghia": "Model nội bộ chạy sidecar cho các quyết định nhỏ/an toàn của UKit. Không thay thế model chính đang làm task của user.",
456
- "vi_du": "Đổi subagents.smallTaskModel sang tên model khác nếu unic-lite không dùng được hoặc bạn muốn model nội bộ khác."
553
+ "y_nghia": "Model n\u1ed9i b\u1ed9 ch\u1ea1y sidecar cho c\u00e1c quy\u1ebft \u0111\u1ecbnh nh\u1ecf/an to\u00e0n c\u1ee7a UKit. Kh\u00f4ng thay th\u1ebf model ch\u00ednh \u0111ang l\u00e0m task c\u1ee7a user.",
554
+ "vi_du": "\u0110\u1ed5i subagents.smallTaskModel sang t\u00ean model kh\u00e1c n\u1ebfu unic-lite kh\u00f4ng d\u00f9ng \u0111\u01b0\u1ee3c ho\u1eb7c b\u1ea1n mu\u1ed1n model n\u1ed9i b\u1ed9 kh\u00e1c."
457
555
  },
458
556
  "compact_codex_khi_gan_150k_token": {
459
557
  "field": "compact.codexContext.budgetTokens",
460
558
  "mac_dinh": 100000,
461
559
  "co_the_tang_len": 150000,
462
- "khuyen_nghi": "100000 là mức cân bằng: đủ context cho chất lượng nhưng tránh để phiên chạy tới 150k-180k token dễ gặp lỗi connection/capacity.",
463
- "y_nghia": "Ngưỡng token context của Codex Desktop trước khi UKit chuẩn bị compact/handoff. Ví dụ 100000 nghĩa là gần 100k token thì compact."
560
+ "khuyen_nghi": "100000 l\u00e0 m\u1ee9c c\u00e2n b\u1eb1ng: \u0111\u1ee7 context cho ch\u1ea5t l\u01b0\u1ee3ng nh\u01b0ng tr\u00e1nh \u0111\u1ec3 phi\u00ean ch\u1ea1y t\u1edbi 150k-180k token d\u1ec5 g\u1eb7p l\u1ed7i connection/capacity.",
561
+ "y_nghia": "Ng\u01b0\u1ee1ng token context c\u1ee7a Codex Desktop tr\u01b0\u1edbc khi UKit chu\u1ea9n b\u1ecb compact/handoff. V\u00ed d\u1ee5 100000 ngh\u0129a l\u00e0 g\u1ea7n 100k token th\u00ec compact."
464
562
  },
465
563
  "doi_do_dai_ban_tom_tat_codex": {
466
564
  "field": "compact.codexContext.compactTarget",
@@ -469,210 +567,210 @@
469
567
  120,
470
568
  170
471
569
  ],
472
- "y_nghia": "Độ dài bản handoff sau compact, tính bằng dòng, không phải token. Không set 150000 ở đây."
570
+ "y_nghia": "\u0110\u1ed9 d\u00e0i b\u1ea3n handoff sau compact, t\u00ednh b\u1eb1ng d\u00f2ng, kh\u00f4ng ph\u1ea3i token. Kh\u00f4ng set 150000 \u1edf \u0111\u00e2y."
473
571
  },
474
572
  "tat_auto_compact_codex": {
475
573
  "field": "compact.codexContext.autoCompact",
476
574
  "mac_dinh": true,
477
- "y_nghia": "Chỉ set false khi đang debug hành vi compact của UKit."
575
+ "y_nghia": "Ch\u1ec9 set false khi \u0111ang debug h\u00e0nh vi compact c\u1ee7a UKit."
478
576
  },
479
577
  "doi_reviewer_model": {
480
578
  "field": "handoff.reviewer.model",
481
579
  "mac_dinh": "unic-smart",
482
- "y_nghia": "Model dùng cho reviewer agent ở Phase 3. BẮT BUỘC khác model executor để bắt được lỗi mà executor miss. Có thể dùng claude-opus-5, unic-smart, hoặc bất kỳ model reasoning mạnh nào.",
483
- "vi_du": "Nếu executor là unic-code, set reviewer.model=unic-smart hoặc claude-opus-5. Nếu executor là claude-sonnet, set reviewer thành claude-opus."
580
+ "y_nghia": "Model d\u00f9ng cho reviewer agent \u1edf Phase 3. B\u1eaeT BU\u1ed8C kh\u00e1c model executor \u0111\u1ec3 b\u1eaft \u0111\u01b0\u1ee3c l\u1ed7i m\u00e0 executor miss. C\u00f3 th\u1ec3 d\u00f9ng claude-opus-5, unic-smart, ho\u1eb7c b\u1ea5t k\u1ef3 model reasoning m\u1ea1nh n\u00e0o.",
581
+ "vi_du": "N\u1ebfu executor l\u00e0 unic-code, set reviewer.model=unic-smart ho\u1eb7c claude-opus-5. N\u1ebfu executor l\u00e0 claude-sonnet, set reviewer th\u00e0nh claude-opus."
484
582
  },
485
583
  "tat_reviewer_phase": {
486
584
  "field": "handoff.reviewer.enabled",
487
585
  "mac_dinh": true,
488
- "y_nghia": "Tắt Phase 3 review nếu muốn chạy nhanh prototype. KHÔNG khuyến nghị cho code production — bỏ review là bỏ lưới an toàn cuối cùng.",
489
- "khi_nao_tat": "Chỉ tắt cho throw-away prototype hoặc khi anh tự review thủ công."
586
+ "y_nghia": "T\u1eaft Phase 3 review n\u1ebfu mu\u1ed1n ch\u1ea1y nhanh prototype. KH\u00d4NG khuy\u1ebfn ngh\u1ecb cho code production \u2014 b\u1ecf review l\u00e0 b\u1ecf l\u01b0\u1edbi an to\u00e0n cu\u1ed1i c\u00f9ng.",
587
+ "khi_nao_tat": "Ch\u1ec9 t\u1eaft cho throw-away prototype ho\u1eb7c khi anh t\u1ef1 review th\u1ee7 c\u00f4ng."
490
588
  },
491
589
  "block_handoff_khi_critical": {
492
590
  "field": "handoff.reviewer.blockOnCritical",
493
591
  "mac_dinh": true,
494
- "y_nghia": "Nếu reviewer báo CRITICAL → task không được phép done; executor phải fix và review lại. Set false chỉ khi muốn cảnh báo mềm.",
495
- "khuyen_nghi": "Giữ true. Đây là rào chắn chống ship lỗi nghiêm trọng."
592
+ "y_nghia": "N\u1ebfu reviewer b\u00e1o CRITICAL \u2192 task kh\u00f4ng \u0111\u01b0\u1ee3c ph\u00e9p done; executor ph\u1ea3i fix v\u00e0 review l\u1ea1i. Set false ch\u1ec9 khi mu\u1ed1n c\u1ea3nh b\u00e1o m\u1ec1m.",
593
+ "khuyen_nghi": "Gi\u1eef true. \u0110\u00e2y l\u00e0 r\u00e0o ch\u1eafn ch\u1ed1ng ship l\u1ed7i nghi\u00eam tr\u1ecdng."
496
594
  },
497
595
  "bat_test_plan_bat_buoc": {
498
596
  "field": "handoff.plan.requireTestPlan",
499
597
  "mac_dinh": true,
500
- "y_nghia": "Planner phải hoàn thành PLAN.md §4 (Test Plan) trước khi task chuyển ready. Tắt sẽ làm UKit cho phép skip TDD — kéo theo executor dễ làm sót.",
501
- "khuyen_nghi": "Giữ true."
598
+ "y_nghia": "Planner ph\u1ea3i ho\u00e0n th\u00e0nh PLAN.md \u00a74 (Test Plan) tr\u01b0\u1edbc khi task chuy\u1ec3n ready. T\u1eaft s\u1ebd l\u00e0m UKit cho ph\u00e9p skip TDD \u2014 k\u00e9o theo executor d\u1ec5 l\u00e0m s\u00f3t.",
599
+ "khuyen_nghi": "Gi\u1eef true."
502
600
  },
503
601
  "tu_ghi_episode_ket_thuc_session": {
504
602
  "field": "learning.episodes.autoWrite",
505
603
  "mac_dinh": false,
506
- "y_nghia": "Nếu true, hook SessionEnd tự ghi episode vào memory v2 khi kết thúc session (cần `ukit` có trên PATH). Mặc định tắt để tránh ghi memory khi user chưa muốn.",
507
- "khi_nao_bat": "Chỉ bật khi anh muốn UKit tự lưu episode mỗi session; dữ liệu vẫn nằm local trong .ukit/storage."
604
+ "y_nghia": "N\u1ebfu true, hook SessionEnd t\u1ef1 ghi episode v\u00e0o memory v2 khi k\u1ebft th\u00fac session (c\u1ea7n `ukit` c\u00f3 tr\u00ean PATH). M\u1eb7c \u0111\u1ecbnh t\u1eaft \u0111\u1ec3 tr\u00e1nh ghi memory khi user ch\u01b0a mu\u1ed1n.",
605
+ "khi_nao_bat": "Ch\u1ec9 b\u1eadt khi anh mu\u1ed1n UKit t\u1ef1 l\u01b0u episode m\u1ed7i session; d\u1eef li\u1ec7u v\u1eabn n\u1eb1m local trong .ukit/storage."
508
606
  },
509
607
  "tat_goi_y_tuning": {
510
608
  "field": "learning.tuning.applyMode",
511
609
  "mac_dinh": "manual",
512
- "y_nghia": "manual = UKit chỉ tính và lưu gợi ý tuning vào .ukit/storage/learning/suggestions.json, KHÔNG bao giờ tự sửa weights/threshold. off = tắt luôn việc tính gợi ý.",
513
- "khuyen_nghi": "Giữ manual. Không có chế độ auto-apply — mọi thay đổi weights/threshold đều do người dùng tự sửa."
610
+ "y_nghia": "manual = UKit ch\u1ec9 t\u00ednh v\u00e0 l\u01b0u g\u1ee3i \u00fd tuning v\u00e0o .ukit/storage/learning/suggestions.json, KH\u00d4NG bao gi\u1edd t\u1ef1 s\u1eeda weights/threshold. off = t\u1eaft lu\u00f4n vi\u1ec7c t\u00ednh g\u1ee3i \u00fd.",
611
+ "khuyen_nghi": "Gi\u1eef manual. Kh\u00f4ng c\u00f3 ch\u1ebf \u0111\u1ed9 auto-apply \u2014 m\u1ecdi thay \u0111\u1ed5i weights/threshold \u0111\u1ec1u do ng\u01b0\u1eddi d\u00f9ng t\u1ef1 s\u1eeda."
514
612
  }
515
613
  },
516
- "version": "Phiên bản config runtime đi kèm package UKit.",
517
- "agent": "Adapter mặc định của workspace. Thường giữ nguyên theo lúc install.",
614
+ "version": "Phi\u00ean b\u1ea3n config runtime \u0111i k\u00e8m package UKit.",
615
+ "agent": "Adapter m\u1eb7c \u0111\u1ecbnh c\u1ee7a workspace. Th\u01b0\u1eddng gi\u1eef nguy\u00ean theo l\u00fac install.",
518
616
  "autonomy": {
519
- "level": "Mức tự chủ của UKit. conservative: hỏi trước khi fallback/escalate, không tự delegate. balanced: mặc định, hành vi hiện tại. free-run: tự chạy fallback, delegate tự nhiên hơn, bớt xác nhận. vibecode: chạy một prompt tới khi có kết quả — completion gate không nhả ở continuation cap, chỉ dừng khi đủ completion evidence, gặp blocker thật, hoặc quyết định lệnh nguy hiểm; mọi cú dừng đều nêu lý do.",
520
- "affectVerification": "Nếu true, autonomy.level ảnh hưởng hành vi verification plan.",
521
- "affectDelegation": "Nếu true, autonomy.level ảnh hưởng ngưỡng delegation."
617
+ "level": "M\u1ee9c t\u1ef1 ch\u1ee7 c\u1ee7a UKit. conservative: h\u1ecfi tr\u01b0\u1edbc khi fallback/escalate, kh\u00f4ng t\u1ef1 delegate. balanced: m\u1eb7c \u0111\u1ecbnh, h\u00e0nh vi hi\u1ec7n t\u1ea1i. free-run: t\u1ef1 ch\u1ea1y fallback, delegate t\u1ef1 nhi\u00ean h\u01a1n, b\u1edbt x\u00e1c nh\u1eadn. vibecode: ch\u1ea1y m\u1ed9t prompt t\u1edbi khi c\u00f3 k\u1ebft qu\u1ea3 \u2014 completion gate kh\u00f4ng nh\u1ea3 \u1edf continuation cap, ch\u1ec9 d\u1eebng khi \u0111\u1ee7 completion evidence, g\u1eb7p blocker th\u1eadt, ho\u1eb7c quy\u1ebft \u0111\u1ecbnh l\u1ec7nh nguy hi\u1ec3m; m\u1ecdi c\u00fa d\u1eebng \u0111\u1ec1u n\u00eau l\u00fd do.",
618
+ "affectVerification": "N\u1ebfu true, autonomy.level \u1ea3nh h\u01b0\u1edfng h\u00e0nh vi verification plan.",
619
+ "affectDelegation": "N\u1ebfu true, autonomy.level \u1ea3nh h\u01b0\u1edfng ng\u01b0\u1ee1ng delegation."
522
620
  },
523
621
  "security": {
524
- "sensitiveDataGate": "Bật sensitive-data gate: chặn key/private data/secret (đọc file .env, *.pem, id_rsa; lệnh bash dump secret; prompt chứa token) trước khi chúng tới AI. Chặn cực gắt theo yêu cầu: chỉ cần nghi ngờ là chặn và hỏi user. Tắt chỉ khi debug gate này.",
525
- "allowlistPath": "File allowlist JSON do USER tự tạo để phê duyệt tường minh giá trị secret (sha256) hoặc đường dẫn file được phép gửi. File này được protect-files.sh chặn AI tự sửa."
622
+ "sensitiveDataGate": "B\u1eadt sensitive-data gate: ch\u1eb7n key/private data/secret (\u0111\u1ecdc file .env, *.pem, id_rsa; l\u1ec7nh bash dump secret; prompt ch\u1ee9a token) tr\u01b0\u1edbc khi ch\u00fang t\u1edbi AI. Ch\u1eb7n c\u1ef1c g\u1eaft theo y\u00eau c\u1ea7u: ch\u1ec9 c\u1ea7n nghi ng\u1edd l\u00e0 ch\u1eb7n v\u00e0 h\u1ecfi user. T\u1eaft ch\u1ec9 khi debug gate n\u00e0y.",
623
+ "allowlistPath": "File allowlist JSON do USER t\u1ef1 t\u1ea1o \u0111\u1ec3 ph\u00ea duy\u1ec7t t\u01b0\u1eddng minh gi\u00e1 tr\u1ecb secret (sha256) ho\u1eb7c \u0111\u01b0\u1eddng d\u1eabn file \u0111\u01b0\u1ee3c ph\u00e9p g\u1eedi. File n\u00e0y \u0111\u01b0\u1ee3c protect-files.sh ch\u1eb7n AI t\u1ef1 s\u1eeda."
526
624
  },
527
625
  "compact": {
528
- "enabled": "Bật/tắt toàn bộ helper compact của UKit.",
529
- "tokenThreshold": "Ngưỡng token chung cho runtime compact dùng chung.",
530
- "hardCapTokens": "Ngưỡng cứng tuyệt đối (mặc định 500000 token ước lượng = 50% của context window 1M). Chạm/vượt ngưỡng này thì context coi như quá dài — không phải gợi ý nữa, là bắt buộc. PHẢI thấp hơn context window thật của model, nếu không API sẽ báo lỗi vượt context trước khi gate kịp chặn — model 200k thì hạ xuống 100000, model 256k thì 128000. Cả env.CLAUDE_CODE_AUTO_COMPACT_WINDOW (.claude/settings.json) lẫn compaction.thresholdTokens (.omp/config.yml) đều được SUY RA từ số này khi chạy ukit install, nên chỉ cần sửa ở đây rồi cài lại là auto-compact của cả Claude Code và omp đổi theo.",
531
- "autoCompactWindowRatio": "Auto-compact chạy ở bao nhiêu phần của hardCapTokens (mặc định 0.7 → 350000). Phải < 1 để client tự compact TRƯỚC khi context-hardcap-gate chặn tool; số càng nhỏ thì compact càng sớm và càng nhiều đệm an toàn.",
532
- "hardCapBlock": "Nếu true, hook context-hardcap-gate chặn cứng Edit/Write/Bash (exit 2) khi vượt hardCapTokens, cho tới khi có compact thật (PreCompact) reset lại bộ đếm.",
533
- "hardCapGraceCalls": "Số tool call được phép chạy tiếp sau khi vượt hardCapTokens khi handoff run trong docs/AI_HANDOFF/RUN.md hoặc ordinary routed task có session execution ledger còn dang dở (mặc định 10). Đây chỉ là landing window: hoàn tất edit/verification đang dở và ghi state resume, không mở task mới. Hết grace là chặn cứng như cũ. Budget tính theo mỗi đợt vượt cap, chỉ reset khi ước lượng token thật sự giảm (có compact thật) — không reset theo wave.",
534
- "contextRotDetection": "Phát hiện context quá dài/dễ mục để giữ lại state quan trọng trước khi AI nhớ sai.",
535
- "askBeforeDrop": "Giữ thái độ thận trọng trước khi bỏ context quan trọng. Nếu rủi ro thì hand back cho main model.",
626
+ "enabled": "B\u1eadt/t\u1eaft to\u00e0n b\u1ed9 helper compact c\u1ee7a UKit.",
627
+ "tokenThreshold": "Ng\u01b0\u1ee1ng token chung cho runtime compact d\u00f9ng chung.",
628
+ "hardCapTokens": "Ng\u01b0\u1ee1ng c\u1ee9ng tuy\u1ec7t \u0111\u1ed1i (m\u1eb7c \u0111\u1ecbnh 500000 token \u01b0\u1edbc l\u01b0\u1ee3ng = 50% c\u1ee7a context window 1M). Ch\u1ea1m/v\u01b0\u1ee3t ng\u01b0\u1ee1ng n\u00e0y th\u00ec context coi nh\u01b0 qu\u00e1 d\u00e0i \u2014 kh\u00f4ng ph\u1ea3i g\u1ee3i \u00fd n\u1eefa, l\u00e0 b\u1eaft bu\u1ed9c. PH\u1ea2I th\u1ea5p h\u01a1n context window th\u1eadt c\u1ee7a model, n\u1ebfu kh\u00f4ng API s\u1ebd b\u00e1o l\u1ed7i v\u01b0\u1ee3t context tr\u01b0\u1edbc khi gate k\u1ecbp ch\u1eb7n \u2014 model 200k th\u00ec h\u1ea1 xu\u1ed1ng 100000, model 256k th\u00ec 128000. C\u1ea3 env.CLAUDE_CODE_AUTO_COMPACT_WINDOW (.claude/settings.json) l\u1eabn compaction.thresholdTokens (.omp/config.yml) \u0111\u1ec1u \u0111\u01b0\u1ee3c SUY RA t\u1eeb s\u1ed1 n\u00e0y khi ch\u1ea1y ukit install, n\u00ean ch\u1ec9 c\u1ea7n s\u1eeda \u1edf \u0111\u00e2y r\u1ed3i c\u00e0i l\u1ea1i l\u00e0 auto-compact c\u1ee7a c\u1ea3 Claude Code v\u00e0 omp \u0111\u1ed5i theo.",
629
+ "autoCompactWindowRatio": "Auto-compact ch\u1ea1y \u1edf bao nhi\u00eau ph\u1ea7n c\u1ee7a hardCapTokens (m\u1eb7c \u0111\u1ecbnh 0.7 \u2192 350000). Ph\u1ea3i < 1 \u0111\u1ec3 client t\u1ef1 compact TR\u01af\u1edaC khi context-hardcap-gate ch\u1eb7n tool; s\u1ed1 c\u00e0ng nh\u1ecf th\u00ec compact c\u00e0ng s\u1edbm v\u00e0 c\u00e0ng nhi\u1ec1u \u0111\u1ec7m an to\u00e0n.",
630
+ "hardCapBlock": "N\u1ebfu true, hook context-hardcap-gate ch\u1eb7n c\u1ee9ng Edit/Write/Bash (exit 2) khi v\u01b0\u1ee3t hardCapTokens, cho t\u1edbi khi c\u00f3 compact th\u1eadt (PreCompact) reset l\u1ea1i b\u1ed9 \u0111\u1ebfm.",
631
+ "hardCapGraceCalls": "S\u1ed1 tool call \u0111\u01b0\u1ee3c ph\u00e9p ch\u1ea1y ti\u1ebfp sau khi v\u01b0\u1ee3t hardCapTokens khi handoff run trong docs/AI_HANDOFF/RUN.md ho\u1eb7c ordinary routed task c\u00f3 session execution ledger c\u00f2n dang d\u1edf (m\u1eb7c \u0111\u1ecbnh 10). \u0110\u00e2y ch\u1ec9 l\u00e0 landing window: ho\u00e0n t\u1ea5t edit/verification \u0111ang d\u1edf v\u00e0 ghi state resume, kh\u00f4ng m\u1edf task m\u1edbi. H\u1ebft grace l\u00e0 ch\u1eb7n c\u1ee9ng nh\u01b0 c\u0169. Budget t\u00ednh theo m\u1ed7i \u0111\u1ee3t v\u01b0\u1ee3t cap, ch\u1ec9 reset khi \u01b0\u1edbc l\u01b0\u1ee3ng token th\u1eadt s\u1ef1 gi\u1ea3m (c\u00f3 compact th\u1eadt) \u2014 kh\u00f4ng reset theo wave.",
632
+ "contextRotDetection": "Ph\u00e1t hi\u1ec7n context qu\u00e1 d\u00e0i/d\u1ec5 m\u1ee5c \u0111\u1ec3 gi\u1eef l\u1ea1i state quan tr\u1ecdng tr\u01b0\u1edbc khi AI nh\u1edb sai.",
633
+ "askBeforeDrop": "Gi\u1eef th\u00e1i \u0111\u1ed9 th\u1eadn tr\u1ecdng tr\u01b0\u1edbc khi b\u1ecf context quan tr\u1ecdng. N\u1ebfu r\u1ee7i ro th\u00ec hand back cho main model.",
536
634
  "agentContext": {
537
- "enabled": "Bật policy compact context theo từng agent.",
538
- "decisionAgent": "Agent nội bộ hỗ trợ quyết định compact/handoff trong trường hợp an toàn.",
539
- "executionMode": "sidecar-parallel nghĩa là lane quyết định compact chạy song song với task chính.",
540
- "mustNotBlockMainTask": "Nếu true, sidecar nội bộ không được dừng/thay thế/làm chậm task chính của user.",
635
+ "enabled": "B\u1eadt policy compact context theo t\u1eebng agent.",
636
+ "decisionAgent": "Agent n\u1ed9i b\u1ed9 h\u1ed7 tr\u1ee3 quy\u1ebft \u0111\u1ecbnh compact/handoff trong tr\u01b0\u1eddng h\u1ee3p an to\u00e0n.",
637
+ "executionMode": "sidecar-parallel ngh\u0129a l\u00e0 lane quy\u1ebft \u0111\u1ecbnh compact ch\u1ea1y song song v\u1edbi task ch\u00ednh.",
638
+ "mustNotBlockMainTask": "N\u1ebfu true, sidecar n\u1ed9i b\u1ed9 kh\u00f4ng \u0111\u01b0\u1ee3c d\u1eebng/thay th\u1ebf/l\u00e0m ch\u1eadm task ch\u00ednh c\u1ee7a user.",
541
639
  "targets": {
542
640
  "claude": {
543
- "autoCompact": "Giữ compact lane của Claude bật.",
544
- "mode": "precompact-reinject nghĩa là Claude được bơm context quan trọng trước/sau compact.",
545
- "preserveExistingHooks": "Nên giữ true để không gỡ PreCompact/reinject của Claude."
641
+ "autoCompact": "Gi\u1eef compact lane c\u1ee7a Claude b\u1eadt.",
642
+ "mode": "precompact-reinject ngh\u0129a l\u00e0 Claude \u0111\u01b0\u1ee3c b\u01a1m context quan tr\u1ecdng tr\u01b0\u1edbc/sau compact.",
643
+ "preserveExistingHooks": "N\u00ean gi\u1eef true \u0111\u1ec3 kh\u00f4ng g\u1ee1 PreCompact/reinject c\u1ee7a Claude."
546
644
  },
547
645
  "omp": {
548
- "autoCompact": "Giữ compact lane của omp (Oh My Pi) bật.",
549
- "mode": "precompact-reinject nghĩa là UKit dùng hook session.compacting/session_before_compact của omp để bơm lại context quan trọng trước khi compact.",
550
- "preserveExistingHooks": "Nên giữ true để không gỡ các module hooks/pre của bạn khi UKit cài bridge."
646
+ "autoCompact": "Gi\u1eef compact lane c\u1ee7a omp (Oh My Pi) b\u1eadt.",
647
+ "mode": "precompact-reinject ngh\u0129a l\u00e0 UKit d\u00f9ng hook session.compacting/session_before_compact c\u1ee7a omp \u0111\u1ec3 b\u01a1m l\u1ea1i context quan tr\u1ecdng tr\u01b0\u1edbc khi compact.",
648
+ "preserveExistingHooks": "N\u00ean gi\u1eef true \u0111\u1ec3 kh\u00f4ng g\u1ee1 c\u00e1c module hooks/pre c\u1ee7a b\u1ea1n khi UKit c\u00e0i bridge."
551
649
  },
552
650
  "codex": {
553
- "autoCompact": "Bật policy soft handoff compact cho Codex Desktop.",
554
- "mode": "soft-handoff nghĩa là UKit tạo/dùng state tóm tắt, không can thiệp trực tiếp vào internals của app Codex.",
555
- "compactTarget": "Độ dài bản handoff sau compact, tính bằng dòng.",
556
- "compactTargetUnit": "Đơn vị của compactTarget. Nên giữ là lines.",
557
- "compactTargetRecommendedRange": "Khoảng số dòng khuyến nghị cho bản handoff.",
558
- "compactTargetMax": "Số dòng tối đa cho bản handoff, tránh lỡ tay set quá dài."
651
+ "autoCompact": "B\u1eadt policy soft handoff compact cho Codex Desktop.",
652
+ "mode": "soft-handoff ngh\u0129a l\u00e0 UKit t\u1ea1o/d\u00f9ng state t\u00f3m t\u1eaft, kh\u00f4ng can thi\u1ec7p tr\u1ef1c ti\u1ebfp v\u00e0o internals c\u1ee7a app Codex.",
653
+ "compactTarget": "\u0110\u1ed9 d\u00e0i b\u1ea3n handoff sau compact, t\u00ednh b\u1eb1ng d\u00f2ng.",
654
+ "compactTargetUnit": "\u0110\u01a1n v\u1ecb c\u1ee7a compactTarget. N\u00ean gi\u1eef l\u00e0 lines.",
655
+ "compactTargetRecommendedRange": "Kho\u1ea3ng s\u1ed1 d\u00f2ng khuy\u1ebfn ngh\u1ecb cho b\u1ea3n handoff.",
656
+ "compactTargetMax": "S\u1ed1 d\u00f2ng t\u1ed1i \u0111a cho b\u1ea3n handoff, tr\u00e1nh l\u1ee1 tay set qu\u00e1 d\u00e0i."
559
657
  }
560
658
  }
561
659
  },
562
660
  "codexContext": {
563
- "enabled": "Bật policy soft context handoff cho Codex Desktop.",
564
- "autoCompact": "Cho phép UKit tự quyết định compact/handoff khi context Codex dài.",
565
- "budgetTokens": "Ngưỡng token context của Codex Desktop trước khi compact. Mặc định 100000 để cân bằng chất lượng và giảm lỗi capacity/connection. Có thể tăng 150000 nếu cần, nhưng không nên để quá dài.",
566
- "compactTarget": "Độ dài bản handoff sau compact, tính bằng dòng, không phải token. Mặc định 150; nên 120-150; tối đa 170.",
567
- "compactTargetUnit": "Đơn vị của compactTarget. Nên giữ là lines.",
568
- "compactTargetRecommendedRange": "Khoảng số dòng khuyến nghị. Nên ở trong khoảng này nếu không có lý do đặc biệt.",
569
- "compactTargetMax": "Số dòng tối đa cho bản handoff. Chặn trường hợp lỡ set 150000 dòng.",
570
- "decisionAgent": "Agent nội bộ dùng cho quyết định compact an toàn.",
571
- "mode": "soft-handoff nghĩa là UKit tóm tắt state để tiếp tục thay vì replay toàn bộ transcript.",
572
- "preserve": "Những thứ bắt buộc phải giữ khi compact: mục tiêu, rule, file đang làm, quyết định, lỗi chưa xử lý, bằng chứng verify, bước tiếp theo."
661
+ "enabled": "B\u1eadt policy soft context handoff cho Codex Desktop.",
662
+ "autoCompact": "Cho ph\u00e9p UKit t\u1ef1 quy\u1ebft \u0111\u1ecbnh compact/handoff khi context Codex d\u00e0i.",
663
+ "budgetTokens": "Ng\u01b0\u1ee1ng token context c\u1ee7a Codex Desktop tr\u01b0\u1edbc khi compact. M\u1eb7c \u0111\u1ecbnh 100000 \u0111\u1ec3 c\u00e2n b\u1eb1ng ch\u1ea5t l\u01b0\u1ee3ng v\u00e0 gi\u1ea3m l\u1ed7i capacity/connection. C\u00f3 th\u1ec3 t\u0103ng 150000 n\u1ebfu c\u1ea7n, nh\u01b0ng kh\u00f4ng n\u00ean \u0111\u1ec3 qu\u00e1 d\u00e0i.",
664
+ "compactTarget": "\u0110\u1ed9 d\u00e0i b\u1ea3n handoff sau compact, t\u00ednh b\u1eb1ng d\u00f2ng, kh\u00f4ng ph\u1ea3i token. M\u1eb7c \u0111\u1ecbnh 150; n\u00ean 120-150; t\u1ed1i \u0111a 170.",
665
+ "compactTargetUnit": "\u0110\u01a1n v\u1ecb c\u1ee7a compactTarget. N\u00ean gi\u1eef l\u00e0 lines.",
666
+ "compactTargetRecommendedRange": "Kho\u1ea3ng s\u1ed1 d\u00f2ng khuy\u1ebfn ngh\u1ecb. N\u00ean \u1edf trong kho\u1ea3ng n\u00e0y n\u1ebfu kh\u00f4ng c\u00f3 l\u00fd do \u0111\u1eb7c bi\u1ec7t.",
667
+ "compactTargetMax": "S\u1ed1 d\u00f2ng t\u1ed1i \u0111a cho b\u1ea3n handoff. Ch\u1eb7n tr\u01b0\u1eddng h\u1ee3p l\u1ee1 set 150000 d\u00f2ng.",
668
+ "decisionAgent": "Agent n\u1ed9i b\u1ed9 d\u00f9ng cho quy\u1ebft \u0111\u1ecbnh compact an to\u00e0n.",
669
+ "mode": "soft-handoff ngh\u0129a l\u00e0 UKit t\u00f3m t\u1eaft state \u0111\u1ec3 ti\u1ebfp t\u1ee5c thay v\u00ec replay to\u00e0n b\u1ed9 transcript.",
670
+ "preserve": "Nh\u1eefng th\u1ee9 b\u1eaft bu\u1ed9c ph\u1ea3i gi\u1eef khi compact: m\u1ee5c ti\u00eau, rule, file \u0111ang l\u00e0m, quy\u1ebft \u0111\u1ecbnh, l\u1ed7i ch\u01b0a x\u1eed l\u00fd, b\u1eb1ng ch\u1ee9ng verify, b\u01b0\u1edbc ti\u1ebfp theo."
573
671
  }
574
672
  },
575
673
  "tokenPipeline": {
576
- "inputCompression": "Nén/tái sử dụng input context khi an toàn.",
577
- "outputCompression": "Tóm tắt output command ồn nhưng vẫn giữ recovery hint.",
578
- "promptCache": "Dùng cache prompt/context compact để giảm lặp lại.",
579
- "outputMaxTokens": "Ngân sách token tối đa cho output command sau khi nén. Output nhỏ hơn ngưỡng này được bỏ qua nén hoàn toàn. Mặc định 600.",
580
- "outputMaxLines": "Số dòng tối đa trong bản tóm tắt output đã nén. Mặc định 40."
674
+ "inputCompression": "N\u00e9n/t\u00e1i s\u1eed d\u1ee5ng input context khi an to\u00e0n.",
675
+ "outputCompression": "T\u00f3m t\u1eaft output command \u1ed3n nh\u01b0ng v\u1eabn gi\u1eef recovery hint.",
676
+ "promptCache": "D\u00f9ng cache prompt/context compact \u0111\u1ec3 gi\u1ea3m l\u1eb7p l\u1ea1i.",
677
+ "outputMaxTokens": "Ng\u00e2n s\u00e1ch token t\u1ed1i \u0111a cho output command sau khi n\u00e9n. Output nh\u1ecf h\u01a1n ng\u01b0\u1ee1ng n\u00e0y \u0111\u01b0\u1ee3c b\u1ecf qua n\u00e9n ho\u00e0n to\u00e0n. M\u1eb7c \u0111\u1ecbnh 600.",
678
+ "outputMaxLines": "S\u1ed1 d\u00f2ng t\u1ed1i \u0111a trong b\u1ea3n t\u00f3m t\u1eaft output \u0111\u00e3 n\u00e9n. M\u1eb7c \u0111\u1ecbnh 40."
581
679
  },
582
680
  "router": {
583
- "enabled": "Bật task routing nội bộ.",
584
- "defaultModel": "Model hint cân bằng cho công việc bình thường. Adapter/provider có thể map khác."
681
+ "enabled": "B\u1eadt task routing n\u1ed9i b\u1ed9.",
682
+ "defaultModel": "Model hint c\u00e2n b\u1eb1ng cho c\u00f4ng vi\u1ec7c b\u00ecnh th\u01b0\u1eddng. Adapter/provider c\u00f3 th\u1ec3 map kh\u00e1c."
585
683
  },
586
684
  "orchestration": {
587
- "enabled": "Bật ladder điều phối nội bộ của UKit. Ladder này thay cách nghĩ LITE/FULL cứng nhắc bằng các tầng tiny-fix → review-release an toàn hơn.",
588
- "orchestratorModel": "Model điều phối chất lượng cao để chọn execution layer. Đây là model quan trọng cho chất lượng completion, không nên dùng model quá yếu.",
589
- "permissionMode": "Chế độ quyền của orchestration. Ba giá trị dành riêng: interactive, safe-auto, unattended. Chu kỳ này chỉ triển khai unattended.",
590
- "allowUnsafeEval": "Mặc định false. Chỉ khi user tự bật true, .omp/config.yml mới render tools.approval.eval: allow; mọi trường hợp khác render deny (fail-closed, không bao giờ prompt). Residual risk: eval chạy payload subprocess (os.remove, shutil.rmtree) mà bash.patterns text deny không chặn được — chỉ dựa vào bridge eval->Bash của TASK-004.",
591
- "contracts": "Bộ contract cho 7 tầng điều phối: tiny-fix, local-fix, local-build, find-cause, shared-edit, map-impact, review-release. Khi mơ hồ, UKit nên lệch lên tầng an toàn hơn dù tốn token hơn."
685
+ "enabled": "B\u1eadt ladder \u0111i\u1ec1u ph\u1ed1i n\u1ed9i b\u1ed9 c\u1ee7a UKit. Ladder n\u00e0y thay c\u00e1ch ngh\u0129 LITE/FULL c\u1ee9ng nh\u1eafc b\u1eb1ng c\u00e1c t\u1ea7ng tiny-fix \u2192 review-release an to\u00e0n h\u01a1n.",
686
+ "orchestratorModel": "Model \u0111i\u1ec1u ph\u1ed1i ch\u1ea5t l\u01b0\u1ee3ng cao \u0111\u1ec3 ch\u1ecdn execution layer. \u0110\u00e2y l\u00e0 model quan tr\u1ecdng cho ch\u1ea5t l\u01b0\u1ee3ng completion, kh\u00f4ng n\u00ean d\u00f9ng model qu\u00e1 y\u1ebfu.",
687
+ "permissionMode": "Ch\u1ebf \u0111\u1ed9 quy\u1ec1n c\u1ee7a orchestration. Ba gi\u00e1 tr\u1ecb d\u00e0nh ri\u00eang: interactive, safe-auto, unattended. Chu k\u1ef3 n\u00e0y ch\u1ec9 tri\u1ec3n khai unattended.",
688
+ "allowUnsafeEval": "M\u1eb7c \u0111\u1ecbnh false. Ch\u1ec9 khi user t\u1ef1 b\u1eadt true, .omp/config.yml m\u1edbi render tools.approval.eval: allow; m\u1ecdi tr\u01b0\u1eddng h\u1ee3p kh\u00e1c render deny (fail-closed, kh\u00f4ng bao gi\u1edd prompt). Residual risk: eval ch\u1ea1y payload subprocess (os.remove, shutil.rmtree) m\u00e0 bash.patterns text deny kh\u00f4ng ch\u1eb7n \u0111\u01b0\u1ee3c \u2014 ch\u1ec9 d\u1ef1a v\u00e0o bridge eval->Bash c\u1ee7a TASK-004.",
689
+ "contracts": "B\u1ed9 contract cho 7 t\u1ea7ng \u0111i\u1ec1u ph\u1ed1i: tiny-fix, local-fix, local-build, find-cause, shared-edit, map-impact, review-release. Khi m\u01a1 h\u1ed3, UKit n\u00ean l\u1ec7ch l\u00ean t\u1ea7ng an to\u00e0n h\u01a1n d\u00f9 t\u1ed1n token h\u01a1n."
592
690
  },
593
691
  "memory": {
594
- "enabled": "Bật memory local của UKit.",
595
- "progressiveRetrieval": "Lấy memory liên quan nhỏ trước, chỉ mở rộng khi cần.",
596
- "maxInjectionTokens": "Số token memory tối đa được inject vào context (clamp thực tế trong khoảng 160–640).",
597
- "archiveAfterDays": "Sau bao nhiêu ngày memory có thể được archive/compact.",
598
- "maxSessions": "Số session memory gần đây giữ active.",
599
- "redactSecrets": "Cố tránh lưu secret vào memory."
692
+ "enabled": "B\u1eadt memory local c\u1ee7a UKit.",
693
+ "progressiveRetrieval": "L\u1ea5y memory li\u00ean quan nh\u1ecf tr\u01b0\u1edbc, ch\u1ec9 m\u1edf r\u1ed9ng khi c\u1ea7n.",
694
+ "maxInjectionTokens": "S\u1ed1 token memory t\u1ed1i \u0111a \u0111\u01b0\u1ee3c inject v\u00e0o context (clamp th\u1ef1c t\u1ebf trong kho\u1ea3ng 160\u2013640).",
695
+ "archiveAfterDays": "Sau bao nhi\u00eau ng\u00e0y memory c\u00f3 th\u1ec3 \u0111\u01b0\u1ee3c archive/compact.",
696
+ "maxSessions": "S\u1ed1 session memory g\u1ea7n \u0111\u00e2y gi\u1eef active.",
697
+ "redactSecrets": "C\u1ed1 tr\u00e1nh l\u01b0u secret v\u00e0o memory."
600
698
  },
601
699
  "validation": {
602
- "enabled": "Bật kiểm tra output nhẹ.",
603
- "autoRetry": "Cho phép retry an toàn một lần khi validation thấy lỗi rõ.",
604
- "maxRetries": "Số lần retry tối đa.",
605
- "confidenceThreshold": "Ngưỡng confidence tối thiểu trước khi báo thận trọng."
700
+ "enabled": "B\u1eadt ki\u1ec3m tra output nh\u1eb9.",
701
+ "autoRetry": "Cho ph\u00e9p retry an to\u00e0n m\u1ed9t l\u1ea7n khi validation th\u1ea5y l\u1ed7i r\u00f5.",
702
+ "maxRetries": "S\u1ed1 l\u1ea7n retry t\u1ed1i \u0111a.",
703
+ "confidenceThreshold": "Ng\u01b0\u1ee1ng confidence t\u1ed1i thi\u1ec3u tr\u01b0\u1edbc khi b\u00e1o th\u1eadn tr\u1ecdng."
606
704
  },
607
705
  "subagents": {
608
- "enabled": "Cho phép UKit dùng các lane subagent nội bộ khi hữu ích.",
609
- "smallTaskModel": "Model sidecar nội bộ cho quyết định nhỏ/an toàn của UKit. Đổi key này nếu muốn đổi model nội bộ. Nó không thay thế orchestration.orchestratorModel.",
610
- "smallTaskAgent": "Tên agent nội bộ phụ trách quyết định nhỏ không block task chính.",
611
- "smallTaskUseCases": "Các loại việc an toàn sidecar có thể xử lý: dọn task, compact decision, phân loại, triage, queue maintenance, workspace maintenance.",
612
- "keepMainModelFor": "Các việc rủi ro phải giữ ở main model: security, code risky, release, data-loss, architecture, deep reasoning.",
706
+ "enabled": "Cho ph\u00e9p UKit d\u00f9ng c\u00e1c lane subagent n\u1ed9i b\u1ed9 khi h\u1eefu \u00edch.",
707
+ "smallTaskModel": "Model sidecar n\u1ed9i b\u1ed9 cho quy\u1ebft \u0111\u1ecbnh nh\u1ecf/an to\u00e0n c\u1ee7a UKit. \u0110\u1ed5i key n\u00e0y n\u1ebfu mu\u1ed1n \u0111\u1ed5i model n\u1ed9i b\u1ed9. N\u00f3 kh\u00f4ng thay th\u1ebf orchestration.orchestratorModel.",
708
+ "smallTaskAgent": "T\u00ean agent n\u1ed9i b\u1ed9 ph\u1ee5 tr\u00e1ch quy\u1ebft \u0111\u1ecbnh nh\u1ecf kh\u00f4ng block task ch\u00ednh.",
709
+ "smallTaskUseCases": "C\u00e1c lo\u1ea1i vi\u1ec7c an to\u00e0n sidecar c\u00f3 th\u1ec3 x\u1eed l\u00fd: d\u1ecdn task, compact decision, ph\u00e2n lo\u1ea1i, triage, queue maintenance, workspace maintenance.",
710
+ "keepMainModelFor": "C\u00e1c vi\u1ec7c r\u1ee7i ro ph\u1ea3i gi\u1eef \u1edf main model: security, code risky, release, data-loss, architecture, deep reasoning.",
613
711
  "decisionPolicy": {
614
- "nonBlocking": "Sidecar nội bộ không được block task chính của user.",
615
- "endUserInvisible": "Không biến orchestration nội bộ thành thứ end user phải học.",
616
- "handBackOnRisk": "Nếu sidecar thấy rủi ro thì trả lại main model quyết định.",
617
- "executionMode": "sidecar-parallel nghĩa là việc nội bộ có thể chạy riêng/song song với task chính.",
618
- "mustNotBlockMainTask": "True nghĩa là sidecar không được dừng/thay thế/làm chậm task chính.",
619
- "maxSidecarWaitMs": "0 nghĩa là không chờ sidecar trước khi tiếp tục task chính.",
620
- "optimizeOrder": "Thứ tự ưu tiên khi ra quyết định nội bộ.",
621
- "decisions": "Nhóm quyết định sidecar được phép hỗ trợ.",
622
- "stepBudgets": "Gợi ý số bước planning tối đa theo độ lớn task trước khi reassess. label LITE/FULL cho biết subagent dùng model nhỏ hay đầy đủ."
712
+ "nonBlocking": "Sidecar n\u1ed9i b\u1ed9 kh\u00f4ng \u0111\u01b0\u1ee3c block task ch\u00ednh c\u1ee7a user.",
713
+ "endUserInvisible": "Kh\u00f4ng bi\u1ebfn orchestration n\u1ed9i b\u1ed9 th\u00e0nh th\u1ee9 end user ph\u1ea3i h\u1ecdc.",
714
+ "handBackOnRisk": "N\u1ebfu sidecar th\u1ea5y r\u1ee7i ro th\u00ec tr\u1ea3 l\u1ea1i main model quy\u1ebft \u0111\u1ecbnh.",
715
+ "executionMode": "sidecar-parallel ngh\u0129a l\u00e0 vi\u1ec7c n\u1ed9i b\u1ed9 c\u00f3 th\u1ec3 ch\u1ea1y ri\u00eang/song song v\u1edbi task ch\u00ednh.",
716
+ "mustNotBlockMainTask": "True ngh\u0129a l\u00e0 sidecar kh\u00f4ng \u0111\u01b0\u1ee3c d\u1eebng/thay th\u1ebf/l\u00e0m ch\u1eadm task ch\u00ednh.",
717
+ "maxSidecarWaitMs": "0 ngh\u0129a l\u00e0 kh\u00f4ng ch\u1edd sidecar tr\u01b0\u1edbc khi ti\u1ebfp t\u1ee5c task ch\u00ednh.",
718
+ "optimizeOrder": "Th\u1ee9 t\u1ef1 \u01b0u ti\u00ean khi ra quy\u1ebft \u0111\u1ecbnh n\u1ed9i b\u1ed9.",
719
+ "decisions": "Nh\u00f3m quy\u1ebft \u0111\u1ecbnh sidecar \u0111\u01b0\u1ee3c ph\u00e9p h\u1ed7 tr\u1ee3.",
720
+ "stepBudgets": "G\u1ee3i \u00fd s\u1ed1 b\u01b0\u1edbc planning t\u1ed1i \u0111a theo \u0111\u1ed9 l\u1edbn task tr\u01b0\u1edbc khi reassess. label LITE/FULL cho bi\u1ebft subagent d\u00f9ng model nh\u1ecf hay \u0111\u1ea7y \u0111\u1ee7."
623
721
  }
624
722
  },
625
723
  "safePatch": {
626
- "enabled": "Bật Safe Patch Protocol: UKit âm thầm chặn patch stale/ambiguous trên file rủi ro và giữ an toàn encoding khi helper nội bộ sửa file.",
627
- "strictSharedRisk": "Nếu true, file runtime/shared-risk như .claude/hooks hoặc .claude/ukit sẽ bị guard chặt hơn; người dùng vẫn không cần nhớ command mới.",
628
- "advisoryOnly": "Nếu true (hoặc env UKIT_SAFE_PATCH_ADVISORY=1), guard chỉ in WARNING thay vì exit 2 — tránh Claude/Codex dừng giữa chừng chờ user 'continue'. Vẫn giữ message để model tự retry.",
629
- "largeFileLineThreshold": "Số dòng từ đó file được xem là lớn và cần anchor/spec guard kỹ hơn.",
630
- "largeFileByteThreshold": "Kích thước byte từ đó file được xem là lớn/rủi ro khi agent edit.",
631
- "backupEnabled": "Nếu true, UKit tạo rollback bytes dưới .ukit/storage/backups cho edit rủi ro.",
632
- "backupRetentionDays": "Số ngày giữ backup rollback cũ trong .ukit/storage/backups; UKit chỉ tự xoá folder backup có tên ngày hợp lệ YYYY-MM-DD.",
633
- "deltaMaxChangedLines": "Ngân sách dòng đổi mặc định cho kiểm tra delta sau này.",
634
- "deltaMaxHunks": "Ngân sách hunk đổi mặc định cho kiểm tra delta sau này.",
635
- "deltaMaxDiffCells": "Giới hạn cell LCS khi tính delta; quá ngưỡng này UKit dùng fallback tuyến tính để tránh chậm trên file rất lớn."
724
+ "enabled": "B\u1eadt Safe Patch Protocol: UKit \u00e2m th\u1ea7m ch\u1eb7n patch stale/ambiguous tr\u00ean file r\u1ee7i ro v\u00e0 gi\u1eef an to\u00e0n encoding khi helper n\u1ed9i b\u1ed9 s\u1eeda file.",
725
+ "strictSharedRisk": "N\u1ebfu true, file runtime/shared-risk nh\u01b0 .claude/hooks ho\u1eb7c .claude/ukit s\u1ebd b\u1ecb guard ch\u1eb7t h\u01a1n; ng\u01b0\u1eddi d\u00f9ng v\u1eabn kh\u00f4ng c\u1ea7n nh\u1edb command m\u1edbi.",
726
+ "advisoryOnly": "N\u1ebfu true (ho\u1eb7c env UKIT_SAFE_PATCH_ADVISORY=1), guard ch\u1ec9 in WARNING thay v\u00ec exit 2 \u2014 tr\u00e1nh Claude/Codex d\u1eebng gi\u1eefa ch\u1eebng ch\u1edd user 'continue'. V\u1eabn gi\u1eef message \u0111\u1ec3 model t\u1ef1 retry.",
727
+ "largeFileLineThreshold": "S\u1ed1 d\u00f2ng t\u1eeb \u0111\u00f3 file \u0111\u01b0\u1ee3c xem l\u00e0 l\u1edbn v\u00e0 c\u1ea7n anchor/spec guard k\u1ef9 h\u01a1n.",
728
+ "largeFileByteThreshold": "K\u00edch th\u01b0\u1edbc byte t\u1eeb \u0111\u00f3 file \u0111\u01b0\u1ee3c xem l\u00e0 l\u1edbn/r\u1ee7i ro khi agent edit.",
729
+ "backupEnabled": "N\u1ebfu true, UKit t\u1ea1o rollback bytes d\u01b0\u1edbi .ukit/storage/backups cho edit r\u1ee7i ro.",
730
+ "backupRetentionDays": "S\u1ed1 ng\u00e0y gi\u1eef backup rollback c\u0169 trong .ukit/storage/backups; UKit ch\u1ec9 t\u1ef1 xo\u00e1 folder backup c\u00f3 t\u00ean ng\u00e0y h\u1ee3p l\u1ec7 YYYY-MM-DD.",
731
+ "deltaMaxChangedLines": "Ng\u00e2n s\u00e1ch d\u00f2ng \u0111\u1ed5i m\u1eb7c \u0111\u1ecbnh cho ki\u1ec3m tra delta sau n\u00e0y.",
732
+ "deltaMaxHunks": "Ng\u00e2n s\u00e1ch hunk \u0111\u1ed5i m\u1eb7c \u0111\u1ecbnh cho ki\u1ec3m tra delta sau n\u00e0y.",
733
+ "deltaMaxDiffCells": "Gi\u1edbi h\u1ea1n cell LCS khi t\u00ednh delta; qu\u00e1 ng\u01b0\u1ee1ng n\u00e0y UKit d\u00f9ng fallback tuy\u1ebfn t\u00ednh \u0111\u1ec3 tr\u00e1nh ch\u1eadm tr\u00ean file r\u1ea5t l\u1edbn."
636
734
  },
637
735
  "handoff": {
638
- "enabled": "Bật Quality Gate cho handoff: plan có Test Plan, executor test-first, reviewer model khác. Tắt = quay về flow cũ (dễ lọt lỗi vặt).",
639
- "crossTool": "true nghĩa là handoff truyền qua file (PLAN/INDEX/tasks) chứ không qua in-process subagent — cho phép plan ở một tool, execute ở tool khác, review ở tool thứ ba khác model.",
640
- "maxParallelAgents": "Số agent chạy song song TỐI ĐA trong một wave (mặc định 2 để giữ session chính nhẹ và hạn chế rủi ro compact/worktree rác; nếu máy khỏe và task độc lập nhiều thì có thể nâng dần 3-5, tối đa ~10-15). Một wave có nhiều task hơn số này sẽ được chia thành nhiều batch chạy lần lượt — áp dụng cho cả Phase 3 Implement và Phase 4 Review. Lý do giới hạn vẫn còn: mỗi agent nền có context window riêng, và report của agent khi xong sẽ được inject ngược vào session chính — chạy quá nhiều cùng lúc (vd 20+) vẫn có thể làm session chính vượt context window và bỏ lại worktree rác. Hạ xuống 1-2 nếu task nặng (verification output dài) hoặc thấy compact bị trigger liên tục.",
736
+ "enabled": "B\u1eadt Quality Gate cho handoff: plan c\u00f3 Test Plan, executor test-first, reviewer model kh\u00e1c. T\u1eaft = quay v\u1ec1 flow c\u0169 (d\u1ec5 l\u1ecdt l\u1ed7i v\u1eb7t).",
737
+ "crossTool": "true ngh\u0129a l\u00e0 handoff truy\u1ec1n qua file (PLAN/INDEX/tasks) ch\u1ee9 kh\u00f4ng qua in-process subagent \u2014 cho ph\u00e9p plan \u1edf m\u1ed9t tool, execute \u1edf tool kh\u00e1c, review \u1edf tool th\u1ee9 ba kh\u00e1c model.",
738
+ "maxParallelAgents": "S\u1ed1 agent ch\u1ea1y song song T\u1ed0I \u0110A trong m\u1ed9t wave (m\u1eb7c \u0111\u1ecbnh 2 \u0111\u1ec3 gi\u1eef session ch\u00ednh nh\u1eb9 v\u00e0 h\u1ea1n ch\u1ebf r\u1ee7i ro compact/worktree r\u00e1c; n\u1ebfu m\u00e1y kh\u1ecfe v\u00e0 task \u0111\u1ed9c l\u1eadp nhi\u1ec1u th\u00ec c\u00f3 th\u1ec3 n\u00e2ng d\u1ea7n 3-5, t\u1ed1i \u0111a ~10-15). M\u1ed9t wave c\u00f3 nhi\u1ec1u task h\u01a1n s\u1ed1 n\u00e0y s\u1ebd \u0111\u01b0\u1ee3c chia th\u00e0nh nhi\u1ec1u batch ch\u1ea1y l\u1ea7n l\u01b0\u1ee3t \u2014 \u00e1p d\u1ee5ng cho c\u1ea3 Phase 3 Implement v\u00e0 Phase 4 Review. L\u00fd do gi\u1edbi h\u1ea1n v\u1eabn c\u00f2n: m\u1ed7i agent n\u1ec1n c\u00f3 context window ri\u00eang, v\u00e0 report c\u1ee7a agent khi xong s\u1ebd \u0111\u01b0\u1ee3c inject ng\u01b0\u1ee3c v\u00e0o session ch\u00ednh \u2014 ch\u1ea1y qu\u00e1 nhi\u1ec1u c\u00f9ng l\u00fac (vd 20+) v\u1eabn c\u00f3 th\u1ec3 l\u00e0m session ch\u00ednh v\u01b0\u1ee3t context window v\u00e0 b\u1ecf l\u1ea1i worktree r\u00e1c. H\u1ea1 xu\u1ed1ng 1-2 n\u1ebfu task n\u1eb7ng (verification output d\u00e0i) ho\u1eb7c th\u1ea5y compact b\u1ecb trigger li\u00ean t\u1ee5c.",
641
739
  "plan": {
642
- "requireTestPlan": "Bắt buộc PLAN.md §4 phải có Test Plan trước khi task chuyển ready.",
643
- "minTestsHappyPath": "Tối thiểu test cho happy path.",
644
- "minTestsEdgeCase": "Tối thiểu test cho edge case (mặc định 2, tăng từ 1 — phải khác loại nhau, vd null/empty + boundary/concurrent, không tính 2 test gần giống nhau là đủ).",
645
- "requireLintOrTypecheckInVerification": "Nếu project có sẵn lint/typecheck script (package.json hoặc tương đương), Verification Commands của mỗi task BẮT BUỘC phải gồm lệnh đó — không chỉ chạy test. Project không có lint/typecheck thì planner phải ghi rõ lý do N/A thay vì bỏ qua im lặng.",
646
- "regressionTestRequiredForBugfix": "Bug fix phải có regression test fail-trước-fix.",
647
- "smartModelHint": "Gợi ý model mạnh nhất cho phase plan (ví dụ claude-opus-5). UKit không tự ép, chỉ ghi hint vào task."
740
+ "requireTestPlan": "B\u1eaft bu\u1ed9c PLAN.md \u00a74 ph\u1ea3i c\u00f3 Test Plan tr\u01b0\u1edbc khi task chuy\u1ec3n ready.",
741
+ "minTestsHappyPath": "T\u1ed1i thi\u1ec3u test cho happy path.",
742
+ "minTestsEdgeCase": "T\u1ed1i thi\u1ec3u test cho edge case (m\u1eb7c \u0111\u1ecbnh 2, t\u0103ng t\u1eeb 1 \u2014 ph\u1ea3i kh\u00e1c lo\u1ea1i nhau, vd null/empty + boundary/concurrent, kh\u00f4ng t\u00ednh 2 test g\u1ea7n gi\u1ed1ng nhau l\u00e0 \u0111\u1ee7).",
743
+ "requireLintOrTypecheckInVerification": "N\u1ebfu project c\u00f3 s\u1eb5n lint/typecheck script (package.json ho\u1eb7c t\u01b0\u01a1ng \u0111\u01b0\u01a1ng), Verification Commands c\u1ee7a m\u1ed7i task B\u1eaeT BU\u1ed8C ph\u1ea3i g\u1ed3m l\u1ec7nh \u0111\u00f3 \u2014 kh\u00f4ng ch\u1ec9 ch\u1ea1y test. Project kh\u00f4ng c\u00f3 lint/typecheck th\u00ec planner ph\u1ea3i ghi r\u00f5 l\u00fd do N/A thay v\u00ec b\u1ecf qua im l\u1eb7ng.",
744
+ "regressionTestRequiredForBugfix": "Bug fix ph\u1ea3i c\u00f3 regression test fail-tr\u01b0\u1edbc-fix.",
745
+ "smartModelHint": "G\u1ee3i \u00fd model m\u1ea1nh nh\u1ea5t cho phase plan (v\u00ed d\u1ee5 claude-opus-5). UKit kh\u00f4ng t\u1ef1 \u00e9p, ch\u1ec9 ghi hint v\u00e0o task."
648
746
  },
649
747
  "executor": {
650
- "testFirstRequired": "Executor phải viết test trước khi implement (RED → GREEN).",
651
- "mustRunVerificationInTurn": "Phải chạy Verification Commands trong cùng turn báo DONE; không tin output cũ.",
652
- "blockDoneWithoutFreshPass": "Không cho phép STATUS:DONE nếu chưa có PASS fresh trong turn này.",
653
- "cheapSmartModelHint": "Gợi ý model rẻ-mà-vẫn-thông-minh cho executor (ví dụ unic-code). UKit chỉ ghi hint.",
654
- "appendReportToTaskFile": "Executor append `## Executor Report` vào cuối task file để reviewer (tool khác) đọc được."
748
+ "testFirstRequired": "Executor ph\u1ea3i vi\u1ebft test tr\u01b0\u1edbc khi implement (RED \u2192 GREEN).",
749
+ "mustRunVerificationInTurn": "Ph\u1ea3i ch\u1ea1y Verification Commands trong c\u00f9ng turn b\u00e1o DONE; kh\u00f4ng tin output c\u0169.",
750
+ "blockDoneWithoutFreshPass": "Kh\u00f4ng cho ph\u00e9p STATUS:DONE n\u1ebfu ch\u01b0a c\u00f3 PASS fresh trong turn n\u00e0y.",
751
+ "cheapSmartModelHint": "G\u1ee3i \u00fd model r\u1ebb-m\u00e0-v\u1eabn-th\u00f4ng-minh cho executor (v\u00ed d\u1ee5 unic-code). UKit ch\u1ec9 ghi hint.",
752
+ "appendReportToTaskFile": "Executor append `## Executor Report` v\u00e0o cu\u1ed1i task file \u0111\u1ec3 reviewer (tool kh\u00e1c) \u0111\u1ecdc \u0111\u01b0\u1ee3c."
655
753
  },
656
754
  "reviewer": {
657
- "enabled": "Bật Phase 3 review độc lập. Tắt = bỏ lưới an toàn cuối cùng, không khuyến nghị.",
658
- "model": "Model reviewer. BẮT BUỘC khác executor model. Mặc định unic-smart; có thể dùng claude-opus-5 hoặc bất kỳ model reasoning mạnh nào.",
659
- "agent": "Tên reviewer agent (xem .claude/agents/code-reviewer.md).",
660
- "mustDifferFromExecutor": "Nếu true, reviewer tự refuse khi phát hiện cùng model với executor.",
661
- "blockOnCritical": "CRITICAL → block handoff cứng. Set false chỉ khi muốn warning mềm.",
662
- "blockOnChangesRequested": "CHANGES-REQUESTED → block handoff đến khi fix. Set false sẽ cho phép done với issue Important.",
663
- "rerunVerificationCommands": "Reviewer phải tự chạy lại Verification Commands, không tin output executor.",
664
- "appendVerdictToTaskFile": "Reviewer append `## Reviewer Verdict` vào task file để khép vòng handoff."
755
+ "enabled": "B\u1eadt Phase 3 review \u0111\u1ed9c l\u1eadp. T\u1eaft = b\u1ecf l\u01b0\u1edbi an to\u00e0n cu\u1ed1i c\u00f9ng, kh\u00f4ng khuy\u1ebfn ngh\u1ecb.",
756
+ "model": "Model reviewer. B\u1eaeT BU\u1ed8C kh\u00e1c executor model. M\u1eb7c \u0111\u1ecbnh unic-smart; c\u00f3 th\u1ec3 d\u00f9ng claude-opus-5 ho\u1eb7c b\u1ea5t k\u1ef3 model reasoning m\u1ea1nh n\u00e0o.",
757
+ "agent": "T\u00ean reviewer agent (xem .claude/agents/code-reviewer.md).",
758
+ "mustDifferFromExecutor": "N\u1ebfu true, reviewer t\u1ef1 refuse khi ph\u00e1t hi\u1ec7n c\u00f9ng model v\u1edbi executor.",
759
+ "blockOnCritical": "CRITICAL \u2192 block handoff c\u1ee9ng. Set false ch\u1ec9 khi mu\u1ed1n warning m\u1ec1m.",
760
+ "blockOnChangesRequested": "CHANGES-REQUESTED \u2192 block handoff \u0111\u1ebfn khi fix. Set false s\u1ebd cho ph\u00e9p done v\u1edbi issue Important.",
761
+ "rerunVerificationCommands": "Reviewer ph\u1ea3i t\u1ef1 ch\u1ea1y l\u1ea1i Verification Commands, kh\u00f4ng tin output executor.",
762
+ "appendVerdictToTaskFile": "Reviewer append `## Reviewer Verdict` v\u00e0o task file \u0111\u1ec3 kh\u00e9p v\u00f2ng handoff."
665
763
  },
666
- "statusFlow": "Danh sách status hợp lệ trong INDEX.md. Đổi tên trong này = đổi state machine handoff.",
764
+ "statusFlow": "Danh s\u00e1ch status h\u1ee3p l\u1ec7 trong INDEX.md. \u0110\u1ed5i t\u00ean trong n\u00e0y = \u0111\u1ed5i state machine handoff.",
667
765
  "fullstack": {
668
- "stopGateEnabled": "Bật Stop gate handoff: RUN.md Phase != done/blocked → Stop hook từ chối stop kèm Next step, giữ handoff-fullstack chạy tiếp thay vì đứng sau recap. Tắt chỉ khi debug.",
669
- "stopGateMaxStalledBlocks": "Liveness breaker: cursor không nhích qua N lần block liên tiếp thì gate thả stop (tránh vòng lặp vô tận). Mặc định 12.",
670
- "stopGateMaxCrashStreaks": "Liveness breaker cho coordinator crash: sau N lần block liên tiếp do infrastructure failure, gate thả stop kèm cảnh báo lớn. Mặc định 3.",
671
- "quietScansRequired": "Số scan liên tiếp không thấy việc mới trước khi handoff-fullstack được phép đóng run. Mặc định 2.",
672
- "idleWatchdogMin": "Khoảng phút cho scheduled wakeup nếu harness hỗ trợ (cron/loop). Mặc định 5.",
673
- "autoArchive": "true = Phase F tự archive cycle vào docs/AI_HANDOFF/archive/cycle-NN/ khi hoàn tất.",
674
- "specRequired": "true = handoff-create bắt buộc viết docs/AI_HANDOFF/SPEC.md chi tiết trước khi tạo task."
766
+ "stopGateEnabled": "B\u1eadt Stop gate handoff: RUN.md Phase != done/blocked \u2192 Stop hook t\u1eeb ch\u1ed1i stop k\u00e8m Next step, gi\u1eef handoff-fullstack ch\u1ea1y ti\u1ebfp thay v\u00ec \u0111\u1ee9ng sau recap. T\u1eaft ch\u1ec9 khi debug.",
767
+ "stopGateMaxStalledBlocks": "Liveness breaker: cursor kh\u00f4ng nh\u00edch qua N l\u1ea7n block li\u00ean ti\u1ebfp th\u00ec gate th\u1ea3 stop (tr\u00e1nh v\u00f2ng l\u1eb7p v\u00f4 t\u1eadn). M\u1eb7c \u0111\u1ecbnh 12.",
768
+ "stopGateMaxCrashStreaks": "Liveness breaker cho coordinator crash: sau N l\u1ea7n block li\u00ean ti\u1ebfp do infrastructure failure, gate th\u1ea3 stop k\u00e8m c\u1ea3nh b\u00e1o l\u1edbn. M\u1eb7c \u0111\u1ecbnh 3.",
769
+ "quietScansRequired": "S\u1ed1 scan li\u00ean ti\u1ebfp kh\u00f4ng th\u1ea5y vi\u1ec7c m\u1edbi tr\u01b0\u1edbc khi handoff-fullstack \u0111\u01b0\u1ee3c ph\u00e9p \u0111\u00f3ng run. M\u1eb7c \u0111\u1ecbnh 2.",
770
+ "idleWatchdogMin": "Kho\u1ea3ng ph\u00fat cho scheduled wakeup n\u1ebfu harness h\u1ed7 tr\u1ee3 (cron/loop). M\u1eb7c \u0111\u1ecbnh 5.",
771
+ "autoArchive": "true = Phase F t\u1ef1 archive cycle v\u00e0o docs/AI_HANDOFF/archive/cycle-NN/ khi ho\u00e0n t\u1ea5t.",
772
+ "specRequired": "true = handoff-create b\u1eaft bu\u1ed9c vi\u1ebft docs/AI_HANDOFF/SPEC.md chi ti\u1ebft tr\u01b0\u1edbc khi t\u1ea1o task."
675
773
  }
676
774
  }
677
775
  }
678
- }
776
+ }