Skip to content

Housekeeping and prep for the catalog-test harness - #3415

Merged
jgraettinger merged 5 commits into
masterfrom
johnny/v2-tests-1-housekeeping
Aug 31, 2026
Merged

Housekeeping and prep for the catalog-test harness#3415
jgraettinger merged 5 commits into
masterfrom
johnny/v2-tests-1-housekeeping

Conversation

@jgraettinger

@jgraettinger jgraettinger commented Aug 27, 2026

Copy link
Copy Markdown
Member

Description:

Stack 1 of 5, replacing the V1 catalog-test machinery with a Rust harness. This one clears the decks: three commits delete dead scaffolding, two are small correctness fixes that the rest of the stack depends on.

Read these two:

  • examples: shuffle derivations on the key their reductions requireshuffle: any compiles to an empty shuffle key, which both runtimes resolve to the source collection key. A derivation with an order-dependent reduction must shuffle on a key that pins each of its output keys to a single shard, which the source key does not in these three cases. citi-bike/stations flakes ~35% of runs under multi-shard catalog tests; last-seen and stock/daily-stats carry the same defect but can't expose it today.
  • doc: compare numbers of differing representation under an epsilondoc::diff compared floats under a magnitude-scaled epsilon only when both sides were floats. An integer against a float fell through to exact comparison, which orders 0 before 0.0 — a distinction JSON Schema does not draw. Two integers still compare exactly.

Skim these three:

  • mise: pin usage 6.4.0 — routine pin refresh, three majors behind. No task's #USAGE spec changes.
  • plans: retire plans/ directory — point-in-time design docs for completed or superseded work, plus the two READMEs that cited them.
  • tests: retire the dead shell end-to-end suite — nothing in .github/ references tests/run-all.sh, so these catalogs, row fixtures, and the SSH-forwarding docker-compose scaffolding have been dead weight. The sshforwarding fixtures carried committed SSH private keys. flowctl-go api await existed solely to serve run-end-to-end.sh and goes with it.

Workflow steps:

No user-facing change.

Documentation links affected:

None.

Notes for reviewers:

ghcr.io/estuary/source-test:dev remains referenced by go/bindings/testdata/build.flow.yaml and crates/shuffle/tests/*.flow.yaml, which are unaffected by removing tests/source-test/.

The examples change lands here, ahead of the stack, because PR 3 switches CI's ci:catalog-test to the multi-shard runtime-next runner — landing the spec fix first keeps every rung green. The one thing to watch on this PR is that the examples still pass under V1 flowctl-go test, which is what CI runs at this point in the stack.


Stack — each PR is based on the one above it, so review only the top commits of each.

  1. Housekeeping and prep for the catalog-test harness #3415 — Housekeeping and prep ← you are here
  2. runtime-local: extract the local task-drive layer from flowctl #3416 — runtime-local: extract the local task-drive layer
  3. catalog-tests: the catalog test harness, and flowctl raw test #3417 — catalog-tests: the harness, and flowctl raw test
  4. control-plane-api: run publication tests on catalog-tests #3418 — control-plane-api: run publication tests on catalog-tests
  5. Remove the V1 catalog-test machinery #3419 — Remove the V1 catalog-test machinery

Routine refresh of a stale pin — `usage` parses the `#USAGE` specs in
`mise/tasks/`, and 3.5.4 is three majors behind. No task's spec changes; the
`--help` and flag handling of every task that declares one is unaffected.
These were point-in-time design docs for completed or superseded work;
drop the dangling references to plans/runtime-v2/plan.md in the two
READMEs that cited it.
The shell-driven end-to-end suite under tests/ has not been exercised by CI:
nothing in .github/ references tests/run-all.sh, so these catalogs, row
fixtures, and the SSH-forwarding docker-compose scaffolding have been dead
weight. The sshforwarding fixtures also carried committed SSH private keys.

`flowctl-go api await` existed solely to serve run-end-to-end.sh, and goes
with it.

ghcr.io/estuary/source-test:dev remains referenced by
go/bindings/testdata/build.flow.yaml and crates/shuffle/tests/*.flow.yaml,
which are unaffected by removing tests/source-test/.
`shuffle: any` compiles to an empty shuffle key, which both runtimes resolve
to the *source* collection key. Only documents of one shuffle key reduce in
source order, so a derivation with an order-dependent reduction must shuffle
on a key that pins each of its output keys to a single shard -- which the
source key does not, in these three cases.

`stations` flaked under multi-shard catalog tests (~35% of runs). A bike's
relocation-arrival at a station and its ride-departure from that station are
separate source keys, so they landed on different shards, and their `stable`
set add / remove then reduced in whichever order the two shards' drains raced
to. Shuffling on /bike_id keeps a bike's events on one shard and in order;
events of *different* bikes commute, because the set is keyed on the bike ID
and the arrival / departure counters are sums.

`last-seen` (keyed on the bike, last-write-wins) and `stock/daily-stats`
(firstWriteWins / lastWriteWins over a day's ticks) carry the same defect.
Neither test can expose it today -- neither puts two documents of one output
key into a single transaction, so the race window never opens -- but both
specs are wrong for multi-shard operation.
`doc::diff` compared floats under a magnitude-scaled epsilon, but only when both
sides were floats. An integer against a float fell through to the exact
`json::node::compare`, which orders `0` before `0.0` — a distinction JSON Schema
does not draw, and neither should a diff. Meanwhile a reduction that lands on
`8.000000000000002` where the expectation says `8` is floaty funny bitness, not a
difference worth reporting.

Both sides are now taken as `f64` and compared under the same scaled epsilon
whenever either side is a float. Two integers still compare exactly: the epsilon
scales with magnitude, so admitting it there would collapse distinct IDs and
neighboring nanosecond timestamps.

Also note a location present in the actual but absent from the expectation, which
previously reported an unannotated `actual` with no hint of why it differed.

@williamhbaker williamhbaker left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM

@jgraettinger
jgraettinger merged commit 04f7b85 into master Aug 31, 2026
11 checks passed
@github-actions github-actions Bot added pending:agent Merged, in the control-plane-agent image, and not yet rolled to flow-agent pending:agent-api Merged, ships via Deploy agent-api, and not yet deployed pending:flowctl Merged, changes the flowctl binary, and not in a published release and removed pending:agent-api Merged, ships via Deploy agent-api, and not yet deployed pending:agent Merged, in the control-plane-agent image, and not yet rolled to flow-agent labels Aug 31, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

pending:flowctl Merged, changes the flowctl binary, and not in a published release

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants