AUTONOMY FOUNDATIONS v1.0 — BUILD REPORT
Date: 2026-08-27
Session: v5lkfj · branch claude/autonomy-foundations-v1.0-v5lkfj (LANDED on main 2026-08-27 — §9)
Step 0 report: docs/reports/AUTONOMY_FOUNDATIONS_STEP0_2026-08-27.md (KEEP/DROP evidence lives there)
Charter compliance: every DROP is prior art verified on main; every KEEP extends the tree's canonical homes; zero protected paths; zero site-visible files (both measured against the diff).
1. KEEP/DROP outcomes
| WS | Verdict | Outcome |
|---|---|---|
| W1 exec-reliability | DROPPED | D6-2 closed 2026-08-19 (execution_adapters/reconciliation.py + EXEC-1 lifecycle). Delta surfaced as owner note only. |
| W2 portfolio-risk | DROPPED | D6-1 closed 2026-08-21 (execution_adapters/portfolio.py, dark until PORTFOLIO_RISK_POLICY). Cap values = owner item. |
| W3 incident-recovery | BUILT (platform half) | scripts/incident/ ×5 tools + docs/runbooks/INCIDENT_RECOVERY.md; references, never duplicates, the landed D6-3 action-classes runbook. |
| W4 metric contracts | BUILT (narrow extension) | spend + ncm contracts added to contracts/mizoki_contracts/metric_contracts.py (the D6-4 ratchet grows; no parallel registry). |
| W5 L5 certification | BUILT | src/shared/l5_certification/ — the L5-CERT-1 measurement machinery, observe-only. |
| W6 benchmark harness | BUILT | eval/harness/ — role-keyed model benchmarks, the DIST-4 prerequisite. |
| W7 Klaviyo + TTD | BUILT (webhook half only) | klaviyo_webhook.py flag-off on the gateway; pull half / value rail / mapper untouched. TTD DROPPED (TTD-1 row + REDS intake exist; no seat). |
| W8 doc deltas | SKIPPED (both halves, measured) | r3.5.2 amendment already on main. No “Growth Control r2.1” exists — Drive board search (title + fullText) finds the Growth Control doc at r2.0 (matching the repo); the only r2.1-titled board docs are the executed Activation v2.1 prompt and FEATURE_CATALOG_AND_DEMO_PLAN_r2.1.md, which the v5.3 lane already landed with grounding corrections (eacccbe, 2026-08-26 — see LAUNCH_RECONCILIATION_CLAUDE_2026-08-26.md). Nothing to land. |
2. What landed, per workstream
W4 — Metric contracts (commit d0b5c8797)
REQUIRED_METRICS += {spend, ncm}. spend normalizes per the D6-1 SPEND_ACTIONS unit table and is defined as an operand, never an incrementality signal (iROAS keeps that role). ncm mirrors the shipped NCM-v1 subtraction chain byte-for-concept from bigquery/schemas/net_contribution.sql / net-yield compute.py, with economics_complete=FALSE exclusion and the NET_YIELD_WRITEBACK stays false citation. Both fingerprint and invalidate exactly like the originals. The exact-set baseline pin in the test moved with its reason (rule 01). The standing gate was already real: tests/governance runs in the CI governance-spine step.
W5 — L5 certification machinery (commit b92054c76)
src/shared/l5_certification/ (+ cross-pin in da132d5e3):
- gates.py — the FIRST executable pins of CONSTITUTION III.6 (Brier ≤ 0.20, AUC ≥ 0.72, ≥ 2 stable cycles; gap G-20's build half). Values are read-only, test-asserted both directions, and cross-pinned against scripts/mizoki_canon.py PROMOTION_GATES so the two homes cannot drift.
- evaluator.py — pure-Python (numpy-free) Brier / tie-aware rank AUC / consecutive-latest-cycle stability over ADMISSIBLE realized pairs only (score strictly precedes outcome; malformed rows excluded and counted). Purchase-cycle membership is a protocol input, never inferred. Single-class AUC is None, never invented.
- policy.py — the one-way rule: metric breach at an elevated level ⇒ downgrade recorded to L0 with every breached gate named; gates cleared ⇒ at most eligible-for-owner-review (a recorded FACT — no code path raises a level, proven exhaustively); no registered holdout ⇒ observe-only (CONSTITUTION II.10); insufficiency flags evidence-stale at elevated levels but never auto-demotes. headline_autonomy = MIN across a domain's classes, read-only.
- records.py / store.py — unified.autonomy_certifications rows carrying D6-4 contract_fingerprint pins + pins_check_valid, the D6-1 blast_radius_cap_ref, reversibility and holdout flags. Store is dark until L5_CERT_BQ_PROJECT (not_configured, writes refuse loudly) with a structural never-upgrade guard.
- cli.py + shipped fixture — the GATE-2 smoke (python3 -m l5_certification.cli --fixture … — exercised in-session: per-cycle metrics, exclusion counter, holdout rule, dark store all correct).
- Premise corrections recorded: the realized loop is mizoki_intent.intent_scores + intent_outcomes (the tables the brier/auc contracts pin); unified.intent_predictions exists nowhere. This run certifies nothing and changes no autonomy level; L5-CERT-1's flip (owner program doc + first pack) stays open, and the row says so.
W6 — Model benchmark harness (commit 704252de8)
eval/harness/ — frozen role-keyed fixture sets (6 items × 4 roles, sha-versioned), deterministic scorers (exact/contains/regex/numeric_tolerance), a runner whose ONLY live transport is virtuoso_call (zero model strings in the harness — scan-tested; model_version read from the response; fallback service recorded, never silent), unified.model_benchmarks rows + dark-until-configured store, and a regression comparator that refuses fake-transport baselines and moved instruments. README states the hard distinction from ops/remediation/benchmark_harness.py (Stage-2 DOMAIN harness). Distillation itself stays RESEARCH; DIST-4 flips only on a recorded run (owner go).
W3 — Incident recovery, platform half (commit fca18cff0)
scripts/incident/: rollback_revision.py (registry-derived fleet, recorded-evidence service names, placeholder lines marked not-runnable, --apply refuses without gcloud), list_kill_switches.py (12-entry inventory grep-verified against the tree on every run — exits 1 on rot; seeded-rot proven both directions; NET_YIELD_WRITEBACK's real home measured to services/net-yield/writeback/), pause_schedulers.py (9 terraform-declared jobs parsed from deployment/terraform/**, plus the outside-terraform completeness check), drain_status.py (read-only, carries AGENTS 7.7), deploy_freeze.py (owner-action procedure; advisory-vs-ruleset stated). docs/runbooks/INCIDENT_RECOVERY.md = the platform runbook with the quarterly dry-run drill checklist; the live drill stays EXEC-1-gated exactly as the D6-3 row records. claim_label: built, pre-drill.
W7 — Klaviyo webhook half (commit c8cef6e4a)
The design pass KLV-1 deferred, executed on the module memory's settled canon: ONE receiver on the gateway (POST /webhooks/klaviyo/{tenant_id}), flag-off (KLAVIYO_WEBHOOK_ENABLED unset ⇒ 404; public surface byte-identical — pixel-door precedent). Per-tenant HMAC-SHA256 over the raw body (webhook_secret collected beside the api_key in the Connectors catalog — tenant-onboarding compliant), hex/base64, constant-time, uniform 401 (never a tenant oracle), store failure = loud 503. Pipeline: size caps → auth → replay → fail-closed consent gate (redaction via the shared redact_person_fields, counted in connector_consent_drops_total{topic=klaviyo}; the stable profile id survives as the erasure join key — raw email never a join key) → canonical door authoritative (502 ⇒ Klaviyo retries) → journey forward toward MAPPERS["klaviyo"] via the journey door, dark behind KLAVIYO_JOURNEY_FORWARD_URL.
Replay posture — deliberately better than pre-mark: ReplayCache gains a read-only peek() (additive); peek sheds storms, seen() marks only after the authoritative leg holds, so a 502'd batch is NEVER pre-marked — at-least-once is test-pinned (test_failed_batch_is_never_marked_so_retry_reprocesses).
Erasure matrix extended: canonical entity_ids carry profile/message ids; a new governance case proves POST /api/v1/subjects/erase by profile id redacts the envelope (bystander untouched). Source registered in ontology/sources/klaviyo.yaml with license: PENDING_BOSS. Kill-switch inventory gained the flag. The live Klaviyo signature wire format is the arming precondition — LIVE-VERIFY against a real delivery before the flag ever flips; until then every claim here is implemented.
Register truth-ups (commit da132d5e3)
BUILD_DEBT L5-CERT-1 / DIST-4 / KLV-1 gained dated built-notes (rows stay OPEN — no flip condition was met); coverage-matrix rows 4.6/5.5 and gap G-20 narrowed to match. Prevents the next session from rebuilding this work — the Step-0 failure mode in reverse.
3. Tests (all fresh runs, core-pinned venv per ci.yaml; python 3.13 / pytest 9.1.1)
| Suite | Baseline (Step 0) | Final | Delta |
|---|---|---|---|
| tests/governance (pytest.ini) | 701 passed, 1s | 770 passed, 1s, 18 subtests | +69 (W3 18, W4 +3, W5 28, W6 19, erasure +1) |
| tests/connectors | 340 | 356 | +16 (W7 webhook suite) |
| gateway in-service | 162 | 162 | 0 (mount imports clean) |
| remediation exec+portfolio+inventory | 166 | 166 | 0 |
| tests/shared virtuoso | 43 | 43 | 0 |
| tests/market_signal | 292 | 292 | 0 |
| memory trio | 22 + 21 subtests | 22 + 21 | 0 |
| tests/skills | 179, 2s | 179, 2s | 0 |
| rails flags (fail-if-flipped) | — | 20 | writebacks still hard-false |
| net-yield flags (fail-if-flipped) | — | 13 | writebacks still hard-false |
| Total | 2,023 passed / 0 failed |
Standing gates: check_canon_docs.py self-test + scan OK (my docs/product edits in scope, no new findings); skills_sync.py --check OK; ontology_skills_sync.py --check OK; V1/V2/V3 hygiene greps clean over the diff; zero hardcoded model strings in the diff; claude_memory.py check --strict valid. Gate correction recorded (per the Activation v2.1 finding): scripts/mizoki_canon.py has no --check CLI — the real canon gates are the governance suite + check_canon_docs.py + the parity scripts, which is what ran.
4. Merge consequence map (measured, not inferred)
A push = merge = Deploy Router dispatch for matching paths. This diff matches exactly four deploy workflows:
| Workflow | Matching files | Consequence |
|---|---|---|
| deploy-service-marketing-connectors | the 4 gateway files (W7) | Redeploys the gateway through its own suites gate + live verify step. New route is flag-off ⇒ serving behavior byte-identical (404). |
| deploy-boss-agent-core | src/shared/l5_certification/** (rides the image's src/shared COPY) |
Pure additive library; imported by nothing in the boss — inert in the image. |
| deploy-service-action-runner | contracts/mizoki_contracts/metric_contracts.py |
Additive registry entries (existing 166 adapter tests green). |
| deploy-service-canonical-ingestion | same contracts file | Same additive change; governance family green. |
No other workflow matches (eval/, scripts/incident/, bigquery/schemas/, ontology/sources/, docs/, tests/ are unwatched paths). deploy-homepage.yml is dispatch-only and untouched.
5. Rollback plan (verified)
- Level 1 — flags (each new capability fully off, test-asserted):
KLAVIYO_WEBHOOK_ENABLEDunset ⇒ 404 (source-literal default""pinned);KLAVIYO_JOURNEY_FORWARD_URLunset ⇒not_configured(pinned);L5_CERT_BQ_PROJECTunset ⇒ storenot_configured, writes refuse (pinned);MODEL_BENCHMARKS_BQ_PROJECTunset ⇒ same (pinned). Nothing in this run changes live autonomy, spend, or serving behavior. - Level 2 — Cloud Run revision one-liners:
python3 scripts/incident/rollback_revision.py --service <svc> [--to-revision <rev>]for each of the four services above. Last registry-recorded revisions (repo-encoded evidence; the operator picks the live one from the printedrevisions list): gatewayservice-marketing-connectors-00034-888(klv1 landing record, 2026-08-21) — the tool prints describe-first so the actual pre-merge revision is read, never guessed. - Level 3 — schema: both new tables (
unified.autonomy_certifications,unified.model_benchmarks) are ADDITIVE, operator-applied at GATE 2 only; rollback = stop writing, never drop (stated in both DDL headers).unified.execution_reconciliationwas NOT created (W1 dropped with its workstream).
6. Owner-decision list this run surfaces
- W2 cap values:
PORTFOLIO_RISK_POLICYper (tenant, currency, channel-group) — the landed D6-1 layer stays unarmed until declared. - W5 first certification candidates + the owner-approved certification-program document (L5-CERT-1's flip condition). Real evaluations additionally wait on real forward labels (register 17/6c/23).
- Klaviyo license review (
ontology/sources/klaviyo.yamlshipsPENDING_BOSS) + per-tenant webhook secrets/credentials (register item 6) + live signature verification before any flag flip. - TTD seat (TTD-1 unchanged; no build).
- Capital/Risk/Estate go/no-go (CELL-CRE-1 unchanged).
- Distillation go once W6 baselines exist against live models (DIST-4 flip = a recorded run).
- W1/W2 residual deltas (deliberately not built): per-cycle BQ reconciliation job +
unified.execution_reconciliation; correlation-aware concentration warning; log-based alert policies on the D6-1/D6-2 markers (GATE-2 protected-path terraform). - GC r2.1: does not exist as a Growth Control revision — if the owner intended a different board document, name it and it lands byte-identical with sha256.
7. Artifact hashes (sha256[:16])
| Artifact | Hash |
|---|---|
| services/service-marketing-connectors/klaviyo_webhook.py | a15ca38c5a75da26 |
| src/shared/l5_certification/evaluator.py | 2b69e378de166f14 |
| src/shared/l5_certification/policy.py | eb70b5156a48c1ab |
| eval/harness/model_bench.py | 8edaa5457f48e646 |
| scripts/incident/list_kill_switches.py | 5f224e16710412eb |
| docs/runbooks/INCIDENT_RECOVERY.md | b5b37b617e34661a |
| bigquery/schemas/autonomy_certifications.sql | 754cf89443062ed4 |
| bigquery/schemas/model_benchmarks.sql | 0fb2e87a7ce2764a |
Branch commits (local, atop the landed claim 7deba3f91): d0b5c8797 (W4) → b92054c76 (W5) → 704252de8 (W6) → fca18cff0 (W3) → c8cef6e4a (W7) → da132d5e3 (truth-ups). Diff: 38 files, +3,622 / −11.
8. Gate status
GATE 1 — EXECUTED 2026-08-27. Owner released it in-session (typed Approved:merge; recorded on the ledger as merge-only authority, per the standing loose-phrasing precedent). The prescribed sequence ran in full — sync, re-gate on the push tip, one push, ancestry verification, router confirmation, ledger completion record 37aa6b352. Evidence in §9.
GATE 2 — EXECUTED 2026-08-27 by the deploy lane under the owner's separate Approved:deploy (ledger record de379711c): both additive DDLs applied, smokes run. The certification smoke surfaced and fixed a real W5 CLI defect (30bc730cb — §9). All flags remain OFF; certification and activation decisions stay with the owner.
9. Landing and close-out (appended 2026-08-28; every row measured)
- Merge. One push of the designated branch,
7deba3f91..2aa5480cd(8 commits: the 6 build commits of §7 plus reportsa76ccb929and the ported base CI fix2aa5480cd). Auto-merge run #2784 SUCCESS; landing verified by ancestry, not workflow status: main fast-forwarded to2aa5480cd— linear history, the content merged exactly once. Completion record37aa6b352landed viamem_commit.shon a fresh branch (one-push rule). - PR #861 (the durability hold) displays as
mergedbut was not the landing vehicle. GitHub's branch-content detection auto-marked the still-open hold PR merged (merged_by: github-actions[bot],closed_at == merged_at= 19:05:30Z) the moment the bot fast-forwarded main to the identical shas; the SUPERSEDED retitle landed a minute later. A reader crediting #861 credits the same commits, but the vehicle was theclaude/push — rule-02 family: check what a PR actually carried. - Deploy Router #958 dispatched exactly the four §4-predicted deploys; all four concluded SUCCESS.
| service | run | outcome |
|---|---|---|
| boss-agent-core | #248 · 33106775109 | SUCCESS, first attempt (19:15:48Z) |
| mizoki-action-runner | 33106776888 | SUCCESS, first attempt |
| service-canonical-ingestion | 33106779121 | SUCCESS, first attempt |
| service-marketing-connectors | #49 · 33106781210 | attempt 1 FAILURE → attempt 2 SUCCESS (19:13:24Z) |
- The one deploy failure was the verify step, not the revision. Attempt 1's first
curl --fail $URL/healthgot 503 ~3 s after "Routing traffic done" (revisionservice-marketing-connectors-00048-s4palready at 100%). Concurrent live probes from a separate client measured/health200 with the exact pinned body and/readyz200 (shopify_oauth_configured: true) — so the failure was a first-hit route-propagation/cold-start race. The single sanctioned re-run (rule 01) was spent onrerun_failed_jobs; attempt 2 green. Operational note for the next gateway deploy: a first-hit 503 immediately after traffic routing is not yet evidence against the revision — probe the live routes before concluding, and budget the one re-run for exactly this case. - GATE 2 execution detail. The sibling deploy lane's certification smoke caught that §2's W5 CLI line advertised an invocation that could not import from the repo root, and that the minimal
PYTHONPATHrecorded empty metric pins. Fixed in30bc730cb: the docstring now shows the invocation that runs, and the CLI resolves<repo>/contractsitself (appended, so an installed copy still wins). The evaluator's fail-closed pins-degrade design — rows marked invalid, never falsely valid — was deliberately preserved and is now test-pinned in that direction too (governance suite 817 passed). §2's "exercised in-session" claim was true of the session venv and incomplete about the documented invocation; the fix is the correction. - Residue.
hold/autonomy-foundations-v1.0-v5lkfjsits 0-ahead of main (its durability purpose is served; ref deletion is an owner-UI action — the sandbox git proxy refuses branch deletions). The §6 owner-decision list is unchanged and remains open.