diff --git a/.claude/WAL.md b/.claude/WAL.md index d26ed3a..e1c37f5 100644 --- a/.claude/WAL.md +++ b/.claude/WAL.md @@ -8,8 +8,9 @@ chain: [x] window-2 (S183 /tiep): verify 4-chân `706134da` PASS (bundle ×2 rotate + marker KhkkN1 + DLL 3-hit + 8-row IsActive=1/pin-lệch-0) — lead-solo khai lệch-có-lý-do [x] YC-016 slot(67) "(c) TAY CẦM PHIẾU": guard `EnsureApprovalAttachmentUploaderAsync` + wire Purpose-only + 8 test → suite 668/0 → SHIP `72568f05` → verify DLL prod `new-guard: 3` mtime 13:11:21 — verify: git log origin/main -1 --format=%h (=72568f05) [x] pause-2 nghi thức: PAUSE-2 land trước chèn (curator #1) + MIND-2 (curator SUA-6 → sửa cả 6) + marker + snapshot -[ ] acceptance MẮT-ANH prod đọc-only: 8 leaf "Duyệt KHKK — Nhóm n" ra panel khuôn DuyetNcc + dialog 9-ô theo D3=C — 🔴 KHÔNG bấm "Tạo phiên bản mới" trên prod (ratchet 1 chiều) -[ ] acceptance ĐỘNG local: seed 1 level cờ=true (A2-răng) + 1 phiếu ChoDuyet (T8) rồi đo +[x] acceptance MẮT-ANH: "Tạm OK" @YC-019(1) — YC-013/016 lật đóng +[x] acceptance ĐỘNG local @S185: A2-răng 2-tầng PASS (ô mờ hiện STATE THẬT DB=1, control-âm NV cùng cấp) + T8-động PASS (PUT-đổi-thật → 1 row changelog đúng shape; 3 echo-PUT = control-âm 0-row) + bonus guard-409 cờ-KẾT-THÚC sống runtime + revert sạch — verify: addendum `runs/2026-08-08-S182-khkk-awf-mirror-ncc/implement-synthesis.md` +[ ] 🆕 YC-021 còn thi công (W-3 ĐÃ ghi 500ms + goi-chot 4.3 PASS @S185): **W-2** build `ring5-audit` persona + wire 2-bookend · **W-4** kê NHÁP bảng thẩm-quyền owner-SỐ/owner-LUẬT + soạn 2 đề-xuất-ngược hub (trình anh duyệt bản kê) · **W-1** day-wake: 3 chạm canonical (tiep.md §0⑤(b) r-set · CLAUDE.md câu DUY-NHẤT · check-email 4→5 cửa) + thi công `/day` + dogfood + report hub — kèm workflow REVIEW riêng (Harness-9) [x] bookend @close ONE-SHOT @S185 (YC-018 lượt đầu): 9 vai + 5 máy MỘT MẠCH — harvest 698KB→17-khối/11-sổ+7-tệp+7-lane · trio 40Đ/4T-183-số · H24-deep 16-FLAG trả-nợ-19/15 (tally máy @59) · ring2 16Đ/0T · ring1 30Đ/3T · tooling PWF-6 · ctx-audit 8-FLAG + MIND-3 (mind-check 11/11) · vá-sau-verdict: STATUS-668 + HANDOFF-12-slug-khôi-phục + sổ-YC-lật + A1/A2/A3 + (k-ter)-máy-3 · probe-sau: deep 0/15 ok, over-cap 5→3 — verify: test -s .claude/workflows/runs/2026-08-09-S185-bookend-close/bookend-close-synthesis.md [ ] governance-vá + đóng sổ: CÒN gom nợ harvest 576.255B/18-lượt (uỷ-quyền slot 71) + STATUS/HANDOFF closeout + YC-013 lật đóng sau mắt-anh — ✅ @S185: orphan S182 ĐÓNG (`implement-synthesis.md` + 7/7 ô + 2-thước-im) · 3 site tự-quy-chiếu VÁ+verify (session-start:161-162 trỏ-enum thay chép-class · detectors.ps1 pre-marker-segment → 29 slug vào lưới EXIT=0 · HANDOFF:58 dòng-bổ-sung giữ ảnh-chụp) [x] YC-017 ĐÓNG @S185: P1-P4 trọn — wf_5d16a842-28e 7/7 lane (16D+3P-đúng-luật+1S-khai; +C-7 lead tự vá rơi ⇒ 21/21 disposition) + verify-lead 3/3 + synthesis land — verify: test -s .claude/workflows/runs/2026-08-09-S185-email-adap-pipeline/implement-synthesis.md · tồn: C-1-đợi-rider-jump(nợ-chưa-có-chủ F-L2-2) · C-6-quyết-nén-ring2 · 4W+5-SKIP-owner (trình anh cuối lượt) diff --git a/.claude/agent-memory/memory-budget.json b/.claude/agent-memory/memory-budget.json index 97f9e9d..c6ca57d 100644 --- a/.claude/agent-memory/memory-budget.json +++ b/.claude/agent-memory/memory-budget.json @@ -165,6 +165,8 @@ }, "honest_caveat": "v2 §5: large Tier-1 = HIGHER context-rot on the always-loaded part -- an accepted, deliberate trade-off (forgetting-work judged worse than rot), NOT 'rot disappears'. Small-context-window / light-workload projects may optimally pick a SMALLER Tier-1 -- the FLOOR is the ARCHITECTURE (hot-feed large + L2/L3 on-demand no-cap), not the numbers. 'No-cap' L2/L3 = no artificial tier-limit, still within the model context window." }, + "stop_point_cheap_ms": 500, + "_stop_point_cheap_owner_S185": "YC-021/W-3 2026-08-10 anh: 'W1,3,4 -> OK' tren de-xuat 500ms cua lead => nguong diem-dung-RE = 500ms (goi-chot 4.3 owner-SO). Moi so da do (machine-block ~140ms, secrets-sweep ~64ms, tien-kiem ~194ms, probe ~281ms) < 500 => 4.3 cham PASS.", "h24_title_freshness_sessions": 14, "_h24_title_freshness_owner_S185": "YC-020(2) 2026-08-10 anh nguyen van: 'dong y 14 ngay. (nhung cung theo phien luon vi co ngay lam ngay ko)' => nguong 14 don-vi PHIEN (dem tick counter-history giua 2 moc, KHONG wall-clock). Reader = governance-detectors.ps1 H24-1.", "h24_cadence": { diff --git a/.claude/agents/ring1-audit.md b/.claude/agents/ring1-audit.md index c258f9e..b7533d5 100644 --- a/.claude/agents/ring1-audit.md +++ b/.claude/agents/ring1-audit.md @@ -22,7 +22,7 @@ Mày là **cặp mắt độc-lập** trên số của `tooling-auditor` (H1) + ## Vì sao AUTO + fire khi nào - Owner S145: **AUTO sau đo, KHÔNG consent-gate.** H1+H2 chốt @session-end ⇒ mày tự chạy ngay sau. *(mệnh-đề so-sánh "khác trio/H24 gật-mới-chạy" GỠ @S152 — owner "vòng 1→5 auto"; ring1-close tự bắt trong persona chính mình, tái-phát lớp error-ledger:101)* -- 🔴 **KIỂM end-only: @open chỉ có diff-report, artifact authoritative (chốt/harvest/distill) ở close.** (D2 = COMMIT DEFER, owner-option (b) S145 · landing + lý-do đầy-đủ ở `.claude/commands/session-end.md` §L.b(g-bis)(vi) — B1, KHÔNG chép lý-do vào đây.) Với **mày** end-only là **TUYỆT-ĐỐI**: pin của mày (freshness-verdict 4-mặt **chốt** + harvest 5-trục) **chỉ sinh ở close**; @`session-start` H1/H2 chỉ **báo-diff** ⇒ không có artifact authoritative nào để chấm ⇒ **CẤM tự chạy ở open** dù thấy H1/H2 có vết mở-phiên. +- 🔴 **AUTO = @close (artifact authoritative: chốt/harvest/distill sinh ở close).** (D2 = COMMIT DEFER, owner-option (b) S145 · landing + lý-do đầy-đủ ở `.claude/commands/session-end.md` §L.b(g-bis)(vi) — B1.) **@open = CHỈ KHI LEAD ĐÍCH-DANH GIAO** và H1/H2 @open ĐÃ có artifact (diff-report): chấm được, nhưng verdict **PHẢI mang nhãn `@open — chấm diff-report, KHÔNG phải bản chốt`** (khai nấc, đừng bán thành freshness-chốt). CẤM tự-ý chạy @open khi không được giao. 🧊 *Bản cũ ghi "CẤM tự chạy ở open" TUYỆT-ĐỐI — thối 6 phiên so vận-hành thật (lead giao @open S159→S182 đều có artifact 30-40KB giá-trị thật, ctx-audit F-3 @S185 bắt "mồi hoạt-động hoàn-hảo mà không ai có nghĩa-vụ SỬA"); vá @S185 = hợp-lệ-hoá bằng CHỮ đúng cái đang chạy, giữ ranh AUTO-chỉ-@close.* - 🔴 **Fail-safe:** H1/H2 KHÔNG chạy phiên đó (vd `/tiep` skip session-start/end) ⇒ pin input missing ⇒ **NO-OP im-lặng** ("không có measure → không có gì chấm"). **Auto ≠ chạy-mù.** CẤM bịa verdict ĐẠT khi không có input. - **Tuần-tự (C4b):** mày chạy ở invocation **SAU** con-đo — bằng-chứng `mtime(output mày) > mtime(output H1/H2)`. KHÔNG chạy song song với H1/H2 (chấm bản chưa-xong = vô-nghĩa). diff --git a/.claude/launch.json b/.claude/launch.json new file mode 100644 index 0000000..4611114 --- /dev/null +++ b/.claude/launch.json @@ -0,0 +1,17 @@ +{ + "version": "0.0.1", + "configurations": [ + { + "name": "api", + "runtimeExecutable": "dotnet", + "runtimeArgs": ["run", "--project", "src/Backend/SolutionErp.Api", "--urls", "http://localhost:5443"], + "port": 5443 + }, + { + "name": "fe-admin", + "runtimeExecutable": "npm", + "runtimeArgs": ["run", "dev", "--prefix", "fe-admin"], + "port": 8082 + } + ] +} diff --git a/.claude/workflows/runs/2026-08-08-S182-khkk-awf-mirror-ncc/implement-synthesis.md b/.claude/workflows/runs/2026-08-08-S182-khkk-awf-mirror-ncc/implement-synthesis.md index 19ba104..677111d 100644 --- a/.claude/workflows/runs/2026-08-08-S182-khkk-awf-mirror-ncc/implement-synthesis.md +++ b/.claude/workflows/runs/2026-08-08-S182-khkk-awf-mirror-ncc/implement-synthesis.md @@ -28,3 +28,13 @@ ## Trạng thái sổ YC-013 **mở** (code+deploy+verify XONG — chờ acceptance-mắt-anh rồi lật) · YC-014 đóng · YC-015 đóng · YC-016 mở-đã-verify (chờ lật cùng đợt). Orphan sàn-3 ① của run này **ĐÓNG tại file này**. + +## ADDENDUM @S185 (2026-08-10) — Acceptance ĐỘNG local (A2-răng + T8) — PASS + +Seed local `SolutionErp_Dev`: cờ `AllowApproverEditDetails=1` trên approver `620B968B` (N1 B1C1) + phiếu `KHKK-LOCAL-A2T8` Phase=ChoDuyet grp=1 pin N1. Đo qua API http:5443 + FE dev :8082 (JWT inject localStorage 3-key). + +- **A2-răng 2 tầng PASS:** (data) API overview type-10 trả đủ 8 nhóm qua `history`, approver seed `allowApproverEditDetails=True`, 2 approver cùng cấp False = control-âm · (hiển-thị) dialog "Sửa tại chỗ — KHKK-N1 v01": ô #4 Drafter tick-disabled default-true · **ô "Sửa Section 2" TICK+disabled = STATE THẬT từ DB, không hard-code** · NV#2 cùng cấp untick toàn bộ · ô #7 "KẾT THÚC" là ô sống duy nhất — khớp từng chữ D3=C + rule-box tự khai "ô vẫn hiển thị đúng giá trị đang lưu". +- **T8-động PASS:** PUT đổi-tên (change thật) → 204 → **1 row `ContractSigningPlanChangelogs`** đúng shape {act=Update · etype=Workflow · PhaseAtChange=ChoDuyet · UserName=Administrator · Summary "Sửa quy trình duyệt tại chỗ: KHKK-N1 v1 (giữ nguyên phiên bản)" · ContextNote=lý-do}. **Control-âm tự nhiên:** 3 PUT echo-no-change trước đó → 204 + 0 row (`changes.Count>0` gate đúng — không rác changelog). +- **Bonus guard-409 runtime:** tick cờ "Duyệt là KẾT THÚC" qua sửa-tại-chỗ → **409 Conflict** đúng rule-box ("đổi cờ đó ⇒ phải Tạo phiên bản mới") — guard sống ở runtime, không chỉ unit. +- **2 thước-hỏng tự bắt:** (i) selector `[role=dialog]` không match component thật → đọc nhầm "dialog CLOSED" khi đang mở; (ii) slot "+ Thêm NV" auto-pick bị dedup loại → 2 PUT "đổi" thực chất echo — suýt phán T8-FAIL oan trước khi soi `changes.Count` gate + đếm B3C1. +- Revert trọn: tên + cờ + phiếu + changelog test đã xoá; 2 server preview dừng. Vite-proxy note: API dev phải nghe **http**:5443 (`--urls`) — proxy không nói https. diff --git a/docs/governance/adap-reports/2026-07-19-Governance-goi-chot-owner-nam-khoan.md b/docs/governance/adap-reports/2026-07-19-Governance-goi-chot-owner-nam-khoan.md index eaedef8..19fb752 100644 --- a/docs/governance/adap-reports/2026-07-19-Governance-goi-chot-owner-nam-khoan.md +++ b/docs/governance/adap-reports/2026-07-19-Governance-goi-chot-owner-nam-khoan.md @@ -96,3 +96,7 @@ - **4.4 máy-quét lời-hứa-máy ĐÃ DỰNG:** `scripts/loi-hua-may-scan.ps1` (30.223 B, lane7 run `2026-08-09-S185-email-adap-pipeline` — self-test 11/11 PASS, fault-inject 3 ca cây tạm + control dương, 759ms). Mẫu-số ĐO LẠI = **30 dòng** (không phải 19 của C6 @S144 — cùng regex chạy 08-09; đúng lời khoản "mẫu-số công bố" phải tươi), 0 dòng `violation-open`. Nợ còn: ~~cửa gọi~~ ✅ cắm @S185 vào `session-end §L.b(k-ter)` (máy thứ 3). - **4.2 vế "tier-qua-resume CHƯA ĐO"** → ĐÃ ĐO @S185 (lane5 C-9, addendum riêng nếu có — xem `sub-opus-lane5-measure.md`). - 4.3 vẫn chờ owner-SỐ (W-3 — đã re-surface vào khối chờ-anh @S185 sau 15 ngày rơi). + +## ADDENDUM-3 @S185 — 4.3 CHẤM ĐƯỢC RỒI: PASS (block mới, row cũ giữ) + +Owner đặt ngưỡng "điểm dừng RẺ" = **500ms** (YC-021/W-3, key `stop_point_cheap_ms` + nguyên văn trong `memory-budget.json`). Mọi số đã đo đều dưới: machine-block ~140ms · secrets-sweep ~64ms · tien-kiem ~194ms · nhip-no-probe ~281ms ⇒ **4.3 = PASS**. Vế "KÉP executed·verified-pending" của row cũ hết hiệu lực từ 08-10. diff --git a/docs/governance/so-yeu-cau-chu-du-an.md b/docs/governance/so-yeu-cau-chu-du-an.md index 29d419d..39a7440 100644 --- a/docs/governance/so-yeu-cau-chu-du-an.md +++ b/docs/governance/so-yeu-cau-chu-du-an.md @@ -48,7 +48,8 @@ Dữ-liệu cũ (WAL · HANDOFF · auto-memory · migration-todos) **KHÔNG** đ | `YC-015` | "làm nốt cho ra giao diện luôn nhé" *(qua `/tiep` @S183)* | 2026-08-08 · S183 | đóng | — | WAL chain `[x]` cicd-4-chân | Verify deploy `706134da` cho giao diện 8 panel SỐNG trên prod — 4/4 chân PASS (bundle ×2 rotate + marker + DLL 3-hit + 8-row IsActive=1 + pin-lệch 0) | **`YC-013`** | | `YC-016` | "1 -> (c) THEO TAY CẦM PHIẾU -> OK nhé" | 2026-08-08 · S183 | **đóng** *(verify-DLL @S183 + RE-verify @S185 + acceptance "Tạm OK" @S185/YC-019(1) — lật cùng đợt YC-013)* | 1 | ship `72568f05` + WAL chain (TASK → WAL) | **Phán quyết slot (67)** treo từ S172: upload file-khi-duyệt KHKK theo TAY CẦM PHIẾU — phiếu Nháp/Trả-lại (tay người soạn) ⇒ NGƯỜI SOẠN up được; phiếu Chờ-duyệt ⇒ CHỈ NGƯỜI DUYỆT (thuộc workflow phiếu); guard ở API-layer (#82 2-tầng), kèm test. Slot (67) ĐÓNG | | | `YC-017` | "AI_INFRA và /adap-apply — Cho /fable-real invest và review checklist cẩn thận sau đó cho Opus 5 MAX xử lý" *(args lệnh `/check-email` @S185)* | 2026-08-09 · S185 | **đóng** *(pipeline P1→P4 trọn @S185: 0/39 nợ per-id · 21/21 item disposition; 4 câu W phát sinh → khối CHỜ-ANH riêng, không giữ YC mở)* | 1 | `runs/2026-08-09-S185-email-adap-pipeline/implement-synthesis.md` | Kéo thư AI_INFRA CẢ 2 kênh (`outbox/se` qua check-email + `outbox/all` qua adap-apply), rồi pipeline khuôn YC-013: `/fable-real investigator-codebase` soi trạng-thái thư/adopt + dựng checklist → `/fable-real reviewer` review checklist cẩn thận → hmw fan-out **Opus 5 MAX** execute. *(Thư 08-08 đã áp trọn @S185 TRƯỚC lệnh này — pipeline chạy trên phần việc CÒN LẠI mà invest tìm ra.)* | | -| `YC-020` | "1 -> OK, 1 phiên. · 2 -> đồng ý 14 ngày. (nhưng cũng theo phiên luôn vì có ngày làm ngày ko). · 3 -> OK · 4 -> OK · 5 -> OK đông ý." *(trả lời 5 khoản SKIP-owner)* | 2026-08-10 · S185 | **mở** | 1 | WAL chain (TASK → WAL) | (1) fold C13/C14/C15 vào TOTAL sau **1 phiên nền** (S185 = nền — sửa code giờ, lần chạy kế tự vào TOTAL) · (2) ngưỡng title-freshness = **14 PHIÊN** (KHÔNG phải ngày — anh chỉ rõ "có ngày làm ngày ko" ⇒ đo bằng nhãn-phiên/counter, khớp luật H24 "khoảng đo từ counter không từ đồng-hồ") · (3) V5 bao-cao-cuoi: KHÔNG sửa file đã gửi — đính chính 1 dòng trong THƯ KẾ gửi hub · (4) mở detector C13 canh thêm lưới trio · (5) GIỮ neo-glyph (không đổi quy ước heading) | | +| `YC-021` | "W1,3,4 -> OK, W2 thì đồng ý thêm 1 nghi thức ko vấn đề" | 2026-08-10 · S185 | **mở** | 1 | WAL chain (TASK → WAL) | Cả 4 W GẬT: **W-1** thi công day-wake (3 chạm canonical + `/day` + dogfood + report hub, kèm REVIEW riêng) · **W-2** BUILD `ring5-audit` SE-form (vai kiểm nghi-thức — "thêm 1 nghi thức ko vấn đề") · **W-3** ngưỡng "điểm dừng RẺ" = 500ms (em đề, anh OK) · **W-4** em kê NHÁP bảng thẩm-quyền owner-SỐ/owner-LUẬT + soạn 2 đề-xuất-ngược gửi hub, anh duyệt bản kê | | +| `YC-020` | "1 -> OK, 1 phiên. · 2 -> đồng ý 14 ngày. (nhưng cũng theo phiên luôn vì có ngày làm ngày ko). · 3 -> OK · 4 -> OK · 5 -> OK đông ý." *(trả lời 5 khoản SKIP-owner)* | 2026-08-10 · S185 | **đóng** *(5/5 thi hành @S185 commit `2a5290a8`: fold-3-detector + ngưỡng-14-PHIÊN [2 flag thật fire ngay] + đính-chính-thư-kế ghi nợ + grid-c-trio + giữ-neo-glyph)* | 1 | WAL chain (TASK → WAL) | (1) fold C13/C14/C15 vào TOTAL sau **1 phiên nền** (S185 = nền — sửa code giờ, lần chạy kế tự vào TOTAL) · (2) ngưỡng title-freshness = **14 PHIÊN** (KHÔNG phải ngày — anh chỉ rõ "có ngày làm ngày ko" ⇒ đo bằng nhãn-phiên/counter, khớp luật H24 "khoảng đo từ counter không từ đồng-hồ") · (3) V5 bao-cao-cuoi: KHÔNG sửa file đã gửi — đính chính 1 dòng trong THƯ KẾ gửi hub · (4) mở detector C13 canh thêm lưới trio · (5) GIỮ neo-glyph (không đổi quy ước heading) | | | `YC-019` | "1 -> Tạm OK · 2 -> Role baseline + Runs · 3,4 -> giải thích · 5 -> OK kéo audit luôn giờ cứ end/start là cứ chạy · 6 -> Nợ cũ thì xử lý cho xong luôn" | 2026-08-10 · S185 | **đóng** *(6/6 vế thi hành @S185: (1) YC-013/016 đóng · (2) ring2 24.859B · (3)(4) đã giải thích → anh phán tiếp = YC-020 · (5) deep_every=1 · (6) nợ cũ đóng trọn)* | 1 | WAL chain (TASK → WAL) | 6 phán quyết một lượt: (1) acceptance 8-panel TẠM-OK ⇒ lật YC-013/016 nấc "tạm" · (2) C-6 = NÉN `Role baseline`+`Runs` của ring2 (khuôn moved-not-cut như lead-stale) · (3)(4) em giải thích W-1..W-4 + 5 SKIP-owner, chưa phán · (5) 🔴 ĐỔI NHỊP DEEP: từ nay **mỗi bookend end/start đều chạy deep** (deep_every → 1, hết chờ nhịp 15) · (6) uỷ quyền xử TRỌN nợ cũ theo bậc-2 LT3 (chọn nhánh an toàn + khai, việc-vật-lý-của-anh thì kê rõ) | | | `YC-018` | "2 phần bookend và bookstart -> trong đợt adapt này AI_INFRA cũng có hướng dẫn bọn mày chạy 1 mạch hết toàn bộ ko còn pause/tiep nữa, chú ý cấu hình cái đó kỹ nhé" | 2026-08-09 · S185 | **đóng** *(cấu hình land 4 site @S185 + chạy thật trọn 1 mạch bookend @close cùng đêm — nghiệm bằng vận hành)* | 1 | WAL chain (TASK → WAL) | Nghi-thức 2 đầu phiên (`/session-start` bookstart + `/session-end` bookend) phải chạy **TRỌN TRONG MỘT LƯỢT** như hub kể ở thư 08-08 Phần 1b ("lượt mở phiên gần nhất chạy trọn trong một lượt duy nhất, không cần cửa tạm dừng nào chen giữa") — cấu hình luật ONE-SHOT vào 2 file lệnh, CẤM rải nghi-thức qua nhiều cửa pause/tiep, CẤM hẹn-cửa-sau. *(Đội hiểu: pause/tiep VẪN là recovery khi đứt bất-khả-kháng [limit/crash — H22 giữ nguyên]; thứ bị cấm là DÙNG chúng làm nhịp chia-chặng nghi-thức. Anh bác cách hiểu này thì em sửa.)* | |