Phase 1 — semantics doc
docs/002. hsmc-semantics-formal.md
Phase 2 — deterministic execution journal
hsmc/src/journal.rs (TraceEvent, JournalSink, ActionKind)
hsmc-macros: __chart_journal! emission at every observable site
(entry/exit/action/transition/timer arm-cancel-fire/during/emit/
event delivery/terminate). Per-state during count helpers, stable
chart-hash via FNV-1a. Action observation moved out of run_action
and into call sites so ActionKind is accurate.
Public API on the generated machine: journal(), take_journal(),
clear_journal(), CHART_HASH.
Phase 3 — verification crate (Creusot scaffolding)
verification/{Cargo.toml,mise.toml,requirements.txt,INVARIANTS.md}
verification/src/{event_queue.rs,timer_table.rs} — Pearlite
contracts on simplified mirrors of the runtime types. cargo
creusot generates Coma IR cleanly; VCs not yet discharged.
Correspondence tests drive the verified mirror and the runtime
type with the same op sequences and assert observable parity.
Tests — 113 deterministic-flow tests across 22 files. Each compares a
hand-built expected journal byte-for-byte against actual, anchored
to a spec section: initial entry, lateral/self/up transitions,
bubbling, timers, emit, ordering, durings, step/dispatch
equivalence, root-targeting, current_state, termination.
Tooling — mise.toml (root): stable Rust + cargo subcommands.
verification/mise.toml: pinned nightly-2025-11-13 + opam + python
venv + uv. just verify is fully self-installing.
Bug fix — root state targetable by the chart's own name (e.g.
`on(Trig) => ChartName;`) per spec §"How transitions work".
CHART_HASH — stable FNV-1a fingerprint over the chart's structural
definition; mismatch on replay = different chart.
29 lines
1.5 KiB
TOML
29 lines
1.5 KiB
TOML
# Project-local mise configuration for hsmc.
|
|
#
|
|
# Lists the dev/test/lint tooling the workspace needs. The verification
|
|
# subcrate has its OWN mise.toml (verification/mise.toml) that pins the
|
|
# specific nightly Rust + opam + Python venv that Creusot requires —
|
|
# `just verify` cd's there so those settings activate.
|
|
#
|
|
# When you `cd` into the repo, the global `enter = "mise i -q"` hook
|
|
# auto-installs everything missing.
|
|
|
|
[tools]
|
|
|
|
# ── Rust toolchain (stable) ─────────────────────────────────────────
|
|
# Components and targets needed by the main crate's dev/test/lint flow.
|
|
# Verification needs a different (pinned) nightly — see verification/mise.toml.
|
|
rust = { version = "stable", components = "clippy,rustfmt,rust-src,llvm-tools-preview", targets = "thumbv7em-none-eabihf,thumbv6m-none-eabi,thumbv8m.main-none-eabihf,riscv32imac-unknown-none-elf" }
|
|
|
|
# ── Cargo subcommands the justfile drives ───────────────────────────
|
|
"cargo:cargo-nextest" = "latest" # `just test`, `just dev`
|
|
"cargo:cargo-llvm-cov" = "latest" # `just coverage`
|
|
"cargo:cargo-mutants" = "latest" # `just mutants`
|
|
"cargo:cargo-audit" = "latest" # `just audit`
|
|
|
|
# ── Build orchestration ─────────────────────────────────────────────
|
|
just = "latest"
|
|
|
|
[settings]
|
|
trusted_config_paths = ["{{ config_root }}"]
|