docs/plans/implementation.md records the wave structure (core -> substrate fork || pg engine -> sqlite engine -> contract suite -> release), the decided points (contract-suite layout = option (a), engine-tests vs equivalence-suite split, no CI, mem-engine/fuzzing deferrals surfaced), and the review-gate rhythm. Wave 1 (foundations): workspace scaffold, core errors/validation, value types, trait surface, contract-suite scaffold (+ADR-022), review gate. Wave 2 (substrate fork): fork scaffold/provenance, connection+watcher port, queue-op re-derivation on contract v1, provenance/floor close, review gate.
3.2 KiB
3.2 KiB
id, name, status, depends_on, scope, risk, impact, level, tags
| id | name | status | depends_on | scope | risk | impact | level | tags | |||
|---|---|---|---|---|---|---|---|---|---|---|---|
| contract-suite-scaffold | Contract-suite crate scaffold + ADR-022 (suite layout decision) | pending |
|
narrow | low | phase | implementation |
|
Description
Scaffold the contract suite as a fourth, internal, unpublished crate —
alkstore-contract-suite — per the layout decision recorded in
docs/plans/implementation.md (option (a)): property tests
parameterized over a Store factory, consumed by each engine crate as
a dev-dependency. This discharges ADR-017 §4.2's "layout decided at
implementation" deferral; the decision gets its own ADR (ADR-022) since
it shapes the pairing instrument ADR-017 §4 names.
The crate:
- Workspace member,
publish = false, depends onalkstoreonly. - Exposes a
StoreFactorytrait (or function alias — implementer's choice, but one shape, documented): something that yields a freshBox<dyn Store>-shaped store over an isolated backing store (fresh file / fresh schema), plus teardown. The exact factory shape may evolve when engines adopt it (wave 3/4 feedback) — the ADR records the layout decision, not a frozen API. - A
tests/harness that runs the property set against a supplied factory, structured so each backlog row is one named, independently runnable property with a version-stamp slot (ADR-017 §4.2: each row version-stamped with the contract change that added it — a doc-comment or attribute convention, decided here and used by every later row). - One exemplar property implemented end-to-end to prove the harness
works — the reserved-name/empty-name validation property (pure
contract, engine-independent, runnable against any factory): every
name-bearing entry point rejects empty with
InvalidNameand reserved-prefix withReservedName, on auto-commit and tx paths alike. This row is version-stampedADR-008 §4. - Engine crates get the dev-dependency edge now (empty suite compiles against them trivially once they have code; the edge existing early means wave 3/4 tasks adopt the harness rather than debate it).
Acceptance Criteria
alkstore-contract-suitecrate exists,publish = false, depends on core only, compiles in the workspace- Factory abstraction defined and documented; exemplar property (name validation) green against a trivial in-crate mock store
- Version-stamp convention established and documented in the crate (used by the exemplar row)
- ADR-022 written (
docs/architecture/decisions/022-contract-suite-layout.md): option (a) chosen, rationale (one normative owner per property, ADR-012 §2 mirror), the factory-shape latitude stated, ADR-017 §4.2 deferral discharged; ADR index tables in docs/architecture/README.md and overview.md updated - Engine crate manifests carry the dev-dependency edge
cargo testworkspace-wide, clippy-D warnings, fmt clean
References
- docs/architecture/decisions/017-contract-versioning.md §4.2
- docs/plans/implementation.md (Decided points)
- docs/architecture/core-contract.md §Verification backlog
Notes
To be filled by implementation agent
Summary
To be filled on completion