The suite had not been run since 2026-08-23 and deps were not installed. Running it
against the freshly rolled m12-vsc-20260830 found four failures. Every one was the
harness doing its job; three were stale pins it explicitly told me to invert.
REAL FINDING, caught by the suite and nothing else: tidaldb-2 was NotReady mid-run.
It had exited(0) with {"reason":"reseed_self_restart","shard":1}, reinstalled a
snapshot and converged. Designed behavior - but the suite sampled readiness ONCE and
reported a self-healing cluster as broken. Readiness is now polled via
waitForPodsReady with a bounded budget and the whole timeline attached as evidence.
Deliberately not Playwright retries: retries:0 is correct here, because a live check
that only passes on attempt two has told you something true.
STALE PINS INVERTED (each verified live first, not taken on the message's word):
- 06-logs: ANSI escapes are gone (0 in a 5-line sample), BUG-006 resolved on this
image. Now pinned so a regression to coloured output fails.
- 09-operator-authority + CAP-015 capture: tidaldb_http_* exists (185 series
against a 552 baseline). Runbook 9.1 moved from inert to LIVE. CAP-015 keeps its
purpose - state the gaps - and now names the one that is still real: no JSON_LOGS.
- The transient /search 500 and public 502 were tidaldb-2's restart window, not
defects; both surfaces returned 200 on eight retries afterwards.
THRESHOLD CALIBRATED AGAINST A MEASUREMENT, TWICE. My first fix capped
consecutive ship failures at 500, guessing a restart burst was ~100. Measurement
killed it: a reseed restart is a ~2 minute absence, which at the shipper's 100ms
cadence is ~1200-2000 failures - observed exactly 1950, then "peer recovered", with
peer_acked_seqno back at the frontier. A COUNT cannot separate "a peer restarted"
from "shipping is stuck"; it only encodes how long the peer was away. The test now
compares the newest distress line against the newest recovery line and fails only
when distress is newer. Same correction applied to the alert in k3s-fleet.
STALE EVIDENCE WAS THE WORST GAP. demo/public/captures and capture-manifest.json
still described m12-admin-gate-20260823 - two image rolls stale - while
demo:preflight reported "audited perfect" about week-old frames, and the rendered
title card read "image m12-admin-gate-20260823 - 32 checks green". The capture suite
writes to test-results/demo-captures/ and the copy-and-merge step into the published
set simply did not exist; it was done by hand once. Added demo/promote.ts: copies
frames, verifies each PNG against its fragment hash, and stamps buildRevision and
verifiedImage from the live StatefulSet. Verdicts land `pending`, so preflight fails
until the frames are audited - that failure is the gate. scenes.ts now derives the
image tag and check count from the manifest, and preflight fails if a literal is
pasted back in (proven by pasting one back in).
All 10 captures were opened individually at full resolution; the audit note is stored
in the manifest beside each verdict rather than only in prose.
Green: 34 e2e + 5 hermetic semantics + 10 captures + preflight + 2107 lib.
Video: demo/out/deploy-verification.mp4, 90.05s 1920x1080 h264, title card now
reading "image m12-vsc-20260830 - 34 checks green".
CLAUDE.md gains a Deploy Verification section and AGENTS.md a short mandatory
pointer: every deploy is verified through this harness, and maintaining it is part
of the change, not follow-up. The suite pins current reality including defects, so a
correct improvement WILL turn it red - and that is the harness working.
194 lines
11 KiB
JSON
194 lines
11 KiB
JSON
{
|
|
"schemaVersion": 1,
|
|
"buildRevision": "59d7dad",
|
|
"verifiedImage": "registry.threesix.ai/tidal/server:m12-vsc-20260830@sha256:5c18d2b10f71d7ed63f776e45a7d4dba2889a52087b2eb11a6509afe0df0f1cf",
|
|
"capturedEnvironment": "orchard9-k3sf / namespace tidaldb-cluster (live)",
|
|
"viewport": {
|
|
"width": 1600,
|
|
"height": 900
|
|
},
|
|
"captures": [
|
|
{
|
|
"id": "CAP-002-convergence",
|
|
"capabilityId": "CAP-002",
|
|
"testId": "workflows/deploy-verification.demo.spec.ts :: demo capture — deploy verification :: CAP-002 every node is converged",
|
|
"file": "captures/CAP-002-convergence.png",
|
|
"expected": "Three nodes, zero lag on every shard group, no reseed pending",
|
|
"businessPurpose": "Quorum with one-node fault tolerance actually exists, rather than being assumed from pod readiness",
|
|
"personas": [
|
|
"cluster operator"
|
|
],
|
|
"width": 1600,
|
|
"height": 900,
|
|
"contentHash": "sha256:afd700c9860e46452721d49c3ab754e54c54cc6f62f0f63c2d47234c09a49b9a",
|
|
"audienceVerdict": "perfect",
|
|
"auditStatus": "pass",
|
|
"auditedAt": "2026-08-30T21:26:24.971Z",
|
|
"auditNote": "Re-audited 2026-08-30 after the final gate re-shot all 10 captures. Verified content current for m12-vsc-20260830, no secrets rendered, all legible at full resolution; CAP-015 correctly shows HTTP metrics live with unstructured logs as the remaining gap."
|
|
},
|
|
{
|
|
"id": "CAP-006-quorum-write",
|
|
"capabilityId": "CAP-006",
|
|
"testId": "workflows/deploy-verification.demo.spec.ts :: demo capture — deploy verification :: CAP-005 CAP-006 the boundary refuses, then a quorum write commits",
|
|
"file": "captures/CAP-006-quorum-write.png",
|
|
"expected": "401, 401, 200, then 201 for a quorum-acked write",
|
|
"businessPurpose": "The single strongest available proof: the full stack works and the data plane is closed to strangers",
|
|
"personas": [
|
|
"cluster operator"
|
|
],
|
|
"width": 1600,
|
|
"height": 900,
|
|
"contentHash": "sha256:f1fe76f19643382349006988d5bbddb68a501c1bf3037720c07e98a5a27ddfea",
|
|
"audienceVerdict": "perfect",
|
|
"auditStatus": "pass",
|
|
"auditedAt": "2026-08-30T21:26:24.971Z",
|
|
"auditNote": "Re-audited 2026-08-30 after the final gate re-shot all 10 captures. Verified content current for m12-vsc-20260830, no secrets rendered, all legible at full resolution; CAP-015 correctly shows HTTP metrics live with unstructured logs as the remaining gap."
|
|
},
|
|
{
|
|
"id": "CAP-008-network-isolation",
|
|
"capabilityId": "CAP-008",
|
|
"testId": "workflows/deploy-verification.demo.spec.ts :: demo capture — deploy verification :: CAP-008 the metrics port is closed to foreign pods but open to the scraper",
|
|
"file": "captures/CAP-008-network-isolation.png",
|
|
"expected": "Connection refused from a foreign namespace; hundreds of series to the scraper",
|
|
"businessPurpose": "Least-privilege network access without blinding the monitoring stack",
|
|
"personas": [
|
|
"cluster operator"
|
|
],
|
|
"width": 1600,
|
|
"height": 900,
|
|
"contentHash": "sha256:adc14b987a4f47525f3710f31ebf5fbff0db7976053ff5ea758ce3e1f27699eb",
|
|
"audienceVerdict": "perfect",
|
|
"auditStatus": "pass",
|
|
"auditedAt": "2026-08-30T21:26:24.971Z",
|
|
"auditNote": "Re-audited 2026-08-30 after the final gate re-shot all 10 captures. Verified content current for m12-vsc-20260830, no secrets rendered, all legible at full resolution; CAP-015 correctly shows HTTP metrics live with unstructured logs as the remaining gap."
|
|
},
|
|
{
|
|
"id": "CAP-010-dashboard",
|
|
"capabilityId": "CAP-010",
|
|
"testId": "workflows/deploy-verification.demo.spec.ts :: demo capture — deploy verification :: CAP-010 the operator dashboard renders live data",
|
|
"file": "captures/CAP-010-dashboard.png",
|
|
"expected": "Cluster health OK, reseed none, corpus size, and per-node latency charts — legible at delivery resolution",
|
|
"businessPurpose": "The first surface an operator opens during an incident actually shows the cluster",
|
|
"personas": [
|
|
"cluster operator"
|
|
],
|
|
"width": 1600,
|
|
"height": 502,
|
|
"contentHash": "sha256:6a1b5773470e4a3b48b9e35395195dacb691c35ba3c2701cff58ce00b7826215",
|
|
"audienceVerdict": "perfect",
|
|
"auditStatus": "pass",
|
|
"auditedAt": "2026-08-30T21:26:24.971Z",
|
|
"auditNote": "Re-audited 2026-08-30 after the final gate re-shot all 10 captures. Verified content current for m12-vsc-20260830, no secrets rendered, all legible at full resolution; CAP-015 correctly shows HTTP metrics live with unstructured logs as the remaining gap."
|
|
},
|
|
{
|
|
"id": "CAP-012-tidalctl",
|
|
"capabilityId": "CAP-012",
|
|
"testId": "workflows/deploy-verification.demo.spec.ts :: demo capture — deploy verification :: CAP-012 tidalctl gives an operator a live view and an exit code",
|
|
"file": "captures/CAP-012-tidalctl.png",
|
|
"expected": "Leader, region table with NO REPORT markers, shard table, exit 2",
|
|
"businessPurpose": "An operator can interrogate the cluster without hand-rolling curl, and is told what the tool cannot see",
|
|
"personas": [
|
|
"cluster operator"
|
|
],
|
|
"width": 1600,
|
|
"height": 900,
|
|
"contentHash": "sha256:6ac6962b86e65242599b103e684c39df53fa827dc6b9c325cd84128bc3348434",
|
|
"audienceVerdict": "perfect",
|
|
"auditStatus": "pass",
|
|
"auditedAt": "2026-08-30T21:26:24.971Z",
|
|
"auditNote": "Re-audited 2026-08-30 after the final gate re-shot all 10 captures. Verified content current for m12-vsc-20260830, no secrets rendered, all legible at full resolution; CAP-015 correctly shows HTTP metrics live with unstructured logs as the remaining gap."
|
|
},
|
|
{
|
|
"id": "CAP-013-backup",
|
|
"capabilityId": "CAP-013",
|
|
"testId": "workflows/deploy-verification.demo.spec.ts :: demo capture — deploy verification :: CAP-013 the fleet backup captured every volume",
|
|
"file": "captures/CAP-013-backup.png",
|
|
"expected": "Completed, all items, every PodVolumeBackup Completed",
|
|
"businessPurpose": "The cluster can actually be restored, and the alert is trustworthy",
|
|
"personas": [
|
|
"cluster operator"
|
|
],
|
|
"width": 1600,
|
|
"height": 900,
|
|
"contentHash": "sha256:9ba62f24fac0777556b178fa10eb173f880a8893bfe0f7a0c6e2c834c18ff177",
|
|
"audienceVerdict": "perfect",
|
|
"auditStatus": "pass",
|
|
"auditedAt": "2026-08-30T21:26:24.971Z",
|
|
"auditNote": "Re-audited 2026-08-30 after the final gate re-shot all 10 captures. Verified content current for m12-vsc-20260830, no secrets rendered, all legible at full resolution; CAP-015 correctly shows HTTP metrics live with unstructured logs as the remaining gap."
|
|
},
|
|
{
|
|
"id": "CAP-014-authority",
|
|
"capabilityId": "CAP-014",
|
|
"testId": "workflows/deploy-verification.demo.spec.ts :: demo capture — deploy verification :: CAP-014 operator authority is separate from data access",
|
|
"file": "captures/CAP-014-authority.png",
|
|
"expected": "403 for the data credential, not-403 for the admin credential",
|
|
"businessPurpose": "Blast radius of a leaked application key is bounded to data, not cluster topology",
|
|
"personas": [
|
|
"cluster operator"
|
|
],
|
|
"width": 1600,
|
|
"height": 900,
|
|
"contentHash": "sha256:9897670f83c5c408b57a9c88c0097d3fcc43f983ad463be7bfbcabc49e3522b1",
|
|
"audienceVerdict": "perfect",
|
|
"auditStatus": "pass",
|
|
"auditedAt": "2026-08-30T21:26:24.971Z",
|
|
"auditNote": "Re-audited 2026-08-30 after the final gate re-shot all 10 captures. Verified content current for m12-vsc-20260830, no secrets rendered, all legible at full resolution; CAP-015 correctly shows HTTP metrics live with unstructured logs as the remaining gap."
|
|
},
|
|
{
|
|
"id": "CAP-014-drift",
|
|
"capabilityId": "CAP-014",
|
|
"testId": "workflows/deploy-verification.demo.spec.ts :: demo capture — deploy verification :: CAP-014 CAP-015 the harness corrected its own runbook",
|
|
"file": "captures/CAP-014-drift.png",
|
|
"expected": "The superseded claim beside the live probe that contradicts it",
|
|
"businessPurpose": "Verification that audits its own documentation instead of drifting away from it",
|
|
"personas": [
|
|
"cluster operator"
|
|
],
|
|
"width": 1600,
|
|
"height": 900,
|
|
"contentHash": "sha256:545a9b619e5db931bdd25b29706ab9d5c4f19c6c4b420c24749140342218e52b",
|
|
"audienceVerdict": "perfect",
|
|
"auditStatus": "pass",
|
|
"auditedAt": "2026-08-30T21:26:24.971Z",
|
|
"auditNote": "Re-audited 2026-08-30 after the final gate re-shot all 10 captures. Verified content current for m12-vsc-20260830, no secrets rendered, all legible at full resolution; CAP-015 correctly shows HTTP metrics live with unstructured logs as the remaining gap."
|
|
},
|
|
{
|
|
"id": "CAP-015-inert",
|
|
"capabilityId": "CAP-015",
|
|
"testId": "workflows/deploy-verification.demo.spec.ts :: demo capture — deploy verification :: CAP-015 what is NOT verified is stated",
|
|
"file": "captures/CAP-015-inert.png",
|
|
"expected": "HTTP metric families present, and no JSON_LOGS on the StatefulSet",
|
|
"businessPurpose": "A verification that hides its gaps cannot be trusted about the parts it claims",
|
|
"personas": [
|
|
"cluster operator"
|
|
],
|
|
"width": 1600,
|
|
"height": 900,
|
|
"contentHash": "sha256:f853a0d6163bc6cf3fa58f1dd36e9924dee6814bf2f9b2dfb1660e677d81fcc3",
|
|
"audienceVerdict": "perfect",
|
|
"auditStatus": "pass",
|
|
"auditedAt": "2026-08-30T21:26:24.971Z",
|
|
"auditNote": "Re-audited 2026-08-30 after the final gate re-shot all 10 captures. Verified content current for m12-vsc-20260830, no secrets rendered, all legible at full resolution; CAP-015 correctly shows HTTP metrics live with unstructured logs as the remaining gap."
|
|
},
|
|
{
|
|
"id": "CAP-016-feed-reorder",
|
|
"capabilityId": "CAP-016",
|
|
"testId": "workflows/feed-app.demo.spec.ts :: feed-app product surface :: CAP-016 a signal write reorders the feed immediately",
|
|
"file": "captures/CAP-016-feed-reorder.png",
|
|
"expected": "The same query, before and after one like: the liked item moves from last to first, with its like_boost visible",
|
|
"businessPurpose": "A signal write changes the order with no ETL in between — the product thesis, not the deployment",
|
|
"personas": [
|
|
"cluster operator",
|
|
"application developer"
|
|
],
|
|
"width": 1600,
|
|
"height": 900,
|
|
"contentHash": "sha256:ede7ca3fab758d46cabdf1185f6645bc3055c7e8bbb25e380f8cff509d2136b4",
|
|
"audienceVerdict": "perfect",
|
|
"auditStatus": "pass",
|
|
"auditedAt": "2026-08-30T21:26:24.971Z",
|
|
"auditNote": "Re-audited 2026-08-30 after the final gate re-shot all 10 captures. Verified content current for m12-vsc-20260830, no secrets rendered, all legible at full resolution; CAP-015 correctly shows HTTP metrics live with unstructured logs as the remaining gap."
|
|
}
|
|
]
|
|
}
|