req: abi/001 req: abi/003 req: v1_release/007
32 KiB
Hemx v1 implementation plan
Authority: REQUIREMENTS.md. Product evidence: docs/v1-product-evidence.md.
This file is an execution cursor, not requirement authority or release permission.
Publishing, deployment, artifact upload, and package-registry mutation are out of scope.
Product boundary
Hemx v1 keeps server-rendered HTML and ordinary Rust as the default. Generated
resources and the versioned EffectBatch are the one UI contract. Client-local
WASM and durable sync are optional execution layers, not a component framework.
Hemplate remains the rendering/Surface foundation; application auth, persistence,
encryption, retention, backup, and deployment policy remain host concerns.
Slice 1 — one real client-local handler
- User value: a Rust author marks one high-frequency handler local and gets immediate browser behavior without app-authored JavaScript or a request.
- State: Done.
hemx-buildvalidates same-origin client module metadata and generates the WASM import, initialization, handler registration, fingerprint, and ready marker. Client handlers receive versionedClientEvent/root-ownedClientState; incompatible input is rejected before handler execution, reports an actionablehemx:client-error, restores pending UI, and invokes an explicitly declared server fallback. Real WASM applies the ordinary generated-targetEffectBatchwith zero request on valid input. - Build: add the smallest optional
hemx-wasmboundary for#[hemx::handler(client)]; export only opted-in handlers; generate typed event/state ABI glue; run one existing generated-target interaction through the ordinaryEffectBatchinterpreter; preserve an explicit native/server fallback. - Refusals: no VDOM, component lifecycle, global store, sync queue, second effect protocol, or generic WASM framework.
- Requirements:
client_local/001-010,security/001,security/005-006,performance/003,v1_release/001. - Proof:
cargo test -p hemx-wasm --test browser client_handler_applies_effect_batch_without_network -- --exactserves only generated template HTML, the ordinary runtime, and generated client bootstrap; it visibly updates a generated target through real WASM, keeps the resource count unchanged for valid input, and proves invalid state diagnostics, pending restoration, and one declared fallback request. Formatting, workspace tests, strict all-target Clippy, and wasm-target build pass.
Slice 2 — direct manipulation that survives interruption
- User value: Kanban drag/reorder follows the pointer immediately, remains keyboard operable, and cannot apply stale work after cancellation or root removal.
- State: Done. The canonical Kanban client board is rendered through Hemplate and generated resources, then reordered by its real WASM handler for drag/drop and Arrow-key interaction. Client-local runs use validated
latest/droppolicy; stale/unmounted completions cannot apply effects; moved-card focus, live status, reduced-motion state, root cleanup, and a measured sub-100 ms local response are browser-proven. - Build: use the client handler in the canonical Kanban path; add cancellation/supersession, root-owned state cleanup, keyboard equivalent, focus/status behavior, reduced-motion behavior, and measured response/frame budgets.
- Refusals: no persistence, collaboration, or animation framework yet.
- Requirements:
client_local/011-014,accessibility/001-007,operations/002-003,performance/001,performance/003,milestone/001. - Proof:
cargo test -p hemx-wasm --test browser kanban_reorder_has_pointer_keyboard_focus_and_reduced_motion_parity -- --exactcovers real-WASM pointer and keyboard reorder, focus/status, reduced motion, and the 100 ms response budget; the client-handler browser proof covers cancellation, removal, error recovery, zero-request behavior, and root cleanup.
Slice 3 — durable offline command log
- User value: an opted-in Kanban mutation remains available after network loss and browser reload without storing DOM patches as truth.
- State: Complete — the app-owned
reorder_cardcommand is transactionally persisted with schema, actor, session, causal id, and app payload before projection; an app-owned service worker caches only the generated shell/resources, and reload restores the projection after the fixture server is stopped and proven unreachable. Native recovery controls export a versioned credential-free command envelope, delete queued commands while preserving actor/causal identity, and reset command data, identity, cache, and registration behind explicit confirmation. Unknown schemas and malformed current-schema records stop before projection with explicit recovery diagnostics. Transaction conflicts and injected quota exhaustion neither project nor emit durability claims and remain recoverable through export/delete/reset. Replay is preflighted before effects, capped by the app at 64 commands, and measured against a 100 ms browser budget. A programmatic queued/busy state appears within the 100 ms direct-interaction budget before blocked persistence completes. The ordinary server-first route loads only the fingerprinted base runtime and creates no client root, service worker, or IndexedDB database; PWA/WASM policy remains app-owned and opt-in. - Build: add an optional durable command-log adapter around platform transactional storage; persist versioned command ids and app payload before projection; restore projection after reload; expose queue state, export/delete/reset, quota/corruption failure, and migration refusal.
- Refusals: no server reconciliation, CRDT, mandatory IndexedDB, credential storage, or policy hidden in core.
- Requirements:
local/001-004,sync/009,sync/014-015,sync/020,security/007,accessibility/004,client_local/013,performance/003,performance/005-006. - Proof:
cargo test -p hemx-wasm --test browser multiplayer_kanban_milestone_journey_recovers_and_converges -- --exactproves transactional persist-before-project ordering, app-owned shell caching, current-version replay after a real Firefox reload with the fixture server unreachable, stable identity metadata, and explicit unknown-schema refusal through real WASM.cargo test -p hemx-wasm --test browser kanban_command_export_delete_and_reset_are_recoverable -- --exactproves accessible export/delete/reset entry points, versioned credential-free export, confirmation before destructive actions, preserved identity after queue deletion, and fresh identity/baseline projection after reset.cargo test -p hemx-wasm --test browser kanban_persistence_failure_does_not_project_and_recovers -- --exactproves transactional failure does not project or emitkanban:command-persisted, reports non-payload stage/code diagnostics, and recovers through the ordinary deletion path.cargo test -p hemx-wasm --test browser kanban_corrupt_command_refuses_projection_and_recovers -- --exactproves strict current-schema validation, no partial projection, visible non-payload diagnostics, raw versioned export for recovery, and ordinary deletion recovery.cargo test -p hemx-wasm --test browser kanban_replay_is_bounded_and_within_budget -- --exactproves 64-command preflight/replay within the 100 ms browser budget, zero partial projection at 65 commands, and export/delete recovery.cargo test -p hemx-wasm --test browser kanban_quota_failure_is_fail_closed_and_recoverable -- --exactproves quota-specific fail-closed behavior, no false durability event, transactional metadata rollback, and export/delete/reset recovery.cargo test -p hemx-wasm --test browser kanban_queued_status_precedes_durable_projection_within_budget -- --exactproves queued/busy feedback within theperformance/003andclient_local/013100 ms budget while persistence is blocked, followed by durable projection only after commit.cargo test -p hemx-kanban-example --test browser_e2e server_first_route_does_not_load_optional_client_assets -- --exactproves the server-first route loads only its fingerprinted base runtime and creates no optional client root, PWA/WASM request, service worker, or IndexedDB database.
Slice 4 — authoritative reconnect and convergence
- User value: offline and concurrent work reconnects without duplicate mutation, silent loss, stale authorization, or ambiguous conflict.
- State: Complete — one app-owned
move_cardserver command validates a durable client command id, applies the authoritative canonical column once, returns the same acknowledgement for an identical retry, rejects id reuse with a different payload, assigns one server sequence, and redelivers that canonical acknowledgement after a real EventSource disconnect/reconnect. Canonical acknowledgements and the next sequence are durably stored in a strict versioned JSON envelope using fsync plus atomic replacement; startup refuses malformed/unknown state, rebuilds the canonical board, and preserves idempotency and event replay across a real process restart. A dedicated opt-in sync route reads one pending IndexedDB command, retries transient failures with capped exponential backoff and randomized jitter, exposes online/offline state plus an accessible manual retry after exhaustion, waits for canonical acknowledgement on the reconnecting transport, and only then removes the durable command; later retry converges without a new local mutation. Canonical payload conflicts are not retried and remain durable with a visible reason. If requested history predates retained events, the stream emits a typed snapshot-required event and the client loads a versioned canonical snapshot. One deterministic rebase rule treatsreorder_cardas converged only when the canonical snapshot already places that card indone; it then atomically stores the snapshot/cursor and removes the satisfied command. If a later canonical command instead places the same card indoing, the rebase is explicitlyconflicted, retains the local command and last committed snapshot/cursor unchanged, and exposes the divergent canonical column/reason. Two same-origin tabs coordinate an app-owned expiring IndexedDB lease so only one uploads; the standby exposes its role without issuing a request, and after the leader closes it takes over, receives one canonical acknowledgement/sequence, and removes the queue once. Each activation serializes uploads with one in flight, processes at most two acknowledged commands, exposes the retained durable count when backpressured, and resumes the next bounded run only through the visible retry action. A mixed queue commits and removes its accepted prefix exactly once, then stops on the first permanent rejection with the typed server cause visible, the rejected command plus untouched suffix durable, and blind retry disabled. The IndexedDB v1-to-v2 command migration transactionally adds the explicit target column, records a typed migration receipt, preserves causal order and interaction intent through an interrupted upload, and later drains in the original order. Every command POST now derives its principal, permission, and tenant from the current same-origin session before idempotency lookup or mutation; authenticated mode accepts only app-configured opaque session tokens and fails closed when signed out. Direct cross-tenant and stale-permission command attempts receive typed authorization denial before mutation. IndexedDB v3 additionally indexes every command and lease by the current server-derived tenant/principal partition: switched users enumerate zero foreign commands, issue no foreign replay, cannot export foreign payloads, and the owning account can export then resume its intact queue. Signed-out context lookup fails closed before opening the queue. Canonical snapshots and replayable acknowledgement history now derive the same current session, filter card state and events by tenant before serialization, use tenant-local sequence cursors, and reject signed-out reads. A divergent snapshot enables explicit “Use canonical state” and “Keep local change” actions. Canonical resolution removes only the conflicted head before resuming the ordered suffix. Keep-local resolution derives one deterministic retry identity from the original command and snapshot, keeps the original head and suffix durable through permanent rejection and bounded transport failure, re-enables the explicit decision after rejection, and removes the head only after canonical acceptance before resuming the suffix. The accessible sync shell exposes bounded redacted diagnostics for queue count/age bucket, cursor, acknowledgement-latency bucket, conflicts, and rejections; durable commands carry a migration-safe enqueue timestamp, while ids, payload fields, actor/session values, cookies, and exact timing stay out of diagnostics. The optional publichemx-synccrate now provides the strict versioned flat scalarFlatPatchschema andSyncEffect::send_patch; a generated client handler emits it in the ordinaryEffectBatch, the runtime assigns one opaque interaction identity to both operation/idempotency fields, persists it before any offline request, then uploads and removes it only after a matching acknowledgement. Missing-history recovery now calls one named, exportedserver-authoritative-v1reconciliation function with the canonical snapshot, full ordered command sequence, and observed server results; it validates result cursors, returns a mutation-free deterministic decision/retained-count record, and leaves custom merge or CRDT policy as an explicit replacement module rather than an implicit mode. Broader domain-specific merge choices remain. - Build: materialize
hemx-syncover an integration transport with idempotent server command processing, snapshot/change cursor, durable acknowledgements, bounded ordered replay, current auth checks, rejection/conflict results, canonical replacement, reconnect jitter/backoff, multi-tab coordination, and redacted diagnostics. - Refusals: no default CRDT, transport in core, cached enqueue-time permission, unbounded queue, or silent last-write-wins policy.
- Requirements:
sync/001-023,operations/001-005,security/002-005,performance/004-005. - Proof:
cargo test -p hemx-wasm --test browser flat_patch_persists_offline_then_uploads_with_same_operation_identity -- --exactprovessync/002andsync/003through generated real WASM:SyncEffect::send_patchtravels beside ordinary DOM effects, the strict flat scalar schema is accepted, the offline interaction performs zero patch requests while remaining durable, and reconnect uploads with identical opaque operation/idempotency identity before matching acknowledgement removes it.cargo test -p hemx-wasm --test browser multiplayer_kanban_milestone_journey_recovers_and_converges -- --exactprovessync/023through the public generated client handler and real WASM: offline durable mutation, unavailable-origin reload projection, reconnect upload, canonical convergence, duplicate idempotency without a second event, conflicting duplicate rejection, invalid-command rejection, and an empty local queue.cargo test -p hemx-kanban-example --test browser_e2e idempotent_server_command_is_acknowledged_after_reconnect -- --exactproves duplicate POST delivery yields one identical canonical acknowledgement/sequence, conflicting id reuse is rejected, EventSource reconnects after a server-closed first stream, the acknowledgement is delivered once with its sequence as event id, and a page reload shows the authoritative card in the canonical column.cargo test -p hemx-kanban-example --test browser_e2e pending_local_command_uploads_with_bounded_retry_and_is_removed_on_ack -- --exactproves automatic platform-store upload, one explicit transient failure, bounded exponential backoff plus jitter, reconnect acknowledgement, pending-before-ack ordering, acknowledged removal, canonical board convergence, and non-retried 409 rejection remaining durable with a visible reason.cargo test -p hemx-kanban-example --test browser_e2e canonical_acknowledgement_survives_server_restart -- --exactproves the versioned store is materialized before success, a real process restart reloads the same idempotent acknowledgement/sequence, EventSource replays it by id, and canonical board state is rebuilt.cargo test -p hemx-kanban-example --test browser_e2e exhausted_offline_retries_keep_command_until_later_reconnect -- --exactproves three bounded retries exhaust into visible offline/manual-recovery state while the command remains durable, then a later retry acknowledges/removes it and converges canonically.cargo test -p hemx-kanban-example --test browser_e2e missing_history_rebase_and_user_conflict_resolution_preserve_suffix -- --exactproves retained-history gap detection, typed/versioned snapshot fallback, deterministic already-canonical convergence, atomic snapshot/cursor commit, then a divergent canonical update producing explicit conflict with a two-command queue; the user’s canonical-state action removes only the conflicted head, retains and resumes the suffix, and reaches canonical convergence with an empty queue.cargo test -p hemx-kanban-example --test browser_e2e keep_local_retry_preserves_conflicted_command_and_suffix_order -- --exactproves the keep-local action derives one resolution identity; a permanent rejection preserves order and re-enables the choice; three later transport failures still preserve the original conflicted head plus suffix and expose manual recovery; final acceptance removes only the head and converges the untouched suffix without duplication or loss.cargo test -p hemx-kanban-example --test browser_e2e redacted_sync_diagnostics_are_bounded_and_leak_no_sensitive_material -- --exactproves a 15-second-old queue is bucketed rather than timestamped, cursor and acknowledgement latency advance after recovery, diagnostics stay under a fixed small readout, and command id/payload/actor/session/cookie material never reaches the diagnostics surface; the conflict and keep-local tests additionally assert conflict/rejection counters at their actual failure boundaries.cargo test -p hemx-kanban-example --test browser_e2e two_tabs_coordinate_single_uploader_and_takeover_without_duplicate_application -- --exactproves one retry-exhausted leader/one explicit standby, zero follower upload before takeover, lease takeover after the leader closes, one canonical sequence/event, one queue removal, and one board application.cargo test -p hemx-kanban-example --test browser_e2e upload_backpressure_keeps_pending_work_visible_and_recoverable -- --exactproves one in-flight upload, a two-acknowledgement activation limit, one retained durable command with visible recovery state, and explicit retry draining the final command without loss.cargo test -p hemx-kanban-example --test browser_e2e mixed_queue_removes_accepted_prefix_and_retains_rejected_tail -- --exactproves an accepted prefix is canonically applied and removed once before a permanent rejection stops processing, exposes its typed HTTP/server cause, disables blind retry, and leaves both the rejected command and untouched suffix durable.cargo test -p hemx-kanban-example --test browser_e2e schema_upgrade_preserves_queued_order_and_local_intent -- --exactproves a three-command v1 queue migrates atomically to the explicit-target v2 schema, remains byte-for-intent ordered after interrupted upload, then receives canonical sequences 1–3 in original order and drains without loss.cargo test -p hemx-kanban-example --test browser_e2e account_partition_hides_replay_and_export_until_owner_returns -- --exactproves a beta editor and alpha viewer enumerate zero commands and issue no replay for an alpha owner queue, signed-out startup cannot open a partition, no foreign id/export surface leaks, and only the returning alpha owner can export the intact command then resume it exactly once.cargo test -p hemx-kanban-example --test browser_e2e canonical_snapshot_and_history_are_tenant_scoped -- --exactproves alpha and beta sessions receive only their own canonical cards and acknowledgement events with independent sequence 1 cursors, while signed-out snapshot/history reads receive 401 and expose no stream.cargo test -p hemx-kanban-example --test browser_e2e identical_sync_inputs_reconcile_deterministically -- --exactprovessync/022through a real browser and live sync endpoints: one accepted server result and canonical snapshot plus an ordered command sequence produce byte-equivalent structured reconciliation records on independent cloned inputs, do not mutate inputs, and select the explicit server-authoritative model.cargo test -p hemx-kanban-example --test browser_e2e sync_requests_timeout_and_cancel_on_pagehide -- --exactproves the sync request boundary enforces a named finite timeout and reportsTimeoutError, while page teardown cancels a pending request withAbortError, closes the acknowledgement stream, and clears retry/lease timers. Per-requirement audit: everysync/001-023row now has concrete browser proof; existing live-browser proofs also coveroperations/001-002,operations/005,security/002,security/004,performance/004, andperformance/005, while this slice closes the sync request/stream leg ofoperations/003.cargo test -p hemx-kanban-example --test browser_e2e adversarial_wire_inputs_are_rejected_before_partial_application -- --exactproves malformed, oversized, truncated, trailing, unknown-version, and invalid-kind batch/state/command inputs fail without UI mutation;cargo test -p hemx-wasm --test browser flat_patch_persists_offline_then_uploads_with_same_operation_identity -- --exactadditionally proves unknown-version and oversized event/state inputs are rejected at the generated real-WASM handler boundary before application code. The runtime now bounds total payloads, fields, vectors, varints, UTF-8, enums, and option discriminants before allocation or dispatch, and the durable queue validates every loaded command before replay, closingsecurity/005.cargo test -p hemx-axum --test response interaction_boundary_honors_media_type_and_host_body_limit -- --exactproves the mutation extractor rejects missing/unexpected media types with 415 and an Axum host-configured oversized body with 413 before handler dispatch, while a valid bounded form dispatches exactly once; the extractor documentation namesDefaultBodyLimit, and CSRF remains the existing documented application/middleware policy, closingsecurity/003.cargo test -p hemx-kanban-example --test browser_e2e acknowledgement_stream_bounds_reconnect_buffering_heartbeat_and_cancellation -- --exactclosesoperations/004: the live stream exposes a finite 15-second production heartbeat (25 ms under proof configuration), exactly three bounded reconnect delays (100/250/500 ms), converts 65 pending events over its 64-event transport budget into one canonical snapshot recovery event, then emits heartbeats after recovery; both proof streams are explicitly closed, and the page teardown path closes its owned stream and reports cancellation.cargo test -p hemx-kanban-example --bin hemx-kanban-example timeout -- --nocapturecompletesoperations/003: ordinary server routes are cancelled after a finite 10-second production deadline and return 504, startup store read/replay is cancelled after five seconds, oversized startup state is rejected before decoding, and focused tests prove dropped in-flight work plus named timeout diagnostics.cargo test -p hemx-kanban-example --test browser_e2e ordinary_browser_request_exposes_deadline_and_cancels_on_pagehide -- --exactproves the ordinary browser request boundary exposes its finite 10-second deadline, aborts the real form request withAbortErroron page teardown, and clears pending UI state; stream routes remain governed by theoperations/004lifecycle rather than the ordinary-handler timeout. The complete Slice 4 browser audit now passes (cargo test -p hemx-kanban-example --test browser_e2e -- --test-threads=1andcargo test -p hemx-wasm --test browser -- --test-threads=1). The audit also fixed three stale v1 command fixtures to exercise the real v2 durable schema, preserved an offline leader lease without retrying while connectivity is absent, and made finite acknowledgement responses close unless the caller explicitly requests a reconnecting stream.cargo test -p hemx-kanban-example --test browser_e2e typed_broadcast_applies_generated_batch_over_sse -- --exactclosessync/004: publicSyncEffect::broadcast(Channel, EffectBatch)preserves an ordinary typed batch, the board subscription selects the validated typed channel, and a generated-resource presence batch crosses the real SSE runtime to update browser DOM.cargo test -p hemx-kanban-example --test browser_e2e typed_presence_join_leave_updates_generated_atom_over_sse -- --exactclosessync/001andsync/005: public channel-scopedPresenceTrackermakes duplicate joins and absent leaves idempotent,#[hemx_sync::presence]turns one synchronous typed projection into aPresenceUpdate, and real join/duplicate-join/join/leave requests produce counts 1/1/2/1 in a generated presence atom over typed SSE broadcast. The macro rejects arguments, async functions, missing return types, wrong arity, and destructured inputs with local diagnostics.cargo test -p hemx-kanban-example --test browser_e2e canonical_acknowledgement_updates_generated_atom_over_ordinary_batch -- --exactclosessync/006: publicSyncEffect::ack(Atom<T>)emits an ordinary atom update plus a queue-observable acknowledgement event, and a tenant-authorized canonical acknowledgement updates a generated atom and status slot in the real browser while preserving command identity and server sequence. The runtime now materializes atom updates into matching generated DOM owners as well as root atom state. The final post-API audit passes both complete browser suites (cargo test -p hemx-kanban-example --test browser_e2e -- --test-threads=1andcargo test -p hemx-wasm --test browser -- --test-threads=1), strict all-target Clippy, and focused public presence/broadcast/acknowledgement proofs. Every Slice 4 requirement now has a concrete public-API citation and browser proof. Slice 4 is complete.
Slice 5 — local-first multiplayer Kanban milestone
- User value: the complete north-star app demonstrates SSR-first startup, direct manipulation, offline durability, optimistic projection, reconciliation, and live presence as one comprehensible workflow.
- State: Complete.
- Build: connect the previous slices in the canonical Kanban example; keep native server-rendered fallback; add presence and server-canonical conflict presentation; exercise deploy fingerprint recovery and accessible online/offline/conflict state.
- Refusals: no demo-only runtime, hidden app JS, proprietary service, or requirement to load collaboration code for server-first apps.
- Requirements:
ms/001-003,v1_release/001-002,accessibility/001-007,operations/006,performance/006. - Proof:
cargo test -p hemx-wasm --test browser multiplayer_kanban_milestone_journey_recovers_and_converges -- --exactcomposes the production Kanban page, generated client-local WASM, framework-owned durable sync runtime, and real sync endpoints in one named browser journey. It proves native no-script movement, keyboard movement, local drag/drop, offline/reload projection replay and upload, concurrent peer mutation and canonical convergence, presence projection, typed rejection recovery, mixed-version reload, and optional-asset isolation. The journey receives 404 for/app.js,/offline.js,/sync-demo, and/sync.jsand asserts that its only scripts are generated/client runtime plus framework sync runtime. The former app-authored sync UI remains reachable only behind the explicitHEMX_KANBAN_LEGACY_SYNC_FIXTURE=1test-fixture boundary so its recovery/accessibility regression suite remains available without becoming milestone surface.cargo test -p hemx-wasm --test browser flat_patch_persists_offline_then_uploads_with_same_operation_identity -- --exactadditionally preserves the legacy flat durable-record upgrade path.
Slice 6 — production integration reference
- User value: adopters can copy a proven boundary for durable storage, auth, transactions, security controls, observability, and restart recovery without hemx owning vendor policy.
- State: Complete — the corrected audit found and closed two production-reference gaps: stable request/session/user correlation and strict deployable response policy. The app returns generated request IDs, emits typed secret-free correlation, and applies a no-inline/no-eval CSP plus nosniff and referrer policy to every response.
- Build: evolve one existing reference app using ordinary integration adapters; add durable app storage, authenticated/authorized allowed and denied mutations, CSRF/origin checks, transaction rollback, bounded input, structured failures, health/readiness, tracing/metrics hooks, and restart/deploy recovery.
- Refusals: no built-in database/auth provider, compliance claim, telemetry vendor, deployment system, or repository framework.
- Requirements:
operations/001-008,security/003-004,security/006,security/009,v1_release/003, and the applicable existingauth/*andfailure/004contracts. The audit removed stale/nonexistentadapter/*,integration/*, anddiagnostics/*aliases;axum/*anddiag/*are adapter/editor contracts already owned by their focused slices, while the release-only advisory/license/unsafe-code audit insecurity/008remains a Slice 7 gate. - Proof: end-to-end test survives process restart and mixed deployment, proves allowed/denied/rolled-back mutations and redacted diagnostics, and maps each framework-owned ASVS-relevant control to a failing/passing case.
cargo test -p hemx-saas-example --test production_reference proves current bearer authentication, origin/CSRF denial, bounded input, strict CSP/security headers, atomic durable commit, rollback, restart recovery, live-vs-ready dependency failure, redacted structured problem responses, aggregate metrics, stale-fingerprint rejection followed by current-build recovery, and generated request correlation on allowed, denied, mismatch, and failed mutations. The typed diagnostic hook carries only generated request ID, fixed session/user IDs, outcome, and duration. Existing focused Kanban backpressure proof covers operations/004; the production-reference mismatch and restart proofs explicitly cover operations/006 and operations/008. Slice 6 is complete.
Slice 7 — v1 compatibility and closure
- User value: maintainers and adopters receive a reproducible, migration-aware v1 with no known material contradiction and no hidden publication side effect.
- State: In progress — the compatibility audit now names the actually supported matrix, replaces the vague migration-fixture gate with checked-in ABI-v1 bytes plus the real legacy durable-record browser migration, and proves all four canonical example packages together.
- Build: freeze the supported Rust/browser/WASM/integration matrix; reconcile public/generated/Surface/symbol/wire/runtime/persisted-schema compatibility; add migration fixtures; make canonical examples compatibility tests; update the progressive tutorial path; run all local release gates and disposition every P0/P1, advisory, unsafe-code, license, performance, accessibility, and documentation finding.
- Refusals: no publish, deploy, upload, store submission, speculative feature, or weakening a gate to make it pass.
- Requirements:
v1_release/001-010,versioning/*,test/*,diag/*,performance/*,security/008, and all requirements changed by the preceding slices. - Proof: clean-tree formatting, workspace tests, strict all-target Clippy, compile-fail, browser/WASM/offline/multiplayer scenarios, benchmark budgets, approved pinned lockfile audit, requirements proof audit, docs/examples checks, and independent contradiction review all pass with no unresolved P0/P1.
cargo test -p hemx-core --test effect_batch compatibility_fixture_accepts_only_the_declared_v1_wire_version -- --exact, cargo test -p hemx-wasm --test browser flat_patch_persists_offline_then_uploads_with_same_operation_identity -- --exact, and cargo test -p hemx-v0-examples -p hemx-client-local-example -p hemx-kanban-example -p hemx-saas-example --lib --bins prove the first compatibility gate. Execution cursor: run the remaining Slice 7 release audit gates from the canonical hemx-xtask test entry point, resolve only genuine local failures, and record exact blocked external audit tools instead of inventing substitutes.