10 KiB
id, name, status, depends_on, scope, risk, impact, level, tags
| id | name | status | depends_on | scope | risk | impact | level | tags | |||
|---|---|---|---|---|---|---|---|---|---|---|---|
| release-crate-docs | Crate docs final pass — rustdoc across the four published crates | completed | moderate | low | component | implementation |
|
Description
The plan's wave-8 "crate docs" item: the public-API rustdoc of the
four published crates (alkstore, alkstore-sqlite,
alkstore-postgres, alkstore-mem) gets its release pass. The crate
docs are load-bearing — core's doc text is part of the contract
artifact (ADR-001 §1; AGENTS.md: "core's docs are part of the
contract") and the engine crates' lib docs carry the ADR-016 honesty
postures — so this is an accuracy-and-completeness pass, not prose
polish.
- Build clean:
cargo doc --no-deps(workspace) zero warnings — broken intra-doc links, ambiguous links, missing docs. AlsoRUSTDOCFLAGS="-D warnings" cargo doc --no-depsas the recorded gate posture. - Missing-docs audit: every public item (traits, trait methods,
types, variants, fields, functions — including the
#[doc(hidden)]re-exports the fuzz wave added at the three engine roots, which must stay documented as fuzz/test-only surfaces) carries doc text; gaps filled. Consider whether# is warranted per crate — decide and record; adding it is the enforcement posture, skipping it needs a reason. - Accuracy spot-check against the specs: core's trait/type doc
text read against
core-contract.md(the docs are contract text — a drift is a defect); each engine's lib-doc posture claims (writer-parking, connection budget, honest-ephemeral, wasm subset) read againstdeployment.mdand the engine specs. The wave-6 gate's inline doc fixes are the precedent for the honesty standard. - Crate-level
//!docs: each published crate's root module doc names its posture, its ADR charter, and (for engines) its deployment boundary — verify all four do, fill what's missing. - Examples: core's public surface has no doctest examples; decide
whether a minimal compile-checked example (a
MemStoreopen + one mechanism round-trip) belongs in the core or mem crate docs — the honest-ephemeral engine is the zero-config one, so it is the natural example carrier. Either land it or record the not-taken call.
Acceptance Criteria
cargo doc --no-deps(workspace) zero warnings; the-D warningsdoc gate posture recorded- Missing-docs audit recorded (public items × 4 crates); gaps
filled; the
#![deny(missing_docs)]decision made and recorded - Core doc text spot-checked against core-contract.md; engine lib-doc posture claims spot-checked against deployment.md — drifts fixed or recorded
- The doc-hidden fuzz re-exports documented as fuzz/test-only at all three engine roots
- The example decision made (landed or recorded not-taken)
- Workspace gates green (
cargo build,cargo test, clippy-D warnings, fmt)
References
- docs/plans/implementation.md §Wave 8
- docs/architecture/core-contract.md (the contract the core docs must match)
- docs/architecture/deployment.md (the matrix the engine posture docs must match)
- docs/architecture/decisions/016-deployment-honesty.md (the honesty carriers)
- docs/architecture/decisions/024-mem-engine.md §5 (the wasm identity the mem crate docs carry)
Notes
-
#![deny(missing_docs)]decision:#![warn(missing_docs)]adopted at the four published crate roots instead of deny — with rationale: the standing merge gate (cargo clippy --all-targets -- -D warnings) promotes rustc lints to errors anyway, so the lint is enforced while plaincargo build/cargo testremain unblocked mid-task (a deny attribute fails every build the moment a pub item lacks text, punishing incremental work). Recorded as the standing posture in AGENTS.md's Verification Commands section alongside the doc-gate line. -
Doc gate posture recorded:
RUSTDOCFLAGS="-D warnings" cargo doc --no-deps— zero warnings, added to AGENTS.md's Verification Commands block as the doc gate. -
Missing-docs audit results (full-surface probe via
RUSTFLAGS='-Wmissing_docs' RUSTDOCFLAGS='-Wmissing_docs' cargo doc --no-deps, probe reports 0 after fixes): every public item across the four crates carries doc text. Gaps found and filled: theErrorenum's own doc + its four struct-variant fields (alkstore/src/error.rs); the sqlite substrate's two fuzz-surface functions (substrate/queue_ops.rs— their source-side docs had never been written; the pg/mem scheduler twins already had them). -
Core doc fixes against core-contract.md (drifts fixed): (1)
StreamHandle::trim_to's flat "trim emits no wake" corrected to the contract's exact row — no dedicated wake and no notify, with the SQLitedata_versionspurious-hint nuance (a trim commit does wake the watcher, contract-legal); (2) the ADR-023 §2 numeric-domain rules were missing from every affected method's doc text — added the extent rules (claim_batch/read_since/read_from_consumerand their tx twins:n/limit <= 0→ empty value), duration rules (try_lock/renew:ttl <= 0rejects, opaqueErr), the boundary-totality rule fortrim_to's horizon, and the shared domain-rule paragraph (store.rs module doc, per ADR-023 §2's own amendment text); (3) theQueueOpts"trusted as given" gloss drew the wrong criterion (opts-struct constants it names are trait-surface arguments) — reworded to the domain table's real boundary (enumeration by call-site kind); (4) store.rs's constructor prose gained the ADR-024 §4MemStore::new()exception clause (amended into the contract 2026-10-10). -
Engine doc fixes: (1) "all eleven
*_txmethods" was an off-by-one — the trait carries ten*_txops pluscommit; reworded in bothalkstore-sqlite/src/tx.rsandalkstore-postgres/src/tx.rsmodule docs; (2) the SQLitespawn_blockingrationale misstated the driver property (rusqliteConnectionisSend; the honest reason is that the substrate is sync machinery — std threads, blocking iterators) — reworded inalkstore-sqlite/src/lib.rs+store.rsper engine-sqlite.md; (3) the SQLite lib doc gained the missing third element of ADR-016 §3's mandated single-host prose — one-host cross-process supported (data_versionis cross-process by nature), matching deployment.md; (4) cosmetic: a malformed doc-comment indent line onPgOpts::max_size. -
Spec-side alignments (code docs + ADR win, spec aligned to match):
docs/architecture/engine-postgres.mdnow listslocksin the schema-family enumeration and rewords "advisory-lock-semantics TTL locks" to the ADR-008 §7 row-backed realization;docs/architecture/engine-mem.mdgained the one-clock-accessor line (no server clock to defer to) that the mem lib doc's wasm identity andclock.rsalready cited — the claim now has its spec home. -
Recorded, not fixed — two boundary-wording drifts for
release-contract-window-close(the task that owns the class-1 window's last dispositions): (1)EventReceiver::try_recv's error arms (DatabaseorClosed) are claimed in core doc text but not yet pinned in contract text — that task's §2 already decidesErr(Closed)mirroringWakeReceiver::try_recv(mem-test-pinned), so the doc text is a forward-claim of the decided disposition, left as-is; (2) the notify payload boundary: ADR-004/core-contract say "≤ 8000 bytes" loosely, but the engine (POC + test-pinned against a live server) rejects a serialization of exactly 8000 bytes — the server's NUL-inclusive budget — so acceptance is ≤ 7999; the pg engine's docs state the truthful predicate; a normative-spec wording amendment is the window task's call. -
Example decision: landed — the honest-ephemeral engine is the zero-config one, so
alkstore-mem's crate docs now carry the contract round-trip example (a compile-checked doctest:MemStore::new()→queue→enqueue→claim_one→job().id/JobStateasserts), with a pointer that the other engines' round-trip is identical via theiropenform. The mem lib's architecture paragraph dropped itscrate::state/crate::wakesintra-doc links (private modules — the private-intra-doc-link warning class) in favor of plain code spans. -
Fuzz re-exports (AC 4): verified all six
#[doc(hidden)]re-exports at the three engine roots carry the four-part fuzz/test-only disclosure, name the correct module of origin, and match the re-exported function's semantics — no changes needed. -
Status of record: 2026-10-11, gates green (
cargo build,cargo testincl. the new doctest,cargo clippy --all-targets -- -D warnings,cargo fmt --check,RUSTDOCFLAGS="-D warnings" cargo doc --no-deps, missing-docs probe 0).
Summary
The release doc pass over the four published crates: RUSTDOCFLAGS="-D warnings" cargo doc --no-deps is now the standing doc gate (recorded
in AGENTS.md) and the workspace builds docs with zero warnings (8
baseline rustdoc-warning classes fixed: broken Error::* links,
redundant explicit links, bracket-escape escapes, and a
private-intra-doc link). The #![warn(missing_docs)] enforcement
posture landed on all four crate roots (clippy gate enforces);
audit-probe reports zero undocumented public items after filling the
Error enum/field docs and the sqlite substrate's fuzz-surface fn
docs. Accuracy spot-checks ran core docs against core-contract.md and
engine lib-doc posture claims against deployment.md/ADR-016/ADR-024:
eight drifts fixed (trim_to wake nuance, the full ADR-023 §2
numeric-domain doc text + shared paragraph, the QueueOpts gloss, the
MemStore::new() constructor exception, the eleven-vs-ten tx-method
count, the SQLite Send-misstatement rationale, the missing
one-host-cross-process honesty element, a cosmetic indent), two
spec-side alignments made (pg locks table family + row-backed
wording; mem clock-accessor spec home), and two boundary-wording
dispositions recorded for release-contract-window-close
(try_recv arm pinning; the 8000-byte boundary's "≤" reading). The
example decision landed: alkstore-mem's crate docs carry the
zero-config queue round-trip doctest (green in the workspace test
run). All workspace gates re-verified green.