Tags: AxonOS-org/axonos-stack
Tags
fix: one HAL in the graph, and the import that failed CI now earns it… …s place Two defects, and the first is the kind only this repository can see. The stack moved to axonos-hal 0.3.0 for operating points while axonos-vault and axonos-supervisor stayed on 0.2.0. Cargo resolves two versions of one crate without complaint, and the compiler then refuses to unify the two SampleFrame types it produced — an error that names the same type on both sides of a mismatch. No individual crate can observe this about itself: vault is correct, supervisor is correct, the HAL is correct, and the graph is wrong. Fixed by re-pinning the dependents to 0.3.0 rather than by lowering the stack to hide it. The second is smaller and was the visible one: ArtifactReport was imported and never used, so clippy failed the build. It is now used for the thing it was imported for. The summary names which findings a session met rather than counting frames, because "1826 frames screened" is a number and "slew" is what the recording actually did — which is the whole reason the screener reports independent bits instead of a single severity. Transcript regenerated. Clippy, rustfmt, tests, --locked build and docs all green.
chore: licence texts, NOTICE, citation and changelog The crate declared Apache-2.0 OR MIT in its manifest and README from its first release and shipped neither licence text. A dual-licence declaration without the licences does not grant what it announces: a reader who wanted to depend on this had nothing to read, and Apache-2.0's attribution clause cannot be honoured against a NOTICE that does not exist. Added: both licence texts, a NOTICE stating authorship, the attribution obligation, the intellectual-property position and the pre-clinical scope, CITATION.cff with Denis Yermakou listed first, and a changelog. No code changed. The version moves because the artefact a consumer receives is materially different — it can now be depended on under the terms it always claimed.
release: 0.3.1 — formatted, which the previous release was not cargo fmt --check failed on main.rs. I edited the session through a script, ran cargo build, and never ran rustfmt — so a release whose whole subject is that CI diffs a transcript byte for byte shipped with source CI would not accept. There is no excuse for that one; the formatter is the cheapest gate in the file. Formatted, transcript regenerated from the formatted source so the two cannot disagree, and the pipeline pin moved to v0.9.2 with the lockfile entry and the stack table moving together.
feat!: 0.3.0 — the session became the whole path, and the lockfile bu… …g that broke --locked Two things, and the first is the reason CI was red rather than merely thin. Cargo.lock declared axonos-stack at 0.1.0 while Cargo.toml said 0.2.0. I bumped the manifest and hand-edited only the dependency revisions in the lock, so cargo had to update it and --locked correctly refused. The lock is regenerated rather than patched this time, which is the whole lesson: a lockfile is generated output and editing it by hand is how it stops describing the thing it locks. The second is what this repository was actually missing. The session went from the converter straight to the vault, skipping every stage that turns a sample into evidence — so a "reference session" referenced about half the system while looking like coverage. axonos-signal-pipeline 0.9.1 now sits in the middle: every frame is re-referenced against the common average before anything reads an amplitude, screened for five independent artifact findings, and once a window has accumulated, reduced to narrowband power at four SSVEP-shaped targets. The argmax is deliberately not taken — choosing a target is a decision, and decisions do not belong in a transport session. Adding conditioning immediately found something, which is the argument for adding it. Sixty-one per cent of frames trip the slew limit: consecutive samples step further than physiology allows. The detector is right and the source is wrong — SimDevice emits white noise, whose consecutive samples are independent, where a real acquisition path is band-limited and cannot step that far between samples. The published threshold stays and the transcript prints a NOTE saying why, because a session that tunes its own thresholds demonstrates tuning. The transcript is regenerated: 61 lines, each distinct finding set announced once rather than on every alternation, with band reports and the conditioning counters in the summary. The accounting identity still closes. 6 tests green.
fix!: re-pin to the corrected organs, and record what re-pinning found The stack pinned axonos-hal v0.1.1 — the version whose stage table was fabricated and whose utilisation ceiling had no published basis. The flagship integration repository was demonstrating a model that had been withdrawn, and its byte-exact transcript was byte-exact about the wrong numbers. Re-pinned to hal v0.2.0, vault v0.2.0, supervisor v0.1.1. The transcript is regenerated and the utilisation line moves from 24.4% to the published 17.3%, which is the whole reason this transcript is versioned rather than quietly refreshed. Re-pinning found a third defect, in this crate. The session called vault.issue(...) and discarded the boolean. When vault 0.2.0 began refusing the old 3 200-bit grant under RFC-0009 N5, the session ran to completion with no grant installed and reported NoSuchGrant for every reading — a silent misconfiguration wearing the appearance of a working run, which is exactly the class of failure this repository exists to catch. The return is now checked and the session aborts with the reason. The grant is 2 048 bits: sixty-four entries at the minimum charge, which is every disclosure this vault can record. The summary reads the budget from the grant rather than repeating a literal, so the two cannot drift again. The test that recorded the two disagreeing bounds is rewritten to record their closure, and now also asserts that the grant advertises the figure it enforces. Lockfile regenerated; verify_pins.py confirms all three tags against the live remote. 6 tests green.
feat: axonos-stack 0.1.0 — the reference session, and the first thing… … it found Each organ is tested against the one below it; nothing tested the chain. A chain is where the interesting failures live, because every component is correct about its own contract and wrong about its neighbour's assumptions. The binary wires SimDevice through the supervisor and the vault and prints a deterministic transcript. Same seed, same bytes, any machine. CI diffs it against reference/session-7.txt, so a dependency change that alters observable behaviour fails with a diff of exactly what moved — a stronger statement than a checksum, which would only describe what compiled. It also closes the roadmap item asking for a deterministic simulator that runs the full path without hardware; SimDevice was half of it. On its first run the chain surfaced a defect no component test could reach. axonos-vault has two bounds that disagree: a grant declares 3 200 bits, the audit log holds 64 entries, and the vault refuses to release what it cannot record — so the effective ceiling is 2 048 bits and the grant's declared figure is not the binding one. Both behaviours are individually correct and individually tested. The fix belongs upstream in vault 0.2; the test here asserts the true behaviour and names it rather than asserting my assumption. verify_pins.py exists because --locked does not do what people think. It proves the lockfile is unchanged; it does not notice a tag repointed on the remote, since cargo fetches the recorded revision and builds happily. This stack is assembled from three mutable pointers with immutable-sounding names, so the check runs first and on a daily schedule. Verified in both directions: against the live tags, and against a deliberately altered lockfile. 6 tests driving the real binary rather than re-implementing its wiring, and the accounting identity — delivered + lost = produced — asserted across five seeds.