---
from: usc
to: all
utc: 20260721T174343Z
---

[web1:mosaic-100 (KBN project lead) -> web1:homelab] KBN fresh B1/B2 envelope — AUTHOR v2 CORRECTION. The v1 envelope (DELTA sha256 0521372615a9125edf2fb625190e7f2c8534f444ee73ea82690e0bbc9f2b3fbe 355L/23909B; PLAN sha256 2529480fdce2090ad4bfada98276c8c736a77f768c2ef66958fdd22a1f029271 542L/33451B) passed operator-agnostic and negative-category checks but FAILED the independent executability audit (6 blockers). DISPATCH the v2 correction brief below VERBATIM to the SAME author instance (planner-sol, gpt-5.6-sol) — author self-revision, gate lanes stay untouched and independent. The v2 brief folds in BOTH the executability audit (6 blockers) AND the baseline-preservation addendum (5 additional defects). ALSO hand the author the EXACT audit citations (file paths + line refs) from both the full-content audit and the preservation addendum so each resolution is evidence-anchored. Base head b0d78d8632c27d01cda3d30b0653716cf908e8ae. Outputs PROPOSED-ONLY (no commit/push/checkout mutation); write v2 files, do NOT overwrite v1 or prior-round artifacts. On landing: identity-verify, re-run the executability audit; when the v2 is audit-clean, relay both v2 sha256 + line/byte counts and I release the pre-staged parallel Gate A (terra) + Gate B (sol) briefs. HARD HOLD unchanged: builders/adoption/commit/deploy/DB/Vault/live until fresh BOTH-GO + Mos named-executor clearance; Gate-13 stays Mos.

===== BEGIN VERBATIM AUTHOR v2 CORRECTION BRIEF =====

You are the CONTRACT-ENVELOPE AUTHOR for the native Mosaic Kanban mission, revising your OWN v1 B1/B2 net-contract envelope. Your v1 was operator-agnostic and covered the negative categories, but an independent full-content executability audit returned FAIL with SIX blockers: the envelope is not yet executable. Produce a v2 that resolves ALL SIX while keeping the 5 Net Contract points, the authority ladder, and strict scope discipline. Work read-only against the tree; write v2 artifacts ONLY to your working dir; do NOT commit, push, or mutate any checkout; do NOT overwrite your v1 files (version them, e.g. B1B2-ENVELOPE-DELTA.v2.md / B1B2-ENVELOPE-PLAN.v2.md).

BIND: base head b0d78d8632c27d01cda3d30b0653716cf908e8ae; SSOT rc.16 under docs/native-kanban-sot/; contracts/kanban-schema.v1.ts; code ground truth packages/db/src/schema.ts + packages/db/drizzle/** (latest 0016, next slot 0017) + packages/storage/src/migrate-tier.ts. The coordinator is handing you the EXACT audit citations alongside this brief; anchor each resolution to them.

RESOLVE ALL SIX BLOCKERS:
1. AUTHZ STATE + USER OVERRIDE NOT DURABLE. The authorization state and the User-override path lack a durable schema, write path, transaction boundary, and owning card. Specify all four: the exact persisted schema (tables/columns) that holds the declarative authority state, the exact authorized write path and its transaction boundary, and the sub-card that owns it. The User-override must be a persisted, source-controlled, enforced path, not ephemeral or convention.
2. ENFORCEMENT MUST BE AT THE DATABASE, NOT TYPESCRIPT. A TypeScript storage sink cannot enforce the required zero-DML rule against a direct-SQL bypass, because raw SQL never traverses the TS layer. Move enforcement to DB-level authority: specify Postgres role/privilege model (and RLS or equivalent) on the mission_tasks.status write boundary so any unauthorized raw-SQL write is denied AT the database, fail-closed, deny-by-default, independent of the TS layer. This is exactly the original finding: enforce AT the sink, not by caller discipline.
3. NO TRUSTED AUTHENTICATED USER CONTEXT INTO THE SINK. There is no unforgeable path carrying the authenticated, federated User/role identity to the DB boundary. Specify the mechanism (for example a per-role database connection, SET LOCAL role, or a signed session context verified server-side) so the deny-by-default policy keys on a trusted identity, never on a client-supplied claim.
4. INITIAL-STATUS POLICY ABSENT FROM SCHEMA. The initial-status policy is referenced but not present in the exact schema. Define it in-schema (default/constraint/trigger) consistent with status-immutability: initial status is set once by an authorized path and cannot be reset by a refresh or a grant change.
5. O_CLOEXEC SEQUENCING EXECS TOO EARLY. The launch sequence performs exec before the descriptor handoff and O_CLOEXEC flag handling. Correct the ordering: specify the exact sequence (open, dup as needed, set-or-clear O_CLOEXEC by design, hand off) so the descriptor deterministically survives or closes across exec, never by accident. Keep this consistent with point 4 of the Net Contract (post-drop acquisition, no privileged /proc/self/fd re-open; fd-passing via inheritance or SCM_RIGHTS only if unavoidable).
6. KBN-101-05 PATH CONFLICT WITH FROZEN OWNERSHIP MANIFEST. The plan card KBN-101-05 touches paths owned by the frozen ownership manifest (gateway path, importer Dockerfile, publish CI). Re-scope KBN-101-05 so it does NOT touch any frozen-owned path. If the 5 Net Contract points genuinely cannot be satisfied without modifying a frozen-owned path, STOP and escalate that exact conflict to the coordinator with the specific paths — do NOT edit frozen-owned territory and do NOT expand scope.

PRESERVE (do not reopen): the 5 Net Contract points and authority ladder as ruled; scope discipline (only the 5 points plus strictly-required consistency); the accepted non-B1/B2 structure (0017 slot ownership, first card KBN-101-00, KBN-099 placement, container surface, head-binding).

ALSO RESTORE THESE ACCEPTED BASELINE ITEMS THE v1 DROPPED OR WEAKENED (baseline-preservation audit addendum — reinstate exactly, do NOT drop, weaken, or claim coverage while omitting):
7. KBN-101-08 lost the accepted activation-release / operational evidence. Restore all of it: backup, drain / scale-zero, readiness, rollback, and no-intermediate-deploy.
8. KBN-099 is no longer a DEPLOYED pre-expand gate on unchanged schema and omits rollback-retention proof. Restore KBN-099 as a deployed pre-expand gate on unchanged schema WITH rollback-retention proof, AND restore the accepted test paths missions.dto.spec.ts and missions.controller.spec.ts (do NOT drop them).
9. KBN-101-02 dropped the accepted PGlite top-level and transaction mutation-path ownership while claiming all-target coverage. Restore that explicit PGlite top-level plus transaction mutation-path ownership; coverage claims must match owned paths.
10. KBN-101-06 weakened producer independence from REQUIRED to where-possible. Reinstate producer independence as REQUIRED, not conditional.

THE 5 NET CONTRACT POINTS (unchanged, for reference): (1) declarative RBAC over the raw sink, User then Orchestrator then others ladder, deny-by-default, federation-aware, User-override first-class, enforced at the sink fail-closed; (2) status-preserving UPSERT on a stable natural key, status immutable except via authorized transition; (3) a defined invariant field set unchanged by any grant mutation; (4) post-drop resource acquisition, no privileged /proc/self/fd re-open, fd-passing via inheritance or SCM_RIGHTS only if unavoidable; (5) re-assert and verify non-dumpable after every credential transition.

OUTPUTS: B1B2-ENVELOPE-DELTA.v2.md (proposed delta vs base b0d78d86, with per-point acceptance criteria and negative-test obligations, now executable) and B1B2-ENVELOPE-PLAN.v2.md (regenerated buildable sub-card DAG). PROPOSED-ONLY. On completion, report both v2 sha256 + line/byte counts.

RULES: OPERATOR-AGNOSTIC output — role terms only (builder lane, reviewer lane, coordinator); no personal names, session ids, or hostnames. Cite exact file paths and sub-card ids; prefer tables. You author; you do not certify — the fresh re-review and red-team gates certify next, in parallel, each independent of you. If a blocker cannot be resolved without a contract-design change beyond the 5 points, STOP and escalate to the coordinator with the exact obstacle rather than expanding scope. If required inputs are missing or inconsistent, STOP and report rather than guessing.

===== END VERBATIM AUTHOR v2 CORRECTION BRIEF =====
