- Declare the decided feature graph in the manifest: sqlite default-on (rusqlite 0.40 bundled), postgres (tokio-postgres 0.7 + deadpool-postgres 0.14), mem (dependency-free), pg-lo pulling the shared pg driver cluster only (no postgres implication, ADR-010 §1), ops (alkcall 0.8.1, default-off); local ungated - Replace the placeholder crate body with the module skeleton: lib.rs re-export shape, ungated stubs (hashing, error, backend, facade, dispatch, gc, local), engine stubs behind #[cfg(feature)] (mem, pg_lo, postgres, sqlite, ops); stubs are doc-comment-only so wave-1 tasks own the module bodies Verification: cargo test green (default); cargo check --all-features resolves the full graph; cargo check --no-default-features --features pg-lo resolves with rusqlite provably absent (tree-inverted match) — the ADR-010 §1 no-implication rule; clippy --all-targets -D warnings and cargo fmt --check clean. Task: tasks/scaffold-crate-features.md (wave 1)
5.2 KiB
id, name, status, depends_on, scope, risk, impact, level, tags
| id | name | status | depends_on | scope | risk | impact | level | tags | ||
|---|---|---|---|---|---|---|---|---|---|---|
| scaffold-crate-features | Crate scaffold — ADR-013 §4 feature graph and module skeleton | completed | narrow | low | project | implementation |
|
Description
Replace the placeholder crate body with the real skeleton, so every later task lands in an existing, compiling structure with the decided feature graph present from the first commit:
- Feature graph per ADR-013 §4 (backends-and-dispatch.md's table
is the spec home):
sqlite(default-on, carries rusqlite with thebundledfeature — match alkstore's engine manifests as the family baseline, verifying current compatible versions at implementation),postgres(tokio-postgres + deadpool-postgres),mem(no driver — dependency-free),pg-lo(the shared pg cluster: tokio-postgres + deadpool-postgres; must not implypostgres— ADR-010 §1's feature-graph consequence),ops(alkcall, default-off — published crate, version dep per the sibling posture,alkcall = "0.8.1").localis ungated (no feature, no dependency).default = ["sqlite"]. - Module skeleton under
src/:lib.rsre-export shape with module stubs for the planned tree (keys/hashing, error, backend, facade, dispatch, gc; engine modules behind#[cfg(feature)]). Removepub fn placeholder(). Modules are one per file, re-exported fromlib.rs(AGENTS convention 10); engine module files exist gated and empty. - Base dependencies stay as-is (tokio, thiserror, parking_lot). Driver deps declared now with no consuming code — unused optional deps are inert, and the graph being a decided artifact (ADR-013 §4) is why it lands whole.
Family standards apply from this commit onward: tokio async runtime,
thiserror errors, no panics in library code, no unwrap()/expect()
outside tests, no comments in code (doc comments on public API fine).
Acceptance Criteria
cargo testgreen with the default build (sqlite feature on, no engine code yet)cargo check --all-featuresresolves the full feature graph (sqlite, postgres, mem, pg-lo, ops) with their driver clusterspg-loalone (cargo check --no-default-features --features pg-lo) resolves without pulling postgres-only machinery (the no-implication rule, ADR-010 §1)cargo clippy --all-targets -- -D warningsandcargo fmt --checkgreenlib.rscarries the module re-export shape; no placeholder function remains
References
- docs/architecture/overview.md (dependency posture table)
- docs/architecture/backends-and-dispatch.md (the engine/feature table)
- docs/architecture/decisions/013-family-composition-reactive-boundary-and-feature-graph.md §4
- docs/architecture/decisions/010-backend-io-seams-and-fleet-state-home.md §1 (pg-lo no-implication)
- /workspace/@alkdev/alkstore/tasks/scaffold-workspace.md (the family scaffold precedent)
Notes
- Feature graph declared exactly per ADR-013 §4's table:
default = ["sqlite"];sqlite = ["dep:rusqlite"];postgres = ["dep:tokio-postgres", "dep:deadpool-postgres"];pg-lopulls the same shared pg driver cluster bydep:reference only (no feature implications — thepostgresfeature name appears nowhere in its declaration);mem = [];ops = ["dep:alkcall"].localungated, no feature, no dependency. - Driver versions verified at implementation time (crates.io + the
alkstore engine manifests as the family baseline):
rusqlite = "0.40"(bundled; resolves 0.40.2, matching alkstore-sqlite's baseline),tokio-postgres = "0.7"(0.7.18),deadpool-postgres = "0.14"(0.14.2),alkcall = "0.8.1"(the exact pin the task specified — present on the public registry). - Module skeleton:
lib.rsre-export shape with one module per file — ungated stubshashing,error,backend,facade,dispatch,gc,local; gated stubsmem,pg_lo,postgres,sqlite,opsbehind#[cfg(feature)]. All stubs are doc-comment-only;pub fn placeholder()removed. Stub content stays empty so the wave-1 implementation tasks (core-hashing-keys, core-error-model, core-trait-and-types) own their module bodies. Cargo.lockis untracked in this repo (workspace-wide exclude, consistent with all prior commits) — left untracked.- No CI wiring added (manual CI per docs/plans/implementation.md).
Summary
Crate scaffold complete per ADR-013 §4: the full decided feature
graph (sqlite default-on with rusqlite bundled; postgres, mem,
pg-lo default-off; ops with alkcall 0.8.1; local ungated) is
declared in the manifest with inert optional driver dependencies, and
the module skeleton (lib.rs re-export shape + 12 doc-comment-only
module stubs, engine modules behind #[cfg(feature)]) replaces the
placeholder body. All acceptance criteria verified: cargo test green
with defaults (rusqlite only non-base dep in the default tree),
cargo check --all-features resolves the whole graph including
alkcall, cargo check --no-default-features --features pg-lo resolves
with rusqlite provably absent (cargo tree -i rusqlite matches
nothing) proving pg-lo implies no other engine feature, and
cargo clippy --all-targets -- -D warnings + cargo fmt --check
are clean.