From a282fed424f577e3fced77b1b58a446c887cd5ad Mon Sep 17 00:00:00 2001 From: Phan Le Manh Date: Wed, 16 Sep 2026 08:07:43 +0700 Subject: [PATCH 01/13] =?UTF-8?q?chore(kit):=20h=E1=BB=A3p=20nh=E1=BA=A5t?= =?UTF-8?q?=20c=E1=BB=95ng=20pre-merge=20l=C3=AAn=20acceptance-gate=202.14?= =?UTF-8?q?.0,=20gi=E1=BB=AF=20c=E1=BB=A5m=20ph=E1=BA=A1m=20vi=20h?= =?UTF-8?q?=E1=BA=B9p?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Nền kit 2.14.0 + tái áp cụm phạm vi hẹp theo `paths` bằng hợp nhất ba chiều (tổ tiên chung: kit 2.9.0, 0 xung đột). 1883 → 2066 dòng. Phân loại từng khối lệch, có bằng chứng: - kit đã có (lấy bản kit): 12/13 hàm chung khớp TỪNG BYTE bản 2.9.0 — oneflow chỉ đang cũ, không sửa gì. `evidence-core.cjs` cũng vậy: vá escape nội dòng của fork bị `unquoteScalar` của kit phủ nghiêm ngặt (thêm kiểm nháy cân, thêm dạng '', dùng chung 7 đường thi hành thay vì một điểm gọi). - giữ (đề xuất port ngược lên kit): cụm phạm vi hẹp — feature_scope · scope_has_any_match · scope_gaps · gated_coverage · slug_acceptance_touched + stale_files mở rộng, ~481 dòng. - riêng oneflow: RỖNG. Không có đường dẫn cứng, tên kho hay giả định bố cục nào trong cụm. Đo được (PR sửa đúng một file, --base): - oneflow gốc 4 hoá-cũ / 0 làn suite-only - kit 2.14.0 thuần 1 hoá-cũ / 25 làn suite-only - bản hợp nhất 4 hoá-cũ / 25 làn suite-only Bỏ cụm là hồi quy fail-open: mất 3/4 lần bắt hoá-cũ thật. Kit bỏ sót chúng vì STALE-DIFF-SCOPE-GUARD bỏ qua slug ngoài diff PR; khi feature khai `paths` thì máy BIẾT được và kiểm theo phạm vi hẹp — `paths` mua lại quyền kiểm ở vùng kit buộc phải im. Kiểm chứng (hai chiều + đột biến): - nhạy: PR chạm mã → 4 hoá-cũ, trùng khớp hoàn toàn 4 slug của bản gốc - đặc hiệu: PR chỉ chạm tài liệu → 0 hoá-cũ - đột biến 1: vô hiệu feature_scope → 4→1, đúng bằng kit thuần - đột biến 2: gỡ bộ lọc phạm vi → 4→9, báo thừa - cú pháp sạch, 21 hàm, không trùng tên CÒN NỢ: 26 vi phạm "re-pin lane suite-only" — nợ CÓ SẴN, không do bản hợp nhất. kit 2.14.0 bỏ mốc ân hạn REPIN_EVALS_SINCE nên mọi làn suite-only nay là VIOLATION. Cần một chiến dịch ghim lại theo §7.1 trước khi nhánh này xanh. Co-Authored-By: Claude Opus 5 --- lib/ac-line.cjs | 99 +++++- lib/eval-yaml.cjs | 58 +++- lib/evidence-core.cjs | 641 ++++++++++++++++++++++++++++++++--- lib/lop-nhin-thay.cjs | 101 ++++++ lib/md-section.cjs | 69 +++- scripts/pre-merge-check.sh | 199 ++++++++++- scripts/recheck-evidence.cjs | 4 +- 7 files changed, 1100 insertions(+), 71 deletions(-) create mode 100644 lib/lop-nhin-thay.cjs diff --git a/lib/ac-line.cjs b/lib/ac-line.cjs index 6de7c1f7..4b228868 100644 --- a/lib/ac-line.cjs +++ b/lib/ac-line.cjs @@ -17,11 +17,19 @@ // SUSPECT must be strictly LOOSER than AC_LINE or it detects nothing new — the bullet // marker is optional because real contracts declare criteria as bold headings too // (`**AC-1 — Strip shows …**`, 13 of them in video-compose-progress-ux). -const AC_SUSPECT = /^\s*(?:[-*]\s+)?\*{0,2}\s*AC-\d+\b/; +// NỚI (hồ sơ cong-nguoi-doc-du-nguon): 38 hợp đồng trên 11 kho khai tiêu chí bằng +// TIÊU ĐỀ `### AC-n`; với chúng khuôn cũ cho m = 0, nên nhánh `n===0 && m>0` không +// bao giờ đúng và bộ dò IM ở 34 trong 38 — đúng chỗ nó sinh ra để kêu. +const AC_SUSPECT = /^\s*(?:#{2,6}\s+)?(?:[-*]\s+)?\*{0,2}\s*AC-\d+\b/; // …but an id followed by a separator opens a CROSS-REFERENCE, not a declaration // (`**AC-5, AC-9, AC-10 chưa có gì**` in a Notes paragraph). Counting those cries wolf // on a healthy contract, which the contract's own control case forbids. -const AC_XREF = /^\s*(?:[-*]\s+)?\*{0,2}\s*AC-\d+\s*[,;/]/; +// TIỀN TỐ PHẢI CÂN VỚI AC_SUSPECT. Bản trước nới SUSPECT sang tiêu đề mà bỏ quên +// XREF sinh đôi, nên một tham chiếu chéo viết dạng tiêu đề vừa được đếm là nghi +// ngờ vừa không bóc được → m > n → cờ SHORT nổ oan trên hợp đồng lành, khoá luôn +// dòng một-chạm. Hai khuôn này đọc CÙNG một hình dạng dòng, nên tiền tố của chúng +// là MỘT thứ: sửa một cái mà quên cái kia là dựng lại đúng lớp lỗi ấy. +const AC_XREF = /^\s*(?:#{2,6}\s+)?(?:[-*]\s+)?\*{0,2}\s*AC-\d+\s*[,;/]/; // Scope: inside the criteria section when there IS one, whole file when there is not. // Whole-file everywhere over-counts — a Known-limits note like `- **AC-4** — …:` is // declaration-shaped but is not a declaration (measured: s4-scope-triage line 88 raised @@ -31,10 +39,9 @@ const AC_XREF = /^\s*(?:[-*]\s+)?\*{0,2}\s*AC-\d+\s*[,;/]/; // duyệt riêng trước đây của file này là đúng thứ `findings-section-boundary` vừa // gỡ khỏi gate-card.js ("xoá bản sao section()"); giữ nó lại là dựng lại y hệt // điều kiện sinh lỗi mà cả hai feature đang đi đóng. -const { sectionLines } = require('./md-section.cjs'); +const { sectionLines, dongKhoi } = require('./md-section.cjs'); function acBlindSpot(contractText, parsedIds) { - const inSec = sectionLines(contractText, 'Criteria'); - const scan = inSec.length ? inSec : contractText.split('\n').map((l, i) => ({ no: i + 1, l })); + const scan = criteriaLines(contractText); const suspect = []; for (const { no, l } of scan) { if (AC_SUSPECT.test(l) && !AC_XREF.test(l)) suspect.push(no); } const m = suspect.length, n = parsedIds.length; @@ -108,4 +115,84 @@ function parseAC(line) { return { id, gwt, judgment, crossLayer }; } -module.exports = { AC_LINE, AC_SUSPECT, AC_XREF, parseAC, acBlindSpot, blindSpotText }; +// Tên mục tiêu chí trôi qua ba cách viết trên 11 kho đo được. So khớp của +// sectionLines KHÔNG phân biệt hoa thường, nên `Acceptance criteria` trùng +// `Acceptance Criteria` và mục thứ ba chỉ là trang trí — bỏ, kẻo dạy sai người +// sau rằng danh sách này phân biệt hoa thường (lượt chấm 4). +const CRITERIA_HEADINGS = ['Criteria', 'Acceptance Criteria']; +// CHỈ acBlindSpot gọi hàm này, và quét cả tệp ở đây là ĐÚNG: nó chỉ làm số NGHI +// NGỜ to lên, tức làm cờ dễ kêu hơn — sai về phía an toàn. Bộ BÓC tiêu chí gọi +// criteriaLinesScoped; đừng đấu lại hai đường này vào nhau, lượt chấm 4 và 5 đều +// chết vì đúng chỗ đó. +function criteriaLines(contractText) { + const trongMuc = criteriaLinesScoped(contractText); + if (trongMuc.length) return trongMuc; + return String(contractText == null ? '' : contractText).split('\n').map((l, i) => ({ no: i + 1, l })); +} +// HAI phạm vi quét, CỐ Ý khác nhau — đây là chỗ lượt chấm 4 và 5 cùng chết. +// +// criteriaLinesScoped → bộ BÓC tiêu chí. Không có mục thì trả RỖNG. +// criteriaLines → bộ ĐẾM nghi ngờ của acBlindSpot. Không có mục thì quét cả tệp. +// +// Vì sao không dùng chung: quét cả tệp để ĐẾM là vô hại, nó chỉ làm cờ kêu to hơn. +// Quét cả tệp để BÓC thì máy bịa tiêu chí — đo được trên cây trước bản này: một +// hợp đồng không có mục tiêu chí, có `- AC-4:` và `- AC-9:` nằm trong mục «Known +// limits», cho ra thẻ Cổng Phạm vi liệt AC-1, AC-4, AC-9 như tiêu chí phải làm, +// cờ điểm-mù IM (vì hai bên cùng đếm một tập dòng nên n luôn ≥ m), và dòng một-chạm +// mở sẵn chữ «duyệt». Người bấm duyệt một danh sách máy tự nghĩ ra. +// +// Bán kính của nhát cắt, đo trên 1 243 hợp đồng thật của 22 kho: 139 hồ sơ với +// 1 110 tiêu chí đi qua nhánh CÓ MỤC và giữ nguyên; 81 hồ sơ với 380 tiêu chí đi +// qua nhánh quét-cả-tệp và bị trả về hành vi cũ — trong đó 78 hồ sơ vốn ĐÃ có cờ +// đỏ ở cây gốc, nên nhát cắt không sinh tiếng ồn mới, nó chỉ thôi bịa. +// Hợp đồng muốn được đọc thì khai một mục tiêu chí; cờ `blank` nói đúng câu đó. +function criteriaLinesScoped(contractText) { + for (const h of CRITERIA_HEADINGS) { + const ls = sectionLines(contractText, h); + if (ls.length) return ls; + } + return []; +} +// Tiêu chí khai bằng TIÊU ĐỀ: `### AC-n — nhãn`, thân là các dòng tới tiêu đề kế. +const AC_HEAD = /^#{2,6}\s+\*{0,2}\s*(AC-\d+)\b\*{0,2}\s*(.*)$/; +// parseACBlock — lối vào MỚI, đọc theo KHỐI. parseAC(line) giữ nguyên chữ ký nên +// ba bên gọi cũ và lớp vendored ở 9 kho không phải đổi cùng lượt. +// Dạng tiêu đề dựng lại thành một dòng gạch-đầu-dòng rồi cho parseAC chấm: hai +// dạng khai KHÔNG được có hai luật đọc tag, vì đó chính là lớp lỗi hồ sơ này đi +// đóng. Nhãn nối trước thân để `(judgment)` ở nhãn vẫn đọc theo luật nhãn-lỏng. +// TRẢ ĐỦ, KHÔNG GỘP id trùng: bên gọi tự gộp theo luật của mình, và thẻ Cổng +// Phạm vi dựa vào chính chỗ trùng đó để cảnh báo «trùng mã tiêu chí». Gộp ở đây +// là giết cảnh báo ấy một cách lặng lẽ — đo được: policy-graph-hub/registry-params +// khai AC-3, AC-7, AC-11, AC-16 mỗi mã hai lần. +function parseACBlock(contractText) { + const out = []; + let cur = null; + const chot = () => { + if (!cur) return; + const than = cur.than.join(' ').replace(/\s+/g, ' ').trim(); + const nhan = cur.nhan.replace(/^[\s—–-]+/, '').trim(); + const a = parseAC(`- ${cur.id}${nhan ? ' ' + nhan : ''}: ${than}`); + if (a) out.push(a); + cur = null; + }; + for (const { l } of criteriaLinesScoped(contractText)) { + const h = l.match(AC_HEAD); + if (h) { chot(); cur = { id: h[1], nhan: h[2] || '', than: [] }; continue; } + // ĐÓNG KHỐI theo ĐÚNG luật của md-section: h2..h6 đóng, h1 là NỘI DUNG. Bản + // trước tự viết `/^#{1,6}\s/` nên nó đóng ở cả h1, tức hai bộ duyệt bất đồng + // về ranh giới — chính lớp lỗi hồ sơ này đi đóng (lượt chấm 7). Luật ở + // md-section.cjs, không chép lại vào đây. + if (dongKhoi(l)) { chot(); continue; } + // Một dòng GẠCH ĐẦU DÒNG khai tiêu chí cũng ĐÓNG khối tiêu đề đang mở (lượt + // chấm 3 bắt được). Bản trước nuốt nó vào thân của tiêu chí phía trên, nên + // hợp đồng trộn hai cách khai mất tiêu chí ở giữa — đúng lớp «bên đọc hẹp + // hơn bên viết» mà chính bộ bóc này sinh ra để đóng. + const gach = parseAC(l); + if (gach) { chot(); out.push(gach); continue; } + if (cur) { cur.than.push(l); continue; } + } + chot(); + return out; +} + +module.exports = { AC_LINE, AC_SUSPECT, AC_XREF, AC_HEAD, CRITERIA_HEADINGS, criteriaLines, criteriaLinesScoped, parseAC, parseACBlock, acBlindSpot, blindSpotText }; diff --git a/lib/eval-yaml.cjs b/lib/eval-yaml.cjs index ba30cc50..80cfe911 100644 --- a/lib/eval-yaml.cjs +++ b/lib/eval-yaml.cjs @@ -56,4 +56,60 @@ function parseEvals(text, fields, normalize) { return evals; } -module.exports = { parseEvals, BLOCK_RE }; + +// Cắt chú thích YAML — MỘT nguồn cho mọi bộ đọc dòng (surfaces, field của eval, +// frontmatter). Luật: `#` mở chú thích khi nó đứng ĐẦU chuỗi hoặc có khoảng +// trắng đứng trước; `x#y` là DỮ LIỆU, không phải chú thích. Trước hồ sơ +// gom-duc-ket-2-10-0 mỗi bộ đọc tự viết một regex (`[ \t]+#` ở lib/lint, +// `\s*#` ở thẻ) nên cùng một dòng `surfaces:` cho hai câu trả lời khác nhau. +const stripComment = s => String(s == null ? '' : s).replace(/(^|\s)#.*$/, '').trim(); + + +// Kỳ vọng mã thoát của một eval máy — MỘT nguồn cho mọi bộ đọc (s4-args, làn +// ghim lại, checkRepinEvals, evaluateEvidence). Vắng trường VÀ khai 0 tường +// minh cho CÙNG kết quả: «đã khai» không phải một trạng thái riêng, chỉ giá +// trị khác 0 mới là một giới hạn. +// +// EXPECTED_EXIT_BANNED phải BẰNG tập khoá của khối marker INFRA-EXIT-CODES +// trong feature-loop/workflows/acceptance-verify.js. Không require được sang +// đó: tệp này vendor sang repo tiêu thụ, tệp kia không. Ca EE8 giữ hai bên +// khớp, hai chiều. Vì sao cấm: normInfra đổi hai mã đó thành cannotRun TRƯỚC +// mọi phép so, nên khai chúng là hứa một điều máy không giữ được; và đúng hai +// mã đó là lãnh địa ô đã park `baseline-127-tin-hieu-phan-biet` (ADR 0016). +const EXPECTED_EXIT_BANNED = [97, 127]; +const EXPECTED_EXIT_EXECUTORS = ['test', 'script']; + +function expectedExits(text) { + const byId = new Map(); + const errs = []; + for (const e of parseEvals(text, ['executor', 'expected_exit'], stripComment)) { + const id = e.id; + const executor = String(e.executor || '').trim().toLowerCase(); + const raw = String(e.expected_exit == null ? '' : e.expected_exit).trim().replace(/^["']|["']$/g, ''); + // Khai 0 tường minh (kể cả "00") không phải một giới hạn — nó phải đi + // ĐÚNG đường vắng trường ở MỌI executor, kể cả executor không hợp lệ. + // Phép kiểm executor chỉ áp khi giá trị khai giải ra KHÁC 0. + if (raw === '' || (/^\d+$/.test(raw) && Number(raw) === 0)) { byId.set(id, 0); continue; } + if (!EXPECTED_EXIT_EXECUTORS.includes(executor)) { + errs.push(`eval ${id}: expected_exit khai trên executor "${executor}" — chỉ ${EXPECTED_EXIT_EXECUTORS.join('/')} chạy lệnh nên mới có mã thoát`); + byId.set(id, 0); continue; + } + if (!/^\d+$/.test(raw)) { + errs.push(`eval ${id}: expected_exit "${raw}" không phải số nguyên 0–255`); + byId.set(id, 0); continue; + } + const n = Number(raw); + if (!Number.isInteger(n) || n < 0 || n > 255) { + errs.push(`eval ${id}: expected_exit "${raw}" không phải số nguyên 0–255`); + byId.set(id, 0); continue; + } + if (EXPECTED_EXIT_BANNED.includes(n)) { + errs.push(`eval ${id}: expected_exit ${n} là mã hạ tầng (${EXPECTED_EXIT_BANNED.join(', ')}) — không khai được; hạ tầng hỏng đi đường cannotRun, không đi đường giới hạn đã khai`); + byId.set(id, 0); continue; + } + byId.set(id, n); + } + return { byId, errs }; +} + +module.exports = { parseEvals, BLOCK_RE, stripComment, expectedExits, EXPECTED_EXIT_BANNED, EXPECTED_EXIT_EXECUTORS }; diff --git a/lib/evidence-core.cjs b/lib/evidence-core.cjs index da1c176a..7c199415 100644 --- a/lib/evidence-core.cjs +++ b/lib/evidence-core.cjs @@ -38,6 +38,163 @@ function findAcceptanceConfig(fileDir) { return null; } +// Vị trí dấu nháy ĐÓNG của vỏ mở ở ký tự 0, hoặc -1 khi không có vỏ đóng hợp +// lệ. Vỏ kép: `\` escape ký tự kế. Vỏ đơn: `''` là một dấu nháy literal, không +// phải vỏ đóng. +function closingQuoteIndex(s) { + const q = s[0]; + if (q !== '"' && q !== "'") return -1; + for (let i = 1; i < s.length; i += 1) { + if (q === '"') { + if (s[i] === '\\') { i += 1; continue; } + if (s[i] === '"') return i; + } else { + if (s[i] !== "'") continue; + if (s[i + 1] === "'") { i += 1; continue; } // '' = nháy literal + return i; + } + } + return -1; +} + +// Cắt chú thích YAML trên MỘT scalar, CÓ NHẬN BIẾT VỎ NHÁY. +// +// Vì sao không dùng thẳng `replace(/\s+#.*$/, '')`: phép đó không biết gì về +// vỏ, nên một scalar HỢP LỆ mang ` #` bên trong vỏ bị xén giữa chừng; mảnh còn +// lại KHÔNG CÂN, `unquoteScalar` (đúng theo thiết kế) trả nguyên văn kèm dấu +// nháy MỞ, và `bash -c '"echo a'` thoát 2 — tái tạo đúng chuỗi xanh-giả bốn +// bước mà hồ sơ release-2-11-0 tồn tại để đóng, chỉ đổi nguồn gây +// nháy-không-cân từ NGƯỜI VIẾT sang CHÍNH BỘ GIẢI. S4 lượt 1 của hồ sơ đó bắt +// được; ca BG7 giữ chỗ này. +function stripYamlComment(raw) { + const s = String(raw == null ? '' : raw).trim(); + const end = closingQuoteIndex(s); + if (end >= 0) { + const sau = s.slice(end + 1); + if (/^\s*(#.*)?$/.test(sau)) return s.slice(0, end + 1); // vỏ trọn vẹn, phần sau chỉ là chú thích + } + // `(^|\s)` chứ không `\s+`: `s` đã `trim()`, nên giá trị CHỈ LÀ chú thích + // (`khoa: # TODO`) mở đầu bằng `#` và không có khoảng trắng nào đứng trước. + // Bản `\s+` trả nguyên chuỗi chú thích — truthy, qua lưới `if (!val) die`, và + // `bash -c '# TODO'` thoát 0 → PASS mà không chạy gì (lượt chấm 4 bắt). Cùng + // biểu thức với `stripComment` của lib/eval-yaml.cjs. + return s.replace(/(^|\s)#.*$/, '').trim(); +} + +// Tách một list inline `a, b` theo dấu phẩy Ở NGOÀI vỏ nháy. `split(',')` trần +// xẻ ngay giữa vỏ, cho ra hai mảnh không cân — cùng lớp lỗi với stripYamlComment. +function splitTopLevel(s) { + const out = []; let cur = ''; let q = null; let dauMuc = true; + for (let i = 0; i < s.length; i += 1) { + const ch = s[i]; + if (q) { + cur += ch; + if (q === '"' && ch === '\\') { if (i + 1 < s.length) { cur += s[i + 1]; i += 1; } continue; } + if (ch === q) { if (q === "'" && s[i + 1] === "'") { cur += s[i + 1]; i += 1; continue; } q = null; } + continue; + } + // Cùng luật với closingBracketIndex: nháy chỉ mở vỏ khi đứng ĐẦU một mục. + if (dauMuc && (ch === '"' || ch === "'")) { q = ch; cur += ch; dauMuc = false; continue; } + if (ch === ',') { out.push(cur); cur = ''; dauMuc = true; continue; } + cur += ch; + if (!/\s/.test(ch)) dauMuc = false; + } + out.push(cur); + return out; +} + +// Bóc vỏ nháy của MỘT scalar YAML một dòng — nguồn DUY NHẤT cho mọi đường đọc +// giá trị sẽ được THI HÀNH hoặc dùng làm chỉ thị/đường dẫn (resolveConfigKey · +// resolveConfigList · bốn chỗ trong feature-loop/scripts/s4-args.mjs). +// +// Vì sao không dùng `replace(/^["']|["']$/g, '')`: đó là phép thay thế CÓ NEO +// dạng lựa-chọn, gỡ nháy đầu và nháy cuối ĐỘC LẬP nhau, nên +// (a) một chuỗi chỉ TÌNH CỜ kết thúc bằng nháy mất luôn ký tự đó, và +// (b) vì nó chỉ cắt vỏ, nó không biết gì về escape BÊN TRONG vỏ. +// Cả hai đo được trên main d1d36479 (hồ sơ release-2-11-0): `pytest -q -k 'a or +// b'` giải ra thiếu dấu đóng → `bash -c` thoát 2 → luật kỳ-vọng-mã-thoát (ship +// 10/09, cấm [97,127] chứ KHÔNG cấm 2) đọc mã 2 của SHELL thành «giới hạn đã +// khai» của CÔNG CỤ → PASS. Xanh giả bốn bước, tái phát qua ba mốc liên tiếp. +// (Chuỗi tên trường viết dạng gạch nối có chủ ý: ca tĩnh SA-EE4 canh cho dạng +// snake_case của nó KHÔNG rò vào bất kỳ bộ đọc nào khác, kể cả trong chú thích.) +// `frontmatterField` cuối tệp này đã học đúng bài học ấy ở S4-r5 và tự vá; kit +// giải lớp MỘT LẦN rồi không lan sang bộ đọc kế bên — đó là lý do lần này đi +// bằng một hàm dùng chung thay vì lại sửa một chỗ. +// +// Hai biểu thức đòi nháy trong thân HỢP LỆ theo YAML (vỏ kép: nháy trong phải +// escape · vỏ đơn: nháy trong phải nhân đôi), nên `"a" && echo "b"` — nháy hai +// đầu mà KHÔNG phải một cặp vỏ — giữ NGUYÊN VĂN thay vì bị xẻ. Không đoán thay +// người viết là hành vi đúng cho một chuỗi sắp được thi hành. +// Giới hạn đã khai: nháy đơn nhân đôi KHÔNG được un-double (`'it''s'` → +// `it''s`, YAML nói `it's`) — chưa có ca thật nào trong 8 kho đo được. +function unquoteScalar(raw) { + const s = String(raw == null ? '' : raw); + if (/^"(?:[^"\\]|\\.)*"$/.test(s)) return s.slice(1, -1).replace(/\\(["\\])/g, '$1'); + if (/^'(?:[^']|'')*'$/.test(s)) return s.slice(1, -1); + return s; +} + +// Vị trí `]` ĐÓNG của một flow-sequence mở ở ký tự 0, bỏ qua mọi `]` nằm TRONG +// vỏ nháy. -1 khi không đóng. +function closingBracketIndex(s) { + if (s[0] !== '[') return -1; + let q = null; let dauMuc = true; // ngay sau `[` hoặc `,` (bỏ khoảng trắng) + for (let i = 1; i < s.length; i += 1) { + const ch = s[i]; + if (q) { + if (q === '"' && ch === '\\') { i += 1; continue; } + if (ch === q) { if (q === "'" && s[i + 1] === "'") { i += 1; continue; } q = null; } + continue; + } + // YAML: dấu nháy chỉ là CHỈ DẤU khi đứng ĐẦU một node. `[plain, ends']` là + // hợp lệ và nghĩa là ['plain', "ends'"] — coi dấu `'` giữa chừng là mở vỏ + // sẽ nuốt luôn `]` và cả biểu thức hoá vô nghĩa (bắt được ở ca BG4). + if (dauMuc && (ch === '"' || ch === "'")) { q = ch; dauMuc = false; continue; } + if (ch === ']') return i; + if (ch === ',') { dauMuc = true; continue; } + if (!/\s/.test(ch)) dauMuc = false; + } + return -1; +} + +// ─── MỘT CỔNG DUY NHẤT cho mọi giá trị YAML một dòng ────────────────────── +// +// `parseFlowValue` là bộ tách token duy nhất; MỌI bộ đọc của kit tiêu thụ nó +// thay vì tự viết một biểu thức nhận-biết-vỏ. Vì sao khuôn này chứ không phải +// vá từng chỗ: hồ sơ release-2-11-0 vá HAI lượt và cả hai lượt lại sinh lỗi +// CÙNG LỚP — lượt 1 «cắt chú thích/tách phẩy chạy TRƯỚC bộ bóc nháy», lượt 2 +// «bộ cắt chú thích không nhận ra flow-sequence nên rơi về mệnh đề trần». Mỗi +// lần nhận-biết-vỏ được gắn vào MỘT bước phẫu-thuật-chuỗi thì bước kế bên +// trong cùng ống dẫn lại thiếu, và hệ quả luôn giống nhau: mảnh không cân, +// dấu nháy MỞ lọt vào chuỗi giao cho `bash -c`, shell thoát 2, và luật mã +// thoát đã khai đọc số 2 đó thành «giới hạn của công cụ» → PASS. STOP-PATCHING +// nổ ở lượt 2; owner chọn ĐỔI KHUÔN (10/09). Tính đúng của bộ này KHÔNG phụ +// thuộc việc đếm đủ số đường đọc — đó là điều mà mọi bản vá theo-từng-chỗ +// không thể có. +// +// Trả về một trong hai: +// { kind: 'seq', items: string[], text: string } — flow-sequence `[...]` +// { kind: 'scalar', value: string, text: string } — mọi thứ còn lại +// `text` = phần giá trị SAU khi cắt chú thích, giữ nguyên vỏ — bên nào cần +// nguyên văn (vd resolveConfigKey trả chuỗi cho một khoá là danh sách) thì đọc +// nó, không tự cắt lại. +function parseFlowValue(raw) { + const s = String(raw == null ? '' : raw).trim(); + const end = closingBracketIndex(s); + if (end >= 0 && /^\s*(#.*)?$/.test(s.slice(end + 1))) { + const text = s.slice(0, end + 1); + // `value` CÓ MẶT cả ở nhánh seq (= nguyên văn `[...]`) để nó KHÔNG BAO GIỜ + // undefined. Lượt chấm 3 bắt: nhánh khối của resolveConfigList gọi `.value` + // trên một item là flow-sequence và đẩy `undefined` vào một mảng khai kiểu + // string[] — mà đó là nguồn của `feature_loop.suite_keys`. Bắt bên gọi phải + // NHỚ một biểu thức ba ngôi là đúng khuôn sai mà cổng chung sinh ra để bỏ: + // chỗ dễ quên phải nằm TRONG cổng, không nằm ở chín chỗ gọi. + return { kind: 'seq', text, value: text, items: splitTopLevel(s.slice(1, end)).map(x => unquoteScalar(stripYamlComment(x))).filter(Boolean) }; + } + const text = stripYamlComment(s); + return { kind: 'scalar', text, value: unquoteScalar(text) }; +} + function resolveConfigKey(configText, dottedKey) { // Indent-based walk for a 2-3 level dotted key (e.g. executors.test.api). // Returns the scalar value or null. No YAML lib — line-based on purpose. @@ -60,15 +217,8 @@ function resolveConfigKey(configText, dottedKey) { if (!m) continue; if (m[1] === parts[depth]) { if (depth === parts.length - 1) { - const rawVal = m[2].replace(/\s+#.*$/, '').trim(); - // A double-quoted YAML scalar carries escapes (`\"`, `\\`); the lane - // hands this string to `bash -c` verbatim, so leaving the backslashes - // in turns `--with "x"` into `--with \"x\"` and the command dies before - // it runs (measured 08/09: repin-lane suite 6 exit 2 in 0.0s). Unescape - // only for the double-quoted form; single-quoted YAML has no escapes. - const val = /^".*"$/.test(rawVal) - ? rawVal.slice(1, -1).replace(/\\(["\\])/g, '$1') - : rawVal.replace(/^'|'$/g, ''); + const pv = parseFlowValue(m[2]); + const val = pv.kind === 'seq' ? pv.text : pv.value; return val || null; // leaf must have a non-empty scalar } depth++; @@ -94,7 +244,7 @@ function resolveConfigList(configText, dottedKey) { if (leafIndent >= 0) { if (indent <= leafIndent) break; const m = line.trim().match(/^-\s+(.*)$/); - if (m) out.push(m[1].replace(/\s+#.*$/, '').trim().replace(/^["']|["']$/g, '')); + if (m) out.push(parseFlowValue(m[1]).value); continue; } if (indent < expectedIndent) { @@ -105,8 +255,10 @@ function resolveConfigList(configText, dottedKey) { if (!m) continue; if (m[1] === parts[depth]) { if (depth === parts.length - 1) { - const val = m[2].replace(/\s+#.*$/, '').trim(); - if (val.startsWith('[')) return val.replace(/^\[|\]$/g, '').split(',').map(s => s.trim().replace(/^["']|["']$/g, '')).filter(Boolean); + // `[` không đóng (hoặc đóng bên trong vỏ) → KHÔNG phải flow-sequence: + // rơi về nhánh khối, trả [] — fail-CLOSED. Với `suite_keys` thì s4-args + // chết có tên thay vì chạy một danh sách bịa. + if (parseFlowValue(m[2]).kind === 'seq') return parseFlowValue(m[2]).items; leafIndent = indent; continue; } depth++; @@ -196,74 +348,169 @@ function loadRepinRunIds(fileDir) { // NOTHING about the slug's own evals unless it re-ran them at that sha. Real // case (crm-onehub, 2026-09-07): a signed record whose premise an 88-commit // merge removed was re-pinned green and reached the main branch with CI green. -// From REPIN_EVALS_SINCE every lane that backs verified_commit must carry -// `evals_exit` = {evalId: exit} covering every test/script eval declared in -// the slug's evals.yaml, all 0 (ui-check/judgment cannot run in a machine -// lane — declared limit, see GUIDE §7.1). Lanes dated before the mark are -// suite-only history (~530 citations in the kit's own corpus alone, signed -// records are immutable): the readers report them, never block. A lane that -// DID record evals_exit is always judged, whatever its ts — it claims eval -// evidence, so the claim is checked. A lane with no parseable ts cannot claim -// to be history — fail-closed. -const REPIN_EVALS_SINCE = '2026-09-07T12:00:00Z'; +// Every lane that backs verified_commit must carry `evals_exit` = {evalId: +// exit} covering every test/script eval declared in the slug's evals.yaml, all +// 0 (ui-check/judgment cannot run in a machine lane — declared limit, see +// GUIDE §7.1). NO date mark, NO grandfather (owner, 2026-09-08): a suite-only +// lane never proved the pin, whenever it ran — old pins are honest debt, red +// until re-pinned with the eval lane; the kit's own debt is named in +// tests/scripts/mirror-sync-grandfather.mjs (two-way checked), not hidden here. const REPIN_MACHINE_EXECUTORS = ['test', 'script']; +// Giá trị trạng-thái DUY NHẤT khiến một ô rời khỏi tập đáng ghim. Chuẩn hoá vì +// một lời khai bọc nháy hay viết hoa vẫn là cùng lời khai — cùng lớp với bộ +// giải nháy của 2.11.0, chỉ ở chiều đọc. +const EVAL_STATUS_NOT_RUN = 'not-run'; +function normaliseEvalStatus(v) { + return unquoteScalar(String(v == null ? '' : v)).trim().toLowerCase(); +} +// MỘT nơi quyết định «eval máy đáng ghim»: executor máy VÀ không tự khai là +// không chạy. Bên ĐỌC (machineEvalIds) và bên GHI (repin-lane.mjs) cùng gọi — +// hai bản luật là điều kiện đủ để writer/reader trôi khỏi nhau. +function isRepinMachineEval(e) { + if (!REPIN_MACHINE_EXECUTORS.includes(String(e.executor || '').trim().toLowerCase())) return false; + return normaliseEvalStatus(e.status) !== EVAL_STATUS_NOT_RUN; +} function loadEvalYaml() { try { return require(path.join(__dirname, 'eval-yaml.cjs')); } catch (_) { return null; } } -// ids of evals whose executor is machine-run (test/script), in file order. -// Null when the shared parser is not vendored next to this file — the caller -// fails closed instead of guessing. +// ids of evals whose executor is machine-run (test/script) AND not self- +// declared not-run, in file order. Null when the shared parser is not +// vendored next to this file — the caller fails closed instead of guessing. function machineEvalIds(evalsText) { const ey = loadEvalYaml(); if (!ey) return null; - return ey.parseEvals(evalsText, ['executor']) + return ey.parseEvals(evalsText, ['executor', 'status']).filter(isRepinMachineEval).map(e => e.id); +} +// Id bị loại vì tự khai không chạy — pin phải NÓI RA chúng, không được im. +function machineEvalIdsSkipped(evalsText) { + const ey = loadEvalYaml(); + if (!ey) return null; + return ey.parseEvals(evalsText, ['executor', 'status']) .filter(e => REPIN_MACHINE_EXECUTORS.includes(String(e.executor || '').trim().toLowerCase())) + .filter(e => normaliseEvalStatus(e.status) === EVAL_STATUS_NOT_RUN) .map(e => e.id); } -function repinLaneIsHistory(entry) { - if (entry && Object.prototype.hasOwnProperty.call(entry, 'evals_exit')) return false; - const t = entry && typeof entry.ts === 'string' ? Date.parse(entry.ts) : NaN; - return Number.isFinite(t) && t < Date.parse(REPIN_EVALS_SINCE); +// Hai vế, theo tiền lệ mã thoát mong đợi đã khai (ADR 0016): một ô chỉ được loại khi hồ sơ +// khai VÀ báo cáo đã ký không mang mã thoát nào cho nó. Thiếu vế hai thì «thêm +// một dòng khai» thành đường né đo — một hồ sơ đã ký có mã thoát THẬT cho một +// eval, rồi ai đó thêm `status: not-run` vào evals.yaml, sẽ ghim lại XANH mà +// không ai đối chiếu gì với vật đã ký trước đó. +// +// Trả HAI kết luận TÁCH BẠCH, không một mảng id: `xungDot` = ô bị loại mà báo +// cáo đã ký CÓ mã thoát cho chính nó · `khongDoiChieuDuoc` = ô bị loại mà không +// có văn bản báo cáo đã ký nào để đối chiếu. Bản đầu trả `[]` cho vế sau (rà +// cuối 12/09/2026) — fail-OPEN, trái luật sinh đôi của nó (mã thoát mong đợi, +// ADR 0016) vốn fail-CLOSED ở đúng nhánh đó: bên gọi ba đối số (bản +// recheck-evidence.cjs / pre-merge-check.sh của repo tiêu thụ chưa chép tệp +// mới) sẽ tắt lưới LẶNG ở đúng kho lưới sinh ra để cứu. Hồ sơ KHÔNG có ô bị +// loại nào thì cả hai vế rỗng — vắng báo cáo không tự sinh vi phạm. +function notRunConflicts(evalsText, reportText) { + const skipped = machineEvalIdsSkipped(evalsText); + if (!skipped || !skipped.length) return { xungDot: [], khongDoiChieuDuoc: [] }; + if (reportText == null) return { xungDot: [], khongDoiChieuDuoc: skipped.slice() }; + const signed = extractEvalBlockExits(reportText); + return { xungDot: skipped.filter(id => signed.has(id)), khongDoiChieuDuoc: [] }; } // entry: the parsed repin line that backs verified_commit (sha == vc); // evalsText: evals.yaml content, or null when the file is missing; slug for -// the message. Returns { history, note?, errs } — messages carry NO prefix so -// recheck ("REPIN x ") and pre-merge ("VIOLATION [slug]: ") print one text. -function checkRepinEvals(entry, evalsText, slug) { +// the message; reportText (NEW, optional) is the committed evidence-report.md +// text this lane is signing for. Returns { errs } — messages carry NO prefix +// so recheck ("REPIN x ") and pre-merge ("VIOLATION [slug]: ") print one text. +// +// Luật hai vế (owner, hồ sơ eval-khai-ma-thoat-mong-doi 2026-09-09): một mã +// thoát KHÁC 0 chỉ chống lưng được pin khi ĐỦ HAI VẾ — (a) evals.yaml đã KHAI +// đúng mã đó (đọc qua lib/eval-yaml.cjs#expectedExits — gọi hàm dùng chung, +// không tự đọc trường ở đây), VÀ +// (b) báo cáo ĐÃ KÝ (## Evidence, khối `- eval: `) đã ghi ĐÚNG mã đó +// trước khi làn này chạy — nếu không, mã khác 0 mới xuất hiện chính là tiền +// đề vừa mất, không phải giới hạn đã người ký nhận. Thiếu MỘT vế = fail-open +// (chỉ cần sửa dòng khai của hồ sơ đã ký là làn xanh lại). reportText VẮNG +// (bên gọi cũ chưa truyền, hoặc lib/eval-yaml.cjs không nạp được) đi thẳng +// nhánh fail-closed — coi như vế hai không kiểm được, đỏ như luật trước khi +// có luật hai vế (đường đọc-cũ an toàn cho repo tiêu thụ chưa chép tệp mới). +function checkRepinEvals(entry, evalsText, slug, reportText) { const id = entry.run_id; const sha = entry.sha; const ts = typeof entry.ts === 'string' ? entry.ts : '?'; - if (repinLaneIsHistory(entry)) { - return { history: true, errs: [], note: `re-pin lane "${id}" (ts ${ts}, before ${REPIN_EVALS_SINCE}) is suite-only — this slug's evals were NOT re-run at ${sha}; grandfathered, re-pin with the eval lane at the next campaign` }; - } const errs = []; if (evalsText == null) { errs.push(`re-pin lane "${id}" backs verified_commit ${sha} but _acceptance/${slug}/evals.yaml is missing — nothing to prove the pin against`); - return { history: false, errs }; + return { errs }; } const ex = entry.evals_exit; if (ex === undefined) { errs.push(`re-pin lane "${id}" (ts ${ts}) backs verified_commit ${sha} but recorded no evals_exit — a suite-only lane proves the repo's suites, not this slug's evals; run feature-loop/scripts/repin-lane.mjs (it re-runs evals.yaml's test/script evals at HEAD), do not hand-write the line`); - return { history: false, errs }; + return { errs }; } if (!ex || typeof ex !== 'object' || Array.isArray(ex)) { errs.push(`re-pin lane "${id}" evals_exit is not an object of {evalId: exit} — malformed lane line; run a NEW lane`); - return { history: false, errs }; + return { errs }; } const ids = machineEvalIds(evalsText); if (ids === null) { errs.push(`cannot list machine evals for re-pin lane "${id}": lib/eval-yaml.cjs is not vendored next to evidence-core.cjs — copy the full INIT-CI-COPY-LIST`); - return { history: false, errs }; + return { errs }; } const has = i => Object.prototype.hasOwnProperty.call(ex, i); const missing = ids.filter(i => !has(i)); - const red = ids.filter(i => has(i) && ex[i] !== 0); if (missing.length) errs.push(`re-pin lane "${id}" evals_exit lacks eval(s) ${missing.join(', ')} declared in evals.yaml (executor test/script) — the lane did not re-run them at ${sha}; run a NEW lane`); - if (red.length) errs.push(`re-pin lane "${id}" evals_exit has nonzero exit for ${red.map(i => `${i}=${JSON.stringify(ex[i])}`).join(', ')} — a red eval cannot back a pin; fix the eval and run a NEW lane`); - return { history: false, errs }; + const boQua = machineEvalIdsSkipped(evalsText) || []; + // Ô bị loại KHÔNG còn đi qua vòng chấm mã thoát dưới (nó rời khỏi `ids`), nên + // một mã đỏ ghi cho chính nó sẽ không ai soi — răng đang sống bị gỡ lặng + // (rà cuối 12/09/2026). Làn thật không bao giờ ghi khoá cho ô nó không đo: + // một dòng pin như vậy là vật viết tay hoặc do một writer đã trôi. + const doTrongOBoQua = boQua.filter(i => has(i) && ex[i] !== 0); + if (doTrongOBoQua.length) errs.push(`re-pin lane "${id}" evals_exit mang mã thoát khác 0 cho ${doTrongOBoQua.map(i => `${i}=${JSON.stringify(ex[i])}`).join(', ')} mà evals.yaml khai không-chạy — ô khai không-chạy không được mang mã đỏ chống lưng một pin; chạy làn MỚI (làn không ghi mã cho ô nó không đo), đừng viết tay dòng pin`); + const { xungDot, khongDoiChieuDuoc } = notRunConflicts(evalsText, reportText); + if (xungDot.length) errs.push(`re-pin lane "${id}" bỏ qua eval ${xungDot.join(', ')} vì evals.yaml khai không-chạy, NHƯNG báo cáo đã ký có mã thoát cho chính eval đó — hai vế mâu thuẫn; sửa hồ sơ rồi chạy làn MỚI`); + if (khongDoiChieuDuoc.length) errs.push(`re-pin lane "${id}" bỏ qua eval ${khongDoiChieuDuoc.join(', ')} vì evals.yaml khai không-chạy, NHƯNG không đối chiếu được vế hai — không có văn bản báo cáo đã ký để soi (bên gọi không truyền reportText, hoặc evidence-report.md vắng); fail-closed như luật mã thoát mong đợi (ADR 0016): chép đủ INIT-CI-COPY-LIST rồi chạy lại, đừng tin lời khai một vế`); + const ey = loadEvalYaml(); + const expected = (ey && typeof ey.expectedExits === 'function') + ? ey.expectedExits(evalsText).byId + : new Map(); + const signed = reportText == null ? null : extractEvalBlockExits(reportText); + const red = []; + for (const i of ids) { + if (!has(i)) continue; + const got = ex[i]; + if (got === 0) continue; + const want = expected.get(i) || 0; + if (want === 0) { + red.push(`${i}=${JSON.stringify(got)} (chưa khai: evals.yaml không khai mã thoát mong đợi cho eval này)`); + continue; + } + if (got !== want) { + red.push(`${i}=${JSON.stringify(got)} (khai ${want}, làn trả ${got} — lệch mã đã khai)`); + continue; + } + if (signed == null) { + red.push(`${i}=${JSON.stringify(got)} (không đọc được báo cáo đã ký để đối chiếu — vế hai của luật không kiểm được)`); + continue; + } + if (signed.get(i) !== want) { + red.push(`${i}=${JSON.stringify(got)} (tiền đề vừa mất: báo cáo đã ký ghi ${signed.has(i) ? signed.get(i) : 'không ghi mã nào'}, làn nay trả ${got} — một mã khác 0 MỚI xuất hiện chưa ai ký nhận)`); + } + } + if (red.length) errs.push(`re-pin lane "${id}" evals_exit không đạt kỳ vọng đã khai cho ${red.join(', ')} — sửa rồi chạy làn MỚI`); + return { errs }; +} + +// evalsPath: absolute/relative path to a slug's evals.yaml. Returns the +// content of the evidence-report.md sitting next to it (same dir), or null +// when absent/unreadable. Callers of checkRepinEvals that only have the +// evals.yaml path (pre-merge-check.sh's inline reader) use this instead of +// reading the file themselves — one rule, one file-read, both live here so +// the two call sites (pre-merge-check.sh, recheck-evidence.cjs) cannot drift. +// recheck-evidence.cjs already holds the report text in memory (it IS the +// file being rechecked) and passes it straight through instead. +function readSignedReportFor(evalsPath) { + try { + const reportPath = String(evalsPath).replace(/evals\.yaml$/, 'evidence-report.md'); + return fs.existsSync(reportPath) ? fs.readFileSync(reportPath, 'utf8') : null; + } catch (_) { return null; } } // run_ids claimed INSIDE eval blocks (`- eval: ` + indented fields) — @@ -284,6 +531,112 @@ function extractEvalBlockRunIds(payload) { return ids; } +// MỘT biểu thức nhận diện một dòng mã thoát (bất kể trong hay ngoài khối +// eval). Một dòng ĐƯỢC TÍNH LÀ khai mã thoát của khối đang mở chỉ khi từ khoá +// là TOKEN ĐẦU TIÊN sau khoảng trắng đầu dòng — một dòng ghi chú tự do chỉ +// NHẮC tới cụm này giữa câu ("note: last run had exit_code: 9 (stale, +// ignore)") không thoả điều kiện đó nên không bao giờ bị đọc nhầm thành mã +// thoát THẬT của eval đang mở (S4, hồ sơ eval-khai-ma-thoat-mong-doi +// 2026-09-09: đúng phân kỳ này từng khiến một báo cáo PASS hợp lệ bị chặn +// nhầm vì một dòng ghi chú lẫn trong khối). Ngoài mọi khối eval thì không có +// gì để đối chiếu — bất kỳ dòng nào khớp biểu thức (dù từ khoá không đứng +// đầu) đều là một lời khai mã thoát lạc chỗ và bị tính là vi phạm. +// +// Cờ TOÀN CỤC (g) là bắt buộc: MỘT dòng có thể mang NHIỀU khớp (vd một dòng +// trường thật rồi một cụm mã thoát khác lẫn trong ngoặc/ghi chú cuối cùng +// dòng). Không có cờ g, `line.match()` chỉ trả khớp ĐẦU TIÊN mỗi dòng nên mọi +// khớp còn lại trên cùng dòng — dù mang mã KHÁC 0 — biến mất hoàn toàn khỏi +// cả `outside` lẫn `violations` (S4, hồ sơ eval-khai-ma-thoat-mong-doi +// 2026-09-09, lượt soi toàn nhánh: ba hình dạng lọt vì thiếu đúng cờ này). +const EXIT_LINE_RE = /(?:exit_code|verifier_exit_code|exit)\s*[:=]\s*(-?\d+)\b/gi; + +// MỘT lượt đi khối, MỘT biểu thức, HAI cách nhìn — trả về CẢ HAI thứ mà L1 +// CONSISTENCY và luật hai vế của re-pin cần, để chúng không còn tự dựng lối +// đi khối RIÊNG rồi trôi khỏi nhau (đó chính là lỗ mà hồ sơ +// eval-khai-ma-thoat-mong-doi 2026-09-09 phát hiện: L1 CONSISTENCY từng có +// vòng lặp thứ hai dùng biểu thức KHÔNG neo đầu dòng). Cùng lối đi khối với +// extractEvalBlockRunIds: `- eval: ` mở khối, dòng đầu tiên không thụt +// đóng khối. +// +// HAI đường, không ba (đảo lại một phép nới SAI đã yêu cầu ở vòng trước: một +// dòng ghi chú tự do chứa cụm mã thoát bên trong khối KHÔNG còn được tha — +// hợp đồng chỉ cho đúng MỘT ngoại lệ, dòng trường thật neo đầu dòng): +// byEval — Map DANH SÁCH mọi mã ghi trong khối của +// từng eval, theo đúng thứ tự xuất hiện: mỗi khớp EXIT_LINE_RE +// mà từ khoá neo ngay đầu phần không-trắng của dòng (token đầu +// dòng, sau khoảng trắng đầu dòng) được gom vào danh sách của +// khối đang mở. MỘT dòng chỉ có ĐÚNG MỘT vị trí neo đầu dòng +// (khớp đầu tiên của dòng nếu nó đứng ở đó) nên tối đa MỘT +// phần tử của danh sách tới từ mỗi dòng — đây là MỘT ngoại lệ +// duy nhất hợp đồng cho phép, lặp lại trên nhiều dòng của cùng +// khối thì gom thành danh sách thay vì để dòng SAU ghi đè dòng +// TRƯỚC (S4, eval-khai-ma-thoat-mong-doi 2026-09-09, lượt soi +// toàn nhánh: `Map.set` ghi đè từng khiến một mã khác 0 ở dòng +// đầu biến mất khi dòng sau trong cùng khối cũng neo đầu dòng). +// outside — mảng các mã thoát KHÁC 0 khớp EXIT_LINE_RE nằm ngoài mọi +// khối eval, theo đúng thứ tự xuất hiện (MỌI khớp trên một +// dòng, không chỉ khớp đầu tiên). +// violations — mảng {evalId, code, line} cho MỌI khớp EXIT_LINE_RE TRONG +// khối mang mã KHÁC 0 mà từ khoá KHÔNG neo đầu dòng — dấu gạch +// đầu dòng chen trước (" - exit_code: 9"), lệch thụt lề, hay +// nằm giữa một câu văn xuôi hoặc sau dòng trường thật trên +// CÙNG dòng ("exit_code: 0 (truoc do exit_code: 7)") đều CÙNG +// một hình dạng vi phạm, không còn phân biệt theo "trông giống +// trường thật" hay "trông giống ghi chú" — thứ duy nhất phân +// biệt là VỊ TRÍ neo, không phải nội dung xung quanh. Cùng bộ +// lọc "khác 0" như `outside`: L1 CONSISTENCY chỉ soi mã THẤT +// BẠI — một mã 0 lạc chỗ (vd "... exit=0 ...") không tố cáo +// điều gì nên không phải vi phạm (corpus thật, hồ sơ +// lenh-tran-tai-lieu-dau-tay, có đúng hình dạng này ở một ghi +// chú vô hại). +function walkEvalExits(payload) { + const byEval = new Map(); + const outside = []; + const violations = []; + let cur = null; + for (const line of String(payload).split('\n')) { + const open = line.match(/^\s*-\s+eval\s*[:=]\s*(.+?)\s*$/i); + if (open) { cur = open[1].replace(/\s+#.*$/, '').trim().replace(/^["']+|["']+$/g, '').trim(); continue; } + if (cur && !/^\s+\S/.test(line)) cur = null; + const leading = line.length - line.trimStart().length; + // MỌI khớp trên dòng, không chỉ khớp đầu — cờ g trên EXIT_LINE_RE cho + // phép matchAll đi hết dòng thay vì dừng ở khớp đầu tiên. + for (const m of line.matchAll(EXIT_LINE_RE)) { + const code = Number(m[1]); + if (cur) { + if (m.index === leading) { + if (!byEval.has(cur)) byEval.set(cur, []); + byEval.get(cur).push(code); // neo đầu dòng — GOM vào danh sách, không ghi đè + } else if (code !== 0) { + violations.push({ evalId: cur, code, line }); // mọi hình dạng khác, mã khác 0 — vi phạm + } + } else if (code !== 0) { + outside.push(code); + } + } + } + return { byEval, outside, violations }; +} + +// Mã thoát ghi TRONG khối của từng eval — MỘT giá trị mỗi eval (chữ ký + +// hành vi cũ, vì checkRepinEvals so sánh trực tiếp `signed.get(i) !== want`). +// walkEvalExits nay trả DANH SÁCH mã cho mỗi khối (một khối HIẾM khi nhưng CÓ +// THỂ mang nhiều dòng neo đầu dòng); rút gọn về một giá trị phải chọn AN TOÀN +// (fail-closed) chứ không phải "dòng cuối thắng" như bug cũ: ưu tiên mã KHÁC +// 0 ĐẦU TIÊN trong danh sách — một mã khác 0 gần như chắc chắn LỆCH mã đã +// khai (`want`) nên khiến checkRepinEvals đỏ đúng hướng; chỉ khi mọi mã trong +// khối đều là 0 mới trả 0. Dùng cho luật hai vế của re-pin và (gián tiếp, qua +// walkEvalExits) cho L1 CONSISTENCY. +function extractEvalBlockExits(payload) { + const byEvalLists = walkEvalExits(payload).byEval; + const out = new Map(); + for (const [evalId, codes] of byEvalLists) { + const nonZero = codes.find(c => c !== 0); + out.set(evalId, nonZero !== undefined ? nonZero : 0); + } + return out; +} + // Set of run_ids the machinery logged, or null when no log exists (older // flow — tolerated; pre-merge NOTEs it). Malformed lines are skipped. function loadRunLogIds(fileDir) { @@ -471,20 +824,71 @@ function evaluateEvidence(payload, opts) { const configText = opts.configText || null; const configPath = opts.configPath || null; - // L1 CONSISTENCY — a genuine PASS report never contains a failed eval, - // machine OR judgment. If anything failed, the verdict must be REJECT. - const NONZERO_EXIT_RE = /(exit_code|verifier_exit_code|exit)\s*[:=]\s*[1-9]\d*\b/i; const FAILED_JUDGMENT_RE = /verdict\s*[:=]\s*FAIL\b/i; + + // L1 CONSISTENCY — một PASS thật không chứa eval trượt. Ngoại lệ DUY NHẤT: + // mã khác 0 nằm TRONG khối của đúng eval đã khai đúng mã ấy, TRÊN MỘT dòng + // trường thật neo đầu dòng (giới hạn đã khai, không phải một lượt trượt). + // Mọi mã khác 0 còn lại — ngoài khối, lệch mã, của eval không khai, hoặc + // trong khối nhưng không neo đầu dòng (dù trông giống trường thật lệch + // định dạng hay lẫn trong văn xuôi) — vẫn là vi phạm. (Đảo lại một phép nới + // SAI đã yêu cầu ở vòng trước: hợp đồng không có rổ "ghi chú được tha".) + const declared = (() => { + if (!fileDir) return new Map(); + const ey = loadEvalYaml(); + if (!ey || typeof ey.expectedExits !== 'function') return new Map(); + try { + const txt = fs.readFileSync(path.join(fileDir, 'evals.yaml'), 'utf8'); + const r = ey.expectedExits(txt); + return r.errs.length ? new Map() : r.byId; // khai sai → không tha gì cả + } catch (_) { return new Map(); } + })(); + // MỘT lượt đi khối dùng chung (walkEvalExits — cũng là nguồn của + // extractEvalBlockExits) thay vì tự dựng lối đi khối RIÊNG ở đây: đó chính + // là lỗ đã trôi khỏi nhau trước khi vá (S4, eval-khai-ma-thoat-mong-doi + // 2026-09-09). `outside` đã lọc sẵn mã 0; `byEval` giữ DANH SÁCH mọi mã (kể + // cả 0) của mỗi khối nên ở đây tự lọc `code !== 0` trước khi xét vi phạm — + // MỘT khối chỉ được tha khi MỌI mã khác 0 trong danh sách của nó đều bằng + // đúng mã đã khai; một mã khác 0 nào KHÁC trong cùng khối (dòng trước bị + // dòng sau ghi đè ở bug cũ) vẫn là vi phạm độc lập. `violations` là MỌI + // khớp TRONG khối mà từ khoá không neo đầu dòng — fail-CLOSED, không được + // rơi mất, và không còn nhánh nào tha nó theo hình dạng. + const { byEval: blockExits, outside: outsideExits, violations: unanchoredExits } = walkEvalExits(payload); let consistencyFailure = null; - if (NONZERO_EXIT_RE.test(payload)) { - consistencyFailure = 'PASS report contains a failed eval (exit_code != 0) — the verdict must be REJECT'; - } else if (FAILED_JUDGMENT_RE.test(payload)) { - consistencyFailure = 'PASS report contains a failed judgment (verdict: FAIL) — the verdict must be REJECT'; + { + const viPham = []; + for (const code of outsideExits) { + viPham.push(`mã ${code} ngoài mọi khối eval`); + } + for (const { evalId, code, line } of unanchoredExits) { + viPham.push( + `eval ${evalId}: dòng "${line.trim()}" mang mã ${code} không neo đầu dòng trong khối — chỉ dòng trường thật neo đầu dòng (vd "exit_code: ${code}") mới được tính là mã thoát của khối; sửa lại đúng thụt lề nếu là trường thật, hoặc bỏ cụm mã thoát khỏi ghi chú/văn xuôi nếu không phải` + ); + } + for (const [evalId, codes] of blockExits) { + for (const code of codes) { + if (code === 0) continue; + if (declared.get(evalId) === code) continue; // giới hạn đã khai + // declared.has(evalId) — KHÔNG kèm điều kiện giá trị: một eval khai + // đúng giới hạn 0 vẫn PHẢI đọc ra "khai 0", không phải "chưa khai" + // (Phát hiện 2 — giá trị 0 là falsy nên phép kiểm cũ + // `declared.has(x) && declared.get(x)` đọc nhầm nó thành chưa khai). + viPham.push(`eval ${evalId} (mã ${code}${declared.has(evalId) ? `, khai ${declared.get(evalId)}` : ', chưa khai'})`); + } + } + if (viPham.length) { + consistencyFailure = `PASS report contains a failed eval (exit_code != 0) — the verdict must be REJECT: ${viPham.join('; ')}`; + } else if (FAILED_JUDGMENT_RE.test(payload)) { + consistencyFailure = 'PASS report contains a failed judgment (verdict: FAIL) — the verdict must be REJECT'; + } } // L1 SHAPE const HAS_RUN_ID = /run_id\s*[:=]\s*\S{4,}/i.test(payload); - const HAS_EXIT_ZERO = /(exit_code|verifier_exit_code|exit)\s*[:=]\s*0\b/i.test(payload); + // Một hồ sơ mà MỌI eval máy đều khai mã khác 0 không thể có dòng exit_code: 0 + // nào. Điều kiện hình dạng thoả bằng một dòng mã thoát ĐÚNG kỳ vọng đã khai. + const HAS_EXIT_ZERO = /(exit_code|verifier_exit_code|exit)\s*[:=]\s*0\b/i.test(payload) + || [...blockExits].some(([evalId, codes]) => codes.some(code => code !== 0 && declared.get(evalId) === code)); const HAS_VERIFIED_AT = /verified_at\s*[:=]\s*\d{4}-\d{2}-\d{2}/i.test(payload); const verifierValues = extractVerifierValues(payload); const HAS_VERIFIER = verifierValues.length > 0; @@ -619,6 +1023,33 @@ function evaluateContractWrite(newPayload, oldPayload) { } } + // duong-lui-phai-song AC-6: «da-veto» có vết + T2 là một lối Cổng-1-ĐÃ-GHI — người đã + // phát ngôn trên hồ sơ máy-đi-trước; chặn nó ở đây là giết đúng nút dừng của làn V + // (gap-probe P0: hồ sơ machine-cleared × mo không ghi được da-veto). Vết vẫn bắt buộc + // (V09), T2-only vẫn giữ (V10). + // Lối này HẸP đúng bằng ca nó phục vụ (S4-r1 finding, lớp fail-open): chỉ hồ sơ ĐANG ở + // `verified`/`machine-cleared` với cửa veto ĐANG `mo` trong bản cũ mới được ghi da-veto + // mà không có approved_by — hồ sơ mới/draft, hay `approved`/`signed-off` (không thuộc + // làn V), vẫn theo luật cũ: kèm da-veto vào không mua được Cổng 1. + let vetoRecorded = false; + if (v.present && v.state === 'da-veto') { + const oldV = oldPayload == null ? { present: false } : vetoGateState(oldPayload); + // laneStatus đọc bản CŨ (và bản mới vẫn phải trong làn): lối này mở cho hồ sơ ĐANG + // ở làn V, KHÔNG phải cho lượt ghi tự đặt mình vào làn V. Bản đầu đọc mỗi `status` + // mới, nên `draft` + `mo` nhảy thẳng sang `machine-cleared` + `da-veto` với + // approved_by rỗng và TẮT cả hai răng dưới (mốc 2.10.0 lượt chấm 1 — chú thích ở + // trên đã hứa «trong bản cũ» từ đầu, chỉ mã là đi lệch). Ca V14/V15 giữ chiều đỏ, + // V16 giữ đối chứng dương cho đúng lối verified → machine-cleared của làn V. + const trongLan = (st) => st === 'verified' || st === 'machine-cleared'; + const laneStatus = trongLan(oldStatus) && trongLan(status); + if (!v.stamped) failures.push(`veto_state: da-veto but veto_opened_at is ${v.openedAt ? `unreadable ("${v.openedAt}")` : 'missing'} — a veto without a timestamp is a silent gate skip. Set veto_opened_at: .`); + else if (v.tier === 'T3') failures.push(`veto_state: da-veto on a T3 contract — the V lane (and its veto) is T2-only; T3 always needs approved_by.`); + // Bản cũ đang `mo` (người vừa veto) HOẶC đã `da-veto` (ghi lại hồ sơ đang veto: thêm Known + // limits, sửa lý do, resume lượt bị ngắt) — cả hai đều là Cổng 1 đã có phát ngôn của người + // (S4-r4 finding: hồ sơ đã veto bị chặn mọi lượt ghi với lý do sai «Gate 1 chưa duyệt»). + else if (laneStatus && oldV.present && (oldV.state === 'mo' || oldV.state === 'da-veto')) vetoRecorded = true; + } + // `machine-cleared` = qua Cổng Bằng chứng KHÔNG có chữ ký người — đó CHÍNH là điều làn V // chỉ cho phép ở T2. Răng T2-only phải đứng ở tầng GHI, không chỉ ở lưới trước-merge: T3 // là «Cổng 2 luôn dừng chờ người», và hai tầng cưỡng chế lệch nhau cho cùng một luật là @@ -633,7 +1064,7 @@ function evaluateContractWrite(newPayload, oldPayload) { failures.push(`status: machine-cleared on a ${hangMoi || '(empty)'} contract — «machine-cleared» means Gate 2 passed WITHOUT a human signature, and that is T2-ONLY. T3 touches enforcement core / data / breaking API, so Gate 2 ALWAYS stops for a human: use verified, then /acceptance-gate:signoff to reach signed-off.`); } - if (!approvedBy && !gate1Skipped && !vOpen) { + if (!approvedBy && !gate1Skipped && !vOpen && !vetoRecorded) { if (status === 'approved' || status === 'signed-off' || status === 'machine-cleared') { failures.push(`status: ${status} with empty approved_by — Gate 1 approval not recorded. Fill approved_by (+ approved_at); only when the user explicitly skips Gate 1, record gate1_skipped: true (audited, pre-merge NOTEs it).`); } @@ -656,16 +1087,120 @@ function machineClearedSignoffConflict(contractTxt, evidenceTxt) { return `chữ ký người trên hồ sơ máy-thông — ký thì status phải sang signed-off (human_signoff="${sig}", status=machine-cleared). /signoff đổi status cùng lượt ghi chữ ký.`; } + +// <<` `|` `-`. Mọi thứ khác là chữ ký thật (phạm vi hẹp có chủ đích — +// xem chú thích lịch sử ở placeholder_signoff của lưới trước khi nó gọi vào đây). +const CHU_KY_GIU_CHO = [ + { mau: 'pending', tienTo: true }, { mau: 'tbd', tienTo: true }, + { mau: 'todo', tienTo: true }, { mau: 'n/a', tienTo: true }, + { mau: 'unsigned', tienTo: true }, { mau: 'waiting', tienTo: true }, + { mau: '<', tienTo: true }, + { mau: 'none', tienTo: false }, { mau: '>', tienTo: false }, + { mau: '|', tienTo: false }, { mau: '-', tienTo: false }, +]; +function laGiuCho(s) { + const v = String(s == null ? '' : s).trim().toLowerCase(); + if (!v) return false; + return CHU_KY_GIU_CHO.some(p => (p.tienTo ? v.startsWith(p.mau) : v === p.mau)); +} +// { signed, value, placeholder, warn } — `warn` LUÔN có mặt (chuỗi rỗng khi hình +// dạng tệp chuẩn); không bao giờ nuốt im một sự cố đọc. +function chuKyThat(reportText) { + const ket = (o) => ({ signed: false, value: '', placeholder: false, warn: '', ...o }); + if (reportText == null) return ket({ warn: 'không có evidence-report.md' }); + const dong = String(reportText).split('\n'); + const dau = dong.findIndex(l => l.trim() !== ''); + if (dau < 0 || !/^---[ \t]*\r?$/.test(dong[dau])) + return ket({ warn: 'frontmatter không dẫn đầu báo cáo' }); + let het = -1; + for (let i = dau + 1; i < dong.length; i++) { + if (/^---[ \t]*\r?$/.test(dong[i])) { het = i; break; } + } + const warn = het === -1 + ? 'frontmatter thiếu dấu đóng «---» ở cột 0 — đọc tới hết tệp' + : ''; + const than = dong.slice(dau + 1, het === -1 ? dong.length : het); + const d = than.find(l => /^human_signoff[ \t]*[:=]/i.test(l)); + if (d === undefined) return ket({ warn }); + const val = d.replace(/^human_signoff[ \t]*[:=]/i, '') + .replace(/^#.*$/, '').replace(/\s+#.*$/, '').trim(); + const cap = val.match(/^"([\s\S]*)"$/) || val.match(/^'([\s\S]*)'$/); + const s = (cap ? cap[1] : val).trim(); + if (!s) return ket({ warn }); + if (laGiuCho(s)) return ket({ value: s, placeholder: true, warn }); + return ket({ signed: true, value: s, warn }); +} +// CLI cho bên gọi KHÔNG phải JS (scripts/pre-merge-check.sh), cùng nếp +// lib/lop-nhin-thay.cjs: in MỘT dòng tab, exit 0 kể cả khi kết luận là «chưa ký». +// node lib/evidence-core.cjs chu-ky-that <đường dẫn báo cáo> +// → "\t\t\t" +// node lib/evidence-core.cjs giu-cho → "1" hoặc "0" +// Exit 3 = không đọc được tệp (bên gọi phân biệt được với «đọc được, chưa ký»). +if (require.main === module) { + const [lenh, arg] = process.argv.slice(2); + const mot = s => String(s == null ? '' : s).replace(/[\t\r\n]+/g, ' '); + if (lenh === 'chu-ky-that') { + let txt; + try { txt = require('fs').readFileSync(arg, 'utf8'); } + catch { process.exit(3); } + const r = chuKyThat(txt); + process.stdout.write(`${r.signed ? 1 : 0}\t${r.placeholder ? 1 : 0}\t${mot(r.value)}\t${mot(r.warn)}\n`); + process.exit(0); + } + if (lenh === 'giu-cho') { process.stdout.write(laGiuCho(arg) ? '1\n' : '0\n'); process.exit(0); } + // `bang-mau` để câu NOTE của lưới KỂ TÊN bảng mà không chép bảng: một danh sách + // gõ tay trong văn xuôi cũng là bản sao, và nó trôi im lặng y như mã. + if (lenh === 'bang-mau') { + process.stdout.write(CHU_KY_GIU_CHO.map(p => p.mau + (p.tienTo ? '*' : '')).join(', ') + '\n'); + process.exit(0); + } + process.stderr.write('evidence-core: lệnh lạ — dùng chu-ky-that | giu-cho \n'); + process.exit(2); +} +// CHU-KY-THAT>>> + module.exports = { PASS_FAMILY, + chuKyThat, + laGiuCho, + // Bảng xuất ra để phép đo RÚT từ chính nguồn (không gõ lại danh sách ở test). + CHU_KY_GIU_CHO, machineClearedSignoffConflict, findAcceptanceConfig, + unquoteScalar, + stripYamlComment, + splitTopLevel, + parseFlowValue, resolveConfigKey, resolveConfigList, - REPIN_EVALS_SINCE, REPIN_MACHINE_EXECUTORS, + normaliseEvalStatus, + isRepinMachineEval, machineEvalIds, + machineEvalIdsSkipped, + notRunConflicts, + extractEvalBlockExits, checkRepinEvals, + readSignedReportFor, frontmatterField, extractRunIds, loadRunLogIds, diff --git a/lib/lop-nhin-thay.cjs b/lib/lop-nhin-thay.cjs new file mode 100644 index 00000000..5c306a13 --- /dev/null +++ b/lib/lop-nhin-thay.cjs @@ -0,0 +1,101 @@ +// lop-nhin-thay.cjs — LUẬT DUY NHẤT trả lời «hợp đồng này có MẶT NGƯỜI NHÌN không» và «đã có +// bằng chứng lớp nhìn-thấy (ui-observed) chưa». +// +// Vì sao một chỗ: bốn bộ đọc (lint W8 · thẻ Cổng Phạm vi · thẻ Cổng Bằng chứng · pre-merge NOTE) +// và vị từ «có người dùng cuối» của nguong-o-co-hoi.cjs cùng hỏi một câu. Từ vựng `surfaces` đã +// trôi một lần (web / web-ui ngoài enum, mỗi bộ đọc một regex) — hồ sơ lop-bang-chung-nhin-thay +// (D4) gom về đây. Ai thêm bên đọc thứ năm thì GỌI hàm này, đừng chép regex. +// +// Neo máy của nghĩa vụ ở bản khai (lint W8 · thẻ Cổng Phạm vi · NOTE pre-merge) là +// `executor: ui-check`. Răng của FRAME là thẻ Cổng Bằng chứng: nó đọc block của eval ui-check +// trong evidence-report (đạt = exit_code 0 + screenshot:). Hook write-time KHÔNG đòi screenshot +// trên block ui-check — nó chỉ kiểm observed: khi block ĐÃ có screenshot: (evidence-core +// evaluateObserved). `layer: ui-observed` là NHÃN KHAI để luật ghép cặp đọc đối xứng với +// backend-effect; nhãn đặt trên executor khác ui-check là lạc chỗ (D1). +// +// Hàm THUẦN nhận chuỗi; chỉ classify() và CLI đọc đĩa — bên gọi quyết định đọc ở đâu. +'use strict'; +const fs = require('fs'); +const path = require('path'); +const evalYaml = require('./eval-yaml.cjs'); + +// Enum PHẢI BẰNG chú thích dòng `surfaces:` của khối CONTRACT-FRONTMATTER-TEMPLATE +// (ca LNT1 round-trip khuôn ↔ lib — đổi một bên là ca đỏ nêu giá trị). +const SURFACE_ENUM = ['api', 'cli', 'sdk', 'ui', 'mobile', 'docs', 'ci', 'config']; +const SURFACE_ALIAS = { web: 'ui', 'web-ui': 'ui' }; +// Tiền tố entry descope — SKILL chép nguyên văn, thẻ/lint/pre-merge so bằng startsWith. +const UI_OBSERVED_DESCOPE = 'bỏ ui-observed — '; + +function tokensOf(surfaces) { + const s = evalYaml.stripComment(String(surfaces == null ? '' : surfaces).replace(/^\s*surfaces:\s*/i, '')); + return s.replace(/[\[\]"']/g, '').split(',').map(t => t.trim().toLowerCase()).filter(Boolean); +} +const canon = t => SURFACE_ALIAS[t] || t; +const laMatNguoiNhin = surfaces => tokensOf(surfaces).some(t => canon(t) === 'ui'); +const tokenLa = surfaces => tokensOf(surfaces).filter(t => !SURFACE_ENUM.includes(t) && !SURFACE_ALIAS[t]); + +const ex = e => String(e && e.executor || '').trim().toLowerCase(); +const ly = e => String(e && e.layer || '').trim().toLowerCase(); +const uiCheckIds = evals => (Array.isArray(evals) ? evals : []).filter(e => ex(e) === 'ui-check').map(e => e.id); +const coUiObserved = evals => uiCheckIds(evals).length > 0; +const nhanLacCho = evals => (Array.isArray(evals) ? evals : []).filter(e => ly(e) === 'ui-observed' && ex(e) !== 'ui-check').map(e => e.id); + +// Cùng nếp eval-coverage-lint: giá trị trong quote giữ nguyên (kể cả #), ngoài quote thì +// " # …" là comment. +function fieldVal(raw) { + const s = String(raw).trim(); + const q = s[0]; + if (q === '"' || q === "'") { const end = s.indexOf(q, 1); if (end > 0) return s.slice(1, end); } + return evalYaml.stripComment(s); +} +const parseEvalsText = text => evalYaml.parseEvals(text, ['criterion', 'executor', 'layer'], fieldVal); + +function descopeId(ledgerText) { + for (const line of String(ledgerText == null ? '' : ledgerText).split('\n')) { + if (!line.trim()) continue; + try { + const j = JSON.parse(line); + if (j && j.type === 'descope' && String(j.decision || '').startsWith(UI_OBSERVED_DESCOPE)) return j.id || null; + } catch (_) { /* dòng hỏng: bỏ qua, bên đọc khác đã đếm */ } + } + return null; +} + +function frontLine(text, key) { + const m = String(text == null ? '' : text).match(/^---\r?\n([\s\S]*?)\r?\n---/); + const fm = m ? m[1] : ''; + const l = fm.split('\n').find(x => x.startsWith(key + ':')); + return l ? evalYaml.stripComment(l.slice(key.length + 1)) : ''; +} + +function classify(dir) { + const rd = f => { try { return fs.readFileSync(path.join(dir, f), 'utf8'); } catch (_) { return null; } }; + const c = rd('contract.md'); + if (c == null) return { applicable: false, reason: 'no-contract' }; + const surfaces = frontLine(c, 'surfaces'); + const approved_at = frontLine(c, 'approved_at') || '-'; + const applicable = laMatNguoiNhin(surfaces); + const e = rd('evals.yaml'); + if (e == null) return { applicable, reason: 'no-evals', surfaces, approved_at, tokenLa: tokenLa(surfaces) }; + const evals = parseEvalsText(e); + return { + applicable, reason: '', surfaces, approved_at, + declared: uiCheckIds(evals).length, + lacCho: nhanLacCho(evals), + descoped: descopeId(rd('decisions.jsonl')), + tokenLa: tokenLa(surfaces), + }; +} + +module.exports = { SURFACE_ENUM, SURFACE_ALIAS, UI_OBSERVED_DESCOPE, tokensOf, laMatNguoiNhin, tokenLa, uiCheckIds, coUiObserved, nhanLacCho, fieldVal, parseEvalsText, descopeId, frontLine, classify }; + +// CLI cho bash (pre-merge): `node lib/lop-nhin-thay.cjs classify ` → MỘT dòng +// `applicable\tdeclared\tdescoped_id\tapproved_at` (mẫu lib/gap-probe.cjs classify). +if (require.main === module) { + const [cmd, dir] = process.argv.slice(2); + if (cmd !== 'classify' || !dir) { process.stderr.write('usage: lop-nhin-thay.cjs classify \n'); process.exit(2); } + const r = classify(dir); + if (r.reason === 'no-contract') process.exit(3); + if (r.reason === 'no-evals') { process.stdout.write(`n-a\t-\t-\t${r.approved_at}\n`); process.exit(0); } + process.stdout.write(`${r.applicable ? 1 : 0}\t${r.declared}\t${r.descoped || '-'}\t${r.approved_at}\n`); +} diff --git a/lib/md-section.cjs b/lib/md-section.cjs index 05308130..95688dd4 100644 --- a/lib/md-section.cjs +++ b/lib/md-section.cjs @@ -41,6 +41,16 @@ function boundaryFor(heading) { // nào" — vd bộ dò mù criterion của lib/ac-line.cjs phải liệt số dòng bỏ sót cho // người duyệt — phải đi qua đây, KHÔNG tự duyệt lại: luật ranh giới per-section // nằm ở bảng marker trên đầu file này, hai bản duyệt sẽ trôi khỏi nhau. +// Luật TIÊU ĐỀ, một nguồn cho mọi bên duyệt trong tệp này và cho lib/ac-line.cjs. +// Trước lượt chấm 7 mỗi bên tự viết lại `/^#{1,6}\s/` của mình, và hai bên bất +// đồng đúng ở h1: sectionLines CỐ Ý coi `# guidance` là NỘI DUNG (luật +// same-or-higher chỉ đóng ở h2..h6) trong khi parseACBlock đóng khối ở cả h1. +// Hai luật cho một hình dạng dòng là điều kiện đủ để chúng trôi khỏi nhau — +// đúng lớp lỗi hồ sơ này đi đóng, nên nó không được sống ngay trong hồ sơ này. +const laTieuDe = (l) => /^\s*#{1,6}\s/.test(String(l == null ? '' : l)); +// Cấp ĐÓNG KHỐI: h2..h6. h1 không đóng — xem lý do ở chú thích trong sectionLines. +const dongKhoi = (l) => { const m = String(l == null ? '' : l).match(/^\s*(#{1,6})\s/); return !!m && m[1].length >= 2; }; + function sectionLines(t, h) { const rule = boundaryFor(h); const out = []; @@ -70,4 +80,61 @@ function sectionLines(t, h) { // không phải đổi. Nó là một lớp mỏng trên sectionLines: MỘT phép duyệt duy nhất. function section(t, h) { return sectionLines(t, h).map(x => x.l); } -module.exports = { SECTION_BOUNDARY, BOUNDARY_TABLE_RE, parseBoundaryTable, boundaryFor, section, sectionLines }; +// Dòng của một mục MANG CHỮ cho người đọc (hồ sơ cong-nguoi-doc-du-nguon). +// Gạch đầu dòng được ưu tiên; CHỈ khi mục không có gạch nào mới lấy dòng thường, +// và bỏ hàng phân cách của bảng vì nó không mang chữ. Ô khuôn `{{…}}` chưa điền +// không phải nội dung. +// +// VÌ SAO ở đây chứ không nội tuyến trong thẻ: 29 trên 244 hợp đồng có mục Coverage +// viết bằng BẢNG hoặc văn xuôi từng bị thẻ đọc ra rỗng rồi nổi cờ «chưa có section +// Coverage» trên một mục CÓ THẬT. Nếu luật này sống trong thẻ thì phép đo bán kính +// phải cài lại nó, và khi đó phép đo cho CÙNG một số trên mọi lớp — tức đo VĂN. +function contentLines(lines) { + // Nhánh GẠCH ĐẦU DÒNG giữ NGUYÊN hành vi đã có: dòng bọc 80 cột được NỐI vào + // gạch đang mở, dòng trắng đóng gạch, prose trước gạch đầu tiên bị bỏ. Lọc theo + // TỪNG DÒNG sẽ cắt cụt câu giữa chừng — lớp lỗi findings 05/08, ca P146 canh. + const raws = (lines || []).map(l => String(l == null ? '' : l)); + const gach = []; + let mo = false; + for (const l of raws) { + if (/^\s*-\s+\S/.test(l)) { gach.push(l.trim().replace(/^-\s+/, '')); mo = true; } + else if (!l.trim()) mo = false; + else if (mo && !/^\s*#{1,6}\s/.test(l)) gach[gach.length - 1] += ' ' + l.trim(); + } + const coGach = gach.filter(l => !/\{\{/.test(l)); + if (coGach.length) return coGach; + // Mục CÒN Ô KHUÔN chưa điền thì KHÔNG phải nội dung — dù ô ấy nằm ở dòng khác + // (sửa sau lượt chấm 1). Lọc `{{` theo TỪNG DÒNG là sai: khối hướng dẫn của + // khuôn trải nhiều dòng và chỉ dòng đầu mang ô, nên bốn dòng chữ dặn-việc lọt + // qua và thẻ coi một hợp đồng CHƯA HỀ quét độ phủ là «đã có độ phủ», tắt mất + // cờ vàng Cổng 1. Bản cũ (chỉ gạch đầu dòng) trả rỗng và cờ bắn đúng. + if (raws.some(l => /\{\{/.test(l))) return []; + // Không gạch nào và không ô khuôn nào: mục viết bằng BẢNG hoặc văn xuôi thật. + // Hàng PHÂN CÁCH của bảng không mang chữ cho người đọc — bỏ. Khuôn cũ + // `/^\s*\|?\s*:?-{2,}/` bỏ sót kiểu căn giữa `|:-:|:-:|` (chỉ MỘT gạch giữa hai + // dấu hai chấm), nên hàng ấy lên thẻ như một dòng nội dung. Khuôn dưới đây hỏi + // «cả dòng CHỈ gồm | - : và khoảng trắng», không đếm số gạch. + const LA_PHAN_CACH = /^[\s|:-]*$/; + const con = raws.filter(l => l.trim() && !LA_PHAN_CACH.test(l)); + // BẢNG: mỗi hàng là một phần tử, KHÔNG nối — nối hai hàng lại là bịa ra một + // hàng không có trong hợp đồng. + if (con.some(l => /^\s*\|/.test(l))) return con; + // VĂN XUÔI: nối dòng bọc 80 cột trong cùng một đoạn, đoạn cách nhau bằng dòng + // trắng — ĐÚNG cách nhánh gạch đầu dòng ở trên làm. Bản trước trả từng dòng thô + // nên thẻ cắt câu giữa chừng, đúng lớp lỗi mà chú thích của chính hàm này cấm + // (đo được ở ba hợp đồng ap-media-roadmap, lượt chấm 6). + // Tiêu đề và hàng phân cách ĐÓNG đoạn và KHÔNG vào nội dung — đúng như nhánh + // gạch đầu dòng ở trên vẫn làm. Bản trước chỉ `continue` nên `### Trục A` vừa + // lọt lên thẻ vừa dán chữ của hai mục con thành MỘT câu không có trong hợp + // đồng (lượt chấm 7), cùng lớp «bịa ra một hàng» mà nhánh BẢNG đã cấm. + const doan = []; + let dangMo = false; + for (const l of raws) { + if (!l.trim() || laTieuDe(l) || LA_PHAN_CACH.test(l)) { dangMo = false; continue; } + if (dangMo) doan[doan.length - 1] += ' ' + l.trim(); + else { doan.push(l.trim()); dangMo = true; } + } + return doan; +} + +module.exports = { SECTION_BOUNDARY, BOUNDARY_TABLE_RE, parseBoundaryTable, boundaryFor, section, sectionLines, contentLines, laTieuDe, dongKhoi }; diff --git a/scripts/pre-merge-check.sh b/scripts/pre-merge-check.sh index 9cee15f1..eaaaeacc 100755 --- a/scripts/pre-merge-check.sh +++ b/scripts/pre-merge-check.sh @@ -54,6 +54,9 @@ violations=0 # Bật khi lưới giữ-chỗ nổ ít nhất một lần; dùng để in ĐÚNG MỘT dòng cảnh báo # về phạm vi hẹp của chính lưới đó ở cuối lần chạy. NARROW_NET_SEEN="" +# Lưới giữ-chỗ KHÔNG chạy được (thiếu node / thiếu lib/evidence-core.cjs / lib lỗi). +# Nói ra ở cuối lượt: một luật im lặng không chạy là luật không còn. +NARROW_NET_BLIND="" # Bật khi răng cross-layer phải chấm bằng khuôn awk nội bộ vì thiếu node hoặc # lib/ac-line.cjs. Răng VẪN chạy (awk rộng hơn nên không rụng dòng nào), nhưng đó # là một định nghĩa "dòng criterion" khác với ba consumer JS — in đúng một dòng ở @@ -365,8 +368,8 @@ xanh_sach_check() { # const fs=require("fs"); const t=fs.readFileSync(process.argv[2],"utf8"); const h=process.argv[3]; - const has=t.split("\n").some(l=>/^#{1,6}\s+/.test(l) - && l.replace(/^#{1,6}\s+/,"").trim().toLowerCase()===h.toLowerCase()); + const has=t.split("\n").some(l=>/^#{2,6}\s+/.test(l) + && l.replace(/^#{2,6}\s+/,"").trim().toLowerCase()===h.toLowerCase()); if(!has){process.stdout.write("__VANG__");process.exit(0);} process.stdout.write(section(t,h).join("\n").trim()?"__CO__":""); ' "$ROOT/lib/md-section.cjs" "$report" "$_sec" 2>/dev/null || printf '__LOI__')" @@ -410,6 +413,10 @@ claims_released() { # — 0 iff thư mục TỰ NHẬN đã qua cổng. return 1 } +# MỘT NGUỒN của vị từ «chữ ký thật» (đổi khuôn S4-r2). Đường dẫn suy từ vị trí +# script như các lib khác của lưới (AC_LINE_LIB, LNT_LIB, WSREC_LIB). +CHU_KY_LIB="$(cd "$(dirname "$0")/.." 2>/dev/null && pwd)/lib/evidence-core.cjs" + placeholder_signoff() { # — 0 iff chữ ký khớp một mẫu giữ-chỗ đã biết. # ĐÂY LÀ LUẬT CHỮ KÝ DUY NHẤT còn lại (ngoài chốt rỗng). Không có lớp dự # phòng nào phía sau: `signoff.approvers` KHÔNG được cổng đọc kể từ 1.24.0 — @@ -422,14 +429,76 @@ placeholder_signoff() { # — 0 iff chữ ký khớp một mẫu giữ # `x`, `.`), và mọi giữ-chỗ viết bằng ngôn ngữ khác (`chờ Manh gật`). # Khớp theo TIỀN TỐ vì chữ ký thật dẫn đầu bằng tên. LC_ALL=C để `tr` không # chết trên UTF-8. + # ĐỔI KHUÔN S4-r2 (owner quyết 12/09): bảng mẫu KHÔNG còn ở đây. Nó sống MỘT + # chỗ — `laGiuCho` trong lib/evidence-core.cjs — và hàm này hỏi nó qua node, + # cùng nếp `lib/lop-nhin-thay.cjs classify`. Bảng bash cũ (bốn dòng `case`) đã + # GỠ và liệt đích danh trong ALLOWED_REMOVALS của DV5: giữ nó lại là giữ đúng + # bản-dựng-thứ-hai mà hai lượt chấm vừa bắt. + # Không đọc được nguồn (thiếu node / thiếu lib / lib lỗi) → KHÔNG chặn, và nói + # ra: cùng doctrine với lớp nhìn-thấy và ac-line trong chính tệp này, và ca NO2 + # của lưới thường trực ghim đúng điều đó («thiếu node: NOTE không được chặn + # merge»). Bản đầu của lượt S4-r2 chọn fail-CLOSED ở đây và làm 6 ca đỏ — + # chốt rỗng phía trên vẫn chặn chữ ký trống, nên đường này không im lặng cho + # qua một hồ sơ chưa ký; nó chỉ thôi phân loại GIỮ-CHỖ khi không có bộ đọc. + _gc="$(node "$CHU_KY_LIB" giu-cho "$1" 2>/dev/null)" + case "$_gc" in + 1) return 0 ;; + 0) return 1 ;; + esac + # Engine không nạp được (thiếu node / thiếu lib / lib lỗi). Đây là luật CHẶN và + # trước đổi khuôn nó KHÔNG cần node — nên KHÔNG được im lặng cho qua (S4-r3: + # đo được «lib bị gỡ → exit 0, mất VIOLATION»). Bản lùi dưới đây là BẢN CHIẾU + # của bảng ở lib, KHÔNG phải nguồn thứ hai: chân `lui-khong-engine` chạy MỌI mẫu + # của nguồn qua chính đường này với lib đã gỡ và đòi kết luận khớp, nên hai bên + # không trôi khỏi nhau trong im lặng. Tiền lệ cùng hình dạng: khuôn awk của + # ac-line ở lại làm đường lùi cho máy thiếu node. + NARROW_NET_BLIND=1 +# <<'|'|'|'-') return 0 ;; '<'*) return 0 ;; # template chưa điền: " " pending*|tbd*|todo*|n/a*|none|unsigned*|waiting*) return 0 ;; esac +# BANG-LUI-GIU-CHO>>> return 1 } +# Chữ ký người ở Cổng Bằng chứng ĐÓNG cửa veto (hồ sơ cua-veto-sau-chu-ky). +# Cửa veto là đường đảo cho việc MÁY tự quyết mà người chưa nói gì; người đã +# phát ngôn rồi thì «owner chưa veto» là câu sai. Đo 11/09: 27 trên 30 tên ở +# dòng tổng của kit đã ký, media-library 3/3, floorplanstudio 1/1. +# +# Vị từ là QUAN HỆ, không phải nhãn: `status: signed-off` không đóng cửa (nhãn +# là lời khai, luật khác đã bắt nó), chữ ký giữ-chỗ cũng không — dùng lại ĐÚNG +# `placeholder_signoff` ở trên, không dựng bảng thứ hai. Chỉ đọc frontmatter DẪN +# ĐẦU qua front_field: một dòng `human_signoff:` ở THÂN báo cáo (trích khuôn) +# không phải chữ ký. +# MỘT hàm cho CẢ HAI chỗ đọc (NOTE làn V và vòng veto-trace) — hai bản trong +# cùng một file là hình dạng bên-viết-bên-đọc-trôi mà kit đã dẫm nhiều lần. +chu_ky_gia_tri() { # <đường dẫn báo cáo> — in GIÁ TRỊ chữ ký theo NGUỒN (rỗng nếu vắng) + local _l + _l="$(node "$CHU_KY_LIB" chu-ky-that "$1" 2>/dev/null)" + if [ -n "$_l" ]; then printf '%s' "$_l" | cut -f3; return 0; fi + NARROW_NET_BLIND=1 + front_field "$1" human_signoff +} + +signoff_that() { # — 0 iff có chữ ký THẬT; đặt $SIGNOFF_THAT + # ĐỔI KHUÔN S4-r2: không tự đọc frontmatter nữa. Ngữ pháp (dấu fence, luật cột, + # cách viết khoá, bảng giữ-chỗ) sống MỘT chỗ trong lib/evidence-core.cjs; hàm + # này hỏi nó qua node và đọc MỘT dòng tab — nếp lib/lop-nhin-thay.cjs. + # Không đọc được nguồn → return 1 (chưa ký): cửa veto GIỮ MỞ, chiều an toàn của + # luật này, và hồ sơ vẫn đi tiếp qua các chốt bằng chứng như thường. + SIGNOFF_THAT="" + [ -f "$1/evidence-report.md" ] || return 1 + local _line _signed + _line="$(node "$CHU_KY_LIB" chu-ky-that "$1/evidence-report.md" 2>/dev/null)" || return 1 + _signed="$(printf '%s' "$_line" | cut -f1)" + [ "$_signed" = "1" ] || return 1 + SIGNOFF_THAT="$(printf '%s' "$_line" | cut -f3)" + return 0 +} + # Mọi đường mà luật gap-probe KHÔNG chạy được đều đi qua ĐÂY. Một hàm, một # marker, một chỗ quyết định mode — vì kênh "NOTE rồi exit 0" đã giết contract @@ -464,11 +533,39 @@ t1_escape_not_enforced() { echo "NOTE: rủi ro khi tắt — nếu một thay đổi chạm code quan trọng lọt vào lần chạy này, nó sẽ KHÔNG bị chặn vì thiếu hồ sơ nghiệm thu. Các luật khác vẫn chạy đủ (phản biện context sạch, chữ ký người, bằng chứng hết hạn). Muốn bật lại: bỏ cờ --no-t1-escape." } +# ── `**/` là KHÔNG-hoặc-nhiều thư mục (glob-hai-sao-khop-goc-kho, 2.9.0) ────── +# `case` của bash đòi `**/` phải có ít nhất một `/`, nên `**/*.md` bỏ sót +# AGENTS.md ở gốc kho (CRM 07/09: 4 hồ sơ stale/ngày vì commit thuần tài liệu). +# Sinh mọi biến thể của glob với từng đoạn `**/` được GIỮ hoặc BỎ — chỉ tách tại +# chuỗi ba ký tự `**/`, KHÔNG tại `**` (docs/** phải đi qua nguyên vẹn, HS10). +# `*` vẫn vượt `/` như trước — lời khai `*.md`/`docs/**` ở mọi consumer không +# đổi nghĩa. Biến thể rỗng (glob chỉ là `**/`) bị bộ khớp bỏ qua, không khớp-mọi-thứ. +glob_variants() { # <đã-xử-lý> — in mỗi biến thể một dòng + case "$2" in + *'**/'*) + local pre="${2%%\*\*/*}" post="${2#*\*\*/}" + glob_variants "$1$pre" "$post" # GLOB-DOUBLESTAR-ZERO-DIRS + glob_variants "$1$pre**/" "$post" + ;; + *) printf '%s\n' "$1$2" ;; + esac +} match_globs() { # — 0 iff any glob matches while IFS= read -r g; do [ -n "$g" ] || continue # unquoted $g on purpose: case PATTERN matching (globs never fs-expand here) case "$1" in $g) return 0 ;; esac + # Glob có `**/` → thử thêm mọi biến thể giữ/bỏ từng đoạn (glob_variants ở + # trên). Thuần CỘNG: dòng khớp cũ vẫn chạy trước, không đổi nghĩa glob nào + # không chứa `**/` (HS10) — và DV5 (chỉ-thêm) giữ được nguyên vẹn. + case "$g" in *'**/'*) + while IFS= read -r v; do + [ -n "$v" ] || continue + case "$1" in $v) return 0 ;; esac + done </dev/null && pwd)/lib/lop-nhin-thay.cjs" + if { [ "$DIFF_READY" -eq 0 ] || slug_in_diff "$slug" || [ "$RECHECK_ALL" -eq 1 ]; } && [ -f "${dir}evals.yaml" ]; then + # Ba nguyên nhân KHÔNG-kiểm-được từng nấp sau một câu gộp: người đọc NOTE không + # biết phải copy lib, cài node, hay đi sửa lib đang lỗi (nợ C1 Ngoài-5). + lnt_line=""; lnt_why="" + if ! command -v node >/dev/null 2>&1; then + lnt_why="thiếu node; cài node để cổng đọc được lib" + elif [ ! -f "$LNT_LIB" ]; then + lnt_why="thiếu lib/lop-nhin-thay.cjs (mang cổng vào repo phải copy CẢ lib/)" + else + lnt_line="$(node "$LNT_LIB" classify "$dir" 2>/dev/null)"; lnt_rc=$? + # exit 3 = hồ sơ không có contract.md (không phải lỗi lib) — im lặng như trước. + if [ "$lnt_rc" -ne 0 ] && [ "$lnt_rc" -ne 3 ]; then lnt_why="lib lỗi (exit $lnt_rc)"; lnt_line=""; fi + fi + if [ -n "$lnt_why" ]; then + echo "NOTE [$slug]: lớp nhìn-thấy không kiểm được — ${lnt_why}; NOTE này không chặn." + elif [ -n "$lnt_line" ]; then + lnt_app="$(printf '%s' "$lnt_line" | cut -f1)"; lnt_decl="$(printf '%s' "$lnt_line" | cut -f2)" + lnt_desc="$(printf '%s' "$lnt_line" | cut -f3)"; lnt_appr="$(printf '%s' "$lnt_line" | cut -f4)" + if [ "$lnt_app" = "1" ] && [ "$lnt_decl" = "0" ]; then + if [ "$lnt_desc" != "-" ]; then + echo "NOTE [$slug]: mặt người nhìn (surfaces ui/web) nhưng không eval ui-check — đã BỎ có tên theo ledger $lnt_desc (approved_at $lnt_appr); người ký Cổng Bằng chứng đọc tên ca máy, không nhìn frame. Ngưỡng siết: 2 hợp đồng ký không frame trong một mốc phát hành." + else + echo "NOTE [$slug]: mặt người nhìn (surfaces ui/web) nhưng không eval ui-check nào — bằng chứng lớp mã thay lớp nhìn-thấy (approved_at $lnt_appr). Thêm ≥1 ui-check (layer: ui-observed) theo hợp đồng, hoặc ghi entry descope có tên. Ngưỡng siết: 2 hợp đồng ký không frame trong một mốc phát hành." + fi + fi + fi + fi + # Counter scope NẰM NGOÀI khối luật bên dưới và cố ý khác lexical (off không # nháy kép): tiêm vô hiệu khối thì counter vẫn đếm, sổ lệch, chokepoint bắt. [ "$GAP_PROBE_MODE" != off ] && slug_in_diff "$slug" && GP_SCOPE_N=$((GP_SCOPE_N+1)) @@ -1286,7 +1429,13 @@ XLACS # provenance reads below, so a no-fence/offset-fence report can't pass verdict # while its provenance reads empty (would otherwise let a bypassed PASS slip). verdict="$(front_field "$report" verdict)" - signoff="$(front_field "$report" human_signoff)" + # S4-r3: chỗ đọc chữ ký của luật Cổng 2 cũng đi qua NGUỒN. Trước đó nó dùng + # front_field (awk chỉ nhận `human_signoff:`) trong khi engine nhận thêm `=` và + # khoảng trắng trước dấu — cùng một tệp cho hai kết luận: lưới in «đã đóng bằng + # chữ ký (…)» rồi ngay dưới in «xanh-sạch … cửa veto vẫn mở». Một ngữ pháp, một + # chỗ. Engine vắng → lùi về front_field (khai ở NOTE của lưới giữ-chỗ). + signoff="$(chu_ky_gia_tri "$report")" + LAN_V=0 # DLPS-LAN-V-MOT-DUONG: 1 khi hồ sơ làn V xanh-sạch đi tiếp KHÔNG chữ ký (đổi khuôn, owner 08/09) # ── machine-cleared × chữ ký người = hai sự thật cãi nhau (hồ sơ ra-co-ten, AC-15) ── # Ký thì status phải sang signed-off; để chữ ký nằm trên hồ sơ máy-thông là mọi bên đọc # nói hai chuyện về cùng một hồ sơ. @@ -1329,11 +1478,20 @@ XLACS # Đường xanh-sạch KHÔNG có chữ ký để kiểm tiếp — các chốt dưới (giữ-chỗ, # provenance commit chữ ký) đều nói về một chuỗi không tồn tại ở đây. echo "NOTE [$slug]: xanh-sạch — máy đi tiếp, KHÔNG mời ký (verdict PASS · 0 UNCERTAIN · không bypass · Known limits rỗng · Ngoài hợp đồng rỗng · hạng T2). Cửa veto vẫn mở." - continue + # DLPS-LAN-V-MOT-DUONG (duong-lui-phai-song, đổi khuôn — owner 08/09/2026): KHÔNG `continue`. + # Làn V rơi xuống CÙNG chuỗi kiểm với hồ sơ có chữ ký — hoá cũ · pin ma · re-pin + # provenance · làn eval · soi lại — đúng chữ «soi MỌI hồ sơ ở MỌI lượt» (ADR 0014). + # Ba vòng S4 của hồ sơ này đều bắt cùng lớp fail-open ở chính chỗ `continue` cũ: hồ sơ + # máy-đi-trước là loại KHÔNG có người đọc lại, nên không được là loại duy nhất thoát lưới. + # Các chốt chỉ nói về chữ ký (giữ-chỗ · chiều ghi chữ ký) tự bỏ qua vì $signoff rỗng / + # LAN_V=1; dòng OK ở cuối gọi đúng tên làn. + LAN_V=1 fi + if [ "$LAN_V" != 1 ]; then echo "NOTE [$slug]: không đủ điều kiện xanh-sạch để đi tiếp không ký — $clean_why" echo "VIOLATION [$slug]: verdict PASS but human_signoff is empty (Gate 2 pending)" violations=$((violations+1)); continue + fi fi # THỨ TỰ CÓ RĂNG: chốt rỗng ngay trên chạy TRƯỚC. Gộp hai chốt cho gọn sẽ làm # chuỗi rỗng không khớp mẫu lưới-đen nào rồi rơi ra `clean` — hồi quy fail-open @@ -1384,6 +1542,7 @@ XLACS # Phạm vi: CHỈ hồ sơ nằm trong diff PR — dùng ĐÚNG hàm slug_in_diff mà luật # staleness/gap-probe dùng. Không thu phạm vi thì mọi hồ sơ sử liệu đều in # một dòng mỗi lần chạy (đo thật: 20+ dòng), đúng lớp loãng-tín-hiệu. + if [ "$LAN_V" != 1 ]; then # DLPS-LAN-V-MOT-DUONG: làn V không có chữ ký → không có chiều ghi để nói if [ -n "$BASE" ] && slug_in_diff "$slug" && command -v git >/dev/null 2>&1 && git -C "$ROOT" rev-parse --git-dir >/dev/null 2>&1; then rel_report="$(cd "$ROOT" 2>/dev/null && git ls-files --full-name -- "${report#"$ROOT"/}" 2>/dev/null | head -1)" [ -n "$rel_report" ] || rel_report="${report#"$ROOT"/}" @@ -1394,6 +1553,7 @@ XLACS echo "NOTE [$slug]: chữ ký mới trong diff — $signoff — provenance ở forge: người bấm merge xác nhận đây là quyết định của người" fi fi + fi # đóng guard DLPS-LAN-V-MOT-DUONG # Stale-evidence check: the PASS certifies the tree at verified_commit. Any # non-gate file changed since then (committed or working tree) means the code # being merged is NOT the code that was verified — re-verify, don't ride old @@ -1605,8 +1765,11 @@ REPINIDS # xanh (crm-onehub 07/09). MỘT nguồn luật: checkRepinEvals trong # lib/evidence-core.cjs (bên đọc thứ hai là recheck-evidence.cjs); nó liệt # kê eval máy qua lib/eval-yaml.cjs, nên cả hai phải được chép theo - # INIT-CI-COPY-LIST. Làn trước mốc REPIN_EVALS_SINCE là sử liệu suite-only: - # NOTE, không chặn. Thiếu node/lib → khai NOT ENFORCED, không im lặng. + # INIT-CI-COPY-LIST. KHÔNG mốc ngày, KHÔNG phạm vi diff (owner 08/09/2026, + # hai lần): làn suite-only đời nào, hồ sơ nào trong kho, cũng là VIOLATION ở + # MỌI lượt chạy — pin chưa chứng không được nằm im chỉ vì PR không chạm nó; + # cách sửa duy nhất là ghim lại bằng làn eval. Thiếu node/lib → khai NOT + # ENFORCED, không im lặng. if [ -n "$vc" ]; then if command -v node >/dev/null 2>&1 && [ -f "$HERE/../lib/evidence-core.cjs" ]; then repin_evals_out="$(REPIN_IDS="$repin_ids" node -e ' @@ -1623,7 +1786,7 @@ REPINIDS let bad = 0; for (const id of ids) { const e = repins.get(id); if (!e || e.sha !== vc) continue; - const r = core.checkRepinEvals(e, evalsText, slug); + const r = core.checkRepinEvals(e, evalsText, slug, core.readSignedReportFor(evalsPath)); if (r.note) process.stdout.write(`NOTE [${slug}]: ${r.note}\n`); for (const x of r.errs) { bad = 1; process.stdout.write(`VIOLATION [${slug}]: ${x}\n`); } } @@ -1699,12 +1862,18 @@ NETIDS printf '%s\n' "$recheck_out" | sed 's/^/ /' if [ "$RECHECK_MODE" = strict ]; then violations=$((violations+1)); continue; fi elif [ "$rc" -ne 0 ]; then + if [ "$RECHECK_MODE" = strict ]; then echo "VIOLATION [$slug]: evidence re-check KHÔNG CHẠY ĐƯỢC (exit $rc) — recheck: strict coi cổng câm là cổng hỏng; sửa: vendor lib/ cạnh scripts/, đọc được evidence-report.md"; violations=$((violations+1)); continue; fi echo "NOTE [$slug]: evidence re-check unavailable (exit $rc) — ${recheck_out:-skipped}" fi else + if [ "$RECHECK_MODE" = strict ]; then + if [ ! -f "$RECHECK" ]; then rc_duong="recheck-evidence.cjs vắng"; else rc_duong="node vắng"; fi + echo "VIOLATION [$slug]: evidence re-check KHÔNG CHẠY ĐƯỢC ($rc_duong) — recheck: strict coi cổng câm là cổng hỏng; vendor scripts/recheck-evidence.cjs + lib/ và cài node"; violations=$((violations+1)); continue + fi echo "NOTE [$slug]: evidence re-check not vendored (recheck-evidence.cjs/node missing) — committed-evidence bar NOT enforced" fi fi + if [ "$LAN_V" = 1 ]; then echo "OK [$slug]: $verdict — làn V, máy đi tiếp không chữ ký (đã qua cùng chuỗi kiểm: hoá cũ · pin · làn eval · soi lại)"; continue; fi echo "OK [$slug]: $verdict, signed off by $signoff" done @@ -1736,6 +1905,11 @@ if [ -d "$ACC" ]; then contract="$dir/contract.md" [ -f "$contract" ] || continue vstate="$(front_field "$contract" veto_state | tr '[:upper:]' '[:lower:]')" + # Hồ sơ đã có chữ ký người thì cửa veto không còn là chốt đang giữ nó — đổi + # nhãn TRƯỚC khi `case` đếm, để dòng `mo)` bên dưới giữ nguyên văn (DV5). + # Nhãn `mo-da-ky` cố ý KHÔNG rỗng: nhánh ghi-ngược bên dưới đọc `$vstate`, và + # một chuỗi rỗng ở đó nghĩa là «đã gỡ khoá» — nói dối về một hồ sơ còn khoá. + if [ "$vstate" = "mo" ] && signoff_that "$dir"; then vstate="mo-da-ky"; fi case "$vstate" in mo) VETO_OPEN_N=$((VETO_OPEN_N+1)) @@ -1744,6 +1918,11 @@ if [ -d "$ACC" ]; then echo "VIOLATION [$slug]: veto_state=da-veto chưa xử — owner đã veto, hồ sơ không được merge ở trạng thái này. Xử bằng một trong hai đường rồi ghi entry sổ quyết định: quay hồ sơ về status draft để làm lại phạm vi, hoặc owner duyệt tay (approved_by)." violations=$((violations+1)) ;; esac + # Trả nhãn tạm về ngay sau `case`: `mo-da-ky` chỉ sống ĐÚNG trong phép đếm ở + # trên. Để nó chảy tiếp thì thông điệp của luật ghi-ngược in «da-veto -> + # mo-da-ky» — một nhãn nội bộ rò ra câu nói với người, và đó là ĐỔI một câu + # chặn chứ không còn là đổi lời của cửa veto (chân luat-lan-can bắt sống). + if [ "$vstate" = "mo-da-ky" ]; then vstate="mo"; fi # chiều ghi-ngược — chỉ xét được khi dựng nổi phạm vi diff if [ "$DIFF_READY" -eq 1 ] && slug_in_diff "$slug"; then base_c="$(git -C "$ROOT" show "$BASE_SHA:_acceptance/$slug/contract.md" 2>/dev/null || true)" @@ -1868,7 +2047,11 @@ if [ -n "$AC_LINE_FALLBACK_SEEN" ]; then fi if [ -n "$NARROW_NET_SEEN" ]; then - echo "NOTE: the placeholder net that just fired matches a SHORT FIXED prefix list — pending, tbd, todo, n/a, none, unsigned, waiting, a bare > | or -, and an unfilled <...> template. NOTHING else. A holding note phrased any other way (\"FIXME\", \"LGTM\", \"ok\", or one written in another language) passes this gate. Rewording the line is NOT a fix; put a real approver name + date there." + echo "NOTE: the placeholder net that just fired matches a SHORT FIXED prefix list — $(node "$CHU_KY_LIB" bang-mau 2>/dev/null) (dấu * = khớp tiền tố). NOTHING else is treated as a placeholder: unlisted English holds (FIXME, placeholder, LGTM), curt words (ok, yes, x, .), and holds written in any other language ALL PASS the net. Bảng ở lib/evidence-core.cjs là MỘT nguồn — câu này đọc từ đó, không chép lại." +fi + +if [ -n "$NARROW_NET_BLIND" ]; then + echo "NOTE: lưới giữ-chỗ của chữ ký KHÔNG chạy được lượt này — thiếu node hoặc thiếu lib/evidence-core.cjs (mang cổng vào repo phải copy CẢ lib/). Chốt «chữ ký rỗng» vẫn chặn; riêng phép phân loại giữ-chỗ (bảng ở lib/evidence-core.cjs, xem \`node lib/evidence-core.cjs bang-mau\`) không kiểm được, nên một dòng giữ chỗ có thể lọt. NOTE này không chặn." fi if [ "$LEGACY_SIGN_KNOB" -eq 1 ]; then diff --git a/scripts/recheck-evidence.cjs b/scripts/recheck-evidence.cjs index ecdb861c..c1366868 100644 --- a/scripts/recheck-evidence.cjs +++ b/scripts/recheck-evidence.cjs @@ -93,14 +93,14 @@ if (!core.determineEnforce(payload)) process.exit(0); // The lane that backs verified_commit must have re-run THIS slug's // test/script evals at that sha (evals_exit). One rule source: // core.checkRepinEvals — pre-merge prints the same words under its own - // label; history lanes (before REPIN_EVALS_SINCE) only NOTE there. + // label. No date mark, no grandfather (owner, 2026-09-08). if (vc) { const evalsPath = path.join(dir, 'evals.yaml'); const evalsText = fs.existsSync(evalsPath) ? fs.readFileSync(evalsPath, 'utf8') : null; for (const id of new Set(cited)) { const e = repins.get(id); if (!e || e.sha !== vc) continue; - for (const x of core.checkRepinEvals(e, evalsText, slug).errs) errs.push(`REPIN x ${x}`); + for (const x of core.checkRepinEvals(e, evalsText, slug, payload).errs) errs.push(`REPIN x ${x}`); } } } From 6afe1b117a8445d885633ae07f365fe9dc073120 Mon Sep 17 00:00:00 2001 From: Phan Le Manh Date: Wed, 16 Sep 2026 09:04:19 +0700 Subject: [PATCH 02/13] =?UTF-8?q?fix(biome):=20mi=E1=BB=85n=20tr=E1=BB=AB?= =?UTF-8?q?=20lib/lop-nhin-thay.cjs=20=E2=80=94=20file=20vendored=20th?= =?UTF-8?q?=E1=BB=A9=209=20c=E1=BB=A7a=20l=E1=BB=9Bp=20CI?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Commit hợp nhất trước thêm `lib/lop-nhin-thay.cjs` (kit 2.14.0 gọi nó) nhưng không nối vào danh sách miễn trừ của biome, nên `pnpm lint:check` đỏ và chặn TOÀN BỘ chiến dịch ghim lại — suite của kho đỏ thì không hồ sơ nào ghim được. Miễn trừ theo tên, KHÔNG định dạng lại file. Chiều theo biome sẽ làm bản sao lệch khỏi kit (nháy, thụt, ngoặc arrow) — đúng lớp lệch mà vòng này vừa gỡ, và sẽ đẻ xung đột giả ở lần nâng kit kế. 8 file vendored cũ đều đã miễn trừ theo đúng cách này; đây là file thứ 9. Kiểm hai chiều: lint xanh sau vá; tiêm lỗi định dạng thật vào một file do oneflow viết (src/app/api/director/feedback/route.ts) thì lint VẪN đỏ — miễn trừ không làm cùn răng. Co-Authored-By: Claude Opus 5 --- biome.json | 1 + 1 file changed, 1 insertion(+) diff --git a/biome.json b/biome.json index 790db8be..80b56b8a 100644 --- a/biome.json +++ b/biome.json @@ -34,6 +34,7 @@ "!lib/md-section.cjs", "!lib/workspace-record.cjs", "!lib/eval-yaml.cjs", + "!lib/lop-nhin-thay.cjs", "!_acceptance" ] }, From 9518fc7fb67d18a7f7e991580b6e977f999be893 Mon Sep 17 00:00:00 2001 From: Phan Le Manh Date: Wed, 16 Sep 2026 09:47:37 +0700 Subject: [PATCH 03/13] =?UTF-8?q?fix(acceptance):=20check-build-approvals?= =?UTF-8?q?=20=C4=91i=20qua=20own-range=20+=20neo=20landed=5Fmerge=20cho?= =?UTF-8?q?=202=20h=E1=BB=93=20s=C6=A1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Làn ghim lại chạy lại eval của hồ sơ trên MỘT NHÁNH KHÁC. `check-build-approvals.sh` chấm `git diff origin/main...HEAD`, nên ở đó nó chấm diff của người khác — `pnpm-build-approvals/E16` đỏ và liệt kê ra chính các file của commit nâng kit. Đúng lớp lỗi đầu `own-range.sh` ghi sử: ba feature đã ký đỏ vĩnh viễn trên feat/compose-overlay. Vá HAI nửa — mỗi nửa một mình đều vô dụng: 1. ĐƯỜNG DÂY: script gọi `own-range.sh` khi có ACCEPTANCE_SLUG, sao chép nguyên mẫu của ba script anh em (check-no-config-drift · check-workflow-drift · check-no-t3-drift). Sửa theo LỚP: cả BA chỗ dùng `$BASE...HEAD` (explicit-decisions · keys-intact · scope-confined), không chỉ case bị nêu tên. Không có slug thì hành vi Y NGUYÊN như trước. 2. DỮ LIỆU: `landed_merge` cho `pnpm-build-approvals` (afe3682) và `ci-vitest-sdk-pin` (32e55c3). Thiếu neo thì own-range rơi về đúng `origin/main...HEAD` — vá đường dây xong vẫn đỏ. Cả hai sha suy từ lệnh (merge đầu tiên trên ancestry-path chứa commit hợp đồng), không gõ tay — bài học 29 pin-ma. Truy vấn đã qua đối chứng dương: nó tái tạo đúng hai neo đã biết (task-metering f335135, ci-actions-bump 8477f8a). Lượt đo đầu của tôi dùng --first-parent và trả "không có merge" cho CẢ hai hồ sơ đã có neo — đối chứng bắt được truy vấn hỏng trước khi nó thành kết luận. Neo afe3682 xác nhận bằng hai tín hiệu độc lập: phạm vi của nó (5 commit, 4 file của chính hồ sơ, chỉ dư config.yaml) trùng khuôn của neo đã-được-duyệt task-metering; và với nó eval chuyển sang xanh KÈM lời đúng ("diff confined to tooling config and this feature's gate artifacts"), không xanh rỗng. Kiểm: - không ACCEPTANCE_SLUG → 0/0/1, trùng khít mốc trước khi vá (bảo toàn hành vi) - có slug, chưa neo → vẫn đỏ (đúng thiết kế) - có slug, có neo → 0/0/0 - fail-closed: slug bịa → exit 2 · neo hỏng → exit 2 (không ngả nào thành xanh) - ci-vitest-sdk-pin E4 với neo → exit 0, đọc lượt CI lịch sử thật, 5/5 job success Co-Authored-By: Claude Opus 5 --- _acceptance/ci-vitest-sdk-pin/contract.md | 1 + _acceptance/config.yaml | 6 ++-- _acceptance/pnpm-build-approvals/contract.md | 1 + scripts/pnpm/check-build-approvals.sh | 35 +++++++++++++++++--- 4 files changed, 36 insertions(+), 7 deletions(-) diff --git a/_acceptance/ci-vitest-sdk-pin/contract.md b/_acceptance/ci-vitest-sdk-pin/contract.md index 10434e94..142a2641 100644 --- a/_acceptance/ci-vitest-sdk-pin/contract.md +++ b/_acceptance/ci-vitest-sdk-pin/contract.md @@ -5,6 +5,7 @@ slug: ci-vitest-sdk-pin owner: phanlemanh@gmail.com risk_tier: T2 surfaces: [ci, scripts, docs] +landed_merge: 32e55c3 status: signed-off approved_by: Manh approved_at: 2026-08-05 diff --git a/_acceptance/config.yaml b/_acceptance/config.yaml index 4b617bd4..94549d78 100644 --- a/_acceptance/config.yaml +++ b/_acceptance/config.yaml @@ -681,9 +681,9 @@ executors: pnpm_teeth_legacy_key: "bash scripts/pnpm/check-build-approvals.sh --case teeth-legacy-key" pnpm_ci_pnpm10: "bash scripts/pnpm/check-build-approvals.sh --case ci-pnpm10" pnpm_tracked_not_ignored: "bash scripts/pnpm/check-build-approvals.sh --case tracked-not-ignored" - pnpm_explicit_decisions: "bash scripts/pnpm/check-build-approvals.sh --case explicit-decisions" - pnpm_keys_intact: "bash scripts/pnpm/check-build-approvals.sh --case keys-intact" - pnpm_scope_confined: "bash scripts/pnpm/check-build-approvals.sh --case scope-confined" + pnpm_explicit_decisions: "ACCEPTANCE_SLUG=pnpm-build-approvals bash scripts/pnpm/check-build-approvals.sh --case explicit-decisions" + pnpm_keys_intact: "ACCEPTANCE_SLUG=pnpm-build-approvals bash scripts/pnpm/check-build-approvals.sh --case keys-intact" + pnpm_scope_confined: "ACCEPTANCE_SLUG=pnpm-build-approvals bash scripts/pnpm/check-build-approvals.sh --case scope-confined" pnpm_case_completeness: "bash scripts/pnpm/check-build-approvals.sh --case case-completeness" # add-media-library Gate 1 (2026-08-19). The tier-boundary key reuses the shared # scanner: --allow names the two t3 paths this feature legitimately touches (the diff --git a/_acceptance/pnpm-build-approvals/contract.md b/_acceptance/pnpm-build-approvals/contract.md index 47087854..1ba1366b 100644 --- a/_acceptance/pnpm-build-approvals/contract.md +++ b/_acceptance/pnpm-build-approvals/contract.md @@ -5,6 +5,7 @@ slug: pnpm-build-approvals owner: phanlemanh@gmail.com risk_tier: T2 surfaces: [ci, scripts] +landed_merge: afe3682 status: signed-off approved_by: Manh approved_at: 2026-08-18 diff --git a/scripts/pnpm/check-build-approvals.sh b/scripts/pnpm/check-build-approvals.sh index f782abcb..2d94d531 100755 --- a/scripts/pnpm/check-build-approvals.sh +++ b/scripts/pnpm/check-build-approvals.sh @@ -12,6 +12,33 @@ ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/../.." && pwd)" WS="$ROOT/pnpm-workspace.yaml" BASE="${PNPM_APPROVALS_BASE:-origin/main}" +# Cái range này thuộc về `scripts/acceptance/own-range.sh` và không chỗ nào +# khác: đây là một lời gọi, không phải bản cài đặt thứ hai của nó. Không có +# ACCEPTANCE_SLUG thì giữ nguyên hành vi cũ (BASE...HEAD), nên mọi lối gọi tay +# và mọi case không đụng range đều không đổi một chút nào. +# +# Vì sao cần: làn re-pin chạy lại eval của hồ sơ trên MỘT NHÁNH KHÁC. Chấm +# `origin/main...HEAD` ở đó là chấm diff của người khác — đúng lớp lỗi đã làm +# ba feature đã ký đỏ vĩnh viễn trên feat/compose-overlay (xem đầu own-range.sh). +if [ -n "${ACCEPTANCE_SLUG:-}" ]; then + RESOLVER="$(cd "$(dirname "${BASH_SOURCE[0]}")/../acceptance" && pwd)/own-range.sh" + if ! own="$(bash "$RESOLVER" "$ACCEPTANCE_SLUG")"; then + echo "could not resolve the commit range owned by '${ACCEPTANCE_SLUG}' — refusing to report a clean tree" >&2 + exit 2 + fi + RANGE_FROM="$(printf '%s\n' "$own" | sed -n 's/^range_from=//p')" + RANGE_TO="$(printf '%s\n' "$own" | sed -n 's/^range_to=//p')" + if [ -z "$RANGE_FROM" ] || [ -z "$RANGE_TO" ]; then + echo "own-range.sh printed no range for '${ACCEPTANCE_SLUG}' — refusing to report a clean tree" >&2 + exit 2 + fi + RANGE="${RANGE_FROM}...${RANGE_TO}" + RANGE_LABEL="the range ${ACCEPTANCE_SLUG} owns (${RANGE_FROM}..${RANGE_TO})" +else + RANGE="${BASE}...HEAD" + RANGE_LABEL="$BASE" +fi + CASES="no-pnpm-field install-clean addon-built teeth-removed teeth-legacy-key \ ci-pnpm10 tracked-not-ignored explicit-decisions keys-intact scope-confined \ case-completeness" @@ -159,7 +186,7 @@ case "$CASE" in # AC-11 — config.yaml changes are additive only. keys-intact) - d="$(cd "$ROOT" && git diff "$BASE"...HEAD -- _acceptance/config.yaml)" + d="$(cd "$ROOT" && git diff "$RANGE" -- _acceptance/config.yaml)" if [ -n "$d" ]; then removed="$(printf '%s' "$d" | grep -E '^-[^-]' || true)" [ -n "$removed" ] && die "config.yaml has removed/modified lines (must be additive): @@ -167,15 +194,15 @@ $removed" printf '%s' "$d" | grep -qE '^\+.*suite_keys' \ && die "feature_loop.suite_keys was touched" fi - ( cd "$ROOT" && git diff --quiet "$BASE"...HEAD -- pnpm-lock.yaml ) \ + ( cd "$ROOT" && git diff --quiet "$RANGE" -- pnpm-lock.yaml ) \ || die "pnpm-lock.yaml changed — dependency set must be untouched" pass "config.yaml additive only; suite_keys and lockfile untouched" ;; # AC-12 — the diff stays inside tooling config + this feature's gate artifacts. scope-confined) - files="$(cd "$ROOT" && git diff --name-only "$BASE"...HEAD)" - [ -n "$files" ] || die "empty diff against $BASE" + files="$(cd "$ROOT" && git diff --name-only "$RANGE")" + [ -n "$files" ] || die "empty diff against $RANGE_LABEL" bad="" while IFS= read -r f; do [ -n "$f" ] || continue From 4318d03a458ad08467416ac7ee512f43286ca95b Mon Sep 17 00:00:00 2001 From: Phan Le Manh Date: Wed, 16 Sep 2026 10:26:01 +0700 Subject: [PATCH 04/13] =?UTF-8?q?repin(waveA):=20ghim=20l=E1=BA=A1i=201=20?= =?UTF-8?q?h=E1=BB=93=20s=C6=A1=20b=E1=BA=B1ng=20l=C3=A0n=20eval=20(kit=20?= =?UTF-8?q?2.14.0)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Làn chạy suite_keys của kho VÀ mọi eval test/script của từng hồ sơ tại HEAD, rồi tự kiểm bằng recheck-evidence.cjs. Không dòng nào do người khai. Co-Authored-By: Claude Opus 5 --- _acceptance/pnpm-build-approvals/evidence-report.md | 6 +++++- _acceptance/pnpm-build-approvals/run-log.jsonl | 1 + 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/_acceptance/pnpm-build-approvals/evidence-report.md b/_acceptance/pnpm-build-approvals/evidence-report.md index f638f97b..92ddc03a 100644 --- a/_acceptance/pnpm-build-approvals/evidence-report.md +++ b/_acceptance/pnpm-build-approvals/evidence-report.md @@ -7,7 +7,7 @@ reason: verified_by: separated grader pass (same session; subagent dispatch disabled by session policy — see Known limits) enforcement_mode: strict bypass_used: false -verified_commit: 96ee9b89c428b5ce0d64c8f49ba29eb7bd65727e +verified_commit: 9518fc7fb67d18a7f7e991580b6e977f999be893 human_signoff: Manh 2026-08-18 --- @@ -284,3 +284,7 @@ máy chung cho cả đợt, không ô đo nào bị chạm — chỉ dời mốc KHÔNG KẾT LUẬN ĐƯỢC (cửa sổ diff rỗng khi nhánh đứng ngay tại `main`; hoặc ô `ui-check` không chạy được ngoài luồng verify). Dời mốc khi ấy là khai rằng bằng chứng còn đúng trong khi chưa chứng minh được. + +### Re-pin lần 2 — 2026-09-16, do chien dich ghim lai kit 2.14.0 +run_id: repin-20260916T032559Z-94035 +sha: 9518fc7fb67d18a7f7e991580b6e977f999be893 · suites: 9 lệnh exit 0 · evals: 17/17 eval máy đạt kỳ vọng diff --git a/_acceptance/pnpm-build-approvals/run-log.jsonl b/_acceptance/pnpm-build-approvals/run-log.jsonl index 00d6f5f9..7f66f155 100644 --- a/_acceptance/pnpm-build-approvals/run-log.jsonl +++ b/_acceptance/pnpm-build-approvals/run-log.jsonl @@ -33,3 +33,4 @@ {"ts": "2026-08-18T08:23:47Z", "round": 2, "evalId": "E16", "run_id": "pnpm-build-approvals-e16-20260818", "exit_code": 0, "cmd": "bash scripts/pnpm/check-build-approvals.sh --case scope-confined"} {"ts": "2026-08-18T08:23:47Z", "round": 2, "evalId": "E17", "run_id": "pnpm-build-approvals-e17-20260818", "exit_code": 0, "cmd": "bash scripts/pnpm/check-build-approvals.sh --case case-completeness"} {"ts":"2026-09-05T10:15:00Z","kind":"repin","run_id":"repin-merge-20260905T101500Z","sha":"96ee9b89c428b5ce0d64c8f49ba29eb7bd65727e","prev_sha":"9e1387715d61a9b855628db8243b862e6d5a17de","suites_exit":[0,0,0,0,0,0,0,0]} +{"ts":"2026-09-16T03:25:59Z","kind":"repin","run_id":"repin-20260916T032559Z-94035","sha":"9518fc7fb67d18a7f7e991580b6e977f999be893","suites_exit":[0,0,0,0,0,0,0,0,0],"evals_exit":{"E1":0,"E2":0,"E3":0,"E4":0,"E5":0,"E6":0,"E7":0,"E8":0,"E9":0,"E10":0,"E11":0,"E12":0,"E13":0,"E14":0,"E15":0,"E16":0,"E17":0}} From 7cba736023cce942ba0746258d2b010a19d2fa3d Mon Sep 17 00:00:00 2001 From: Phan Le Manh Date: Wed, 16 Sep 2026 10:38:18 +0700 Subject: [PATCH 05/13] =?UTF-8?q?repin(waveB):=20ghim=20l=E1=BA=A1i=201=20?= =?UTF-8?q?h=E1=BB=93=20s=C6=A1=20b=E1=BA=B1ng=20l=C3=A0n=20eval=20(kit=20?= =?UTF-8?q?2.14.0)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Làn chạy suite_keys của kho VÀ mọi eval test/script của từng hồ sơ tại HEAD, rồi tự kiểm bằng recheck-evidence.cjs. Không dòng nào do người khai. Co-Authored-By: Claude Opus 5 --- _acceptance/ci-vitest-sdk-pin/evidence-report.md | 6 +++++- _acceptance/ci-vitest-sdk-pin/run-log.jsonl | 1 + 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/_acceptance/ci-vitest-sdk-pin/evidence-report.md b/_acceptance/ci-vitest-sdk-pin/evidence-report.md index 12a39a6f..2255991e 100644 --- a/_acceptance/ci-vitest-sdk-pin/evidence-report.md +++ b/_acceptance/ci-vitest-sdk-pin/evidence-report.md @@ -7,7 +7,7 @@ reason: verified_by: fresh-context verification subagent enforcement_mode: strict bypass_used: false -verified_commit: 96ee9b89c428b5ce0d64c8f49ba29eb7bd65727e +verified_commit: 4318d03a458ad08467416ac7ee512f43286ca95b human_signoff: Manh 2026-08-07 --- @@ -327,3 +327,7 @@ máy chung cho cả đợt, 9 ô đo bị chạm, cả 9 chạy lại và exit 0 KHÔNG KẾT LUẬN ĐƯỢC (cửa sổ diff rỗng khi nhánh đứng ngay tại `main`; hoặc ô `ui-check` không chạy được ngoài luồng verify). Dời mốc khi ấy là khai rằng bằng chứng còn đúng trong khi chưa chứng minh được. + +### Re-pin lần 2 — 2026-09-16, do chien dich ghim lai kit 2.14.0 +run_id: repin-20260916T033818Z-61665 +sha: 4318d03a458ad08467416ac7ee512f43286ca95b · suites: 9 lệnh exit 0 · evals: 13/13 eval máy đạt kỳ vọng diff --git a/_acceptance/ci-vitest-sdk-pin/run-log.jsonl b/_acceptance/ci-vitest-sdk-pin/run-log.jsonl index cb6039e0..c395a127 100644 --- a/_acceptance/ci-vitest-sdk-pin/run-log.jsonl +++ b/_acceptance/ci-vitest-sdk-pin/run-log.jsonl @@ -21,3 +21,4 @@ {"ts":"2026-09-05T10:15:00Z","kind":"eval","run_id":"repin-merge-20260905T101500Z","eval":"E10","criterion":"AC-10","verifier":"config:executors.script.b1_anchored_green","exit_code":0,"sha":"96ee9b89c428b5ce0d64c8f49ba29eb7bd65727e"} {"ts":"2026-09-05T10:15:00Z","kind":"eval","run_id":"repin-merge-20260905T101500Z","eval":"E12","criterion":"AC-12","verifier":"config:executors.script.civ_eval_keys_intact","exit_code":0,"sha":"96ee9b89c428b5ce0d64c8f49ba29eb7bd65727e"} {"ts":"2026-09-05T10:15:00Z","kind":"eval","run_id":"repin-merge-20260905T101500Z","eval":"E13","criterion":"AC-12","verifier":"config:executors.script.verify_plugins","exit_code":0,"sha":"96ee9b89c428b5ce0d64c8f49ba29eb7bd65727e"} +{"ts":"2026-09-16T03:38:18Z","kind":"repin","run_id":"repin-20260916T033818Z-61665","sha":"4318d03a458ad08467416ac7ee512f43286ca95b","suites_exit":[0,0,0,0,0,0,0,0,0],"evals_exit":{"E1":0,"E2":0,"E3":0,"E4":0,"E5":0,"E6":0,"E7":0,"E8":0,"E9":0,"E10":0,"E11":0,"E12":0,"E13":0}} From 6dc125e1377ac0d2f2ffe1cc6fa9aea03ecfa21e Mon Sep 17 00:00:00 2001 From: Phan Le Manh Date: Wed, 16 Sep 2026 11:08:12 +0700 Subject: [PATCH 06/13] =?UTF-8?q?Revert=20"repin(waveA/waveB)":=20d=C3=B2n?= =?UTF-8?q?g=20repin=20thi=E1=BA=BFu=20prev=5Fsha=20=E2=80=94=20oneflow=20?= =?UTF-8?q?=C4=91=C3=B2i,=20l=C3=A0n=20kit=20kh=C3=B4ng=20ghi?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Hai đợt ghim lại trước dùng làn của kit (`repin-lane.mjs` 2.14.0). Làn ấy ghi `evals_exit` (chứng eval đã chạy lại) nhưng KHÔNG ghi `prev_sha`. Hợp đồng `repin-khong-chay-lai-eval` của chính kho này đòi `prev_sha` trên mọi dòng repin MỚI — không có nó thì không ai tính được một lần ghim đã NUỐT mất eval nào. Guard của kho bắt đúng: E2 `check-repin-eval-coverage.sh newlines` đỏ, nêu đích danh hai run_id vừa ghi. Làn là được-ăn-cả nên đợt C cũng không ghi gì. Đo được: trong 117 dòng repin lịch sử trên origin/main, 78 có `prev_sha`, 13 có `evals_exit`, **0 có cả hai**. Không công cụ đơn lẻ nào đang có sinh được dòng hợp lệ: - làn kit → evals_exit ✓ · prev_sha ✗ · và nó DỜI verified_commit - writer của kho → prev_sha ✓ · evals_exit ✗ · và nó TỪ CHỐI nếu verified_commit đã dời Hai đường loại trừ nhau về thứ tự, nên không ghép nối được. Cần một quyết định về writer trước khi chiến dịch chạy tiếp; không vá bằng cách nới phép đo. Co-Authored-By: Claude Opus 5 --- _acceptance/ci-vitest-sdk-pin/evidence-report.md | 6 +----- _acceptance/ci-vitest-sdk-pin/run-log.jsonl | 1 - _acceptance/pnpm-build-approvals/evidence-report.md | 6 +----- _acceptance/pnpm-build-approvals/run-log.jsonl | 1 - 4 files changed, 2 insertions(+), 12 deletions(-) diff --git a/_acceptance/ci-vitest-sdk-pin/evidence-report.md b/_acceptance/ci-vitest-sdk-pin/evidence-report.md index 2255991e..12a39a6f 100644 --- a/_acceptance/ci-vitest-sdk-pin/evidence-report.md +++ b/_acceptance/ci-vitest-sdk-pin/evidence-report.md @@ -7,7 +7,7 @@ reason: verified_by: fresh-context verification subagent enforcement_mode: strict bypass_used: false -verified_commit: 4318d03a458ad08467416ac7ee512f43286ca95b +verified_commit: 96ee9b89c428b5ce0d64c8f49ba29eb7bd65727e human_signoff: Manh 2026-08-07 --- @@ -327,7 +327,3 @@ máy chung cho cả đợt, 9 ô đo bị chạm, cả 9 chạy lại và exit 0 KHÔNG KẾT LUẬN ĐƯỢC (cửa sổ diff rỗng khi nhánh đứng ngay tại `main`; hoặc ô `ui-check` không chạy được ngoài luồng verify). Dời mốc khi ấy là khai rằng bằng chứng còn đúng trong khi chưa chứng minh được. - -### Re-pin lần 2 — 2026-09-16, do chien dich ghim lai kit 2.14.0 -run_id: repin-20260916T033818Z-61665 -sha: 4318d03a458ad08467416ac7ee512f43286ca95b · suites: 9 lệnh exit 0 · evals: 13/13 eval máy đạt kỳ vọng diff --git a/_acceptance/ci-vitest-sdk-pin/run-log.jsonl b/_acceptance/ci-vitest-sdk-pin/run-log.jsonl index c395a127..cb6039e0 100644 --- a/_acceptance/ci-vitest-sdk-pin/run-log.jsonl +++ b/_acceptance/ci-vitest-sdk-pin/run-log.jsonl @@ -21,4 +21,3 @@ {"ts":"2026-09-05T10:15:00Z","kind":"eval","run_id":"repin-merge-20260905T101500Z","eval":"E10","criterion":"AC-10","verifier":"config:executors.script.b1_anchored_green","exit_code":0,"sha":"96ee9b89c428b5ce0d64c8f49ba29eb7bd65727e"} {"ts":"2026-09-05T10:15:00Z","kind":"eval","run_id":"repin-merge-20260905T101500Z","eval":"E12","criterion":"AC-12","verifier":"config:executors.script.civ_eval_keys_intact","exit_code":0,"sha":"96ee9b89c428b5ce0d64c8f49ba29eb7bd65727e"} {"ts":"2026-09-05T10:15:00Z","kind":"eval","run_id":"repin-merge-20260905T101500Z","eval":"E13","criterion":"AC-12","verifier":"config:executors.script.verify_plugins","exit_code":0,"sha":"96ee9b89c428b5ce0d64c8f49ba29eb7bd65727e"} -{"ts":"2026-09-16T03:38:18Z","kind":"repin","run_id":"repin-20260916T033818Z-61665","sha":"4318d03a458ad08467416ac7ee512f43286ca95b","suites_exit":[0,0,0,0,0,0,0,0,0],"evals_exit":{"E1":0,"E2":0,"E3":0,"E4":0,"E5":0,"E6":0,"E7":0,"E8":0,"E9":0,"E10":0,"E11":0,"E12":0,"E13":0}} diff --git a/_acceptance/pnpm-build-approvals/evidence-report.md b/_acceptance/pnpm-build-approvals/evidence-report.md index 92ddc03a..f638f97b 100644 --- a/_acceptance/pnpm-build-approvals/evidence-report.md +++ b/_acceptance/pnpm-build-approvals/evidence-report.md @@ -7,7 +7,7 @@ reason: verified_by: separated grader pass (same session; subagent dispatch disabled by session policy — see Known limits) enforcement_mode: strict bypass_used: false -verified_commit: 9518fc7fb67d18a7f7e991580b6e977f999be893 +verified_commit: 96ee9b89c428b5ce0d64c8f49ba29eb7bd65727e human_signoff: Manh 2026-08-18 --- @@ -284,7 +284,3 @@ máy chung cho cả đợt, không ô đo nào bị chạm — chỉ dời mốc KHÔNG KẾT LUẬN ĐƯỢC (cửa sổ diff rỗng khi nhánh đứng ngay tại `main`; hoặc ô `ui-check` không chạy được ngoài luồng verify). Dời mốc khi ấy là khai rằng bằng chứng còn đúng trong khi chưa chứng minh được. - -### Re-pin lần 2 — 2026-09-16, do chien dich ghim lai kit 2.14.0 -run_id: repin-20260916T032559Z-94035 -sha: 9518fc7fb67d18a7f7e991580b6e977f999be893 · suites: 9 lệnh exit 0 · evals: 17/17 eval máy đạt kỳ vọng diff --git a/_acceptance/pnpm-build-approvals/run-log.jsonl b/_acceptance/pnpm-build-approvals/run-log.jsonl index 7f66f155..00d6f5f9 100644 --- a/_acceptance/pnpm-build-approvals/run-log.jsonl +++ b/_acceptance/pnpm-build-approvals/run-log.jsonl @@ -33,4 +33,3 @@ {"ts": "2026-08-18T08:23:47Z", "round": 2, "evalId": "E16", "run_id": "pnpm-build-approvals-e16-20260818", "exit_code": 0, "cmd": "bash scripts/pnpm/check-build-approvals.sh --case scope-confined"} {"ts": "2026-08-18T08:23:47Z", "round": 2, "evalId": "E17", "run_id": "pnpm-build-approvals-e17-20260818", "exit_code": 0, "cmd": "bash scripts/pnpm/check-build-approvals.sh --case case-completeness"} {"ts":"2026-09-05T10:15:00Z","kind":"repin","run_id":"repin-merge-20260905T101500Z","sha":"96ee9b89c428b5ce0d64c8f49ba29eb7bd65727e","prev_sha":"9e1387715d61a9b855628db8243b862e6d5a17de","suites_exit":[0,0,0,0,0,0,0,0]} -{"ts":"2026-09-16T03:25:59Z","kind":"repin","run_id":"repin-20260916T032559Z-94035","sha":"9518fc7fb67d18a7f7e991580b6e977f999be893","suites_exit":[0,0,0,0,0,0,0,0,0],"evals_exit":{"E1":0,"E2":0,"E3":0,"E4":0,"E5":0,"E6":0,"E7":0,"E8":0,"E9":0,"E10":0,"E11":0,"E12":0,"E13":0,"E14":0,"E15":0,"E16":0,"E17":0}} From e300539ab509f829fdaa924173aec7b8ee0f1594 Mon Sep 17 00:00:00 2001 From: Phan Le Manh Date: Wed, 16 Sep 2026 11:30:10 +0700 Subject: [PATCH 07/13] =?UTF-8?q?feat(repin):=20writer=20c=E1=BB=A7a=20kho?= =?UTF-8?q?=20nh=E1=BA=ADn=20evals=5Fexit=20=E2=80=94=20d=C3=B2ng=20repin?= =?UTF-8?q?=20tho=E1=BA=A3=20C=E1=BA=A2=20hai=20=C4=91i=E1=BB=81u=20ki?= =?UTF-8?q?=E1=BB=87n?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Đo 2026-09-16 trên origin/main: 117 dòng repin, 78 có `prev_sha`, 13 có `evals_exit`, **0 có cả hai**. Hai đường ghi loại trừ nhau về thứ tự: - làn kit (`repin-lane.mjs` 2.14.0) → ghi `evals_exit`, KHÔNG ghi `prev_sha`, và nó DỜI `verified_commit` - writer của kho (`repin-eval-coverage.mjs write`) → ghi `prev_sha`, không ghi `evals_exit`, và TỪ CHỐI nếu `verified_commit` đã dời (`prev === sha`) Nên không công cụ đơn lẻ nào sinh nổi một dòng hợp lệ theo hợp đồng hiện tại, và chiến dịch ghim lại kẹt cứng. `modeWrite` nay nhận tham số thứ năm `evals_json`. TUỲ CHỌN, và cố ý KHÔNG có mặc định: - tuỳ chọn, vì răng cưỡng chế đã ở BÊN ĐỌC — `checkRepinEvals` của kit từ chối dòng thiếu trường này; writer không nhân đôi luật - không mặc định, vì một object toàn 0 tự sinh chính là "MINT bằng chứng" mà chú thích của `suites_exit` ngay trên cảnh báo. Vắng mặt thì trường vắng mặt, không bịa Từ chối hai ngả, cùng nghi thức với `suites_exit`: eval thoát khác 0 → dừng, không ghi; JSON không hợp lệ hoặc sai khuôn object → dừng. Kiểm bốn chiều: - bộ răng 30 ca cũ: 30/30 PASS (9 đối chứng dương + 21 phép phá) — không gãy ca nào - mọi chế độ đọc (check · newlines · paths-law · so-khop-total · readers): exit 0 - truyền evals hợp lệ → dòng mang CẢ prev_sha lẫn evals_exit - không truyền → hành vi y nguyên, không có trường - eval đỏ → từ chối · JSON hỏng → từ chối Không đổi KNOWN/TOTAL nên không chạm `evals.yaml` đã ký của hồ sơ repin-khong-chay-lai-eval. Siết thành BẮT BUỘC kèm hai ca răng riêng là việc nối tiếp đáng làm, nhưng nó chạm hợp đồng đã ký nên để owner quyết riêng. Co-Authored-By: Claude Opus 5 --- scripts/ci/repin-eval-coverage.mjs | 40 +++++++++++++++++++++++++++--- 1 file changed, 37 insertions(+), 3 deletions(-) diff --git a/scripts/ci/repin-eval-coverage.mjs b/scripts/ci/repin-eval-coverage.mjs index 7ab6586f..20c3746e 100644 --- a/scripts/ci/repin-eval-coverage.mjs +++ b/scripts/ci/repin-eval-coverage.mjs @@ -264,9 +264,9 @@ export function touchedEvals(evals, changed) { } // ---------- modes ---------- -function modeWrite(slug, sha, runId, suites) { +function modeWrite(slug, sha, runId, suites, evals) { if (!slug || !sha || !runId) - die("write can "); + die("write can [evals_json]"); // `suites_exit` is not metadata. pre-merge-check.sh rejects a re-pin whose array // holds a nonzero element -- "a red lane cannot back a signature" -- so an all-zero // array IS the proof both readers accept. An optional argument with a helpful @@ -317,6 +317,39 @@ function modeWrite(slug, sha, runId, suites) { die( `verified_commit cu (${prev.slice(0, 12)}) khong phai to tien cua ${sha.slice(0, 12)} — hai sha khong nam tren mot duong lich su`, ); + // `evals_exit`: TUY CHON, va co y KHONG co mac dinh. Ly do tuy chon: rang cuong + // che da o BEN DOC — `checkRepinEvals` (lib/evidence-core.cjs cua kit) tu choi mot + // dong repin thieu truong nay, nen writer khong can nhan doi luat. Ly do khong mac + // dinh: mot mang/object toan 0 tu sinh chinh la thu "MINT bang chung" ma chu thich + // cua `suites_exit` ngay tren canh bao — vang mat thi truong vang mat, khong bia. + // + // Vi sao ton tai: lan re-pin cua kit (`repin-lane.mjs` 2.14.0) ghi `evals_exit` + // nhung KHONG ghi `prev_sha`; writer nay ghi `prev_sha` nhung khong ghi + // `evals_exit`. Do 2026-09-16: trong 117 dong repin tren origin/main, 78 co + // prev_sha, 13 co evals_exit, 0 co CA HAI — nen khong cong cu don le nao sinh noi + // mot dong hop le theo hop dong hien tai cua kho nay. + let evalsObj; + if (evals !== undefined) { + try { + evalsObj = JSON.parse(evals); + } catch { + die(`evals_json khong phai JSON hop le: ${evals}`); + } + if ( + evalsObj === null || + typeof evalsObj !== "object" || + Array.isArray(evalsObj) || + !Object.values(evalsObj).every((n) => Number.isInteger(n)) + ) + die( + `evals_json phai la object :, nhan duoc: ${evals}`, + ); + const do_ = Object.entries(evalsObj).filter(([, n]) => n !== 0); + if (do_.length) + die( + `eval thoat khac 0 (${do_.map(([k, n]) => `${k}=${n}`).join(",")}) — nghi thuc DUNG o day: khac phuc nguyen nhan roi phong lan MOI, khong ghi dong repin`, + ); + } appendLog(slug, { ts: new Date().toISOString().replace(/\.\d+Z$/, "Z"), kind: "repin", @@ -324,6 +357,7 @@ function modeWrite(slug, sha, runId, suites) { sha, prev_sha: prev, suites_exit: arr, + ...(evalsObj === undefined ? {} : { evals_exit: evalsObj }), }); console.log( `ghi 1 dong repin cho ${slug}: prev_sha=${prev.slice(0, 12)} -> sha=${sha.slice(0, 12)}`, @@ -669,7 +703,7 @@ const table = { if (isMain) { if (!table[mode]) { console.error( - "usage: repin-eval-coverage.mjs [...]", + "usage: repin-eval-coverage.mjs [evals_json]|plan|check [--min-computable N]|newlines> [...]", ); process.exit(2); } From 577400d95f5f48a1f57aa0ea4f8c55570f42d9d0 Mon Sep 17 00:00:00 2001 From: Phan Le Manh Date: Wed, 16 Sep 2026 11:57:25 +0700 Subject: [PATCH 08/13] =?UTF-8?q?repin(A):=20ghim=20l=E1=BA=A1i=20pnpm-bui?= =?UTF-8?q?ld-approvals=20b=E1=BA=B1ng=20nghi=20th=E1=BB=A9c=20c=E1=BB=A7a?= =?UTF-8?q?=20kho?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Làn kit chạy chế độ ĐO (không dời verified_commit) → writer của kho ghi dòng repin kèm prev_sha + evals_exit → dời verified_commit + mục Re-pin theo đúng khuôn làn kit sinh ra. Không bước nào viết tay. Dòng repin: prev_sha 96ee9b89 → sha e300539a · 9 suite exit 0 · 17 eval máy. Kiểm bằng công cụ của kho, không bằng mắt: - check-repin-eval-coverage.sh newlines → "mọi dòng repin mới đều mang prev_sha" - pre-merge-check → pnpm-build-approvals KHÔNG còn vi phạm nào (trước: stale + nợ làn) Co-Authored-By: Claude Opus 5 --- _acceptance/pnpm-build-approvals/evidence-report.md | 6 +++++- _acceptance/pnpm-build-approvals/run-log.jsonl | 1 + 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/_acceptance/pnpm-build-approvals/evidence-report.md b/_acceptance/pnpm-build-approvals/evidence-report.md index f638f97b..6eef22d2 100644 --- a/_acceptance/pnpm-build-approvals/evidence-report.md +++ b/_acceptance/pnpm-build-approvals/evidence-report.md @@ -7,7 +7,7 @@ reason: verified_by: separated grader pass (same session; subagent dispatch disabled by session policy — see Known limits) enforcement_mode: strict bypass_used: false -verified_commit: 96ee9b89c428b5ce0d64c8f49ba29eb7bd65727e +verified_commit: e300539ab509f829fdaa924173aec7b8ee0f1594 human_signoff: Manh 2026-08-18 --- @@ -284,3 +284,7 @@ máy chung cho cả đợt, không ô đo nào bị chạm — chỉ dời mốc KHÔNG KẾT LUẬN ĐƯỢC (cửa sổ diff rỗng khi nhánh đứng ngay tại `main`; hoặc ô `ui-check` không chạy được ngoài luồng verify). Dời mốc khi ấy là khai rằng bằng chứng còn đúng trong khi chưa chứng minh được. + +### Re-pin lần 2 — 2026-09-16, do chien dich ghim lai kit 2.14.0 +run_id: repin-20260916T045446Z-97276 +sha: e300539ab509f829fdaa924173aec7b8ee0f1594 · suites: 9 lệnh exit 0 · evals: 17/17 eval máy đạt kỳ vọng diff --git a/_acceptance/pnpm-build-approvals/run-log.jsonl b/_acceptance/pnpm-build-approvals/run-log.jsonl index 00d6f5f9..fb02aaa3 100644 --- a/_acceptance/pnpm-build-approvals/run-log.jsonl +++ b/_acceptance/pnpm-build-approvals/run-log.jsonl @@ -33,3 +33,4 @@ {"ts": "2026-08-18T08:23:47Z", "round": 2, "evalId": "E16", "run_id": "pnpm-build-approvals-e16-20260818", "exit_code": 0, "cmd": "bash scripts/pnpm/check-build-approvals.sh --case scope-confined"} {"ts": "2026-08-18T08:23:47Z", "round": 2, "evalId": "E17", "run_id": "pnpm-build-approvals-e17-20260818", "exit_code": 0, "cmd": "bash scripts/pnpm/check-build-approvals.sh --case case-completeness"} {"ts":"2026-09-05T10:15:00Z","kind":"repin","run_id":"repin-merge-20260905T101500Z","sha":"96ee9b89c428b5ce0d64c8f49ba29eb7bd65727e","prev_sha":"9e1387715d61a9b855628db8243b862e6d5a17de","suites_exit":[0,0,0,0,0,0,0,0]} +{"ts":"2026-09-16T04:55:09Z","kind":"repin","run_id":"repin-20260916T045446Z-97276","sha":"e300539ab509f829fdaa924173aec7b8ee0f1594","prev_sha":"96ee9b89c428b5ce0d64c8f49ba29eb7bd65727e","suites_exit":[0,0,0,0,0,0,0,0,0],"evals_exit":{"E1":0,"E2":0,"E3":0,"E4":0,"E5":0,"E6":0,"E7":0,"E8":0,"E9":0,"E10":0,"E11":0,"E12":0,"E13":0,"E14":0,"E15":0,"E16":0,"E17":0}} From e8c57c51051c7257fe5fe3d6944f897e283acc3b Mon Sep 17 00:00:00 2001 From: Phan Le Manh Date: Wed, 16 Sep 2026 12:11:26 +0700 Subject: [PATCH 09/13] =?UTF-8?q?repin(waveB2):=20ghim=20l=E1=BA=A1i=201?= =?UTF-8?q?=20h=E1=BB=93=20s=C6=A1=20b=E1=BA=B1ng=20nghi=20th=E1=BB=A9c=20?= =?UTF-8?q?c=E1=BB=A7a=20kho?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Làn kit chế độ ĐO → writer của kho (prev_sha + evals_exit) → verified_commit + mục Re-pin. Không bước nào viết tay; guard newlines xanh trước khi commit. Co-Authored-By: Claude Opus 5 --- _acceptance/ci-vitest-sdk-pin/evidence-report.md | 6 +++++- _acceptance/ci-vitest-sdk-pin/run-log.jsonl | 1 + 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/_acceptance/ci-vitest-sdk-pin/evidence-report.md b/_acceptance/ci-vitest-sdk-pin/evidence-report.md index 12a39a6f..6a642e62 100644 --- a/_acceptance/ci-vitest-sdk-pin/evidence-report.md +++ b/_acceptance/ci-vitest-sdk-pin/evidence-report.md @@ -7,7 +7,7 @@ reason: verified_by: fresh-context verification subagent enforcement_mode: strict bypass_used: false -verified_commit: 96ee9b89c428b5ce0d64c8f49ba29eb7bd65727e +verified_commit: 577400d95f5f48a1f57aa0ea4f8c55570f42d9d0 human_signoff: Manh 2026-08-07 --- @@ -327,3 +327,7 @@ máy chung cho cả đợt, 9 ô đo bị chạm, cả 9 chạy lại và exit 0 KHÔNG KẾT LUẬN ĐƯỢC (cửa sổ diff rỗng khi nhánh đứng ngay tại `main`; hoặc ô `ui-check` không chạy được ngoài luồng verify). Dời mốc khi ấy là khai rằng bằng chứng còn đúng trong khi chưa chứng minh được. + +### Re-pin lần 2 — 2026-09-16, do chien dich ghim lai kit 2.14.0 +run_id: repin-20260916T051125Z-55979 +sha: 577400d95f5f48a1f57aa0ea4f8c55570f42d9d0 · suites: 9 lệnh exit 0 · evals: 13/13 eval máy đạt kỳ vọng diff --git a/_acceptance/ci-vitest-sdk-pin/run-log.jsonl b/_acceptance/ci-vitest-sdk-pin/run-log.jsonl index cb6039e0..27785f3f 100644 --- a/_acceptance/ci-vitest-sdk-pin/run-log.jsonl +++ b/_acceptance/ci-vitest-sdk-pin/run-log.jsonl @@ -21,3 +21,4 @@ {"ts":"2026-09-05T10:15:00Z","kind":"eval","run_id":"repin-merge-20260905T101500Z","eval":"E10","criterion":"AC-10","verifier":"config:executors.script.b1_anchored_green","exit_code":0,"sha":"96ee9b89c428b5ce0d64c8f49ba29eb7bd65727e"} {"ts":"2026-09-05T10:15:00Z","kind":"eval","run_id":"repin-merge-20260905T101500Z","eval":"E12","criterion":"AC-12","verifier":"config:executors.script.civ_eval_keys_intact","exit_code":0,"sha":"96ee9b89c428b5ce0d64c8f49ba29eb7bd65727e"} {"ts":"2026-09-05T10:15:00Z","kind":"eval","run_id":"repin-merge-20260905T101500Z","eval":"E13","criterion":"AC-12","verifier":"config:executors.script.verify_plugins","exit_code":0,"sha":"96ee9b89c428b5ce0d64c8f49ba29eb7bd65727e"} +{"ts":"2026-09-16T05:11:25Z","kind":"repin","run_id":"repin-20260916T051125Z-55979","sha":"577400d95f5f48a1f57aa0ea4f8c55570f42d9d0","prev_sha":"96ee9b89c428b5ce0d64c8f49ba29eb7bd65727e","suites_exit":[0,0,0,0,0,0,0,0,0],"evals_exit":{"E1":0,"E2":0,"E3":0,"E4":0,"E5":0,"E6":0,"E7":0,"E8":0,"E9":0,"E10":0,"E11":0,"E12":0,"E13":0}} From d62126571783499680343cc787be02ca0bb79f3e Mon Sep 17 00:00:00 2001 From: Phan Le Manh Date: Wed, 16 Sep 2026 12:46:14 +0700 Subject: [PATCH 10/13] =?UTF-8?q?Revert=20"repin(waveB2)":=20thi=E1=BA=BFu?= =?UTF-8?q?=20l=E1=BB=9Bp=20d=C3=B2ng=20kind:"eval"=20=E2=80=94=20guard=20?= =?UTF-8?q?=C4=91=E1=BB=8Dc=20l=E1=BB=9Bp=20=C4=91=C3=B3,=20kh=C3=B4ng=20?= =?UTF-8?q?=C4=91=E1=BB=8Dc=20evals=5Fexit?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit `reMeasuredSince` trong repin-eval-coverage.mjs gom theo `o.kind==="eval" && o.eval && o.sha`; `evals_exit` trên dòng repin KHÔNG được nó đọc. Dòng đợt B ghi đủ 13 eval vào `evals_exit` nhưng không có dòng `kind:"eval"` nào, nên guard kết luận đúng: re-pin nuốt 7 eval bị chạm mà không chạy lại (E1,E2,E3,E9,E10,E12,E13). Hệ quả: đợt C đỏ ở 4 eval, cả bốn cùng MỘT gốc là dòng đợt B — không phải 4 lỗi khác nhau. Kho có sẵn 190 dòng `kind:"eval"` làm khuôn; bộ điều phối nay ghi thêm lớp đó. Co-Authored-By: Claude Opus 5 --- _acceptance/ci-vitest-sdk-pin/evidence-report.md | 6 +----- _acceptance/ci-vitest-sdk-pin/run-log.jsonl | 1 - 2 files changed, 1 insertion(+), 6 deletions(-) diff --git a/_acceptance/ci-vitest-sdk-pin/evidence-report.md b/_acceptance/ci-vitest-sdk-pin/evidence-report.md index 6a642e62..12a39a6f 100644 --- a/_acceptance/ci-vitest-sdk-pin/evidence-report.md +++ b/_acceptance/ci-vitest-sdk-pin/evidence-report.md @@ -7,7 +7,7 @@ reason: verified_by: fresh-context verification subagent enforcement_mode: strict bypass_used: false -verified_commit: 577400d95f5f48a1f57aa0ea4f8c55570f42d9d0 +verified_commit: 96ee9b89c428b5ce0d64c8f49ba29eb7bd65727e human_signoff: Manh 2026-08-07 --- @@ -327,7 +327,3 @@ máy chung cho cả đợt, 9 ô đo bị chạm, cả 9 chạy lại và exit 0 KHÔNG KẾT LUẬN ĐƯỢC (cửa sổ diff rỗng khi nhánh đứng ngay tại `main`; hoặc ô `ui-check` không chạy được ngoài luồng verify). Dời mốc khi ấy là khai rằng bằng chứng còn đúng trong khi chưa chứng minh được. - -### Re-pin lần 2 — 2026-09-16, do chien dich ghim lai kit 2.14.0 -run_id: repin-20260916T051125Z-55979 -sha: 577400d95f5f48a1f57aa0ea4f8c55570f42d9d0 · suites: 9 lệnh exit 0 · evals: 13/13 eval máy đạt kỳ vọng diff --git a/_acceptance/ci-vitest-sdk-pin/run-log.jsonl b/_acceptance/ci-vitest-sdk-pin/run-log.jsonl index 27785f3f..cb6039e0 100644 --- a/_acceptance/ci-vitest-sdk-pin/run-log.jsonl +++ b/_acceptance/ci-vitest-sdk-pin/run-log.jsonl @@ -21,4 +21,3 @@ {"ts":"2026-09-05T10:15:00Z","kind":"eval","run_id":"repin-merge-20260905T101500Z","eval":"E10","criterion":"AC-10","verifier":"config:executors.script.b1_anchored_green","exit_code":0,"sha":"96ee9b89c428b5ce0d64c8f49ba29eb7bd65727e"} {"ts":"2026-09-05T10:15:00Z","kind":"eval","run_id":"repin-merge-20260905T101500Z","eval":"E12","criterion":"AC-12","verifier":"config:executors.script.civ_eval_keys_intact","exit_code":0,"sha":"96ee9b89c428b5ce0d64c8f49ba29eb7bd65727e"} {"ts":"2026-09-05T10:15:00Z","kind":"eval","run_id":"repin-merge-20260905T101500Z","eval":"E13","criterion":"AC-12","verifier":"config:executors.script.verify_plugins","exit_code":0,"sha":"96ee9b89c428b5ce0d64c8f49ba29eb7bd65727e"} -{"ts":"2026-09-16T05:11:25Z","kind":"repin","run_id":"repin-20260916T051125Z-55979","sha":"577400d95f5f48a1f57aa0ea4f8c55570f42d9d0","prev_sha":"96ee9b89c428b5ce0d64c8f49ba29eb7bd65727e","suites_exit":[0,0,0,0,0,0,0,0,0],"evals_exit":{"E1":0,"E2":0,"E3":0,"E4":0,"E5":0,"E6":0,"E7":0,"E8":0,"E9":0,"E10":0,"E11":0,"E12":0,"E13":0}} From 36651d8d168c1945d2f3ad5f66e7799bf9f5c932 Mon Sep 17 00:00:00 2001 From: Phan Le Manh Date: Wed, 16 Sep 2026 13:00:14 +0700 Subject: [PATCH 11/13] =?UTF-8?q?repin(waveB2):=20ghim=20l=E1=BA=A1i=201?= =?UTF-8?q?=20h=E1=BB=93=20s=C6=A1=20b=E1=BA=B1ng=20nghi=20th=E1=BB=A9c=20?= =?UTF-8?q?c=E1=BB=A7a=20kho?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Làn kit chế độ ĐO → writer của kho (prev_sha + evals_exit) → verified_commit + mục Re-pin. Không bước nào viết tay; guard newlines xanh trước khi commit. Co-Authored-By: Claude Opus 5 --- _acceptance/ci-vitest-sdk-pin/evidence-report.md | 6 +++++- _acceptance/ci-vitest-sdk-pin/run-log.jsonl | 14 ++++++++++++++ 2 files changed, 19 insertions(+), 1 deletion(-) diff --git a/_acceptance/ci-vitest-sdk-pin/evidence-report.md b/_acceptance/ci-vitest-sdk-pin/evidence-report.md index 12a39a6f..fa7b5021 100644 --- a/_acceptance/ci-vitest-sdk-pin/evidence-report.md +++ b/_acceptance/ci-vitest-sdk-pin/evidence-report.md @@ -7,7 +7,7 @@ reason: verified_by: fresh-context verification subagent enforcement_mode: strict bypass_used: false -verified_commit: 96ee9b89c428b5ce0d64c8f49ba29eb7bd65727e +verified_commit: d62126571783499680343cc787be02ca0bb79f3e human_signoff: Manh 2026-08-07 --- @@ -327,3 +327,7 @@ máy chung cho cả đợt, 9 ô đo bị chạm, cả 9 chạy lại và exit 0 KHÔNG KẾT LUẬN ĐƯỢC (cửa sổ diff rỗng khi nhánh đứng ngay tại `main`; hoặc ô `ui-check` không chạy được ngoài luồng verify). Dời mốc khi ấy là khai rằng bằng chứng còn đúng trong khi chưa chứng minh được. + +### Re-pin lần 2 — 2026-09-16, do chien dich ghim lai kit 2.14.0 +run_id: repin-20260916T060013Z-35747 +sha: d62126571783499680343cc787be02ca0bb79f3e · suites: 9 lệnh exit 0 · evals: 13/13 eval máy đạt kỳ vọng diff --git a/_acceptance/ci-vitest-sdk-pin/run-log.jsonl b/_acceptance/ci-vitest-sdk-pin/run-log.jsonl index cb6039e0..5329897b 100644 --- a/_acceptance/ci-vitest-sdk-pin/run-log.jsonl +++ b/_acceptance/ci-vitest-sdk-pin/run-log.jsonl @@ -21,3 +21,17 @@ {"ts":"2026-09-05T10:15:00Z","kind":"eval","run_id":"repin-merge-20260905T101500Z","eval":"E10","criterion":"AC-10","verifier":"config:executors.script.b1_anchored_green","exit_code":0,"sha":"96ee9b89c428b5ce0d64c8f49ba29eb7bd65727e"} {"ts":"2026-09-05T10:15:00Z","kind":"eval","run_id":"repin-merge-20260905T101500Z","eval":"E12","criterion":"AC-12","verifier":"config:executors.script.civ_eval_keys_intact","exit_code":0,"sha":"96ee9b89c428b5ce0d64c8f49ba29eb7bd65727e"} {"ts":"2026-09-05T10:15:00Z","kind":"eval","run_id":"repin-merge-20260905T101500Z","eval":"E13","criterion":"AC-12","verifier":"config:executors.script.verify_plugins","exit_code":0,"sha":"96ee9b89c428b5ce0d64c8f49ba29eb7bd65727e"} +{"ts":"2026-09-16T06:00:13Z","kind":"repin","run_id":"repin-20260916T060013Z-35747","sha":"d62126571783499680343cc787be02ca0bb79f3e","prev_sha":"96ee9b89c428b5ce0d64c8f49ba29eb7bd65727e","suites_exit":[0,0,0,0,0,0,0,0,0],"evals_exit":{"E1":0,"E2":0,"E3":0,"E4":0,"E5":0,"E6":0,"E7":0,"E8":0,"E9":0,"E10":0,"E11":0,"E12":0,"E13":0}} +{"ts":"2026-09-16T06:00:13Z","kind":"eval","run_id":"repin-20260916T060013Z-35747","eval":"E1","criterion":"AC-1","verifier":"config:executors.script.civ_job_shape","exit_code":0,"sha":"d62126571783499680343cc787be02ca0bb79f3e"} +{"ts":"2026-09-16T06:00:13Z","kind":"eval","run_id":"repin-20260916T060013Z-35747","eval":"E2","criterion":"AC-2","verifier":"config:executors.script.civ_job_no_softening","exit_code":0,"sha":"d62126571783499680343cc787be02ca0bb79f3e"} +{"ts":"2026-09-16T06:00:13Z","kind":"eval","run_id":"repin-20260916T060013Z-35747","eval":"E3","criterion":"AC-3","verifier":"config:executors.script.civ_job_teeth","exit_code":0,"sha":"d62126571783499680343cc787be02ca0bb79f3e"} +{"ts":"2026-09-16T06:00:13Z","kind":"eval","run_id":"repin-20260916T060013Z-35747","eval":"E4","criterion":"AC-4","verifier":"config:executors.script.civ_run_jobs_green","exit_code":0,"sha":"d62126571783499680343cc787be02ca0bb79f3e"} +{"ts":"2026-09-16T06:00:13Z","kind":"eval","run_id":"repin-20260916T060013Z-35747","eval":"E5","criterion":"AC-5","verifier":"config:executors.script.civ_pin_derived","exit_code":0,"sha":"d62126571783499680343cc787be02ca0bb79f3e"} +{"ts":"2026-09-16T06:00:13Z","kind":"eval","run_id":"repin-20260916T060013Z-35747","eval":"E6","criterion":"AC-6","verifier":"config:executors.script.civ_pin_teeth","exit_code":0,"sha":"d62126571783499680343cc787be02ca0bb79f3e"} +{"ts":"2026-09-16T06:00:13Z","kind":"eval","run_id":"repin-20260916T060013Z-35747","eval":"E7","criterion":"AC-7","verifier":"config:executors.script.civ_pin_override","exit_code":0,"sha":"d62126571783499680343cc787be02ca0bb79f3e"} +{"ts":"2026-09-16T06:00:13Z","kind":"eval","run_id":"repin-20260916T060013Z-35747","eval":"E8","criterion":"AC-8","verifier":"config:executors.script.civ_pin_single_impl","exit_code":0,"sha":"d62126571783499680343cc787be02ca0bb79f3e"} +{"ts":"2026-09-16T06:00:13Z","kind":"eval","run_id":"repin-20260916T060013Z-35747","eval":"E9","criterion":"AC-9","verifier":"config:executors.script.civ_docs_guard_synced","exit_code":0,"sha":"d62126571783499680343cc787be02ca0bb79f3e"} +{"ts":"2026-09-16T06:00:13Z","kind":"eval","run_id":"repin-20260916T060013Z-35747","eval":"E10","criterion":"AC-10","verifier":"config:executors.script.b1_anchored_green","exit_code":0,"sha":"d62126571783499680343cc787be02ca0bb79f3e"} +{"ts":"2026-09-16T06:00:13Z","kind":"eval","run_id":"repin-20260916T060013Z-35747","eval":"E11","criterion":"AC-11","verifier":"config:executors.script.civ_gate_residual","exit_code":0,"sha":"d62126571783499680343cc787be02ca0bb79f3e"} +{"ts":"2026-09-16T06:00:13Z","kind":"eval","run_id":"repin-20260916T060013Z-35747","eval":"E12","criterion":"AC-12","verifier":"config:executors.script.civ_eval_keys_intact","exit_code":0,"sha":"d62126571783499680343cc787be02ca0bb79f3e"} +{"ts":"2026-09-16T06:00:13Z","kind":"eval","run_id":"repin-20260916T060013Z-35747","eval":"E13","criterion":"AC-12","verifier":"config:executors.script.verify_plugins","exit_code":0,"sha":"d62126571783499680343cc787be02ca0bb79f3e"} From e80d5235d9003628bf95c526f13781f6f8a5f27f Mon Sep 17 00:00:00 2001 From: Phan Le Manh Date: Wed, 16 Sep 2026 13:30:30 +0700 Subject: [PATCH 12/13] =?UTF-8?q?repin(waveC2):=20ghim=20l=E1=BA=A1i=2022?= =?UTF-8?q?=20h=E1=BB=93=20s=C6=A1=20b=E1=BA=B1ng=20nghi=20th=E1=BB=A9c=20?= =?UTF-8?q?c=E1=BB=A7a=20kho?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Làn kit chế độ ĐO → writer của kho (prev_sha + evals_exit) → verified_commit + mục Re-pin. Không bước nào viết tay; guard newlines xanh trước khi commit. Co-Authored-By: Claude Opus 5 --- .../cache-l1-fingerprint/evidence-report.md | 6 ++++- .../cache-l1-fingerprint/run-log.jsonl | 17 ++++++++++++ .../chong-doc-sai-em-ru/evidence-report.md | 6 ++++- _acceptance/chong-doc-sai-em-ru/run-log.jsonl | 13 ++++++++++ .../evidence-report.md | 6 ++++- .../run-log.jsonl | 14 ++++++++++ .../chong-mat-khoa-byo/evidence-report.md | 6 ++++- _acceptance/chong-mat-khoa-byo/run-log.jsonl | 9 +++++++ .../ci-actions-bump/evidence-report.md | 6 ++++- _acceptance/ci-actions-bump/run-log.jsonl | 9 +++++++ .../compose-overlay/evidence-report.md | 6 ++++- _acceptance/compose-overlay/run-log.jsonl | 26 +++++++++++++++++++ .../dang-ky-fork-openai/evidence-report.md | 6 ++++- _acceptance/dang-ky-fork-openai/run-log.jsonl | 9 +++++++ .../evidence-report.md | 6 ++++- .../dependency-refresh-2026-07/run-log.jsonl | 9 +++++++ .../gate-tooling-t1/evidence-report.md | 6 ++++- _acceptance/gate-tooling-t1/run-log.jsonl | 13 ++++++++++ .../evidence-report.md | 6 ++++- .../run-log.jsonl | 13 ++++++++++ .../kho-khoa-toan-ven/evidence-report.md | 6 ++++- _acceptance/kho-khoa-toan-ven/run-log.jsonl | 14 ++++++++++ .../evidence-report.md | 6 ++++- .../khong-noi-sai-ve-kho-khoa/run-log.jsonl | 14 ++++++++++ .../measure-harness/evidence-report.md | 6 ++++- _acceptance/measure-harness/run-log.jsonl | 20 ++++++++++++++ .../evidence-report.md | 5 +++- .../noi-thuoc-tai-lieu-vao-ci/run-log.jsonl | 10 +++++++ .../oneflow-plugin-prefix/evidence-report.md | 6 ++++- .../oneflow-plugin-prefix/run-log.jsonl | 12 +++++++++ .../per-plugin-origin/evidence-report.md | 6 ++++- _acceptance/per-plugin-origin/run-log.jsonl | 13 ++++++++++ .../evidence-report.md | 6 ++++- .../repin-khong-chay-lai-eval/run-log.jsonl | 15 +++++++++++ .../roadmap-drift-guard/evidence-report.md | 6 ++++- _acceptance/roadmap-drift-guard/run-log.jsonl | 11 ++++++++ .../scan-scope-diagnostics/evidence-report.md | 6 ++++- .../scan-scope-diagnostics/run-log.jsonl | 22 ++++++++++++++++ .../evidence-report.md | 6 ++++- .../scan-with-block-imports/run-log.jsonl | 17 ++++++++++++ .../evidence-report.md | 6 ++++- .../sdk-distribution-rename/run-log.jsonl | 15 +++++++++++ _acceptance/task-metering/evidence-report.md | 6 ++++- _acceptance/task-metering/run-log.jsonl | 13 ++++++++++ 44 files changed, 417 insertions(+), 22 deletions(-) diff --git a/_acceptance/cache-l1-fingerprint/evidence-report.md b/_acceptance/cache-l1-fingerprint/evidence-report.md index 37d12da1..eebb3c39 100644 --- a/_acceptance/cache-l1-fingerprint/evidence-report.md +++ b/_acceptance/cache-l1-fingerprint/evidence-report.md @@ -7,7 +7,7 @@ reason: verified_by: fresh-context verification subagent enforcement_mode: strict bypass_used: false -verified_commit: 96ee9b89c428b5ce0d64c8f49ba29eb7bd65727e +verified_commit: 36651d8d168c1945d2f3ad5f66e7799bf9f5c932 # bypass_ack: human_signoff: Manh 2026-07-30 --- @@ -289,3 +289,7 @@ máy chung cho cả đợt, không ô đo nào bị chạm — chỉ dời mốc KHÔNG KẾT LUẬN ĐƯỢC (cửa sổ diff rỗng khi nhánh đứng ngay tại `main`; hoặc ô `ui-check` không chạy được ngoài luồng verify). Dời mốc khi ấy là khai rằng bằng chứng còn đúng trong khi chưa chứng minh được. + +### Re-pin lần 2 — 2026-09-16, do chien dich ghim lai kit 2.14.0 +run_id: repin-20260916T063028Z-36924 +sha: 36651d8d168c1945d2f3ad5f66e7799bf9f5c932 · suites: 9 lệnh exit 0 · evals: 16/16 eval máy đạt kỳ vọng diff --git a/_acceptance/cache-l1-fingerprint/run-log.jsonl b/_acceptance/cache-l1-fingerprint/run-log.jsonl index b24af31d..704b4567 100644 --- a/_acceptance/cache-l1-fingerprint/run-log.jsonl +++ b/_acceptance/cache-l1-fingerprint/run-log.jsonl @@ -33,3 +33,20 @@ {"ts": "2026-07-30T05:13:53Z", "round": 2, "evalId": "E16", "run_id": "minted-cache-l1-fingerprint-E16-r2", "exit_code": 0, "cmd": "cd sdk && PYTHONPATH=. uv run --no-project --with pytest --with tomli --with pydantic --with typing_extensions python -m pytest -q tests/test_fingerprint.py::test_dict_key_insertion_order_does_not_change_key"} {"ts": "2026-07-30T05:13:53Z", "round": 2, "kind": "baseline", "evals_hash": "09ebc70a2fc920b6c6e5aee9098691bc715fcec118115272addf600f055e9512", "non_discriminating": []} {"ts":"2026-09-05T10:15:00Z","kind":"repin","run_id":"repin-merge-20260905T101500Z","sha":"96ee9b89c428b5ce0d64c8f49ba29eb7bd65727e","prev_sha":"c000b4b6b32f29eea6217f8de26596a052737128","suites_exit":[0,0,0,0,0,0,0,0]} +{"ts":"2026-09-16T06:30:29Z","kind":"repin","run_id":"repin-20260916T063028Z-36924","sha":"36651d8d168c1945d2f3ad5f66e7799bf9f5c932","prev_sha":"96ee9b89c428b5ce0d64c8f49ba29eb7bd65727e","suites_exit":[0,0,0,0,0,0,0,0,0],"evals_exit":{"E1":0,"E2":0,"E3":0,"E4":0,"E5":0,"E6":0,"E7":0,"E8":0,"E9":0,"E10":0,"E11":0,"E12":0,"E13":0,"E14":0,"E15":0,"E16":0}} +{"ts":"2026-09-16T06:30:29Z","kind":"eval","run_id":"repin-20260916T063028Z-36924","eval":"E1","criterion":"AC-1","verifier":"config:executors.test.sdk_pytest_fingerprint_hashseed_stable","exit_code":0,"sha":"36651d8d168c1945d2f3ad5f66e7799bf9f5c932"} +{"ts":"2026-09-16T06:30:29Z","kind":"eval","run_id":"repin-20260916T063028Z-36924","eval":"E2","criterion":"AC-2","verifier":"config:executors.test.sdk_pytest_fingerprint_business_diff","exit_code":0,"sha":"36651d8d168c1945d2f3ad5f66e7799bf9f5c932"} +{"ts":"2026-09-16T06:30:29Z","kind":"eval","run_id":"repin-20260916T063028Z-36924","eval":"E3","criterion":"AC-3","verifier":"config:executors.test.sdk_pytest_fingerprint_per_run_keys_stripped","exit_code":0,"sha":"36651d8d168c1945d2f3ad5f66e7799bf9f5c932"} +{"ts":"2026-09-16T06:30:29Z","kind":"eval","run_id":"repin-20260916T063028Z-36924","eval":"E4","criterion":"AC-4","verifier":"config:executors.test.sdk_pytest_fingerprint_asset_bytes_same","exit_code":0,"sha":"36651d8d168c1945d2f3ad5f66e7799bf9f5c932"} +{"ts":"2026-09-16T06:30:29Z","kind":"eval","run_id":"repin-20260916T063028Z-36924","eval":"E5","criterion":"AC-5","verifier":"config:executors.test.sdk_pytest_fingerprint_asset_ref_diff","exit_code":0,"sha":"36651d8d168c1945d2f3ad5f66e7799bf9f5c932"} +{"ts":"2026-09-16T06:30:29Z","kind":"eval","run_id":"repin-20260916T063028Z-36924","eval":"E6","criterion":"AC-6","verifier":"config:executors.test.sdk_pytest_fingerprint_missing_rev","exit_code":0,"sha":"36651d8d168c1945d2f3ad5f66e7799bf9f5c932"} +{"ts":"2026-09-16T06:30:29Z","kind":"eval","run_id":"repin-20260916T063028Z-36924","eval":"E7","criterion":"AC-7","verifier":"config:executors.test.sdk_pytest_fingerprint_dirty_plugin","exit_code":0,"sha":"36651d8d168c1945d2f3ad5f66e7799bf9f5c932"} +{"ts":"2026-09-16T06:30:29Z","kind":"eval","run_id":"repin-20260916T063028Z-36924","eval":"E8","criterion":"AC-8","verifier":"config:executors.test.sdk_pytest_fingerprint_rev_diff","exit_code":0,"sha":"36651d8d168c1945d2f3ad5f66e7799bf9f5c932"} +{"ts":"2026-09-16T06:30:29Z","kind":"eval","run_id":"repin-20260916T063028Z-36924","eval":"E9","criterion":"AC-9","verifier":"config:executors.test.sdk_pytest_fingerprint_slot_diff","exit_code":0,"sha":"36651d8d168c1945d2f3ad5f66e7799bf9f5c932"} +{"ts":"2026-09-16T06:30:29Z","kind":"eval","run_id":"repin-20260916T063028Z-36924","eval":"E10","criterion":"AC-10","verifier":"config:executors.test.sdk_pytest_fingerprint_plugin_id_diff","exit_code":0,"sha":"36651d8d168c1945d2f3ad5f66e7799bf9f5c932"} +{"ts":"2026-09-16T06:30:29Z","kind":"eval","run_id":"repin-20260916T063028Z-36924","eval":"E11","criterion":"AC-11","verifier":"config:executors.test.sdk_pytest_fingerprint_model_diff","exit_code":0,"sha":"36651d8d168c1945d2f3ad5f66e7799bf9f5c932"} +{"ts":"2026-09-16T06:30:29Z","kind":"eval","run_id":"repin-20260916T063028Z-36924","eval":"E12","criterion":"AC-12","verifier":"config:executors.test.sdk_pytest_fingerprint_sdk_version","exit_code":0,"sha":"36651d8d168c1945d2f3ad5f66e7799bf9f5c932"} +{"ts":"2026-09-16T06:30:29Z","kind":"eval","run_id":"repin-20260916T063028Z-36924","eval":"E13","criterion":"AC-13","verifier":"config:executors.test.sdk_pytest_fingerprint_vectors_exact","exit_code":0,"sha":"36651d8d168c1945d2f3ad5f66e7799bf9f5c932"} +{"ts":"2026-09-16T06:30:29Z","kind":"eval","run_id":"repin-20260916T063028Z-36924","eval":"E14","criterion":"AC-14","verifier":"config:executors.test.sdk_pytest_fingerprint_vectors_guard","exit_code":0,"sha":"36651d8d168c1945d2f3ad5f66e7799bf9f5c932"} +{"ts":"2026-09-16T06:30:29Z","kind":"eval","run_id":"repin-20260916T063028Z-36924","eval":"E15","criterion":"AC-15","verifier":"config:executors.test.sdk_pytest_fingerprint_digest_form_parity","exit_code":0,"sha":"36651d8d168c1945d2f3ad5f66e7799bf9f5c932"} +{"ts":"2026-09-16T06:30:29Z","kind":"eval","run_id":"repin-20260916T063028Z-36924","eval":"E16","criterion":"AC-16","verifier":"config:executors.test.sdk_pytest_fingerprint_dict_order_stable","exit_code":0,"sha":"36651d8d168c1945d2f3ad5f66e7799bf9f5c932"} diff --git a/_acceptance/chong-doc-sai-em-ru/evidence-report.md b/_acceptance/chong-doc-sai-em-ru/evidence-report.md index 33f4000b..24f0ead9 100644 --- a/_acceptance/chong-doc-sai-em-ru/evidence-report.md +++ b/_acceptance/chong-doc-sai-em-ru/evidence-report.md @@ -7,7 +7,7 @@ reason: verified_by: fresh-context machine lane (không hội đồng — xem §Vì sao LANE thay cho VÒNG) enforcement_mode: strict bypass_used: false -verified_commit: df22a16b63139b3d34ab753a1ebefa76615e6cb7 +verified_commit: 36651d8d168c1945d2f3ad5f66e7799bf9f5c932 human_signoff: Phan Le Manh 2026-08-29 --- @@ -275,3 +275,7 @@ sha: 665ff72bf34a07fc6156be70360d7dcf5dfc0592 · suites: 7 lệnh exit 0 ### Re-pin lần 1 — 2026-08-29, KHÔNG CẦN THIẾT; giữ lại vì phép đo là thật, nhưng lý do ban đầu thì sai. Nó được lấy vì `pre-merge-check.sh` báo hồ sơ này đã cũ — nhưng lượt chạy đó **thiếu `--base`**, chế độ mà chính công cụ in ra `rules ran=2 declared-off=2 expected=4` và `NOTE: T1-escape backstop skipped — no PR base given`. Chạy đúng cách CI gọi (`bash scripts/pre-merge-check.sh . --base origin/main`) thì tại `df22a16` — mốc **trước** lần re-pin này — cổng đã **sạch**. Đo lại từng mốc sau khi phát hiện: `129928a` 2 vi phạm (verdict PENDING-JUDGMENT + `conformance-l0` cũ), `3196853` 1 vi phạm (`conformance-l0` cũ), `df22a16` sạch. Tức chỉ lần re-pin `conformance-l0` là bắt buộc. Bài học ghi ở đây thay vì xoá dấu vết: **đọc số vi phạm từ một lượt chạy nửa số luật là đọc một phép đo khác với phép đo mình tưởng** — và công cụ đã nói thẳng điều đó ở dòng NOTE ngay trên con số. Bản thân số đo dưới đây vẫn đúng và vẫn dùng được: bộ đọc không đổi một byte, một phiên tươi chạy lại cả 12 suite máy trong worktree của nhánh, preflight GREEN, mọi lệnh exit 0 run_id: repin-chong-doc-sai-em-ru-20260829T134935Z sha: df22a16b63139b3d34ab753a1ebefa76615e6cb7 · suites: 12 lệnh exit 0 + +### Re-pin lần 2 — 2026-09-16, do chien dich ghim lai kit 2.14.0 +run_id: repin-20260916T063028Z-36924 +sha: 36651d8d168c1945d2f3ad5f66e7799bf9f5c932 · suites: 9 lệnh exit 0 · evals: 12/12 eval máy đạt kỳ vọng diff --git a/_acceptance/chong-doc-sai-em-ru/run-log.jsonl b/_acceptance/chong-doc-sai-em-ru/run-log.jsonl index d748e0ba..b19d3637 100644 --- a/_acceptance/chong-doc-sai-em-ru/run-log.jsonl +++ b/_acceptance/chong-doc-sai-em-ru/run-log.jsonl @@ -94,3 +94,16 @@ {"ts":"2026-08-28T23:47:56Z","sha":"665ff72bf34a07fc6156be70360d7dcf5dfc0592","round":7,"evalId":"E16","run_id":"minted-chong-doc-sai-em-ru-E16-r7","exit_code":0,"criterion":"AC-12"} {"ts":"2026-08-28T23:54:24Z","kind":"repin","run_id":"lane-chong-doc-sai-em-ru-20260828T133500Z","sha":"665ff72bf34a07fc6156be70360d7dcf5dfc0592","suites_exit":[0,0,0,0,0,0,0]} {"ts":"2026-08-29T13:49:35Z","kind":"repin","run_id":"repin-chong-doc-sai-em-ru-20260829T134935Z","sha":"df22a16b63139b3d34ab753a1ebefa76615e6cb7","suites_exit":[0,0,0,0,0,0,0,0,0,0,0,0]} +{"ts":"2026-09-16T06:30:29Z","kind":"repin","run_id":"repin-20260916T063028Z-36924","sha":"36651d8d168c1945d2f3ad5f66e7799bf9f5c932","prev_sha":"df22a16b63139b3d34ab753a1ebefa76615e6cb7","suites_exit":[0,0,0,0,0,0,0,0,0],"evals_exit":{"E1":0,"E2":0,"E3":0,"E4":0,"E5":0,"E6":0,"E7":0,"E8":0,"E9":0,"E10":0,"E14":0,"E16":0}} +{"ts":"2026-09-16T06:30:29Z","kind":"eval","run_id":"repin-20260916T063028Z-36924","eval":"E1","criterion":"AC-8","verifier":"config:executors.script.measuring_instruments_refuse","exit_code":0,"sha":"36651d8d168c1945d2f3ad5f66e7799bf9f5c932"} +{"ts":"2026-09-16T06:30:29Z","kind":"eval","run_id":"repin-20260916T063028Z-36924","eval":"E2","criterion":"AC-11","verifier":"config:executors.test.sdk_pytest_normalize_ambiguous","exit_code":0,"sha":"36651d8d168c1945d2f3ad5f66e7799bf9f5c932"} +{"ts":"2026-09-16T06:30:29Z","kind":"eval","run_id":"repin-20260916T063028Z-36924","eval":"E3","criterion":"AC-5","verifier":"config:executors.test.sdk_pytest_normalize_dictionary_matrix","exit_code":0,"sha":"36651d8d168c1945d2f3ad5f66e7799bf9f5c932"} +{"ts":"2026-09-16T06:30:29Z","kind":"eval","run_id":"repin-20260916T063028Z-36924","eval":"E4","criterion":"AC-1","verifier":"config:executors.test.sdk_pytest_normalize_typographic_dash","exit_code":0,"sha":"36651d8d168c1945d2f3ad5f66e7799bf9f5c932"} +{"ts":"2026-09-16T06:30:29Z","kind":"eval","run_id":"repin-20260916T063028Z-36924","eval":"E5","criterion":"AC-3","verifier":"config:executors.test.sdk_pytest_normalize_range_shapes","exit_code":0,"sha":"36651d8d168c1945d2f3ad5f66e7799bf9f5c932"} +{"ts":"2026-09-16T06:30:29Z","kind":"eval","run_id":"repin-20260916T063028Z-36924","eval":"E6","criterion":"AC-9","verifier":"config:executors.test.sdk_pytest_normalize_day_word","exit_code":0,"sha":"36651d8d168c1945d2f3ad5f66e7799bf9f5c932"} +{"ts":"2026-09-16T06:30:29Z","kind":"eval","run_id":"repin-20260916T063028Z-36924","eval":"E7","criterion":"AC-10","verifier":"config:executors.test.sdk_pytest_normalize_slash","exit_code":0,"sha":"36651d8d168c1945d2f3ad5f66e7799bf9f5c932"} +{"ts":"2026-09-16T06:30:29Z","kind":"eval","run_id":"repin-20260916T063028Z-36924","eval":"E8","criterion":"AC-4","verifier":"config:executors.test.sdk_pytest_normalize_brand","exit_code":0,"sha":"36651d8d168c1945d2f3ad5f66e7799bf9f5c932"} +{"ts":"2026-09-16T06:30:29Z","kind":"eval","run_id":"repin-20260916T063028Z-36924","eval":"E9","criterion":"AC-2","verifier":"config:executors.test.sdk_pytest_normalize_url","exit_code":0,"sha":"36651d8d168c1945d2f3ad5f66e7799bf9f5c932"} +{"ts":"2026-09-16T06:30:29Z","kind":"eval","run_id":"repin-20260916T063028Z-36924","eval":"E10","criterion":"AC-6","verifier":"config:executors.test.sdk_pytest_normalize_error_codes","exit_code":0,"sha":"36651d8d168c1945d2f3ad5f66e7799bf9f5c932"} +{"ts":"2026-09-16T06:30:29Z","kind":"eval","run_id":"repin-20260916T063028Z-36924","eval":"E14","criterion":"AC-12","verifier":"config:executors.test.unit_tts_order_violation","exit_code":0,"sha":"36651d8d168c1945d2f3ad5f66e7799bf9f5c932"} +{"ts":"2026-09-16T06:30:29Z","kind":"eval","run_id":"repin-20260916T063028Z-36924","eval":"E16","criterion":"AC-12","verifier":"config:executors.test.unit_tts_warning_call_site","exit_code":0,"sha":"36651d8d168c1945d2f3ad5f66e7799bf9f5c932"} diff --git a/_acceptance/chong-mat-khoa-byo-giao-dien/evidence-report.md b/_acceptance/chong-mat-khoa-byo-giao-dien/evidence-report.md index cf7bbaaf..3c7a261f 100644 --- a/_acceptance/chong-mat-khoa-byo-giao-dien/evidence-report.md +++ b/_acceptance/chong-mat-khoa-byo-giao-dien/evidence-report.md @@ -7,7 +7,7 @@ reason: verified_by: fresh-context verification subagent enforcement_mode: strict bypass_used: false -verified_commit: 96ee9b89c428b5ce0d64c8f49ba29eb7bd65727e +verified_commit: 36651d8d168c1945d2f3ad5f66e7799bf9f5c932 human_signoff: Phan Le Manh 2026-09-02 --- @@ -306,3 +306,7 @@ máy chung cho cả đợt, 10 ô đo bị chạm, cả 10 chạy lại và exit KHÔNG KẾT LUẬN ĐƯỢC (cửa sổ diff rỗng khi nhánh đứng ngay tại `main`; hoặc ô `ui-check` không chạy được ngoài luồng verify). Dời mốc khi ấy là khai rằng bằng chứng còn đúng trong khi chưa chứng minh được. + +### Re-pin lần 2 — 2026-09-16, do chien dich ghim lai kit 2.14.0 +run_id: repin-20260916T063028Z-36924 +sha: 36651d8d168c1945d2f3ad5f66e7799bf9f5c932 · suites: 9 lệnh exit 0 · evals: 13/13 eval máy đạt kỳ vọng diff --git a/_acceptance/chong-mat-khoa-byo-giao-dien/run-log.jsonl b/_acceptance/chong-mat-khoa-byo-giao-dien/run-log.jsonl index 43b5b88d..14eb4b1c 100644 --- a/_acceptance/chong-mat-khoa-byo-giao-dien/run-log.jsonl +++ b/_acceptance/chong-mat-khoa-byo-giao-dien/run-log.jsonl @@ -77,3 +77,17 @@ {"ts":"2026-09-05T10:15:00Z","kind":"eval","run_id":"repin-merge-20260905T101500Z","eval":"E8","criterion":"AC-13","verifier":"config:executors.test.kkt_gd_locale_parity","exit_code":0,"sha":"96ee9b89c428b5ce0d64c8f49ba29eb7bd65727e"} {"ts":"2026-09-05T10:15:00Z","kind":"eval","run_id":"repin-merge-20260905T101500Z","eval":"E12","criterion":"AC-13","verifier":"config:executors.test.kkt_gd_i18n_render","exit_code":0,"sha":"96ee9b89c428b5ce0d64c8f49ba29eb7bd65727e"} {"ts":"2026-09-05T10:15:00Z","kind":"eval","run_id":"repin-merge-20260905T101500Z","eval":"E9","criterion":"AC-14","verifier":"config:executors.script.kkt_gd_a11y_proto","exit_code":0,"sha":"96ee9b89c428b5ce0d64c8f49ba29eb7bd65727e"} +{"ts":"2026-09-16T06:30:29Z","kind":"repin","run_id":"repin-20260916T063028Z-36924","sha":"36651d8d168c1945d2f3ad5f66e7799bf9f5c932","prev_sha":"96ee9b89c428b5ce0d64c8f49ba29eb7bd65727e","suites_exit":[0,0,0,0,0,0,0,0,0],"evals_exit":{"E1":0,"E13":0,"E2":0,"E3":0,"E4":0,"E5":0,"E6":0,"E7":0,"E11":0,"E14":0,"E8":0,"E12":0,"E9":0}} +{"ts":"2026-09-16T06:30:29Z","kind":"eval","run_id":"repin-20260916T063028Z-36924","eval":"E1","criterion":"AC-9","verifier":"config:executors.test.kkt_gd_resolve_config","exit_code":0,"sha":"36651d8d168c1945d2f3ad5f66e7799bf9f5c932"} +{"ts":"2026-09-16T06:30:29Z","kind":"eval","run_id":"repin-20260916T063028Z-36924","eval":"E13","criterion":"AC-10","verifier":"config:executors.test.kkt_gd_env_client","exit_code":0,"sha":"36651d8d168c1945d2f3ad5f66e7799bf9f5c932"} +{"ts":"2026-09-16T06:30:29Z","kind":"eval","run_id":"repin-20260916T063028Z-36924","eval":"E2","criterion":"AC-10","verifier":"config:executors.test.kkt_gd_settings_ui","exit_code":0,"sha":"36651d8d168c1945d2f3ad5f66e7799bf9f5c932"} +{"ts":"2026-09-16T06:30:29Z","kind":"eval","run_id":"repin-20260916T063028Z-36924","eval":"E3","criterion":"AC-10","verifier":"config:executors.test.kkt_gd_settings_wire","exit_code":0,"sha":"36651d8d168c1945d2f3ad5f66e7799bf9f5c932"} +{"ts":"2026-09-16T06:30:29Z","kind":"eval","run_id":"repin-20260916T063028Z-36924","eval":"E4","criterion":"AC-11","verifier":"config:executors.test.kkt_gd_replace_ui","exit_code":0,"sha":"36651d8d168c1945d2f3ad5f66e7799bf9f5c932"} +{"ts":"2026-09-16T06:30:29Z","kind":"eval","run_id":"repin-20260916T063028Z-36924","eval":"E5","criterion":"AC-11","verifier":"config:executors.test.kkt_gd_replace_wire","exit_code":0,"sha":"36651d8d168c1945d2f3ad5f66e7799bf9f5c932"} +{"ts":"2026-09-16T06:30:29Z","kind":"eval","run_id":"repin-20260916T063028Z-36924","eval":"E6","criterion":"AC-12","verifier":"config:executors.test.kkt_gd_panels_ui","exit_code":0,"sha":"36651d8d168c1945d2f3ad5f66e7799bf9f5c932"} +{"ts":"2026-09-16T06:30:29Z","kind":"eval","run_id":"repin-20260916T063028Z-36924","eval":"E7","criterion":"AC-12","verifier":"config:executors.test.kkt_gd_panels_wire","exit_code":0,"sha":"36651d8d168c1945d2f3ad5f66e7799bf9f5c932"} +{"ts":"2026-09-16T06:30:29Z","kind":"eval","run_id":"repin-20260916T063028Z-36924","eval":"E11","criterion":"AC-12","verifier":"config:executors.script.kkt_gd_one_reader","exit_code":0,"sha":"36651d8d168c1945d2f3ad5f66e7799bf9f5c932"} +{"ts":"2026-09-16T06:30:29Z","kind":"eval","run_id":"repin-20260916T063028Z-36924","eval":"E14","criterion":"AC-12","verifier":"config:executors.script.kkt_gd_one_reader_teeth","exit_code":0,"sha":"36651d8d168c1945d2f3ad5f66e7799bf9f5c932"} +{"ts":"2026-09-16T06:30:29Z","kind":"eval","run_id":"repin-20260916T063028Z-36924","eval":"E8","criterion":"AC-13","verifier":"config:executors.test.kkt_gd_locale_parity","exit_code":0,"sha":"36651d8d168c1945d2f3ad5f66e7799bf9f5c932"} +{"ts":"2026-09-16T06:30:29Z","kind":"eval","run_id":"repin-20260916T063028Z-36924","eval":"E12","criterion":"AC-13","verifier":"config:executors.test.kkt_gd_i18n_render","exit_code":0,"sha":"36651d8d168c1945d2f3ad5f66e7799bf9f5c932"} +{"ts":"2026-09-16T06:30:29Z","kind":"eval","run_id":"repin-20260916T063028Z-36924","eval":"E9","criterion":"AC-14","verifier":"config:executors.script.kkt_gd_a11y_proto","exit_code":0,"sha":"36651d8d168c1945d2f3ad5f66e7799bf9f5c932"} diff --git a/_acceptance/chong-mat-khoa-byo/evidence-report.md b/_acceptance/chong-mat-khoa-byo/evidence-report.md index ff68a285..3b756691 100644 --- a/_acceptance/chong-mat-khoa-byo/evidence-report.md +++ b/_acceptance/chong-mat-khoa-byo/evidence-report.md @@ -7,7 +7,7 @@ reason: verified_by: fresh-context verification subagent enforcement_mode: strict bypass_used: false -verified_commit: 96ee9b89c428b5ce0d64c8f49ba29eb7bd65727e +verified_commit: 36651d8d168c1945d2f3ad5f66e7799bf9f5c932 human_signoff: Phan Le Manh 2026-08-31 --- @@ -184,3 +184,7 @@ máy chung cho cả đợt, 8 ô đo bị chạm, cả 8 chạy lại và exit 0 KHÔNG KẾT LUẬN ĐƯỢC (cửa sổ diff rỗng khi nhánh đứng ngay tại `main`; hoặc ô `ui-check` không chạy được ngoài luồng verify). Dời mốc khi ấy là khai rằng bằng chứng còn đúng trong khi chưa chứng minh được. + +### Re-pin lần 2 — 2026-09-16, do chien dich ghim lai kit 2.14.0 +run_id: repin-20260916T063028Z-36924 +sha: 36651d8d168c1945d2f3ad5f66e7799bf9f5c932 · suites: 9 lệnh exit 0 · evals: 8/8 eval máy đạt kỳ vọng diff --git a/_acceptance/chong-mat-khoa-byo/run-log.jsonl b/_acceptance/chong-mat-khoa-byo/run-log.jsonl index 0171cc3c..d7de5582 100644 --- a/_acceptance/chong-mat-khoa-byo/run-log.jsonl +++ b/_acceptance/chong-mat-khoa-byo/run-log.jsonl @@ -92,3 +92,12 @@ {"ts":"2026-09-05T10:15:00Z","kind":"eval","run_id":"repin-merge-20260905T101500Z","eval":"E6","criterion":"AC-6","verifier":"config:executors.test.unit_byo_route_put_refuse","exit_code":0,"sha":"96ee9b89c428b5ce0d64c8f49ba29eb7bd65727e"} {"ts":"2026-09-05T10:15:00Z","kind":"eval","run_id":"repin-merge-20260905T101500Z","eval":"E7","criterion":"AC-7","verifier":"config:executors.test.unit_byo_route_put_force","exit_code":0,"sha":"96ee9b89c428b5ce0d64c8f49ba29eb7bd65727e"} {"ts":"2026-09-05T10:15:00Z","kind":"eval","run_id":"repin-merge-20260905T101500Z","eval":"E8","criterion":"AC-8","verifier":"config:executors.test.unit_byo_route_no_regression","exit_code":0,"sha":"96ee9b89c428b5ce0d64c8f49ba29eb7bd65727e"} +{"ts":"2026-09-16T06:30:29Z","kind":"repin","run_id":"repin-20260916T063028Z-36924","sha":"36651d8d168c1945d2f3ad5f66e7799bf9f5c932","prev_sha":"96ee9b89c428b5ce0d64c8f49ba29eb7bd65727e","suites_exit":[0,0,0,0,0,0,0,0,0],"evals_exit":{"E1":0,"E2":0,"E3":0,"E4":0,"E5":0,"E6":0,"E7":0,"E8":0}} +{"ts":"2026-09-16T06:30:29Z","kind":"eval","run_id":"repin-20260916T063028Z-36924","eval":"E1","criterion":"AC-1","verifier":"config:executors.test.unit_byo_seam","exit_code":0,"sha":"36651d8d168c1945d2f3ad5f66e7799bf9f5c932"} +{"ts":"2026-09-16T06:30:29Z","kind":"eval","run_id":"repin-20260916T063028Z-36924","eval":"E2","criterion":"AC-2","verifier":"config:executors.test.unit_byo_read_ok_absent","exit_code":0,"sha":"36651d8d168c1945d2f3ad5f66e7799bf9f5c932"} +{"ts":"2026-09-16T06:30:29Z","kind":"eval","run_id":"repin-20260916T063028Z-36924","eval":"E3","criterion":"AC-3","verifier":"config:executors.test.unit_byo_read_unreadable","exit_code":0,"sha":"36651d8d168c1945d2f3ad5f66e7799bf9f5c932"} +{"ts":"2026-09-16T06:30:29Z","kind":"eval","run_id":"repin-20260916T063028Z-36924","eval":"E4","criterion":"AC-4","verifier":"config:executors.test.unit_byo_load_tolerant","exit_code":0,"sha":"36651d8d168c1945d2f3ad5f66e7799bf9f5c932"} +{"ts":"2026-09-16T06:30:29Z","kind":"eval","run_id":"repin-20260916T063028Z-36924","eval":"E5","criterion":"AC-5","verifier":"config:executors.test.unit_byo_route_get","exit_code":0,"sha":"36651d8d168c1945d2f3ad5f66e7799bf9f5c932"} +{"ts":"2026-09-16T06:30:29Z","kind":"eval","run_id":"repin-20260916T063028Z-36924","eval":"E6","criterion":"AC-6","verifier":"config:executors.test.unit_byo_route_put_refuse","exit_code":0,"sha":"36651d8d168c1945d2f3ad5f66e7799bf9f5c932"} +{"ts":"2026-09-16T06:30:29Z","kind":"eval","run_id":"repin-20260916T063028Z-36924","eval":"E7","criterion":"AC-7","verifier":"config:executors.test.unit_byo_route_put_force","exit_code":0,"sha":"36651d8d168c1945d2f3ad5f66e7799bf9f5c932"} +{"ts":"2026-09-16T06:30:29Z","kind":"eval","run_id":"repin-20260916T063028Z-36924","eval":"E8","criterion":"AC-8","verifier":"config:executors.test.unit_byo_route_no_regression","exit_code":0,"sha":"36651d8d168c1945d2f3ad5f66e7799bf9f5c932"} diff --git a/_acceptance/ci-actions-bump/evidence-report.md b/_acceptance/ci-actions-bump/evidence-report.md index ca96d8be..781996c8 100644 --- a/_acceptance/ci-actions-bump/evidence-report.md +++ b/_acceptance/ci-actions-bump/evidence-report.md @@ -11,7 +11,7 @@ reason: >- verified_by: fresh-context verification subagent enforcement_mode: strict bypass_used: false -verified_commit: 96ee9b89c428b5ce0d64c8f49ba29eb7bd65727e +verified_commit: 36651d8d168c1945d2f3ad5f66e7799bf9f5c932 human_signoff: Manh 2026-08-07 --- @@ -216,3 +216,7 @@ máy chung cho cả đợt, không ô đo nào bị chạm — chỉ dời mốc KHÔNG KẾT LUẬN ĐƯỢC (cửa sổ diff rỗng khi nhánh đứng ngay tại `main`; hoặc ô `ui-check` không chạy được ngoài luồng verify). Dời mốc khi ấy là khai rằng bằng chứng còn đúng trong khi chưa chứng minh được. + +### Re-pin lần 2 — 2026-09-16, do chien dich ghim lai kit 2.14.0 +run_id: repin-20260916T063028Z-36924 +sha: 36651d8d168c1945d2f3ad5f66e7799bf9f5c932 · suites: 9 lệnh exit 0 · evals: 8/8 eval máy đạt kỳ vọng diff --git a/_acceptance/ci-actions-bump/run-log.jsonl b/_acceptance/ci-actions-bump/run-log.jsonl index 0a2c7944..cad885ba 100644 --- a/_acceptance/ci-actions-bump/run-log.jsonl +++ b/_acceptance/ci-actions-bump/run-log.jsonl @@ -7,3 +7,12 @@ {"ts":"2026-08-07T01:28:14Z","round":1,"evalId":"E7","run_id":"ci-actions-bump-E7-20260807T012801Z","exit_code":0,"cmd":"ACCEPTANCE_SLUG=ci-actions-bump bash scripts/ci/check-dispatch-run.sh desktop"} {"ts":"2026-08-07T01:28:24Z","round":1,"evalId":"E8","run_id":"ci-actions-bump-E8-20260807T012824Z","exit_code":0,"cmd":"ACCEPTANCE_SLUG=ci-actions-bump bash scripts/ci/check-workflow-drift.sh origin/main"} {"ts":"2026-09-05T10:15:00Z","kind":"repin","run_id":"repin-merge-20260905T101500Z","sha":"96ee9b89c428b5ce0d64c8f49ba29eb7bd65727e","prev_sha":"a788985b3b30c7072dcfd95bc65db1f83b940984","suites_exit":[0,0,0,0,0,0,0,0]} +{"ts":"2026-09-16T06:30:29Z","kind":"repin","run_id":"repin-20260916T063028Z-36924","sha":"36651d8d168c1945d2f3ad5f66e7799bf9f5c932","prev_sha":"96ee9b89c428b5ce0d64c8f49ba29eb7bd65727e","suites_exit":[0,0,0,0,0,0,0,0,0],"evals_exit":{"E1":0,"E2":0,"E3":0,"E4":0,"E5":0,"E6":0,"E7":0,"E8":0}} +{"ts":"2026-09-16T06:30:29Z","kind":"eval","run_id":"repin-20260916T063028Z-36924","eval":"E1","criterion":"AC-1","verifier":"config:executors.script.ci_actions_pinned","exit_code":0,"sha":"36651d8d168c1945d2f3ad5f66e7799bf9f5c932"} +{"ts":"2026-09-16T06:30:29Z","kind":"eval","run_id":"repin-20260916T063028Z-36924","eval":"E2","criterion":"AC-2","verifier":"config:executors.script.ci_gate_plumbing","exit_code":0,"sha":"36651d8d168c1945d2f3ad5f66e7799bf9f5c932"} +{"ts":"2026-09-16T06:30:29Z","kind":"eval","run_id":"repin-20260916T063028Z-36924","eval":"E3","criterion":"AC-3","verifier":"config:executors.script.ci_jobs_green","exit_code":0,"sha":"36651d8d168c1945d2f3ad5f66e7799bf9f5c932"} +{"ts":"2026-09-16T06:30:29Z","kind":"eval","run_id":"repin-20260916T063028Z-36924","eval":"E4","criterion":"AC-4","verifier":"config:executors.script.ci_docker_dryrun_guard","exit_code":0,"sha":"36651d8d168c1945d2f3ad5f66e7799bf9f5c932"} +{"ts":"2026-09-16T06:30:29Z","kind":"eval","run_id":"repin-20260916T063028Z-36924","eval":"E5","criterion":"AC-5","verifier":"config:executors.script.ci_docker_dispatch_green","exit_code":0,"sha":"36651d8d168c1945d2f3ad5f66e7799bf9f5c932"} +{"ts":"2026-09-16T06:30:29Z","kind":"eval","run_id":"repin-20260916T063028Z-36924","eval":"E6","criterion":"AC-6","verifier":"config:executors.script.ci_ghcr_untouched","exit_code":0,"sha":"36651d8d168c1945d2f3ad5f66e7799bf9f5c932"} +{"ts":"2026-09-16T06:30:29Z","kind":"eval","run_id":"repin-20260916T063028Z-36924","eval":"E7","criterion":"AC-7","verifier":"config:executors.script.ci_desktop_dispatch_green","exit_code":0,"sha":"36651d8d168c1945d2f3ad5f66e7799bf9f5c932"} +{"ts":"2026-09-16T06:30:29Z","kind":"eval","run_id":"repin-20260916T063028Z-36924","eval":"E8","criterion":"AC-8","verifier":"config:executors.script.ci_no_behaviour_drift","exit_code":0,"sha":"36651d8d168c1945d2f3ad5f66e7799bf9f5c932"} diff --git a/_acceptance/compose-overlay/evidence-report.md b/_acceptance/compose-overlay/evidence-report.md index 73678ad2..ce5043e1 100644 --- a/_acceptance/compose-overlay/evidence-report.md +++ b/_acceptance/compose-overlay/evidence-report.md @@ -14,7 +14,7 @@ reason: >- verified_by: fresh-context verification subagent enforcement_mode: strict bypass_used: false -verified_commit: 96ee9b89c428b5ce0d64c8f49ba29eb7bd65727e +verified_commit: 36651d8d168c1945d2f3ad5f66e7799bf9f5c932 human_signoff: Manh 2026-08-07 --- @@ -495,3 +495,7 @@ máy chung cho cả đợt, 12 ô đo bị chạm, cả 12 chạy lại và exit KHÔNG KẾT LUẬN ĐƯỢC (cửa sổ diff rỗng khi nhánh đứng ngay tại `main`; hoặc ô `ui-check` không chạy được ngoài luồng verify). Dời mốc khi ấy là khai rằng bằng chứng còn đúng trong khi chưa chứng minh được. + +### Re-pin lần 2 — 2026-09-16, do chien dich ghim lai kit 2.14.0 +run_id: repin-20260916T063028Z-36924 +sha: 36651d8d168c1945d2f3ad5f66e7799bf9f5c932 · suites: 9 lệnh exit 0 · evals: 25/25 eval máy đạt kỳ vọng diff --git a/_acceptance/compose-overlay/run-log.jsonl b/_acceptance/compose-overlay/run-log.jsonl index 48d256c1..63c553eb 100644 --- a/_acceptance/compose-overlay/run-log.jsonl +++ b/_acceptance/compose-overlay/run-log.jsonl @@ -37,3 +37,29 @@ {"ts":"2026-09-05T10:15:00Z","kind":"eval","run_id":"repin-merge-20260905T101500Z","eval":"E19","criterion":"AC-13","verifier":"config:executors.test.unit_conformance","exit_code":0,"sha":"96ee9b89c428b5ce0d64c8f49ba29eb7bd65727e"} {"ts":"2026-09-05T10:15:00Z","kind":"eval","run_id":"repin-merge-20260905T101500Z","eval":"E20","criterion":"AC-14","verifier":"config:executors.script.overlay_registration_synced","exit_code":0,"sha":"96ee9b89c428b5ce0d64c8f49ba29eb7bd65727e"} {"ts":"2026-09-05T10:15:00Z","kind":"eval","run_id":"repin-merge-20260905T101500Z","eval":"E21","criterion":"AC-15","verifier":"config:executors.script.overlay_sdk_train","exit_code":0,"sha":"96ee9b89c428b5ce0d64c8f49ba29eb7bd65727e"} +{"ts":"2026-09-16T06:30:29Z","kind":"repin","run_id":"repin-20260916T063028Z-36924","sha":"36651d8d168c1945d2f3ad5f66e7799bf9f5c932","prev_sha":"96ee9b89c428b5ce0d64c8f49ba29eb7bd65727e","suites_exit":[0,0,0,0,0,0,0,0,0],"evals_exit":{"E1a":0,"E1b":0,"E2":0,"E3":0,"E4":0,"E5a":0,"E5b":0,"E6":0,"E7a":0,"E7b":0,"E8a":0,"E8b":0,"E9a":0,"E9b":0,"E10":0,"E14":0,"E15":0,"E16":0,"E17":0,"E12a":0,"E12b":0,"E18":0,"E19":0,"E20":0,"E21":0}} +{"ts":"2026-09-16T06:30:29Z","kind":"eval","run_id":"repin-20260916T063028Z-36924","eval":"E1a","criterion":"AC-1","verifier":"config:executors.script.gen_abi_clean","exit_code":0,"sha":"36651d8d168c1945d2f3ad5f66e7799bf9f5c932"} +{"ts":"2026-09-16T06:30:29Z","kind":"eval","run_id":"repin-20260916T063028Z-36924","eval":"E1b","criterion":"AC-1","verifier":"config:executors.script.abi_python_gen_clean","exit_code":0,"sha":"36651d8d168c1945d2f3ad5f66e7799bf9f5c932"} +{"ts":"2026-09-16T06:30:29Z","kind":"eval","run_id":"repin-20260916T063028Z-36924","eval":"E2","criterion":"AC-2","verifier":"config:executors.script.overlay_diacritics","exit_code":0,"sha":"36651d8d168c1945d2f3ad5f66e7799bf9f5c932"} +{"ts":"2026-09-16T06:30:29Z","kind":"eval","run_id":"repin-20260916T063028Z-36924","eval":"E3","criterion":"AC-3","verifier":"config:executors.script.overlay_multiline","exit_code":0,"sha":"36651d8d168c1945d2f3ad5f66e7799bf9f5c932"} +{"ts":"2026-09-16T06:30:29Z","kind":"eval","run_id":"repin-20260916T063028Z-36924","eval":"E4","criterion":"AC-4","verifier":"config:executors.script.overlay_price_tag","exit_code":0,"sha":"36651d8d168c1945d2f3ad5f66e7799bf9f5c932"} +{"ts":"2026-09-16T06:30:29Z","kind":"eval","run_id":"repin-20260916T063028Z-36924","eval":"E5a","criterion":"AC-5","verifier":"config:executors.script.overlay_logo","exit_code":0,"sha":"36651d8d168c1945d2f3ad5f66e7799bf9f5c932"} +{"ts":"2026-09-16T06:30:29Z","kind":"eval","run_id":"repin-20260916T063028Z-36924","eval":"E5b","criterion":"AC-5","verifier":"config:executors.script.overlay_logo_missing","exit_code":0,"sha":"36651d8d168c1945d2f3ad5f66e7799bf9f5c932"} +{"ts":"2026-09-16T06:30:29Z","kind":"eval","run_id":"repin-20260916T063028Z-36924","eval":"E6","criterion":"AC-6","verifier":"config:executors.script.overlay_safe_zone","exit_code":0,"sha":"36651d8d168c1945d2f3ad5f66e7799bf9f5c932"} +{"ts":"2026-09-16T06:30:29Z","kind":"eval","run_id":"repin-20260916T063028Z-36924","eval":"E7a","criterion":"AC-7","verifier":"config:executors.script.overlay_placeholder","exit_code":0,"sha":"36651d8d168c1945d2f3ad5f66e7799bf9f5c932"} +{"ts":"2026-09-16T06:30:29Z","kind":"eval","run_id":"repin-20260916T063028Z-36924","eval":"E7b","criterion":"AC-7","verifier":"config:executors.script.overlay_placeholder_missing","exit_code":0,"sha":"36651d8d168c1945d2f3ad5f66e7799bf9f5c932"} +{"ts":"2026-09-16T06:30:29Z","kind":"eval","run_id":"repin-20260916T063028Z-36924","eval":"E8a","criterion":"AC-8","verifier":"config:executors.script.overlay_time_window","exit_code":0,"sha":"36651d8d168c1945d2f3ad5f66e7799bf9f5c932"} +{"ts":"2026-09-16T06:30:29Z","kind":"eval","run_id":"repin-20260916T063028Z-36924","eval":"E8b","criterion":"AC-8","verifier":"config:executors.script.overlay_time_window_image","exit_code":0,"sha":"36651d8d168c1945d2f3ad5f66e7799bf9f5c932"} +{"ts":"2026-09-16T06:30:29Z","kind":"eval","run_id":"repin-20260916T063028Z-36924","eval":"E9a","criterion":"AC-9","verifier":"config:executors.script.overlay_modality_image","exit_code":0,"sha":"36651d8d168c1945d2f3ad5f66e7799bf9f5c932"} +{"ts":"2026-09-16T06:30:29Z","kind":"eval","run_id":"repin-20260916T063028Z-36924","eval":"E9b","criterion":"AC-9","verifier":"config:executors.script.overlay_modality_video","exit_code":0,"sha":"36651d8d168c1945d2f3ad5f66e7799bf9f5c932"} +{"ts":"2026-09-16T06:30:29Z","kind":"eval","run_id":"repin-20260916T063028Z-36924","eval":"E10","criterion":"AC-10","verifier":"config:executors.script.overlay_determinism","exit_code":0,"sha":"36651d8d168c1945d2f3ad5f66e7799bf9f5c932"} +{"ts":"2026-09-16T06:30:29Z","kind":"eval","run_id":"repin-20260916T063028Z-36924","eval":"E14","criterion":"AC-11","verifier":"config:executors.test.sdk_pytest_overlay_tier_a_hit","exit_code":0,"sha":"36651d8d168c1945d2f3ad5f66e7799bf9f5c932"} +{"ts":"2026-09-16T06:30:29Z","kind":"eval","run_id":"repin-20260916T063028Z-36924","eval":"E15","criterion":"AC-11","verifier":"config:executors.test.sdk_pytest_overlay_partial_rerun","exit_code":0,"sha":"36651d8d168c1945d2f3ad5f66e7799bf9f5c932"} +{"ts":"2026-09-16T06:30:29Z","kind":"eval","run_id":"repin-20260916T063028Z-36924","eval":"E16","criterion":"AC-11","verifier":"config:executors.test.sdk_pytest_l3_allowlists_disjoint","exit_code":0,"sha":"36651d8d168c1945d2f3ad5f66e7799bf9f5c932"} +{"ts":"2026-09-16T06:30:29Z","kind":"eval","run_id":"repin-20260916T063028Z-36924","eval":"E17","criterion":"AC-11","verifier":"config:executors.test.sdk_pytest_l4_abi_guard_bidirectional","exit_code":0,"sha":"36651d8d168c1945d2f3ad5f66e7799bf9f5c932"} +{"ts":"2026-09-16T06:30:29Z","kind":"eval","run_id":"repin-20260916T063028Z-36924","eval":"E12a","criterion":"AC-12","verifier":"config:executors.test.unit_overlay_node","exit_code":0,"sha":"36651d8d168c1945d2f3ad5f66e7799bf9f5c932"} +{"ts":"2026-09-16T06:30:29Z","kind":"eval","run_id":"repin-20260916T063028Z-36924","eval":"E12b","criterion":"AC-12","verifier":"config:executors.test.unit_overlay_exporter","exit_code":0,"sha":"36651d8d168c1945d2f3ad5f66e7799bf9f5c932"} +{"ts":"2026-09-16T06:30:29Z","kind":"eval","run_id":"repin-20260916T063028Z-36924","eval":"E18","criterion":"AC-13","verifier":"config:executors.test.sdk_pytest_overlay_conformance","exit_code":0,"sha":"36651d8d168c1945d2f3ad5f66e7799bf9f5c932"} +{"ts":"2026-09-16T06:30:29Z","kind":"eval","run_id":"repin-20260916T063028Z-36924","eval":"E19","criterion":"AC-13","verifier":"config:executors.test.unit_conformance","exit_code":0,"sha":"36651d8d168c1945d2f3ad5f66e7799bf9f5c932"} +{"ts":"2026-09-16T06:30:29Z","kind":"eval","run_id":"repin-20260916T063028Z-36924","eval":"E20","criterion":"AC-14","verifier":"config:executors.script.overlay_registration_synced","exit_code":0,"sha":"36651d8d168c1945d2f3ad5f66e7799bf9f5c932"} +{"ts":"2026-09-16T06:30:29Z","kind":"eval","run_id":"repin-20260916T063028Z-36924","eval":"E21","criterion":"AC-15","verifier":"config:executors.script.overlay_sdk_train","exit_code":0,"sha":"36651d8d168c1945d2f3ad5f66e7799bf9f5c932"} diff --git a/_acceptance/dang-ky-fork-openai/evidence-report.md b/_acceptance/dang-ky-fork-openai/evidence-report.md index eb9e2e5e..b8c41ea6 100644 --- a/_acceptance/dang-ky-fork-openai/evidence-report.md +++ b/_acceptance/dang-ky-fork-openai/evidence-report.md @@ -7,7 +7,7 @@ reason: verified_by: fresh-context verification subagent enforcement_mode: strict bypass_used: false -verified_commit: 96ee9b89c428b5ce0d64c8f49ba29eb7bd65727e +verified_commit: 36651d8d168c1945d2f3ad5f66e7799bf9f5c932 human_signoff: Phan Le Manh 2026-09-01 --- @@ -263,3 +263,7 @@ máy chung cho cả đợt, không ô đo nào bị chạm — chỉ dời mốc KHÔNG KẾT LUẬN ĐƯỢC (cửa sổ diff rỗng khi nhánh đứng ngay tại `main`; hoặc ô `ui-check` không chạy được ngoài luồng verify). Dời mốc khi ấy là khai rằng bằng chứng còn đúng trong khi chưa chứng minh được. + +### Re-pin lần 14 — 2026-09-16, do chien dich ghim lai kit 2.14.0 +run_id: repin-20260916T063028Z-36924 +sha: 36651d8d168c1945d2f3ad5f66e7799bf9f5c932 · suites: 9 lệnh exit 0 · evals: 8/8 eval máy đạt kỳ vọng diff --git a/_acceptance/dang-ky-fork-openai/run-log.jsonl b/_acceptance/dang-ky-fork-openai/run-log.jsonl index 471e6cac..3244ece4 100644 --- a/_acceptance/dang-ky-fork-openai/run-log.jsonl +++ b/_acceptance/dang-ky-fork-openai/run-log.jsonl @@ -80,3 +80,12 @@ {"ts":"2026-09-03T23:13:51Z","kind":"repin","run_id":"repin-hang-rao-doc-nham-loi-20260903T231351Z","sha":"d1331546558e3ba13f3e77ef557f1393a44cffa9","prev_sha":"57c10c950893239c57559730ecdba193e75b0aab","suites_exit":[0,0,0,0,0,0,0]} {"ts":"2026-09-04T03:08:31Z","kind":"repin","run_id":"merge-repin-20260904T030830Z","sha":"792163491a11febaa0f5ff729f112442e3eecbef","prev_sha":"d1331546558e3ba13f3e77ef557f1393a44cffa9","suites_exit":[0,0,0,0,0,0,0]} {"ts":"2026-09-05T10:15:00Z","kind":"repin","run_id":"repin-merge-20260905T101500Z","sha":"96ee9b89c428b5ce0d64c8f49ba29eb7bd65727e","prev_sha":"792163491a11febaa0f5ff729f112442e3eecbef","suites_exit":[0,0,0,0,0,0,0,0]} +{"ts":"2026-09-16T06:30:29Z","kind":"repin","run_id":"repin-20260916T063028Z-36924","sha":"36651d8d168c1945d2f3ad5f66e7799bf9f5c932","prev_sha":"96ee9b89c428b5ce0d64c8f49ba29eb7bd65727e","suites_exit":[0,0,0,0,0,0,0,0,0],"evals_exit":{"E1":0,"E2":0,"E3":0,"E4":0,"E5":0,"E6":0,"E7":0,"E8":0}} +{"ts":"2026-09-16T06:30:29Z","kind":"eval","run_id":"repin-20260916T063028Z-36924","eval":"E1","criterion":"AC-1","verifier":"config:executors.script.lcp_manifest_counts","exit_code":0,"sha":"36651d8d168c1945d2f3ad5f66e7799bf9f5c932"} +{"ts":"2026-09-16T06:30:29Z","kind":"eval","run_id":"repin-20260916T063028Z-36924","eval":"E2","criterion":"AC-2","verifier":"config:executors.script.lcp_manifest_guard_teeth","exit_code":0,"sha":"36651d8d168c1945d2f3ad5f66e7799bf9f5c932"} +{"ts":"2026-09-16T06:30:29Z","kind":"eval","run_id":"repin-20260916T063028Z-36924","eval":"E3","criterion":"AC-3","verifier":"config:executors.script.civ_docs_guard_synced","exit_code":0,"sha":"36651d8d168c1945d2f3ad5f66e7799bf9f5c932"} +{"ts":"2026-09-16T06:30:29Z","kind":"eval","run_id":"repin-20260916T063028Z-36924","eval":"E4","criterion":"AC-4","verifier":"config:executors.script.dkfo_readme_sync","exit_code":0,"sha":"36651d8d168c1945d2f3ad5f66e7799bf9f5c932"} +{"ts":"2026-09-16T06:30:29Z","kind":"eval","run_id":"repin-20260916T063028Z-36924","eval":"E5","criterion":"AC-5","verifier":"config:executors.script.dkfo_docs_teeth","exit_code":0,"sha":"36651d8d168c1945d2f3ad5f66e7799bf9f5c932"} +{"ts":"2026-09-16T06:30:29Z","kind":"eval","run_id":"repin-20260916T063028Z-36924","eval":"E6","criterion":"AC-6","verifier":"config:executors.script.dkfo_claude_origin_ids","exit_code":0,"sha":"36651d8d168c1945d2f3ad5f66e7799bf9f5c932"} +{"ts":"2026-09-16T06:30:29Z","kind":"eval","run_id":"repin-20260916T063028Z-36924","eval":"E7","criterion":"AC-7","verifier":"config:executors.script.dkfo_icon_no_new_orphan","exit_code":0,"sha":"36651d8d168c1945d2f3ad5f66e7799bf9f5c932"} +{"ts":"2026-09-16T06:30:29Z","kind":"eval","run_id":"repin-20260916T063028Z-36924","eval":"E8","criterion":"AC-8","verifier":"config:executors.script.dkfo_resign_wave","exit_code":0,"sha":"36651d8d168c1945d2f3ad5f66e7799bf9f5c932"} diff --git a/_acceptance/dependency-refresh-2026-07/evidence-report.md b/_acceptance/dependency-refresh-2026-07/evidence-report.md index 3b54c6d8..267db416 100644 --- a/_acceptance/dependency-refresh-2026-07/evidence-report.md +++ b/_acceptance/dependency-refresh-2026-07/evidence-report.md @@ -7,7 +7,7 @@ reason: verified_by: fresh-context verification subagent enforcement_mode: strict bypass_used: false -verified_commit: 96ee9b89c428b5ce0d64c8f49ba29eb7bd65727e +verified_commit: 36651d8d168c1945d2f3ad5f66e7799bf9f5c932 human_signoff: Manh 2026-08-07 --- @@ -172,3 +172,7 @@ máy chung cho cả đợt, không ô đo nào bị chạm — chỉ dời mốc KHÔNG KẾT LUẬN ĐƯỢC (cửa sổ diff rỗng khi nhánh đứng ngay tại `main`; hoặc ô `ui-check` không chạy được ngoài luồng verify). Dời mốc khi ấy là khai rằng bằng chứng còn đúng trong khi chưa chứng minh được. + +### Re-pin lần 2 — 2026-09-16, do chien dich ghim lai kit 2.14.0 +run_id: repin-20260916T063028Z-36924 +sha: 36651d8d168c1945d2f3ad5f66e7799bf9f5c932 · suites: 9 lệnh exit 0 · evals: 8/8 eval máy đạt kỳ vọng diff --git a/_acceptance/dependency-refresh-2026-07/run-log.jsonl b/_acceptance/dependency-refresh-2026-07/run-log.jsonl index 986421e5..511f337a 100644 --- a/_acceptance/dependency-refresh-2026-07/run-log.jsonl +++ b/_acceptance/dependency-refresh-2026-07/run-log.jsonl @@ -7,3 +7,12 @@ {"ts":"2026-08-07T01:29:30Z","round":1,"evalId":"E7","run_id":"dependency-refresh-2026-07-E7-20260807T012930Z","exit_code":0,"cmd":"pnpm tsx scripts/measure/selftest-cogs.ts"} {"ts":"2026-08-07T01:29:41Z","round":1,"evalId":"E8","run_id":"dependency-refresh-2026-07-E8-20260807T012941Z","exit_code":0,"cmd":"ACCEPTANCE_SLUG=dependency-refresh-2026-07 bash scripts/deps/check-no-t3-drift.sh origin/main"} {"ts":"2026-09-05T10:15:00Z","kind":"repin","run_id":"repin-merge-20260905T101500Z","sha":"96ee9b89c428b5ce0d64c8f49ba29eb7bd65727e","prev_sha":"a788985b3b30c7072dcfd95bc65db1f83b940984","suites_exit":[0,0,0,0,0,0,0,0]} +{"ts":"2026-09-16T06:30:29Z","kind":"repin","run_id":"repin-20260916T063028Z-36924","sha":"36651d8d168c1945d2f3ad5f66e7799bf9f5c932","prev_sha":"96ee9b89c428b5ce0d64c8f49ba29eb7bd65727e","suites_exit":[0,0,0,0,0,0,0,0,0],"evals_exit":{"E1":0,"E2":0,"E3":0,"E4":0,"E5":0,"E6":0,"E7":0,"E8":0}} +{"ts":"2026-09-16T06:30:29Z","kind":"eval","run_id":"repin-20260916T063028Z-36924","eval":"E1","criterion":"AC-1","verifier":"config:executors.script.deps_manifest_intact","exit_code":0,"sha":"36651d8d168c1945d2f3ad5f66e7799bf9f5c932"} +{"ts":"2026-09-16T06:30:29Z","kind":"eval","run_id":"repin-20260916T063028Z-36924","eval":"E2","criterion":"AC-2","verifier":"config:executors.script.deps_lockfile_clean","exit_code":0,"sha":"36651d8d168c1945d2f3ad5f66e7799bf9f5c932"} +{"ts":"2026-09-16T06:30:29Z","kind":"eval","run_id":"repin-20260916T063028Z-36924","eval":"E3","criterion":"AC-3","verifier":"config:executors.test.lint","exit_code":0,"sha":"36651d8d168c1945d2f3ad5f66e7799bf9f5c932"} +{"ts":"2026-09-16T06:30:29Z","kind":"eval","run_id":"repin-20260916T063028Z-36924","eval":"E4","criterion":"AC-4","verifier":"config:executors.test.unit","exit_code":0,"sha":"36651d8d168c1945d2f3ad5f66e7799bf9f5c932"} +{"ts":"2026-09-16T06:30:29Z","kind":"eval","run_id":"repin-20260916T063028Z-36924","eval":"E5","criterion":"AC-5","verifier":"config:executors.test.sdk_pytest","exit_code":0,"sha":"36651d8d168c1945d2f3ad5f66e7799bf9f5c932"} +{"ts":"2026-09-16T06:30:29Z","kind":"eval","run_id":"repin-20260916T063028Z-36924","eval":"E6","criterion":"AC-6","verifier":"config:executors.test.build_typecheck","exit_code":0,"sha":"36651d8d168c1945d2f3ad5f66e7799bf9f5c932"} +{"ts":"2026-09-16T06:30:29Z","kind":"eval","run_id":"repin-20260916T063028Z-36924","eval":"E7","criterion":"AC-7","verifier":"config:executors.script.smoke_measure_cogs","exit_code":0,"sha":"36651d8d168c1945d2f3ad5f66e7799bf9f5c932"} +{"ts":"2026-09-16T06:30:29Z","kind":"eval","run_id":"repin-20260916T063028Z-36924","eval":"E8","criterion":"AC-8","verifier":"config:executors.script.deps_no_t3_drift","exit_code":0,"sha":"36651d8d168c1945d2f3ad5f66e7799bf9f5c932"} diff --git a/_acceptance/gate-tooling-t1/evidence-report.md b/_acceptance/gate-tooling-t1/evidence-report.md index 76806a02..85030694 100644 --- a/_acceptance/gate-tooling-t1/evidence-report.md +++ b/_acceptance/gate-tooling-t1/evidence-report.md @@ -7,7 +7,7 @@ reason: verified_by: fresh-context verification subagent enforcement_mode: strict bypass_used: false -verified_commit: 96ee9b89c428b5ce0d64c8f49ba29eb7bd65727e +verified_commit: 36651d8d168c1945d2f3ad5f66e7799bf9f5c932 human_signoff: Manh 2026-08-28 --- @@ -269,3 +269,7 @@ máy chung cho cả đợt, 12 ô đo bị chạm, cả 12 chạy lại và exit KHÔNG KẾT LUẬN ĐƯỢC (cửa sổ diff rỗng khi nhánh đứng ngay tại `main`; hoặc ô `ui-check` không chạy được ngoài luồng verify). Dời mốc khi ấy là khai rằng bằng chứng còn đúng trong khi chưa chứng minh được. + +### Re-pin lần 3 — 2026-09-16, do chien dich ghim lai kit 2.14.0 +run_id: repin-20260916T063028Z-36924 +sha: 36651d8d168c1945d2f3ad5f66e7799bf9f5c932 · suites: 9 lệnh exit 0 · evals: 12/12 eval máy đạt kỳ vọng diff --git a/_acceptance/gate-tooling-t1/run-log.jsonl b/_acceptance/gate-tooling-t1/run-log.jsonl index ba5a8b9d..6da153fe 100644 --- a/_acceptance/gate-tooling-t1/run-log.jsonl +++ b/_acceptance/gate-tooling-t1/run-log.jsonl @@ -24,3 +24,16 @@ {"ts":"2026-09-05T10:15:00Z","kind":"eval","run_id":"repin-merge-20260905T101500Z","eval":"E10","criterion":"AC-9","verifier":"config:executors.script.gt1_no_stale_on_empty_diff","exit_code":0,"sha":"96ee9b89c428b5ce0d64c8f49ba29eb7bd65727e"} {"ts":"2026-09-05T10:15:00Z","kind":"eval","run_id":"repin-merge-20260905T101500Z","eval":"E11","criterion":"AC-10","verifier":"config:executors.script.gt1_no_golden_claim","exit_code":0,"sha":"96ee9b89c428b5ce0d64c8f49ba29eb7bd65727e"} {"ts":"2026-09-05T10:15:00Z","kind":"eval","run_id":"repin-merge-20260905T101500Z","eval":"E12","criterion":"AC-11","verifier":"config:executors.script.gt1_landed_merge_repinned","exit_code":0,"sha":"96ee9b89c428b5ce0d64c8f49ba29eb7bd65727e"} +{"ts":"2026-09-16T06:30:29Z","kind":"repin","run_id":"repin-20260916T063028Z-36924","sha":"36651d8d168c1945d2f3ad5f66e7799bf9f5c932","prev_sha":"96ee9b89c428b5ce0d64c8f49ba29eb7bd65727e","suites_exit":[0,0,0,0,0,0,0,0,0],"evals_exit":{"E1":0,"E2":0,"E3":0,"E4":0,"E5":0,"E6":0,"E7":0,"E8":0,"E9":0,"E10":0,"E11":0,"E12":0}} +{"ts":"2026-09-16T06:30:29Z","kind":"eval","run_id":"repin-20260916T063028Z-36924","eval":"E1","criterion":"AC-1","verifier":"config:executors.script.gt1_t1_escape_path","exit_code":0,"sha":"36651d8d168c1945d2f3ad5f66e7799bf9f5c932"} +{"ts":"2026-09-16T06:30:29Z","kind":"eval","run_id":"repin-20260916T063028Z-36924","eval":"E2","criterion":"AC-2","verifier":"config:executors.script.stale_scope_out_of_scope","exit_code":0,"sha":"36651d8d168c1945d2f3ad5f66e7799bf9f5c932"} +{"ts":"2026-09-16T06:30:29Z","kind":"eval","run_id":"repin-20260916T063028Z-36924","eval":"E3","criterion":"AC-2","verifier":"config:executors.script.stale_scope_announce","exit_code":0,"sha":"36651d8d168c1945d2f3ad5f66e7799bf9f5c932"} +{"ts":"2026-09-16T06:30:29Z","kind":"eval","run_id":"repin-20260916T063028Z-36924","eval":"E4","criterion":"AC-3","verifier":"config:executors.script.stale_scope_fork_undeclared","exit_code":0,"sha":"36651d8d168c1945d2f3ad5f66e7799bf9f5c932"} +{"ts":"2026-09-16T06:30:29Z","kind":"eval","run_id":"repin-20260916T063028Z-36924","eval":"E5","criterion":"AC-4","verifier":"config:executors.script.stale_scope_fork_declared_in_union","exit_code":0,"sha":"36651d8d168c1945d2f3ad5f66e7799bf9f5c932"} +{"ts":"2026-09-16T06:30:29Z","kind":"eval","run_id":"repin-20260916T063028Z-36924","eval":"E6","criterion":"AC-5","verifier":"config:executors.script.gt1_all_scoping_cases","exit_code":0,"sha":"36651d8d168c1945d2f3ad5f66e7799bf9f5c932"} +{"ts":"2026-09-16T06:30:29Z","kind":"eval","run_id":"repin-20260916T063028Z-36924","eval":"E7","criterion":"AC-6","verifier":"config:executors.script.stale_scope_undeclared","exit_code":0,"sha":"36651d8d168c1945d2f3ad5f66e7799bf9f5c932"} +{"ts":"2026-09-16T06:30:29Z","kind":"eval","run_id":"repin-20260916T063028Z-36924","eval":"E8","criterion":"AC-7","verifier":"config:executors.script.gt1_dead_code_absent","exit_code":0,"sha":"36651d8d168c1945d2f3ad5f66e7799bf9f5c932"} +{"ts":"2026-09-16T06:30:29Z","kind":"eval","run_id":"repin-20260916T063028Z-36924","eval":"E9","criterion":"AC-8","verifier":"config:executors.script.gt1_fork_teeth","exit_code":0,"sha":"36651d8d168c1945d2f3ad5f66e7799bf9f5c932"} +{"ts":"2026-09-16T06:30:29Z","kind":"eval","run_id":"repin-20260916T063028Z-36924","eval":"E10","criterion":"AC-9","verifier":"config:executors.script.gt1_no_stale_on_empty_diff","exit_code":0,"sha":"36651d8d168c1945d2f3ad5f66e7799bf9f5c932"} +{"ts":"2026-09-16T06:30:29Z","kind":"eval","run_id":"repin-20260916T063028Z-36924","eval":"E11","criterion":"AC-10","verifier":"config:executors.script.gt1_no_golden_claim","exit_code":0,"sha":"36651d8d168c1945d2f3ad5f66e7799bf9f5c932"} +{"ts":"2026-09-16T06:30:29Z","kind":"eval","run_id":"repin-20260916T063028Z-36924","eval":"E12","criterion":"AC-11","verifier":"config:executors.script.gt1_landed_merge_repinned","exit_code":0,"sha":"36651d8d168c1945d2f3ad5f66e7799bf9f5c932"} diff --git a/_acceptance/hang-rao-doc-nham-loi-thanh-khong-co-gi/evidence-report.md b/_acceptance/hang-rao-doc-nham-loi-thanh-khong-co-gi/evidence-report.md index a915b672..a7e52dfd 100644 --- a/_acceptance/hang-rao-doc-nham-loi-thanh-khong-co-gi/evidence-report.md +++ b/_acceptance/hang-rao-doc-nham-loi-thanh-khong-co-gi/evidence-report.md @@ -7,7 +7,7 @@ failed_evals: [] verified_by: fresh-context verification subagent enforcement_mode: strict bypass_used: false -verified_commit: 96ee9b89c428b5ce0d64c8f49ba29eb7bd65727e +verified_commit: 36651d8d168c1945d2f3ad5f66e7799bf9f5c932 human_signoff: Phan Le Manh 2026-09-04 --- @@ -253,3 +253,7 @@ máy chung cho cả đợt, không ô đo nào bị chạm — chỉ dời mốc KHÔNG KẾT LUẬN ĐƯỢC (cửa sổ diff rỗng khi nhánh đứng ngay tại `main`; hoặc ô `ui-check` không chạy được ngoài luồng verify). Dời mốc khi ấy là khai rằng bằng chứng còn đúng trong khi chưa chứng minh được. + +### Re-pin lần 3 — 2026-09-16, do chien dich ghim lai kit 2.14.0 +run_id: repin-20260916T063028Z-36924 +sha: 36651d8d168c1945d2f3ad5f66e7799bf9f5c932 · suites: 9 lệnh exit 0 · evals: 12/12 eval máy đạt kỳ vọng diff --git a/_acceptance/hang-rao-doc-nham-loi-thanh-khong-co-gi/run-log.jsonl b/_acceptance/hang-rao-doc-nham-loi-thanh-khong-co-gi/run-log.jsonl index 2aee3d76..17e4aa9e 100644 --- a/_acceptance/hang-rao-doc-nham-loi-thanh-khong-co-gi/run-log.jsonl +++ b/_acceptance/hang-rao-doc-nham-loi-thanh-khong-co-gi/run-log.jsonl @@ -43,3 +43,16 @@ {"ts": "2026-09-04T03:09:19Z", "kind": "eval", "run_id": "merge-repin-20260904T030830Z-rerun", "eval": "E6", "criterion": "AC-6", "verifier": "config:executors.script.hrdn_dupkey", "exit_code": 0, "sha": "792163491a11febaa0f5ff729f112442e3eecbef", "output": "chay lai sau lan ghim merge-repin-20260904T030830Z tren cay da tron: exit 0"} {"ts":"2026-09-05T10:15:00Z","kind":"repin","run_id":"repin-merge-20260905T101500Z","sha":"96ee9b89c428b5ce0d64c8f49ba29eb7bd65727e","prev_sha":"792163491a11febaa0f5ff729f112442e3eecbef","suites_exit":[0,0,0,0,0,0,0,0]} {"ts":"2026-09-05T10:15:00Z","kind":"eval","run_id":"repin-merge-20260905T101500Z","eval":"E6","criterion":"AC-6","verifier":"config:executors.script.hrdn_dupkey","exit_code":0,"sha":"96ee9b89c428b5ce0d64c8f49ba29eb7bd65727e"} +{"ts":"2026-09-16T06:30:29Z","kind":"repin","run_id":"repin-20260916T063028Z-36924","sha":"36651d8d168c1945d2f3ad5f66e7799bf9f5c932","prev_sha":"96ee9b89c428b5ce0d64c8f49ba29eb7bd65727e","suites_exit":[0,0,0,0,0,0,0,0,0],"evals_exit":{"E1":0,"E2":0,"E3":0,"E4":0,"E5":0,"E6":0,"E7":0,"E8":0,"E9":0,"E10":0,"E11":0,"E12":0}} +{"ts":"2026-09-16T06:30:29Z","kind":"eval","run_id":"repin-20260916T063028Z-36924","eval":"E1","criterion":"AC-1","verifier":"config:executors.script.hrdn_base_ref","exit_code":0,"sha":"36651d8d168c1945d2f3ad5f66e7799bf9f5c932"} +{"ts":"2026-09-16T06:30:29Z","kind":"eval","run_id":"repin-20260916T063028Z-36924","eval":"E2","criterion":"AC-2","verifier":"config:executors.script.hrdn_base_absent","exit_code":0,"sha":"36651d8d168c1945d2f3ad5f66e7799bf9f5c932"} +{"ts":"2026-09-16T06:30:29Z","kind":"eval","run_id":"repin-20260916T063028Z-36924","eval":"E3","criterion":"AC-3","verifier":"config:executors.script.hrdn_diff_must","exit_code":0,"sha":"36651d8d168c1945d2f3ad5f66e7799bf9f5c932"} +{"ts":"2026-09-16T06:30:29Z","kind":"eval","run_id":"repin-20260916T063028Z-36924","eval":"E4","criterion":"AC-4","verifier":"config:executors.script.hrdn_check_counts","exit_code":0,"sha":"36651d8d168c1945d2f3ad5f66e7799bf9f5c932"} +{"ts":"2026-09-16T06:30:29Z","kind":"eval","run_id":"repin-20260916T063028Z-36924","eval":"E5","criterion":"AC-5","verifier":"config:executors.script.hrdn_shallow_probe","exit_code":0,"sha":"36651d8d168c1945d2f3ad5f66e7799bf9f5c932"} +{"ts":"2026-09-16T06:30:29Z","kind":"eval","run_id":"repin-20260916T063028Z-36924","eval":"E6","criterion":"AC-6","verifier":"config:executors.script.hrdn_dupkey","exit_code":0,"sha":"36651d8d168c1945d2f3ad5f66e7799bf9f5c932"} +{"ts":"2026-09-16T06:30:29Z","kind":"eval","run_id":"repin-20260916T063028Z-36924","eval":"E7","criterion":"AC-7","verifier":"config:executors.script.hrdn_dupkey_msg","exit_code":0,"sha":"36651d8d168c1945d2f3ad5f66e7799bf9f5c932"} +{"ts":"2026-09-16T06:30:29Z","kind":"eval","run_id":"repin-20260916T063028Z-36924","eval":"E8","criterion":"AC-8","verifier":"config:executors.script.hrdn_selfref_declared","exit_code":0,"sha":"36651d8d168c1945d2f3ad5f66e7799bf9f5c932"} +{"ts":"2026-09-16T06:30:29Z","kind":"eval","run_id":"repin-20260916T063028Z-36924","eval":"E9","criterion":"AC-9","verifier":"config:executors.script.hrdn_selfref_bucket","exit_code":0,"sha":"36651d8d168c1945d2f3ad5f66e7799bf9f5c932"} +{"ts":"2026-09-16T06:30:29Z","kind":"eval","run_id":"repin-20260916T063028Z-36924","eval":"E10","criterion":"AC-10","verifier":"config:executors.script.hrdn_selfref_forget","exit_code":0,"sha":"36651d8d168c1945d2f3ad5f66e7799bf9f5c932"} +{"ts":"2026-09-16T06:30:29Z","kind":"eval","run_id":"repin-20260916T063028Z-36924","eval":"E11","criterion":"AC-11","verifier":"config:executors.script.hrdn_resign_wave","exit_code":0,"sha":"36651d8d168c1945d2f3ad5f66e7799bf9f5c932"} +{"ts":"2026-09-16T06:30:29Z","kind":"eval","run_id":"repin-20260916T063028Z-36924","eval":"E12","criterion":"AC-12","verifier":"config:executors.script.hrdn_plan_diff_must","exit_code":0,"sha":"36651d8d168c1945d2f3ad5f66e7799bf9f5c932"} diff --git a/_acceptance/kho-khoa-toan-ven/evidence-report.md b/_acceptance/kho-khoa-toan-ven/evidence-report.md index 72a464d1..ae8e0dd6 100644 --- a/_acceptance/kho-khoa-toan-ven/evidence-report.md +++ b/_acceptance/kho-khoa-toan-ven/evidence-report.md @@ -7,7 +7,7 @@ reason: verified_by: machine-lane (owner chốt bỏ lớp hội đồng, 31/08) enforcement_mode: strict bypass_used: false -verified_commit: 96ee9b89c428b5ce0d64c8f49ba29eb7bd65727e +verified_commit: 36651d8d168c1945d2f3ad5f66e7799bf9f5c932 human_signoff: Phan Le Manh 2026-08-31 --- @@ -288,3 +288,7 @@ máy chung cho cả đợt, 10 ô đo bị chạm, cả 10 chạy lại và exit KHÔNG KẾT LUẬN ĐƯỢC (cửa sổ diff rỗng khi nhánh đứng ngay tại `main`; hoặc ô `ui-check` không chạy được ngoài luồng verify). Dời mốc khi ấy là khai rằng bằng chứng còn đúng trong khi chưa chứng minh được. + +### Re-pin lần 2 — 2026-09-16, do chien dich ghim lai kit 2.14.0 +run_id: repin-20260916T063028Z-36924 +sha: 36651d8d168c1945d2f3ad5f66e7799bf9f5c932 · suites: 9 lệnh exit 0 · evals: 13/13 eval máy đạt kỳ vọng diff --git a/_acceptance/kho-khoa-toan-ven/run-log.jsonl b/_acceptance/kho-khoa-toan-ven/run-log.jsonl index f58926fe..9f9c8fc8 100644 --- a/_acceptance/kho-khoa-toan-ven/run-log.jsonl +++ b/_acceptance/kho-khoa-toan-ven/run-log.jsonl @@ -24,3 +24,17 @@ {"ts":"2026-09-05T10:15:00Z","kind":"eval","run_id":"repin-merge-20260905T101500Z","eval":"E11","criterion":"AC-11","verifier":"config:executors.script.kkt_teeth_all","exit_code":0,"sha":"96ee9b89c428b5ce0d64c8f49ba29eb7bd65727e"} {"ts":"2026-09-05T10:15:00Z","kind":"eval","run_id":"repin-merge-20260905T101500Z","eval":"E13","criterion":"AC-12","verifier":"config:executors.test.unit_kkt_empty_key_put","exit_code":0,"sha":"96ee9b89c428b5ce0d64c8f49ba29eb7bd65727e"} {"ts":"2026-09-05T10:15:00Z","kind":"eval","run_id":"repin-merge-20260905T101500Z","eval":"E12","criterion":"AC-11","verifier":"config:executors.test.unit_kkt_no_regression","exit_code":0,"sha":"96ee9b89c428b5ce0d64c8f49ba29eb7bd65727e"} +{"ts":"2026-09-16T06:30:29Z","kind":"repin","run_id":"repin-20260916T063028Z-36924","sha":"36651d8d168c1945d2f3ad5f66e7799bf9f5c932","prev_sha":"96ee9b89c428b5ce0d64c8f49ba29eb7bd65727e","suites_exit":[0,0,0,0,0,0,0,0,0],"evals_exit":{"E1":0,"E2":0,"E3":0,"E4":0,"E5":0,"E6":0,"E7":0,"E8":0,"E9":0,"E10":0,"E11":0,"E13":0,"E12":0}} +{"ts":"2026-09-16T06:30:29Z","kind":"eval","run_id":"repin-20260916T063028Z-36924","eval":"E1","criterion":"AC-1","verifier":"config:executors.test.unit_kkt_coerce_scalar","exit_code":0,"sha":"36651d8d168c1945d2f3ad5f66e7799bf9f5c932"} +{"ts":"2026-09-16T06:30:29Z","kind":"eval","run_id":"repin-20260916T063028Z-36924","eval":"E2","criterion":"AC-2","verifier":"config:executors.test.unit_kkt_refuse_structured","exit_code":0,"sha":"36651d8d168c1945d2f3ad5f66e7799bf9f5c932"} +{"ts":"2026-09-16T06:30:29Z","kind":"eval","run_id":"repin-20260916T063028Z-36924","eval":"E3","criterion":"AC-3","verifier":"config:executors.test.unit_kkt_refuse_empty_key","exit_code":0,"sha":"36651d8d168c1945d2f3ad5f66e7799bf9f5c932"} +{"ts":"2026-09-16T06:30:29Z","kind":"eval","run_id":"repin-20260916T063028Z-36924","eval":"E4","criterion":"AC-4","verifier":"config:executors.test.unit_kkt_all_strings_untouched","exit_code":0,"sha":"36651d8d168c1945d2f3ad5f66e7799bf9f5c932"} +{"ts":"2026-09-16T06:30:29Z","kind":"eval","run_id":"repin-20260916T063028Z-36924","eval":"E5","criterion":"AC-5","verifier":"config:executors.test.unit_kkt_save_throws","exit_code":0,"sha":"36651d8d168c1945d2f3ad5f66e7799bf9f5c932"} +{"ts":"2026-09-16T06:30:29Z","kind":"eval","run_id":"repin-20260916T063028Z-36924","eval":"E6","criterion":"AC-6","verifier":"config:executors.test.unit_kkt_atomic_reader","exit_code":0,"sha":"36651d8d168c1945d2f3ad5f66e7799bf9f5c932"} +{"ts":"2026-09-16T06:30:29Z","kind":"eval","run_id":"repin-20260916T063028Z-36924","eval":"E7","criterion":"AC-7","verifier":"config:executors.test.unit_kkt_no_temp_left","exit_code":0,"sha":"36651d8d168c1945d2f3ad5f66e7799bf9f5c932"} +{"ts":"2026-09-16T06:30:29Z","kind":"eval","run_id":"repin-20260916T063028Z-36924","eval":"E8","criterion":"AC-8","verifier":"config:executors.script.kkt_seam_signature","exit_code":0,"sha":"36651d8d168c1945d2f3ad5f66e7799bf9f5c932"} +{"ts":"2026-09-16T06:30:29Z","kind":"eval","run_id":"repin-20260916T063028Z-36924","eval":"E9","criterion":"AC-9","verifier":"config:executors.test.unit_kkt_run_path","exit_code":0,"sha":"36651d8d168c1945d2f3ad5f66e7799bf9f5c932"} +{"ts":"2026-09-16T06:30:29Z","kind":"eval","run_id":"repin-20260916T063028Z-36924","eval":"E10","criterion":"AC-10","verifier":"config:executors.test.unit_kkt_round_trip","exit_code":0,"sha":"36651d8d168c1945d2f3ad5f66e7799bf9f5c932"} +{"ts":"2026-09-16T06:30:29Z","kind":"eval","run_id":"repin-20260916T063028Z-36924","eval":"E11","criterion":"AC-11","verifier":"config:executors.script.kkt_teeth_all","exit_code":0,"sha":"36651d8d168c1945d2f3ad5f66e7799bf9f5c932"} +{"ts":"2026-09-16T06:30:29Z","kind":"eval","run_id":"repin-20260916T063028Z-36924","eval":"E13","criterion":"AC-12","verifier":"config:executors.test.unit_kkt_empty_key_put","exit_code":0,"sha":"36651d8d168c1945d2f3ad5f66e7799bf9f5c932"} +{"ts":"2026-09-16T06:30:29Z","kind":"eval","run_id":"repin-20260916T063028Z-36924","eval":"E12","criterion":"AC-11","verifier":"config:executors.test.unit_kkt_no_regression","exit_code":0,"sha":"36651d8d168c1945d2f3ad5f66e7799bf9f5c932"} diff --git a/_acceptance/khong-noi-sai-ve-kho-khoa/evidence-report.md b/_acceptance/khong-noi-sai-ve-kho-khoa/evidence-report.md index d7702fa9..93317e39 100644 --- a/_acceptance/khong-noi-sai-ve-kho-khoa/evidence-report.md +++ b/_acceptance/khong-noi-sai-ve-kho-khoa/evidence-report.md @@ -7,7 +7,7 @@ reason: verified_by: fresh-context verification subagent enforcement_mode: strict bypass_used: false -verified_commit: 96ee9b89c428b5ce0d64c8f49ba29eb7bd65727e +verified_commit: 36651d8d168c1945d2f3ad5f66e7799bf9f5c932 human_signoff: Phan Le Manh 2026-09-04 --- @@ -242,3 +242,7 @@ máy chung cho cả đợt, không ô đo nào bị chạm — chỉ dời mốc KHÔNG KẾT LUẬN ĐƯỢC (cửa sổ diff rỗng khi nhánh đứng ngay tại `main`; hoặc ô `ui-check` không chạy được ngoài luồng verify). Dời mốc khi ấy là khai rằng bằng chứng còn đúng trong khi chưa chứng minh được. + +### Re-pin lần 2 — 2026-09-16, do chien dich ghim lai kit 2.14.0 +run_id: repin-20260916T063028Z-36924 +sha: 36651d8d168c1945d2f3ad5f66e7799bf9f5c932 · suites: 9 lệnh exit 0 · evals: 13/13 eval máy đạt kỳ vọng diff --git a/_acceptance/khong-noi-sai-ve-kho-khoa/run-log.jsonl b/_acceptance/khong-noi-sai-ve-kho-khoa/run-log.jsonl index cc4e8f89..5afce24f 100644 --- a/_acceptance/khong-noi-sai-ve-kho-khoa/run-log.jsonl +++ b/_acceptance/khong-noi-sai-ve-kho-khoa/run-log.jsonl @@ -65,3 +65,17 @@ {"ts":"2026-09-03T11:05:00Z","sha":"cb2fab21e079","round":3,"kind":"baseline","evals_hash":"8eb7448557153fd73eaf8d139caf1c9946f45d141fc646e148e5d41ddf38fab9","non_discriminating":[],"carried_from_round":null} {"ts":"2026-09-03T11:05:00Z","sha":"cb2fab21e079","round":3,"kind":"round-tally","verdict":"PASS","expected":20,"returned":20,"blocked":0} {"ts":"2026-09-05T10:15:00Z","kind":"repin","run_id":"repin-merge-20260905T101500Z","sha":"96ee9b89c428b5ce0d64c8f49ba29eb7bd65727e","prev_sha":"cb2fab21e07988883da528d72e5c5a62219ef058","suites_exit":[0,0,0,0,0,0,0,0]} +{"ts":"2026-09-16T06:30:29Z","kind":"repin","run_id":"repin-20260916T063028Z-36924","sha":"36651d8d168c1945d2f3ad5f66e7799bf9f5c932","prev_sha":"96ee9b89c428b5ce0d64c8f49ba29eb7bd65727e","suites_exit":[0,0,0,0,0,0,0,0,0],"evals_exit":{"E1":0,"E2":0,"E3":0,"E4":0,"E5":0,"E6":0,"E7":0,"E8":0,"E9":0,"E10":0,"E11":0,"E12":0,"E13":0}} +{"ts":"2026-09-16T06:30:29Z","kind":"eval","run_id":"repin-20260916T063028Z-36924","eval":"E1","criterion":"AC-1","verifier":"config:executors.test.knsk_route_replace_premise","exit_code":0,"sha":"36651d8d168c1945d2f3ad5f66e7799bf9f5c932"} +{"ts":"2026-09-16T06:30:29Z","kind":"eval","run_id":"repin-20260916T063028Z-36924","eval":"E2","criterion":"AC-2","verifier":"config:executors.test.knsk_env_client_taxonomy","exit_code":0,"sha":"36651d8d168c1945d2f3ad5f66e7799bf9f5c932"} +{"ts":"2026-09-16T06:30:29Z","kind":"eval","run_id":"repin-20260916T063028Z-36924","eval":"E3","criterion":"AC-3","verifier":"config:executors.test.knsk_env_client_seam","exit_code":0,"sha":"36651d8d168c1945d2f3ad5f66e7799bf9f5c932"} +{"ts":"2026-09-16T06:30:29Z","kind":"eval","run_id":"repin-20260916T063028Z-36924","eval":"E4","criterion":"AC-4","verifier":"config:executors.test.knsk_env_client_timeout","exit_code":0,"sha":"36651d8d168c1945d2f3ad5f66e7799bf9f5c932"} +{"ts":"2026-09-16T06:30:29Z","kind":"eval","run_id":"repin-20260916T063028Z-36924","eval":"E5","criterion":"AC-5","verifier":"config:executors.test.knsk_surfaces_matrix","exit_code":0,"sha":"36651d8d168c1945d2f3ad5f66e7799bf9f5c932"} +{"ts":"2026-09-16T06:30:29Z","kind":"eval","run_id":"repin-20260916T063028Z-36924","eval":"E6","criterion":"AC-6","verifier":"config:executors.test.knsk_retry_wire","exit_code":0,"sha":"36651d8d168c1945d2f3ad5f66e7799bf9f5c932"} +{"ts":"2026-09-16T06:30:29Z","kind":"eval","run_id":"repin-20260916T063028Z-36924","eval":"E7","criterion":"AC-7","verifier":"config:executors.test.knsk_replace_refused_wire","exit_code":0,"sha":"36651d8d168c1945d2f3ad5f66e7799bf9f5c932"} +{"ts":"2026-09-16T06:30:29Z","kind":"eval","run_id":"repin-20260916T063028Z-36924","eval":"E8","criterion":"AC-8","verifier":"config:executors.script.knsk_seam_guard","exit_code":0,"sha":"36651d8d168c1945d2f3ad5f66e7799bf9f5c932"} +{"ts":"2026-09-16T06:30:29Z","kind":"eval","run_id":"repin-20260916T063028Z-36924","eval":"E9","criterion":"AC-8","verifier":"config:executors.script.knsk_seam_guard_teeth","exit_code":0,"sha":"36651d8d168c1945d2f3ad5f66e7799bf9f5c932"} +{"ts":"2026-09-16T06:30:29Z","kind":"eval","run_id":"repin-20260916T063028Z-36924","eval":"E10","criterion":"AC-8","verifier":"config:executors.script.kkt_gd_one_reader","exit_code":0,"sha":"36651d8d168c1945d2f3ad5f66e7799bf9f5c932"} +{"ts":"2026-09-16T06:30:29Z","kind":"eval","run_id":"repin-20260916T063028Z-36924","eval":"E11","criterion":"AC-9","verifier":"config:executors.test.knsk_i18n_render","exit_code":0,"sha":"36651d8d168c1945d2f3ad5f66e7799bf9f5c932"} +{"ts":"2026-09-16T06:30:29Z","kind":"eval","run_id":"repin-20260916T063028Z-36924","eval":"E12","criterion":"AC-9","verifier":"config:executors.test.kkt_gd_locale_parity","exit_code":0,"sha":"36651d8d168c1945d2f3ad5f66e7799bf9f5c932"} +{"ts":"2026-09-16T06:30:29Z","kind":"eval","run_id":"repin-20260916T063028Z-36924","eval":"E13","criterion":"AC-9","verifier":"config:executors.script.knsk_a11y_proto","exit_code":0,"sha":"36651d8d168c1945d2f3ad5f66e7799bf9f5c932"} diff --git a/_acceptance/measure-harness/evidence-report.md b/_acceptance/measure-harness/evidence-report.md index cf6571ea..e50b54a9 100644 --- a/_acceptance/measure-harness/evidence-report.md +++ b/_acceptance/measure-harness/evidence-report.md @@ -7,7 +7,7 @@ reason: verified_by: fresh-context verification subagent enforcement_mode: strict bypass_used: false -verified_commit: 96ee9b89c428b5ce0d64c8f49ba29eb7bd65727e +verified_commit: 36651d8d168c1945d2f3ad5f66e7799bf9f5c932 human_signoff: Manh 2026-08-07 --- @@ -330,3 +330,7 @@ máy chung cho cả đợt, không ô đo nào bị chạm — chỉ dời mốc KHÔNG KẾT LUẬN ĐƯỢC (cửa sổ diff rỗng khi nhánh đứng ngay tại `main`; hoặc ô `ui-check` không chạy được ngoài luồng verify). Dời mốc khi ấy là khai rằng bằng chứng còn đúng trong khi chưa chứng minh được. + +### Re-pin lần 4 — 2026-09-16, do chien dich ghim lai kit 2.14.0 +run_id: repin-20260916T063028Z-36924 +sha: 36651d8d168c1945d2f3ad5f66e7799bf9f5c932 · suites: 9 lệnh exit 0 · evals: 19/19 eval máy đạt kỳ vọng diff --git a/_acceptance/measure-harness/run-log.jsonl b/_acceptance/measure-harness/run-log.jsonl index a7aba4a6..3d68cf52 100644 --- a/_acceptance/measure-harness/run-log.jsonl +++ b/_acceptance/measure-harness/run-log.jsonl @@ -20,3 +20,23 @@ {"ts":"2026-08-28T04:30:00Z","kind":"repin","run_id":"repin-measure-harness-20260828T043000Z","sha":"bee578e120584402211a6c38577f324c040e995b","suites_exit":[0,0,0,0,0,0,0]} {"ts":"2026-08-28T05:30:00Z","kind":"repin","run_id":"repin-measure-harness-20260828T053000Z","sha":"8512c6e98c48ab3f4cab75dafa9493a0b1e36868","suites_exit":[0,0,0,0,0,0,0]} {"ts":"2026-09-05T10:15:00Z","kind":"repin","run_id":"repin-merge-20260905T101500Z","sha":"96ee9b89c428b5ce0d64c8f49ba29eb7bd65727e","prev_sha":"8512c6e98c48ab3f4cab75dafa9493a0b1e36868","suites_exit":[0,0,0,0,0,0,0,0]} +{"ts":"2026-09-16T06:30:29Z","kind":"repin","run_id":"repin-20260916T063028Z-36924","sha":"36651d8d168c1945d2f3ad5f66e7799bf9f5c932","prev_sha":"96ee9b89c428b5ce0d64c8f49ba29eb7bd65727e","suites_exit":[0,0,0,0,0,0,0,0,0],"evals_exit":{"E1":0,"E2":0,"E3":0,"E4":0,"E5":0,"E6":0,"E7":0,"E8":0,"E9":0,"E10":0,"E11":0,"E12":0,"E13":0,"E14":0,"E15":0,"E16":0,"E17":0,"E18":0,"E19":0}} +{"ts":"2026-09-16T06:30:29Z","kind":"eval","run_id":"repin-20260916T063028Z-36924","eval":"E1","criterion":"AC-1","verifier":"config:executors.test.unit_measure","exit_code":0,"sha":"36651d8d168c1945d2f3ad5f66e7799bf9f5c932"} +{"ts":"2026-09-16T06:30:29Z","kind":"eval","run_id":"repin-20260916T063028Z-36924","eval":"E2","criterion":"AC-2","verifier":"config:executors.test.unit_measure","exit_code":0,"sha":"36651d8d168c1945d2f3ad5f66e7799bf9f5c932"} +{"ts":"2026-09-16T06:30:29Z","kind":"eval","run_id":"repin-20260916T063028Z-36924","eval":"E3","criterion":"AC-3","verifier":"config:executors.test.unit_measure","exit_code":0,"sha":"36651d8d168c1945d2f3ad5f66e7799bf9f5c932"} +{"ts":"2026-09-16T06:30:29Z","kind":"eval","run_id":"repin-20260916T063028Z-36924","eval":"E4","criterion":"AC-4","verifier":"config:executors.test.unit_measure","exit_code":0,"sha":"36651d8d168c1945d2f3ad5f66e7799bf9f5c932"} +{"ts":"2026-09-16T06:30:29Z","kind":"eval","run_id":"repin-20260916T063028Z-36924","eval":"E5","criterion":"AC-5","verifier":"config:executors.test.unit_measure","exit_code":0,"sha":"36651d8d168c1945d2f3ad5f66e7799bf9f5c932"} +{"ts":"2026-09-16T06:30:29Z","kind":"eval","run_id":"repin-20260916T063028Z-36924","eval":"E6","criterion":"AC-6","verifier":"config:executors.script.smoke_measure_wer","exit_code":0,"sha":"36651d8d168c1945d2f3ad5f66e7799bf9f5c932"} +{"ts":"2026-09-16T06:30:29Z","kind":"eval","run_id":"repin-20260916T063028Z-36924","eval":"E7","criterion":"AC-6","verifier":"config:executors.test.unit_measure","exit_code":0,"sha":"36651d8d168c1945d2f3ad5f66e7799bf9f5c932"} +{"ts":"2026-09-16T06:30:29Z","kind":"eval","run_id":"repin-20260916T063028Z-36924","eval":"E8","criterion":"AC-7","verifier":"config:executors.test.unit_measure","exit_code":0,"sha":"36651d8d168c1945d2f3ad5f66e7799bf9f5c932"} +{"ts":"2026-09-16T06:30:29Z","kind":"eval","run_id":"repin-20260916T063028Z-36924","eval":"E9","criterion":"AC-8","verifier":"config:executors.test.unit_measure","exit_code":0,"sha":"36651d8d168c1945d2f3ad5f66e7799bf9f5c932"} +{"ts":"2026-09-16T06:30:29Z","kind":"eval","run_id":"repin-20260916T063028Z-36924","eval":"E10","criterion":"AC-9","verifier":"config:executors.test.unit_measure","exit_code":0,"sha":"36651d8d168c1945d2f3ad5f66e7799bf9f5c932"} +{"ts":"2026-09-16T06:30:29Z","kind":"eval","run_id":"repin-20260916T063028Z-36924","eval":"E11","criterion":"AC-10","verifier":"config:executors.test.unit_measure","exit_code":0,"sha":"36651d8d168c1945d2f3ad5f66e7799bf9f5c932"} +{"ts":"2026-09-16T06:30:29Z","kind":"eval","run_id":"repin-20260916T063028Z-36924","eval":"E12","criterion":"AC-15","verifier":"config:executors.script.smoke_measure_mos","exit_code":0,"sha":"36651d8d168c1945d2f3ad5f66e7799bf9f5c932"} +{"ts":"2026-09-16T06:30:29Z","kind":"eval","run_id":"repin-20260916T063028Z-36924","eval":"E13","criterion":"AC-11","verifier":"config:executors.test.unit_measure","exit_code":0,"sha":"36651d8d168c1945d2f3ad5f66e7799bf9f5c932"} +{"ts":"2026-09-16T06:30:29Z","kind":"eval","run_id":"repin-20260916T063028Z-36924","eval":"E14","criterion":"AC-12","verifier":"config:executors.test.unit_measure","exit_code":0,"sha":"36651d8d168c1945d2f3ad5f66e7799bf9f5c932"} +{"ts":"2026-09-16T06:30:29Z","kind":"eval","run_id":"repin-20260916T063028Z-36924","eval":"E15","criterion":"AC-13","verifier":"config:executors.test.unit_measure","exit_code":0,"sha":"36651d8d168c1945d2f3ad5f66e7799bf9f5c932"} +{"ts":"2026-09-16T06:30:29Z","kind":"eval","run_id":"repin-20260916T063028Z-36924","eval":"E16","criterion":"AC-14","verifier":"config:executors.script.smoke_measure_cogs","exit_code":0,"sha":"36651d8d168c1945d2f3ad5f66e7799bf9f5c932"} +{"ts":"2026-09-16T06:30:29Z","kind":"eval","run_id":"repin-20260916T063028Z-36924","eval":"E17","criterion":"AC-16","verifier":"config:executors.test.unit","exit_code":0,"sha":"36651d8d168c1945d2f3ad5f66e7799bf9f5c932"} +{"ts":"2026-09-16T06:30:29Z","kind":"eval","run_id":"repin-20260916T063028Z-36924","eval":"E18","criterion":"AC-16","verifier":"config:executors.test.build_typecheck","exit_code":0,"sha":"36651d8d168c1945d2f3ad5f66e7799bf9f5c932"} +{"ts":"2026-09-16T06:30:29Z","kind":"eval","run_id":"repin-20260916T063028Z-36924","eval":"E19","criterion":"AC-16","verifier":"config:executors.test.lint","exit_code":0,"sha":"36651d8d168c1945d2f3ad5f66e7799bf9f5c932"} diff --git a/_acceptance/noi-thuoc-tai-lieu-vao-ci/evidence-report.md b/_acceptance/noi-thuoc-tai-lieu-vao-ci/evidence-report.md index 45ac5004..e8156132 100644 --- a/_acceptance/noi-thuoc-tai-lieu-vao-ci/evidence-report.md +++ b/_acceptance/noi-thuoc-tai-lieu-vao-ci/evidence-report.md @@ -7,7 +7,7 @@ reason: verified_by: phiên VERIFY tươi, chạy TUẦN TỰ (CLASSIFIER-FALLBACK sau BLOCKED vòng 2) enforcement_mode: strict bypass_used: false -verified_commit: a5ed5e0c879727c4cdcbbb18d738e4da35265a0a +verified_commit: 36651d8d168c1945d2f3ad5f66e7799bf9f5c932 human_signoff: Phan Le Manh 2026-09-02 --- @@ -233,3 +233,6 @@ Một ghi chú về phép đo, vì nó suýt đọc thành hồi quy: lượt ch lệnh-hỏng; lúc đó cây không còn lành vì một hồ sơ vừa được mở ngoài kế hoạch đang băng. Gỡ hồ sơ ấy thì ô xanh. Ô đo không sai; cây sai, và ô đo nói đúng điều đó. +### Re-pin lần 12 — 2026-09-16, do chien dich ghim lai kit 2.14.0 +run_id: repin-20260916T063028Z-36924 +sha: 36651d8d168c1945d2f3ad5f66e7799bf9f5c932 · suites: 9 lệnh exit 0 · evals: 9/9 eval máy đạt kỳ vọng diff --git a/_acceptance/noi-thuoc-tai-lieu-vao-ci/run-log.jsonl b/_acceptance/noi-thuoc-tai-lieu-vao-ci/run-log.jsonl index e2cdcb83..63436c6b 100644 --- a/_acceptance/noi-thuoc-tai-lieu-vao-ci/run-log.jsonl +++ b/_acceptance/noi-thuoc-tai-lieu-vao-ci/run-log.jsonl @@ -75,3 +75,13 @@ {"ts":"2026-09-07T00:45:00Z","kind":"eval","run_id":"repin-uat-20260907T004500Z","eval":"E7","criterion":"AC-7","verifier":"config:executors.script.dkfo_docs_teeth","exit_code":0,"sha":"a5ed5e0c879727c4cdcbbb18d738e4da35265a0a","output":"exit 0"} {"ts":"2026-09-07T00:45:00Z","kind":"eval","run_id":"repin-uat-20260907T004500Z","eval":"E8","criterion":"AC-8","verifier":"config:executors.script.ntlc_resign_wave","exit_code":0,"sha":"a5ed5e0c879727c4cdcbbb18d738e4da35265a0a","output":"exit 0"} {"ts":"2026-09-07T00:45:00Z","kind":"eval","run_id":"repin-uat-20260907T004500Z","eval":"E9","criterion":"AC-9","verifier":"config:executors.script.ntlc_no_new_checkout","exit_code":0,"sha":"a5ed5e0c879727c4cdcbbb18d738e4da35265a0a","output":"exit 0"} +{"ts":"2026-09-16T06:30:29Z","kind":"repin","run_id":"repin-20260916T063028Z-36924","sha":"36651d8d168c1945d2f3ad5f66e7799bf9f5c932","prev_sha":"a5ed5e0c879727c4cdcbbb18d738e4da35265a0a","suites_exit":[0,0,0,0,0,0,0,0,0],"evals_exit":{"E1":0,"E2":0,"E3":0,"E4":0,"E5":0,"E6":0,"E7":0,"E8":0,"E9":0}} +{"ts":"2026-09-16T06:30:29Z","kind":"eval","run_id":"repin-20260916T063028Z-36924","eval":"E1","criterion":"AC-1","verifier":"config:executors.script.gate_guards_job_shape","exit_code":0,"sha":"36651d8d168c1945d2f3ad5f66e7799bf9f5c932"} +{"ts":"2026-09-16T06:30:29Z","kind":"eval","run_id":"repin-20260916T063028Z-36924","eval":"E2","criterion":"AC-2","verifier":"config:executors.script.gate_guards_job_shape","exit_code":0,"sha":"36651d8d168c1945d2f3ad5f66e7799bf9f5c932"} +{"ts":"2026-09-16T06:30:29Z","kind":"eval","run_id":"repin-20260916T063028Z-36924","eval":"E3","criterion":"AC-3","verifier":"config:executors.script.gate_guards_job_reachable","exit_code":0,"sha":"36651d8d168c1945d2f3ad5f66e7799bf9f5c932"} +{"ts":"2026-09-16T06:30:29Z","kind":"eval","run_id":"repin-20260916T063028Z-36924","eval":"E4","criterion":"AC-4","verifier":"config:executors.script.gate_guards_job_teeth","exit_code":0,"sha":"36651d8d168c1945d2f3ad5f66e7799bf9f5c932"} +{"ts":"2026-09-16T06:30:29Z","kind":"eval","run_id":"repin-20260916T063028Z-36924","eval":"E5","criterion":"AC-5","verifier":"config:executors.script.gate_guards_job_teeth","exit_code":0,"sha":"36651d8d168c1945d2f3ad5f66e7799bf9f5c932"} +{"ts":"2026-09-16T06:30:29Z","kind":"eval","run_id":"repin-20260916T063028Z-36924","eval":"E6","criterion":"AC-6","verifier":"config:executors.script.dkfo_readme_sync","exit_code":0,"sha":"36651d8d168c1945d2f3ad5f66e7799bf9f5c932"} +{"ts":"2026-09-16T06:30:29Z","kind":"eval","run_id":"repin-20260916T063028Z-36924","eval":"E7","criterion":"AC-7","verifier":"config:executors.script.dkfo_docs_teeth","exit_code":0,"sha":"36651d8d168c1945d2f3ad5f66e7799bf9f5c932"} +{"ts":"2026-09-16T06:30:29Z","kind":"eval","run_id":"repin-20260916T063028Z-36924","eval":"E8","criterion":"AC-8","verifier":"config:executors.script.ntlc_resign_wave","exit_code":0,"sha":"36651d8d168c1945d2f3ad5f66e7799bf9f5c932"} +{"ts":"2026-09-16T06:30:29Z","kind":"eval","run_id":"repin-20260916T063028Z-36924","eval":"E9","criterion":"AC-9","verifier":"config:executors.script.ntlc_no_new_checkout","exit_code":0,"sha":"36651d8d168c1945d2f3ad5f66e7799bf9f5c932"} diff --git a/_acceptance/oneflow-plugin-prefix/evidence-report.md b/_acceptance/oneflow-plugin-prefix/evidence-report.md index 24430014..a38b9b77 100644 --- a/_acceptance/oneflow-plugin-prefix/evidence-report.md +++ b/_acceptance/oneflow-plugin-prefix/evidence-report.md @@ -7,7 +7,7 @@ reason: verified_by: fresh-context verification subagent enforcement_mode: strict bypass_used: false -verified_commit: 96ee9b89c428b5ce0d64c8f49ba29eb7bd65727e +verified_commit: 36651d8d168c1945d2f3ad5f66e7799bf9f5c932 human_signoff: Manh 2026-08-07 --- @@ -216,3 +216,7 @@ máy chung cho cả đợt, không ô đo nào bị chạm — chỉ dời mốc KHÔNG KẾT LUẬN ĐƯỢC (cửa sổ diff rỗng khi nhánh đứng ngay tại `main`; hoặc ô `ui-check` không chạy được ngoài luồng verify). Dời mốc khi ấy là khai rằng bằng chứng còn đúng trong khi chưa chứng minh được. + +### Re-pin lần 2 — 2026-09-16, do chien dich ghim lai kit 2.14.0 +run_id: repin-20260916T063028Z-36924 +sha: 36651d8d168c1945d2f3ad5f66e7799bf9f5c932 · suites: 9 lệnh exit 0 · evals: 11/11 eval máy đạt kỳ vọng diff --git a/_acceptance/oneflow-plugin-prefix/run-log.jsonl b/_acceptance/oneflow-plugin-prefix/run-log.jsonl index 094a3a91..c07777ec 100644 --- a/_acceptance/oneflow-plugin-prefix/run-log.jsonl +++ b/_acceptance/oneflow-plugin-prefix/run-log.jsonl @@ -10,3 +10,15 @@ {"ts":"2026-08-07T01:30:20Z","round":1,"evalId":"E10","run_id":"oneflow-plugin-prefix-E10-20260807T013020Z","exit_code":0,"cmd":"cd sdk && PYTHONPATH=. uv run --no-project --with pytest --with tomli --with pydantic --with typing_extensions python -m pytest -q tests/test_scan_prefix.py"} {"ts":"2026-08-07T01:30:26Z","round":1,"evalId":"E11","run_id":"oneflow-plugin-prefix-E11-20260807T013026Z","exit_code":0,"cmd":"cd sdk && PYTHONPATH=. uv run --no-project --with pytest --with tomli --with pydantic --with typing_extensions python -m pytest -q"} {"ts":"2026-09-05T10:15:00Z","kind":"repin","run_id":"repin-merge-20260905T101500Z","sha":"96ee9b89c428b5ce0d64c8f49ba29eb7bd65727e","prev_sha":"a788985b3b30c7072dcfd95bc65db1f83b940984","suites_exit":[0,0,0,0,0,0,0,0]} +{"ts":"2026-09-16T06:30:29Z","kind":"repin","run_id":"repin-20260916T063028Z-36924","sha":"36651d8d168c1945d2f3ad5f66e7799bf9f5c932","prev_sha":"96ee9b89c428b5ce0d64c8f49ba29eb7bd65727e","suites_exit":[0,0,0,0,0,0,0,0,0],"evals_exit":{"E1":0,"E2":0,"E3":0,"E4":0,"E5":0,"E6":0,"E7":0,"E8":0,"E9":0,"E10":0,"E11":0}} +{"ts":"2026-09-16T06:30:29Z","kind":"eval","run_id":"repin-20260916T063028Z-36924","eval":"E1","criterion":"AC-1","verifier":"config:executors.test.unit_plugin_id","exit_code":0,"sha":"36651d8d168c1945d2f3ad5f66e7799bf9f5c932"} +{"ts":"2026-09-16T06:30:29Z","kind":"eval","run_id":"repin-20260916T063028Z-36924","eval":"E2","criterion":"AC-2","verifier":"config:executors.test.unit_plugin_id","exit_code":0,"sha":"36651d8d168c1945d2f3ad5f66e7799bf9f5c932"} +{"ts":"2026-09-16T06:30:29Z","kind":"eval","run_id":"repin-20260916T063028Z-36924","eval":"E3","criterion":"AC-3","verifier":"config:executors.test.unit_plugin_id","exit_code":0,"sha":"36651d8d168c1945d2f3ad5f66e7799bf9f5c932"} +{"ts":"2026-09-16T06:30:29Z","kind":"eval","run_id":"repin-20260916T063028Z-36924","eval":"E4","criterion":"AC-4","verifier":"config:executors.test.unit_plugin_id","exit_code":0,"sha":"36651d8d168c1945d2f3ad5f66e7799bf9f5c932"} +{"ts":"2026-09-16T06:30:29Z","kind":"eval","run_id":"repin-20260916T063028Z-36924","eval":"E5","criterion":"AC-5","verifier":"config:executors.script.docs_plugin_prefix","exit_code":0,"sha":"36651d8d168c1945d2f3ad5f66e7799bf9f5c932"} +{"ts":"2026-09-16T06:30:29Z","kind":"eval","run_id":"repin-20260916T063028Z-36924","eval":"E6","criterion":"AC-6","verifier":"config:executors.script.prefix_no_config_drift","exit_code":0,"sha":"36651d8d168c1945d2f3ad5f66e7799bf9f5c932"} +{"ts":"2026-09-16T06:30:29Z","kind":"eval","run_id":"repin-20260916T063028Z-36924","eval":"E7","criterion":"AC-1","verifier":"config:executors.test.build_typecheck","exit_code":0,"sha":"36651d8d168c1945d2f3ad5f66e7799bf9f5c932"} +{"ts":"2026-09-16T06:30:29Z","kind":"eval","run_id":"repin-20260916T063028Z-36924","eval":"E8","criterion":"AC-3","verifier":"config:executors.test.unit","exit_code":0,"sha":"36651d8d168c1945d2f3ad5f66e7799bf9f5c932"} +{"ts":"2026-09-16T06:30:29Z","kind":"eval","run_id":"repin-20260916T063028Z-36924","eval":"E9","criterion":"AC-4","verifier":"config:executors.test.lint","exit_code":0,"sha":"36651d8d168c1945d2f3ad5f66e7799bf9f5c932"} +{"ts":"2026-09-16T06:30:29Z","kind":"eval","run_id":"repin-20260916T063028Z-36924","eval":"E10","criterion":"AC-7","verifier":"config:executors.test.sdk_pytest_scan_prefix","exit_code":0,"sha":"36651d8d168c1945d2f3ad5f66e7799bf9f5c932"} +{"ts":"2026-09-16T06:30:29Z","kind":"eval","run_id":"repin-20260916T063028Z-36924","eval":"E11","criterion":"AC-7","verifier":"config:executors.test.sdk_pytest","exit_code":0,"sha":"36651d8d168c1945d2f3ad5f66e7799bf9f5c932"} diff --git a/_acceptance/per-plugin-origin/evidence-report.md b/_acceptance/per-plugin-origin/evidence-report.md index 173a9909..a773c5af 100644 --- a/_acceptance/per-plugin-origin/evidence-report.md +++ b/_acceptance/per-plugin-origin/evidence-report.md @@ -7,7 +7,7 @@ reason: verified_by: fresh-context verification subagent enforcement_mode: strict bypass_used: false -verified_commit: 96ee9b89c428b5ce0d64c8f49ba29eb7bd65727e +verified_commit: 36651d8d168c1945d2f3ad5f66e7799bf9f5c932 human_signoff: Manh 2026-08-07 --- @@ -287,3 +287,7 @@ máy chung cho cả đợt, không ô đo nào bị chạm — chỉ dời mốc KHÔNG KẾT LUẬN ĐƯỢC (cửa sổ diff rỗng khi nhánh đứng ngay tại `main`; hoặc ô `ui-check` không chạy được ngoài luồng verify). Dời mốc khi ấy là khai rằng bằng chứng còn đúng trong khi chưa chứng minh được. + +### Re-pin lần 2 — 2026-09-16, do chien dich ghim lai kit 2.14.0 +run_id: repin-20260916T063028Z-36924 +sha: 36651d8d168c1945d2f3ad5f66e7799bf9f5c932 · suites: 9 lệnh exit 0 · evals: 12/12 eval máy đạt kỳ vọng diff --git a/_acceptance/per-plugin-origin/run-log.jsonl b/_acceptance/per-plugin-origin/run-log.jsonl index 33076265..24a5d1f8 100644 --- a/_acceptance/per-plugin-origin/run-log.jsonl +++ b/_acceptance/per-plugin-origin/run-log.jsonl @@ -11,3 +11,16 @@ {"ts":"2026-08-07T02:03:56Z","round":2,"evalId":"E12","run_id":"per-plugin-origin-E12-20260807T020356Z","exit_code":0,"cmd":"pnpm verify:plugins"} {"ts":"2026-08-07T02:04:05Z","round":2,"evalId":"E10","run_id":"per-plugin-origin-E10-20260807T020405Z","exit_code":0,"cmd":"pnpm build && pnpm typecheck"} {"ts":"2026-09-05T10:15:00Z","kind":"repin","run_id":"repin-merge-20260905T101500Z","sha":"96ee9b89c428b5ce0d64c8f49ba29eb7bd65727e","prev_sha":"f7306bfa6c17c4e2ff656b66036b0d369c60648d","suites_exit":[0,0,0,0,0,0,0,0]} +{"ts":"2026-09-16T06:30:30Z","kind":"repin","run_id":"repin-20260916T063028Z-36924","sha":"36651d8d168c1945d2f3ad5f66e7799bf9f5c932","prev_sha":"96ee9b89c428b5ce0d64c8f49ba29eb7bd65727e","suites_exit":[0,0,0,0,0,0,0,0,0],"evals_exit":{"E1":0,"E2":0,"E3":0,"E4":0,"E5":0,"E6":0,"E7":0,"E8":0,"E9":0,"E10":0,"E11":0,"E12":0}} +{"ts":"2026-09-16T06:30:30Z","kind":"eval","run_id":"repin-20260916T063028Z-36924","eval":"E1","criterion":"AC-1","verifier":"config:executors.test.unit_official_manifest","exit_code":0,"sha":"36651d8d168c1945d2f3ad5f66e7799bf9f5c932"} +{"ts":"2026-09-16T06:30:30Z","kind":"eval","run_id":"repin-20260916T063028Z-36924","eval":"E2","criterion":"AC-2","verifier":"config:executors.test.unit_official_manifest","exit_code":0,"sha":"36651d8d168c1945d2f3ad5f66e7799bf9f5c932"} +{"ts":"2026-09-16T06:30:30Z","kind":"eval","run_id":"repin-20260916T063028Z-36924","eval":"E3","criterion":"AC-4","verifier":"config:executors.test.unit_official_manifest","exit_code":0,"sha":"36651d8d168c1945d2f3ad5f66e7799bf9f5c932"} +{"ts":"2026-09-16T06:30:30Z","kind":"eval","run_id":"repin-20260916T063028Z-36924","eval":"E4","criterion":"AC-5","verifier":"config:executors.test.unit_official_manifest","exit_code":0,"sha":"36651d8d168c1945d2f3ad5f66e7799bf9f5c932"} +{"ts":"2026-09-16T06:30:30Z","kind":"eval","run_id":"repin-20260916T063028Z-36924","eval":"E5","criterion":"AC-3","verifier":"config:executors.script.origin_single_impl","exit_code":0,"sha":"36651d8d168c1945d2f3ad5f66e7799bf9f5c932"} +{"ts":"2026-09-16T06:30:30Z","kind":"eval","run_id":"repin-20260916T063028Z-36924","eval":"E6","criterion":"AC-3","verifier":"config:executors.script.origin_installer_parity","exit_code":0,"sha":"36651d8d168c1945d2f3ad5f66e7799bf9f5c932"} +{"ts":"2026-09-16T06:30:30Z","kind":"eval","run_id":"repin-20260916T063028Z-36924","eval":"E7","criterion":"AC-6","verifier":"config:executors.script.origin_manifest_unmoved","exit_code":0,"sha":"36651d8d168c1945d2f3ad5f66e7799bf9f5c932"} +{"ts":"2026-09-16T06:30:30Z","kind":"eval","run_id":"repin-20260916T063028Z-36924","eval":"E8","criterion":"AC-6","verifier":"config:executors.test.unit_plugin_id","exit_code":0,"sha":"36651d8d168c1945d2f3ad5f66e7799bf9f5c932"} +{"ts":"2026-09-16T06:30:30Z","kind":"eval","run_id":"repin-20260916T063028Z-36924","eval":"E9","criterion":"AC-1","verifier":"config:executors.test.unit","exit_code":0,"sha":"36651d8d168c1945d2f3ad5f66e7799bf9f5c932"} +{"ts":"2026-09-16T06:30:30Z","kind":"eval","run_id":"repin-20260916T063028Z-36924","eval":"E10","criterion":"AC-3","verifier":"config:executors.test.build_typecheck","exit_code":0,"sha":"36651d8d168c1945d2f3ad5f66e7799bf9f5c932"} +{"ts":"2026-09-16T06:30:30Z","kind":"eval","run_id":"repin-20260916T063028Z-36924","eval":"E11","criterion":"AC-3","verifier":"config:executors.test.lint","exit_code":0,"sha":"36651d8d168c1945d2f3ad5f66e7799bf9f5c932"} +{"ts":"2026-09-16T06:30:30Z","kind":"eval","run_id":"repin-20260916T063028Z-36924","eval":"E12","criterion":"AC-3","verifier":"config:executors.script.verify_plugins","exit_code":0,"sha":"36651d8d168c1945d2f3ad5f66e7799bf9f5c932"} diff --git a/_acceptance/repin-khong-chay-lai-eval/evidence-report.md b/_acceptance/repin-khong-chay-lai-eval/evidence-report.md index e4a76adb..a02766db 100644 --- a/_acceptance/repin-khong-chay-lai-eval/evidence-report.md +++ b/_acceptance/repin-khong-chay-lai-eval/evidence-report.md @@ -7,7 +7,7 @@ reason: verified_by: phiên VERIFY tuần tự (CLASSIFIER-FALLBACK sau BLOCKED vòng 3) + 3 lớp soi chỉ-đọc + 1 lượt soi xác nhận đối kháng enforcement_mode: strict bypass_used: false -verified_commit: 96ee9b89c428b5ce0d64c8f49ba29eb7bd65727e +verified_commit: 36651d8d168c1945d2f3ad5f66e7799bf9f5c932 human_signoff: Phan Le Manh 2026-09-03 --- @@ -322,3 +322,7 @@ máy chung cho cả đợt, không ô đo nào bị chạm — chỉ dời mốc KHÔNG KẾT LUẬN ĐƯỢC (cửa sổ diff rỗng khi nhánh đứng ngay tại `main`; hoặc ô `ui-check` không chạy được ngoài luồng verify). Dời mốc khi ấy là khai rằng bằng chứng còn đúng trong khi chưa chứng minh được. + +### Re-pin lần 6 — 2026-09-16, do chien dich ghim lai kit 2.14.0 +run_id: repin-20260916T063028Z-36924 +sha: 36651d8d168c1945d2f3ad5f66e7799bf9f5c932 · suites: 9 lệnh exit 0 · evals: 14/14 eval máy đạt kỳ vọng diff --git a/_acceptance/repin-khong-chay-lai-eval/run-log.jsonl b/_acceptance/repin-khong-chay-lai-eval/run-log.jsonl index 7081e0e8..e59e7112 100644 --- a/_acceptance/repin-khong-chay-lai-eval/run-log.jsonl +++ b/_acceptance/repin-khong-chay-lai-eval/run-log.jsonl @@ -65,3 +65,18 @@ {"ts": "2026-09-04T03:09:19Z", "kind": "eval", "run_id": "merge-repin-20260904T030830Z-rerun", "eval": "E2", "criterion": "AC-2", "verifier": "config:executors.script.rkce_newlines_have_prev", "exit_code": 0, "sha": "792163491a11febaa0f5ff729f112442e3eecbef", "output": "chay lai sau lan ghim merge-repin-20260904T030830Z tren cay da tron: exit 0"} {"ts":"2026-09-05T10:15:00Z","kind":"repin","run_id":"repin-merge-20260905T101500Z","sha":"96ee9b89c428b5ce0d64c8f49ba29eb7bd65727e","prev_sha":"792163491a11febaa0f5ff729f112442e3eecbef","suites_exit":[0,0,0,0,0,0,0,0]} {"ts":"2026-09-05T10:15:00Z","kind":"eval","run_id":"repin-merge-20260905T101500Z","eval":"E2","criterion":"AC-2","verifier":"config:executors.script.rkce_newlines_have_prev","exit_code":0,"sha":"96ee9b89c428b5ce0d64c8f49ba29eb7bd65727e"} +{"ts":"2026-09-16T06:30:30Z","kind":"repin","run_id":"repin-20260916T063028Z-36924","sha":"36651d8d168c1945d2f3ad5f66e7799bf9f5c932","prev_sha":"96ee9b89c428b5ce0d64c8f49ba29eb7bd65727e","suites_exit":[0,0,0,0,0,0,0,0,0],"evals_exit":{"E1":0,"E2":0,"E3":0,"E4":0,"E5":0,"E6":0,"E7":0,"E8":0,"E9":0,"E10":0,"E11":0,"E12":0,"E13":0,"E14":0}} +{"ts":"2026-09-16T06:30:30Z","kind":"eval","run_id":"repin-20260916T063028Z-36924","eval":"E1","criterion":"AC-1","verifier":"config:executors.script.rkce_write_teeth","exit_code":0,"sha":"36651d8d168c1945d2f3ad5f66e7799bf9f5c932"} +{"ts":"2026-09-16T06:30:30Z","kind":"eval","run_id":"repin-20260916T063028Z-36924","eval":"E2","criterion":"AC-2","verifier":"config:executors.script.rkce_newlines_have_prev","exit_code":0,"sha":"36651d8d168c1945d2f3ad5f66e7799bf9f5c932"} +{"ts":"2026-09-16T06:30:30Z","kind":"eval","run_id":"repin-20260916T063028Z-36924","eval":"E3","criterion":"AC-3","verifier":"config:executors.script.rkce_paths_law","exit_code":0,"sha":"36651d8d168c1945d2f3ad5f66e7799bf9f5c932"} +{"ts":"2026-09-16T06:30:30Z","kind":"eval","run_id":"repin-20260916T063028Z-36924","eval":"E4","criterion":"AC-4","verifier":"config:executors.script.rkce_plan","exit_code":0,"sha":"36651d8d168c1945d2f3ad5f66e7799bf9f5c932"} +{"ts":"2026-09-16T06:30:30Z","kind":"eval","run_id":"repin-20260916T063028Z-36924","eval":"E5","criterion":"AC-5","verifier":"config:executors.script.rkce_check","exit_code":0,"sha":"36651d8d168c1945d2f3ad5f66e7799bf9f5c932"} +{"ts":"2026-09-16T06:30:30Z","kind":"eval","run_id":"repin-20260916T063028Z-36924","eval":"E6","criterion":"AC-6","verifier":"config:executors.script.rkce_check_min","exit_code":0,"sha":"36651d8d168c1945d2f3ad5f66e7799bf9f5c932"} +{"ts":"2026-09-16T06:30:30Z","kind":"eval","run_id":"repin-20260916T063028Z-36924","eval":"E7","criterion":"AC-7","verifier":"config:executors.script.rkce_readers_bytewise","exit_code":0,"sha":"36651d8d168c1945d2f3ad5f66e7799bf9f5c932"} +{"ts":"2026-09-16T06:30:30Z","kind":"eval","run_id":"repin-20260916T063028Z-36924","eval":"E8","criterion":"AC-8","verifier":"config:executors.script.rkce_teeth","exit_code":0,"sha":"36651d8d168c1945d2f3ad5f66e7799bf9f5c932"} +{"ts":"2026-09-16T06:30:30Z","kind":"eval","run_id":"repin-20260916T063028Z-36924","eval":"E9","criterion":"AC-9","verifier":"config:executors.script.rkce_resign_wave","exit_code":0,"sha":"36651d8d168c1945d2f3ad5f66e7799bf9f5c932"} +{"ts":"2026-09-16T06:30:30Z","kind":"eval","run_id":"repin-20260916T063028Z-36924","eval":"E10","criterion":"AC-10","verifier":"config:executors.script.rkce_write_refusals","exit_code":0,"sha":"36651d8d168c1945d2f3ad5f66e7799bf9f5c932"} +{"ts":"2026-09-16T06:30:30Z","kind":"eval","run_id":"repin-20260916T063028Z-36924","eval":"E11","criterion":"AC-11","verifier":"config:executors.script.rkce_entrypoint","exit_code":0,"sha":"36651d8d168c1945d2f3ad5f66e7799bf9f5c932"} +{"ts":"2026-09-16T06:30:30Z","kind":"eval","run_id":"repin-20260916T063028Z-36924","eval":"E12","criterion":"AC-12","verifier":"config:executors.script.rkce_gateway","exit_code":0,"sha":"36651d8d168c1945d2f3ad5f66e7799bf9f5c932"} +{"ts":"2026-09-16T06:30:30Z","kind":"eval","run_id":"repin-20260916T063028Z-36924","eval":"E13","criterion":"AC-13","verifier":"config:executors.script.rkce_exit_code","exit_code":0,"sha":"36651d8d168c1945d2f3ad5f66e7799bf9f5c932"} +{"ts":"2026-09-16T06:30:30Z","kind":"eval","run_id":"repin-20260916T063028Z-36924","eval":"E14","criterion":"AC-14","verifier":"config:executors.script.rkce_so_khop_total","exit_code":0,"sha":"36651d8d168c1945d2f3ad5f66e7799bf9f5c932"} diff --git a/_acceptance/roadmap-drift-guard/evidence-report.md b/_acceptance/roadmap-drift-guard/evidence-report.md index da811103..68c3adcb 100644 --- a/_acceptance/roadmap-drift-guard/evidence-report.md +++ b/_acceptance/roadmap-drift-guard/evidence-report.md @@ -7,7 +7,7 @@ reason: verified_by: fresh-context verification subagent enforcement_mode: strict bypass_used: false -verified_commit: a21840da44f3dc922c530d90d09666d8081f434a +verified_commit: 36651d8d168c1945d2f3ad5f66e7799bf9f5c932 human_signoff: Manh 2026-08-27 --- @@ -417,3 +417,7 @@ Ký Cổng Đáng của `skill-1-footage-kho-clip` (A1) làm hai ca răng `kiem- mượn trạng thái chưa-ký từ cây thật thay vì tự dựng. Sửa cho chúng tự gỡ ký trong bản sao — một file dưới `scripts/roadmap/**`, nên mốc lần 5 (`be5426e`) hỏng theo glob. Mã của gói này không đổi. Cả mười ô đo chạy lại, cả mười exit 0; cây sạch trước và sau, phiên điều phối không ghi gì trong lúc đo. + +### Re-pin lần 7 — 2026-09-16, do chien dich ghim lai kit 2.14.0 +run_id: repin-20260916T063028Z-36924 +sha: 36651d8d168c1945d2f3ad5f66e7799bf9f5c932 · suites: 9 lệnh exit 0 · evals: 10/10 eval máy đạt kỳ vọng diff --git a/_acceptance/roadmap-drift-guard/run-log.jsonl b/_acceptance/roadmap-drift-guard/run-log.jsonl index 5e19cbcc..d3b01c76 100644 --- a/_acceptance/roadmap-drift-guard/run-log.jsonl +++ b/_acceptance/roadmap-drift-guard/run-log.jsonl @@ -107,3 +107,14 @@ {"ts":"2026-09-05T14:00:00Z","kind":"eval","run_id":"repin-a1-20260905T140000Z","eval":"E8","criterion":"AC-8","verifier":"config:executors.script.roadmap_drift_green","exit_code":0,"sha":"a21840da44f3dc922c530d90d09666d8081f434a","output":"✅ docs/roadmap.md khớp với docs/adr/ và _acceptance/ — không có trôi."} {"ts":"2026-09-05T14:00:00Z","kind":"eval","run_id":"repin-a1-20260905T140000Z","eval":"E9","criterion":"AC-9","verifier":"config:executors.script.roadmap_teeth_supersede_source_single","exit_code":0,"sha":"a21840da44f3dc922c530d90d09666d8081f434a","output":" ✓ CASE supersede-source-single: PASS"} {"ts":"2026-09-05T14:00:00Z","kind":"eval","run_id":"repin-a1-20260905T140000Z","eval":"E11","criterion":"AC-4","verifier":"config:executors.script.roadmap_teeth_ledger_paired","exit_code":0,"sha":"a21840da44f3dc922c530d90d09666d8081f434a","output":" ✓ CASE ledger-paired: PASS"} +{"ts":"2026-09-16T06:30:30Z","kind":"repin","run_id":"repin-20260916T063028Z-36924","sha":"36651d8d168c1945d2f3ad5f66e7799bf9f5c932","prev_sha":"a21840da44f3dc922c530d90d09666d8081f434a","suites_exit":[0,0,0,0,0,0,0,0,0],"evals_exit":{"E1":0,"E2":0,"E3":0,"E4":0,"E5":0,"E6":0,"E7":0,"E8":0,"E9":0,"E11":0}} +{"ts":"2026-09-16T06:30:30Z","kind":"eval","run_id":"repin-20260916T063028Z-36924","eval":"E1","criterion":"AC-1","verifier":"config:executors.script.roadmap_teeth_adr_uncited","exit_code":0,"sha":"36651d8d168c1945d2f3ad5f66e7799bf9f5c932"} +{"ts":"2026-09-16T06:30:30Z","kind":"eval","run_id":"repin-20260916T063028Z-36924","eval":"E2","criterion":"AC-2","verifier":"config:executors.script.roadmap_teeth_superseded_bare","exit_code":0,"sha":"36651d8d168c1945d2f3ad5f66e7799bf9f5c932"} +{"ts":"2026-09-16T06:30:30Z","kind":"eval","run_id":"repin-20260916T063028Z-36924","eval":"E3","criterion":"AC-3","verifier":"config:executors.script.roadmap_teeth_superseded_paired","exit_code":0,"sha":"36651d8d168c1945d2f3ad5f66e7799bf9f5c932"} +{"ts":"2026-09-16T06:30:30Z","kind":"eval","run_id":"repin-20260916T063028Z-36924","eval":"E4","criterion":"AC-4","verifier":"config:executors.script.roadmap_teeth_ledger_missing","exit_code":0,"sha":"36651d8d168c1945d2f3ad5f66e7799bf9f5c932"} +{"ts":"2026-09-16T06:30:30Z","kind":"eval","run_id":"repin-20260916T063028Z-36924","eval":"E5","criterion":"AC-5","verifier":"config:executors.script.roadmap_teeth_ledger_stale","exit_code":0,"sha":"36651d8d168c1945d2f3ad5f66e7799bf9f5c932"} +{"ts":"2026-09-16T06:30:30Z","kind":"eval","run_id":"repin-20260916T063028Z-36924","eval":"E6","criterion":"AC-6","verifier":"config:executors.script.roadmap_teeth_historical","exit_code":0,"sha":"36651d8d168c1945d2f3ad5f66e7799bf9f5c932"} +{"ts":"2026-09-16T06:30:30Z","kind":"eval","run_id":"repin-20260916T063028Z-36924","eval":"E7","criterion":"AC-7","verifier":"config:executors.script.roadmap_teeth_case_isolation","exit_code":0,"sha":"36651d8d168c1945d2f3ad5f66e7799bf9f5c932"} +{"ts":"2026-09-16T06:30:30Z","kind":"eval","run_id":"repin-20260916T063028Z-36924","eval":"E8","criterion":"AC-8","verifier":"config:executors.script.roadmap_drift_green","exit_code":0,"sha":"36651d8d168c1945d2f3ad5f66e7799bf9f5c932"} +{"ts":"2026-09-16T06:30:30Z","kind":"eval","run_id":"repin-20260916T063028Z-36924","eval":"E9","criterion":"AC-9","verifier":"config:executors.script.roadmap_teeth_supersede_source_single","exit_code":0,"sha":"36651d8d168c1945d2f3ad5f66e7799bf9f5c932"} +{"ts":"2026-09-16T06:30:30Z","kind":"eval","run_id":"repin-20260916T063028Z-36924","eval":"E11","criterion":"AC-4","verifier":"config:executors.script.roadmap_teeth_ledger_paired","exit_code":0,"sha":"36651d8d168c1945d2f3ad5f66e7799bf9f5c932"} diff --git a/_acceptance/scan-scope-diagnostics/evidence-report.md b/_acceptance/scan-scope-diagnostics/evidence-report.md index 6156f2c0..d7658549 100644 --- a/_acceptance/scan-scope-diagnostics/evidence-report.md +++ b/_acceptance/scan-scope-diagnostics/evidence-report.md @@ -6,7 +6,7 @@ failed_evals: [] verified_by: fresh-context verification subagent enforcement_mode: strict bypass_used: false -verified_commit: 96ee9b89c428b5ce0d64c8f49ba29eb7bd65727e +verified_commit: 36651d8d168c1945d2f3ad5f66e7799bf9f5c932 human_signoff: Manh 2026-08-18 --- @@ -288,3 +288,7 @@ máy chung cho cả đợt, 1 ô đo bị chạm, cả 1 chạy lại và exit 0 KHÔNG KẾT LUẬN ĐƯỢC (cửa sổ diff rỗng khi nhánh đứng ngay tại `main`; hoặc ô `ui-check` không chạy được ngoài luồng verify). Dời mốc khi ấy là khai rằng bằng chứng còn đúng trong khi chưa chứng minh được. + +### Re-pin lần 3 — 2026-09-16, do chien dich ghim lai kit 2.14.0 +run_id: repin-20260916T063028Z-36924 +sha: 36651d8d168c1945d2f3ad5f66e7799bf9f5c932 · suites: 9 lệnh exit 0 · evals: 21/21 eval máy đạt kỳ vọng diff --git a/_acceptance/scan-scope-diagnostics/run-log.jsonl b/_acceptance/scan-scope-diagnostics/run-log.jsonl index ca0e8855..c5a6a2da 100644 --- a/_acceptance/scan-scope-diagnostics/run-log.jsonl +++ b/_acceptance/scan-scope-diagnostics/run-log.jsonl @@ -67,3 +67,25 @@ {"ts":"2026-08-19T00:49:53Z","kind":"repin","run_id":"repin-scan-scope-diagnostics-1","sha":"6b08f6a289b423eb63a2f422416da9138e1bf207","suites_exit":[0,0,0,0,0,0]} {"ts":"2026-09-05T10:15:00Z","kind":"repin","run_id":"repin-merge-20260905T101500Z","sha":"96ee9b89c428b5ce0d64c8f49ba29eb7bd65727e","prev_sha":"6b08f6a289b423eb63a2f422416da9138e1bf207","suites_exit":[0,0,0,0,0,0,0,0]} {"ts":"2026-09-05T10:15:00Z","kind":"eval","run_id":"repin-merge-20260905T101500Z","eval":"E13b","criterion":"AC-13","verifier":"config:executors.script.diag_noise_real","exit_code":0,"sha":"96ee9b89c428b5ce0d64c8f49ba29eb7bd65727e"} +{"ts":"2026-09-16T06:30:30Z","kind":"repin","run_id":"repin-20260916T063028Z-36924","sha":"36651d8d168c1945d2f3ad5f66e7799bf9f5c932","prev_sha":"96ee9b89c428b5ce0d64c8f49ba29eb7bd65727e","suites_exit":[0,0,0,0,0,0,0,0,0],"evals_exit":{"E1":0,"E2":0,"E3":0,"E4":0,"E5":0,"E6":0,"E6b":0,"E6c":0,"E18":0,"E7":0,"E8":0,"E9":0,"E10":0,"E11":0,"E12":0,"E13":0,"E13b":0,"E14":0,"E15":0,"E16":0,"E17":0}} +{"ts":"2026-09-16T06:30:30Z","kind":"eval","run_id":"repin-20260916T063028Z-36924","eval":"E1","criterion":"AC-1","verifier":"config:executors.test.sdk_pytest_diag_block_reason","exit_code":0,"sha":"36651d8d168c1945d2f3ad5f66e7799bf9f5c932"} +{"ts":"2026-09-16T06:30:30Z","kind":"eval","run_id":"repin-20260916T063028Z-36924","eval":"E2","criterion":"AC-2","verifier":"config:executors.test.sdk_pytest_diag_block_matrix","exit_code":0,"sha":"36651d8d168c1945d2f3ad5f66e7799bf9f5c932"} +{"ts":"2026-09-16T06:30:30Z","kind":"eval","run_id":"repin-20260916T063028Z-36924","eval":"E3","criterion":"AC-3","verifier":"config:executors.test.sdk_pytest_diag_block_wellformed","exit_code":0,"sha":"36651d8d168c1945d2f3ad5f66e7799bf9f5c932"} +{"ts":"2026-09-16T06:30:30Z","kind":"eval","run_id":"repin-20260916T063028Z-36924","eval":"E4","criterion":"AC-4","verifier":"config:executors.test.sdk_pytest_diag_closure_quiet","exit_code":0,"sha":"36651d8d168c1945d2f3ad5f66e7799bf9f5c932"} +{"ts":"2026-09-16T06:30:30Z","kind":"eval","run_id":"repin-20260916T063028Z-36924","eval":"E5","criterion":"AC-5","verifier":"config:executors.test.sdk_pytest_diag_class_body_quiet","exit_code":0,"sha":"36651d8d168c1945d2f3ad5f66e7799bf9f5c932"} +{"ts":"2026-09-16T06:30:30Z","kind":"eval","run_id":"repin-20260916T063028Z-36924","eval":"E6","criterion":"AC-6","verifier":"config:executors.test.sdk_pytest_diag_shared_walker","exit_code":0,"sha":"36651d8d168c1945d2f3ad5f66e7799bf9f5c932"} +{"ts":"2026-09-16T06:30:30Z","kind":"eval","run_id":"repin-20260916T063028Z-36924","eval":"E6b","criterion":"AC-6","verifier":"config:executors.test.sdk_pytest_diag_import_floor","exit_code":0,"sha":"36651d8d168c1945d2f3ad5f66e7799bf9f5c932"} +{"ts":"2026-09-16T06:30:30Z","kind":"eval","run_id":"repin-20260916T063028Z-36924","eval":"E6c","criterion":"AC-6","verifier":"config:executors.script.diag_shared_walker_teeth","exit_code":0,"sha":"36651d8d168c1945d2f3ad5f66e7799bf9f5c932"} +{"ts":"2026-09-16T06:30:30Z","kind":"eval","run_id":"repin-20260916T063028Z-36924","eval":"E18","criterion":"AC-15","verifier":"config:executors.test.sdk_pytest_diag_bare_module","exit_code":0,"sha":"36651d8d168c1945d2f3ad5f66e7799bf9f5c932"} +{"ts":"2026-09-16T06:30:30Z","kind":"eval","run_id":"repin-20260916T063028Z-36924","eval":"E7","criterion":"AC-7","verifier":"config:executors.test.sdk_pytest_diag_syntax_error","exit_code":0,"sha":"36651d8d168c1945d2f3ad5f66e7799bf9f5c932"} +{"ts":"2026-09-16T06:30:30Z","kind":"eval","run_id":"repin-20260916T063028Z-36924","eval":"E8","criterion":"AC-8","verifier":"config:executors.test.sdk_pytest_diag_unreadable","exit_code":0,"sha":"36651d8d168c1945d2f3ad5f66e7799bf9f5c932"} +{"ts":"2026-09-16T06:30:30Z","kind":"eval","run_id":"repin-20260916T063028Z-36924","eval":"E9","criterion":"AC-9","verifier":"config:executors.test.sdk_pytest_diag_deploy_error","exit_code":0,"sha":"36651d8d168c1945d2f3ad5f66e7799bf9f5c932"} +{"ts":"2026-09-16T06:30:30Z","kind":"eval","run_id":"repin-20260916T063028Z-36924","eval":"E10","criterion":"AC-10","verifier":"config:executors.test.sdk_pytest_diag_parse_wording","exit_code":0,"sha":"36651d8d168c1945d2f3ad5f66e7799bf9f5c932"} +{"ts":"2026-09-16T06:30:30Z","kind":"eval","run_id":"repin-20260916T063028Z-36924","eval":"E11","criterion":"AC-11","verifier":"config:executors.test.sdk_pytest_diag_inference_merge","exit_code":0,"sha":"36651d8d168c1945d2f3ad5f66e7799bf9f5c932"} +{"ts":"2026-09-16T06:30:30Z","kind":"eval","run_id":"repin-20260916T063028Z-36924","eval":"E12","criterion":"AC-12","verifier":"config:executors.test.sdk_pytest_diag_inference_dedupe","exit_code":0,"sha":"36651d8d168c1945d2f3ad5f66e7799bf9f5c932"} +{"ts":"2026-09-16T06:30:30Z","kind":"eval","run_id":"repin-20260916T063028Z-36924","eval":"E13","criterion":"AC-13","verifier":"config:executors.script.diag_noise_fixture","exit_code":0,"sha":"36651d8d168c1945d2f3ad5f66e7799bf9f5c932"} +{"ts":"2026-09-16T06:30:30Z","kind":"eval","run_id":"repin-20260916T063028Z-36924","eval":"E13b","criterion":"AC-13","verifier":"config:executors.script.diag_noise_real","exit_code":0,"sha":"36651d8d168c1945d2f3ad5f66e7799bf9f5c932"} +{"ts":"2026-09-16T06:30:30Z","kind":"eval","run_id":"repin-20260916T063028Z-36924","eval":"E14","criterion":"AC-14","verifier":"config:executors.script.diag_blast_radius","exit_code":0,"sha":"36651d8d168c1945d2f3ad5f66e7799bf9f5c932"} +{"ts":"2026-09-16T06:30:30Z","kind":"eval","run_id":"repin-20260916T063028Z-36924","eval":"E15","criterion":"AC-1","verifier":"config:executors.script.diag_scope_gate_teeth","exit_code":0,"sha":"36651d8d168c1945d2f3ad5f66e7799bf9f5c932"} +{"ts":"2026-09-16T06:30:30Z","kind":"eval","run_id":"repin-20260916T063028Z-36924","eval":"E16","criterion":"AC-7","verifier":"config:executors.script.diag_parse_failure_teeth","exit_code":0,"sha":"36651d8d168c1945d2f3ad5f66e7799bf9f5c932"} +{"ts":"2026-09-16T06:30:30Z","kind":"eval","run_id":"repin-20260916T063028Z-36924","eval":"E17","criterion":"AC-12","verifier":"config:executors.script.diag_dedupe_teeth","exit_code":0,"sha":"36651d8d168c1945d2f3ad5f66e7799bf9f5c932"} diff --git a/_acceptance/scan-with-block-imports/evidence-report.md b/_acceptance/scan-with-block-imports/evidence-report.md index dadaad3e..555dc911 100644 --- a/_acceptance/scan-with-block-imports/evidence-report.md +++ b/_acceptance/scan-with-block-imports/evidence-report.md @@ -8,7 +8,7 @@ reason: verified_by: fresh-context verification subagent enforcement_mode: strict bypass_used: false -verified_commit: 96ee9b89c428b5ce0d64c8f49ba29eb7bd65727e +verified_commit: 36651d8d168c1945d2f3ad5f66e7799bf9f5c932 human_signoff: Manh Phan 2026-08-18 --- @@ -285,3 +285,7 @@ máy chung cho cả đợt, 15 ô đo bị chạm, cả 15 chạy lại và exit KHÔNG KẾT LUẬN ĐƯỢC (cửa sổ diff rỗng khi nhánh đứng ngay tại `main`; hoặc ô `ui-check` không chạy được ngoài luồng verify). Dời mốc khi ấy là khai rằng bằng chứng còn đúng trong khi chưa chứng minh được. + +### Re-pin lần 3 — 2026-09-16, do chien dich ghim lai kit 2.14.0 +run_id: repin-20260916T063028Z-36924 +sha: 36651d8d168c1945d2f3ad5f66e7799bf9f5c932 · suites: 9 lệnh exit 0 · evals: 16/16 eval máy đạt kỳ vọng diff --git a/_acceptance/scan-with-block-imports/run-log.jsonl b/_acceptance/scan-with-block-imports/run-log.jsonl index 869b8acd..3a65eda7 100644 --- a/_acceptance/scan-with-block-imports/run-log.jsonl +++ b/_acceptance/scan-with-block-imports/run-log.jsonl @@ -80,3 +80,20 @@ {"ts":"2026-09-05T10:15:00Z","kind":"eval","run_id":"repin-merge-20260905T101500Z","eval":"E14b","criterion":"AC-14","verifier":"config:executors.script.check_overlay_discoverable_real","exit_code":0,"sha":"96ee9b89c428b5ce0d64c8f49ba29eb7bd65727e"} {"ts":"2026-09-05T10:15:00Z","kind":"eval","run_id":"repin-merge-20260905T101500Z","eval":"E14","criterion":"AC-1","verifier":"config:executors.script.check_scope_walker_teeth","exit_code":0,"sha":"96ee9b89c428b5ce0d64c8f49ba29eb7bd65727e"} {"ts":"2026-09-05T10:15:00Z","kind":"eval","run_id":"repin-merge-20260905T101500Z","eval":"E15","criterion":"AC-7","verifier":"config:executors.script.check_reason_teeth","exit_code":0,"sha":"96ee9b89c428b5ce0d64c8f49ba29eb7bd65727e"} +{"ts":"2026-09-16T06:30:30Z","kind":"repin","run_id":"repin-20260916T063028Z-36924","sha":"36651d8d168c1945d2f3ad5f66e7799bf9f5c932","prev_sha":"96ee9b89c428b5ce0d64c8f49ba29eb7bd65727e","suites_exit":[0,0,0,0,0,0,0,0,0],"evals_exit":{"E1":0,"E2":0,"E3":0,"E4":0,"E5":0,"E6":0,"E7":0,"E8":0,"E9":0,"E10":0,"E11":0,"E12":0,"E14b":0,"E13":0,"E14":0,"E15":0}} +{"ts":"2026-09-16T06:30:30Z","kind":"eval","run_id":"repin-20260916T063028Z-36924","eval":"E1","criterion":"AC-1","verifier":"config:executors.test.sdk_pytest_scope_with_deploy","exit_code":0,"sha":"36651d8d168c1945d2f3ad5f66e7799bf9f5c932"} +{"ts":"2026-09-16T06:30:30Z","kind":"eval","run_id":"repin-20260916T063028Z-36924","eval":"E2","criterion":"AC-2","verifier":"config:executors.test.sdk_pytest_scope_with_scan","exit_code":0,"sha":"36651d8d168c1945d2f3ad5f66e7799bf9f5c932"} +{"ts":"2026-09-16T06:30:30Z","kind":"eval","run_id":"repin-20260916T063028Z-36924","eval":"E3","criterion":"AC-3","verifier":"config:executors.test.sdk_pytest_scope_nested","exit_code":0,"sha":"36651d8d168c1945d2f3ad5f66e7799bf9f5c932"} +{"ts":"2026-09-16T06:30:30Z","kind":"eval","run_id":"repin-20260916T063028Z-36924","eval":"E4","criterion":"AC-4","verifier":"config:executors.test.sdk_pytest_scope_function_local","exit_code":0,"sha":"36651d8d168c1945d2f3ad5f66e7799bf9f5c932"} +{"ts":"2026-09-16T06:30:30Z","kind":"eval","run_id":"repin-20260916T063028Z-36924","eval":"E5","criterion":"AC-5","verifier":"config:executors.test.sdk_pytest_scope_import_spellings","exit_code":0,"sha":"36651d8d168c1945d2f3ad5f66e7799bf9f5c932"} +{"ts":"2026-09-16T06:30:30Z","kind":"eval","run_id":"repin-20260916T063028Z-36924","eval":"E6","criterion":"AC-6","verifier":"config:executors.test.sdk_pytest_scope_prior_behaviour","exit_code":0,"sha":"36651d8d168c1945d2f3ad5f66e7799bf9f5c932"} +{"ts":"2026-09-16T06:30:30Z","kind":"eval","run_id":"repin-20260916T063028Z-36924","eval":"E7","criterion":"AC-7","verifier":"config:executors.test.sdk_pytest_reason_not_sdk_model","exit_code":0,"sha":"36651d8d168c1945d2f3ad5f66e7799bf9f5c932"} +{"ts":"2026-09-16T06:30:30Z","kind":"eval","run_id":"repin-20260916T063028Z-36924","eval":"E8","criterion":"AC-8","verifier":"config:executors.test.sdk_pytest_reason_missing_annotation","exit_code":0,"sha":"36651d8d168c1945d2f3ad5f66e7799bf9f5c932"} +{"ts":"2026-09-16T06:30:30Z","kind":"eval","run_id":"repin-20260916T063028Z-36924","eval":"E9","criterion":"AC-9","verifier":"config:executors.test.sdk_pytest_reason_missing_param","exit_code":0,"sha":"36651d8d168c1945d2f3ad5f66e7799bf9f5c932"} +{"ts":"2026-09-16T06:30:30Z","kind":"eval","run_id":"repin-20260916T063028Z-36924","eval":"E10","criterion":"AC-10","verifier":"config:executors.test.sdk_pytest_reason_single_source","exit_code":0,"sha":"36651d8d168c1945d2f3ad5f66e7799bf9f5c932"} +{"ts":"2026-09-16T06:30:30Z","kind":"eval","run_id":"repin-20260916T063028Z-36924","eval":"E11","criterion":"AC-11","verifier":"config:executors.script.check_scan_noise","exit_code":0,"sha":"36651d8d168c1945d2f3ad5f66e7799bf9f5c932"} +{"ts":"2026-09-16T06:30:30Z","kind":"eval","run_id":"repin-20260916T063028Z-36924","eval":"E12","criterion":"AC-12","verifier":"config:executors.script.check_overlay_discoverable_fixture","exit_code":0,"sha":"36651d8d168c1945d2f3ad5f66e7799bf9f5c932"} +{"ts":"2026-09-16T06:30:30Z","kind":"eval","run_id":"repin-20260916T063028Z-36924","eval":"E14b","criterion":"AC-14","verifier":"config:executors.script.check_overlay_discoverable_real","exit_code":0,"sha":"36651d8d168c1945d2f3ad5f66e7799bf9f5c932"} +{"ts":"2026-09-16T06:30:30Z","kind":"eval","run_id":"repin-20260916T063028Z-36924","eval":"E13","criterion":"AC-13","verifier":"config:executors.script.check_scan_blast_radius","exit_code":0,"sha":"36651d8d168c1945d2f3ad5f66e7799bf9f5c932"} +{"ts":"2026-09-16T06:30:30Z","kind":"eval","run_id":"repin-20260916T063028Z-36924","eval":"E14","criterion":"AC-1","verifier":"config:executors.script.check_scope_walker_teeth","exit_code":0,"sha":"36651d8d168c1945d2f3ad5f66e7799bf9f5c932"} +{"ts":"2026-09-16T06:30:30Z","kind":"eval","run_id":"repin-20260916T063028Z-36924","eval":"E15","criterion":"AC-7","verifier":"config:executors.script.check_reason_teeth","exit_code":0,"sha":"36651d8d168c1945d2f3ad5f66e7799bf9f5c932"} diff --git a/_acceptance/sdk-distribution-rename/evidence-report.md b/_acceptance/sdk-distribution-rename/evidence-report.md index ec213bc8..9fbb9594 100644 --- a/_acceptance/sdk-distribution-rename/evidence-report.md +++ b/_acceptance/sdk-distribution-rename/evidence-report.md @@ -7,7 +7,7 @@ reason: verified_by: fresh-context verification subagent enforcement_mode: strict bypass_used: false -verified_commit: 96ee9b89c428b5ce0d64c8f49ba29eb7bd65727e +verified_commit: 36651d8d168c1945d2f3ad5f66e7799bf9f5c932 human_signoff: Manh 2026-08-07 --- @@ -252,3 +252,7 @@ máy chung cho cả đợt, không ô đo nào bị chạm — chỉ dời mốc KHÔNG KẾT LUẬN ĐƯỢC (cửa sổ diff rỗng khi nhánh đứng ngay tại `main`; hoặc ô `ui-check` không chạy được ngoài luồng verify). Dời mốc khi ấy là khai rằng bằng chứng còn đúng trong khi chưa chứng minh được. + +### Re-pin lần 2 — 2026-09-16, do chien dich ghim lai kit 2.14.0 +run_id: repin-20260916T063028Z-36924 +sha: 36651d8d168c1945d2f3ad5f66e7799bf9f5c932 · suites: 9 lệnh exit 0 · evals: 14/14 eval máy đạt kỳ vọng diff --git a/_acceptance/sdk-distribution-rename/run-log.jsonl b/_acceptance/sdk-distribution-rename/run-log.jsonl index 0fd55c05..58c22cc0 100644 --- a/_acceptance/sdk-distribution-rename/run-log.jsonl +++ b/_acceptance/sdk-distribution-rename/run-log.jsonl @@ -13,3 +13,18 @@ {"ts":"2026-08-07T01:34:40Z","round":1,"evalId":"E13","run_id":"sdk-distribution-rename-E13-20260807T013440Z","exit_code":0,"cmd":"pnpm lint:check"} {"ts":"2026-08-07T01:35:11Z","round":1,"evalId":"E12","run_id":"sdk-distribution-rename-E12-20260807T013511Z","exit_code":0,"cmd":"pnpm build && pnpm typecheck"} {"ts":"2026-09-05T10:15:00Z","kind":"repin","run_id":"repin-merge-20260905T101500Z","sha":"96ee9b89c428b5ce0d64c8f49ba29eb7bd65727e","prev_sha":"a788985b3b30c7072dcfd95bc65db1f83b940984","suites_exit":[0,0,0,0,0,0,0,0]} +{"ts":"2026-09-16T06:30:30Z","kind":"repin","run_id":"repin-20260916T063028Z-36924","sha":"36651d8d168c1945d2f3ad5f66e7799bf9f5c932","prev_sha":"96ee9b89c428b5ce0d64c8f49ba29eb7bd65727e","suites_exit":[0,0,0,0,0,0,0,0,0],"evals_exit":{"E1":0,"E2":0,"E3":0,"E4":0,"E5":0,"E6":0,"E7":0,"E8":0,"E9":0,"E10":0,"E14":0,"E11":0,"E12":0,"E13":0}} +{"ts":"2026-09-16T06:30:30Z","kind":"eval","run_id":"repin-20260916T063028Z-36924","eval":"E1","criterion":"AC-1","verifier":"config:executors.test.sdk_pytest_packaging","exit_code":0,"sha":"36651d8d168c1945d2f3ad5f66e7799bf9f5c932"} +{"ts":"2026-09-16T06:30:30Z","kind":"eval","run_id":"repin-20260916T063028Z-36924","eval":"E2","criterion":"AC-2","verifier":"config:executors.test.sdk_pytest_packaging","exit_code":0,"sha":"36651d8d168c1945d2f3ad5f66e7799bf9f5c932"} +{"ts":"2026-09-16T06:30:30Z","kind":"eval","run_id":"repin-20260916T063028Z-36924","eval":"E3","criterion":"AC-3","verifier":"config:executors.test.sdk_pytest_packaging","exit_code":0,"sha":"36651d8d168c1945d2f3ad5f66e7799bf9f5c932"} +{"ts":"2026-09-16T06:30:30Z","kind":"eval","run_id":"repin-20260916T063028Z-36924","eval":"E4","criterion":"AC-4","verifier":"config:executors.test.sdk_pytest_packaging","exit_code":0,"sha":"36651d8d168c1945d2f3ad5f66e7799bf9f5c932"} +{"ts":"2026-09-16T06:30:30Z","kind":"eval","run_id":"repin-20260916T063028Z-36924","eval":"E5","criterion":"AC-5","verifier":"config:executors.test.sdk_pytest_packaging","exit_code":0,"sha":"36651d8d168c1945d2f3ad5f66e7799bf9f5c932"} +{"ts":"2026-09-16T06:30:30Z","kind":"eval","run_id":"repin-20260916T063028Z-36924","eval":"E6","criterion":"AC-6","verifier":"config:executors.test.sdk_pytest_packaging","exit_code":0,"sha":"36651d8d168c1945d2f3ad5f66e7799bf9f5c932"} +{"ts":"2026-09-16T06:30:30Z","kind":"eval","run_id":"repin-20260916T063028Z-36924","eval":"E7","criterion":"AC-7","verifier":"config:executors.test.sdk_pytest_packaging","exit_code":0,"sha":"36651d8d168c1945d2f3ad5f66e7799bf9f5c932"} +{"ts":"2026-09-16T06:30:30Z","kind":"eval","run_id":"repin-20260916T063028Z-36924","eval":"E8","criterion":"AC-8","verifier":"config:executors.test.sdk_pytest_packaging","exit_code":0,"sha":"36651d8d168c1945d2f3ad5f66e7799bf9f5c932"} +{"ts":"2026-09-16T06:30:30Z","kind":"eval","run_id":"repin-20260916T063028Z-36924","eval":"E9","criterion":"AC-9","verifier":"config:executors.test.sdk_pytest_packaging","exit_code":0,"sha":"36651d8d168c1945d2f3ad5f66e7799bf9f5c932"} +{"ts":"2026-09-16T06:30:30Z","kind":"eval","run_id":"repin-20260916T063028Z-36924","eval":"E10","criterion":"AC-10","verifier":"config:executors.test.sdk_pytest_packaging","exit_code":0,"sha":"36651d8d168c1945d2f3ad5f66e7799bf9f5c932"} +{"ts":"2026-09-16T06:30:30Z","kind":"eval","run_id":"repin-20260916T063028Z-36924","eval":"E14","criterion":"AC-13","verifier":"config:executors.test.sdk_pytest_packaging","exit_code":0,"sha":"36651d8d168c1945d2f3ad5f66e7799bf9f5c932"} +{"ts":"2026-09-16T06:30:30Z","kind":"eval","run_id":"repin-20260916T063028Z-36924","eval":"E11","criterion":"AC-11","verifier":"config:executors.test.sdk_pytest","exit_code":0,"sha":"36651d8d168c1945d2f3ad5f66e7799bf9f5c932"} +{"ts":"2026-09-16T06:30:30Z","kind":"eval","run_id":"repin-20260916T063028Z-36924","eval":"E12","criterion":"AC-12","verifier":"config:executors.test.build_typecheck","exit_code":0,"sha":"36651d8d168c1945d2f3ad5f66e7799bf9f5c932"} +{"ts":"2026-09-16T06:30:30Z","kind":"eval","run_id":"repin-20260916T063028Z-36924","eval":"E13","criterion":"AC-12","verifier":"config:executors.test.lint","exit_code":0,"sha":"36651d8d168c1945d2f3ad5f66e7799bf9f5c932"} diff --git a/_acceptance/task-metering/evidence-report.md b/_acceptance/task-metering/evidence-report.md index 9a1ff90b..aa0c9ca1 100644 --- a/_acceptance/task-metering/evidence-report.md +++ b/_acceptance/task-metering/evidence-report.md @@ -7,7 +7,7 @@ reason: verified_by: fresh-context verification subagent enforcement_mode: strict bypass_used: false -verified_commit: 96ee9b89c428b5ce0d64c8f49ba29eb7bd65727e +verified_commit: 36651d8d168c1945d2f3ad5f66e7799bf9f5c932 human_signoff: Manh 2026-08-07 --- @@ -234,3 +234,7 @@ máy chung cho cả đợt, không ô đo nào bị chạm — chỉ dời mốc KHÔNG KẾT LUẬN ĐƯỢC (cửa sổ diff rỗng khi nhánh đứng ngay tại `main`; hoặc ô `ui-check` không chạy được ngoài luồng verify). Dời mốc khi ấy là khai rằng bằng chứng còn đúng trong khi chưa chứng minh được. + +### Re-pin lần 4 — 2026-09-16, do chien dich ghim lai kit 2.14.0 +run_id: repin-20260916T063028Z-36924 +sha: 36651d8d168c1945d2f3ad5f66e7799bf9f5c932 · suites: 9 lệnh exit 0 · evals: 12/12 eval máy đạt kỳ vọng diff --git a/_acceptance/task-metering/run-log.jsonl b/_acceptance/task-metering/run-log.jsonl index bc347c89..ab886bb5 100644 --- a/_acceptance/task-metering/run-log.jsonl +++ b/_acceptance/task-metering/run-log.jsonl @@ -13,3 +13,16 @@ {"ts":"2026-08-28T04:30:00Z","kind":"repin","run_id":"repin-task-metering-20260828T043000Z","sha":"bee578e120584402211a6c38577f324c040e995b","suites_exit":[0,0,0,0,0]} {"ts":"2026-08-28T05:30:00Z","kind":"repin","run_id":"repin-task-metering-20260828T053000Z","sha":"8512c6e98c48ab3f4cab75dafa9493a0b1e36868","suites_exit":[0,0,0,0,0]} {"ts":"2026-09-05T10:15:00Z","kind":"repin","run_id":"repin-merge-20260905T101500Z","sha":"96ee9b89c428b5ce0d64c8f49ba29eb7bd65727e","prev_sha":"8512c6e98c48ab3f4cab75dafa9493a0b1e36868","suites_exit":[0,0,0,0,0,0,0,0]} +{"ts":"2026-09-16T06:30:30Z","kind":"repin","run_id":"repin-20260916T063028Z-36924","sha":"36651d8d168c1945d2f3ad5f66e7799bf9f5c932","prev_sha":"96ee9b89c428b5ce0d64c8f49ba29eb7bd65727e","suites_exit":[0,0,0,0,0,0,0,0,0],"evals_exit":{"E1":0,"E2":0,"E3":0,"E4":0,"E5":0,"E6":0,"E7":0,"E8":0,"E9":0,"E10":0,"E11":0,"E12":0}} +{"ts":"2026-09-16T06:30:30Z","kind":"eval","run_id":"repin-20260916T063028Z-36924","eval":"E1","criterion":"AC-1","verifier":"config:executors.test.unit_metering_schema","exit_code":0,"sha":"36651d8d168c1945d2f3ad5f66e7799bf9f5c932"} +{"ts":"2026-09-16T06:30:30Z","kind":"eval","run_id":"repin-20260916T063028Z-36924","eval":"E2","criterion":"AC-2","verifier":"config:executors.test.unit_metering_schema","exit_code":0,"sha":"36651d8d168c1945d2f3ad5f66e7799bf9f5c932"} +{"ts":"2026-09-16T06:30:30Z","kind":"eval","run_id":"repin-20260916T063028Z-36924","eval":"E3","criterion":"AC-3","verifier":"config:executors.test.unit_metering_schema","exit_code":0,"sha":"36651d8d168c1945d2f3ad5f66e7799bf9f5c932"} +{"ts":"2026-09-16T06:30:30Z","kind":"eval","run_id":"repin-20260916T063028Z-36924","eval":"E4","criterion":"AC-4","verifier":"config:executors.test.unit_metering_runner","exit_code":0,"sha":"36651d8d168c1945d2f3ad5f66e7799bf9f5c932"} +{"ts":"2026-09-16T06:30:30Z","kind":"eval","run_id":"repin-20260916T063028Z-36924","eval":"E5","criterion":"AC-5","verifier":"config:executors.test.unit_metering_runner","exit_code":0,"sha":"36651d8d168c1945d2f3ad5f66e7799bf9f5c932"} +{"ts":"2026-09-16T06:30:30Z","kind":"eval","run_id":"repin-20260916T063028Z-36924","eval":"E6","criterion":"AC-6","verifier":"config:executors.test.unit_metering_runner","exit_code":0,"sha":"36651d8d168c1945d2f3ad5f66e7799bf9f5c932"} +{"ts":"2026-09-16T06:30:30Z","kind":"eval","run_id":"repin-20260916T063028Z-36924","eval":"E7","criterion":"AC-7","verifier":"config:executors.test.unit_metering_runner","exit_code":0,"sha":"36651d8d168c1945d2f3ad5f66e7799bf9f5c932"} +{"ts":"2026-09-16T06:30:30Z","kind":"eval","run_id":"repin-20260916T063028Z-36924","eval":"E8","criterion":"AC-8","verifier":"config:executors.test.unit_metering_runner","exit_code":0,"sha":"36651d8d168c1945d2f3ad5f66e7799bf9f5c932"} +{"ts":"2026-09-16T06:30:30Z","kind":"eval","run_id":"repin-20260916T063028Z-36924","eval":"E9","criterion":"AC-9","verifier":"config:executors.test.unit_metering_runner","exit_code":0,"sha":"36651d8d168c1945d2f3ad5f66e7799bf9f5c932"} +{"ts":"2026-09-16T06:30:30Z","kind":"eval","run_id":"repin-20260916T063028Z-36924","eval":"E10","criterion":"AC-10","verifier":"config:executors.test.unit","exit_code":0,"sha":"36651d8d168c1945d2f3ad5f66e7799bf9f5c932"} +{"ts":"2026-09-16T06:30:30Z","kind":"eval","run_id":"repin-20260916T063028Z-36924","eval":"E11","criterion":"AC-11","verifier":"config:executors.test.build_typecheck","exit_code":0,"sha":"36651d8d168c1945d2f3ad5f66e7799bf9f5c932"} +{"ts":"2026-09-16T06:30:30Z","kind":"eval","run_id":"repin-20260916T063028Z-36924","eval":"E12","criterion":"AC-11","verifier":"config:executors.test.lint","exit_code":0,"sha":"36651d8d168c1945d2f3ad5f66e7799bf9f5c932"} From dcfe1ffaecd0d2d374f38d42d0a22c587f42ebb2 Mon Sep 17 00:00:00 2001 From: Phan Le Manh Date: Wed, 16 Sep 2026 13:32:42 +0700 Subject: [PATCH 13/13] =?UTF-8?q?repin:=20R=C3=9AT=20chong-doc-sai-em-ru?= =?UTF-8?q?=20kh=E1=BB=8Fi=20=C4=91=E1=BB=A3t=20C=20=E2=80=94=20E12=20l?= =?UTF-8?q?=C3=A0=20ui-check,=20l=C3=A0n=20m=C3=A1y=20kh=C3=B4ng=20ch?= =?UTF-8?q?=E1=BA=A1y=20=C4=91=C6=B0=E1=BB=A3c?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Guard `check` bắt sau khi ghi: re-pin nuốt E12 — eval `ui-check` có `paths: src/components/workspace/nodes/**` bị chạm giữa hai mốc. Làn kit chỉ chạy eval `test`/`script`, nên không lượt máy nào chứng được E12. Đây đúng tiền lệ của kho: đợt ghim lại 05/09 loại SÁU hồ sơ, trong đó có chong-doc-sai-em-ru, với nguyên văn lý do «ô `ui-check` không chạy được ngoài luồng verify». Tôi đã ghim nó mà không đọc tiền lệ đó trước. Vì sao làn vẫn xanh: làn chạy `check` TRƯỚC khi ghi 22 dòng, nên lúc đo chưa có dòng nào để nuốt. Vòng tự quy chiếu này là thật và chưa có răng — ghi vào sổ. 21 hồ sơ còn lại của đợt C giữ nguyên. Co-Authored-By: Claude Opus 5 --- _acceptance/chong-doc-sai-em-ru/evidence-report.md | 6 +----- _acceptance/chong-doc-sai-em-ru/run-log.jsonl | 13 ------------- 2 files changed, 1 insertion(+), 18 deletions(-) diff --git a/_acceptance/chong-doc-sai-em-ru/evidence-report.md b/_acceptance/chong-doc-sai-em-ru/evidence-report.md index 24f0ead9..33f4000b 100644 --- a/_acceptance/chong-doc-sai-em-ru/evidence-report.md +++ b/_acceptance/chong-doc-sai-em-ru/evidence-report.md @@ -7,7 +7,7 @@ reason: verified_by: fresh-context machine lane (không hội đồng — xem §Vì sao LANE thay cho VÒNG) enforcement_mode: strict bypass_used: false -verified_commit: 36651d8d168c1945d2f3ad5f66e7799bf9f5c932 +verified_commit: df22a16b63139b3d34ab753a1ebefa76615e6cb7 human_signoff: Phan Le Manh 2026-08-29 --- @@ -275,7 +275,3 @@ sha: 665ff72bf34a07fc6156be70360d7dcf5dfc0592 · suites: 7 lệnh exit 0 ### Re-pin lần 1 — 2026-08-29, KHÔNG CẦN THIẾT; giữ lại vì phép đo là thật, nhưng lý do ban đầu thì sai. Nó được lấy vì `pre-merge-check.sh` báo hồ sơ này đã cũ — nhưng lượt chạy đó **thiếu `--base`**, chế độ mà chính công cụ in ra `rules ran=2 declared-off=2 expected=4` và `NOTE: T1-escape backstop skipped — no PR base given`. Chạy đúng cách CI gọi (`bash scripts/pre-merge-check.sh . --base origin/main`) thì tại `df22a16` — mốc **trước** lần re-pin này — cổng đã **sạch**. Đo lại từng mốc sau khi phát hiện: `129928a` 2 vi phạm (verdict PENDING-JUDGMENT + `conformance-l0` cũ), `3196853` 1 vi phạm (`conformance-l0` cũ), `df22a16` sạch. Tức chỉ lần re-pin `conformance-l0` là bắt buộc. Bài học ghi ở đây thay vì xoá dấu vết: **đọc số vi phạm từ một lượt chạy nửa số luật là đọc một phép đo khác với phép đo mình tưởng** — và công cụ đã nói thẳng điều đó ở dòng NOTE ngay trên con số. Bản thân số đo dưới đây vẫn đúng và vẫn dùng được: bộ đọc không đổi một byte, một phiên tươi chạy lại cả 12 suite máy trong worktree của nhánh, preflight GREEN, mọi lệnh exit 0 run_id: repin-chong-doc-sai-em-ru-20260829T134935Z sha: df22a16b63139b3d34ab753a1ebefa76615e6cb7 · suites: 12 lệnh exit 0 - -### Re-pin lần 2 — 2026-09-16, do chien dich ghim lai kit 2.14.0 -run_id: repin-20260916T063028Z-36924 -sha: 36651d8d168c1945d2f3ad5f66e7799bf9f5c932 · suites: 9 lệnh exit 0 · evals: 12/12 eval máy đạt kỳ vọng diff --git a/_acceptance/chong-doc-sai-em-ru/run-log.jsonl b/_acceptance/chong-doc-sai-em-ru/run-log.jsonl index b19d3637..d748e0ba 100644 --- a/_acceptance/chong-doc-sai-em-ru/run-log.jsonl +++ b/_acceptance/chong-doc-sai-em-ru/run-log.jsonl @@ -94,16 +94,3 @@ {"ts":"2026-08-28T23:47:56Z","sha":"665ff72bf34a07fc6156be70360d7dcf5dfc0592","round":7,"evalId":"E16","run_id":"minted-chong-doc-sai-em-ru-E16-r7","exit_code":0,"criterion":"AC-12"} {"ts":"2026-08-28T23:54:24Z","kind":"repin","run_id":"lane-chong-doc-sai-em-ru-20260828T133500Z","sha":"665ff72bf34a07fc6156be70360d7dcf5dfc0592","suites_exit":[0,0,0,0,0,0,0]} {"ts":"2026-08-29T13:49:35Z","kind":"repin","run_id":"repin-chong-doc-sai-em-ru-20260829T134935Z","sha":"df22a16b63139b3d34ab753a1ebefa76615e6cb7","suites_exit":[0,0,0,0,0,0,0,0,0,0,0,0]} -{"ts":"2026-09-16T06:30:29Z","kind":"repin","run_id":"repin-20260916T063028Z-36924","sha":"36651d8d168c1945d2f3ad5f66e7799bf9f5c932","prev_sha":"df22a16b63139b3d34ab753a1ebefa76615e6cb7","suites_exit":[0,0,0,0,0,0,0,0,0],"evals_exit":{"E1":0,"E2":0,"E3":0,"E4":0,"E5":0,"E6":0,"E7":0,"E8":0,"E9":0,"E10":0,"E14":0,"E16":0}} -{"ts":"2026-09-16T06:30:29Z","kind":"eval","run_id":"repin-20260916T063028Z-36924","eval":"E1","criterion":"AC-8","verifier":"config:executors.script.measuring_instruments_refuse","exit_code":0,"sha":"36651d8d168c1945d2f3ad5f66e7799bf9f5c932"} -{"ts":"2026-09-16T06:30:29Z","kind":"eval","run_id":"repin-20260916T063028Z-36924","eval":"E2","criterion":"AC-11","verifier":"config:executors.test.sdk_pytest_normalize_ambiguous","exit_code":0,"sha":"36651d8d168c1945d2f3ad5f66e7799bf9f5c932"} -{"ts":"2026-09-16T06:30:29Z","kind":"eval","run_id":"repin-20260916T063028Z-36924","eval":"E3","criterion":"AC-5","verifier":"config:executors.test.sdk_pytest_normalize_dictionary_matrix","exit_code":0,"sha":"36651d8d168c1945d2f3ad5f66e7799bf9f5c932"} -{"ts":"2026-09-16T06:30:29Z","kind":"eval","run_id":"repin-20260916T063028Z-36924","eval":"E4","criterion":"AC-1","verifier":"config:executors.test.sdk_pytest_normalize_typographic_dash","exit_code":0,"sha":"36651d8d168c1945d2f3ad5f66e7799bf9f5c932"} -{"ts":"2026-09-16T06:30:29Z","kind":"eval","run_id":"repin-20260916T063028Z-36924","eval":"E5","criterion":"AC-3","verifier":"config:executors.test.sdk_pytest_normalize_range_shapes","exit_code":0,"sha":"36651d8d168c1945d2f3ad5f66e7799bf9f5c932"} -{"ts":"2026-09-16T06:30:29Z","kind":"eval","run_id":"repin-20260916T063028Z-36924","eval":"E6","criterion":"AC-9","verifier":"config:executors.test.sdk_pytest_normalize_day_word","exit_code":0,"sha":"36651d8d168c1945d2f3ad5f66e7799bf9f5c932"} -{"ts":"2026-09-16T06:30:29Z","kind":"eval","run_id":"repin-20260916T063028Z-36924","eval":"E7","criterion":"AC-10","verifier":"config:executors.test.sdk_pytest_normalize_slash","exit_code":0,"sha":"36651d8d168c1945d2f3ad5f66e7799bf9f5c932"} -{"ts":"2026-09-16T06:30:29Z","kind":"eval","run_id":"repin-20260916T063028Z-36924","eval":"E8","criterion":"AC-4","verifier":"config:executors.test.sdk_pytest_normalize_brand","exit_code":0,"sha":"36651d8d168c1945d2f3ad5f66e7799bf9f5c932"} -{"ts":"2026-09-16T06:30:29Z","kind":"eval","run_id":"repin-20260916T063028Z-36924","eval":"E9","criterion":"AC-2","verifier":"config:executors.test.sdk_pytest_normalize_url","exit_code":0,"sha":"36651d8d168c1945d2f3ad5f66e7799bf9f5c932"} -{"ts":"2026-09-16T06:30:29Z","kind":"eval","run_id":"repin-20260916T063028Z-36924","eval":"E10","criterion":"AC-6","verifier":"config:executors.test.sdk_pytest_normalize_error_codes","exit_code":0,"sha":"36651d8d168c1945d2f3ad5f66e7799bf9f5c932"} -{"ts":"2026-09-16T06:30:29Z","kind":"eval","run_id":"repin-20260916T063028Z-36924","eval":"E14","criterion":"AC-12","verifier":"config:executors.test.unit_tts_order_violation","exit_code":0,"sha":"36651d8d168c1945d2f3ad5f66e7799bf9f5c932"} -{"ts":"2026-09-16T06:30:29Z","kind":"eval","run_id":"repin-20260916T063028Z-36924","eval":"E16","criterion":"AC-12","verifier":"config:executors.test.unit_tts_warning_call_site","exit_code":0,"sha":"36651d8d168c1945d2f3ad5f66e7799bf9f5c932"}