test(antithesis): model-driver query coverage — filters, indexes, typed metadata (EN-1625) - #1659
test(antithesis): model-driver query coverage — filters, indexes, typed metadata (EN-1625)#1659Azorlogh wants to merge 9 commits into
Conversation
|
Important Draft PR not reviewedDraft PRs are not automatically reviewed by default.
To automatically review draft PRs, update your CodeRabbit configuration: reviews:
auto_review:
drafts: trueThanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
✅ Approve — automated reviewNo actionable correctness defects remain in the current diff. The active prior disk-full matcher finding is fixed by requiring both ResourceExhausted and WRITES_BLOCKED_DISK_FULL. No findings. |
NumaryBot
left a comment
There was a problem hiding this comment.
NumaryBot posted 1 new inline finding.
Summary: #1659 (comment)
NumaryBot
left a comment
There was a problem hiding this comment.
NumaryBot posted 2 new inline findings.
Summary: #1659 (comment)
Codecov Report✅ All modified and coverable lines are covered by tests. Additional details and impacted files@@ Coverage Diff @@
## release/v3.0 #1659 +/- ##
================================================
+ Coverage 77.31% 77.32% +0.01%
================================================
Files 458 458
Lines 48243 48243
================================================
+ Hits 37300 37305 +5
+ Misses 7807 7804 -3
+ Partials 3136 3134 -2
Flags with carried forward coverage won't be shown. Click here to find out more. ☔ View full report in Codecov by Harness. 🚀 New features to boost your workflow:
|
|
Reviewed live head |
…ed metadata (EN-1625) Squashed replay of feat/model-driver-querying onto release/v3.0 after PR #1635 (EN-1597 iterator fixes) and #1655/#1650 landed — the branch's cherry-picks of those fixes are dropped in favor of the merged versions. Oracle (tests/oracle): - Index lifecycle model (absent/ambiguous/active per canonical IndexID), demoteAllIndexes on restore, schema-gated CreateIndex. - End-of-bulk exclusion sweep shared by asset-touch recording (cellExcluded) and per-tx indexedAddrs stamping (src/dst role bits). - LearnTxStamps: server-stamped timestamp/insertedAt/revertedAt learned from commit logs; 3-valued tx filter matching for unknown stamps. - FieldTypesFor/HasAccount accessors; RemoveMetadataFieldType drops the covering metadata index. Driver (singleton_driver_model): - Query generation + exact-window validation for account and transaction list queries: builtin uint/reference/timestamp leaves, has-asset, address-on-transactions (role-aware), typed metadata Field conditions with coercion (mirrors validateAndCoerceCondition), boolean operators. - indexedQueryOutcomeLegal: NOT_READY / FILTER_COMPILATION_ERROR / result verdicts driven by modeled index state; readiness poller; index create/drop generators incl. undeclared-key probes. - Read dispatch extended to schema reads, account/transaction queries. - WRITES_BLOCKED_DISK_FULL classified transient. Diagnostics kept on-branch: oracle trace/scan tools (replay tracing, rsscan, logprobe, queryprobe, pebblescan), posting-index exclusion-skip INFO log, e2e regression for the purged-account address-index retouch. Original per-phase history: backup/model-driver-querying-premerge (also visible on PR #1659 pre-force-push). Ported onto the oracle's persistent fingerprinted collections (pmap.go, merged from upstream): indexes and everAsset are Map fields with their own terms and join collections(); index readiness flips and LearnTxStamps rebind through Set instead of mutating shared maps; recordIndexedAddrs replaces records through List.Set so terms stay current; driver and test read paths use Get/All/From.
b064d0d to
8e98fd4
Compare
…ed metadata (EN-1625) Squashed replay of feat/model-driver-querying onto release/v3.0 after PR #1635 (EN-1597 iterator fixes) and #1655/#1650 landed — the branch's cherry-picks of those fixes are dropped in favor of the merged versions. Oracle (tests/oracle): - Index lifecycle model (absent/ambiguous/active per canonical IndexID), demoteAllIndexes on restore, schema-gated CreateIndex. - End-of-bulk exclusion sweep shared by asset-touch recording (cellExcluded) and per-tx indexedAddrs stamping (src/dst role bits). - LearnTxStamps: server-stamped timestamp/insertedAt/revertedAt learned from commit logs; 3-valued tx filter matching for unknown stamps. - FieldTypesFor/HasAccount accessors; RemoveMetadataFieldType drops the covering metadata index. Driver (singleton_driver_model): - Query generation + exact-window validation for account and transaction list queries: builtin uint/reference/timestamp leaves, has-asset, address-on-transactions (role-aware), typed metadata Field conditions with coercion (mirrors validateAndCoerceCondition), boolean operators. - indexedQueryOutcomeLegal: NOT_READY / FILTER_COMPILATION_ERROR / result verdicts driven by modeled index state; readiness poller; index create/drop generators incl. undeclared-key probes. - Read dispatch extended to schema reads, account/transaction queries. - WRITES_BLOCKED_DISK_FULL classified transient. Diagnostics kept on-branch: oracle trace/scan tools (replay tracing, rsscan, logprobe, queryprobe, pebblescan), posting-index exclusion-skip INFO log, e2e regression for the purged-account address-index retouch. Original per-phase history: backup/model-driver-querying-premerge (also visible on PR #1659 pre-force-push). Ported onto the oracle's persistent fingerprinted collections (pmap.go, merged from upstream): indexes and everAsset are Map fields with their own terms and join collections(); index readiness flips and LearnTxStamps rebind through Set instead of mutating shared maps; recordIndexedAddrs replaces records through List.Set so terms stay current; driver and test read paths use Get/All/From.
822d1a7 to
bb2e000
Compare
…ed metadata (EN-1625) Squashed replay of feat/model-driver-querying onto release/v3.0 after PR #1635 (EN-1597 iterator fixes) and #1655/#1650 landed — the branch's cherry-picks of those fixes are dropped in favor of the merged versions. Oracle (tests/oracle): - Index lifecycle model (absent/ambiguous/active per canonical IndexID), demoteAllIndexes on restore, schema-gated CreateIndex. - End-of-bulk exclusion sweep shared by asset-touch recording (cellExcluded) and per-tx indexedAddrs stamping (src/dst role bits). - LearnTxStamps: server-stamped timestamp/insertedAt/revertedAt learned from commit logs; 3-valued tx filter matching for unknown stamps. - FieldTypesFor/HasAccount accessors; RemoveMetadataFieldType drops the covering metadata index. Driver (singleton_driver_model): - Query generation + exact-window validation for account and transaction list queries: builtin uint/reference/timestamp leaves, has-asset, address-on-transactions (role-aware), typed metadata Field conditions with coercion (mirrors validateAndCoerceCondition), boolean operators. - indexedQueryOutcomeLegal: NOT_READY / FILTER_COMPILATION_ERROR / result verdicts driven by modeled index state; readiness poller; index create/drop generators incl. undeclared-key probes. - Read dispatch extended to schema reads, account/transaction queries. - WRITES_BLOCKED_DISK_FULL classified transient. Diagnostics kept on-branch: oracle trace/scan tools (replay tracing, rsscan, logprobe, queryprobe, pebblescan), posting-index exclusion-skip INFO log, e2e regression for the purged-account address-index retouch. Original per-phase history: backup/model-driver-querying-premerge (also visible on PR #1659 pre-force-push). Ported onto the oracle's persistent fingerprinted collections (pmap.go, merged from upstream): indexes and everAsset are Map fields with their own terms and join collections(); index readiness flips and LearnTxStamps rebind through Set instead of mutating shared maps; recordIndexedAddrs replaces records through List.Set so terms stay current; driver and test read paths use Get/All/From.
…ed metadata (EN-1625) Squashed replay of feat/model-driver-querying onto release/v3.0 after PR #1635 (EN-1597 iterator fixes) and #1655/#1650 landed — the branch's cherry-picks of those fixes are dropped in favor of the merged versions. Oracle (tests/oracle): - Index lifecycle model (absent/ambiguous/active per canonical IndexID), demoteAllIndexes on restore, schema-gated CreateIndex. - End-of-bulk exclusion sweep shared by asset-touch recording (cellExcluded) and per-tx indexedAddrs stamping (src/dst role bits). - LearnTxStamps: server-stamped timestamp/insertedAt/revertedAt learned from commit logs; 3-valued tx filter matching for unknown stamps. - FieldTypesFor/HasAccount accessors; RemoveMetadataFieldType drops the covering metadata index. Driver (singleton_driver_model): - Query generation + exact-window validation for account and transaction list queries: builtin uint/reference/timestamp leaves, has-asset, address-on-transactions (role-aware), typed metadata Field conditions with coercion (mirrors validateAndCoerceCondition), boolean operators. - indexedQueryOutcomeLegal: NOT_READY / FILTER_COMPILATION_ERROR / result verdicts driven by modeled index state; readiness poller; index create/drop generators incl. undeclared-key probes. - Read dispatch extended to schema reads, account/transaction queries. - WRITES_BLOCKED_DISK_FULL classified transient. Diagnostics kept on-branch: oracle trace/scan tools (replay tracing, rsscan, logprobe, queryprobe, pebblescan), posting-index exclusion-skip INFO log, e2e regression for the purged-account address-index retouch. Original per-phase history: backup/model-driver-querying-premerge (also visible on PR #1659 pre-force-push). Ported onto the oracle's persistent fingerprinted collections (pmap.go, merged from upstream): indexes and everAsset are Map fields with their own terms and join collections(); index readiness flips and LearnTxStamps rebind through Set instead of mutating shared maps; recordIndexedAddrs replaces records through List.Set so terms stay current; driver and test read paths use Get/All/From.
bb2e000 to
259d4b8
Compare
259d4b8 to
89c3afb
Compare
…ed metadata (EN-1625) Squashed replay of feat/model-driver-querying onto release/v3.0 after PR #1635 (EN-1597 iterator fixes) and #1655/#1650 landed — the branch's cherry-picks of those fixes are dropped in favor of the merged versions. Oracle (tests/oracle): - Index lifecycle model (absent/ambiguous/active per canonical IndexID), demoteAllIndexes on restore, schema-gated CreateIndex. - End-of-bulk exclusion sweep shared by asset-touch recording (cellExcluded) and per-tx indexedAddrs stamping (src/dst role bits). - LearnTxStamps: server-stamped timestamp/insertedAt/revertedAt learned from commit logs; 3-valued tx filter matching for unknown stamps. - FieldTypesFor/HasAccount accessors; RemoveMetadataFieldType drops the covering metadata index. Driver (singleton_driver_model): - Query generation + exact-window validation for account and transaction list queries: builtin uint/reference/timestamp leaves, has-asset, address-on-transactions (role-aware), typed metadata Field conditions with coercion (mirrors validateAndCoerceCondition), boolean operators. - indexedQueryOutcomeLegal: NOT_READY / FILTER_COMPILATION_ERROR / result verdicts driven by modeled index state; readiness poller; index create/drop generators incl. undeclared-key probes. - Read dispatch extended to schema reads, account/transaction queries. - WRITES_BLOCKED_DISK_FULL classified transient. Diagnostics kept on-branch: oracle trace/scan tools (replay tracing, rsscan, logprobe, queryprobe, pebblescan), posting-index exclusion-skip INFO log, e2e regression for the purged-account address-index retouch. Original per-phase history: backup/model-driver-querying-premerge (also visible on PR #1659 pre-force-push). Ported onto the oracle's persistent fingerprinted collections (pmap.go, merged from upstream): indexes and everAsset are Map fields with their own terms and join collections(); index readiness flips and LearnTxStamps rebind through Set instead of mutating shared maps; recordIndexedAddrs replaces records through List.Set so terms stay current; driver and test read paths use Get/All/From.
89c3afb to
1209ae8
Compare
gfyrag
left a comment
There was a problem hiding this comment.
Independent review at head 7bb4aeb. Four blocking findings remain; this draft is also conflicting and has no functional CI on the current head.
[P1][blocking] Rebuild index registry state during incremental restore
Location: internal/domain/replay/replay.go (ReplayLedgerLog); demonstrated by tests/e2e/cluster/restore_index_registry_test.go
Evidence: CreateIndex and DropIndex are discarded during RebuildDelta. The added red test proves the restored registry is empty and later metadata removal cannot report/drop the index.
Impact: disaster recovery loses a business-visible primary projection and diverges from the read-side lifecycle. PR #1769 addresses this separately but does not fix this head.
[P2][blocking] Compare learned inserted_at in transaction row validation
Location: singleton_driver_model/queries.go (txRecordMatches)
Evidence: the oracle learns InsertedAt and uses it for filters, but the matcher never compares it with the server row.
Impact: wrong inserted_at responses pass the advertised equality oracle.
[P2][blocking] Bind index readiness to the current incarnation/frontier
Location: singleton_driver_model/indexes.go (reconcileIndexes)
Evidence: a stale status sampled before DropIndex/CreateIndex reuse can promote the new model entry without proving LastIndexedSequence reaches its frontier or identifying the incarnation.
Impact: legal drop/recreate executions can produce false Antithesis findings.
[P2][blocking] Synchronize the HTTP/API contract
Location: internal/adapter/http/error_handler.go, API docs, api-comparison, OpenAPI 503 response
Evidence: all KindUnavailable responses now receive Retry-After, while docs still describe no-leader-only behavior and omit READ_INDEX_NOT_CAUGHT_UP and CHAPTER_ARCHIVE_OUT_OF_ORDER.
Resolution: document the broad retry contract and both public reasons/status/metadata.
Targeted root/nested model tests and tagged E2E compilation passed; the new restore scenario is knowingly red.
ba58c5e to
9d60030
Compare
NumaryBot
left a comment
There was a problem hiding this comment.
NumaryBot posted 2 new inline findings.
Summary: #1659 (comment)
Arbitrated review — PR #1659 (EN-1625): model-driver query coverageSummary. This PR is mostly antithesis/oracle test code but also ships production "server fixes" for the EN-1724 retype window. After both reviews, both rebuttals, and my own reading of the code at HEAD Agreed findings
Ruled disputes
Reviewed by Claude (claude-opus-4-8) and Codex (gpt-5.6-sol) via Shipfox; arbitrated by Claude. |
9d60030 to
35c788e
Compare
NumaryBot
left a comment
There was a problem hiding this comment.
NumaryBot review complete: no remaining inline findings.
Resolved 1 stale NumaryBot review thread (0 fixed, 1 outdated).
Summary: #1659 (comment)
gfyrag
left a comment
There was a problem hiding this comment.
Independent review at exact head 35c788e27c0fa9f4c3c49ff4887b4a6d65b15fed.
[P2][blocking] Make per-node readiness reads locally attributable
Location: tests/antithesis/workload/bin/cmds/model/singleton_driver_model/indexes.go:605-607
Evidence: GetIndexStatus uses the normal linearizable context, so a follower request may be forwarded to the leader. internal.WithStaleConsistency already exists for locally served per-node observations.
Impact: a rebuilding follower can be credited with the leader's ready state, masking cross-replica divergence.
Resolution: call each status RPC with internal.WithStaleConsistency(ctx).
[P2][blocking] Bind readiness results to the sampled index incarnation
Location: singleton_driver_model/indexes.go:589-641
Evidence: after polling without the checker lock, the result is applied by checking only that the same canonical ID still exists. Drop+recreate can reuse that canonical for a new building incarnation.
Impact: stale readiness can promote the wrong incarnation and manufacture or mask model findings.
Resolution: snapshot a lifecycle generation/create frontier and require it unchanged before applying the poll.
[P2][blocking] Compare learned inserted_at in transaction equality
Location: singleton_driver_model/queries.go:601-643
Evidence: InsertedAt() is learned and used by filters but omitted from txRecordMatches.
Impact: an incorrect server inserted_at value passes the advertised equality oracle.
Resolution: compare it once learned and add a mismatched-value regression.
The nested model unit package passes, but the current distributed Tests-Model job is red (ListLogs returns an internal error). The PR body also depends on #1817, which is now closed without merge; replace that dependency explicitly before merge.
35c788e to
d1c78ef
Compare
|
Addressed the three blocking findings in 1b651b9 (rebased onto release/v3.0 first — all the server fixes this branch validated are now merged, body's scope note updated):
The Tests-Model rerun on the rebased head is the check for the ListLogs internal error you saw — that class matches the now-merged #1809. |
NumaryBot
left a comment
There was a problem hiding this comment.
NumaryBot posted 1 new inline finding.
Summary: #1659 (comment)
NumaryBot
left a comment
There was a problem hiding this comment.
NumaryBot posted 1 new inline finding.
Summary: #1659 (comment)
NumaryBot
left a comment
There was a problem hiding this comment.
NumaryBot posted 1 new inline finding.
Summary: #1659 (comment)
NumaryBot
left a comment
There was a problem hiding this comment.
NumaryBot review complete: no remaining inline findings.
Resolved 1 stale NumaryBot review thread (0 fixed, 1 outdated).
Summary: #1659 (comment)
gfyrag
left a comment
There was a problem hiding this comment.
[P2][blocking] Require the documented gRPC code for INDEX_BUILDING
Location: tests/antithesis/workload/bin/cmds/model/singleton_driver_model/queries.go:658-665 (isIndexNotReady)
Evidence: isIndexNotReady matches only the ErrorInfo reason. HasErrorReason is independent of the status code, so an InvalidArgument, FailedPrecondition, or any other gRPC status carrying INDEX_BUILDING is classified as the expected not-ready response. The adjacent isIndexNotFound helper correctly requires both FailedPrecondition and INDEX_NOT_FOUND, while the comment here specifies Unavailable plus INDEX_BUILDING.
Impact: the model oracle accepts an API error-code regression instead of emitting an Antithesis finding, weakening the exact failure signal this PR adds.
Resolution: require status.Code(err) == codes.Unavailable together with the INDEX_BUILDING reason, and add a wrong-code/same-reason regression.
The three blockers from the immediately preceding review are fixed: status polling is locally served, readiness is bound to the sampled creation frontier, and learned inserted_at is compared. The later validator-routing and INDEX_NOT_FOUND fixes are also sound. This is one genuinely new finding.
DECISION: REQUEST CHANGES
Head reviewed: ab7aefa
Blocking findings: 1
Non-blocking findings: 0
Previous findings: 3 fixed / 0 still valid / 0 outdated
Validation considered: nested singleton model unit tests + current CI
Residual risk: MEDIUM
|
Fixed in e5c98f1: isIndexNotReady now requires codes.Unavailable alongside the INDEX_BUILDING reason, matching isIndexNotFound's shape; TestIndexNotReadyRequiresDocumentedCode pins that the reason on a wrong code stays a finding. |
|
Review checkpoint for tomorrow: please rebase this PR onto the current |
|
Rebased onto |
d9194ce to
89e85d0
Compare
|
This PR extends the model-based Antithesis driver with validated coverage of the filtered, paginated read surface (ListAccounts, ListTransactions, ListLogs), index lifecycle/retype-window modeling, and a batch of test-harness infrastructure changes. All changed files are under Standards
Rejected as not material: the Spec
Reviewed independently by GLM (glm-5.3-flash) and Codex (gpt-5.6-sol) via Shipfox; verified and synthesized by GLM. |
|
Addressed the Shipfox review at 0563c47:
|
…ed metadata (EN-1625) A model-checking Antithesis driver (singleton_driver_model) that validates every read against an oracle of candidate ledger states: filtered/paginated account, transaction, and log queries (address, reference, date builtins, typed metadata fields, has-asset, boolean composition, negative probes), point reads, idempotency replay, restore cycles, and index lifecycle legality (create/drop/retype windows, per-replica readiness gating). Server fixes the model checking surfaced, kept with their tests: - EN-1724: bind declared types to index versions; a retype serves the old semantics until the atomic switch, and a duplicate CreateIndex during a live backfill no longer orphans a half-built keyspace. - query: resolve degenerate range bounds to the empty match; align index-free list reads; stamp-gate the account-by-asset scan at the read's pin (first-touch stamps in abya row values). - check: bound the stored exclusion scan to the archived audit boundary. - wal: recreate a vanished snapshot directory (and fsync its parent) instead of failing the save and losing the node. - state/indexbuilder: Antithesis invariant declarations for index registry lifecycle (seed suppressed by cache tombstone, row-life dating, index outliving its field declaration). The oracle gains the query window evaluators (ordered windows over candidate bases, per-base verdict diagnostics) and volume/metadata snapshot matching.
…eck learned inserted_at Three review findings on the model driver: The readiness poll now reads each node with stale consistency — the question is per-replica, and the linearizable default forwards exactly when the node is syncing, crediting a rebuilding follower with the leader's ready state. Each poll is bound to the incarnation it sampled via the index's create frontier (the committed sequence of its latest CreateIndex): a node's report counts only once its indexer folded past the create, and the verdict is discarded when the frontier moved while the RPCs were in flight — a drop+recreate reuses the canonical, and an all-replicas-ready snapshot of the dead incarnation must not promote its still-backfilling successor into a false 'rejected while active' finding. txRecordMatches compares the learned inserted_at: once learned it drives inserted_at filter evaluation, so a row serving a different value must fail row equality. Both new guards and the equality check carry regressions verified red with the guard weakened.
… validators ErrIndexBuilding rides codes.Unavailable, which sits inside internal.IsTransient — so the account and transaction query paths bailed on it as a skippable blip before their indexed validators ran, and a server wrongly rejecting an index the model holds active was silently accepted. The transient bail now peels the INDEX_BUILDING reason off, classifyIndexedQueryError buckets it as not-ready, and the asset validator's code guard accepts the Unavailable+reason shape.
Any FailedPrecondition from an indexed list was accepted as index-not- ready, letting an unrelated precondition regression be explained away as a missing index. All three match sites (the classifier, the asset validator's guard, the log date-leaf refusal) now require the INDEX_NOT_FOUND reason, mirroring the INDEX_BUILDING check; a reasonless or unrelated FailedPrecondition stays a finding.
The hunt runs hard-coded MODEL_DUMP_BATCHES=1; generate-manifests.sh substitutes __MODEL_DUMP_BATCHES__, so the opt-in flag could no longer disable dumping and every k8s run paid full base64 request logs.
…atch isIndexNotReady matched the INDEX_BUILDING reason on any status code; like isIndexNotFound it now requires the documented wire shape (Unavailable), so a reason riding the wrong code surfaces as the API regression it is.
A retype-window finding is diagnosable from its details only with the leaf bounds — which coercions the serving types apply to them decides the verdict — and the Field leaf printed just its key.
Split the shared 'kind-mismatched field query rejected' Reachable name per
target (transactions/accounts) — Antithesis merges assertion sites by name,
collapsing the two coverage signals. The log-recheck diagnostics surface
their RPC/stream errors into the finding details ('recheck failed: ...')
so a failed diagnostic is distinguishable from a genuinely empty server
view. testing.md's model-checker section now covers the query/index files
and the list-read guidance.
0563c47 to
d50f434
Compare
NumaryBot
left a comment
There was a problem hiding this comment.
NumaryBot posted 1 new inline finding.
Summary: #1659 (comment)
…t match The documented pre-consensus retry guarantee is the ResourceExhausted + WRITES_BLOCKED_DISK_FULL tuple; the reason under any other code is an unexpected response and must surface, not retry.
NumaryBot
left a comment
There was a problem hiding this comment.
NumaryBot review complete: no remaining inline findings.
Resolved 1 stale NumaryBot review thread (1 fixed, 0 outdated).
Summary: #1659 (comment)
Summary
Extends the model-based antithesis driver (
singleton_driver_model) with validated coverage of the filtered, paginated read surface: every list page is checked as an exact ordered window against the oracle, across the full index lifecycle.Phase 1 — index lifecycle + has-asset: the generator churns CreateIndex/DropIndex; the oracle tracks each index as absent/ambiguous/active with a per-replica readiness poller (
GetIndexStatus, promote on CurrentVersion>0 everywhere, demote on any not-ready).everAssetmodels the account-by-asset projection — asset touches recorded at END of bulk mirroring the exclusion projection exactly.Phase 2 — tx builtins: reference (exact) and the three date fields (timestamp / inserted_at / reverted_at ranges). Server-stamped dates are LEARNED from commit-response logs (
LearnTxStamps) — deterministic FSM outputs, upgrading read validation from skip-if-unknown to equality.matchTxFilteris three-valued Kleene: an unlearned stamp makes the row optional in the predicted window (txWindowMatcheshandles optional rows with exact pageSize-truncation semantics).Phase 4 — address-on-transactions: per-tx account→tx index membership (
indexedAddrs, src/dst bits) stamped at end of bulk under the samecellExcludedverdict as everAsset; evaluation mirrors the server's two-step resolution (V+M attributes universe, then the mapping index) — a purged, metadata-less account stops reaching its transactions.Phase 3 — metadata Field indexes: string/int(+datetime)/uint/bool/exists(include_null) on both targets, evaluated with the server's own coercion (
commonpb.TypeMatches/ConvertMetadataValue). The compiler's per-leaf order (schema → ready → kind coercion) is one shared per-candidate verdict; kind mismatches must reject as FILTER_COMPILATION_ERROR. CreateIndex on undeclared fields and RemoveMetadataFieldType's DroppedIndex are modeled and probed. Retypes of INDEXED keys are generated too (EN-1724's per-version bindings, #1829, made the serving window well-defined): the driver models each retype's serving window with a two-phase closure proof overGetIndexStatus(last_indexed_sequence+pending_version), accepts either binding while the window is open, and requires the new binding once closed.Harness / infrastructure scope (beyond query coverage)
These ship in the same PR because the query soaks depended on them; each is isolated and individually documented:
ANTITHESIS_API_KEY/ANTITHESIS_TENANTauth,k8s-launch-minutes,check-run, and a 72-hourcheck-k8s-image-freshnessgate intests/antithesis/Justfile— soak dispatches against week-old images kept invalidating results.env -u SOURCE_DATE_EPOCHon four Justfile build recipes: reproducible-build stamping broke image-freshness detection.run_model_test.sh) build servers with-tags invariantsand plumbMODEL_DUMP_BATCHESfor deterministic offline replay of findings.WRITES_BLOCKED_DISK_FULLreclassified as transient inworkload/internal/client.go: fault-injected disk pressure is an environment condition, not a server verdict; treating it as fatal aborted soaks on the injector's schedule. This applies to every workload, not just the model driver.Bugs this work surfaced (all fixed)
Notes
Jira: EN-1625