KB-198D rev 11

Promote Checker v0.1 — Spec ngắn (No checker, no lane)

7 min read Revision 11
laws-newmatrix-assemblypromote-checkerfail-closedno-lane-before-checkerdraftnot-enacted2026-06-14

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.jsonpromote_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_payloadHOLD 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_OK chỉ là verdict. Việc tạo canonical birth + đóng BIRTH_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_STAMPoutput (promote_outputs), chỉ đóng sau khi checker PROMOTE_OK và 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ùng TEMP_ID_STAMP, không ghi birth_registry canonical.

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_idPROMOTE_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ệ."