release: v0.18.0 — nothing drives it, so there is no solve - #450
Merged
Conversation
Eighteen changes since v0.17.0: remediation of the 2026-08-28 whole-project audit (#432-#442), a documentation-honesty cluster (#443-#447), and two solver fixes (#448, #449). Both criticals and every high from that audit are closed. The ledger went 137 findings / 35 open -> 149 / 33 open, zero critical, zero high; it grew because fixing things found things. Versions: workspace 0.17.0 -> 0.18.0, fnec_py 0.8.0 -> 0.9.0 in both its `Cargo.toml` and its `pyproject.toml` (the lockstep every release since v0.14.0 has used). Both lockfiles refreshed, SBOM regenerated and committed. **The changelog covered 2 of the 18 PRs.** `[Unreleased]` held entries for #448 and #449 only; the entire audit-remediation cluster -- both criticals among it -- had merged without one. Keep a Changelog's own warning is that a partial record "can be as dangerous as not having a changelog", because it reads as complete. Entries written for all eighteen and each verified cited by number, which is a check worth keeping: `for n in 432..449; do grep -q "#$n" docs/changelog.md; done`. Breaking, and the release notes carry a migration for each: a deck with no `EX` is refused (stdout now empty rather than `[]`, exit 1 rather than 0); a deck with neither `EX` nor `FR` likewise; `GM` decks change geometry, because fnec had been losing wires in silence against NEC-2 semantics; and `EX 4` impedances shift, since a current source is now the unit-voltage solve rescaled exactly. Claims swept rather than carried forward. Two were wrong and are corrected: - the plane-wave split/whole agreement was quoted at 8.1e-12, which came from a different incidence angle; re-measured at this commit on the matched pair it is 1.1e-12, against the test's 1e-9 gate; - "1655 items checked" by the doc-attachment gate was true at #441 and is 1681 today, so both documents now date the figure instead of letting a stale number read as current. Re-measured at this commit: no-`EX` exits 1 with 0 bytes on stdout in both text and JSON; `EX`-but-no-`FR` still exits 0 with 0 bytes (FND-084, open, and deliberately untouched); neither-`EX`-nor-`FR` exits 1; the oversized `RP` is refused; corpus 50 cases; 1093 tests; ledger 149/33. No dependency changed between v0.17.0 and v0.18.0: 526 packages before and after, and the only entries that moved are the nine workspace members' own versions. Established by set difference over `(name, versionInfo)` pairs -- not by hashing the sets, which is randomised per process and fooled an earlier release. Removed-feature sweep for the one `### Removed` entry: `FNEC_ACCEL_STUB_GPU` survives only in the retirement records that document its removal and in a schema note that calls it retired -- no live advertising. Gate: scripts/check-all.sh, EXIT=0, all 15 gates passed. The version-consistency check was sabotage-verified once for this repo: `check-binding-version.py` passes at 0.9.0/0.9.0, fails naming both files when pyproject alone says 0.9.1, and passes again restored. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_018p7FxX7QMWNJVNp9LbaLkB
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
v0.18.0 — Nothing drives it, so there is no solve
Eighteen changes since v0.17.0: remediation of the 2026-08-28 whole-project audit (#432–#442), a documentation-honesty cluster (#443–#447), and two solver fixes (#448, #449). Both criticals and every high from that audit are closed. Ledger: 137 findings / 35 open → 149 / 33 open, zero critical, zero high.
fnec_pyCargo.toml+pyproject.toml)The changelog covered 2 of the 18 PRs
[Unreleased]held entries for #448 and #449 only. The entire audit-remediation cluster — both criticals among it — had merged without a changelog entry. Keep a Changelog's own warning is that a partial record "can be as dangerous as not having a changelog", because it reads as complete.Entries are now written for all eighteen, and each is verified cited by number:
Breaking changes, each with a migration in the release notes
EXcard is refused. stdout now carries nothing — not[]— and exit is 1. A JSON consumer that parsed the empty array was recording a null result where it should have reported an error.EXnorFRlikewise moves 0 → 1. A deck withEXbut noFRis unchanged (FND-084, open, deliberately untouched).GMdecks change geometry. fnec readI2as a last tag andF7as a first tag with noNRPTconcept, so standard decks lost wires in silence. Re-run any deck with aGMcard before trusting a stored result.EX 4impedances shift. A current source is now the unit-voltage solve rescaled byi0/I_feed— exact for a linear system.Claims swept — two were wrong and are corrected
8.1e-12; that figure came from a different incidence angle. Re-measured at this commit on the matched pair: 1.1e-12, against the test's 1e-9 gate.Re-measured at this commit: no-
EXexits 1 with 0 bytes in both text and JSON;EX-but-no-FRstill exits 0 with 0 bytes; neither exits 1; the oversizedRPis refused; corpus 50 cases; 1093 tests; ledger 149/33.No dependency changed between v0.17.0 and v0.18.0 — 526 packages before and after, only the nine workspace members' own versions moved. Established by set difference over
(name, versionInfo)pairs, not by hashing the sets, which is randomised per process and fooled an earlier release.Removed-feature sweep for the single
### Removedentry:FNEC_ACCEL_STUB_GPUsurvives only in the retirement records documenting its removal and in a schema note calling it retired. No live advertising.Gate evidence — disclosed as local
Per the release checklist, gates run locally rather than in CI are sufficient only with explicit disclosure. This ran on the committed tree with a clean working directory, exit code captured directly rather than through a pipe:
CI's own 8 checks run independently on this PR, and the Mint release tag workflow re-verifies CI green at the exact commit it tags — so the tag does not rest on the local run.
The version-consistency check was sabotage-verified once for this repo (checklist §2):
check-binding-version.pypasses at 0.9.0/0.9.0, fails naming both files whenpyproject.tomlalone says 0.9.1, and passes again once restored.🤖 Generated with Claude Code
https://claude.ai/code/session_018p7FxX7QMWNJVNp9LbaLkB