CI run #489 ĐỎ sau 2m42s ở test-gate Infrastructure — nhưng lỗi thật ở BUILD, không phải test:
Microsoft.NET.Publish.targets(851,9): error MSB4186: Invalid static method invocation syntax:
"[MSBuild]::MakeRelative($(MSBuildProjectDirectory), …nhan cong, vat tu.docx)". Method not found.
MSBuild property-function tách tham số bằng DẤU PHẨY ⇒ đường dẫn chứa ", " biến lời gọi
2-tham-số thành 3 ⇒ không có overload ⇒ MSB4186, chặn ngay ở build nên test chưa kịp khởi động.
🔴 LOCAL KHÔNG TÁI HIỆN ĐƯỢC: global.json để rollForward=latestFeature ⇒ CI nhảy SDK 10.0.202
còn local 10.0.104. Đo: grep -c "MakeRelative" trong Publish.targets của SDK local = 0
(control dương "ContentWithTargetPath" = 8 ⇒ thước sống) — dòng mã gây lỗi KHÔNG TỒN TẠI trên
máy dev. "Local 699 PASS" là đúng-với-local, không phải đo ẩu.
Vá: đổi tên 2 file bỏ phẩy ("nhan cong, vat tu" → "nhan cong va vat tu"), sửa 2 chuỗi seed
DbInitializer + 4 chú thích nguồn trong lib/contractBody. Control: 4 template cũ cùng thư mục
không có phẩy ⇒ CI xanh nhiều tháng; 2 file mới có phẩy ⇒ đỏ ngay run đầu; biến duy nhất = phẩy.
+ gotcha #93 + luật khắc tại chỗ trong DbInitializer: tên file dưới wwwroot CẤM chứa dấu phẩy.
Đo lại sau vá: build 0 error (bin/obj dọn sạch trước) · test 699 PASS · 0 file wwwroot còn phẩy
· 2 cặp file body002_0*.ts vẫn trùng sha256.
🔸 CHƯA vá lớp gốc (SDK drift CI⟂local): siết rollForward sang latestPatch/disable sẽ đóng cả
lớp NHƯNG runner đang có 10.0.202 — pin về 10.0.1xx mà runner không cài thì CI chết hẳn thay vì
đỏ một run. Phải đo SDK trên runner trước; quyết định của chủ dự án.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Owner YC-032/033/034/036 — 4 vế:
1. TÁCH LOẠI: +2 ContractType (HopDongThauPhuVatTu=8 / HopDongThauPhuThietBi=9),
họ HD-TP-VT / HD-TP-TB, menu 01A./01B. (giữ 02.-07. nguyên, loại cũ =1 legacy).
Bịt 5 nhánh câm nuốt loại mới: WorkflowPolicy (mất trạm CCM), ContractCodeGenerator
(sai mã RG-001, không hồi tố được), ContractDetailsFeatures x2 (bundle rỗng HTTP 200),
SeedWorkflowDefinitions (Designer V1 rỗng). ContractDetailsHelpers.ThauPhuFamily —
3 loại chung bảng ThauPhuDetails ⇒ 0 migration cho vế này.
2. THÂN DOCUMENT-VIEW: ContractBodyView.tsx + lib/contractBody/ (002.02 = 36 ô/2 bảng/5 điều ·
002.03 = 46 ô/6 bảng/6 điều · PHẦN 2 dùng chung 5 điều read-only gắn CUỐI theo YC-034).
Lưu vào Contract.DraftData lược đồ {schemaVersion,kind,body,paymentTerms}.
Gỡ draftData:null hardcode 4/4 site — trước đây mỗi lần Lưu là xoá trắng thân HĐ.
3. PRE-FILL: cầu KHKK đổ 17 ô (Bên B · chủ đầu tư · gói thầu · số HĐ · giá trị) — 17/17 khớp
slot.key. Địa điểm lấy pe.DiaDiem (0% rỗng) thay Project.Location (93% rỗng). Vá regression
cầu KHKK đánh rơi PaymentTerms + BypassProcurementAndCCM so với cầu PE cũ.
4. KHOÁ BẢN CỨNG MỘT CHIỀU (YC-033 "giấy trắng mực đen"): Mig AddContractSealedAt
(+SealedAt +SealedByUserId), set ??= (upload lần 2 không đè mốc đầu), rào 2 cửa —
xoá đính kèm bản cứng ⇒ 409, sửa HĐ ⇒ chặn. Test-before 2 ca.
+ print CSS in trình ký (ô điền in ra thành đường kẻ, không phải khung input).
Template: 002.02/002.03 convert .doc→.docx vào wwwroot + trỏ đúng 2 loại mới (trước cùng trỏ
loại cũ ⇒ dropdown Mẫu sẽ rỗng) + reconcile IsActive giới hạn 2 FormCode (bản đầu quét toàn bộ
sẽ hồi sinh mẫu admin đã xoá mỗi restart — database-reviewer-style bắt).
Đo: build 0 error · test 697→699 PASS (+2 seal) · has-pending-model-changes = No changes ·
tsc --noEmit exit 0 x2 app · mọi cặp file 2-app sha256 trùng · Menu keys 120→122 · Policies 480→488.
NỢ ĐÃ-BIẾT (owner cố ý hoãn, không phải bỏ sót): VAT (chưa VAT, để sau) · bảng tóm tắt PHẦN 1
trỏ "xem ĐIỀU 8/12" mà 002.04 chỉ có 5 điều ⇒ con-trỏ chết · phân quyền upload bản cứng ·
12 điều PHẦN 2 không có trong tài liệu. Chưa soi: 2 vai style FE/BE (lane không tạo được artifact).
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Root-cause 2 ca trắng màn prod (S189 #486, S191 #600): deploy.yml xoá package-lock.json
rồi npm install => mỗi run resolve lại cây theo semver range => cùng commit ra bundle khác
nhau tuỳ registry lúc build. CI vẫn exit 0 + byte-match CI-prod + smoke 200 vì mọi phép đo
đều đo FILE, không đo CHƯƠNG TRÌNH CHẠY.
- lockfile tái sinh từ cây lành đang chạy prod (thiếu @microsoft/signalr + 9 transitive
vì lockfile cũ có từ 23/04, trước khi dự án thêm SignalR — nên 'xoá cho lành' từng hợp lý)
- npm install -> npm ci (deterministic theo lockfile) + check exit code từng bước
- GUARD-92: chặn build khi React trùng bản (đúng cơ chế useState null). Fault-inject 4 ca
bắt được dương-giả lucide-react khớp regex trước khi push; đã neo lookbehind.
- Bundle verify runtime trên prod trước khi commit: eoffice CR538vZx + admin C10ta-wB,
console 0 lỗi, cùng byte với bản lành (1.700.709 / 1.780.807).
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>