chore(release): 0.3.0

Bump workspace version 0.2.0 → 0.3.0.

CHANGELOG: documents the additions in this release —
  - `journal` Cargo feature with full TraceEvent enum + machine API
  - root state targetable by chart name
  - 113 deterministic-flow tests
  - verification/ workspace member with mechanical Creusot proofs
  - docs/002 formal semantics doc
  - README "How a chart behaves" building-block section
  - mise + just tooling overhaul (set shell, set script-interpreter)

README: integrates the semantics from docs/002 as eight building-
block rules that build on each other (active path, default-descent,
event bubbling, transitions, up-transition rule, entry/exit
ordering, timer lifecycle, emit / during / termination). Adds an
explicit "what hsmc deliberately does NOT have" table with what to
use instead. New "Verification" section pointing at `just verify`.

No behavior changes for v0.1 / v0.2 charts — every existing chart
compiles unchanged.
This commit is contained in:
swaits committed 2026-04-27 21:32:22 -06:00
1 parent e183cdd95e
commit a6d6cd2674
5 files changed
+243 -13

No files matched your search

+57
View File
@@ -4,6 +4,63 @@ All notable changes to this workspace are documented here. The format
follows [Keep a Changelog](https://keepachangelog.com/en/1.1.0/) and
this project adheres to [Semantic Versioning](https://semver.org/).
## 0.3.0 — 2026-04-27
### Added
- **`journal` Cargo feature.** Records every observable atom of chart
execution — `Started`, `Entered`, `Exited`, `ActionInvoked`
(`Entry`/`Exit`/`Handler`), `DuringStarted`, `DuringCancelled`,
`TransitionFired`, `EventDelivered`, `EventDropped`, `EmitQueued`,
`EmitFailed`, `TimerArmed`, `TimerCancelled`, `TimerFired`,
`TerminateRequested`, `Terminated` — into a `Vec<TraceEvent>` on the
generated machine. Same chart + same events = byte-identical
journal. Public API: `journal()`, `take_journal()`, `clear_journal()`,
`CHART_HASH` (a stable FNV-1a fingerprint of the chart's structural
definition).
- **Root state targetable by chart name.** `on(Trig) => MyChart;`
resolves to the root state in both `classify_target` and
`resolve_transitions`. From any nested state this is an
up-transition (root is always on the active path).
- **113 deterministic-flow tests** (under `--features tokio,journal`)
comparing hand-built expected journals byte-for-byte against
actual, anchored to spec sections: initial entry, lateral / self /
up transitions, default-descent, event bubbling, timer arm /
cancel / fire, emit, ordering, durings, step-vs-dispatch
equivalence, root-targeting, `current_state()`, termination.
- **`verification/` workspace member with Creusot proofs.** Verified
mirrors of the runtime `EventQueue` and `TimerTable` carry
`creusot-std` (Pearlite) contracts that Why3 + alt-ergo + z3
discharge mechanically. 14/14 VCs proven. `just verify` is
self-installing (mise pulls opam + the pinned nightly + Creusot's
canonical `INSTALL`).
- **`docs/002. hsmc-semantics-formal.md`** — canonical, unambiguous
reference for chart behavior. Numbered S-rules supersede the v0.1
prose spec and v0.2 design-change-request.
- **README "How a chart behaves" section** — eight building-block
rules that build on each other, with an explicit "what hsmc
deliberately does NOT have" table.
### Tooling
- `mise.toml` (root) declares stable Rust + components + embedded
targets + cargo subcommands. `verification/mise.toml` declares
the pinned `nightly-2025-11-13` + opam + python venv + uv.
- `set shell` and `set script-interpreter` route every `just` recipe
through `mise exec` — no shebangs, no per-recipe wrappers.
- `just verify` runs `cargo creusot prove --no-cache` so SMT
invocations happen on every run; `time` shows ~7s CPU on ~1.2s
wall = real parallel work.
- `just mutants` runs with `--features tokio,journal` so `journal_*`
and `det_*` tests execute. **0 missed mutants.**
- `just miri` excludes `hsmc-macros` (trybuild glob hits Miri's
isolation) and `hsmc-verification` (different pinned toolchain).
66 tests pass under Miri, 0 UB.
### Backward compatibility
Every v0.1 / v0.2 statechart compiles under v0.3 unchanged.
## 0.2.0 — 2026-04-22
### Fixed — behavior-visible (breaking)