[CLAUDE] Infra: W0 pre-flight - gitattributes EOL san-chung + hook rebase-interlock + FIX #3-bis 4-ca
W0.1 .gitattributes theo CLASS (khong va theo duoi-file-vua-can):
- `* text=auto eol=lf` = san chung. core.autocrlf=true @system lat LF->CRLF luc checkout;
attr nay ep blob LF + worktree LF, DOC-LAP autocrlf.
- Khai binary TUONG-MINH 13 duoi (zip/exe/dll/docx/xlsx/pptx/pdf/png/jpg/jpeg/ico/woff/woff2)
thay vi pho-thac heuristic NUL-byte-8000-dau: .docx "gay" co the lot thanh text -> mangle
OOXML -> hong file KHONG cuu duoc. Do that: repo co 19 binary (12 docx + 6 png + 1 xlsx).
- .svg = XML -> CO Y giu text. Giu 2 rule cu (broadcasts/** + *.sh) tuong-minh.
- Fault-inject chung rule CO RANG: go `*.docx binary` -> git coi .docx la `text: auto` (nguy
hiem that); khoi phuc -> `text: unset`. 19/19 binary co attr/-text.
- Acceptance PASS: agents/reviewer.md unspecified -> text:auto eol:lf.
W0.2 scoped-only (vacuous, KHAI THAT):
- scope-gate (agents+commands+skills) = 0 DA XANH SAN truoc khi lam gi -> KHONG tinh la thanh-tuu.
- repo-wide 188 (131 Migrations + 57 con lai) = INFORM-only. CAM mass rm+checkout phien nay.
- `git add --renormalize --dry-run .` = 0 file dirty; `git diff --cached --stat` = rong.
W0.3 hook rebase-interlock (anh ky S119 fix#8b = TRONG KHUNG, khong can adap-request):
- wal-flush.ps1: `if (Test-Path .git/rebase-merge -or .git/rebase-apply) { exit 0 }`.
- Dat SAU Set-Location $root, KHONG phai dau file: dat truoc thi Test-Path soi nham CWD.
- Chung RANG 2 CHIEU tren cay tam: (a) khong rebase-state -> hook VAN commit (guard khong
over-fire, WAL persist con song); (b) co rebase-state -> 0 commit, exit 0, worktree GIU dirty.
- Pure-ASCII giu nguyen (gotcha #30). Do lai bang tr sau khi phat hien `grep -P` false-pass
(loi locale -> output rong -> wc -l dem 0 = grep CHET, khong phai sach).
FIX #3-bis (MOI, ghi vao v3-PATCH) - dieu-kien re nhanh W0.3 test SAI THU:
- v2:92 re nhanh bang `NONWAL==0`; luat fix#3(c) noi phai test "wal: o DAY range". Hai thu khac nhau.
- Fault-inject 4 cay tam chung diem re o ca2 (shape base|wal:|[CLAUDE], NONWAL=1, day=wal:):
v2 -> nhanh-B REBASE; v3bis -> reset--soft. Chay that nhanh-B tren ca2: REBASE-EXIT=0 KHONG
crash, nhung commit gop THUA KE message "wal: flush 1" -> push-guard n=1 -> chan push ->
re-squash cung logic -> van "wal:" -> STOP VINH VIEN. Deadlock XAC NHAN bang thuc nghiem.
- +ca(0) MOI v2/v3 khong liet: K=0 range RONG (S119 da push 4727d16) -> NO-OP commit thang.
- 4 ca: (0) K=0 NO-OP · (1) day=wal: NONWAL=0 · (2) day=wal: NONWAL>0 -> (1)+(2) CUNG xu-ly
reset--soft origin/main CAM rebase · (3) day=commit-thuong -> rebase+fixup OK.
- Ca fire hom nay = ca(0). Commit-chot nay dat day range = commit thuong -> moi wal: sinh sau
deu roi vao ca(3) an-toan. Dung y do fix#3(a).
WAL reconcile (/tiep S120): ground-truth thang WAL 3 cho - (1) 7 broadcast "UNTRACKED co y"
da tracked+pushed trong 4727d16, W0.3 khong con viec gop; (2) "K troi 10->11" -> thuc te K=0
range RONG; (3) fix#8 tick mau-thuan -> owner-decisions xac nhan DA KY, gate-blocker=0.
0 prod-code, 0 migration, 0 FE, 0 test-change.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
@ -1,23 +1,22 @@
|
||||
# WAL — auto-generated, không sửa tay
|
||||
updated: 2026-07-15T11:05 | session: S119 | branch: main
|
||||
goal: Adopt 6 broadcast AI_INFRA (H23 · H24 · H22-wal-defect 5-sàn · H22-push-guard · EOL/CRLF · owner-sign). Anh chốt DỪNG TẠI SPEC v3 — wave chạy phiên sau. Pipeline đã xong: check-email→invest→spec→review→fable-real-gate→v3.
|
||||
updated: 2026-07-15T11:32 | session: S120 | branch: main
|
||||
goal: Adap 6 broadcast AI_INFRA (H23 · H24 · H22-wal-defect 5-sàn · H22-push-guard · EOL/CRLF · owner-sign). Spec v3 CHỐT (GO-WITH-FIXES · fix#8 anh ký · gate-blocker=0). Phiên này = CHẠY WAVE W0→W6. Đọc v2 làm thân + v3-PATCH thay-thế; v1 CẤM CHẠY.
|
||||
|
||||
chain:
|
||||
[x] check-email AI_INFRA — 7 copy verbatim hash 7/7 + tamper 4/4 MATCH; 6 broadcast mới (outbox/all)
|
||||
[x] Đo phơi-nhiễm: 57 wal: lọt remote (0/57 ở đuôi = TẤT CẢ bị-kẹp; §5.0 cố-ý chỉ-đuôi) · autocrlf=true@system · 188 EOL · agent 0-CR + 12/12 block-scalar · BƯỚC 0.7 "trống⇒sạch" = Sàn-3 lỗi sống
|
||||
[x] wf: invest 5-lane wf_1f6bd5e2-478 (5/5 clean) → 5 sub-investigator-codebase-{A..E}.md
|
||||
[x] Lead soi hub trực-tiếp → lead-evidence-hub-inspect.md (hub PIN 17/17 opus-4-8 vs SE inherit; hub giữ 1 wal: lọt, KHÔNG dọn; E-029/E-030)
|
||||
[x] Spec v1 → wf: review 4-lane wf_78a84f9b-03e → R2 FAIL(4C+8M) + R3 FAIL(5C+6M); R1/R4 chết-#53 (transcript có, verdict rơi)
|
||||
[x] Spec v2 (vá 16/23) → wf: fable-real gate wf_cb964f83-331 → GO-WITH-FIXES + 8 fix + 2 honesty-C
|
||||
[x] Spec v3-PATCH — đóng 3 STILL-BROKEN + 3 PARTIAL + 1 REGRESSED + bảng disposition 23 dòng
|
||||
[ ] anh ký fix#8: (a) PA-2 hình-thức PA-2a+PA-2b [neo-tại-spawn bất-khả: param chỉ nhận alias — CHƯA thử full-id] · (b) hook-interlock TRONG-khung vs floor N.2
|
||||
[ ] wave W0→W6 chạy THẬT (đọc v2 + v3-PATCH; v1 CẤM CHẠY) — W0 SOLO, cần RESTART ×2 → trải ≥3 phiên CLI
|
||||
[ ] push (🔴 squash→count→push CHAINED 1 LƯỢT; K tính runtime, CẤM hardcode) → adap-report ×4 + adap-request R1-R4 + send-email AI_INFRA
|
||||
[x] S119 điều-tra: check-email → invest 5-lane → spec v1 → review 4-lane → fable-real gate → v3-PATCH → anh ký fix#8 → commit-chốt 4727d16 ĐÃ PUSH (7 broadcast + 14 file run-folder now TRACKED)
|
||||
[x] S120 /tiep reconcile: ground-truth thắng WAL 3 chỗ (xem GT bên dưới) + vá v3-GAP → FIX #3-bis ghi vào v3-PATCH (4 ca, test ĐÁY range)
|
||||
[!] W0 SOLO — W0.0 re-measure [đo 11:30: K=0 NONWAL=0 porcelain=0] → W0.1 gitattributes → W0.2 scoped-only → W0.3 [4-ca] reset--soft + hook-interlock + commit-chốt CÙNG 1 TURN → W0.4 README:52 → W0.5 git-log-%cI → W0.6 spawn-probe CRLF + RESTART
|
||||
[ ] W1 (3 lane) + W1b spawn-model-audit.ps1 → W2 GỘP-1-COMMIT (hmw.js 5 hạng-mục + 4 cờ wrapper + 2 agent MỚI + h24_cadence + .session-counter + STATUS Sub-agents 12→14 + row Policies) + RESTART
|
||||
[ ] W3 SERIAL 5 file (tiep §0 → session-start → session-end → fable-clone → agents/README) → W4 detector-fire (PHẢI in permission-matrix/SKILL.md TRƯỚC vá) → W5 harness-11-engine
|
||||
[ ] W6 push (🔴 squash→count→push CHAINED 1 LƯỢT; K tính runtime, CẤM hardcode) → adap-report ×4 + adap-request R1-R4 + send-email AI_INFRA + stamp-mark
|
||||
|
||||
[x] anh ký fix#8 (a) PA-2=PA-2a+PA-2b [stamp; tiền-đề "param chỉ nhận alias"=đọc-doc CHƯA-thử-full-id, giữ nấc khi báo hub] (b) hook-interlock=TRONG-KHUNG [thu-hẹp≠đổi-cơ-chế; side-ref VẪN vượt-khung] → gate-blocker = 0
|
||||
🔴 GT (ground-truth S120 @/tiep — 3 chỗ WAL S119 đã STALE, ĐÃ reconcile):
|
||||
(1) "7 broadcast UNTRACKED cố ý → GỘP vào commit-chốt W0.3" = XONG RỒI ở 4727d16 (commit+push). W0.3 KHÔNG còn việc gộp.
|
||||
(2) "K trôi 10→11" = squash+push đã chạy 11:20:29 → K=0, range RỖNG, git status sạch tuyệt-đối.
|
||||
(3) fix#8 tick mâu-thuẫn (dòng 13 `[ ]` vs 17 `[x]`) → owner-decisions §ACK xác nhận ĐÃ KÝ → gate-blocker=0.
|
||||
🔴 v3-GAP ĐÃ VÁ (FIX #3-bis trong v3-PATCH): v2:92 rẽ nhánh bằng `NONWAL==0` = SAI THỨ; đúng = test ĐÁY range. 4 ca: (0) K=0 RỖNG → NO-OP commit thẳng [ca MỚI, v3 không liệt] · (1) đáy=wal: & NONWAL=0 · (2) đáy=wal: & NONWAL>0 → (1)+(2) CÙNG xử-lý reset--soft origin/main, CẤM rebase · (3) đáy=commit-thường → rebase+fixup OK.
|
||||
🔴 Hook wal-flush.ps1:7 phủ ĐÚNG 3 path (.claude/WAL.md · agent-memory/ · workflows/runs/) — KHÔNG phủ broadcasts/ · KHÔNG phủ .gitattributes/scripts/docs. ⇒ MỖI lần ghi WAL = +1 `wal:` ở ĐÁY range ⇒ W0.3 PHẢI re-đo NGAY trước reset (K=0 lúc 11:30 là ảnh-chụp, KHÔNG phải hằng-số).
|
||||
🔴 RESTART ×2 (W0.6 + post-W2) ⇒ wave trải ≥3 phiên CLI ⇒ nối bằng /tiep (fix #9j).
|
||||
|
||||
🔴 v3-GAP tự bắt @đóng phiên (VÁ TRƯỚC KHI CHẠY W0.3): điều-kiện rẽ nhánh v3 test `NONWAL==0` là SAI THỨ — luật fix#3(c) nói "wal: ở ĐÁY range → reset --soft origin/main". 3 ca đúng: (1) đáy=wal: & NONWAL=0 → reset--soft HEAD~K [=origin/main] (2) đáy=wal: & NONWAL>0 → reset--soft origin/main re-commit, CẤM rebase (3) đáy=commit-thường → rebase+fixup OK. Ca (2) hiện bị v3 đẩy nhầm sang nhánh-B rebase.
|
||||
🔴 7 broadcasts/inbox/*.md = UNTRACKED CỐ Ý (hook chỉ phủ 3 path, KHÔNG phủ broadcasts/) — commit chúng BÂY GIỜ sẽ làm NONWAL=1 → ép W0.3 vào nhánh-B. → GỘP vào commit-chốt W0.3 (fix#3a). Mất thì `/check-email` tái tạo (byte-copy hub, hash-verified).
|
||||
|
||||
next: chạy W0 SOLO (W0.0 re-measure → W0.1 gitattributes → W0.2 scoped-only → W0.3 [VÁ v3-GAP trước] reset--soft + hook-interlock + commit-chốt GỘP 7 broadcast, CÙNG 1 TURN → W0.4 README:52 → W0.5 git-log-%cI KHÔNG mtime → W0.6 spawn-probe CRLF + RESTART) → W1/W1b/W2/W3/W4/W5 → W6 push
|
||||
verify: K=$(git rev-list --count origin/main..HEAD) ; NONWAL=$(git log --format='%s' origin/main..HEAD | grep -vc '^wal:') ; git log --format='%s' origin/main..HEAD | tail -1 [đáy range = wal: hay không → quyết nhánh] ; ls .claude/workflows/runs/2026-07-15-S119-adap-6-broadcast/ = 14 file
|
||||
next: W0.1 `.gitattributes` (+`* text=auto eol=lf` + khai binary THẬT, GIỮ 2 rule cũ broadcasts/**+*.sh; CẤM vá theo đuôi-file-vừa-cắn) → W0.2 scoped-only (CẤM mass rm+checkout 188) → W0.3 [4-ca + interlock + commit-chốt CÙNG TURN] → W0.4 → W0.5 → W0.6 RESTART
|
||||
verify: K=$(git rev-list --count origin/main..HEAD) ; NONWAL=$(git log --format='%s' origin/main..HEAD | grep -vc '^wal:') ; git log --format='%s' origin/main..HEAD | tail -1 [đáy range → quyết ca 0/1/2/3] ; git check-attr text eol -- .claude/agents/reviewer.md [W0.1 → text:auto eol:lf] ; ls .git/rebase-merge [PHẢI absent]
|
||||
|
||||
@ -4,6 +4,12 @@
|
||||
try {
|
||||
$root = if ($env:CLAUDE_PROJECT_DIR) { $env:CLAUDE_PROJECT_DIR } else { "." }
|
||||
Set-Location $root
|
||||
# INTERLOCK rebase-state (S120 W0.3). Dang rebase/mid-surgery => HEAD co the DETACHED.
|
||||
# Commit len detached HEAD = mo-coi commit khi `rebase --abort` => MAT VIEC (R3 fault-inject chung minh).
|
||||
# Guard nay THU HEP hook, KHONG them hanh-vi: no chan hook TU-HUY chinh floor N.2 ma no phuc-vu
|
||||
# (anh ky S119 fix#8b = TRONG KHUNG, khong can adap-request).
|
||||
# !! Dat SAU Set-Location: dat truoc thi Test-Path soi nham CWD (hook chay tu thu-muc bat-ky).
|
||||
if ((Test-Path ".git/rebase-merge") -or (Test-Path ".git/rebase-apply")) { exit 0 }
|
||||
$paths = @(".claude/WAL.md", ".claude/agent-memory/", ".claude/workflows/runs/")
|
||||
$cand = @()
|
||||
foreach ($p in $paths) {
|
||||
|
||||
@ -82,6 +82,37 @@
|
||||
|
||||
---
|
||||
|
||||
# FIX #3-bis 🔴 — Điều-kiện rẽ nhánh W0.3 test SAI THỨ (S120 `/tiep` — lead tự bắt @đóng S119, +1 ca mới)
|
||||
|
||||
**Lỗi:** v2 W0.3 (`:92`) rẽ nhánh bằng `if [ "$NONWAL" -eq 0 ]`. Nhưng luật **fix#3(c)** ở trên nói điều-kiện là *"`wal:` ở **ĐÁY range**"* — **hai thứ khác nhau**. `NONWAL>0` **không** hàm ý đáy là commit-thường: shape `base + wal + [CLAUDE]` có `NONWAL=1` **và** đáy = `wal:` ⇒ v2 đẩy sang **nhánh-B rebase** ⇒ todo đầu = `pick wal:` ⇒ `wal:` **sống sót** ⇒ `n>0` tại §5.2 ⇒ **đúng deadlock mà fix#3 sinh ra để đóng**.
|
||||
|
||||
**+ ca (0) MỚI (S120 đo thật):** S119 đã commit-chốt `4727d16` **và push** ⇒ `K=0`, range **RỖNG** ⇒ **không có đáy để test**. v2/v3 **không liệt ca này**; `NONWAL=0` sẽ đẩy vào nhánh-A ⇒ `git reset --soft HEAD~0` = **no-op vô hại nhưng vô-nghĩa**, và assert `HEAD~K == origin/main` vẫn PASS (vacuous). Không chết, nhưng **che mất** việc W0.3 lúc đó chỉ còn là *commit thẳng*.
|
||||
|
||||
**⇒ Điều-kiện đúng = 4 ca, test ĐÁY range (KHÔNG test NONWAL):**
|
||||
|
||||
```bash
|
||||
K=$(git rev-list --count origin/main..HEAD)
|
||||
BOTTOM=$(git log --format='%s' origin/main..HEAD | tail -1) # rỗng khi K=0
|
||||
|
||||
if [ "$K" -eq 0 ]; then
|
||||
: # ca (0) RỖNG → NO-OP. Không reset, không rebase. Commit thẳng.
|
||||
elif printf '%s' "$BOTTOM" | grep -q '^wal:'; then
|
||||
[ "$(git rev-parse HEAD~$K)" = "$(git rev-parse origin/main)" ] || { echo "ABORT: HEAD~K != origin/main"; exit 1; }
|
||||
git reset --soft "HEAD~$K" # ca (1) NONWAL=0 · ca (2) NONWAL>0 — CÙNG một xử-lý, CẤM rebase
|
||||
else
|
||||
trap 'git rebase --abort' ERR # ca (3) đáy = commit-thường → rebase+fixup an-toàn
|
||||
GIT_SEQUENCE_EDITOR=<script> git rebase -i origin/main
|
||||
fi
|
||||
if [ -d .git/rebase-merge ] || [ -d .git/rebase-apply ]; then # fix #7 — guard đúng cú-pháp
|
||||
echo "STOP: rebase state left behind"; exit 1
|
||||
fi
|
||||
```
|
||||
🔴 **Ca (1) và (2) GỘP:** một khi đáy là `wal:`, `reset --soft` tới `origin/main` là đúng cho **cả hai** — `NONWAL` không đổi cách xử-lý, nên nó **không được** là biến rẽ nhánh. Đây là chỗ v2 lạc.
|
||||
|
||||
**Acceptance:** fault-inject 4 cây tạm (`K=0` · `base+wal×2` · `base+wal+[CLAUDE]` · `base+[CLAUDE]+wal`) ⇒ chọn đúng **ca 0/1/2/3**; ca (2) **KHÔNG** được chạm `git rebase`; mọi ca `ls .git/rebase-merge` **absent**; `.git` **tree-identical** ở ca (0).
|
||||
|
||||
---
|
||||
|
||||
# FIX #4 🔴 — Sàn-3 dual-accept + W0.5 bỏ mtime (thay v2 §2.1 Sàn-3 + W0.5)
|
||||
|
||||
**Lỗi kép:**
|
||||
|
||||
44
.gitattributes
vendored
44
.gitattributes
vendored
@ -1,8 +1,44 @@
|
||||
# .gitattributes — SOLUTION_ERP
|
||||
# Stabilize line endings for byte-exact channels: Harness 3 email body-hash (content_sha256)
|
||||
# is computed on LF body; core.autocrlf=true (Windows) would convert LF→CRLF on checkout and
|
||||
# break body-hash verify even when content is untampered. Scope = broadcasts only (S63 2026-06-15).
|
||||
#
|
||||
# ── THỨ-TỰ CÓ CHỦ-ĐÍCH (git: dòng SAU thắng dòng TRƯỚC trên cùng attribute) ──
|
||||
# 1) sàn chung `*` → 2) rule text tường-minh → 3) khai binary (SAU CÙNG = thắng tuyệt-đối)
|
||||
# Binary để cuối vì hỏng-binary không cứu được, còn hỏng-EOL thì renormalize lại được.
|
||||
|
||||
# ── (1) SÀN CHUNG — S120 W0.1 (broadcast EOL/CRLF 2026-07-15) ────────────────────────
|
||||
# core.autocrlf=true @system (C:/Program Files/Git/etc/gitconfig) lật LF→CRLF lúc checkout
|
||||
# ⇒ file MỚI / file ghi-lại dính CRLF trong worktree. `text=auto eol=lf` ⇒ blob LF + worktree LF,
|
||||
# ĐỘC-LẬP với autocrlf ⇒ đóng mìn tận gốc thay vì gỡ từng quả.
|
||||
# 🔴 Khai theo CLASS, KHÔNG vá theo đuôi-file-vừa-cắn (spec v2 W0.1).
|
||||
# 🔸 Nấc trung-thực: dòng này KHÔNG sửa 188 file đang `i/lf w/crlf` — nó chỉ chi-phối file
|
||||
# MỚI/ghi-lại. Mass rm+checkout 188 = CẤM ở phiên này (spec v2 W0.2: việc riêng, phiên riêng).
|
||||
* text=auto eol=lf
|
||||
|
||||
# ── (2) RULE TEXT TƯỜNG-MINH — giữ nguyên 2 rule cũ ──────────────────────────────────
|
||||
# Harness 3 email body-hash (content_sha256) tính trên body LF; autocrlf=true (Windows) lật
|
||||
# LF→CRLF lúc checkout ⇒ vỡ body-hash verify KỂ CẢ khi nội-dung không hề bị sửa (S63 2026-06-15).
|
||||
# Nay đã được `*` phủ, nhưng GIỮ tường-minh: đây là ràng-buộc GIAO-THỨC, không phải hệ-quả phụ.
|
||||
broadcasts/** text eol=lf
|
||||
|
||||
# H22 WAL (S111): phong-ho file .sh tuong lai (hook SE dung .ps1 — path-independent tren Windows)
|
||||
# H22 WAL (S111): phòng-hộ file .sh tương-lai (hook SE dùng .ps1 — path-independent trên Windows).
|
||||
*.sh text eol=lf
|
||||
|
||||
# ── (3) BINARY THẬT — CẤM mọi phép đổi EOL ───────────────────────────────────────────
|
||||
# Khai TƯỜNG-MINH thay vì phó-thác heuristic của `text=auto`: heuristic đoán bằng NUL-byte trong
|
||||
# 8000 byte đầu ⇒ một .docx/.xlsx "gầy" có thể lọt thành text ⇒ EOL-mangle ⇒ hỏng file KHÔNG cứu được.
|
||||
# Đo lúc khai (S120): repo có 19 file git tự-nhận binary = 12 .docx + 6 .png + 1 .xlsx.
|
||||
# Khai rộng hơn tập đó theo CLASS — .pptx/.pdf (form-engine 8 form HĐ) + .woff/.woff2/.ico (FE 2 app)
|
||||
# chắc-chắn sẽ tới; khai trước = không phải đợi file hỏng rồi mới vá.
|
||||
# 🔸 .svg (8 file) = XML ⇒ TEXT, CỐ Ý không khai ở đây.
|
||||
*.zip binary
|
||||
*.exe binary
|
||||
*.dll binary
|
||||
*.docx binary
|
||||
*.xlsx binary
|
||||
*.pptx binary
|
||||
*.pdf binary
|
||||
*.png binary
|
||||
*.jpg binary
|
||||
*.jpeg binary
|
||||
*.ico binary
|
||||
*.woff binary
|
||||
*.woff2 binary
|
||||
|
||||
Reference in New Issue
Block a user