Promote Checker v0.1 — Spec ngắn (No checker, no lane)
Promote Checker v0.1 — Spec ngắn
Trạng thái: DRAFT — KHÔNG PHẢI BAN HÀNH. Spec tối thiểu, không tự ủy quyền thay đổi production / DB /
knowledge/dev/laws/. Ngày: 2026-06-14 · Vị trí:knowledge/dev/laws-new/promote-checker-v0.1-spec.mdĐọc kèm:de-bai-cai-tien.md(§13) ·required-stamps.v0.1.json·matrix-stamp-governance-addendum.md(§7) ·matrix-refactor-implementation-plan.md(§10 Mức 2)
1. Mục đích
Thực thi quy tắc cứng "No checker, no lane. A paper lane is no lane." Chưa có checker này chạy thật (fail-closed, pass selftest) thì không được tuyên bố có promote lane.
Checker là cổng duy nhất đưa object từ kho tạm → kho chính. Nó chỉ kiểm cục bộ (Mức 2), không quét toàn hệ, không thay scanner.
2. Đầu vào — MỘT candidate packet duy nhất
Checker đọc đúng một matrix_candidate_packet có binding rõ — KHÔNG đọc rời rạc nhiều nơi rồi tự đoán. Ngoài packet, checker đọc required-stamps.v0.1.json → promote_preconditions (từ metadata, không hardcode); checker không yêu cầu promote_outputs (BIRTH_STAMP/PROMOTE_STAMP) trước khi chạy.
2.1 Candidate packet tối thiểu (matrix_candidate_packet.v0.1)
matrix_candidate_packet.v0.1:
candidate_id: string
workspace_id: string | null
cell_id:
layer: string
species: string
collection: string # = Kho (store)
domain: string
stamps:
TEMP_ID_STAMP: pass|missing|fail
CELL_STAMP: pass|missing|fail
IO_STAMP: pass|missing|fail
VALIDATION_STAMP: pass|missing|fail
ROLLBACK_STAMP: pass|missing|fail
io_contract_ref: string
validator_result_ref: string
rollback_proof_ref: string
created_at: timestamp
expires_at: timestamp
status: draft|ready_for_check|promote_blocked|promote_ok|consumed|expired|quarantined
packet_hash: sha256
Packet sống ở pre-promote stamp store (candidate/workspace staging metadata; đề xuất tận dụng iu_core.iu_staging_record/iu_staging_payload — HOLD FOR SYSTEM CHECK, xem addendum §2b). KHÔNG ghi birth_registry canonical ở bước này.
2.2 Fail-closed binding rule
Checker fail-closed (→ PROMOTE_BLOCKED, hoặc quarantined nếu tamper) nếu bất kỳ:
candidate_id thiếu
candidate_id KHÔNG khớp giữa packet / IO Contract / validator result / rollback proof
packet_hash sai
packet stale / expired (quá expires_at)
packet status không hợp lệ
artifact thiếu (io_contract_ref / validator_result_ref / rollback_proof_ref)
artifact KHÔNG cùng candidate_id
artifact bị tamper
cell_id còn UNKNOWN/PENDING
rollback_proof thiếu
Mọi artifact phải bind theo candidate_id và khớp packet_hash; checker không tự ráp artifact từ candidate khác.
3. Kiểm tra tối thiểu
| # | Kiểm | Thiếu → |
|---|---|---|
| 0 | candidate packet hợp lệ (binding theo candidate_id, packet_hash đúng, chưa expired/consumed, status hợp lệ, artifact cùng candidate) — xem §2.2 |
PROMOTE_BLOCKED / quarantined |
| 1 | candidate/workspace có ID tạm | PROMOTE_BLOCKED |
| 2 | cell_id hợp lệ (tầng × loài × kho × miền; không UNKNOWN/PENDING) |
PROMOTE_BLOCKED |
| 3 | IO Contract tồn tại | PROMOTE_BLOCKED |
| 4 | đủ dấu promote_preconditions (TEMP_ID + CELL + IO + VALIDATION + ROLLBACK) theo required-stamps.v0.1.json |
PROMOTE_BLOCKED |
| 5 | validator pass (bad-input ≥ 8 lớp, any_fail_open=false) |
PROMOTE_BLOCKED |
| 6 | rollback tồn tại (cách xóa/rollback rõ) | PROMOTE_BLOCKED |
| 7 | không đụng kernel/canonical rule ngoài scope | đẩy lên Mức 3 |
| 8 | owner/scope rõ (nếu vùng cần governance) | PROMOTE_BLOCKED |
4. Đầu ra
PROMOTE_OK → verdict: packet đủ preconditions + binding hợp lệ, đủ điều kiện cho atomic promote (KHÔNG tự mutate)
PROMOTE_BLOCKED → kèm danh sách precondition/dấu/binding còn thiếu hoặc sai
ESCALATE_L3 → việc nguy hiểm (kernel/canonical/production) → lane Canonical/Đ32
Checker là verdict-only:
- Checker chỉ kiểm một candidate packet — KHÔNG scan toàn hệ.
- Checker KHÔNG tự sinh birth.
- Checker KHÔNG tự ghi canonical.
- Checker KHÔNG tự đóng
BIRTH_STAMP/PROMOTE_STAMP. PROMOTE_OKchỉ là verdict. Việc tạo canonical birth + đóngBIRTH_STAMP/PROMOTE_STAMP+ consume staging record thuộc Atomic Promote Contract v0.1 (addendum §7b), chạy SAU checker.
5. Nguyên tắc fail-closed
- Thiếu một điều kiện/dấu bắt buộc →
PROMOTE_BLOCKED, không ghi kho chính. - Nghi ngờ → đẩy lên Mức 3 (probation), không tự hạ chuẩn.
- Blast-radius class được TÍNH, không tự khai; khai sai = incident + nâng lane.
BIRTH_STAMP+PROMOTE_STAMPlà output (promote_outputs), chỉ đóng sau khi checkerPROMOTE_OKvà do Atomic Promote Contract (addendum §7b) thực hiện trong cùng transaction — KHÔNG phải điều kiện đầu vào của checker (tránh circular); checker không tự đóng. Kho tạm dùngTEMP_ID_STAMP, không ghibirth_registrycanonical.
6. Selftest (bắt buộc trước khi mở lane)
- Object đủ dấu →
PROMOTE_OK. - Bỏ từng dấu bắt buộc → phải ra
PROMOTE_BLOCKEDđúng dấu thiếu (không fail-open). - Object còn UNKNOWN/PENDING ở
cell_id→PROMOTE_BLOCKED. - Tamper/empty input → fail-closed, không rò token
PROMOTE_OK. - Checker chạy được khi object CHƯA có
BIRTH_STAMP/PROMOTE_STAMP(output stamp KHÔNG phải precondition).
7. Ràng buộc
- Không mutate production / DB thật / CI / secrets.
- Rehearsal promote chỉ trong staging/dry-run với rollback-proof (kiểu FIX7).
- Tập dấu bắt buộc đọc từ metadata; thêm dấu bắt buộc = thay đổi Mức 3.
- Checker này không sửa toàn hệ và không thay thế scanner (scanner chỉ liệt kê).
- Atomic promote (tạo birth + đóng output stamp + consume staging) = Atomic Promote Contract v0.1 (addendum §7b), chạy SAU checker trong một transaction all-or-nothing; chưa có transaction thật + rehearsal proof thì chưa mở pilot promote thật.
Promote Checker v0.1 spec | 2026-06-14 | DRAFT not-enacted | "No checker, no lane. Thiếu dấu thì chặn, không vỡ hệ."