docs(tasks): the wave-1 review gate — the one-way-door audit green
Every gate check read against the cited ADR text: the key encoding holds byte-exact against ADR-002 (tags, lengths, rejects, sort order, preamble abstraction, live git-CLI interop, lowercase oid policy recorded); the trait + I/O seams + engine-state seam match ADR-003/ 010 and ADR-012 §5's reduced table; the error model's five variants and single-enum altitude reading match store-api.md/ADR-012 §6.5; the feature graph matches ADR-013 §4; all named design points audited consistent; the suite convention and backlog are traceable; family conventions clean. One inline fix: publish keyword `bao` -> `git` (excluded technology named in metadata). Wave 2 decomposition unblocked, no amendments. Verified: cargo test (26 lib + 4 conformance + 3 git-interop passed), cargo clippy --all-targets -- -D warnings, cargo clippy --all-features --all-targets -- -D warnings, cargo fmt --check, cargo check --all-features, cargo check --no-default-features --features pg-lo.
This commit is contained in:
1 parent
327b952e4d
commit
c1d9494c11
2 files changed
+105
-9
No files matched your search
+1
-1
@@ -6,7 +6,7 @@ rust-version = "1.88"
|
||||
license = "MIT OR Apache-2.0"
|
||||
description = "Content-addressed blob storage: multi-hash put/get/verify store with pluggable backends, transport- and protocol-agnostic"
|
||||
repository = "https://git.alk.dev/alkdev/alkblobs"
|
||||
keywords = ["blobs", "content-addressed", "storage", "gix", "bao"]
|
||||
keywords = ["blobs", "content-addressed", "storage", "git", "gix"]
|
||||
categories = ["asynchronous", "filesystem", "database"]
|
||||
exclude = [".opencode/", "AGENTS.md", "docs/reviews/", "docs/research/", "docs/plans/", "tasks/", "docs/sdd_process.md"]
|
||||
|
||||
|
||||
+104
-8
@@ -1,7 +1,7 @@
|
||||
---
|
||||
id: review-wave-1
|
||||
name: Wave 1 review gate — the one-way-door gate
|
||||
status: pending
|
||||
status: completed
|
||||
depends_on: [core-hashing-keys, core-error-model, core-trait-and-types, suite-scaffold]
|
||||
scope: narrow
|
||||
risk: low
|
||||
@@ -55,14 +55,14 @@ completion is what unblocks wave 2's decomposition.
|
||||
|
||||
## Acceptance Criteria
|
||||
|
||||
- [ ] Every gate check above read and verified against the cited ADR
|
||||
- [x] Every gate check above read and verified against the cited ADR
|
||||
text (not from memory of it)
|
||||
- [ ] Named design points each decided, recorded, and consistent with
|
||||
- [x] Named design points each decided, recorded, and consistent with
|
||||
the specs
|
||||
- [ ] Findings fixed inline or recorded as wave-2 amendments with
|
||||
- [x] Findings fixed inline or recorded as wave-2 amendments with
|
||||
owners
|
||||
- [ ] All gates re-run green after any fixes
|
||||
- [ ] Wave 2 decomposition unblocked (recorded in this task's Summary)
|
||||
- [x] All gates re-run green after any fixes
|
||||
- [x] Wave 2 decomposition unblocked (recorded in this task's Summary)
|
||||
|
||||
## References
|
||||
|
||||
@@ -76,8 +76,104 @@ completion is what unblocks wave 2's decomposition.
|
||||
|
||||
## Notes
|
||||
|
||||
> To be filled by implementation agent
|
||||
Every gate check was read against the cited ADR text (the files, not
|
||||
memory). Findings below; everything else passed.
|
||||
|
||||
- **Key encoding vs ADR-002 (the one-way door)** — verified byte-exact:
|
||||
`key := <alg byte> <digest>` (src/keys.rs), 0x01/0x02 assigned,
|
||||
0x00 reserved and rejected, total lengths 33/21 (encoding test),
|
||||
rejects-never-guesses over the full matrix (empty/truncated/
|
||||
over-long/unknown 0x00+0x03+0xFF, both widths), derived `Ord` ==
|
||||
physical byte order (sort-stability test), the preamble shared by
|
||||
both algorithms with only the hasher specializing (no
|
||||
special-casing, src/hashing.rs), the interop test drives the live
|
||||
`git hash-object` CLI for both algorithms over empty/short/binary/
|
||||
75-KiB content, and the oid hex policy (lowercase-only acceptance)
|
||||
is recorded in core-hashing-keys Notes and stated verbatim on
|
||||
`Digest::from_git_oid_hex`. No shape errors. The door holds.
|
||||
- **Backend trait + seams vs ADR-003/010/012 §5** — the seven methods
|
||||
(+ `put_staged`) with opaque byte keys, `size` metadata-only,
|
||||
`list` complete-and-well-formed by contract; the read cursor with
|
||||
both body families serving the ADR-006 slice+digest contract at one
|
||||
seam; the staged-put contract (staging cursor, commit publishes,
|
||||
every failure path converging on discard). The engine-state seam's
|
||||
clause families match ADR-012 §5's table: `EngineWindowState`
|
||||
(postgres/sqlite/pg-lo — `gc_window`-only schema rows for the
|
||||
latter two), `EngineFleetState: EngineWindowState` (postgres host
|
||||
only; sqlite's pin/sweep-lock bodies correctly absent — the dead
|
||||
machinery ADR-012 §5 dropped never existed here; `local`/`mem`
|
||||
excluded by construction).
|
||||
- **Error model vs store-api.md / ADR-012 §6.5** — the five variants
|
||||
exactly; payloads only where the spec writes one (`Io(String)`);
|
||||
the single-enum reading audited against the spec text and held: the
|
||||
facade's "re-exposes them with `GcRefuse` added" is faithfully a
|
||||
one-enum posture with the altitude discipline carried by doc
|
||||
comments and construction discipline (enforcement lands with the
|
||||
wave-2 facade, as scoped). `#[non_exhaustive]` correctly on
|
||||
`GcAbortCause` (ADR-012 §1's non-exhaustive-match ruling, made
|
||||
structural) and correctly absent from `Error` (no spec requirement).
|
||||
- **Feature graph vs ADR-013 §4** — the manifest table-matches exactly
|
||||
(`sqlite` default-on pulling only rusqlite; `postgres`/`mem`/`pg-lo`
|
||||
default-off pulling their own clusters; `pg-lo` does not imply
|
||||
`postgres`; `local` ungated; `ops` default-off). Verified
|
||||
`--no-default-features --features pg-lo` resolves with rusqlite
|
||||
absent.
|
||||
- **Named design points** — all audited consistent with the specs:
|
||||
single-enum error reading (above); `Backend` `pub(crate)` visibility
|
||||
(ADR-004: no consumer ever implements it; export later is purely
|
||||
additive); put-form shapes (`put` + `put_staged` with associated
|
||||
cursor types, kv engines carrying the degenerate staged form —
|
||||
required by store-api.md invariant 7); oid hex policy (lowercase-only);
|
||||
async shape (AFIT + associated types, RTN resolvable, no
|
||||
`async_trait`, no `dyn`).
|
||||
- **Suite convention** — the factory contract (fresh isolated store,
|
||||
idempotent teardown, `Send + Sync`), the `Contract stamp:` marker
|
||||
convention, and the seven-entry invariant backlog traceable to
|
||||
store-api.md §Invariants 1–7 (in-code traceability gate passing),
|
||||
with the mem-first column plan and the wave-2 `Store` binding point
|
||||
recorded.
|
||||
- **Family conventions** — no `unwrap`/`expect`/panic outside
|
||||
`#[cfg(test)]` (audited every occurrence); thiserror, tokio,
|
||||
parking_lot throughout; no user-comment violations (the three
|
||||
inline comments on `#[allow(dead_code)]` in facade.rs and the
|
||||
scoped `#![allow(dead_code)]` module attributes document why the
|
||||
suppression exists — accepted under the non-obvious-constraint
|
||||
exception); naming and one-module-per-file re-export shape clean.
|
||||
- **Inline fix applied** — the manifest's keyword list named `bao`,
|
||||
a technology this crate explicitly excludes (ADR-002 Decision
|
||||
class 3; ADR-006's whole-blob verification cap); replaced with
|
||||
`git`. Cosmetic publish-metadata only; no wave-2 consequence.
|
||||
- **Observations recorded, no amendment needed**: (1) the staged
|
||||
commit consumes the cursor and self-discards on failure — a
|
||||
cancellation mid-commit leaves residue handling to engine Drop
|
||||
bodies, which the contract delegates to engine tasks (waves 2–5);
|
||||
each engine's hygiene tests must cover its own cancellation story.
|
||||
(2) The store's verification pass reading staged bytes through the
|
||||
`StagingCursor: ReadCursor` supertrait is the one design-led
|
||||
extension of the ADR-010 text; it is what makes ADR-003's
|
||||
second-pass-over-staged-bytes rule expressible without the retaining
|
||||
the content stream — recorded in core-trait-and-types Notes and
|
||||
audited consistent.
|
||||
|
||||
## Summary
|
||||
|
||||
> To be filled on completion
|
||||
Wave-1 review gate complete: every gate check read against the cited
|
||||
ADR text line by line and verified — the one-way-door key encoding
|
||||
holds byte-exact against ADR-002 (including live git-CLI interop for
|
||||
both algorithms), the trait + I/O seams + engine-state seam match
|
||||
ADR-003/010 and ADR-012 §5's reduced table, the error model's five
|
||||
variants and single-enum altitude reading match store-api.md/ADR-012
|
||||
§6.5, the feature graph matches ADR-013 §4 (pg-lo implies nothing),
|
||||
all five named design points are recorded and consistent, the suite
|
||||
convention and backlog are traceable, and the family conventions are
|
||||
clean. One inline fix (publish keyword `bao` → `git`; excluded
|
||||
technology named in metadata). All gates re-run green post-fix:
|
||||
`cargo test` (26 lib + 4 conformance + 3 git-interop), `cargo clippy
|
||||
--all-targets -- -D warnings`, `cargo clippy --all-features
|
||||
--all-targets -- -D warnings`, `cargo fmt --check`, `cargo check
|
||||
--all-features`, and the pg-lo no-implication check. Wave 2
|
||||
decomposition is unblocked — it decomposes against the contract
|
||||
surface as reviewed (no amendments); the two recorded observations
|
||||
(cancellation residue per engine; the staging-cursor verification
|
||||
pass) are engine-task scoping notes for waves 2–5, not contract
|
||||
changes.
|
||||
Reference in new issue
Block a user