Audit 003 — Documentation Quality & Spec Compliance¶
Date: 2026-03-09
Scope: Full documentation site (docs-src/, guides/, examples/, API docstrings) audited against sdd/DOCUMENTATION.md spec. Version 0.15.0, commit 62ecb61 (master HEAD at audit time).
Method: Built docs locally with hatch run docs-build. Systematic cross-reference of every section in sdd/DOCUMENTATION.md (S1-S13) against actual site structure, content, and source files. Assessed against the 5 Documentation Goals from S1.
Finding IDs assigned: AF-022 through AF-040.
Executive Summary¶
| Goal | Score | Verdict | Key Findings |
|---|---|---|---|
| 1. New user: install + run <10 min | 9/10 | PASS | 3-step quickstart, standalone code, no missing imports |
| 2. Returning user: "How do I X?" in 1 click | 8/10 | PASS with gaps | All tasks discoverable; cross-feature linking sparse |
| 3. Advanced user: API lookup without source | 7/10 | PASS with gaps | 17 API ref pages; proxy class docstrings missing |
| 4. Contributor: design decisions & content placement | 7/10 | PASS with staleness | CONTRIBUTING.md counts stale; CLAUDE-REF wrong path |
| 5. Accuracy at every commit | 5/10 | MULTIPLE ISSUES | 7 accuracy findings across guides, docs, and config |
Goal 1: New User — Install + Run in <10 min¶
Checked: README quickstart, docs-src/getting-started.md, examples/quickstart.py, tutorial notebooks.
Verdict: PASS (9/10)
- 3-step install-configure-run path works end-to-end
- Quickstart code is standalone (no temp-file boilerplate, minimal imports)
- No missing imports or broken examples in the getting-started flow
- Tutorial notebooks execute successfully via
hatch run notebooks
No new findings.
Goal 2: Returning User — "How do I X?" in One Click¶
Checked: Nav structure, guide inventory, cross-linking density, example discoverability.
Verdict: PASS (8/10)
Strong: All common tasks (configure backend, read/write files, use extensions) are discoverable in 1-2 clicks from the nav. 21 guides cover the full feature set.
Weak: Cross-feature linking is sparse — batch, transfer, and observe guides don't link to each other despite natural workflows that combine them. 6 guides missing API reference links. 7 example scripts invisible on docs site.
Findings:
- AF-022 — 7 example scripts missing from docs-site nav (Critical)
- AF-026 — 6 guides missing API reference links, 4 missing example links
- AF-027 —
guides/retry.mdmissing "See also" section and cross-links - AF-028 —
guides/backends/index.mdsparse
Goal 3: Advanced User — API Lookup Without Source¶
Checked: 17 API reference pages, docstring compliance for Store, Backend, extensions, models, errors.
Verdict: PASS with gaps (7/10)
Strong: Store (23 methods), Backend ABC (23 methods), all 8 error classes, all config classes, batch/glob/transfer extensions — all fully documented with params, returns, raises.
Weak: Proxy classes (ObservedStore, CachedStore) and the CacheBackend protocol have missing or incomplete docstrings.
Findings:
- AF-023 —
ObservedStore: 24 method overrides, 0 per-method docstrings. Class-level docstring exists ("Proxy Store that fires observation hooks") but is terse — does not explain delegation pattern or refer users toStorefor parameter docs. mkdocstrings renders 24 undocumented methods on the API page. - AF-024 —
CachedStore: same pattern, 20+ method overrides without per-method docstrings - AF-025 —
CacheBackendprotocol: 6 methods (get,set,delete,clear,clear_prefix,size) completely undocumented. Public extension point for custom cache backends. - AF-031 —
transfer()inext/transfer.pymissing:returns:docstring (returnsNonebut undocumented)
Goal 4: Contributor — Design Decisions & Content Placement¶
Checked: CONTRIBUTING.md, sdd/CLAUDE-REFERENCE.md, sdd/DOCUMENTATION.md S4 content homes.
Verdict: PASS with staleness (7/10)
Strong: DOCUMENTATION.md is comprehensive (S1-S13), content homes are clear, ADR/RFC process well documented.
Weak: Stale counts and wrong paths create confusion for new contributors.
Findings:
- AF-038 —
CONTRIBUTING.mdstates "9 ADRs" (actual: 11) and "3 RFCs" (actual: 4) - AF-039 —
sdd/CLAUDE-REFERENCE.mdline 77 referencesdocs/directory, should bedocs-src/
Goal 5: Accuracy at Every Commit¶
Checked: Code examples in guides, import paths, hook tables, version references, counts in contributor docs.
Verdict: MULTIPLE ISSUES (5/10)
This is the weakest area. Several guides contain import paths to private modules, the observe guide's hook table is incomplete, and migration.md documents an unreleased version.
Findings:
- AF-032 —
guides/observe.md:on_writehook table listswrite,write_atomicbut omitsopen_atomic(which triggerson_writeperobserve.pyline 109) - AF-033 —
guides/observe.md:on_pinghook row missing entirely (theping()method fireson_pingperobserve.pyline 107) - AF-034 —
ext/observe.py:observe()function docstring says "Fires after write/write_atomic" foron_writeparam but omitsopen_atomic - AF-035 —
guides/cache.md: imports fromremote_store.backends._memory(private module) - AF-036 —
guides/health-check.md: imports fromremote_store.backends._local(private module) - AF-037 —
guides/backends/sftp.md: imports fromremote_store.backends._sftp(private module, no disclaimer that this is internal API) - AF-040 —
guides/migration.md: documents v0.15.0-to-v0.16.0 migration for an unreleased version
Structural Checks (retained from initial audit)¶
Verified consistent¶
| Area | Spec section | Status |
|---|---|---|
| README content (S9) | S9 | All 14 required elements present |
| Nav layout (S3) | S3 | All four Diataxis sections present |
| Content homes (S4) | S4 | Guides, examples, API, specs all in correct locations |
| All nav pages build (S10) | S10 | hatch run docs-build succeeds, zero broken-link warnings |
| API reference pages (S2.3) | S2.3 | All 17 API pages present |
| Backend guides (S2.2) | S2.2 | All 6 backends have dedicated guides |
| Extension guides (S2.2) | S2.2 | All major extensions have guides |
| Capabilities matrix (S2.3) | S2.3 | Present and built |
| Docstring style (S5) | S5 | Sphinx-style configured via mkdocstrings |
| Versioned docs (S10) | S10 | mike plugin configured |
| Store class docstrings (S5) | S5 | All 23 public methods fully documented |
| Backend ABC docstrings (S5) | S5 | All 23 abstract + concrete methods fully documented |
| Error class docstrings (S5) | S5 | All 8 error classes documented |
| Config class docstrings (S5) | S5 | All 5 config classes documented |
| Guide opening sentences (S7) | S7 | 21/21 guides open with clear purpose statement |
Additional structural findings¶
- AF-029 —
guides/performance.mdreads as Explanation, not How-To. Missing API refs, examples, "See also". Consider reclassifying. - AF-030 — Research docs nested 3 levels deep (Explanation > Design > Research) instead of 2. Low impact.
Not Applicable / Out of Scope¶
| Item | Reason |
|---|---|
| Hosted doc accessibility (S10) | RTD deployment not testable from local build |
| ReadTheDocs vs GitHub Pages canonical (S6.1) | External hosting config |
| PyPI README rendering (S11) | Requires actual PyPI upload |
Doc versioning with mike |
Deployment-time concern |
Action Items¶
| ID | Severity | Goal | File(s) | Issue |
|---|---|---|---|---|
| AF-022 | Critical | 2 | docs-src/examples/*.md, _nav.yml |
7 example scripts missing from docs-site nav |
| AF-023 | Moderate | 3 | src/remote_store/ext/observe.py |
ObservedStore: 24 method overrides lack per-method docstrings |
| AF-024 | Moderate | 3 | src/remote_store/ext/cache.py |
CachedStore: 20+ method overrides lack per-method docstrings |
| AF-025 | Moderate | 3 | src/remote_store/ext/cache.py |
CacheBackend protocol: 6 methods undocumented |
| AF-026 | Moderate | 2 | 6 guides | Missing API reference and example cross-links |
| AF-027 | Moderate | 2 | guides/retry.md |
Missing "See also" section and cross-links |
| AF-028 | Minor | 2 | guides/backends/index.md |
Sparse — missing API refs, examples, next steps |
| AF-029 | Minor | — | guides/performance.md |
Guide-style violations; consider reclassifying as Explanation |
| AF-030 | Minor | — | docs-src/_nav.yml |
Research nested 3 levels deep instead of 2 |
| AF-031 | Low | 3 | src/remote_store/ext/transfer.py |
transfer() missing :returns: docstring |
| AF-032 | Medium | 5 | guides/observe.md |
on_write hook table omits open_atomic |
| AF-033 | Medium | 5 | guides/observe.md |
on_ping hook row missing entirely |
| AF-034 | Low | 5 | src/remote_store/ext/observe.py |
observe() docstring on_write omits open_atomic |
| AF-035 | Low | 5 | guides/cache.md |
Private import backends._memory |
| AF-036 | Low | 5 | guides/health-check.md |
Private import backends._local |
| AF-037 | Medium | 5 | guides/backends/sftp.md |
Private imports backends._sftp without disclaimer |
| AF-038 | High | 4 | CONTRIBUTING.md |
Stale counts: 9 ADRs (actual 11), 3 RFCs (actual 4) |
| AF-039 | High | 4 | sdd/CLAUDE-REFERENCE.md |
docs/ should be docs-src/ |
| AF-040 | Medium | 5 | guides/migration.md |
Documents unreleased v0.16.0 migration |