[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:
@ -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:**
|
||||
|
||||
Reference in New Issue
Block a user