wal: pause

This commit is contained in:
pqhuy1987
2026-07-31 21:47:23 +07:00
parent 15349e8ee0
commit bd68f71e42
22 changed files with 402 additions and 146 deletions

View File

@ -1,81 +1,40 @@
# WAL — auto-generated, không sửa tay
updated: 2026-07-31T15:13:43+07:00 | session: S165 (L9, window 3 — /tiep; lead=Fable) | branch: main
updated: 2026-07-31T21:52:00+07:00 | session: S165 (L9, window 3 — /pause) | branch: main
goal: CHUỖI 4-GĐ SP-002 — SPEC ĐÓNG BĂNG (B0→B3 trọn) · B4 BUILD BẮT ĐẦU (wave K1-BE đang chạy)
goal: CHUỖI SP-002 B4 — K1+K2+K3 SHIP (3/8 wave); K4a→K8 + checkbox-opt-out = lần /tiep sau (mandate PAUSE-3)
chain:
[x] /tiep + VÁ 12/12 + spec SP-002 nạp (6 nhịp + 3 hình) — log cũ trong _context
[x] B0 draft → B1a invest (att-2 cứu) → B1b clone-review 3-lane → spec-tổng v2
[x] B2 TRỌN 3 cụm: invest fable ×3 (c1 33KB · c2 5/5 · c3 22.9KB) + review 3-lane ×3 → 3 spec-cụm final,
43 vá. Sự cố đã xử: ngược-#53 ev#4 · skeleton-472B ×1 · chết-ruột-188B ×1 (opus) — đan-xen từ đó 5/5 SẠCH
[x] OG CHỐT TRỌN 9: 1-gộp+UI-1-1 · 2-đội-hình-cũ · 3-NĐUQ-human-gate-VĨNH-VIỄN · 7-N-phiếu+UI-1 · 8-hiển-thị ·
9-đảo-PHÁ-VỠ-S155 · QĐ9-freeze-tái-dùng-máy-sẵn · (V)-thiết-kế-ERP-đúng+PE-test-SOLUTION-PE-{n} ·
BACKLOG 3 mục giai-đoạn-sau (amendment · authz-nhóm · bung-gộp)
[x] B3 fable-review chốt: GO-WITH-SPEC-FIXES (GO 9/10 · 8 mâu-thuẫn · 0 vá-đè-vá/43 · build-order
K1→K2→K3→K4a→K4b→K5→K4c→K6→K7→K8) → 8 fix lead ÁP XONG → SPEC ĐÓNG BĂNG 4 file
[x] B4 K1 TRỌN 3 lane (BE p1 wf_2569b79b chết-40%-schema-xong + p2 wf_2e08ba77 seeder86+CQRS+controller ·
FE SHA-pair d71a9e3b ×2 · test wf_1fb9f309 7-test; bài giữ: git-status-trước-Write · #68 build-trọng-tài
· TenVi sạch · 2 khoảng-hở UX FE khai [3 filter BE chưa UI · tab cả fe-user]) — chi tiết sub-*-k1.md
[x] gate K1 PASS-WITH-FLAGS 9f (sub-reviewer-gate-k1.md; reviewer #53 ×1 → resume-sạch, artifact cứu B4-d).
Xử @S165: F4 IncludeInactive-mặc-định-loại + T5b · F7 5-kind · F2 STATUS-delta · F9 Mig70-áp-LocalDB.
Khai: F1 OG-6-soát-SAU · F3 authz-mirror-#82 · F5 PermGuard-nợ-khuôn-cũ · F6 IX_-NIT. Suite 598/0
[x] commit 50e6d8c PUSH → cicd PASS 6/6 (run #434 6m31s · gate-CI 598 · Mig70 prod-top + recycle-proof ·
seed 86 TAM-GIÁC 3-nguồn · bundle 4/4 rotate + 4-cũ-chết · smoke 8/8). cicd #53 ×2 @S165 return=memory-
talk, artifact cứu trọn. Bài: hash local ≠ hash CI — mốc prod luôn re-snapshot LIVE
[x] K2-BE TRỌN (p1 wf_583be7ad chết-giữa-c + p2 chết-@f-0-byte-artifact [#53 ×2 task này, ×4 @S165] +
lead-solo đóng: 3-hằng-Scope · submit-guard vá-5-THẮNG-nền-:126 [ghost-window K2→K4b khai] ·
controller ?group= · §e DONE-BY-DESIGN EnsureDraftEditable · 3 test cũ update-spec-3-cột).
Build 0W/0E · suite 598/0. Artifact sub-implbe-k2.md §c-h = lead on-behalf sau verify-đĩa
[x] K2-test TRỌN (lane chết-return + 0-artifact [#53 ×5-6 @S165 cả wave] NHƯNG file test HOÀN CHỈNH:
GroupAndCatalogTests 824-dòng 9-Fact T-a..T-g+2 · suite 607/0 = 45D+562I · 0 đè 3-test-lead ·
sub-test-k2.md = lead on-behalf sau verify-đĩa)
[x] K2-FE TRỌN (p1 chết-sau-recon + markup-rò [sub-class #53 mới, lead cắt]; p2 ĐO LẠI bắt tiền-đề lead
SAI-MỘT-PHẦN: 8 khai báo ĐÃ có call-site — diagnostics = snapshot giữa-Write #68; chỗ dở thật =
ListPage → vá badge + cột Tổng-duyệt vá-8 + colSpan 8; cp 4-file fe-user; build ×2 PASS DORfkFnc/
qYI2yszp; SHA-pair 5/5 + panel control-dương giữ baseline). Artifact sub-implfe-k2.md ĐẦY tự lane ghi
[x] gate K2 PASS-WITH-FLAGS 10f (sub-reviewer-gate-k2.md; #53 ×1 → resume; phán vá-5-thắng-nền ĐÚNG +
bác 3 nghi-vấn lead-solo). Xử: F-1 guard đếm-so-khớp (bịt hạng-mục-xoá-mềm/Guid-rác) + 2 test bịt
(xoá-mềm-chặn + reflection ?group=) · F-2/F-5/F-7/F-8/F-9 comment-honest (lý-do-thật filtered-index
khả-thi, thì-tương-lai K4b, Down-data-dependent, default-0-SQL-thô) · F-3 STATUS 607→609 · F-4 SKILL 97.
Suite 609/0 (45D+564I) · npm ×2 (comment-only ⇒ bundle hash giữ) · SHA-pair ✓
[x] commit K2 0779f2d 23-file PUSH (lần 1 FAIL PS5.1-quote-trap → -F file) → cicd-K2 PARTIAL 5/6
deploy-KHỎE (run #435 · gate-CI 609 tách-phần · Mig71 prod-top+restart-proof · bundle 4/4 rotate ·
smoke 6/6 ?group= wired; mục-4 backfill/Σ = CHÂN-LÝ-RỖNG prod-0-phiếu — đo lại khi K8 đẻ phiếu thật.
cicd #53 return-garble tiếp, artifact trọn)
[!] K3 CHẺ NHỎ sau 2 lượt engine-process-exit (p1 wf_a04124a7 + p2 Agent — cả 2 0-delta-0-artifact;
bài: task-đọc-nhiều-trước-Write chết, task-hẹp-Write-sớm sống). Bước-0 LEAD: prod=localhost\SQLEXPRESS,
QT-DN-V2-001 LIVE, ROSTER 3-trạm 11 người @sub-implbe-k3.md §0, chuong.phan giữ cờ.
ĐANG CHẠY: nhịp-1-BE lane (seed 8 wf + 8 MenuKeys — đã append §1 kế-hoạch + khai L1-không-khuôn-type-10
→mirror-ContractV2 + L2-ép-false-không-cản-seeder) ∥ K3-FE lane (resolvePath AwV2_KhkkN* + gỡ khóa
Designer + panel ×2). XONG LEAD-SOLO: nhịp-2 port finalize (branch mirror PE :866-876 + opt-out
applyLevelFinalize 3-tầng interface/service/controller + comment (a)(b) supersede-S155 + 2 test-callsite
ct:) + nhịp-3 (gỡ CREATE ép-false :380 [GIỮ PUT-Conflict — luật versioning CHUNG, spec vá-3 liệt nhầm,
lệch KHAI chờ gate soi] + rào (v) pin-đúng-nhóm regex KHKK-N[1-8]).
✅ nhịp-1-BE DONE (seed 8 wf + 8 key; khai L1-mirror-ContractV2 + L2) · ✅ K3-FE DONE (Layout phép-âm
PASS · gỡ khóa duyệt-sớm sạch · Panel pair 336ECCC1F86D ×2 · npm ×2 lead-verified) · ✅ BE trọng-tài
0W/0E + 609/0. [!] K3-test lane ĐANG CHẠY (T-a..T-e finalize/opt-out/pin-nhóm/giữ-cờ)
→ gate K3 → commit-push → cicd → /pause (mandate mới)
[ ] 🔴 MANDATE MỚI (owner in-turn @S165 ~17:3x: "xong nốt thì /pause rồi những đầu việc tiếp theo để
lần tiep sau làm tiếp") — SUPERSEDE "chạy 1 mạch": XONG NỐT K3 (BE p2 đang chạy → FE + test song song
→ gate K3 → commit-push → cicd verify) rồi /pause. K4a→K4b→K5→K4c→K6→K7→K8 = lần /tiep sau.
OG-6 = soát-SAU (giữ). Lưu ý pause tới: trần _mind 84,8% ⇒ PHẢI nén MIND-1 kèm nơi-đi 6 ý trước MIND-3.
[ ] K8 dry-run: gói test SOLUTION-PE-{n} + B0-form 14 người thật (fail-closed) + đo freeze 2-nhánh
[ ] closeout: seed diary vai (C2 AB=∅) · tally garble (+reviewer-gate ×1 @S165 resume-sạch, đếm lại cuối
phiên) · nhãn D MIND-3 + nén MIND-1-kèm-nơi-đi-6-ý (trần 84,8%) · STATUS row S163/S164/S165
[x] K1 danh mục 86 dòng — gate 9f · commit 50e6d8c · cicd PASS 6/6 (sub-cicd-verify-k1.md; seed 86
TAM-GIÁC 3-nguồn prod)
[x] K2 phiếu +nhóm +hạng-mục Mig71 — gate 10f (F-1 guard đếm-so-khớp + 2 test bịt) · commit 0779f2d ·
cicd PARTIAL 5/6 deploy-khỏe (mục-4 chân-lý-rỗng, đo lại khi K8 đẻ phiếu — sub-cicd-verify-k2.md)
[x] K3 8-workflow +finalize +designer 0-mig — chẻ-nhỏ sau 2 engine-exit (bài: task-hẹp-Write-sớm);
roster LIVE lead-verify (instance SQLEXPRESS — sub-implbe-k3.md §0); gate 8f/0-blocker (3/3 phán
lead ĐÚNG) · commit 15349e8 PUSHED · suite 614/0 (45D+569I) · +8 key AwV2_KhkkN* (All=64, policy=256)
[!] cicd-K3 CHẾT-vì-SESSION-LIMIT 18:50 giữa verify — artifact 2640B phần đầu (sub-cicd-verify-k3.md).
/tiep sau: đọc artifact + RE-VERIFY 6 mục (run success? · gate-CI 614 · top-mig GIỮ 20260731085624 ·
seed 8-wf KHKK-N* prod + cờ chuong.phan ×8 · bundle ×2 rotate · smoke 401/404/200)
[ ] 🔴 ĐẦU VIỆC #1 (gate-K3 F-1 MAJOR): checkbox opt-out applyLevelFinalize ở màn duyệt KHKK — mirror
PeWorkflowPanel.tsx:778 + DTO expose cờ level (WorkflowLevelDto) + types ×2 app (BE param sẵn,
hiện ?? true ⇒ trạm CEO chỉ đi được bằng admin bỏ cờ Designer). BẮT BUỘC trước K8 dry-run
[ ] K4a→K4b→K5→K4c→K6→K7→K8-prep theo build-order B3 + vá-số spec-cụm2/cụm3 (chi tiết PAUSE-3 mục (2):
K4a 49-row + vá-1 route-regex CÙNG-wave + vá-7 nhãn-N2-phá-dỡ + DELTA +49key/+196policy · K4b
searchParams + queryKey+group · K5 groups + forward-provision lines[].contractId pe.contractId ·
K4c WfView lọc Code · K6 blacklist 12-key + fe-user-0-diff · K7 hội-2-khóa + grant Contracts.Create
[câu III default Drafter+Procurement+Admin] + Line.ContractId-ghi-luôn · K8 form-14-người fail-closed
+ gói SOLUTION-PE-{n} + QĐ9 đo-2-nhánh + ZZTEST + rollback-theo-ID)
[ ] closeout-nợ: diary vai (C2) · tally #53 CHỐT (tạm ~14/17 lượt cửa-3, sub-class mới engine-process-
exit ×2 — đếm lại từ sổ) · nhãn D MIND · STATUS row S163/S164/S165 · spec-cụm1 vá-3 đính-chính
chữ PUT-Conflict (gate-K3 phán giữ-là-đúng) · lỗi-tự-bắt ship-607-khi-609 ghi bài
next: đợi K3-BE p2 → VERIFY ĐĨA → phóng K3-FE + K3-test song song → gate K3 → commit-push → cicd
/pause (mandate mới). Chết giữa: relaunch-cắt-gọt §4. Lần /tiep sau: K4a (49 menu + grant, spec-cum2
vá-1 route-regex CÙNG K4a) → K4b → K5 → K4c → K6 → K7 → K8-prep-form-14-người.
next: /tiep → đọc sub-cicd-verify-k3.md dòng-1 + re-verify 6 mục → checkbox opt-out (đầu việc #1)
K4a theo build-order.
verify:
ls .claude/workflows/runs/2026-07-31-S164-4gd-khkk-fanout/ | wc -l # 29 @S165 sau gate-K1 (tăng theo lane — đếm tươi, đừng neo; ctx-verifier K8 vá 28→29)
git status --porcelain | head -20 # K1 uncommitted (4 file mới + BE/FE sửa) tới khi push
grep -c 'GO 9/10' .claude/workflows/runs/2026-07-31-S164-4gd-khkk-fanout/sub-review-fable-b3.md # =1 (S165 vá verify-literal: "GO-WITH-SPEC-FIXES" là nhãn chain, KHÔNG literal trong file)
head -1 .claude/workflows/runs/2026-07-31-S164-4gd-khkk-fanout/sub-cicd-verify-k3.md
git log --format='%h %s' -3 # 15349e8 K3 · 0779f2d K2 · 50e6d8c K1 (đều pushed)
dotnet test SolutionErp.slnx --nologo # 614/0 = 45D + 569I
notes: SPEC 4 file = spec-tổng v2 (9 QĐ + backlog-3) · spec-cum{1,2,3} final (12+15+16 vá). Câu-ranh builder:
":342" trùng số dòng 2 file — Features.cs:342-347 PHẢI đổi ⟂ WorkflowService.cs:342 CẤM đụng (B3-B4).
CHỜ ANH (không chặn K-wave): (I) bản-15-trang · (II) B2-14-dòng+"/"=hoặc · (III) ai-bấm-Đưa-vào-HĐ
[default Drafter+Procurement+Admin] · OG-6 soát-SAU qua Admin CRUD [HẾT chặn — chốt @PAUSE-2, ctx-verifier
K2 bắt câu cũ tự-mâu-thuẫn @S165] · OG-5 hỏi-khi-gặp.
Sổ lane-chết: fable 3/9 · opus 1/13 · reviewer-gate-K1 #53 ×1 @S165 (artifact cứu B4-d, resume đang chạy).
Engine: fable ×6 · clone ×9 · impl ×4 K1-trọn. mind-check 11Đ/0T @S165 (nợ block MIND-2 đã trả).
notes: MANDATE PAUSE-3 (3 tin anh verbatim ở _context): xong-K3-thì-pause · K4a→K8 lần sau · sổ nhớ kỹ
từng đầu việc đã review. Treo-không-chặn: (I)(II)(III) · OG-5 · OG-6-soát-4-ô-UI · 2-hở-UX-K1-FE ·
F-5-PermGuard-khuôn-cũ · O-2-literal-2-nơi. _mind 93,3% ⇒ pause kế NÉN MIND-2 (khuôn nén = MIND-1).

View File

@ -239,8 +239,8 @@ MỌI agent trong roster có **4 RAG-READ MCP**: `search_memory` + `search_code`
- **Keyword = QUYỀN, KHÔNG lệnh (T4):** "workflow"/"ultracode" mở quyền hỏi, KHÔNG auto-run. Mode-OFF + "chạy workflow" → TỪ CHỐI + nhắc `/ultra-on`. CẤM native `/effort ultracode`. *(Bài học 515K-token false-trigger.)*
- **Scope (S1):** Workflow fan-out CHỈ repo SOLUTION_ERP — KHÔNG fan-out repo/corpus khác.
- **Checkpoint (S2):** `hmw.js` **throw** nếu `checkpointApproved≠true` (mechanized tripwire anti-accidental). Em main BÁO {số agent·vai·task} @inform → set cờ → fan-out (KHÔNG chờ confirm từng lần; marker-ON=consent). Sub KHÔNG spawn sub (S3).
- **VALID_ROLES (whitelist `hmw.js` — ĐỦ roster; số vai canonical → [`docs/STATUS.md`](../../docs/STATUS.md) §Sub-agents, B1 KHÔNG chép số):** `investigator-codebase` · `investigator-api` · `implementer-backend` · `implementer-frontend` · `test-specialist` · `reviewer` · `cicd-monitor` · `frontend-designer` · `database-agent` (+S57 — S56 đã dùng 3× qua fail-soft WARN) · `office-document` (+S107 — Office WRITE OD1OD10) · `tooling-auditor` + `harvest-curator` (+S110 anh-directed — H21 roster-parity lệnh-B) · **`lead-stale-auditor` + `lead-gap-auditor` (+S121 W2 — H24 lead-self-audit)** · **`harness-eval` + `harness-refine` + `harness-audit` (+S141 — trio-memory)** · **`ring1-audit` + `ring2-audit` + `ring4-audit` (+S145 — C4/C4b round-KIỂM ×3: vòng tooling/harvest · soi-lead H24 · nén-ngủ; AUTO fire-after-measure, no-self-exempt, NO-OP nếu vòng không đo)**. 🔸 **Cả 10 monitor đều INFORM-only, lane RETURN-only** (propose-only). 🔴 **KHÔNG đọc "KHÔNG Write/Edit" thành cơ-chế chặn — đo S143:** frontmatter 9 vai read-only **không khai** `Write/Edit`, nhưng **runtime VẪN cấp**, nối ở cuối tool-list (nhân-chứng trực-tiếp: `reviewer` đã Write+Edit thật trong `runs/2026-07-22-S143-closeout-audit/`). Whitelist = **tuyên-bố ý-định**; containment THẬT = em main single-writer + git-diff commit-gate. Role lạ ∉ VALID_ROLES → `hmw.js` **THROW (STOP-HARD)** + báo owner (S4c, DIRECTED REC-3 2026-07-13); role-less null → inherit lead.
- 🔴 **2 vai H24 = trục RIÊNG, KHÔNG gộp H1/H2:** H1 `tooling-auditor` = tooling-freshness · H2 `harvest-curator` = harvest-integrity · **H24 = soi chính LEAD** (`lead-stale-auditor` = cái CÓ-nhưng-LỆCH · `lead-gap-auditor` = cái BỊ THIẾU). Class-flag lấy từ **enum ĐÓNG** `lead_self_audit.flag_classes` (`.claude/agent-memory/memory-budget.json`) — **vai KHÔNG tự chế class**; nhịp = `h24_cadence` (cùng file), chạy **theo NHỊP** không phải mỗi phiên (`session-start §2.1.8` · `session-end §L.b(j)`).
- **VALID_ROLES (whitelist `hmw.js` — ĐỦ roster; số vai canonical → [`docs/STATUS.md`](../../docs/STATUS.md) §Sub-agents, B1 KHÔNG chép số):** `investigator-codebase` · `investigator-api` · `implementer-backend` · `implementer-frontend` · `test-specialist` · `reviewer` · `cicd-monitor` · `frontend-designer` · `database-agent` (+S57 — S56 đã dùng 3× qua fail-soft WARN) · `office-document` (+S107 — Office WRITE OD1OD10) · `tooling-auditor` + `harvest-curator` (+S110 anh-directed — H21 roster-parity lệnh-B) · **`lead-stale-auditor` + `lead-gap-auditor` (+S121 W2 — H24 lead-self-audit)** · **`harness-eval` + `harness-refine` + `harness-audit` (+S141 — trio-memory)** · **`ring1-audit` + `ring2-audit` + `ring4-audit` (+S145 — C4/C4b round-KIỂM ×3: vòng tooling/harvest · soi-lead H24 · nén-ngủ; AUTO fire-after-measure, no-self-exempt, NO-OP nếu vòng không đo)** · **`ctx-curator` + `ctx-verifier` + `ctx-audit` (+S153 OWNER-VETO hub-form 3-vai `0df10df4` — vòng Ctx lớp mềm `_mind`: vai-1 KIỂM-nháp @mỗi-`/pause` [carve-out duy nhất của luật "NGỪNG spawn" §1] · vai-2 ĐỐI-CHIẾU+NẠP @mỗi-`/tiep` · vai-3 SOI-CHUỖI 2 đầu phiên; cả 3 trả CHỈ văn-bản)**. 🔸 **Cả 13 monitor đều INFORM-only, lane RETURN-only** (propose-only; 13 + 10 worker = roster 23, số canonical → STATUS §Sub-agents). 🔴 **KHÔNG đọc "KHÔNG Write/Edit" thành cơ-chế chặn — đo S143:** frontmatter 9 vai read-only **không khai** `Write/Edit`, nhưng **runtime VẪN cấp**, nối ở cuối tool-list (nhân-chứng trực-tiếp: `reviewer` đã Write+Edit thật trong `runs/2026-07-22-S143-closeout-audit/`). Whitelist = **tuyên-bố ý-định**; containment THẬT = em main single-writer + git-diff commit-gate. Role lạ ∉ VALID_ROLES → `hmw.js` **THROW (STOP-HARD)** + báo owner (S4c, DIRECTED REC-3 2026-07-13); role-less null → inherit lead.
- 🔴 **2 vai H24 = trục RIÊNG, KHÔNG gộp H1/H2:** H1 `tooling-auditor` = tooling-freshness · H2 `harvest-curator` = harvest-integrity · **H24 = soi chính LEAD** (`lead-stale-auditor` = cái CÓ-nhưng-LỆCH · `lead-gap-auditor` = cái BỊ THIẾU). Class-flag lấy từ **enum ĐÓNG** `lead_self_audit.flag_classes` (`.claude/agent-memory/memory-budget.json`) — **vai KHÔNG tự chế class**; cặp light chạy **VÔ-ĐIỀU-KIỆN mỗi bookend** (hình B @S149); chỉ **`deep`** còn cổng `h24_cadence.deep_every` (`session-start §2.1.8` · `session-end §L.b(j)`). 🧊 *Mệnh-đề cũ "theo NHỊP, không phải mỗi phiên" GỠ @S164 — trái hành-vi đo được (S154 counter≈28 · S158 counter=32 đều < `light_every` mà cặp VẪN chạy); đây là site thứ 7 của FLAG-1 sau khi 6 site trong 2 file LỆNH vá @S159 — lớp persona/doc sót lại.*
- ⚠️ **Đổi roster = đổi 2 BỀ-MẶT ĐỘC-LẬP:** (1) file `.md` trong `.claude/agents/`**Agent-tool registry** · (2) hằng `VALID_ROLES` trong `hmw.js`**workflow `agentType`**. Sửa 1 quên 1 = vai **spawn được tay nhưng THROW trong workflow** (hoặc ngược lại). 🔴 **Registry = ảnh-chụp lúc khởi phiên, KHÔNG hot-reload** ⇒ vai mới cần **RESTART + spawn-probe THẬT** (`session-start §0.6b`) — `ls` + grep VALID_ROLES là **điều-kiện CẦN, KHÔNG ĐỦ**.
- **Memory governance (M1M5 + R1):** B1 slice-inject (agent ← slice MEMORY của đúng vai qua `args`) · M2 return-delta-only (`memoryDelta{task,verdict,learned,surprise}`) · B3 lead single-writer VERIFY→APPEND-only (no-overwrite-unverified) · B2 harvest-LIỀN sau mỗi workflow vào `agent-memory/<role>` · M5 `store_memory` strip (đã S47). **Containment = defense-in-depth** (git-diff + Qdrant chunk-count post-P2), KHÔNG allowlist đơn-độc (G-015: sub vẫn giữ Bash/Write — KHÔNG "read-only").

View File

@ -32,7 +32,7 @@
- [Prod config: inspect-before-change](feedback_prod_config_inspect_before_change.md) — đổi config prod = inspect LIVE trước (runbook STALE); backup→apply→verify-LIVE→commit; replicate mọi rule cũ + delta (S88)
- [Wipe durability — check re-seed](feedback_wipe_durability_check_reseed.md) — sau prod-wipe audit seeder: ungated per-code seed RE-ADD mỗi restart; gate sau env-flag + verify-by-restart-THẬT (S91, #75/#76)
- [Verify deployed artifact byte-level](feedback_verify_deployed_artifact_byte_level.md) — UAT "fix chưa ăn" sau deploy → curl-grep bundle prod byte-level (cache≠deploy); incognito=golden-test (S96, #77)
- [Agent return-garble recover](feedback_agent_return_garble_recover.md) — sub trả wrong-slice-of-transcript thay verdict (#53, **×66-cận-dưới qua S158 — derive-from-body, đếm-cái-chắc** [🔴 **S158 = ĐỐI-CHỨNG NỘI-PHIÊN SẠCH đầu tiên (cùng lead/ngày, khác đúng 1 biến): ép-ghi-đĩa KHÔNG giảm garble (2/2 vẫn garble) nhưng đưa thiệt-hại về 0 B** — 4 vai không-ép mất TOÀN BỘ phải resume, 2 vai có-ép mất 0; ⇒ chống #53 = thiết-kế ARTIFACT không phải PROMPT, xác nhận lần 5 · **+2 sub-class**: `skeleton-nấc-2` (1.661B byte>0 mà ruột toàn heading ⇒ guard "verify byte tăng" KHÔNG bắt được) · `engine-process-exit` (0 delta đĩa = lượt chạy chưa từng tồn tại) · **câu garble CHỨA finding thật, đừng vứt** (ring1/ring2 chết ngay chỗ nghĩ sắc nhất) · S153-S157 CHƯA đếm được — "~27" của lead-gap neo bằng SỐ DÒNG `_mind`, ring2 bác, KHÔNG nhập tally]; [qua-S148 33 · S149 ×5 · S150 ×7/7 · S151 ×5/6 write-boundary · **S152 ×10 (7 @open + 3-chắc @close, 2 UNKNOWN-sau-compact không đếm; ring2-STRICT + trio = 4 CLEAN cùng phiên; MỚI: pin-bản-cắt 4-A — file ghi-từng-finding LUÔN hợp-lệ giữa chừng, lead pin 16.911B/30.195B mất 3 FLAG → đề END+TOTAL-line chờ owner; commit-subject `1b85713` "53"=SAI errata)** — skeleton-rỗng 2-strike → AS-17; `ngược-#53` ×3 lifetime]; S143 ×5 5/5-sub; +path-4 lead-on-behalf; **+sub-class S150 `ngược-#53`/`skeleton-ruột-rỗng` ⇒ ghi-đĩa-trong-lúc-làm = CẦN KHÔNG ĐỦ — verify byte-content**) → recover: **(0) WRITE-lane→disk-truth (git+build+test) · VERIFY-lane→em-main-re-curl+sqlcmd (2-nguồn-khớp)** → (1) diary → (2) SendMessage-resume in-session → (3) em-main solo; garble ∝ reasoning-lane; **WRITE-lane garble≠mất-code** (S114 ×5); cicd tái-phạm dai + tự-dán "CLEAN-return" sai (harvest-curator bắt S118)
- [Agent return-garble recover](feedback_agent_return_garble_recover.md) — sub trả wrong-slice-of-transcript thay verdict (#53, **×72-cận-dưới qua S162 [S159-S161 chưa-đếm-được; S163+ sự-kiện ghi, chốt @closeout L9 — ≥2: lead-gap ×2, lần 1 = skeleton-nấc-2 instance #2 1.302B] — derive-from-body, đếm-cái-chắc** [🔴 **S158 = ĐỐI-CHỨNG NỘI-PHIÊN SẠCH đầu tiên (cùng lead/ngày, khác đúng 1 biến): ép-ghi-đĩa KHÔNG giảm garble (2/2 vẫn garble) nhưng đưa thiệt-hại về 0 B** — 4 vai không-ép mất TOÀN BỘ phải resume, 2 vai có-ép mất 0; ⇒ chống #53 = thiết-kế ARTIFACT không phải PROMPT, xác nhận lần 5 · **+2 sub-class**: `skeleton-nấc-2` (1.661B byte>0 mà ruột toàn heading ⇒ guard "verify byte tăng" KHÔNG bắt được) · `engine-process-exit` (0 delta đĩa = lượt chạy chưa từng tồn tại) · **câu garble CHỨA finding thật, đừng vứt** (ring1/ring2 chết ngay chỗ nghĩ sắc nhất) · S153-S157 CHƯA đếm được — "~27" của lead-gap neo bằng SỐ DÒNG `_mind`, ring2 bác, KHÔNG nhập tally]; [qua-S148 33 · S149 ×5 · S150 ×7/7 · S151 ×5/6 write-boundary · **S152 ×10 (7 @open + 3-chắc @close, 2 UNKNOWN-sau-compact không đếm; ring2-STRICT + trio = 4 CLEAN cùng phiên; MỚI: pin-bản-cắt 4-A — file ghi-từng-finding LUÔN hợp-lệ giữa chừng, lead pin 16.911B/30.195B mất 3 FLAG → đề END+TOTAL-line chờ owner; commit-subject `1b85713` "53"=SAI errata)** — skeleton-rỗng 2-strike → AS-17; `ngược-#53` ×3 lifetime]; S143 ×5 5/5-sub; +path-4 lead-on-behalf; **+sub-class S150 `ngược-#53`/`skeleton-ruột-rỗng` ⇒ ghi-đĩa-trong-lúc-làm = CẦN KHÔNG ĐỦ — verify byte-content**) → recover: **(0) WRITE-lane→disk-truth (git+build+test) · VERIFY-lane→em-main-re-curl+sqlcmd (2-nguồn-khớp)** → (1) diary → (2) SendMessage-resume in-session → (3) em-main solo; garble ∝ reasoning-lane; **WRITE-lane garble≠mất-code** (S114 ×5); cicd tái-phạm dai + tự-dán "CLEAN-return" sai (harvest-curator bắt S118)
- [H18 ghost-wire + stamp-integrity](feedback_h18_ghostwire_stamp_integrity.md) — hash-verify TRƯỚC khi áp broadcast (bắt stamp-then-edit THẬT → HELD + re-stamp); ghost-wire 2 class (cron-claim CronList=0 · config-key defined-but-unread); KHÔNG stamp run-id chưa chạy (S100)
- [Resume premise re-verify](feedback_resume_premise_reverify.md) — re-verify tiền-đề từ ĐĨA trước execute (header+git-date, match NỘI-DUNG KHÔNG tên-file 1:1); **S121: bảng-kế-hoạch ≠ đĩa — "không-ai-được-giao" ≠ "chưa-làm"; khẳng-định trạng-thái-đĩa = phải chạm đĩa 1 lệnh**; +bẫy `grep -c` (dòng) vs `-o|wc -l` (occurrence) trên mega-line; +bẫy Get-Content-no-Encoding no-BOM = ANSI đếm ×2-3 → báo-số-sai-owner, đính-chính-ngay (S130 E-010/AS-14); +acceptance literal tự-lão-hoá (S109/S121)
- [Permission grant = 2 layers](feedback_permission_grant_two_layers.md) — cấp/verify quyền = display-layer (menu CanRead) ⟂ API-authz-layer (controller `[Authorize(Policy)]`) 2 tầng ĐỘC-LẬP; grep authz controller đích TRƯỚC khi tin grant (menu-ẩn ≠ API-đóng; `[Authorize]` trần = lỗ hổng); reviewer-adversarial bắt, em-main-solo sót (S118, #82)
@ -44,7 +44,11 @@
- [Claim mạnh hơn việc đã làm](feedback_claim_stronger_than_work.md) — "đã ghi/đã archive/đã VERDICT" = CLAIM ĐO ĐƯỢC, đo trước khi viết; 0-hit phải kèm control-dương (S162 ×3 ca/1 phiên)
- [Edit phải có trước review](feedback_edit_must_predate_review.md) — edit-cần-review (nhất là file vai reviewer) LAND TRƯỚC lượt L3 (no-self-exempt cần vật tồn-tại trong diff); spec tự-mâu-thuẫn → fix-mới thắng footer-cũ + khai trong report (anh ratify S139)
- [Máy rộng, UI hẹp](feedback_may_rong_ui_hep.md) — nguyên tắc owner S164 ×2 quyết định: schema/BE theo ca TỔNG QUÁT (N/gộp), UI default ca HẸP (1-1), user cần thì bung — 0 đổi máy; rào cứng 409 → rào hiển thị
- [Pause phải nhớ kỹ plan-progress](feedback_pause_track_plan_progress.md) — owner S165: /pause giữa chuỗi wave = WAL/run.md liệt TỪNG đầu việc đã-review (wave + vá-số + finding treo), rà từng dòng OG trước khi tuyên xong (ca thật: gap checkbox OG-3 → gate F-1 MAJOR)
## Project — ongoing decisions / context
- [SOL-CCM-SP-002 signing matrix](project_sol_ccm_sp002_signing_matrix.md) — spec ký HĐ (nắm-ý S164, anh dạy 4 nhịp): bảng = danh mục **LOẠI HĐ SOLUTION**, nén **8 pattern ký**; trình ký số hóa **TƯƠNG TỰ duyệt NCC** (workflow V2 trạm, role→user như note 54); ký nháy = **mực trên BẢN CỨNG** (GĐ4 in khối ký); GĐ2 = duyệt HẠNG MỤC (PE cha) → GĐ3 = ĐIỀU KHOẢN → GĐ4 bản cứng; 🔴 3 trục hạng-mục ⟂ loại-HĐ-SP002 ⟂ khuôn-form (chữ "loại HĐ" 2 nghĩa — đặt tên field tách bạch); treo: cardinality N-hạng-mục→1-HĐ
- [H22 WAL session-continuity](project_h22_wal_session_continuity.md) — sổ WAL ≤40 + Stop-hook persist VERIFIED-RUNTIME S111 (hot-reload ENV-DEP #2/#3) + /pause·/tiep 1-đường + squash wal: + FLIP run-trace ≥3-task + D10 AS-6-taxonomy-đổi; hook PS1 KHÔNG bash (PATH 3-context); pilot kill/đổi-acc pending
- [Model-tier evolution → worker-tier-pin S124](project_harness4_two_tier_model.md) — H4 two-tier → H8 all-inherit → **S124 worker-tier-pin (14/14 sub = opus+effort:max, lead owner-choice, Fable qua /fable-real)**; restart-lesson: EDIT-agent-tồn-tại/command cần restart (hot-reload ENV-DEP, agent-MỚI khác)
- [H23 spawn-precedence — ĐO S126](project_h23_spawn_precedence.md) — spawn-param tier THẮNG frontmatter hard-pin ⇒ /fable-real SỐNG · worker-pin ăn runtime (no-tier=opus DÙ lead=Fable ⇒ không inherit); đo 2026-07-16 spawn-model-audit 0-mismatch

View File

@ -5,7 +5,7 @@ metadata:
node_type: memory
type: feedback
originSessionId: 67157d21-1ead-475d-9a50-cf7f07468583
modified: 2026-07-28T13:36:55.402Z
modified: 2026-07-31T02:46:15.525Z
---
Sub-agent đôi khi trả về message CUỐI = text bước memory-curation của nó ("Still 18KB, let me trim...", "Memory updated, splice correct...") THAY VÌ verdict/findings của task (#53 return-channel garble). Nhưng WORK + agent-memory diary VẪN ĐÚNG (nó làm task xong, ghi diary chuẩn, chỉ return nhầm text bước cuối). **Recover: đọc `agent-memory/<role>/MEMORY.md` recent-entry lấy verdict thật — KHÔNG re-spawn** (tốn + có thể garble tiếp; hoặc em-main re-do solo cho task cần chắc). Instruction-fix spawn-prompt "🔴 message CUỐI PHẢI là verdict, KHÔNG phải memory-note" GIẢM garble nhưng KHÔNG 100%.
@ -28,6 +28,12 @@ Sub-agent đôi khi trả về message CUỐI = text bước memory-curation c
🔴 **@S158 closeout (2026-07-28) — SỔ NÀY ĐÃ ĐỨNG YÊN 5 NHÃN PHIÊN (S153→S158), `lead-gap-auditor` bắt (`gap-incident-unrecorded`, FLAG-3 MED-HIGH).** Chính class mà sổ này đẻ ra @S143 lại cắn chủ. mtime file = 2026-07-26 01:50; `grep -o "S15[3-8]"` = 0/0/0/0/0/0. Ghi bù theo đúng luật của file: **derive-from-body, đếm CÁI-CHẮC, không bịa.**
- **S158 = +6 CHẮC** (lead đếm trực tiếp, cùng phiên): `tooling-auditor` · `harvest-curator` · `lead-stale-auditor` · `lead-gap-auditor` · `ring1-audit` · `ring2-audit`**6/6 first-return**, 100% reasoning-lane (khớp correlation S103). Resume 6/6 ra kết quả đầy đủ. ⇒ **TỔNG = 66 (cận dưới) qua S158.**
🔴 **@S164 thu-về (2026-07-31) — sổ lại đứng yên QUA TRỌN L8 (S159→S162), lần 2 cùng bệnh:** vế "số ×66 đã cũ" là 1 trong **4 hàng-nhường rơi khe H24 @S163** (lead-gap nhường `view-*` → lead-stale không nhặt vì xong TRƯỚC 13'; ring2 §5 chứng 4/4 nhường / 0/4 nhặt — khuyết-tật cấu-trúc thiếu bước hợp-lưu, KHÔNG lỗi vai). Ghi bù đúng luật sổ — derive-from-body, đếm CÁI-CHẮC:
- **S162 = +6 CHẮC** (STATUS ④ closeout L8, lead đếm cùng phiên): **6/6 sub #53, resume-từ-đĩa 6/6, mất 0 B** — xác nhận lần 5 "chống-#53 = thiết-kế ARTIFACT". ⇒ **TỔNG = 72 (cận dưới) qua S162.**
- **S159·S160·S161 = CHƯA ĐẾM ĐƯỢC, không bịa** (cùng khuôn S153-S157): closeout các phiên đó không để lại dòng đếm khôi-phục được trong sổ nào lead chạm @S164.
- **S163-S164 (L9 ĐANG MỞ) = GHI SỰ-KIỆN, TALLY CHỐT @CLOSEOUT** (đúng bài học (c) — nâng số giữa phiên là tự đẻ số sai): đã biết **≥2**: `lead-gap-auditor` chết #53 **×2** @S163 bookend-open, lần 1 để lại `sub-lead-gap-open-S163.md` **1.302 B ruột-toàn-heading** = **instance #2 sub-class `skeleton-nấc-2`** (sau 1.661B S158 — byte>0 nên guard "verify byte tăng" mù, phải đọc RUỘT; AS-17 2-strike-watch tiếp).
- **S153-S157 = CHƯA ĐẾM ĐƯỢC, khai thẳng thay vì bịa.** `lead-gap` dẫn `_mind-s-7.md:199` ×11 + `:181` ×13 ⇒ "~27 cho L7", **nhưng `ring2-audit` bác cách đếm**: nó neo bằng **SỐ DÒNG `_mind`** — đúng thứ mà FLAG-2 của chính lead-gap vừa cấm trong cùng return. ⇒ số đó **không tái-dựng được** bằng đường khác ⇒ **KHÔNG nhập tally**. Muốn đóng: derive từ `runs/*/` + session-log S153-S157, không từ số dòng.
🔴 **COUNTER-DATUM MẠNH NHẤT TỪ TRƯỚC TỚI NAY (S158) — 5 ca cùng phiên, cùng ngày, cùng lead, khác đúng MỘT biến:**

View File

@ -0,0 +1,19 @@
---
name: may-rong-ui-hep
description: "Nguyên tắc owner @S164: 'máy rộng, UI hẹp' — schema/BE thiết kế cho ca tổng quát (N), giao diện mặc định ca đơn giản (1-1), user cần thì bung — 0 đổi máy"
metadata:
node_type: memory
type: feedback
originSessionId: f7c1c007-6a03-4bf4-b46b-f6dbe9139702
modified: 2026-07-31T05:17:44.243Z
---
Owner chốt cùng 1 nguyên tắc ở 2 quyết định liên tiếp @S164 (chuỗi 4-GĐ SP-002):
- OG-1 gộp HĐ: *"thiết kế gộp nhưng giao diện thì cho 1-1 (Khi user đổi ý thì mình làm luôn)"*
- OG-7 N-phiếu/PE: *"PE cho nhiều, nhưng giống cái trên làm trước nhưng rào hiển thị 1-1 lại -> User cần thì bung ra"*
**Why:** đổi schema/migration sau khi ship = đắt + rủi ro (cardinality-change class S87/S88); đổi UI default = rẻ. Owner muốn trả giá schema MỘT LẦN cho ca tổng quát, nhưng không bắt user ăn complexity khi 90% ca là đơn giản.
**How to apply:** khi thiết kế field/quan hệ có 2 mức cardinality (1-1 vs 1-N, đơn vs gộp): (a) schema + BE + validator theo mức RỘNG (N); (b) UI/flow mặc định theo mức HẸP (1) — nút phụ/flag "bung" thay vì bắt chọn; (c) code viết 1 đường chung (hàm nhận list, UI truyền 1 phần tử); (d) rào chặn cứng (409) đổi thành rào hiển thị. Đề xuất lên owner: đưa default HẸP, khai máy đã RỘNG sẵn.
Liên quan: [[sol-ccm-sp002-signing-matrix]] · [[cardinality-change-grep-consumers]]

View File

@ -0,0 +1,15 @@
---
name: pause-track-plan-progress
description: "Lời dặn owner @S165 — khi /pause phải NHỚ KỸ plan đang chạy tới đâu, từng đầu việc đã-review; bắt được lỗi giữa chừng là điểm cộng"
metadata:
node_type: memory
type: feedback
originSessionId: 95541fdb-83ef-45f2-b778-8e1c44510af3
modified: 2026-07-31T11:23:37.814Z
---
Owner @S165 (2026-07-31, giữa chuỗi K-wave SP-002): *"Chú ý kỹ các đầu việc trong plan đã đc review kỹ trong turn này"* → clarify: *"ý tao là plan các thứ đang chạy tới đâu nhớ kỹ, bắt đc lỗi thì tốt. Xong rồi thì pause đi."*
**Why:** plan đã qua review (spec đóng băng + checklist wave + finding gate + quan sát lane) là TÀI SẢN — pause mà ghi sổ lỏng thì lần /tiep sau tự chế lại việc, rơi đúng những đầu việc đã trả giá để tìm ra (ca thật cùng phiên: gap checkbox-opt-out chỉ lộ khi rà lại từng dòng OG-3 theo lời dặn này; sau đó gate K3 F-1 xác nhận đúng nó là MAJOR).
**How to apply:** (1) Khi /pause giữa chuỗi wave: WAL + run.md taskList phải liệt TỪNG wave còn lại đúng tên/vá-số theo spec đã review, kèm mọi món treo sinh ra trong run (finding khai-lệch, quan sát O-*, khoảng-hở UX đã khai) — không gộp thành "làm nốt phần còn lại". (2) Rà từng dòng OG/quyết-định owner xem có đầu việc ngầm nào chưa land trước khi tuyên wave xong. (3) [[agent-return-garble-recover]] liên quan: artifact là nguồn đầu việc, không phải return.

View File

@ -0,0 +1,67 @@
---
name: sol-ccm-sp002-signing-matrix
description: "Spec SOL-CCM-SP-002.v01 (nắm-ý @S164, anh dạy 4 nhịp) — bảng = danh mục LOẠI HĐ SOLUTION, 8 pattern ký; trình ký số hóa TƯƠNG TỰ duyệt NCC (workflow trạm); ký nháy = mực trên BẢN CỨNG; GĐ2 duyệt hạng mục · GĐ3 điều khoản · GĐ4 bản cứng"
metadata:
node_type: memory
type: project
originSessionId: f7c1c007-6a03-4bf4-b46b-f6dbe9139702
modified: 2026-07-31T03:58:08.893Z
---
**SOL-CCM-SP-002.v01** (ban hành 2026-03-02, 15 trang; file gốc ở `D:\Dropbox\CONG_VIEC\SOLUTION\QUY_TRINH\`) — "Quy trình trình ký HĐ Thầu phụ/NCC/Tổ đội". Anh gửi ảnh trang 5-9 @S164 (2026-07-31), dặn **nắm Ý, KHÔNG cần chi tiết** — nạp context TRƯỚC khi giao việc. Anh dạy **4 nhịp chỉnh liên tiếp** — model dưới = bản GỘP CHỐT.
## Model chốt (4 GĐ — mỗi GĐ 1 câu hỏi)
- **GĐ1 Duyệt NCC (PE) = CHA** — *mua của ai* (gói thầu bự + NCC thắng).
- **GĐ2 KHKK = DUYỆT HẠNG MỤC** — *mua gì, ai ký, bao nhiêu* (lời anh: *"ý tao đang nói là GĐ 2 thôi"*): bổ PE cha → N hạng-mục con; mỗi hạng mục gắn 1 dòng **danh mục SP-002** ⇒ suy ra người ký + pattern nháy. 🔸 KHKK (Mig 69) có sẵn `ContractSigningPlanLines` — khả năng "line = hạng mục" gần đúng, SOI trước khi đập dựng.
- Hạng mục duyệt xong → **"đưa vào loại hợp đồng gì"** (chọn khuôn form) → **GĐ3 Duyệt Hợp đồng = bàn ĐIỀU KHOẢN** (*"GĐ3 ko bàn công việc hạng mục nữa"*; nền = Contract 9-phase + Forms/Clause + form-engine) — *ràng buộc thế nào*.
- **GĐ4 bản cứng** (1-mốc đã chốt) — *giấy trắng mực đen*: in khối ký đúng pattern, ký nháy MỰC + ký chính, upload.
## Trình ký = TƯƠNG TỰ QUY TRÌNH DUYỆT NCC (nhịp 6 — chốt kiến trúc)
Chuỗi Ô1→Ô4 (ký nháy) → người ký chính **số hóa thành workflow trạm-by-trạm trong app Y NHƯ PE** (từng người bấm duyệt lần lượt), KHÔNG phải chỉ render. Bản chất vật lý các ô = **ký nháy mực trên BẢN CỨNG** (nhịp 5) — app chạy luồng số, GĐ4 in khối ký + nghi thức mực. ⇒ Tái dùng nền **workflow V2** (Quy trình > Bước > Cấp, OR-of-N, Designer, `ApplicableType` — PE/Contract/KHKK cùng nền); vai trò (TBP.CCM, QS…) map user thật kiểu note (54) *"danh sách cũ trong duyệt NCC"*.
**Bảng SP-002 = danh mục các LOẠI HĐ của SOLUTION** (nhịp 5 — 79 dòng nhóm theo phòng chủ trì), nén còn **8 PATTERN KÝ duy nhất** (⇒ ~8 workflow template, không phải 79):
| Pattern | Chuỗi nháy Ô1→Ô4 | Ký chính (NĐUQ) |
|---|---|---|
| A1 thiết-bị/máy-móc/vật-tư-phụ ×5 | TBP.CCM→NV.CCM→TBP.EQU→NV.EQU | TP.CCM |
| A2 hạ-tầng/phá-dỡ ×1 + A3 DV thi-công ×9 | TBP.CCM→PD/PM→SM→QS | TP.CCM |
| A4 văn-phòng ×5 | TBP.CCM→TPB/TBP→TBP/NV.PB→N/A | TP.CCM |
| B1 vật-tư ×23 | TBP.PRO→NV.PRO→N/A→N/A | TP.PRO |
| B2 thầu-phụ-XD ×13 | TP.CCM→TBP.PRO→PD/PM/SM→QS | TP.PRO |
| B3 thầu-phụ-MEP ×15 | TP.CCM→TBP.PRO→PD/PM/SM→MEP SM | TP.PRO |
| C1-C3 BCH ×13 (nhân-công/hoàn-thiện/khác) | TP.CCM→SM→QS | PD/PM |
| CEO — mọi HĐ CHƯA ủy quyền | TP.CCM→TP.PRO→N/A→N/A | CEO |
**Quy tắc:** signer = trưởng phòng SỞ HỮU danh mục theo ngưỡng UQ, CEO = fallback · chuỗi nháy biến thiên theo bản chất (+site khi thi công · +EQU thiết bị · +MEP SM · QS chốt đuôi · N/A = trống hợp lệ 2-4 ô) · **TP.CCM nháy Ô1 mọi thầu phụ kể cả B do PRO ký** · phụ lục 3.5 bảng giá trị (KL/đơn-giá/thành-tiền + VAT 10%).
## 3 trục — ĐỪNG trộn (nhịp 1+2+5)
**hạng-mục công-việc** (instance GĐ2, con của PE) ⟂ **loại-HĐ SOLUTION** (dòng danh mục SP-002 — quyết ai ký + pattern nháy) ⟂ **khuôn form** (5 form `FORM\SOL-CCM-FO-002`: .02 trọn-gói NC+VT · .03 trọn-gói NC+TB · .05 giao-khoán · .06 mua-bán · .07 đặt-hàng; .01/.04 phụ trợ). 1 hạng mục có thể ra trọn-gói/tổ-đội/nguyên-tắc (lời anh nhịp 2). ⚠️ **Từ "loại HĐ" trong lời anh mang 2 nghĩa** (nhịp 2 = khuôn form · nhịp 5 = danh mục SP-002) — khi design phải đặt tên field tách bạch, đừng dùng chữ "loại" trần.
## UI mapping (hình prod eoffice @S164 — anh xác nhận "Đúng chính xác rồi đó")
Sidebar fe-user 4 root = 4 GĐ, mỗi root fan-out theo "loại" của GĐ: **DUYỆT NCC** (1 mục `1. NCC-TP` + 6 leaf) · **KẾ HOẠCH KÝ KẾT HĐ** (hiện 1 mục NCC-TP — 🔴 **VIỆC ANH KHOANH: fan-out ra danh mục SP-002 A1, A2, … kèm CHÚ THÍCH NGẮN**, mirror pattern GĐ3/GĐ4) · **DUYỆT HỢP ĐỒNG** (đã fan-out **7 loại HĐ**: 01 Thầu phụ · 02 Giao khoán · 03 Nhà cung cấp · 04 Dịch vụ · 05 Mua bán · 06 Nguyên tắc NCC · 07 Nguyên tắc DV = bộ 7 ContractType) · **HỢP ĐỒNG CỨNG** (7 loại "- Bảng cứng" tương ứng). Cây per-gói-thầu panel giữa giữ nguyên (BVN01 → gói → 4 folder GĐ; gói `14 Mat PVC` minh họa: PE/2026/A/049 ở GĐ1, 3 GĐ sau "SẮP"). ✅ Giải treo "HĐ nguyên tắc": là ContractType 06/07 trong hệ thống (khuôn file .docx có 5, LOẠI hệ thống có 7).
## Admin mapping (hình 2 @S164 — admin/system/approval-workflows-v2/DuyetNcc)
Anh khoanh: **(a) ẨN toàn khối menu Admin cũ** (Tổng quan → HỆ THỐNG/Quy trình HĐ), *"chỉ còn cái Quy trình duyệt (Mới) thôi"* — Admin thu về vai NƠI-CONFIG-QUY-TRÌNH, nghiệp vụ ở eOffice (⚠️ hỏi (1): có ẩn cả HỆ THỐNG Người-dùng/Vai-trò/Phân-quyền/Menu-eOffice? — ẩn = mất UI quản trị). **(b) "Thêm các chỗ duyệt đó trong mục duyệt NCC mới giống Duyệt NCC"** = nhân bản khuôn designer V2 (Bước—Phòng—Cấp, versioned + archived history) cho các luồng mới (KHKK hạng mục 8-pattern + GĐ sau — hỏi (2) danh sách chính xác). Nhóm "Quy trình duyệt (Mới)" hiện có 2 entry: Duyệt NCC (Mới) + Duyệt NCC và Giải pháp (Mới).
🔑 **"Danh sách cũ" note (54) = ĐỘI HÌNH THẬT trong `QT-DN-V2-001`** (đọc từ hình, v03/v02 archived): **B1 PRO** C1 = Nguyễn Thị Bích Phượng · Nguyễn Văn Duy · Châu Tạ Kim Long · Binh Le Thanh, C2 = Bùi Lê Thủy Trà · **B2 CCM (Phòng Kiểm soát Chi phí)** C1 = Hồ Thị Nữ Nguyên · Trần Xuân Lưu · Lê Trần Đăng Trưởng / Lê Văn Binh, C2 = Phan Văn Chương · **B3 Ban Giám đốc** = Nguyễn Văn Trường (CEO-trạm). Map vai SP-002 → user thật lấy từ đây, KHÔNG cần anh chọn tay; verify bản LIVE (không phải archived) trước khi wire.
## SCOPE CHỐT (@S164 — anh trả 2 câu + hình 3 cây toàn trình)
**(1) Admin:** ẩn mục nghiệp vụ cũ + 2 mục quy trình cũ, **CHỪA khối HỆ THỐNG** (anh: *"chừa lại User cũng đc"* — Người dùng/Vai trò/Phân quyền/Menu eOffice) + "Quy trình duyệt (Mới)". **(2) Fan-out THEO NHÓM DUYỆT** (anh: *"cùng 1 nhóm duyệt"*) = **8 nhóm** nén từ SP-002: A1 · A2-A3 · A4 · B1 · B2 · B3 · C(C1-C3) · CEO — mỗi nhóm 1 workflow designer trong (Mới), khuôn y Duyệt NCC. **(3) Sidebar ↔ CÂY TOÀN TRÌNH GIỐNG NHAU** (anh: *"chú ý giao diện slider bar, nên giống nhau"*; hình 3 khoanh 3 dòng "Chưa có dữ liệu" → *"Thêm các sub folder con ở đây"*): sidebar KHKK fan-out 8 nhóm ⟺ cây per-gói folder "Kế hoạch Hợp đồng" mở 8 sub-folder ĐÚNG BỘ ĐÓ; GĐ3/GĐ4 cây mở sub-folder theo **7 loại HĐ** khớp sidebar 7 mục sẵn có. Một bộ nhóm — hai mặt hiển thị. Header GĐ2 prod: *"Chốt giá per-NCC trúng thầu + căn cứ hồ sơ trước khi ký hợp đồng"*; cây 38 gói / 11 dự án (BVN01 12, CAL01 3, FLOCK01-04, RMIT01, SOVI01, VLU04.1, VRR01, ZOTE01 11).
## 🔴 RÀNG BUỘC KHUÔN (anh dặn @S164, hình A/B đối chiếu GĐ1-vs-GĐ2): "GIỐNG NHAU, CHỈ KHÁC FORM, ĐỪNG CHẾ THÊM"
**MỘT khung duy nhất = khung Duyệt NCC**, nhân cho mọi GĐ: (a) sidebar = mục con + 6 leaf (Luồng duyệt/Danh sách/Thao tác/Đang duyệt/Đã duyệt/Đã xóa); (b) cây toàn trình = gói → folder GĐ → sub-folder nhóm → card phiếu (badge trạng thái + mã + ngày + người tạo — như card PE/2026/A/044); (c) layout trang = cây trái · danh sách giữa · panel chi tiết phải. **Thứ KHÁC duy nhất giữa các GĐ = FORM phiếu** (ruột panel phải: PE = ngân sách/NCC tham gia · KHKK = mã kế hoạch/chốt giá per-NCC/hồ sơ · duyệt HĐ = điều khoản…). CẤM chế layout/khái niệm UI mới — *"lấy 1 khung sliderbar của duyệt NCC thôi"*. = luật cookie-cutter mirror (đã dùng PE→Contract→KHKK ở BE) nay CHỐT cho tầng UI: **nhân khung, đổi form**.
## Treo — hỏi khi design thật (đừng hỏi dồn bây giờ)
Cardinality gộp: N hạng-mục-đã-duyệt → 1 HĐ hay 1-1? (hỏi 2 lần chưa trả lời — bảng 3.5 nhiều dòng gợi ý gộp được) · "HĐ nguyên tắc" chưa thấy file trong FORM · B2 đánh số trùng 2 dòng "7" · A4 ô "TPB/TBP" dấu / = hoặc? · NĐUQ ngưỡng tiền ở trang chưa gửi · GĐ2 line hiện tại khớp tới đâu (`ContractSigningPlanLines`). Khi build: extract chi tiết từ file gốc QUY_TRINH qua `office-document`, KHÔNG dựng từ memory này.
**Vai trò:** site = PD·PM·SM·MEP-SM·QS (BCH, không phải phòng ban) · văn-phòng generic = TPB/TBP + NV.PB · thiết-bị = TBP.EQU/NV.EQU · CCM = TP>TBP>NV · PRO = TP>TBP>NV.
Liên quan: [[h22-wal-session-continuity]] · note (54) HANDOFF: người duyệt = danh sách cũ Duyệt NCC.

View File

@ -120,6 +120,7 @@ Em main PHẢI echo **TOÀN BỘ nội dung command body này** (đầy đủ Ph
1. **M5 sentinel:** sau commit closeout → `powershell.exe -ExecutionPolicy Bypass -File scripts/closeout-sentinel.ps1 -Commit <sha-closeout> -AuditRan` — FLAG "audit đo rồi như chưa đo" nếu closeout thiếu delta role-dir/counter (positive-control 5/5 lịch sử @S149).
2. **M7 eval-USE-side (đóng DEFER C14-2.4):** `powershell.exe -ExecutionPolicy Bypass -File scripts/applied-eval-nokey.ps1 -Selftest` → selftest 3/3 rồi đọc output nhãn `{APPLIED · DORMANT(≠MISS) · chờ-judge}`; **caveat "% = FLOOR không ceiling" nằm TRONG payload** — chép nguyên, cấm rút gọn. Ghost-wire 18-ngày (0 call-site) chết tại dòng này.
3. **M9 diary-seed on-behalf (GAP-3 ×4):** vai INFORM-only nào CHẠY trong phiên (có sub-MD/return VERIFY được) ⇒ lead **APPEND diary vai đó TRONG CÙNG closeout** (B3; tiền lệ retro-harvest S132 + seed ring2-audit S149). Detector C11(b) soi sót.
3-bis. **C2 checklist artifact-vs-entry (wire @S164 — quyết-định lead @S163 PAUSE-1; nguồn = H2 P5 + chuỗi seed-rớt ~1 vai/lượt S153·S158·S162):** M9 tồn tại từ S149 mà vẫn rớt 3 lần vì chạy bằng TRÍ-NHỚ — thay bằng PHÉP ĐẾM 2 cột TRƯỚC commit chốt: **cột-A** = tập VAI có artifact phiên này (`ls runs/<run-của-phiên>/sub-*.md` → rút tên vai) · **cột-B** = tập vai có entry mới trong `agent-memory/<vai>/MEMORY.md` (grep nhãn `## S<nn>` phiên này). 🔴 **AB ≠ ∅ ⇒ seed on-behalf NGAY (quay lại M9), CẤM commit closeout khi hiệu còn phần-tử.** H2 3-phân-loại-lại: 11/23 vai bị luật CẤM tự-ghi ⇒ lead-seed là ĐÚNG thiết kế, bệnh ở bước seed thiếu phép đếm ép — KHÔNG sửa bằng "bắt vai tự ghi". 🔸 *Vế "luật END-line" của H2-P5 CỐ Ý KHÔNG wire ở đây — đó là slot **(44)** chờ anh (chưa từng được hỏi, xem HANDOFF).*
- **(ii-bis) 🔬 ring2-audit AUTO sau cặp H24 (vai-KIỂM vòng soi-lead, C4/C4b vai #2/3, land S145):** cặp H24 (`lead-stale-auditor` + `lead-gap-auditor`) CHẠY xong ⇒ spawn `ring2-audit` NGAY — **AUTO, KHÔNG consent** (owner S145; 🧊 *vế tương-phản cũ "KHÁC (ii) consent-gate của chính H24" ĐÃ SỤP @S146 — (ii) nay cũng AUTO, xem `:106`*). Đọc FLAG-list + class 2 vai → verdict per-FLAG + tự tái-dựng ≥1 số (flag-count / `class_repeat`) + **thách-CLEAN** (H24 báo ít/0 FLAG ⇒ tự soi 1 surface tìm FLAG sót). 🔴 no-self-exempt ≠ lead-stale/lead-gap (m-3). 🔴 Fail-safe: H24 KHÔNG chạy phiên này (**chỉ còn: chưa tới nhịp** — nhánh "không consent" chết @S146) ⇒ ring2-audit **NO-OP im-lặng**. Tuần-tự C4b (SAU cặp H24, mtime chứng). Propose-only → em main VERIFY→APPEND (git-diff backstop). Contract canonical `.claude/agents/ring2-audit.md` (B1).
- **(iii) Flag → class:** mỗi FLAG của 2 vai **PHẢI** thuộc **enum ĐÓNG** `lead_self_audit.flag_classes`. Vai **KHÔNG tự chế class** — finding không phân-loại được ⇒ báo **verbatim** + **escalate anh** để mở rộng enum. Cập-nhật `class_repeat.counts`; class nào lặp **≥ `jump_on_class_repeat`** ⇒ **kéo audit tới sớm**.
- **(iv) 🔴 Nghi-thức RE-STAMP carry (GAP THẬT, vá @S122):** khi ghi segment `HANDOFF` mới, **ĐÓNG DẤU LẠI `[carry:<slug>]` cho MỌI carry còn mở** — không chỉ lần đầu.

View File

@ -282,7 +282,7 @@ ngược lại → counter += 1 ; last_ticked_session = S<nn> ; last_ticked_head
- **(c) Lead scribe NGAY (single-writer):** return từng con lead ghi `.claude/workflows/runs/<run-id>/harness-{eval,refine,audit}-return.md` **ngay khi con đó trả**, **KHÔNG đợi đủ 3**. Lý-do: 3 vai **không có Write/Edit** (chặn-bằng-thiếu-tool) nên tự-ghi-đĩa bất-khả; phiên chết giữa chừng mất return (bài-học vòng-1 S141).
- **(d) PIN đích-danh (fail-closed):** `harness-refine` nhận **path** `…/harness-eval-return.md`; `harness-audit` nhận **path run-folder** đang chấm. 🔴 Pin **missing/rỗng ⇒ vai TỪ-CHỐI / TRƯỢT** **CẤM** để vai tự đi tìm "run mới nhất" (vớ bản **ĐẠT-ảo**).
- **(e) Đóng-băng bề-mặt-đo:** cửa-sổ chạy bộ-ba nằm TRONG **Mirror C1** 2.1.2) KHÔNG ghi bề-mặt-đo giữa chừng; việc ghi phát sinh xếp hàng SAU verdict.
- **(f) Post-wave assertion:** chạy xong 3 con `git status --short` **kỳ vọng 0 tracked-change ngoài run-folder**. thay-đổi lạ vai đã ghi (residual-write) **báo anh + revert**. (G-015: propose-only **KHÔNG** code-enforced kênh Bash git-diff backstop THẬT.)
- **(f) Post-wave assertion:** chạy xong 3 con `git status --short` **kỳ vọng 0 tracked-change ngoài run-folder**. thay-đổi lạ vai đã ghi (residual-write) **báo anh + revert**. (G-015: propose-only **KHÔNG** code-enforced kênh Bash git-diff backstop THẬT.) 🔴 **TIMING quyết định răng (vá @S164 — harness-audit ESCALATE, xảy ra thật commit `7f55b4f`):** phép soát này PHẢI chạy **TRONG CÙNG TURN** với wave Stop-hook `wal-flush.ps1` fire **turn-boundary** auto-commit 4 path (trong đó `agent-memory/`) soát turn SAU = soát sổ **đã bị hook nuốt thành `wal:` commit**, backstop rỗng-hoá. Nếu lỡ boundary: soát bằng `git log --name-only` trên các `wal:` commit vừa sinh thay `git status`.
- **(g) KHAI ranh 2 cánh-tay (chống đọc nhầm thành "đo 2 lần"):** **script-arm** = §2.1.22.1.62.1.7 (các script deterministic **in SỐ**) **sub-arm** = bộ-ba (**ĐỌC** output script-arm rồi ĐO-lại/ĐỀ-XUẤT/CHẤM). Bộ-ba **KHÔNG thay** script-arm **KHÔNG re-implement máy đo**.
- **(h) Đơn-vị nhịp:** "**phiên-LOGIC**" của hub map **TẠM** = nhãn-phiên `S<nn>` của SE (SE chưa adopt session-logic cùng caveat đơn-vị với counter §2.1.8). 🔴 **KHÔNG thêm cadence-key** vào `memory-budget.json` **KHÔNG tick** counter cho bộ-ba (nhịp bộ-ba nhịp H24 trộn 2 đồng-hồ = hỏng cả hai).
- **(i) [M4] Vết 2 lớp chuỗi skip PHẢI nhìn thấy được (giữ NGUYÊN sau khi bỏ consent @S151 auto không nghĩa được im):**

View File

@ -11,10 +11,10 @@
},
"_tick_invariant_note": "Tick invariant (hub dede7ec5 Delta-1, verbatim): moi LAN-CHOT +1; mot cap dung-noi tang DUNG +1, khong +2, khong +0. SE form = tick-at-entry-gate idempotent-per-label (hub Delta-2 recovery-gate +1 = permitted form) - NET +1/session-label EQUIV hub +1/cap on CLOSED pairs; an OPEN pair is transiently +0 until its entry gate fires (hub blessed, 9a35405b block-1 phep dung-noi). Guard song-con = label-convention (session-start 2.1.8: new conversation = new S\u003cnn\u003e label, NEVER reuse). history[] is append-unbounded BY DESIGN =\u003e absence of a marker = never-happened (safe semantics); IF a FIFO cap is ever added, eviction MUST be handled explicitly (absence-vi-bi-day != absence-vi-chua-xay-ra - log-BOUNDED design-note dede7ec5).",
"_seed_honesty": "Seeded UNTICKED on purpose. counter=0 and last_ticked_* = null mean \u0027no tick has ever happened\u0027, which is the truth at S121 - the ritual that performs the tick lands in W3. Seeding a fake first tick here would make the very first cadence reading a lie, and H24 exists to catch exactly that kind of invented number.",
"counter": 37,
"last_ticked_session": "S163",
"last_ticked_head": "6ba5cfe74709fd4aab42b1c255195ddbea99cbdb",
"last_ticked_at": "2026-07-30",
"counter": 39,
"last_ticked_session": "S165",
"last_ticked_head": "fbac66db1a138e76dc9a531e6603402c1bb92604",
"last_ticked_at": "2026-07-31",
"last_audit": {
"light_at_counter": 36,
"deep_at_counter": 25,
@ -193,6 +193,16 @@
"at": "2026-07-30",
"session": "S163",
"event": "CLEAN tick (session-counter-tick.ps1 M2): counter 36->37, session S162->S163, head 2554845->6ba5cfe. Classify-before-tick: no regression (n=163 >= stored n=162); last_ticked_head reachable (merge-base --is-ancestor exit 0). 4 fields updated, 1 history entry appended, written atomically (temp + Move-Item -Force)."
},
{
"at": "2026-07-31",
"session": "S164",
"event": "CLEAN tick (session-counter-tick.ps1 M2): counter 37->38, session S163->S164, head 6ba5cfe->e5f53d0. Classify-before-tick: no regression (n=164 >= stored n=163); last_ticked_head reachable (merge-base --is-ancestor exit 0). 4 fields updated, 1 history entry appended, written atomically (temp + Move-Item -Force)."
},
{
"at": "2026-07-31",
"session": "S165",
"event": "CLEAN tick (session-counter-tick.ps1 M2): counter 38->39, session S164->S165, head e5f53d0->fbac66d. Classify-before-tick: no regression (n=165 >= stored n=164); last_ticked_head reachable (merge-base --is-ancestor exit 0). 4 fields updated, 1 history entry appended, written atomically (temp + Move-Item -Force)."
}
]
}

View File

@ -108,3 +108,32 @@
**(1) quyết-định đã CHỐT** — 9 OG trọn (gộp+UI-1-1 · đội-hình-cũ · NĐUQ-human-gate-VĨNH-VIỄN · N-phiếu+UI-1 · hiển-thị-không-authz · đảo-PHÁ-VỠ-S155 · freeze-tái-dùng-máy · phiếu-bất-tử-ERP + PE-test SOLUTION-PE-{n} · OG-6→soát-SAU) + 🔴 MANDATE: window sau CHẠY 1 MẠCH K1-push→K8, không dừng chờ.
**(2) delta còn SỐNG** — K1 BE+FE+TEST xong UNCOMMITTED (597/0); reviewer-gate K1 chưa chạy; K2-K8 chưa; spec 4 file ĐÓNG BĂNG + build-order trong run-folder 2026-07-31-S164-4gd-khkk-fanout (26 file); câu (I)(II)(III) treo không chặn; closeout-nợ: diary vai + tally garble (fable 3/9 · opus 1/13 · ngược-#53 ev#4 · #68 lần-3) + nhãn D + STATUS row.
**(3) con-trỏ** — WAL (build-order + mandate) · spec: runs/.../spec-{tong,cum1,cum2,cum3}*.md · transcribe (OG-6 soát-sau) · sub-file 11 lane · _mind-s-9 CHƯA block window-2 (context cạn — khai, mind-check sẽ cờ, chèn @window-3).
### PAUSE-3 2026-07-31T18:35:00+07:00
> anh: uhm ý tao là plan các thứ đang chạy tới đâu nhớ kỹ, bắt đc lỗi thì tốt. Xong rồi thì pause đi
**(1) quyết-định đã CHỐT trong cửa này**
- 🔴 MANDATE ĐỔI giữa cửa (3 tin nhắn anh, verbatim đủ): ① *"xong nốt thì /pause rồi những đầu việc tiếp theo để lần tiep sau làm tiếp nhé"**"Chứ ý kỹ các đầu việc trong plan đã đc review kỹ trong rurn này nhé."* ③ (dòng quote trên — clarify ②) ⇒ SUPERSEDE mandate "chạy 1 mạch" @PAUSE-2: xong K3 thì dừng, K4a→K8 = lần `/tiep` sau, sổ phải nhớ kỹ từng đầu việc đã review.
- K1 SHIP trọn vòng: gate 9f → commit `50e6d8c` → cicd **PASS 6/6** (seed 86 TAM-GIÁC 3-nguồn).
- K2 SHIP trọn vòng: gate 10f (F-1 guard đếm-so-khớp) → commit `0779f2d` → cicd **PARTIAL 5/6 deploy-khỏe** (mục-4 chân-lý-rỗng — đo lại khi K8 đẻ phiếu thật).
- K3 SHIP (local trọn, prod đang verify): 2 lượt engine-exit → CHẺ NHỎ (nhịp-1-lane seed + nhịp-2/3-lead finalize/sweep + FE-lane + test-lane 5-test) → gate **8f/0-blocker** (3/3 quyết-định lead ĐÚNG) → commit `15349e8` PUSH. Bước-0 lead tự verify ROSTER LIVE prod (`localhost\SQLEXPRESS` · QT-DN-V2-001 3-trạm 11 người · chuong.phan giữ cờ).
- Gate-K3 phán: GIỮ PUT-Conflict đúng (spec vá-3 liệt nhầm) · GIỮ ép-false SkipToFinal type-10 + FE disable ô (F-2 vá) · seed cờ cùng-commit hợp lệ.
**(2) delta còn SỐNG**
- 🔴 **Đầu việc #1 lần sau — gate-K3 F-1 MAJOR:** checkbox opt-out `applyLevelFinalize` màn duyệt KHKK chưa có UI (BE param sẵn, `?? true`) ⇒ trạm CEO tạm chỉ đi được bằng admin bỏ cờ ở Designer; vá = mirror `PeWorkflowPanel.tsx:778` + DTO expose cờ level + FE types ×2 app. BẮT BUỘC trước K8 dry-run.
- `[!]` cicd-K3 đang chạy nền lúc pause — verdict đọc ở `sub-cicd-verify-k3.md` dòng 1 (vai ghi liên tục).
- K4a→K8 chưa làm (build-order + vá-số spec-cụm2/cụm3 đóng băng — K4a nhớ vá-1 route-regex CÙNG wave, vá-2 DELTA +49key/+196policy, vá-7 nhãn N2 "phá dỡ"; K5 forward-provision lines[].contractId pe.contractId; K7 hội-2-khóa + grant Contracts.Create [câu III default]; K8 form 14-người fail-closed + SOLUTION-PE-{n} + QĐ9 đo 2-nhánh).
- Treo không chặn: (I) bản-15-trang · (II) B2-14-dòng "/"=hoặc · (III) ai-bấm-Đưa-vào-HĐ · OG-5 · O-2 literal nhóm 2-nơi · 2 khoảng-hở UX K1-FE (3 filter BE chưa UI · tab cả fe-user) · F-5 PermGuard nợ khuôn cũ · spec-cụm1 vá-3 cần đính-chính chữ PUT-Conflict lần chạm sau.
- Lỗi-tự-bắt trong cửa (ghi làm bài): ship STATUS "607" trong commit K2 khi suite thật 609 (cùng class F-3 gate) — đã sửa 614 @K3; PS5.1 quote-trap làm commit K2 fail lần 1 (→ luật `-F` file).
- #53 tally cửa-sổ 3: ~14 lượt return-hỏng / 17 spawn (reviewer×3-resume-điền · cicd×3 · lane-K2×4 · lane-K3×4 gồm 2 engine-exit-0-delta · ctx-verifier CLEAN · K3-test CLEAN) — **0 mất công** nhờ artifact-đĩa + relaunch-cắt-gọt + lead-solo; sub-class mới: engine-process-exit ×2 cùng-task ⇒ bài task-hẹp-Write-sớm.
**(3) con-trỏ**
- run-trace: `.claude/workflows/runs/2026-07-31-S164-4gd-khkk-fanout/` (specs 4 + sub-* 20+ file: implbe/implfe/test/reviewer-gate/cicd-verify × k1/k2/k3)
- commits: K1 `50e6d8c` · K2 `0779f2d` · K3 `15349e8` (đều pushed origin/main)
- `ctx-curator` verdict @cửa này (§2.6(C-bis)-2bis): **`CTX-CURATOR: SUA — 10 điểm`** (dòng-1 vai ghi 9, tự đính-chính 10 trong thân) — lead áp CẢ 10 vào nháp MIND-3 (nặng nhất: #1 hai artifact-vệt `sub-test-specialist-1.md`/`sub-implementer-backend-0.md` sót khỏi §E — sàn-3 sẽ kêu orphan; #9 regression bundle-hoá 16-ý-1-dòng nuốt chính luật mỗi-ý-1-dòng; #4/#5 nháy-kép-paraphrase lách rào-1). Draft-check v2 7Đ/0T/0cờ → chèn; full 11Đ/0T sau nén MIND-1 (giữ 5-heading + 6 ý chỉ-sống-ở-đó). `_mind` 30.573B = 93,3% — cửa pause KẾ phải nén MIND-2.
- counter: 39 (S165) · docs: STATUS 614/64-key/256-policy tươi · HANDOFF slot-58 84,8% + F-1 khai
```json
{ "machine_block": "python scripts/session_ctx.py machine-block --session 9 --json", "changed_count": 0, "anchor": "15349e8 [CLAUDE] Contract: K3 SP-002 (anchor = chính commit K3 — mọi việc cửa này ĐÃ COMMIT trong 3 commit K1/K2/K3; dirty còn lại = governance, khai giới-hạn máy-chỉ-thấy-đã-commit)" }
```

View File

@ -66,6 +66,66 @@ Máy chỉ quét phần **DƯỚI** marker đóng khối luật (dòng comment c
(`_MIND_TOP_MARKER` trong scripts/session_ctx.py) -- khac khuon `FLOW-START` cua _context (khong may nao doc). -->
<!-- MIND-TOP -->
## MIND-3 — 2026-07-31T18:35:00+07:00 @ 15349e8 (window 3)
### A. Gói-turn
- Window-3 (S165) = `/tiep` entry (tick 39 · reconcile 5-stale · MIND-2 trả nợ · ctx-verifier CO-9-cờ) rồi chạy mandate: **K1 ship+cicd-6/6 · K2 ship+cicd-5/6-khỏe · K3 code+gate+push** (cicd-K3 chết-vì-limit lúc pause) — 3 gate PASS-WITH-FLAGS 9f/10f/8f, suite 590→614, 3 commit `50e6d8c`/`0779f2d`/`15349e8`.
- 🔴 MANDATE ĐỔI giữa cửa: anh 3 tin nhắn (verbatim ở `_context` PAUSE-3 ①②③) — từ chạy-1-mạch sang xong-K3-thì-pause, K4a→K8 lần sau, sổ phải nhớ kỹ từng đầu việc đã review.
- Gap tự-bắt nhờ lời dặn anh: checkbox opt-out màn duyệt (OG-3 dẫn chiếu khuôn checkbox PE S97) chưa land — gate K3 sau đó xác nhận đúng nó = F-1 MAJOR (trạm CEO chết 8/8 vì mặc-định-true).
### B. Hướng-tiếp + nhánh-đã-loại
**Đi tiếp @/tiep sau:** (1) đọc verdict cicd-K3 từ `sub-cicd-verify-k3.md` dòng-1 + re-verify phần thiếu (vai chết vì limit) · (2) đầu việc #1 = checkbox opt-out màn duyệt — acceptance: PAUSE-3 mục (2), BẮT BUỘC trước K8 · (3) K4a→K4b→K5→K4c→K6→K7→K8 theo build-order + vá-số spec-cụm2/cụm3 (chi tiết PAUSE-3 mục (2)).
**Nhánh đã LOẠI trong cửa này:**
-*Vá checkbox ngay trong phiên* — theo mandate @PAUSE-3 (tin ①/③); đã khai HANDOFF (acceptance vế 2 F-1) + prod 0 phiếu KHKK thật nên rủi ro treo thấp.
-*Gỡ PUT-Conflict theo chữ spec vá-3* — luật versioning CHUNG mọi type; gate K3 phán lead ĐÚNG; còn lại là đính-chính chữ spec (§D).
-*Echo `AllowApproverSkipToFinal` cho type-10* — service 0 đọc cờ (K3-test O-1) ⇒ giữ ép-false + FE disable ô (gate F-2 vá) thay vì đẻ config-lie mới.
-*Chờ cicd-K3 rồi mới pause* — vai ghi artifact liên tục; sau đó vai chết vì session-limit càng chứng chọn đúng (chờ = mất điểm dừng).
### C. Kế-hoạch (delta suy-nghĩ)
- **#53 đổi tướng:** đa số lượt spawn cửa này return-hỏng mà 0 mất công (tally tạm — chốt @closeout, xem PAUSE-3 mục (2)) — artifact-đĩa + relaunch-cắt-gọt + lead-solo nay là NẾP, không còn là recovery. Sub-class mới `engine-process-exit` ×2 CÙNG task (0-delta 0-artifact dù 35-43 tool-use) ⇒ đặc-trị: **task-hẹp-Write-sớm, thiết-kế nhét sẵn vào prompt** (task đọc-nhiều-trước-Write là mồi chết).
- **Rà-OG-từng-dòng mạnh hơn gate:** gap F-1 do lead rà OG-3 theo lời dặn anh bắt TRƯỚC, gate xác nhận + đo độ nặng SAU. Trước mỗi lần tuyên wave xong: đọc lại từng OG/quyết-định owner tìm đầu việc ngầm.
- **Lỗi-tự-bắt cùng-class với lỗi mình vá cho người khác:** ship STATUS 607 khi suite 609 (đúng class F-3 mình flag ở gate) ⇒ số-trong-doc chốt SAU phép đo cuối, không giữa chừng.
- **PS5.1 quote-trap:** commit message chứa nháy kép → arg vỡ → luật mới: message qua file + `git commit -F`.
### D. Đang-thảo-luận
- Spec-cụm1 vá-3 chữ "PUT Conflict" cần đính-chính theo phán gate-K3 — sửa lần build-order chạm spec {gần-chốt}
- O-2 literal `KHKK-N{n}` sống 2 nơi (seeder + regex rào) — thuần đặt-tên, gom 1 const khi tiện {mới-nêu}
- Câu (I) bản-15-trang · (II) B2-14-dòng "/"=hoặc · (III) ai-bấm-Đưa-vào-HĐ [default Drafter+Procurement+Admin] {treo-chờ-anh}
- OG-5 hỏi-khi-gặp {treo-chờ-anh}
- OG-6 soát-SAU qua Admin CRUD — chờ anh soát 4 ô ⚠️ trên UI {treo-chờ-anh}
- 2 khoảng-hở UX K1-FE (3 filter BE chưa UI · tab hiện cả fe-user) {treo-chờ-anh}
- F-5 gate-K1 PermissionGuard CatalogsPage = nợ khuôn 4-kind cũ {treo-chờ-anh}
- Carry nhóm treo-chờ-anh — slot (54)(57)(58)(60)(62)(43) + PARK-1..6: nhà + ruột giữ nguyên MIND-2 §D, không chép {treo-chờ-anh}
- Carry nhóm mới-nêu — slot (61) liên-danh · luật ý-PARK-1-dòng · ESCALATE (i)(ii) · 4-finding-khe: giữ nguyên MIND-2 §D {mới-nêu}
- Carry nhóm gần-chốt — luật END-line sub-md (nhà HANDOFF NEXT-em #4 + slot 44): giữ nguyên MIND-2 §D {gần-chốt}
- Slot (55)(56)(59) — giữ nhà HANDOFF, đóng-CÓ-KHAI không lặp {treo-chờ-anh}
### E. Dòng-sống spawn/engine-run
- Nhà chung artifact: `.claude/workflows/runs/2026-07-31-S164-4gd-khkk-fanout/` (tên file trần dưới đây nằm trong folder này) · biên-nhận entry: `.claude/sessions/session-9/_tiep-2.md`
- ctx-verifier @entry — CO 9-cờ (trần-mind 84,8% · run.md tách K1-K8 · 2-vá-WAL) — verdict ghi `_tiep-2.md`
- reviewer gate-K1 — PASS-WITH-FLAGS 9f (#53 → resume điền B4e-B6) — `sub-reviewer-gate-k1.md`
- cicd-K1 — PASS 6/6 (#53 return, artifact trọn) — `sub-cicd-verify-k1.md`
- K2-BE p1 wf_583be7ad — chết giữa §c (schema+entity land) — `sub-implbe-k2.md` §a-b
- K2-BE p2 Agent — chết @§f 0-byte-artifact (code ~85% land) → lead-solo đóng — `sub-implbe-k2.md` §c-h (lead on-behalf)
- K2-FE p1 (wf_9b36e4cb lane-1) — chết sau §0.b + markup-rò-artifact (sub-class #53 mới) — `sub-implfe-k2.md` §0
- K2-FE p2 Agent — DONE (wire ListPage + cp fe-user + SHA-pair 5/5) — `sub-implfe-k2.md` §1-§4
- K2-test (wf_9b36e4cb lane-2) — file test 9-Fact HOÀN CHỈNH; vệt lane tự ghi = `sub-test-specialist-1.md` (3.1KB, chết giữa ghi); tổng-kết = `sub-test-k2.md` (lead on-behalf sau verify-đĩa)
- reviewer gate-K2 — PASS-WITH-FLAGS 10f (#53 → resume điền §3-§6) — `sub-reviewer-gate-k2.md`
- cicd-K2 — PARTIAL 5/6 deploy-khỏe (mục-4 chân-lý-rỗng) — `sub-cicd-verify-k2.md`
- K3-BE p1 wf_a04124a7 + p2 Agent — engine-process-exit ×2 (0-delta, 0-artifact-mới) — khai `sub-implbe-k3.md` header
- K3-BE nhịp-1 lane — DONE seed-8-wf + 8-key (return đứt-giữa-câu kèm số thật 609/0) — `sub-implbe-k3.md` §1-2 + vệt lane `sub-implementer-backend-0.md`
- K3-FE lane — DONE (chết khi GHI §2, code land đủ; lead chốt npm ×2 + SHA `336ECCC1F86D`) — `sub-implfe-k3.md`
- K3-test lane — CLEAN return 614/0 +5-test + 3 quan-sát O-1/2/3 — `sub-test-k3.md` (tồn tại, đã kiểm)
- reviewer gate-K3 — skeleton → resume ĐIỀN ĐỦ: PASS-WITH-FLAGS 8f/0-blocker — `sub-reviewer-gate-k3.md`
- cicd-K3 — CHẾT-vì-SESSION-LIMIT 18:50 (artifact 2640B phần đầu còn) — `sub-cicd-verify-k3.md`; /tiep sau re-verify
- ctx-curator @pause-3 — SUA 10 điểm (2-artifact-sót · bundle-regression · nhãn · nháy-paraphrase · tally), lead áp cả 10 — verdict ghi `_context` PAUSE-3 mục (3)
## MIND-2 — 2026-07-31T15:13:43+07:00 @ fbac66d (window 3)
### A. Gói-turn
@ -129,60 +189,31 @@ Máy chỉ quét phần **DƯỚI** marker đóng khối luật (dòng comment c
- wf_1fb9f309 K1-test — 7 test, suite 597/0 — `.claude/workflows/runs/2026-07-31-S164-4gd-khkk-fanout/sub-test-k1.md`
- ctx-verifier @entry-w3 — spawn ngay sau block này, verdict ghi ở block kế (khai pending) — `.claude/sessions/session-9/_tiep-2.md`
## MIND-1 — 2026-07-30T17:35:40+07:00 @ 43b57b5 (window 1)
## MIND-1 — 2026-07-30T17:35:40+07:00 @ 43b57b5 (window 1) [NÉN @S165 pause-3 — verbatim trong git; 6 ý chỉ-sống-ở-đây GIỮ NGUYÊN]
### A. Gói-turn
- Bookend @open đóng trọn **5 vòng / 10 vai, 10/10 END-line** — verdict từng vai xem `MIND-0` §E (bất-biến), không lặp.
- `ctx-audit` chấm lead **TRƯỢT 14** ở trục carry (3/9 = 33%, 6 ý biến mất khỏi mọi bề mặt) → lead nạp lại đủ + vá, `mind-check` xanh lại 11/0/0.
- Anh gõ `/pause` (xem PAUSE-1) trước khi lead kịp bắt đầu danh-sách vá ⇒ **0/11 mục đã làm**.
- Bookend @open S163 đóng 5-vòng/10-vai; `ctx-audit` TRƯỢT-14-carry → lead nạp lại đủ; anh `/pause` trước khi chạy danh-sách vá (0/11 — nhà `.claude/workflows/runs/2026-07-30-S163-bookend-open/run.md`).
### B. Hướng-tiếp + nhánh-đã-loại
**Đi tiếp @cửa sau:** chạy danh-sách vá — nhà canonical = `run.md` mục "DANH-SÁCH VÁ — 11 mục" (`.claude/workflows/runs/2026-07-30-S163-bookend-open/run.md`), ưu tiên 5 HIGH. Rồi seed diary 10 vai. Blocker mạch chính vẫn slot (54).
**Nhánh đã LOẠI trong cửa này (nối tiếp 4 nhánh của `MIND-0`):**
-*Nâng cap để cứu `_INDEX`*`harness-refine` BÁC: đổi thước = rời tập-đo. Split hoặc chờ anh (slot 57).
-*Coi `④ chưng-cất = 0` là lành*`harness-audit` khai rõ đó là trục **MÙ** (0 instrument đo tuổi gist, vòng 3), không phải trục sạch.
-*Đọc `ring4` NO-OP thành "V4 đạt"* — V4 là `không-nhịp` (SHARD-PROBE `15 = 15`, biên `-gt` strict); +1 shard là đổi trạng-thái.
-*Giữ quy-tắc "slot đã có nhà ở HANDOFF thì không lặp vào §D"*`ctx-audit` FLAG-3 BÁC bằng chính hành-vi của lead (kéo slot (43) từ HANDOFF lên §D). Khuôn đúng = **đóng-CÓ-KHAI**, không phải im lặng.
- Hướng-tiếp cũ (chạy 11 mục vá) đã tiêu ở window-2 — xem WAL/`_context` PAUSE-2.
- 4 nhánh-LOẠI (GIỮ — chỉ sống ở đây): ❌ nâng-cap cứu `_INDEX` (refine BÁC: đổi thước = rời tập-đo; slot 57) · ❌ đọc "④ chưng-cất = 0" thành lành (audit khai trục MÙ, 0 instrument) · ❌ đọc ring4-NO-OP thành "V4 đạt" (V4 = `không-nhịp`, biên `-gt` strict) · ❌ giữ quy-tắc "slot có nhà thì không lặp §D" (FLAG-3 BÁC — khuôn đúng = đóng-CÓ-KHAI).
### C. Kế-hoạch (delta suy-nghĩ)
- **Nhận thêm một họ lỗi mới, 4 ca cùng phiên:** máy trả lời **đúng câu nó được hỏi** mà việc vẫn hỏng — bundle-hoá (6 ý/1 dòng, phép nhãn vẫn xanh) · carry tên-trần (không token `[carry:]` nên detector không có gì để đếm) · `git status` thư-mục rỗng · hook nuốt `agent-memory` làm backstop rỗng.Thêm detector không đóng được họ này, vì detector mới cũng là một câu hỏi mới có khoảng-mù riêng.
- **Đổi cách đọc mọi ô PASS:** 2 ca `drift-born-sau-phép-đo` trong 1 phiên ⇒ PASS = *"sạch lúc HH:MM"*. Assertion cuối phải do lead chạy **sau khi mọi vai dừng tay**.
- **Đổi nấc chống #53:** *"ghi đĩa trong lúc làm"* bị đọc thành *"tạo file sớm"* — 3 ca hỏng trong phiên (2 skeleton-nấc-2 + 1 heredoc nuốt §4-§6) đều tạo file rất sớm. Đặc tả đúng = **đổ nội dung liên tục**, và **verify bằng ruột không bằng byte**.
- **Đổi cách spawn cặp vai có luật nhường-turf:** thứ tự chạy là **một phần của tính đúng đắn**; song song ⇒ 4 finding rơi vào khe. Lần sau tuần tự, hoặc thêm bước hợp-lưu.
- **Tự soi được một lần trong cửa này:** lead viết luật "mỗi ý 1 dòng" rồi vi phạm ngay dòng sau — `ctx-curator` #2 bắt. ⇒ luật vừa-viết **không tự áp cho chính đoạn văn chứa nó**; phải grep lại chính mình.
- (GIỮ — chỉ sống ở đây) Họ-lỗi "máy trả đúng câu nó được hỏi mà việc vẫn hỏng" 4-ca/1-phiên (bundle-hoá · carry tên-trần · git--thư-mục-rỗng · hook-nuốt-agent-memory)thêm detector KHÔNG đóng được họ này.
- (GIỮ — chỉ sống ở đây) Luật vừa-viết KHÔNG tự áp cho đoạn văn chứa nó — phải grep lại chính mình (`ctx-curator` #2 bắt).
- 3 ý còn lại trùng MIND-0 §C (PASS-lúc-HH:MM · chống-#53-đổ-nội-dung-liên-tục · spawn-tuần-tự-turf) — đọc MIND-0.
### D. Đang-thảo-luận
- Slot (54) người duyệt 3 trạm PRO/CCM/CEO — chặn W5 + E2E; ai đóng: anh {treo-chờ-anh}
- Slot (57) `_INDEX` 167 B — coupling với P3 của H2; đã đẩy lên anh, chờ chọn (a) split / (b) nâng cap / (c) để vỡ {treo-chờ-anh}
- Slot (58) trần `_mind` — số cũ SAI (98,21% không phải 89,06%), đo lại trên `_mind-s-9`; ai đóng: anh {treo-chờ-anh}
- Slot (60) mở enum `flag_classes` thêm class "số đúng, đơn-vị không-canonical"; ai đóng: anh {treo-chờ-anh}
- Slot (61) defect liên-danh N-HĐ chỉ nối HĐ[0] — MỒI-A của `ctx-audit`, `_mind` là nhà DUY NHẤT {mới-nêu}
- Slot (43) carry con-trỏ-vs-slug — 3 mốc detector byte-identical; 0 chuyển-động cửa này, cái chặn là anh chưa trả lời {treo-chờ-anh}
- Luật `refresh @closeout` NỬA CÒN LẠI (fail-LOUD `mind-refresh:` trong `_end`) — **0 nhà trên 4/4 bề mặt**, đời-3, chưa land {mới-nêu}
- Luật END-line cho mọi `sub-*.md` — còn nhà `docs/HANDOFF.md` NEXT-em #4 + slot (44) {gần-chốt}
- Luật ý PARK gói >1 chủ-đề phải giữ mỗi ý 1 dòng — bundle-hoá là đường thoát khỏi lưới đo {mới-nêu}
- PARK-1: FLAG-4 "Đã duyệt" HĐ — vô gia cư {treo-chờ-anh}
- PARK-2: cơ-chế đặt-chỗ-diary — treo 4 đời, vô gia cư {treo-chờ-anh}
- PARK-3: nhãn "Bảng cứng" ↔ "Bản cứng" — còn nhà `docs/HANDOFF.md:44` {treo-chờ-anh}
- PARK-4: Hộp thư hoa — vô gia cư {treo-chờ-anh}
- PARK-5: W8-authz hồ sơ mới — vô gia cư {treo-chờ-anh}
- PARK-6: FLAG-4 W7 UX — vô gia cư {treo-chờ-anh}
- ESCALATE (i) backstop G-015 rỗng-hoá — hook nuốt `agent-memory` trước khi lead soát {mới-nêu}
- ESCALATE (ii) stray `agent-cwd-relative-memory-misland` ×3/phiên — đã xoá, chưa vá gốc {mới-nêu}
- 4 finding rơi vào khe giữa 2 vai H24 (lead spawn song song) — chưa thu về {mới-nêu}
- Slot (55)(56)(59) có nên lặp vào §D không, khi FLAG-3 đã BÁC quy-tắc "đã có nhà thì không lặp"? Hiện giữ nhà ở `docs/HANDOFF.md:11/:13/:19` {đang-cãi}
- 18 ý của block này đã carry ĐỦ sang MIND-2 §D (PAUSE-1 chứng 12/12 + PARK tách 6 dòng) — nhãn TỪNG Ý giữ ở MIND-2, đây chỉ con-trỏ {treo-chờ-anh}
### E. Dòng-sống spawn/engine-run
- 9 vai + `ring4` NO-OP của cửa-sổ này đã liệt ở `MIND-0` §E (bất-biến), không lặp; dưới đây chỉ phần SAU mốc đó.
- `ctx-audit` — TRƯỢT 14 / 4-4 khoản, gieo 2 mồi + 1 phép-thử tiên-đoán — `.claude/workflows/runs/2026-07-30-S163-bookend-open/sub-ctx-audit-open-S163.md`
- `ctx-curator``SUA — 9 điểm`, lead áp cả 9 trước khi chèn block này — `.claude/sessions/session-9/_context-s-9.md`
- `ctx-audit` — TRƯỢT 14 / 4-4 khoản — `.claude/workflows/runs/2026-07-30-S163-bookend-open/sub-ctx-audit-open-S163.md`
- `ctx-curator` — SUA 9 điểm, lead áp cả 9 — `.claude/sessions/session-9/_context-s-9.md`
## MIND-0 — 2026-07-30T15:14:22+07:00 @ 6ba5cfe (window 1)

View File

@ -0,0 +1,5 @@
ts: 2026-07-31T18:35:00+07:00
head-sha: 15349e8ee054406797cc1d76c7bc3384c6768fc2
window-ordinal: 3
jsonl-hint: D--Dropbox-CONG-VIEC-SOLUTION-SOLUTION-ERP/95541fdb-83ef-45f2-b778-8e1c44510af3
account-label: none

View File

@ -0,0 +1,5 @@
ts: 2026-07-31T21:50:00+07:00
head-sha: 15349e8ee054406797cc1d76c7bc3384c6768fc2
window-ordinal: 3
jsonl-hint: D--Dropbox-CONG-VIEC-SOLUTION-SOLUTION-ERP/95541fdb-83ef-45f2-b778-8e1c44510af3
account-label: none

View File

@ -17,7 +17,7 @@ Skill này là tài liệu chuyên biệt để Claude (và developer khác) dù
| Skill | Mục đích | Trigger ví dụ | Trạng thái |
|---|---|---|---|
| `dependency-audit-erp` | Scan CVE NuGet + npm 2 FE, respect pin constraint (MediatR 12.4.1, Swashbuckle 6.9.0) | "npm audit", "dotnet vulnerable", "deps scan", "nâng cấp package" | ✅ New Tier 3 |
| `ef-core-migration` | Tạo/revert EF Core 10 migration, 3-file rule, DesignTimeDbContextFactory, migration history (mới nhất → row cuối bảng skill; số → `docs/STATUS.md`) | "thêm migration", "EF migration", "schema update", "snapshot lỗi" | ✅ Updated S117 (mig-ref → pointer anti-drift B1; Mig 66 AddPeApprovedPriceRange row added; số → `docs/STATUS.md`) |
| `ef-core-migration` | Tạo/revert EF Core 10 migration, 3-file rule, DesignTimeDbContextFactory, migration history (mới nhất → row cuối bảng skill; số → `docs/STATUS.md`) | "thêm migration", "EF migration", "schema update", "snapshot lỗi" | ✅ Updated S164 (rows Mig 68 `AddPeAllowApproverDelete` + **Mig 69 `AddContractSigningPlans` 7-bảng KHKK 89→96** added; Total re-ground 96; số → `docs/STATUS.md`) |
| `iis-deploy-runbook` | 3 IIS site + win-acme cert + gitea-runner + LibreOffice + debug 500/502/SignalR prod + **G-084 IPv4/IPv6 hardening** | "prod 500", "IIS fail", "cert hết hạn", "restart app pool", "deploy IIS", "port hijack" | ✅ Updated (G-084) |
## Format chuẩn 1 skill

View File

@ -25,7 +25,7 @@ when-to-use:
> - Office/HRM/… — xem `MenuKeys.cs` (mã là nguồn)
> - 🧊 ~~Budgets root + `Bg_*`~~ — **XOÁ S61 (Mig 50)**, module Budget cũ thay bằng `PeWorkItemBudgets` (ngân-sách per-gói-thầu). Bia-mộ: `MenuKeys.cs:70` + `fe-{admin,user}/src/lib/menuKeys.ts:29`. *(Skill này liệt `Bg_*` như menu ĐANG SỐNG suốt từ S61 → S122 — stale **nặng hơn** lệch con-số vì nó mô-tả thứ **không tồn tại**; vá @S122 W4.)*
>
> **Inheritance roots (4 group, gotcha #35):** `Contracts` → `Ct_*`, `Workflows` → `Wf_*`, `PurchaseEvaluations` → `Pe_*`, `PeWorkflows` → `PeWf_*`. Thêm root mới có children → **PHẢI extend 3 chỗ** trong `GetMyMenuTreeQuery` (gotcha #35). *(🧊 câu cũ "Budgets KHÔNG inherit (Bg_* phải grant tay)" — gỡ theo module.)*
> **Inheritance roots (4 group, gotcha #35):** `Contracts` → `Ct_*`, `Workflows` → `Wf_*`, `PurchaseEvaluations` → `Pe_*`, `PeWorkflows` → `PeWf_*`. Thêm root mới có children → **PHẢI extend 3 chỗ** trong `GetMyMenuTreeQuery` (gotcha #35). 🔴 **`KeHoachKyKet` (KHKK, +S161) CỐ Ý KHÔNG inherit** — switch `GetMyMenuTreeQuery.cs:71-74` vẫn đúng 4 case; 6 leaf `Khkk_*` grant TỪNG DÒNG riêng (seeder `DbInitializer.cs:2107` grant root + 6 leaf explicit, chạy SAU revoke để THẮNG). Đừng đọc "root mới" thành "tự inherit như `Ct_*`". *(🧊 câu cũ "Budgets KHÔNG inherit (Bg_* phải grant tay)" — gỡ theo module.)*
## Model
@ -39,7 +39,7 @@ User ────< UserRoles ────< Role ────< Permissions ──
- Union (OR) nhiều role → user có quyền nếu **bất kỳ role nào** cho quyền đó
- Admin role → **bypass** check (luôn pass mọi policy)
## Menu tree (seed — ~60 key sau Phase 8)
## Menu tree (seed — số key SỐNG → `docs/STATUS.md` "Menu keys", B1 KHÔNG chép số ở đây; nguồn mã = `MenuKeys.cs` + `DbInitializer.cs`)
```
Dashboard
@ -57,10 +57,14 @@ Contracts (root inherit)
Forms
PurchaseEvaluations (root inherit)
└── Pe_<Code>_<List|Create|Pending> × 2 type = 6 leaf
Budgets (root, NO inherit — grant tay)
── Bg_List
├── Bg_Create
└── Bg_Pending
KeHoachKyKet (root — const VÀO `All` @S161 W1 ⇒ sinh 4 policy KeHoachKyKet.{R,C,U,D}; Mig 69 KHKK)
── Khkk_G1 "Kế hoạch ký kết HĐ (NCC-TP)" (DbInitializer.cs:1780-1787)
├── Khkk_WfView Luồng duyệt
├── Khkk_List Danh sách
├── Khkk_Create Thao tác
├── Khkk_Pending Đang duyệt
├── Khkk_Approved Đã duyệt
└── Khkk_Deleted Đã xóa
Reports
System
├── Users
@ -72,6 +76,10 @@ System
└── PeWf_<Code> × 2 type = 2 leaf
```
> 🧊 ~~`Budgets (root, NO inherit)` + `Bg_List/Bg_Create/Bg_Pending`~~ — **XOÁ S61 (Mig 50)** cùng module Budget; cây trên từng liệt nó như ĐANG SỐNG tới S164 (cùng bệnh header :26 đã vá @S122 — vá header quên vá CÂY = dư-lượng bất-đối-xứng).
> 🔸 `HopDongCung` (GĐ4 bản-cứng): const CÓ trong `MenuKeys.cs:43` nhưng **NGOÀI `All`** ⇒ **0 policy · 0 menu-row** tới khi có module (1-mốc theo owner). ĐỪNG liệt nó vào cây key sống.
> 🔴 Gate FE cho KHKK: dùng **đúng key policy của endpoint** (`KeHoachKyKet`) — KHÔNG OR `Khkk_*` key con (gotcha **#85**: menu-hiện rộng hơn API-cho ⇒ 403 rải UI; `MenuPermissionHandler.cs:40` so khớp CHÍNH XÁC 1 key, không kế-thừa).
Tree hierarchy qua `ParentKey` field. Seed trong `DbInitializer.SeedMenuTreeAsync` + Pe/Wf/Bg seeders riêng.
## Code pointers

View File

@ -19,7 +19,9 @@
| 2.c3-r | Review cụm-3 — `WF reviewer c3-{evi,cov,seq} s164` | /fable-clone (opus ×3) | ✅ 3/3 sạch · L1 7/7-ĐÚNG PWF 4M · L2 FAIL 5H (K8 chưa-chạy-được-như-viết) · L3 FAIL 4H (authz hội-2-khóa · Contracts.Create 0-vai) → **spec-cum3-final 16 vá** |
| 3 | Chốt spec cuối — `WF review-fable b3-chot s164` | /fable-real review | ✅ **GO-WITH-SPEC-FIXES**: GO 9/10 (K8 by-design) · 8 mâu-thuẫn (3 nặng A-1/A-4/A-5) · 0 vá-đè-vá/43 · build-order K1→K2→K3→K4a→K4b→K5→K4c→K6→K7→K8 · 8 fix lead ÁP XONG |
| 4.K1 | Build K1 danh mục HĐ (BE+FE+test) | wf_2569b79b p1 · wf_2e08ba77 p2 · implfe · wf_1fb9f309 | ✅ @S165: 3 lane trọn · gate `sub-reviewer-gate-k1.md` **PASS-WITH-FLAGS 9f** · F4/F7 vá + T5b · Mig 70 áp LocalDB |
| 4.K2-K8 | Build K2..K8 theo build-order B3 | hmw (Opus 5 MAX) | ☐ K2 kế tiếp |
| 4.K2 | Build K2 (BE+FE+test) | 4 lane + lead-solo đóng | ✅ @S165: gate PASS-WITH-FLAGS 10f · commit `0779f2d` · cicd PARTIAL-5/6-deploy-khỏe (mục-4 chân-lý-rỗng chờ phiếu thật) |
| 4.K3 | Build K3 (8 wf nhóm + finalize + designer) | chẻ-nhỏ: nhịp-1-lane + nhịp-2/3-lead + FE-lane + test-lane | ✅ @S165: gate PASS-WITH-FLAGS 8f/0-blocker · commit `15349e8` · cicd ĐANG chạy (sub-cicd-verify-k3.md) · 🔴 F-1 checkbox-opt-out = đầu việc #1 lần sau |
| 4.K4a-K8 | Build K4a→K8 theo build-order B3 | hmw | ☐ lần /tiep sau (spec-cụm2/cụm3 đóng băng) |
| 5 | Dry-run E2E toàn trình (K8) | theo spec-cum3 | ☐ chặn bởi B0-form 14 người |
## Stages

View File

@ -0,0 +1,45 @@
CICD-K3: IN-PROGRESS — ?/6
# cicd-monitor — verify deploy K3 SP-002 (`15349e8`)
> Artifact chống #53: ghi TỪNG MỤC ngay khi có bằng chứng. Kết bằng `END ... VERDICT=`.
> Repo `D:\Dropbox\CONG_VIEC\SOLUTION\SOLUTION_ERP` · push `0779f2d..15349e8 main`.
## §0 — Tiền đề (đo LIVE trước khi deploy xong)
Commit HEAD:
```
15349e8ee054406797cc1d76c7bc3384c6768fc2 [CLAUDE] Contract: K3 SP-002 8 workflow nhom KHKK-N1-8 + port level-finalize + designer (0-mig) + 5 test
git log origin/main..HEAD -> (rỗng — đã push)
```
`git diff --name-only 0779f2d 15349e8` = 26 file. Phân loại vs `paths-ignore` 7-glob:
- **CODE (13, trigger CI):** BE 6 (`ContractSigningPlansController.cs`, `ApprovalWorkflowV2AdminFeatures.cs`, `ContractSigningPlanFeatures.cs`, `IContractSigningPlanWorkflowService.cs`, `MenuKeys.cs`, `DbInitializer.cs`, `ContractSigningPlanWorkflowService.cs` = 7 thực) · FE 4 (`fe-admin/Layout.tsx`, `fe-admin/khkk/KhkkWorkflowPanel.tsx`, `fe-admin/system/ApprovalWorkflowsV2Page.tsx`, `fe-user/khkk/KhkkWorkflowPanel.tsx`) · test 2 (`ContractSigningPlanApprovalTests.cs`, `ContractSigningPlanGroupAndCatalogTests.cs`)
- **IGNORED (13):** `docs/**` ×2 + `.claude/WAL.md` + `.claude/agent-memory/**` ×3 + `.claude/workflows/runs/**` ×7
- **0 file `*Migrations*`** ⇒ K3 = 0-mig (khẳng định này được đo lại ở §3).
**Bundle PRE-deploy (đo LIVE 18:22:51 +07, lúc run #436 CÒN `running`):**
```
admin /assets/index-DVQEwGwf.js + /assets/index-D050EVYG.css
eoffice /assets/index-CZAYiWWa.js + /assets/index-DX1FRk5n.css
```
Khớp ĐÚNG mốc post-K2 (#435) ghi ở `sub-cicd-verify-k2.md:139-142` ⇒ mốc PRE hợp lệ, chưa bị K3 ghi đè.
**PROD DB PRE-deploy (sqlcmd `localhost\SQLEXPRESS`, đo 18:23 +07 lúc run CÒN `running`):**
```
MIGTOP=20260731085624_AddKhkkApprovalGroupCatalogAndFinalizeRuntime
MIGCOUNT=71
WF_KHKK_N=0 <- CHƯA có workflow nhóm nào
MENU_AwV2_KhkkN=0 <- CHƯA có menu-row nào
MENU_TOTAL=143
PERM_TOTAL=1576
LEVELS_FINALIZE_ALL=2 <- cờ finalize toàn hệ TRƯỚC K3 (control nền)
```
⚠️ Cột PK của `MenuItems`**`[Key]`** (KHÔNG phải `MenuKey``MenuItemConfiguration.cs:11 b.HasKey(x => x.Key)`;
`MENUCOLS=Key,Label,ParentKey,Order,Icon,DisplayLabel,IsVisible`). Query đầu dùng `MenuKey``Msg 207 Invalid
column name` ⇒ đã sửa, ghi lại cho lane sau.
**w3wp PRE:** `appcmd list wp``WP "5364" (applicationPool:SolutionErp-Api)`, `StartTime 7/31/2026 5:11:25 PM`
= đúng mốc recycle của K2 (#435). ⇒ mốc-so-sánh recycle-proof cho K3.
---

View File

@ -1,22 +1,71 @@
REVIEWER-GATE-K3: IN-PROGRESS — 0 finding (đang chạy)
REVIEWER-GATE-K3: PASS-WITH-FLAGS — 8 finding (3 MAJOR / 5 MINOR, 0 blocker build-test)
# Reviewer gate K3 — 8 workflow nhóm + port finalize + designer
Ghi-đĩa TRONG LÚC LÀM (chống #53). Dòng-1 sẽ được cập nhật khi có verdict.
Ghi-đĩa TRONG LÚC LÀM (chống #53). Đo từ ĐĨA, HEAD `2967c43`, 25 file M / +908 102; 2 untracked chỉ ở `.claude/auto-memory/`.
## 0. Trạng thái khởi động (đo từ đĩa)
## §1 Build / test / npm — số NGUYÊN VĂN
- Branch `main`, HEAD `2967c43` (wal: flush 20260731T1743).
- `git diff --stat`: 25 file M, +908 / -102.
- Untracked: chỉ 2 file `.claude/auto-memory/*` (memory, không phải prod-code).
- 0 file untracked trong `src/` hoặc `tests/`**0 migration mới** (kiểm lại ở §4).
| Phép | Lệnh | Kết quả nguyên văn |
|---|---|---|
| BE build | `dotnet build SolutionErp.slnx` | `Build succeeded.` · `0 Warning(s)` · `0 Error(s)` |
| BE test #1 | `dotnet test SolutionErp.slnx` | 🔴 `Failed! - Failed: 1, Passed: 568, Skipped: 0, Total: 569 - SolutionErp.Infrastructure.Tests.dll` |
| BE test #2 | `dotnet test SolutionErp.slnx` | `Passed! - Failed: 0, Passed: 45, Total: 45 - Domain.Tests` + `Passed! - Failed: 0, Passed: 569, Total: 569 - Infrastructure.Tests`**614/0** |
| BE test #3 | `--filter ~ContractSigningPlan` | `Passed! - Failed: 0, Passed: 34, Total: 34` |
| npm fe-admin | `npm run build` | `✓ 1961 modules transformed` · `✓ built in 19.63s` · 0 TS error |
| npm fe-user | `npm run build` | `✓ built in 7.81s` · 0 TS error |
## 1. Build / test (đang chạy)
⇒ 614/0 = 45D+569I **khớp claim ở lượt #2/#3**; lượt #1 FAIL → F-4.
## 2. Code-vs-spec
## §2 Code-vs-spec K3 (5 điểm)
## 3. Phán 3 điểm lead tự-quyết
1. **Seed 8 wf khớp ROSTER §0**`DbInitializer.cs:526-688`. 3 Steps (`Phòng Cung Ứng` / `P. Kiểm soát Chi phí` / `Ban Giám đốc`), 11 email `Distinct` khớp từng dòng bảng §0 `sub-implbe-k3.md`; Cấp 1 OR-4 / OR-4 / OR-1, Cấp 2 `tra.bui` / `chuong.phan`; `AllowApproverFinalize=true` **chỉ**`(CCM, Cấp 2, chuong.phan)` đặt PER-ROW; idempotent `AnyAsync(w.Code == code)`; UNGATED demo-seed. ✅
2. **Finalize qua choke-point + 2-lệnh-grep LUẬT** — chạy CẢ HAI:
- `Phase = ContractSigningPlanPhase.DaDuyet``:280`, `:322` (+ `:336` là dòng doc)
- `ApplyApprovedValuesOnFinalize``:279`, `:321` (+ doc/def/comment)
**cùng khớp**: 2 site gán DaDuyet ↔ 2 site gọi helper, helper đứng NGAY TRƯỚC gán ở cả hai. ✅
3. **Rào (v)**`ContractSigningPlanFeatures.cs:411-420`, regex `"^KHKK-N([1-8])$"` neo 2 đầu, khớp literal seeder `$"KHKK-N{n}"` n=1..8; so với `approvalGroup` (`:395` = `request.ApprovalGroup ?? Default`); code ngoài họ → cho qua. ✅
4. **8 key VÀO All + DELTA (đếm MÁY)**`MenuKeys.All` = **64** (HEAD `2967c43` = **56**) ⇒ **+8**; policies DERIVED = **256** (HEAD **224**) ⇒ **+32**. 8 menu-row `DbInitializer.cs:1980-1989` order 3..10 dưới `ApprovalWorkflowsV2`. ✅ mã — ❌ khai (F-3).
5. **FE phép-âm `Khkk_` = 0-hit + control dương**`git diff -U0 | grep -E "^\+.*Khkk_[A-Za-z]+: *'"` = **0**; control dương cùng regex trên cả `Layout.tsx` = **6** hit ⇒ mẫu CÓ RĂNG. Nhánh mới `Layout.tsx:181` `/^KhkkN[1-8]$/` nằm TRONG `awV2Match`, đặt SAU whitelist 3 code cũ. ✅
## 4. Ranh giới
## §3 Phán 3 quyết-định lead
## 5. Test lane
- **(i) GIỮ PUT-Conflict (spec vá-3 bảo gỡ) — LEAD ĐÚNG, spec vá-3 LIỆT NHẦM.** `UpdateAwDefinitionCommandHandler` (`:515-649`) **0 lần** tham chiếu `typeEnum`/`ContractSigningPlan`; grep 2 token toàn file cho hit ở `:97/:125/:126/:331/:341/:349/:387`**tất cả** thuộc list/create, KHÔNG hit nào trong thân PUT. Guard `:598-603` (echo cờ) · `:612-617` (dòng mới) · `:627-632` (bỏ người giữ cờ) là **luật versioning CHUNG mọi ApplicableType**; gỡ = nới rào cho PE/Contract/Proposal = regression ngoài scope K3. Thêm: gỡ FE-lock (đúng) đã đủ để cờ seed `true` không đẻ 409 lúc PUT vì payload nay echo giá trị THẬT.
- **(ii) GIỮ ép-false `AllowApproverSkipToFinal` type-10 (O-1) — LEAD ĐÚNG ở BE, nhưng sweep BẤT ĐỐI XỨNG (F-2).** Tự verify: token `AllowApproverSkipToFinal` trong `ContractSigningPlanWorkflowService.cs` = **1 hit duy nhất `:47`, và là COMMENT** ⇒ service **0 lần đọc cờ**; control dương: cùng token trong `PurchaseEvaluationWorkflowService.cs` = **3 hit** (code thật) ⇒ grep có răng. Echo cờ cho type-10 = đẻ config-lie #78 mới ⇒ giữ ép-false ĐÚNG.
- **(iii) Seed cờ cùng-commit ≠ config-lie #78 — ĐÚNG, nhánh THẬT tồn tại.** `ContractSigningPlanWorkflowService.cs:276-289`: `if (actingLevel.AllowApproverFinalize && applyLevelFinalize)``EndedByLevelFinalize=true``ApplyApprovedValuesOnFinalize(plan)``Phase=DaDuyet` → xoá 2 con-trỏ → log → `return`. Cờ seed CÓ máy tiêu thụ trong cùng diff. ✅ *(nhưng đường ĐI NGƯỢC — bỏ tick để trình CEO — chết ở tầng UI: F-1)*
## §4 Ranh giới
- `ReturnOrRejectAsync` (`:354+`), `ApplyApprovedValuesOnFinalize` (`:345-349`), nhánh advance thường (`:293-329`): `git diff -U0` trên service chỉ **5 hunk** = `@@-37,10` (comment) · `@@-89,0` (thêm param) · `@@-124` (truyền param) · `@@-245` (chữ ký private) · `@@-266,0 +270,21` (khối finalize MỚI) ⇒ **0 dòng nội-dung đổi** trong 3 vùng trên. ✅
- Submit-guard K2 / file K1: không có trong `git diff --name-only`. ✅
- **0 migration mới**: `git diff --name-only | grep -i migration` = **0**; `git status --porcelain -- src tests | grep '^??'` = **rỗng**. ✅
- Route/menu-row NGOÀI 8 `AwV2_KhkkN*`: DbInitializer thêm đúng 8 row; Layout thêm đúng 1 nhánh regex họ `AwV2_`. ✅
- Rào (v) chỉ ở CREATE — `UpdateContractSigningPlanCommandHandler` không chạm `ApprovalWorkflowId`/`ApprovalGroup` (0 hit trong thân) ⇒ không có lỗ update-lách. ✅
## §5 Test lane (mở ruột 2 test)
- **T-a `ApproveV2_CapMangCoKetThuc_ChotPhieuNgay_KhongTrinhTiepBuocSau`** (`ContractSigningPlanApprovalTests.cs:944-994`): đo hành-vi THẬT qua service. Sanity 3 vế TRƯỚC (`ShouldBeAt(ChoDuyet,1,2)` · `EndedByLevelFinalize=false` · `StepCountAsync == 3` kèm lý-do *"Cấp mang cờ KHÔNG được là cấp cuối — nếu là cấp cuối thì phiếu kết thúc ở CẢ HAI thế giới và test này xanh mà không chứng minh gì"* = **anti-tautology guard**). Đo SAU 5 trục: phase + 2 con-trỏ · cờ runtime · `ApprovedAmount` 3 dòng gồm ca `??=` giữ 300 · opinion signer. Kèm **chứng-nhân song sinh** `WitnessAtFlagLevel` bất động (cả cờ lẫn giá). ✅
- **T-e `CreateAwDefinition_LoaiKhkk_GiuNguyenCoKetThucTaiCap_KhongConEpFalse`** (`:1079-1104`): 3 vế — (i) tick ⇒ `true`; (ii) không tick ⇒ `false` (chặn "bật bừa"); (iii) **đối-chứng type khác** `DuyetNcc` cũng `true` ⇒ phân biệt "gỡ ép-false" với "đổi thành ép-true". Đi qua `CreateAwDefinitionCommandHandler` THẬT. ✅
- **0 đè test cũ**: `git diff -- tests/ | grep -c '^-[^-]'` = **2**, cả 2 là cùng một sửa cơ-học `TransitionAsync(..., CancellationToken.None)``(..., ct: CancellationToken.None)` (named-arg vì thêm param) — **không** nới assert nào.
## §6 FINDING (8)
**MAJOR**
- **F-1** `fe-{user,admin}/src/pages/khkk/KhkkWorkflowPanel.tsx:136-142`**opt-out `applyLevelFinalize` KHÔNG có tầng UI ⇒ trạm CEO chết ở 8/8 workflow seed.** Body POST là **literal đúng 2 field** `{action, comment}`; `grep applyLevelFinalize fe-*/src` = **0 hit** ở KHKK. Controller `ContractSigningPlansController.cs:213` `?? true` ⇒ mọi lượt Chương bấm "Duyệt" đều finalize. Seeder cắm cờ cho `chuong.phan`**cả 8** workflow ⇒ Step 3 «Ban Giám đốc» (`truong.nguyen`) **không đường nào tới**. **Đối-chứng chứng minh đây KHÔNG phải khuôn PE**: `fe-*/src/components/pe/PeWorkflowPanel.tsx:63` = `useState(false)` + `:259` LUÔN gửi tường minh ⇒ PE mặc-định **KHÔNG** kết-thúc-sớm (opt-in tại UI); KHKK mặc-định **LUÔN** kết-thúc-sớm. Lời owner OG-3/OG-9 (*"a Chương sẽ quyết định là cái đó cần CEO ko"*) **không thực thi được từ UI**. Kèm: comment `KhkkWorkflowPanel.tsx:15-17` khẳng định *"không có gì để panel render thêm"* — tiền-đề SAI, chính wave này vừa đẻ tham số để người duyệt quyết. Acceptance: thêm ô tick opt-out ở panel (mirror `PeWorkflowPanel.tsx:778`), HOẶC khai tường minh lên HANDOFF rằng "trình CEO" hiện chỉ làm được bằng admin bỏ cờ ở Designer.
- **F-2** `ApprovalWorkflowV2AdminFeatures.cs:387``fe-admin/src/pages/system/ApprovalWorkflowsV2Page.tsx:263` + `:1300-1310`**sweep ép-false bất-đối-xứng ⇒ tick bị NUỐT IM LẶNG.** FE gỡ khoá **cả 2** ô (gồm `allowApproverSkipToFinal`), BE **giữ** ép-false `SkipToFinal` cho type-10. Admin tick "Cho phép duyệt thẳng Cấp cuối" trên quy trình KHKK → CREATE lưu `false`, UI không báo gì. Đây đúng class mà comment vừa bị xoá đã cảnh báo (*"màn hình nói một đằng dữ liệu một nẻo"*), chỉ đảo chiều. **0 test phủ** (T-e chỉ đo `Finalize`). Acceptance: giữ `disabled` riêng ô SkipToFinal cho type-10, HOẶC bỏ ép-false BE + port nhánh.
- **F-3** `docs/STATUS.md:6`**DELTA đo được nhưng chưa khai.** Máy: `All` 56→**64** (+8); policies 224→**256** (+32); STATUS vẫn ghi "Policies **224** · Menu keys **56**". Spec cụm-1 vá-1 bắt "mỗi commit kèm lệnh đếm lại + cập nhật 2 row STATUS". **Tái phát y hệt** finding ④ của gate K1 cùng phiên.
**MINOR / khai-thật**
- **F-4** Suite **flake 1/3 lượt**: `dotnet test SolutionErp.slnx` lượt #1 `Failed: 1, Passed: 568``ContractSigningPlanCrudTests.DeleteContractSigningPlan_SoftDeletes_KeepsChangelog_ThenCreateAgainSucceeds` chết ở `KhkkFixture..ctor()` `:62` `EnsureCreated()``CallSiteRuntimeResolver`. Fixture có từ W2 ⇒ **không phải K3 đẻ**, nhưng câu "614/0 tươi" chỉ đúng 2/3 lượt — đừng khai trần.
- **F-5** `DbInitializer.cs:665` — seeder idempotent per-Code **thuần skip, 0 nhánh UPDATE**: roster đổi (người nghỉ / đổi phòng) ⇒ phải UPDATE tay trên prod. Cùng lớp seeder SP-002 ở K1.
- **F-6** `DbInitializer.cs:637-640``Description` khai *"Admin có thể chỉnh người/quyền tại chỗ hoặc tạo version mới"*: nửa sau đúng, nửa đầu **sai với cờ finalize**`ApprovalWorkflowV2AdminFeatures.cs:598-600` chặn đổi cờ, `:627-629` chặn bỏ người giữ cờ khi sửa tại chỗ. Chuỗi này hiển thị ra UI admin.
- **F-7** `ContractSigningPlan.cs:51` + `fe-*/src/types/khkk.ts:260``EndedByLevelFinalize` **được GHI nhưng chưa expose DTO** (chính FE type tự khai). Test T-a lý-giải *"FE/GĐ3 đọc cột này"* — hiện **chưa** ai đọc; ghost-window đã-khai, không phải bug, nhưng câu biện-minh mạnh hơn sự thật.
- **F-8** `ContractSigningPlanWorkflowService.cs:37-42` + `:335-337` — 2 lệnh grep tự-kiểm in ra **gồm cả chính dòng `///` doc** (`:336`, `:337`) ⇒ người chạy sau đếm 3 vs 5 rồi tưởng lệch. Nên nêu rõ "bỏ dòng `///` khi đếm".
## §7 Verdict
**PASS-WITH-FLAGS** — build 0W/0E · suite 614/0 (lượt tươi) · npm ×2 sạch; 5/5 điểm code-vs-spec khớp; 3/3 quyết-định lead ĐÚNG về kỹ-thuật; ranh giới sạch (0 mig, 0 đổi hành-vi vùng cấm, 0 route ngoài họ). **0 blocker kỹ-thuật**, nhưng **F-1 + F-2 là nợ HÀNH-VI**: F-1 làm mất đúng cái quyền quyết mà owner vừa chốt (OG-3/OG-9); F-2 tái tạo class "UI nói một đằng DB một nẻo" ở ô còn lại. F-3 là acceptance chưa đóng. Owner/lead quyết ship-rồi-vá hay vá-trước-ship.
END sub-reviewer-gate-k3 — TOTAL: 8 finding (3 MAJOR / 5 MINOR) · 0 blocker build-test · verdict PASS-WITH-FLAGS