v1.0.0-Release
V1.0.0 — The Freeze
Aspirational milestone. Pour is a personal passion project; this doc defines what would let me stop calling it "in development" and start calling it "the tool I use."
What V1.0.0 Means
A worthy v1.0.0 is not feature-completeness. It is the moment Pour graduates from project-being-built to tool-being-used, anchored on a single promise:
"I can rely on this for myself, indefinitely, without it being the thing I'm working on."
The bar is "freeze the foundation." v2.0.0 is when I decide I was wrong about the foundation.
The Three Gates
1. Stability Commitment
The config schema is frozen, or has a real migration story (not the aspirational config_version claim noted in the pre-release assessment). A version bump never breaks my own vault.
The correctness floor from [[v1.0.0-pre-release-assessment]] is closed:
util::atomic_replaceis genuinely atomic on Windows (MoveFileExW+MOVEFILE_REPLACE_EXISTING, oratomicwrites/fs_err).transport/fs.rs::resolve_pathrejects..traversal on the write path, not just the read path.- CHANGELOG.md exists with at least
v0.1.0 → v0.2.0 → v0.2.1 → v0.2.2 → v0.3.0 → v1.0.0. config_versionmigration claim in README is either implemented or softened to match reality.
2. Shape Lock-in
Pour has decided what it is and what it isn't. After v1.0.0, breaking changes have a cost.
- Capture surfaces are settled — terminal at desk, PWA in the wild. No third surface in flight.
- Field-type model decision made: either
FieldTypetrait or enum frozen with documented lock-in (assessment §C). pubsurface is intentional, not accidental.lib.rsre-exports demoted topub(crate)by default; promotions are deliberate (assessment §E).- Public TUI / config types audited for things that exist only for tests (e.g.
ApiClient::base_url) — gated behindcfg(test)or removed.
3. Self-sufficient
I could hand it to past-me and they get the value without me on call.
- README reflects actual schema and tech stack (carry-over from pre-release assessment).
- field-types, System-Architecture-Overview, pour-design-spec describe the v1.0.0 reality, not an aspirational vision (deviation annotations resolved or accepted).
- Consolidated keyboard-shortcut reference exists.
- Project-standards doc exists: error-handling policy,
pubdiscipline, file-size budget, atomic-write helper as the single sanctioned pattern (assessment §Open Docs).
What V1.0.0 Is Not Gated On
Things that look like v1.0.0 work but aren't, for a personal tool:
- A user count or marketing site. No external users; no acquisition target.
- Semver-grade backwards compatibility for hypothetical consumers. I am the only consumer. The schema stability commitment in Gate 1 is for me, not them.
- Every nice-to-have feature — async dynamic-select refresh (ADR-003-Synchronous-TUI-Async-Operations), history pruning, undo before write, plugin/extension system, theme configurability. All deferred or accepted as deviations.
- Decomposition / dedup work from the pre-release assessment (god-modules, 17× atomic-write block, three JSON stores,
Actionenum sprawl).Real improvements, but they are quality of life for future-me-the-maintainer, not v1.0.0 gates for me-the-user.(Reframed 2026-04-29: shipped on thedecompbranch as Phases 0–6 of pour-v1-decomposition. Closed all four items + 102 net new tests.) - Test coverage for
tui/configure.rsrendering / key handlers.Worth doing, not a v1.0.0 gate(Closed 2026-04-29 bytests/tui_configure.rs— 52 cases, the assessment's "single biggest test hole heading into v1.0.0".) - Automated PWA test infrastructure — every PWA subsystem (offline queue, service worker, sub-form state machine, heatmap aggregation) ships untested by an automated harness. Manual real-device verification is the verification (checklist in v1.0.0-phase2-closeout). Pour is a personal tool with one user; explicit accept-the-gap is the right call. Phase 2 closeout Open Q9 is closed. Revisit at v1.1+ if the test surface ever needs to extend to collaborators.
What Shipped in the Web Branch
The mobile/PWA initiative (Steps A–F, web branch) landed all planned Phase 1 scope:
pour servesubcommand — HTTP server on port 8421 (default),0.0.0.0binding, QR code + URL printed at startup.- Auth — Bearer token (
mobile_tokenin~/.pour/secrets.toml), constant-time compare,?token=bootstrap-only. - Nine
/api/v1/*endpoints — health, config, options, submit, captures, history, presets CRUD + reorder. Shapes locked in pour-api-contract. OpenAPI at pour-openapi.yaml. - Embedded PWA — vanilla HTML/CSS/JS (~600 LOC) via
rust-embed. Module list, form rendering, submit, history list. "Add to Home Screen" on iOS/Android. - Idempotency — in-memory LRU (1024 cap), in-flight TTL 60 s, done TTL 5 min.
Idempotency-Keyheader per contract §9. captured_at— client-supplied ISO 8601 timestamp on submit preserves moment of capture.mobile_visible = false— per-module opt-out from phone interface.config_versionbumped to0.3.0.- Test suite extends through unit, engine-layer, and full-stack TCP integration scenarios. As of 2026-04-26: 762 tests passing across 30 test binaries; see
cargo testfor the current count.
Phase 2 deferred (not shipped on initial web-branch merge): offline queue (IndexedDB) (closed 2026-04-27 — Stream A TASK-2.1.1–2.1.5 landed), service worker app-shell cache (closed 2026-04-27 — Stream A TASK-2.2.1–2.2.3 landed), sub-form overlay for (closed 2026-04-27 — Stream B TASK-2.3.1–2.3.5 landed), create_template fieldspreset mutation UI (save/edit/delete/reorder from PWA) (closed 2026-04-27 — Stream C TASK-2.4.1–2.4.5 landed), history heatmap on mobile dashboard (closed 2026-04-27 — Stream D TASK-2.5.1–2.5.6 landed: bottom-tab nav, cursor-paginated history list, tap-to-read panel, 90-day heatmap with client-side rollup), TLS, mDNS/pour.local.
Path from Today
Current state (2026-04-25):
- Cargo.toml:
0.2.2(in-flight; onlyv0.2.0is git-tagged). - Branch
web— all Steps A–F complete. The PWA is the last personal capture need; once merged, my own daily-driver requirements are met. - Foundation already shipped in v0.2.x — see v0.2.0-Foundation.
- Next planned tag: v0.3.0 — web/PWA capture surface, when
webmerges tomain.
Likely sequence:
- Merge
web→main, tag v0.3.0. - Address pre-release assessment Foundations (atomic write, path traversal) and pick decomposition appetite → tag v0.4.0 (or fold into v1).
- Lock the three gates → tag v1.0.0.
The PWA has landed. The shortest honest path to v1.0.0 is Foundations + CHANGELOG + schema-stability commitment — everything else is optional polish.
Why This Definition
Calling something v1.0.0 is a promise. For a public library it is a promise to users about API stability. For a personal passion project it is a promise to future-me that I have stopped tinkering with the floor and started building on it. The criteria above are the smallest set that would let me trust that promise — narrower than "feature complete," wider than "it works on my machine."