docs(hemx): define v1 versioning policy
Add a compact semver and upgrade policy for v1: stable beginner APIs, stable wire/runtime compatibility, advanced escape-hatch tier, breaking-change rules, upgrade-note template, and release checklist. req: abi/001 req: abi/002 req: abi/003 req: abi/004 req: abi/005 req: public_api/001 req: public_api/002 req: public_api/005 req: runtime/003 req: runtime/004
This commit is contained in:
@@ -111,6 +111,7 @@ fall back to a full page reload when possible. See `docs/recipes/deploy-versioni
|
|||||||
Before a v1 release, the semver policy and upgrade notes should explicitly state
|
Before a v1 release, the semver policy and upgrade notes should explicitly state
|
||||||
which surfaces are stable: beginner generated helpers and handler shapes; the
|
which surfaces are stable: beginner generated helpers and handler shapes; the
|
||||||
wire/runtime ABI; and advanced escape hatches that may remain integration-level.
|
wire/runtime ABI; and advanced escape hatches that may remain integration-level.
|
||||||
|
See `docs/versioning.md`.
|
||||||
|
|
||||||
## Examples
|
## Examples
|
||||||
|
|
||||||
|
|||||||
@@ -104,7 +104,8 @@ For v1, document changes in three buckets:
|
|||||||
|
|
||||||
Upgrade notes should explain what changed, whether generated code must be
|
Upgrade notes should explain what changed, whether generated code must be
|
||||||
regenerated, whether `/hemx.js` must be rolled with the server, and what fallback
|
regenerated, whether `/hemx.js` must be rolled with the server, and what fallback
|
||||||
users see if an old page talks to a new server.
|
users see if an old page talks to a new server. Use `docs/versioning.md` as the
|
||||||
|
release-policy checklist.
|
||||||
|
|
||||||
## Deployment checklist
|
## Deployment checklist
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,149 @@
|
|||||||
|
# v1 versioning and upgrade policy
|
||||||
|
|
||||||
|
hemx v1 should be boring to upgrade: beginner apps can rely on the generated
|
||||||
|
helper and handler model, while advanced escape hatches remain explicitly named
|
||||||
|
and easier to audit. This policy defines what must be stable for v1 and how to
|
||||||
|
ship breaking changes without hiding incompatibility behind runtime magic. req: abi/001 req: public_api/001
|
||||||
|
|
||||||
|
## Stability tiers
|
||||||
|
|
||||||
|
### Stable beginner API
|
||||||
|
|
||||||
|
These are the v1 normal path and require semver-major treatment for breaking
|
||||||
|
changes:
|
||||||
|
|
||||||
|
- `#[hemx::surface]`, `#[hemx::app]`, `#[hemx::component]`, `#[hemx::handler]`,
|
||||||
|
and `#[hemx::form]`
|
||||||
|
- generated component helpers for slots, keyed partials, forms, handles, page
|
||||||
|
targets, class tokens, and events
|
||||||
|
- `hemx::page(...)` for page-boundary rendering
|
||||||
|
- tuple `IntoEffect` composition
|
||||||
|
- `Result<impl IntoEffect, E>` handlers with `IntoHandlerFailure`
|
||||||
|
- generated form commands such as `clear`, `reset`, `error`, and `focus`
|
||||||
|
- generated keyed commands such as `append`, `replace`, and `remove`
|
||||||
|
|
||||||
|
A change is breaking if a production-shaped app like `examples/saas` must rewrite
|
||||||
|
normal handler/template code that was using those APIs correctly. req: examples/001 req: canonical_authoring/006
|
||||||
|
|
||||||
|
### Stable compatibility contract
|
||||||
|
|
||||||
|
These must remain explicit and fail closed when incompatible:
|
||||||
|
|
||||||
|
- Surface schema version consumed by `hemx_build`
|
||||||
|
- generated symbols and deterministic resource allocation inputs
|
||||||
|
- EffectBatch wire/schema ABI
|
||||||
|
- JavaScript runtime ABI
|
||||||
|
- build fingerprint inputs and mismatch behavior
|
||||||
|
|
||||||
|
An incompatible wire/runtime change must bump the relevant ABI version and cause
|
||||||
|
old pages or old runtimes to refuse partial updates rather than silently applying
|
||||||
|
wrong effects. req: abi/002 req: abi/003 req: abi/004 req: failure/005
|
||||||
|
|
||||||
|
### Advanced escape hatches
|
||||||
|
|
||||||
|
These are public but advanced. They may evolve faster, but every change still
|
||||||
|
needs a migration note and must not leak into beginner docs:
|
||||||
|
|
||||||
|
- raw effects and batches
|
||||||
|
- manual registries
|
||||||
|
- low-level resource ids and raw targets
|
||||||
|
- raw HTML/render/target construction
|
||||||
|
- runtime hooks and SSE internals
|
||||||
|
- island internals and custom integration glue
|
||||||
|
|
||||||
|
Advanced APIs are for integration crates, tests, migrations, or explicit leaf
|
||||||
|
boundaries. They are not a second beginner API. req: public_api/002 req: public_api/005
|
||||||
|
|
||||||
|
## What counts as breaking
|
||||||
|
|
||||||
|
Breaking for the beginner API:
|
||||||
|
|
||||||
|
- renaming generated helper methods or changing their return contracts
|
||||||
|
- requiring manual registry wiring for canonical apps
|
||||||
|
- requiring user-authored JavaScript or selector targeting for ordinary forms,
|
||||||
|
partial swaps, page swaps, or SSE/polling
|
||||||
|
- moving validation/error UI off generated form helpers
|
||||||
|
- changing handler argument inference so existing valid handlers stop compiling
|
||||||
|
- changing `Result<impl IntoEffect, E>` mapping so app errors no longer map at
|
||||||
|
the integration boundary
|
||||||
|
|
||||||
|
Breaking for compatibility:
|
||||||
|
|
||||||
|
- changing effect wire encoding without an ABI bump
|
||||||
|
- changing runtime target lookup semantics without a fingerprint/ABI bump
|
||||||
|
- changing generated id allocation inputs without a fingerprint change
|
||||||
|
- allowing mismatched server/runtime builds to apply partial updates
|
||||||
|
|
||||||
|
Not breaking:
|
||||||
|
|
||||||
|
- improving diagnostics while keeping spans and fixes user-facing
|
||||||
|
- adding generated helpers that are aliases around existing behavior when they
|
||||||
|
remove real friction
|
||||||
|
- adding new advanced escape hatches that are clearly named and isolated
|
||||||
|
- adding production recipes for providers outside core
|
||||||
|
- changing examples to better express the canonical path, when the documented API
|
||||||
|
remains compatible
|
||||||
|
|
||||||
|
## Upgrade note template
|
||||||
|
|
||||||
|
Every release with public API, generated ABI, runtime, or recipe changes should
|
||||||
|
include upgrade notes with this shape:
|
||||||
|
|
||||||
|
````md
|
||||||
|
## Upgrade to hemx X.Y.Z
|
||||||
|
|
||||||
|
### Who is affected
|
||||||
|
- Beginner app code: yes/no
|
||||||
|
- Generated helpers: yes/no
|
||||||
|
- Wire/runtime ABI: yes/no
|
||||||
|
- Advanced escape hatches: yes/no
|
||||||
|
- Recipes/examples only: yes/no
|
||||||
|
|
||||||
|
### Required actions
|
||||||
|
- Regenerate generated code with `cargo check` or your normal build.
|
||||||
|
- Deploy server and `/hemx.js` from the same release if ABI/fingerprint changed.
|
||||||
|
- Update any renamed helpers or advanced calls listed below.
|
||||||
|
|
||||||
|
### Compatibility behavior
|
||||||
|
- Old page + new server: reload/fail closed/compatible
|
||||||
|
- New page + old server: reload/fail closed/compatible
|
||||||
|
- Rolling deploy requirement: sticky release routing / normal routing
|
||||||
|
|
||||||
|
### Migrations
|
||||||
|
- Before: ...
|
||||||
|
- After: ...
|
||||||
|
|
||||||
|
### Verification
|
||||||
|
```sh
|
||||||
|
cargo run -p hemx-xtask -- test
|
||||||
|
cargo check --workspace
|
||||||
|
redgate health --strict
|
||||||
|
```
|
||||||
|
````
|
||||||
|
|
||||||
|
## Release checklist
|
||||||
|
|
||||||
|
Before tagging a v1-compatible release:
|
||||||
|
|
||||||
|
- `examples/v0` and `examples/saas` compile and test without raw ids, raw effects,
|
||||||
|
selector targeting, manual registries, raw render/lower calls, or user-authored
|
||||||
|
UI JavaScript in the normal path. req: examples/004 req: examples/005
|
||||||
|
- `docs/diagnostics.md` describes any new common error class in user language.
|
||||||
|
req: diagnostics/001 req: diagnostics/002
|
||||||
|
- `docs/recipes/deploy-versioning.md` remains accurate for runtime asset and
|
||||||
|
fingerprint behavior.
|
||||||
|
- Any incompatible generated ABI/runtime change bumps the relevant ABI/fingerprint
|
||||||
|
inputs and has tests for fail-closed behavior. req: abi/005
|
||||||
|
- Advanced APIs touched by the release are still named as escape hatches in docs.
|
||||||
|
- Upgrade notes state whether users must regenerate code, redeploy `/hemx.js`, or
|
||||||
|
change app code.
|
||||||
|
|
||||||
|
## Policy for v1 cutover
|
||||||
|
|
||||||
|
v1 is ready to cut only when the normal path can stay stable for the canonical
|
||||||
|
SaaS tutorial: hemplate templates, typed handlers, generated helpers, tuple
|
||||||
|
effects, result error mapping, page/push shape, explicit provider adapters,
|
||||||
|
plain CSS, and one island boundary. If stabilizing one of those surfaces would
|
||||||
|
require adding runtime negotiation, selector retargeting, a client state store, or
|
||||||
|
provider-specific core code, defer the feature or keep it advanced instead of
|
||||||
|
weakening the v1 contract. req: runtime/003 req: runtime/004 req: laws/004
|
||||||
Reference in New Issue
Block a user