Skip to content

CodeEraser 1.3.1

Choose a tag to compare

@github-actions github-actions released this 31 Aug 00:58
· 92 commits to main since this release

CodeEraser 1.3.1

A documentation and site release. The shipped program is bit-for-bit the same measurement side and judgment core as 1.3.0 — see Score comparability below for the check that says so.

Highlights

  • The homepage's three GUI screenshots are now generated by the product. They were posed by hand in August and had gone stale four ways at once: an eight-tab strip after the strip grew to ten, ce.join-report/0.1.0 after the schema reached 0.3.0, a tree measuring cli/tests inline after it became a submodule that is read but never judged, and alt text quoting a structure score of 854 after it had moved to 832. Every one of those facts is derived elsewhere on the same site; the pictures were the last surface that could disagree with the product and not be caught. scripts/shoot_gui.js now shoots them by running the real gui/ui in headless Edge — the engine the shipped app draws through, since Tauri on Windows is WebView2, so these are the product's own pixels rather than a lookalike. The one thing a browser has no version of is the webview's invoke bridge; it is fed report documents the CLI produced, and those are the documents the webview itself would have received (ce … --format json and the Tauri command call the same report_json over the same judge::run).
  • Five gates hold the pictures (it/site_screenshots.rs): no picture may be older than the gui/ui it shows (git ancestry, and a shallow clone with no history is refused by name rather than passing vacuously); each is a whole 1424×892 app window; neither homepage may hand-type a number beside a picture; the receipt contracts/gui-shots.json must name the three SCHEMA_IDs the code declares today — the path the first gate cannot see, where the interface holds still but a report shape moves — plus a sha256 per picture; and every file under site/assets/ must be claimed by some gate, derived rather than listed.
  • The shoot is reproducible, which is the part that makes it a check. Caught by re-running the generator before cutting this release: three shoots off one saved report set gave gui-tree.png three different digests and gui-candidates.png two. Every shot opens by clicking a button, and the app gives buttons a 0.12 s background transition, so a capture two frames later landed at an arbitrary point along the interpolation. That is not cosmetic — if a re-shoot always differs, "is the committed picture still current?" has no answer. The fix uses the app's own switch: it already answers prefers-reduced-motion, so the harness declares it and the transition never starts. Three consecutive shoots are now byte-identical, and gui-candidates.png was re-taken because the old one was shot mid-transition. A sixth gate holds the coupling: the CSS rule and the CDP call live in two files nobody edits together, and removing either reddens it.
  • The two scores say which they are. ce structure and ce check both give a number out of 1000 and they are not the same measure: one is tree-scale entropy, the other the gate's own seven axes plus the ratchet and the floor. This repository sits at 832 on one and 952 on the other, and neither is "the" score. The console had always distinguished them; the two GUI screens printed a bare number, so a reader moving between tabs — or between the homepage's terminal block and its screenshot — had no way to tell which was which. Both screens now carry the console's own words in both languages, and docs/reference/gui.md records why the two cannot be reconciled: they are not measuring the same thing.
  • The judgment diagram fits its frame. Both language twins were drawn on a 1000-wide canvas that the layout never filled, leaving the right third of the picture empty in the README and on the site. The canvas is ours rather than the renderer's — meta.viewBox in our diagram IR is a hand-written number — so the fix is one line per language file and a re-render: same geometry, a frame that matches it.
  • The Chinese diagram speaks one language. The renderer writes a little chrome of its own that no key in our IR can reach, so a zh diagram was still labelled "Legend". scripts/diagram_svg.mjs now carries a per-language map, and a gate reads that map back out of the renderer and refuses any zh SVG still carrying a term it covers — so the check holds no second copy of the list whose whole job is to be applied.
  • One derived fact stopped answering for two different rosters. count:axes is linked to the check score's seven axes, and both READMEs were rendering it inside sentences about the structure family's seven, which live in a different file. They are equal today, so the prose read true and nothing would have noticed the day either family grew. The structure sentences now render count:structure_axes, scraped from the judge that owns them.
  • README, both languages, aligned and slimmed to 168 lines each: the score bullet says which score and names its axes, the design rules run to ADR-009, the generated-or-gated inventory names the three members it had grown since it was written, and five restatements are gone — each said elsewhere in full, none of them a fact the page states only once.

Score comparability

Fully comparable with 1.3.0, and checkably so: git diff v1.3.0..v1.3.1 -- cli/src core/app is empty. Not a line of the measurement side or the judgment core moved; the two version literals in cli/Cargo.toml and core/ce-core.cabal are the whole of it. The wire is untouched (proto 6.4.0, graph/1 6.4.0, index schema 15) and no default guard tier changed, so the FPR figures stand where 1.3.0 left them. That is also why this is a patch and not a minor: what shipped is a build-time screenshot generator, two GUI caption strings, the documentation and the site.

Latency

No row was added, for the reason above: the measured program is the same program. The dashboard's rule is that the whole series is replayed in one sitting whenever a release joins it, because every row must share one machine state — replaying a single unchanged tag four days later moved every one of its seven metrics, from 11 % faster to 12 % slower. Replaying sixteen tags to add a row for identical binaries would publish that drift under a version number, which is worse than publishing nothing.

What this release does carry is the series 1.3.0's notes promised but could not ship: the whole-series replay landed on main after that tag was cut, so the dashboard and docs/BENCH.md reach the site with this one.

Unsigned, on purpose

Code signing and notarisation stay out of scope (ADR-007/R1). The SHA-256 chain is the permanent trust anchor: every asset is pinned in plugin/bin/manifest.env at the release commit, the tag job verifies each pin before publishing, and SHA256SUMS covers the set for offline checking. ce update reads the latest tag and that tag's committed pins, so it needs nothing published beyond this release.