Skip to content

docs: make README a concise user guide - #72

Merged
hartsock merged 2 commits into
mainfrom
docs/readme-user-guide
Aug 4, 2026
Merged

docs: make README a concise user guide#72
hartsock merged 2 commits into
mainfrom
docs/readme-user-guide

Conversation

@hartsock

@hartsock hartsock commented Aug 4, 2026

Copy link
Copy Markdown
Owner

Summary

Reorganize README.md into a concise, user-facing landing page and move the
detailed freeze rationale + history into a new docs/STABILITY.md. Documentation
only
— no runtime, public API, wire format, feature-flag, dependency, or
release-config changes.

  • The README is reorganized around installation, quick starts, safety boundaries,
    and feature status
    — a new user reaches a working example before internal design
    history.
  • The merged store feature is now documented against the real API
    (AddressedBytes, VerifiedStore, get_node, put_node, put_checked,
    decode_verified_bytes) — not the old PR description.
  • VerifiedStore is presented as the recommended verified facade.
  • Detailed stability decisions moved to docs/STABILITY.md (with issue provenance).
  • Removed stale test counts, coverage claims, and obsolete API names (get_typed,
    insert(id, bytes)).

Before → after (README structure)

Before After
Title + long IPLD essay + explicit CID-build prose Title + one-paragraph pitch + fixed-profile table
"IPLD-native" deep dive up front folded into the intro table
"Presentation contract (FROZEN)" + hex debate inline compact 4-form table; hex rationale → docs/STABILITY.md
Usage (single trait example) Rust quick start (trait + content_id + verify)
Python block Python quick start (mirrors tests/test_readme.py)
Choosing a construction path table (safe vs unchecked)
Experimental features: merkle + accurate store (VerifiedStore example, trust boundary)
"Alpha status — bytes are NOT frozen" + 10-item SETTLED ledger Status & stability table + one paragraph → docs/STABILITY.md
CI / release-pipeline mechanics inline short Development + link to RELEASING.md

docs/STABILITY.md (new): the frozen 0.1.x contracts rewritten as contract
statements by area (CID profile, presentation, serde repr, checked/unchecked
construction, ContentError policy, verify/ensure_content_id, crate-root
exports, MSRV/edition, no-rehash digest bridge) + the experimental merkle/store
exclusions, with #3#10/#71 provenance.

Trust-boundary accuracy (store)

The README's store section deliberately does not claim: every backend is
grow-only; a successful backend write was durably persisted; raw get proves
canonicality; 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.
  • The three README Rust examples (quick start, merkle, store) compiled and
    run against main in a temporary tests/ harness (removed, not committed).
  • The README Python block is kept verbatim-mirrored by tests/test_readme.py
    (unchanged), which CI's python job (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_hex
    present; content_id/to_canonical_dagcbor/from_canonical_dagcbor module funcs)
    rather than executed locally.
  • Adversarial scan for stale phrases (get_typed, insert(id, bytes), coverage/test
    counts, cannot opt out, unskippable, global "bytes are frozen/unfrozen") — clean.
  • Relative links (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.md untouched.

hartsock and others added 2 commits August 4, 2026 19:12
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>
@hartsock
hartsock merged commit 405930b into main Aug 4, 2026
8 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant