Repo Findings Checklist

Note

In-repo only. This is a contributor-facing claim-to-evidence traceability matrix — it cites file paths, Go symbols, and test functions from the source tree. Reading it requires a git clone checkout to follow the cited paths. Operators following the install flow (curl … install.sh | bash) should start at the Quickstart; this matrix is for contributors verifying or extending the tutorial pack’s claims.

Every claim in the Tutorial Pack is grounded in concrete repo evidence. This checklist maps each product claim to the exact file + symbol that implements or tests it.

Key: ✅ Fully implemented | 🔶 Partial / scaffold | ❌ Not implemented (roadmap)


1. Policy Enforcement (Tutorial 01)

Claim

Status

File

Symbol

Tool calls evaluated against OPA/Rego policy

✅

runtime/server.go

handleTool, emitDecision

Real OPA engine: data.autonomy.allow query

✅

policy/evaluator.go

NewEvaluator() (PreparedEvalQuery)

Rego compiled once at load, evaluated per call

✅

policy/evaluator.go

rego.New(...).PrepareForEval()

Fail-closed: compilation error → deny all

✅

policy/evaluator.go

NewEvaluator() returns error on bad Rego

Fail-closed: undefined allow rule → deny all

✅

policy/evaluator_test.go

TestEval_NoAllowRule_FailClosed

input.kind + input.params wired to Rego

✅

policy/evaluator.go

Eval() input map

input.params visible in Rego (test)

✅

policy/evaluator_test.go

TestEval_ParamsVisibleToRego

Multi-module disjunction (OR) (test)

✅

policy/evaluator_test.go

TestEval_MultiModuleDisjunction

tool.echo → allow

✅

runtime/tools.go

echoTool

tool.shell → deny (always)

✅

runtime/tools.go

executeTool (shell case)

tool.http_get → endpoint-key allowlist (params.endpoint)

✅

runtime/tools.go

httpGetTool, resolveAllowedEndpoint, ErrDomainNotAllowed

Deny cannot be overridden by adapter

✅

runtime/server_test.go

TestInterceptorDenyCannotBeOverridden

Fail-closed: no policy → deny all

✅

cmd/autonomy/commands/runtime.go

denyAllEvaluator{}

Strict mode: deny all regardless of policy

✅

cmd/autonomy/commands/runtime.go

AUTONOMY_STRICT_MODE

/health reports mode (normal/strict)

✅

runtime/server.go

handleHealth


2. Supply Chain Verification (Tutorial 01)

Claim

Status

File

Symbol

Step 1: cosign signature validation

✅

oci/sign/verify.go

Verify(), ErrNotSigned

Step 2: agent binary digest match

✅

oci/sign/verify.go

ErrDigestMismatch

Step 3: BLAKE3 behavioral fingerprint match

✅

lock/fingerprint.go

ComputeFingerprint(), VerifyFingerprint()

Step 4: semver compatibility check

✅

oci/sign/verify.go

ErrSemverIncompat

Tampered digest rejected (integration test)

✅

oci/sign/verify_tamper_test.go

TestVerify_TamperedAgentDigest

Tampered fingerprint rejected

✅

oci/sign/verify_tamper_test.go

TestVerify_TamperedFingerprint

Unsigned sidecar rejected

✅

oci/sign/verify_tamper_test.go

TestVerify_UnsignedLockSidecar

Policy bundle versioning

✅

policy/builder.go

BundleManifest.Validate()

Lock JSON BLAKE3 fingerprint stability

✅

lock/fingerprint_test.go

TestFingerprintGolden (CI gate)

Canonical bytes key-order independent

✅

lock/fingerprint_test.go

TestCanonicalBytesKeyOrderIndependent


3. OCI Artifact Attachment (Tutorial 01)

Claim

Status

File

Symbol

Lock sidecar attached as OCI referrer

✅

oci/attach.go

AttachLock()

Policy bundle attached as OCI referrer

✅

oci/attach.go

AttachPolicyBundle()

Pull lock from registry (by tag or referrer)

✅

oci/oras.go

pullFileByTag, pullFileByReferrers

Registry capability probe (referrers API)

✅

oci/probe.go

SupportsReferrers()

Plain HTTP for localhost (no TLS required)

✅

oci/oras.go

repo.PlainHTTP = isLocalHost(...)


4. Release Polling (Tutorial 02)

Claim

Status

File

Symbol

Poll loop queries GET /v1/releases/latest

✅

runtime/poller.go

Poller.poll()

Emits polled lifecycle event each interval

✅

runtime/poller.go

emitLifecycle("polled",...)

Emits candidate_detected on fingerprint diff

✅

runtime/poller.go

emitLifecycle("candidate_detected",...)

Emits verify_started, verify_passed/failed

✅

runtime/poller.go

phases 5–6

Emits activated / activate_failed after verify_passed

✅

runtime/poller.go

PolicyActivator + phases 7–8

Hot-swap interceptor without restart

✅

runtime/server.go

ReloadPolicy(), activeState()

Active lock fingerprint persisted across restarts

✅

cmd/autonomy/commands/runtime.go

active-lock.json, readActiveLockFP()

404 → no error, just polled event

✅

runtime/poller_test.go

TestPoller_NoReleases

Control-plane GET /v1/releases/latest

✅

orchestrator/server.go

handleLatestRelease

Control-plane POST /v1/releases

✅

orchestrator/server.go

handlePublishRelease

Control-plane GET /v1/events query

✅

orchestrator/server.go

handleQueryEvents


5. Edge Relay (Tutorial 02)

Claim

Status

File

Symbol

Segment ingest over mTLS (offer → data → ACK)

✅

edge/cmd/edged/main.go

handleRelayConn

DB-driven pull model (no buffered channel)

✅

edge/relay/executor.go

drainPending(), GAP-5

CAS claim (workers race, no double-relay)

✅

edge/relay/boltledger.go

TryTransitionInflight()

Bounded retries → Deadletter (INV-12)

✅

edge/relay/executor.go

failRelay(), TransitionFailed

one_peer / all_peers success condition

✅

edge/relay/executor.go

checkSuccessCondition()

ACK after atomic store commit (GAP-7)

✅

edge/cmd/edged/main.go

conn.SendAck() after store.Write()

Crash recovery: abandon inflight on startup

✅

edge/relay/recovery.go

ReconcileOnStartup()

Relay operator status surface exposes queue depth + bandwidth counters

✅

edge/cmd/edgectl/deadletter.go

relayStatusCmd()

Relay bandwidth can be hot-updated at runtime with audit emission

✅

edge/cmd/edgectl/deadletter.go

relayConfigSetBandwidthCmd(), emitCLIRecord()

Deadletter operator workflow is implemented: list / inspect / retry / purge

✅

edge/cmd/edgectl/deadletter.go

deadletterListCmd(), deadletterInspectCmd(), deadletterRetryCmd(), deadletterPurgeCmd()

Multi-peer e2e test

✅

edge/relay/e2e_test.go

TestRelayE2E_MultiPeer

edged wired to Docker Compose demo

✅

demo/docker-compose.yml

edged-node-a, edged-node-b services (--profile edge)


6. WAL Durability (Tutorial 03)

Claim

Status

File

Symbol

Length-prefixed binary frame format (4B + JSON)

✅

telemetry/wal.go

Frame struct, Append()

fsync before returning from Append

✅

telemetry/wal.go

Append()

telemetry.safe_seq 8-byte LE uint64

✅

telemetry/wal.go

safeSeqFileName

Recovery truncates to safe-point boundary

✅

telemetry/wal.go

OpenWAL()

Fail-hard on missing safe_seq (non-first-run)

✅

telemetry/wal.go

causeSafeSeqNotFound

Fail-hard on sequence gap

✅

telemetry/wal.go

causeSeqGap

Fail-hard on invalid JSON frame

✅

telemetry/wal.go

causeWALCorruptInvalidJSON

Drain does NOT delete events on failure

✅

cmd/autonomy/commands/telemetry.go

telemetryDrainCmd() (LoadPos / SavePos)

Events drained in priority order

✅

telemetry/priority_drain.go

PriorityDrainer.Drain()

WAL survives collector outage (test)

✅

telemetry/buffer_test.go

TestWALSurvivesCollectorDown

Legacy upgrade env var (escape hatch)

✅

telemetry/wal.go

legacyUpgradeEnvVar

Operator reset env var (disaster recovery)

✅

telemetry/wal.go

operatorResetEnvVar


7. OTel Pipeline (Tutorial 03)

Claim

Status

File

Symbol

WAL → OTLP/HTTP → OTel Collector

✅

telemetry/otlp_sender.go

HTTPSender, toOTLPLogs()

OTel Collector → Jaeger + bridge

✅

demo/otel/collector.yaml

Pipeline config

Bridge → control-plane /v1/events

✅

telemetry/bridge.go

RunBridge()

kindToEventType() maps full event kinds

✅

telemetry/bridge.go

kindToEventType() (bug fixed)

ai.policy.decision event type routing

✅

telemetry/bridge.go

"autonomy.decision" case

ai.deployment.lifecycle event type routing

✅

telemetry/bridge.go

"autonomy.lifecycle" case


8. OS Fingerprint + Reconstruction (Tutorial 04)

Claim

Status

File

Symbol

BLAKE3 fingerprint over os-release + uname

✅

edge/bootstrap/osfingerprint.go

CaptureOSFingerprint()

Kernel-only change triggers reconstruction

✅

edge/bootstrap/bootstrap_test.go

TestFingerprintChange_KernelOnly_TriggersReconstruction

Fingerprint saved atomically (tmp → rename)

✅

edge/bootstrap/bootstrap.go

SaveFingerprint()

BootEpoch increments per reconstruction

✅

edge/cmd/edged/main.go

runPrecheck()

Ed25519 manifest signature verification

✅

edge/bootstrap/install.go

VerifyManifestSignature()

TOCTOU closed: execute same bytes verified

✅

edge/bootstrap/bootstrap.go

RunReconstruction() doc comment

GAP-9: typed ops only (no shell exec)

✅

edge/bootstrap/install.go

ValidateInstallOperation(), shellMetachars

Shell metachar rejection in paths

✅

edge/bootstrap/install.go

shellMetachars const

copy_binary BLAKE3 hash check

✅

edge/bootstrap/install.go

executeCopyBinary()

Exit 0: clean / first-run / reconstructed

✅

edge/cmd/edged/main.go

runPrecheck()

Exit 1: config invalid

✅

edge/cmd/edged/main.go

runPrecheck()

Exit 2: StateRoot invalid

✅

edge/cmd/edged/main.go

runPrecheck()

Exit 3: mTLS cert expires within 7 days

✅

edge/cmd/edged/main.go

checkCerts(), certExpiryWarnDays

Exit 5: reconstruction failed (fail closed)

✅

edge/cmd/edged/main.go

runPrecheck()

Epoch evidence written after reconstruction

✅

edge/epoch/epoch.go

RotateEpoch()

Epoch crash-safe (tmp → rename)

✅

edge/epoch/epoch.go

RotateEpoch() sequence

Epoch rotate failure is non-fatal

✅

edge/cmd/edged/precheck_test.go

TestPrecheck_EpochRotateFailure_NonFatal

StateRoot ephemeral FS rejection

✅

edge/stateroot/stateroot.go

CheckMount(), EphemeralFSTypes

overlayfs allowed (container compat)

✅

edge/stateroot/stateroot.go

Comment: NIT-C

OS update simulation unit test

✅

edge/bootstrap/osupdate_test.go

TestOSUpdateSimulation (7 assertions)


9. Portability (Tutorial 05)

Claim

Status

File

Symbol

amd64 / arm64 / riscv64 in test matrix

✅

Makefile

PORTABILITY_ARCHES

ext4 + xfs in test matrix

✅

Makefile

PORTABILITY_FS

Zero CGO in edge module

✅

edge/go.mod

No #cgo directives

Randomised crash harness (seeded)

✅

telemetry/crash_harness_test.go

TestCrashHarness_Randomized

WAL frame format cross-arch verification

✅

scripts/portability/wal_verify.py

Python frame parser

Atomic rename check per cell

✅

scripts/portability/core_matrix.sh

Step 4

Non-native arches via QEMU Docker

✅

scripts/portability/lib_portability.sh

qemu_available()

CI gate (strict, exit-1)

✅

Makefile

portability-ci-gate

Reproducible runs (–seed flag)

✅

Makefile

portability-crash-harness SEED=N

Mission-layer import ban (INV-10)

✅

edge/ci/scan_prohibited/main.go

Import scanner

Container images (multi-arch manifests)

❌

Roadmap

Not in repo

Native riscv64 hardware CI

❌

Roadmap

QEMU only


10. Python Adapter (Tutorial 01)

Claim

Status

File

Symbol

@runtime_guard decorator — fn body never called on deny

✅

adapters/python/autonomyops/generic/runtime_guard.py

Invariant test

RuntimeTool(BaseTool) deny propagation

✅

adapters/python/autonomyops/langchain/runtime_tool.py

_run()

RuntimeClient — stdlib only, no requests

✅

adapters/python/autonomyops/runtime_client.py

urllib usage

Unique audit_id per call (UUID v4)

✅

adapters/python/autonomyops/runtime_client.py

uuid.uuid4()

Demo agent: echo allow, shell deny, exit 0

✅

demo/agent_py/agent.py

main() assertions


11. mTLS Cert Rotation (Tutorial 04)

Claim

Status

File

Symbol

certrotation package — stdlib only, no shell exec

✅

edge/certrotation/rotate.go

Rotate(), NeedsRotation(), CheckKeypair()

ECDSA P-256 leaf cert signed by existing CA

✅

edge/certrotation/rotate.go

Rotate()

Atomic write: .new → fsync → rename → fsync parent

✅

edge/certrotation/rotate.go

writeAndSync(), fsyncDir()

Lifecycle slog markers: rotation_started / rotation_succeeded / rotation_failed

✅

edge/certrotation/rotate.go

Rotate() defer

CA cert unchanged after leaf rotation

✅

edge/certrotation/rotate_test.go

TestRotate_PreservesCAStability

No partial .new files on write failure

✅

edge/certrotation/rotate_test.go

TestRotate_AtomicWrite_NoPartialState

Keypair consistency check in precheck (detects crash-partial state)

✅

edge/cmd/edged/main.go

checkCerts() + certrotation.CheckKeypair()

Auto-rotate in precheck when cert expiring + ca_key_file set

✅

edge/cmd/edged/main.go

checkCerts() auto-rotation block

Force-rotate flag: edged precheck --rotate-certs

✅

edge/cmd/edged/main.go

precheckCmd() --rotate-certs flag

Standalone edged rotate subcommand

✅

edge/cmd/edged/main.go

rotateCmd()

ca_key_file optional field in TransportConfig

✅

edge/config/config.go

TransportConfig.CAKeyFile

Demo TOML files wired with ca_key_file

✅

demo/edge/node-a.toml, demo/edge/node-b.toml

ca_key_file field

Demo end-to-end: rotate → verify transport → precheck auto-rotate

✅

demo/scripts/09_cert_rotation.sh

full demo


12. Fleet Rollouts (Workplan)

Claim

Status

File

Symbol

Rollout plan domain model + validation

✅

rollout/plan.go

RolloutPlan, Validate(), StageByID()

Plan integrity + fingerprint + signature verification

✅

rollout/integrity.go

ComputePlanFingerprint(), SignPlan(), VerifyPlanIntegrity()

Deterministic slot allocation

✅

rollout/slot.go

ComputeSlotRank(), ComputeCutoffRank()

Edge rollout cache and evaluator wiring

✅

rollout/cache.go, rollout/evaluator.go

PlanCache, EvaluateNodeFromCache()

Runtime rollout activator callback model

✅

runtime/activator.go

Activator, ActivatorCallbacks

Control-plane rollout persistence + API surface

✅

orchestrator/rollout/store.go, orchestrator/rollout/server.go

RolloutStore, /v1/rollouts/* handlers

Batch promotion evaluator (correctness fallback)

✅

orchestrator/rollout/promoter_batch.go

BatchPromoter.RunOnce()

OPA rollout activation policy gates

✅

policy/rollout.rego

allow_rollout_activation, os_reconstruction_precondition_failed

Event bus for streaming promotion pipeline

✅

orchestrator/rollout/eventbus.go

EventBus, Subscribe(), Publish()

Streaming promoter with rolling-window evaluation

✅

orchestrator/rollout/promoter_streaming.go, orchestrator/rollout/window.go

StreamingPromoter, RollingWindowCache

Fleet health gate condition evaluation

✅

orchestrator/rollout/gates.go

EvaluateGate(), EvaluateGates()

Statistical promotion conditions + baseline cache

✅

orchestrator/rollout/stats.go, orchestrator/rollout/baseline.go

statistical tests, BaselineCache

Rollout observability + mission telemetry bridge

✅

orchestrator/rollout/observability.go, telemetry/bridge.go

RolloutObserver, RunBridgeWithConfig()

Mesh propagation source resolution (cache → peer → registry)

✅

rollout/mesh.go, runtime/source_resolver.go

ArtifactSource, (*SourceResolver).Resolve()

Edge relay mesh propagation + deadletter callback isolation

✅

edge/relay/mesh_propagator.go, edge/relay/executor.go

MeshPropagator, SetDeadletterNotifier()

OS reconstruction activation path

✅

runtime/os_reconstruction.go

NewOSReconstructionCallback()

HA leader lease with renewal lifecycle

✅

orchestrator/rollout/evaluator.go

DBLeaderElector.Start()/Stop()/Campaign()


13. Control Plane HA + Replicated Datastore (Workplan)

Claim

Status

File

Symbol

PostgreSQL replicated backend is implemented (not scaffold-only)

✅

orchestrator/pgstore/store.go, orchestrator/pgstore/schema.go

Open(), ApplySchema(), schemaSQL

Two-layer leader authority (advisory lock + durable epoch)

✅

orchestrator/pgstore/elector.go

PGLeaderElector.Campaign()

Stale-leader fenced writes fail closed

✅

orchestrator/pgstore/elector.go

EpochFence(), ErrEpochMismatch

Protected/best-effort/audit write classes are explicitly separated

✅

orchestrator/pgstore/txwrite.go

ProtectedTx(), BestEffortTx(), AuditTx()

Append-only promotion evidence and decisions

✅

orchestrator/pgstore/promote.go, orchestrator/pgstore/schema.go

Promote(), evidence_snapshots, promotion_decisions

Startup replay uses durable ingest order, not outbox join

✅

orchestrator/pgstore/recovery.go

RecoverFromEvents()

Insufficient-history deferrals recorded as class-3 audit writes

✅

orchestrator/pgstore/recovery.go

RecordInsufficientHistoryDecisions()

Split readiness endpoints expose read/write/audit/quorum states

✅

orchestrator/pgstore/health_server.go

RegisterRoutes(), handleReadReady(), handleWriteReady(), handleAudit(), handleQuorum()

HA health endpoints are wired into control-plane HTTP server

✅

orchestrator/server.go

RegisterPGHealth()

Split-brain detection and recovery endpoints are implemented

✅

orchestrator/pgstore/health_server.go

handleHASplitBrain(), handleHASplitBrainRecover()

HA backup create / list / restore endpoints are implemented

✅

orchestrator/pgstore/health_server.go

handleBackupCreate(), handleBackupList(), handleBackupRestore()

CLI split-brain operator surface is wired with RBAC guard + typed JSON/text output

✅

cmd/autonomy/commands/ha_split_brain.go

haSplitBrainDetectCmd(), haSplitBrainRecoverCmd()

CLI HA backup operator surface is wired for create / list / destructive restore

✅

cmd/autonomy/commands/ha_backup.go

haBackupCreateCmd(), haBackupListCmd(), haBackupRestoreCmd()

Migration path from SQLite to PostgreSQL with dry-run/validate modes

✅

orchestrator/pgstore/migrate.go, cmd/autonomy/commands/orchestrator_client.go

Migrate(), configMigrateCmd()

Audit diagnostics are read-only and query append-only history

✅

orchestrator/pgstore/audit_query.go

QueryLeaderState(), QueryLeaderHistory(), QueryPromotionHistory(), QueryEvidenceSnapshot()

PostgreSQL audit emitter upgrades file-only audit to DB-backed multi-emitter

✅

orchestrator/pgstore/audit_emit.go, orchestrator/pgstore/store.go

InitPGAuditEmitter(), initPGAuditEmitter()

Legacy provenance surfaced in rollout status (no import cycle)

✅

orchestrator/rollout/auditprovider.go, orchestrator/rollout/server.go, orchestrator/pgstore/audittracker.go

LegacyProvenanceChecker, WithLegacyProvenanceProvider(), HasLegacyProvenance()


14. Proof Report Generators (VAL25-VAL29)

Claim

Status

File

Symbol

Fleet proof report aggregates VAL07-VAL11 into text + JSON artifacts

✅

scripts/labs/run_fleet_rollout_proof_report_val25.sh

load_report(), chk(), json_report

Fleet proof report degrades missing/malformed slice inputs to MISSING instead of aborting

✅

scripts/labs/run_fleet_rollout_proof_report_val25.sh

load_report(), validate_report(), slice_status()

Fleet readiness requires coherent evidence timestamps across VAL07-VAL11

✅

scripts/labs/run_fleet_rollout_proof_report_val25.sh

evidence_window_ok, evidence_window_detail

Fleet N=100 target is keyed to the exact VAL08 scenario check, not aggregate error count

✅

scripts/labs/run_fleet_rollout_proof_report_val25.sh

report_check_pass(), chk("VAL25-07", ...)

HA proof report aggregates VAL13-VAL17 into text + JSON artifacts

✅

scripts/labs/run_ha_proof_report_val26.sh

load_report(), chk(), json_report

HA proof report validates per-slice schemas before aggregation

✅

scripts/labs/run_ha_proof_report_val26.sh

require(), validate_report()

HA quorum-loss readiness requires detection, timing bound, and write-block proof

✅

scripts/labs/run_ha_proof_report_val26.sh

check_pass(), chk("VAL26-09", ...)

Relay proof report auto-discovers latest standalone VAL19-VAL24 evidence directories

✅

scripts/labs/run_relay_proof_report_val27.sh

find_latest_dir()

Relay proof report enforces a coherent 7-day validation campaign before readiness

✅

scripts/labs/run_relay_proof_report_val27.sh

evidence_campaign_ok, evidence_campaign_detail

Relay GA readiness is gated on direct VAL24 soak Gate D proof

✅

scripts/labs/run_relay_proof_report_val27.sh

soak_gate_d, ga_ready

Cross-cutting proof report parses text-only VAL01/VAL02 plus JSON VAL03-VAL06

✅

scripts/labs/run_crosscut_proof_report_val28.sh

parse_val01(), parse_val02(), load_json()

Cross-cutting RBAC proof requires full 14-check accounting plus allow/deny evidence

✅

scripts/labs/run_crosscut_proof_report_val28.sh

val03_rbac_ok()

Cross-cutting audit coverage requires exact 25/25 wired event types

✅

scripts/labs/run_crosscut_proof_report_val28.sh

chk("VAL28-08", ...)

Cross-cutting GA / Public Production are intentionally not evaluated by VAL28 scope

✅

scripts/labs/run_crosscut_proof_report_val28.sh

ga_ready = False, public_prod = False

Public-claim evidence matrix aggregates VAL25-VAL28 proof-report JSON artifacts

✅

scripts/labs/run_evidence_matrix_val29.sh

load_json(), row(), evaluated

Design-partner matrix readiness requires a coherent 7-day proof-report campaign

✅

scripts/labs/run_evidence_matrix_val29.sh

report_ts(), evidence_campaign_ok, dp_ok

Design-partner matrix readiness requires a machine-readable disclosure artifact with all required beta disclosures

✅

scripts/labs/run_evidence_matrix_val29.sh

required_disclosures, disclosures_ok, design_partner_disclosures

Relay soak claim in the matrix is keyed to direct VAL24 Gate D evidence, not broader relay GA

✅

scripts/labs/run_evidence_matrix_val29.sh

row("RL-SOAK-01", ...), rpt27["soak_val24"]["gate_d_overall"]

Evidence matrix emits machine-readable readiness + campaign + disclosure state

✅

scripts/labs/run_evidence_matrix_val29.sh

json_report["readiness"], json_report["evidence_campaign"], json_report["design_partner_disclosures"]


15. Standalone Relay Validation Extensions (VAL19-VAL24)

Claim

Status

File

Symbol

TCP impairment proxy exposes live mode switching, stats, and counter reset over HTTP

✅

scripts/labs/relay_impairment_proxy.go

proxyMode, handleMode(), handleStats(), handleReset()

Impairment proxy supports five transport modes: clean, latency, bandwidth, outage, cutoff

✅

scripts/labs/relay_impairment_proxy.go

proxyMode.Type, forwardPrimary()

Relay impairment setup seeds deterministic deadletter fixtures and writes isolated relay config

✅

scripts/labs/edge_relay_impairment_setup.go

seedDeadletterRecord(), writeConfig()

VAL19 harness proves outage retention before clean retry and cutoff retry convergence

✅

scripts/labs/run_relay_impairment_val19_lab.sh

VAL19-02, VAL19-10

Throughput setup seeds PENDING ledger entries for direct executor pickup (no failure simulation)

✅

scripts/labs/edge_relay_throughput_setup.go

seedPendingRecord()

VAL20 benchmark captures five workload tiers plus queue-depth/backpressure evidence

✅

scripts/labs/run_relay_throughput_val20_lab.sh

VAL20-04, VAL20-10

Overflow setup supports configurable ceiling, eviction threshold, and retry budget

✅

scripts/labs/edge_relay_overflow_setup.go

main() flags --ceiling-bytes, --eviction-threshold, --max-retry-count

VAL21 overflow harness proves eviction-specific segment not found failure and exact terminal accounting

✅

scripts/labs/run_relay_overflow_val21_lab.sh

VAL21-05, VAL21-07

VAL22 harness validates exact-ID deadletter list/inspect/retry/re-deadletter/restart/purge workflow

✅

scripts/labs/run_relay_deadletter_val22_lab.sh

deadletter_ids_json(), audit_resource_ids_json(), VAL22-05, VAL22-10

VAL23 harness isolates rate-only, quota-only, and hot-reload bandwidth behavior with exact delivery/deadletter accounting

✅

scripts/labs/run_relay_bandwidth_val23_lab.sh

bw_field(), deadletter_ids_json(), VAL23-06, VAL23-07, VAL23-09

Relay soak setup binary cleanly separates one-time init from per-round reseeding while edged is stopped

✅

scripts/labs/edge_relay_soak_val24_setup.go

runInit(), runSeed()

VAL24 soak framework installs cron-driven rounds and reports Gate D delivery / retry / loss / rounds criteria

✅

scripts/labs/run_soak_val24_setup.sh, scripts/labs/run_soak_val24_round.sh, scripts/labs/run_soak_val24_report.sh

CRON_ENTRY, gate_d_pass, retry_recovery_rate


16. Validation Traceability + Claims Governance

Claim

Status

File

Symbol

Edge FI shell runner emits machine-readable JSONL plus human-readable summary for every shell FI execution

✅

edge/ci/tests/run_all.sh

emit_result(), SUMMARY_FILE, RESULTS_JSONL

Root-required FI tests are explicitly represented as not_run when skipped

✅

edge/ci/tests/run_all.sh

requires_root(), emit_result(..., "not_run", ...)

FI traceability report merges Go FI and shell FI into a unified FI index

✅

edge/ci/tests/gen_traceability_report.sh

fi_id_from_shell(), go_to_fi, fi_index

FI traceability report emits combined pass/fail summary and preserved runner summaries

✅

edge/ci/tests/gen_traceability_report.sh

overall_status, go_summary, shell_summary

Public-claim messaging downgrade / upgrade policy is documented in-repo

✅

docs/tutorials/public-claims-correction-package.md

## 2. Claims Correction Table, ## 4. Red Flag Phrases to Ban, ## 5. Claims Upgrade Map

Audit completeness inventory explicitly distinguishes wired event types from deferred ones

✅

docs/tutorials/audit-completeness-validation.md

## 3. Wired Event-Type Inventory, Deferred event types (excluded from VAL04)

FI tutorial traceability from invariant to executed output is documented with real captured output

✅

docs/tutorials/fi-traceability-invariant-map.md

## What you're proving, ## Expected outputs (from real run)


17. Operator Diagnostics + Bundle Evidence

Claim

Status

File

Symbol

Support-bundle CLI is implemented as a top-level operator surface

✅

cmd/autonomy/commands/support_bundle.go

supportBundleCmd(), supportBundleGenerateCmd()

Support bundle writes gzip+tar archive with manifest-driven collector outcomes

✅

cmd/autonomy/commands/support_bundle.go

generateSupportBundle(), BundleManifest, CollectorResult

Support bundle collectors are non-fatal and preserve partial-success evidence in manifest

✅

cmd/autonomy/commands/support_bundle.go

collect(), skip()

Support bundle redacts secrets from config material before archiving

✅

cmd/autonomy/commands/support_bundle.go

collectConfig(), redactConfigBytes(), redactPostgresURL()


Known Gaps / Honest Limitations

Gap

Details

Where documented

riscv64 native CI

Tested via QEMU; no bare-metal riscv64 in CI

Tutorial 05, Implementation Status table

30-day soak claims are framework-backed but not repo-checked runtime evidence

VAL12 / VAL18 / VAL24 provide generators and Gate D logic, but long-running soak outcomes depend on externally produced evidence directories rather than checked-in repo fixtures

docs/tutorials/soak-validation.md, docs/tutorials/ha-soak-validation.md, docs/tutorials/relay-soak-validation.md

Public-production readiness depends on external evidence not produced by current VAL suite

Third-party audits, compliance evidence, real network partition chaos, and production-hardware calibration are intentionally out of scope for the repo-local proof generators

docs/tutorials/crosscut-proof-report-validation.md, docs/tutorials/evidence-matrix-validation.md, docs/tutorials/public-claims-correction-package.md

Some proof/evidence generators depend on fresh runtime evidence rather than checked-in golden inputs

VAL25–VAL29 report generators are implemented in-repo, but complete outputs still require current upstream evidence directories and, for VAL29, the disclosure artifact

docs/tutorials/fleet-rollout-proof-report-validation.md, docs/tutorials/ha-proof-report-validation.md, docs/tutorials/relay-proof-report-validation.md, docs/tutorials/crosscut-proof-report-validation.md, docs/tutorials/evidence-matrix-validation.md