v0.8.1
Text writer hardening, JSON reader fidelity, a document version report
over the C ABI, and a release gate that tests the Julia binding before any
binary ships. No breaking changes over v0.8.0.
Security hardening. The psse, pslf, powerworld, and OpenDSS writers replace a
line terminator inside any quoted or free-text field. A name that held a
\n or \r ended the record and made the rest of the text parse as new
records, so a crafted case name, DC line label, circuit id, or bus name
could forge whole records in the written file. Five such paths are now
closed, each with a test that reads the written text back and counts the
records. Upgrade if you write text formats from names you do not control.
- The two C JSON report entry points,
pio_last_error_jsonand
pio_schema_versions_json, now run inside the panic guard the other
entry points use. A panic in either one crossed the C boundary, which is
undefined behavior. build_ybusrefuses a case whose base MVA is zero or nonfinite. Such a
case wrote a matrix ofNaNand the CLI exited 0.- The auto sensitivity solver reads the real matrix shape (branches by
buses) instead of the reduced dimension alone, and holds the dense path
to a 2 GiB memory budget. The dense threshold moves from 512 to 8192,
because a dense solve is faster than conjugate gradient well past 512
buses. SetSensitivityOptions::auto_dense_thresholdto keep the old
value. PTDF and LODF results are unchanged: both paths were verified
bit-identical on case30. - The psse field splitter, the powerworld auxiliary token splitter, and
the pandapower split-frame reader reuse their buffers and move rows
instead of copying them. Reader output is unchanged. - New
pio_schema_versions_jsonC entry point reports the schema version
of every document format the library speaks (.pio.json, Arrow, the
distribution capability document, and the BMOPF vintage). A key is
nullwhen the owning feature is not compiled in.PIO_ABI_VERSION
does not cover document formats, so a binding that mirrors one of these
versions can now read it from the library and refuse a mismatch at load
or pin time instead of finding it downstream (#270, query half). release-binaries.ymlgates every tag on PowerIO.jl: the workflow
builds the tag, runs the binding's suite against it, and produces no
tarballs and no draft release on failure. A planned binding break
merges the paired PowerIO.jl change first, then re-runs the workflow.- The retired schema documents under
docs/schema/are pinned by a test.
A.pio.jsonwritten before v0.8.0 declares those URLs, so they stay
published even though the reader no longer accepts that lineage. - The egret and pandapower readers keep unrecognized element fields as
extrasinstead of dropping them silently, matching the PowerModels
reader. A powerio-written file still reads back extras-free (#263). - The PowerModels reader reports the taps it discards: a branch with an
off-nominaltapbut notransformer: trueflag reads as a line, and
one aggregated warning now names the branches and the total. The
inference rule itself is unchanged. .pio.jsonvalidation diagnoses duplicate payload uids directly
(VALIDATE.BALANCED.PAYLOAD_IDENTITY, a new always-present
balanced.payload_identitypass) instead of leaving the ambiguity to
surface later as a failed operating-point reference.- The text-only C conversion entry points warn when a distribution
writer produced a companion file they cannot return, naming the file:
an OpenDSS deck referencing aBuscoordsCSV the caller never received
no longer fails to compile with nothing to explain why. summary,package,convertwithout--from, andgeo extract|applyread and classify a.jsononce instead of twice. The
distribution reader's own document rule still applies on that path, so
a JSON that is not a distribution case is refused as before.- Python
Network.ptdf()/lodf()route through the auto sensitivity
solver (dense below the reduced-dimension threshold, iterative
conjugate gradient above it), matching the CLIsensitivities
command. Both takesolver="auto"|"dense"|"iterative". On a case above
the threshold results move from exact-dense to iterative-CG at a 1e-10
relative residual (#273).
What's Changed
- Report schema versions over the C ABI and gate releases on PowerIO.jl by @samtalki in #280
- docs: make AGENTS.md and languages.md match the tree by @samtalki in #282
- py: route ptdf/lodf through the auto sensitivity solver by @samtalki in #281
- format: capture unknown JSON fields; warn on discarded taps; single read by @samtalki in #287
- Close the record-injection seams; fix the auto solver policy and reader allocation churn by @samtalki in #295
- Release 0.8.1 by @samtalki in #290
Full Changelog: v0.8.0...v0.8.1