docs: make README a concise user guide - #72
Merged
Conversation
Reorganize README.md as a user-facing landing page and move deep freeze rationale + history into a new docs/STABILITY.md. Documentation only — no code, API, feature-flag, serialization, dependency, or release-config changes. README now leads with: one-paragraph description + the fixed CIDv1 profile; a Status & stability table (alpha package, frozen core, experimental merkle/store); installation (Rust + feature forms + Python); Rust and Python quick starts; a checked-vs-unchecked construction table; the four presentation forms; and an experimental-features section documenting the MERGED store API (NodeStore / NodeStoreExt / VerifiedStore / MemoryStore / AddressedBytes, get_node / put_node / put_checked) with an accurate trust boundary — seam theorems vs backend refinement laws, deferred formal proof targets (#71). Moved to docs/STABILITY.md: the ten-item freeze ledger (rewritten as contract statements by area, not a gate-item chronology), the presentation contract, the "why no full-CID hex method" rationale, error/verify policy, crate-root export + MSRV policy, the no-rehash digest bridge, and the experimental merkle/store exclusions — with issue provenance. Removed stale/dangerous content: obsolete API names (get_typed, insert(id, bytes)), test-count / coverage claims, and any global "bytes are frozen/unfrozen" or "cannot opt out / unskippable" overclaims. The README Python block is kept verbatim-mirrored by tests/test_readme.py (unchanged), so CI's python job still validates it. Validation: the three README Rust examples compile+run against main (temporary harness, not committed); cargo test --doc --all-features green; every Python symbol cross-checked against content-addressable-py/src/lib.rs (module not built locally); relative links resolve; adversarial scan for stale phrases and blurred distinctions is clean. Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
- STABILITY: correct the serde-repr claim — vectors.json pins the canonical bytes / base32 text / CID envelope / digest_hex (asserted in both gates), and the tag-42 link is via the inner Cid serde; it is NOT itself pinned by a vectors.json golden (the previous wording echoed a source doc-comment overclaim; flagged separately for the maintainer). - README: "mirrored by" (not "verbatim") for tests/test_readme.py; the store proof-obligation catalog links to src/store.rs (docs.rs won't render the default-off store module); cross-language parity scoped to "the same canonical IPLD value"; the foreign-bytes construction row marks that Python has no single checked constructor yet. - Both: "major version bump" -> "breaking release outside 0.1.x" (0.y.z SemVer). Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
Reorganize
README.mdinto a concise, user-facing landing page and move thedetailed freeze rationale + history into a new
docs/STABILITY.md. Documentationonly — no runtime, public API, wire format, feature-flag, dependency, or
release-config changes.
and feature status — a new user reaches a working example before internal design
history.
storefeature is now documented against the real API(
AddressedBytes,VerifiedStore,get_node,put_node,put_checked,decode_verified_bytes) — not the old PR description.VerifiedStoreis presented as the recommended verified facade.docs/STABILITY.md(with issue provenance).get_typed,insert(id, bytes)).Before → after (README structure)
docs/STABILITY.mdcontent_id+verify)tests/test_readme.py)merkle+ accuratestore(VerifiedStoreexample, trust boundary)docs/STABILITY.mdRELEASING.mddocs/STABILITY.md(new): the frozen0.1.xcontracts rewritten as contractstatements by area (CID profile, presentation, serde repr, checked/unchecked
construction,
ContentErrorpolicy,verify/ensure_content_id, crate-rootexports, MSRV/edition, no-rehash digest bridge) + the experimental
merkle/storeexclusions, with
#3–#10/#71provenance.Trust-boundary accuracy (store)
The README's
storesection deliberately does not claim: every backend isgrow-only; a successful backend write was durably persisted; raw
getprovescanonicality; inherent method resolution is intrinsically unskippable; the formal
properties are mechanized; or the collision branch has an executable Rust test. It
states the seam theorems vs backend refinement laws split and links the deferred
formal targets (#71) — matching the module docs in
src/store.rs.Validation
cargo test --doc --all-features— green.merkle,store) compiled andrun against
mainin a temporarytests/harness (removed, not committed).tests/test_readme.py(unchanged), which CI's
pythonjob (maturin develop+pytest) runs.Limitation: the Python extension is not built in the authoring environment, so
every imported symbol was cross-checked against
content-addressable-py/src/lib.rs(class exported as
ContentId;to_bytes/from_bytes/parse/from_canonical_bytes/from_blake3_content_digest/digest_bytes/digest_hexpresent;
content_id/to_canonical_dagcbor/from_canonical_dagcbormodule funcs)rather than executed locally.
get_typed,insert(id, bytes), coverage/testcounts,
cannot opt out,unskippable, global "bytes are frozen/unfrozen") — clean.docs/STABILITY.md,RELEASING.md) resolve.Out of scope
No code, API, wire format, feature flags, tests, dependencies, or release
configuration changed.
docs/MERKLE_CATALOG.md/docs/MERKLE_ROADMAP.mduntouched.