Skip to content

chore: release v0.10.0#315

Merged
Zious11 merged 12 commits into
mainfrom
release/0.10.0
Jun 24, 2026
Merged

chore: release v0.10.0#315
Zious11 merged 12 commits into
mainfrom
release/0.10.0

Conversation

@Zious11

@Zious11 Zious11 commented Jun 24, 2026

Copy link
Copy Markdown
Owner

Summary

This PR merges the release/0.10.0 branch into main and constitutes the v0.10.0 release of wirerust.

BREAKING CHANGE — DNP3 JSON output key rename. See the DNP3 section below for the consumer migration note.

What's in this release (PRs #310 / #312 / #313 / #314)

BREAKING: DNP3 parse_errors key rename — consumer migration

Before (≤ v0.9.x) After (≥ v0.10.0)
detail["total_parse_errors"] detail["parse_errors"]

jq migration:

# Before
jq '.[] | .detail.total_parse_errors'

# After
jq '.[] | .detail.parse_errors'

All other DNP3 output fields are unchanged. Non-DNP3 analyzers (ARP, HTTP, TLS, Modbus) are unaffected.

CHANGELOG — v0.10.0

## [0.10.0] - 2026-06-24

### Breaking Changes

- **DNP3 analyzer output: renamed summary key `total_parse_errors` → `parse_errors`.**
  The `detail` map produced by the DNP3 analyzer now uses the key `"parse_errors"` instead of
  `"total_parse_errors"`, aligning DNP3 with sibling analyzers (HTTP, TLS, Modbus) that already
  use `"parse_errors"`. JSON consumers reading DNP3 summary output must migrate the key name.
  [PC-014, BC-2.15.020 v1.4, STORY-108 AC-010]

  **Migration:** Replace any lookup of `detail["total_parse_errors"]` with
  `detail["parse_errors"]` in your consumer. For `jq` users:
  `jq '.[] | .detail.total_parse_errors'` → `jq '.[] | .detail.parse_errors'`.

Release checklist

  • Branch cut from develop @ 2b348a1
  • version = "0.10.0" in Cargo.toml / Cargo.lock
  • CHANGELOG.md ## [0.10.0] - 2026-06-24 section added
  • Commit chore: release v0.10.0 (db541ce) on release/0.10.0
  • Branch pushed; CI running
  • Human authorization to merge → main
  • Tag v0.10.0 on main after merge (devops-engineer)
  • Merge main back into develop (devops-engineer)

Zious11 added 12 commits June 23, 2026 15:03
…p [PC-015, BC-2.16.016]

Adds long_help to the --arp clap arg in src/cli.rs documenting that ARP
findings output is UNBOUNDED — no MAX_FINDINGS cap applies to the ARP
analyzer path (contrast: HTTP/TLS/Modbus/DNP3 cap at 10,000 via TCP
reassembly layer). Also clarifies that the ARP binding table cap
(MAX_ARP_BINDINGS=65,536) and storm-counter table cap
(MAX_STORM_COUNTERS=4,096) are memory bounds on internal state only and
do not cap findings output.

Documentation-surface fix only: no ARP analyzer behavior changed.

Passes: test_BC_2_16_016_cli_help_documents_arp_findings_unbounded (Red Gate)
Stays green: test_BC_2_16_016_arp_findings_vec_has_no_cap (characterization)
… [PC-015]

- src/analyzer/arp.rs: mod bc_2_16_016 characterization test verifies
  ARP findings Vec has no MAX_FINDINGS cap (>10,000 findings with N=10,001
  distinct IPs, spoof_threshold=1)
- tests/bc_2_16_016_arp_tests.rs: integration Red Gate test asserts the
  word "unbounded" appears in wirerust analyze --help output for --arp flag

Part of fix bundle fix-pc-013-014-015 / STORY-113 AC-022 / BC-2.16.016 v1.0.
docs(cli): document ARP findings output is unbounded in --arp help [PC-015]
… framing

Update doc-comments in mod bc_2_16_004_inv6 and its outer block comment to
reflect BC-2.16.004 v1.10: the four .expect() sites are by-construction loud
tripwires (not fail-safes), the tests exercise real production paths (entry
always present / first_rebind_ts always Some at Step 3), and the module
description accurately frames all five tests as finding-count/severity
regression guards. Removes all v1.9 "silent skip" / "fail-safe degradation" /
"Post-fix if-let" language. No test logic, assertions, or function names changed.
test(arp): regression guards for BC-2.16.004 by-construction .expect() invariants [PC-013]
…014, BC-2.15.020]

BREAKING CHANGE: DNP3 analyzer summarize() detail map now emits key
"parse_errors" instead of "total_parse_errors", aligning DNP3 with the
HTTP, TLS, and Modbus sibling analyzers. JSON consumers reading DNP3
summary output must update their key references.

- src/analyzer/dnp3.rs: rename local var total_parse_errors -> parse_errors,
  update doc comment, change string key literal "total_parse_errors" ->
  "parse_errors" (the single behavioral change, line ~1425)
- tests/dnp3_detection_tests.rs: update key lookups and assertions in
  test_BC_2_15_020_summarize_empty_zero_flows (~line 993) and
  test_BC_2_15_020_summarize_includes_parse_errors (~line 1362-1380) to
  use the new key name; Red Gate test
  test_BC_2_15_020_parse_errors_key_name_is_parse_errors now passes
- tests/bc_2_15_110_dnp3_dispatcher_tests.rs: rename local variable
  total_parse_errors -> parse_errors (~line 959/961, cosmetic only)
- CHANGELOG.md: document breaking change under [Unreleased]

Traces to: BC-2.15.020 v1.4 postcondition 1 (D-220); STORY-108 AC-010.
…w field; add migration note to CHANGELOG [PC-014]

CR-004: summarize() local `parse_errors` renamed to `aggregate_parse_errors` to
visually distinguish the cross-flow aggregate from Dnp3FlowState.parse_errors.
JSON output key "parse_errors" is unchanged.

CR-005: CHANGELOG breaking-change entry now includes a concrete migration
snippet (jq one-liner) for script/JSON consumers.
fix(dnp3)!: rename output key total_parse_errors -> parse_errors [PC-014]
chore(dnp3): resync STORY-108 demo evidence + test comment to parse_errors [PC-014]
@Zious11 Zious11 merged commit 0cbe922 into main Jun 24, 2026
10 checks passed
@Zious11 Zious11 deleted the release/0.10.0 branch June 24, 2026 15:19
Zious11 added a commit that referenced this pull request Jun 24, 2026
…peline QUIESCED

Decisions recorded:
- D-225: PC-014 DELIVERED & MERGED (PR #313 fix(dnp3)!: rename total_parse_errors->parse_errors,
  develop f5c002a). Post-merge consistency audit CONSISTENT (7/7). DRIFT-1/DRIFT-2 closed via
  PR #314 (develop 2b348a1) — AC-010/AC-011 demos re-recorded (VHS).
- D-226: v0.10.0 RELEASED (PR #315 → main 0cbe922, tag v0.10.0, run 28109367603 SUCCESS,
  4 binaries). develop back-merged ff4b82b. Cycle fix-pc-013-014-015 CONVERGED + CLOSED.

State changes:
- pipeline: ACTIVE → STEADY-STATE; phase: FIX-CYCLE → QUIESCED
- released_version: v0.9.4 → v0.10.0 (0cbe922); prior_* shifted to v0.9.4
- develop_head: e684889ff4b82b; main_head: 96b49e80cbe922
- current_cycle: NONE; current_wave: QUIESCED
- PC-013/PC-014/PC-015 all moved to resolved-do-not-reopen line
- Spec versions at close: BC-INDEX v1.73, BC-2.15.020 v1.4, BC-2.16.004 v1.10,
  BC-2.16.010 v1.8, BC-2.16.016 v1.0; STORY-108 v1.2, STORY-113 v1.3, STORY-114 v1.6
- D-219..D-224 archived to cycles/fix-pc-013-014-015/decisions-archive.md
- Fresh SAFE-TO-CLEAR / resume-procedure block written (D-226 ground truth)
- STATE.md: 187 lines (under 200-line target)

New cycle artifacts:
- cycles/fix-pc-013-014-015/lessons.md: 2 lessons (S-7.02 satisfied, no follow-up story)
- cycles/fix-pc-013-014-015/decisions-archive.md: D-219..D-224

Lessons (S-7.02):
- L1 [process-practice]: Backlog labels must be verified against actual code during F1/scoping.
  All three open-item descriptions were factually inaccurate; research caught all before wrong fix shipped.
- L2 [design-lesson]: .expect() on internal invariants is correct; silent-skip is fail-OPEN anti-pattern.
  No new engine story required — existing scoping gate already encodes correct behavior.

Backlog items added: DEMO-TAPE-PATH-001, DEMO-MEDIA-CHECKSUM-001, DEPENDABOT-311 (non-blocking).

Count-propagation sweep: no numeric BC/story count changed this burst.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant