Route parse_file(path; backend=:powerio) through the PowerIO Rust core, making PowerIO a hard dependency of PowerDiff. PowerIO stays raw and lossless; PowerDiff normalizes (the existing _normalize_* / _finish_parse tail), so a ParsedCase from :powerio is indistinguishable from :native.
Status: wired on mk/backends.
import PowerIO; PowerIO in [deps], pinned via [sources] (git) until it registers in General — then drop [sources] and add [compat].
_load_powerio_network + _parsedcase_from_powerio + _powerio_cost_row in src/parser.jl; :native stays the default; :powerio needs a file path (the IO method rejects it).
- caseio→powerio rename throughout;
docs/caseio-integration.md → docs/powerio-integration.md.
- Parity test in
test/test_parser_parity.jl: :powerio == :native field-for-field on case5 / case14 / case30, gated on PowerIO.library_available(). Verified 672/672 locally.
Ordering / blocked on:
See docs/powerio-integration.md for the field-by-field contract.
Route
parse_file(path; backend=:powerio)through the PowerIO Rust core, making PowerIO a hard dependency of PowerDiff. PowerIO stays raw and lossless; PowerDiff normalizes (the existing_normalize_*/_finish_parsetail), so aParsedCasefrom:poweriois indistinguishable from:native.Status: wired on
mk/backends.import PowerIO; PowerIO in[deps], pinned via[sources](git) until it registers in General — then drop[sources]and add[compat]._load_powerio_network+_parsedcase_from_powerio+_powerio_cost_rowinsrc/parser.jl;:nativestays the default;:powerioneeds a file path (theIOmethod rejects it).docs/caseio-integration.md→docs/powerio-integration.md.test/test_parser_parity.jl::powerio==:nativefield-for-field on case5 / case14 / case30, gated onPowerIO.library_available(). Verified 672/672 locally.Ordering / blocked on:
[sources].revbefore this branch's CI runs.See
docs/powerio-integration.mdfor the field-by-field contract.