Files
alkblobs/tasks/suite-column-fleet.md
T
glm-5.3-flash 009de420e1 docs(tasks): decompose wave 6 — the fleet GC mechanism, the architecture's most intricate state machine under concurrency
- store-fleet-construction: the fleet: true declaration slotting into
  the fleet-capable constructors (the recorded non-event), the
  composite fleet-validity predicate enforced at the constructor
  (kv=postgres AND pg-lo-same-instance OR local-on-declared-shared-
  media OR kv-only re-routing), the TTL/owner-id fleet state, the
  same-instance probe design point
- engine-pg-lo-joint: the pg-lo joint contribution — staged-put
  mechanics (512 KiB knee, CAS, transactional LO creation) into the
  store-held PgJointTx, the wave-5 deferred API-shape design point
- store-fleet-put: the joint entry+pin tx driver (amendment A1's
  drop discipline lands here — its recorded owner), the pin guard's
  TTL/3 renewal form, the dedup upsert-renewal, pin-first/
  publish-second for large=local, the consolidation one-tx put
- store-fleet-sweep: the SQL sweep lease (ADR-013 §2 semantics),
  SQL-level delete arbitration on the direct + window-execution
  paths, the expired-pin reaping clause (the seam as the named home
  for fleet-clause growth), the fleet liveness registration verb,
  the two-domain arbitration composition
- suite-column-fleet: the fleet column — two-instance factories over
  one schema, the exact-count fleet sweep rows (the wave's gate),
  lease contention, cross-instance arbitration, TTL/renewal rows,
  the fleet-validity predicate rows
- review-wave-6: the fleet gate per the plan, plus a standing
  code-smell/hygiene block — cargo doc --no-deps asserted clean
  (the twice-bitten PGLO-1 rustdoc private-link class), the
  allow(dead_code) scope notes audited against their remainder,
  stale wave-6 forward references, and task-Summary-vs-diff
  correctness

Harness server cited in every server-touching task: dockerized
pglo-poc (postgres:16-alpine) on :15432, db blobs, postgres/poc
(verified live 2026-10-12); env-driven ALKBLOBS_PG_* settings, clean
server-less skips, acceptance requires green against the server.

Dependency graph validated: two parallel roots (construction, pg-lo
joint), put merging them, sweep parallel to put, the fleet column
merging, the review gate last; no cycles.
2026-10-12 14:22:55 +00:00

7.7 KiB

id, name, status, depends_on, scope, risk, impact, level, tags
id name status depends_on scope risk impact level tags
suite-column-fleet Conformance suite — the fleet column (exact-count fleet sweep outcomes under concurrency) pending
store-fleet-put
store-fleet-sweep
moderate medium phase implementation
wave-6
suite
fleet
postgres

Description

Grow the fleet column — the suite's proof that the architecture's most intricate state machine holds under concurrency (the wave's gate: "exact-count fleet sweep outcomes against live postgres", docs/plans/implementation.md §Wave 6). The column runs under --features postgres (fleet mode requires kv = postgres — the composite predicate), rides the SKIP posture (server-less runs skip cleanly; acceptance requires green against the server), and extends the factory contract to the fleet shape: two store instances over one shared pool.

  • The fleet factory (tests/conformance/fleet_column.rs): the postgres column's schema-per-open pattern adapted — a fleet factory mints one schema and vends two (or more) Store instances over it, each fleet: true, each with its own owner id (the instances share the pool; the pin rows compose by owner — the fleet's actual definition, ADR-011/ADR-012 §3). Teardown drops exactly the minted schemas (DROP SCHEMA … CASCADE, the postgres column's registry pattern — panicking-row-safe, idempotent, owned). The test tuning: window delay 0 (execute-on-next-sweep) and a short test TTL (the fleet constructor parameter — the renewal/expiry rows need observable cadences; the TTL is a constructor parameter, not API, so the column declares its tuning). A kv-only fleet factory (the re-routing posture's client shape) and a consolidation fleet factory (kv = postgres + large = pg-lo, same instance) join as the column's second/third shapes.
  • The fleet-validity rows (the predicate at the constructor): every fleet-valid configuration constructs; every non-fleet-valid configuration is a constructor error (kv ≠ postgres, mem anywhere, local without the shared-media declaration, pg-lo cross-instance) — the predicate's clause-per-row form.
  • The joint entry+pin tx rows (through the public put, not the seam): entry + pin row commit together (an independent connection sees both or neither); the dedup re-put upsert-renews the row; a second instance's re-put composes a second row (protection by row); the pg-lo consolidation round-trip (one tx over the shared instance, byte-exact large-entry form).
  • The TTL/renewal rows: the guard's TTL/3 renewal moves the row's expiry (the short test TTL makes the cadence observable); a guard dropped past expiry never resurrects its row (the never-resurrect semantics through the facade); a paused holder (renewal stopped) loses protection at expiry — the delete-then-recover backstop (a byte-identical re-put recovers).
  • The exact-count fleet sweep rows (the wave's gate — INV-4's engine-gated fleet form, store-api.md §Invariants 4: "fleet postures assert it under DB-backed pins + the advisory-locked sweep, with the exact-count sweep-outcome shape run against dockerized postgres"):
    • the two-instance exact-count shape: instance A pins an entry (its row), instance B sweeps — the pinned entry survives, the unpinned twins delete, counts exact against the staged schedule;
    • the lease contention row: two instances sweep concurrently — exactly one sweeps, the other aborts SweeperLock as report data with nothing deleted;
    • the cross-instance arbitration row: a foreign owner's un-expired pin row refuses instance B's direct delete (GcRefuse); after the row expires (renewal stopped, short TTL), the delete proceeds;
    • the race across the window delay in its fleet form: a put landing during the delay (its row committed before its entry is visible) survives the next sweep's execution-time SQL re-arbitration;
    • the maintenance-step row: expired rows reaped exactly (the GC-of-GC cleanup), un-expired rows survive;
    • the fleet liveness row: a test-owned embedder table's rows protect through the fleet registration verb (the schema-ownership rule asserted — the engine never created the table).
  • The kv-only re-routing row: the fleet kv-only client shape rejects over-threshold puts at put time (ADR-012 §6.2's machinery, fleet edition) — the re-routing posture's store-side half.
  • README amendments (the convention's normative test-side home): the fleet rows table in §Columns beyond the reference set; the column plan's SKIP-posture note naming the fleet column; current state.
  • Connection settings ride the environment — the established harness convention: ALKBLOBS_PG_HOST/PORT/USER/PASSWORD/DB, the reachability probe gating the rows. The harness server: dockerized pglo-poc (postgres:16-alpine) on :15432, db blobs, user/password postgres/poc — verified live 2026-10-12; the container is long-running in the dev environment. Concurrency rows are deterministic by construction (the lease/arbitration outcomes are decided by the server, not by timing) — where a row needs ordering, the window delay and the TTL tunings provide it; no sleep-based assertions.

Acceptance Criteria

  • The fleet column green against the harness server (pglo-poc, :15432): the fleet-validity rows, the joint-tx rows, the TTL/renewal rows, the exact-count fleet sweep rows (two-instance survival, lease contention, cross-instance arbitration, the race across the delay, the maintenance step, the fleet liveness row), and the kv-only re-routing row — every row ADR-stamped and traceable to the backlog
  • The fleet factory contract holds: one schema, two+ instances over it (distinct owner ids), teardown drops exactly the minted schemas, panicking-row-safe — structurally exercised
  • Server-less runs skip cleanly (the reachability probe; the default-build gates stay green with the column skipped)
  • README amendments recorded (the fleet rows table; current state)
  • cargo test (default) green — the column compiles out; cargo test --features postgres green server-less (skipping) and green against the server at acceptance; cargo test --all-features green (the consolidation factory's home); cargo clippy --all-targets -- -D warnings and cargo fmt --check green (default + the postgres/pg-lo variants + --all-features)

References

  • tests/conformance/README.md (the conventions this grows against; §The factory contract, §The SKIP posture, §The schedule-relative reading, §Columns beyond the reference set)
  • tests/conformance/postgres_column.rs (the SQL-backed column pattern — the schema-per-open factory this extends to the fleet shape)
  • tests/conformance/factory.rs (the factory contract)
  • docs/architecture/store-api.md (§Invariants 4 — the engine-gated fleet form this column asserts)
  • docs/architecture/decisions/008-trait-size-probe-fleet-gc-and-large-engines.md §2 (the fleet mechanism the rows assert)
  • docs/architecture/decisions/012-pre-decomposition-consistency-rulings.md §3 (the declaration), §4 (the host), §6.6 (the fleet liveness verb)
  • docs/architecture/decisions/013-family-composition-reactive-boundary-and-feature-graph.md §2 (the lease semantics the contention row asserts)
  • docs/architecture/decisions/007-two-kv-engines-sqlite-and-postgres.md §5 (the exact-count sweep-outcome gate against dockerized postgres)
  • tasks/store-fleet-put.md, tasks/store-fleet-sweep.md, tasks/store-fleet-construction.md (the machinery the rows exercise)

Notes

To be filled by implementation agent

Summary

To be filled on completion