Skip to content

Releases: ArcavenAE/wirerust

wirerust-a alpha-20260929.1

Pre-release

Choose a tag to compare

@github-actions github-actions released this 29 Sep 16:17

Channel: alpha (develop branch)
Binary: brew install arcavenae/tap/wirerust-a or download below
Commit: 195c74a
Signed: Apple Developer ID (notarized)

wirerust-a alpha-20260924.1

Pre-release

Choose a tag to compare

@github-actions github-actions released this 24 Sep 20:17

Channel: alpha (develop branch)
Binary: brew install arcavenae/tap/wirerust-a or download below
Commit: 9bc0168
Signed: Apple Developer ID (notarized)

wirerust-a alpha-20260906.1

Pre-release

Choose a tag to compare

@github-actions github-actions released this 06 Sep 00:38

Channel: alpha (develop branch)
Binary: brew install arcavenae/tap/wirerust-a or download below
Commit: 7b741a9
Signed: Apple Developer ID (notarized)

wirerust-a alpha-20260905.2

Pre-release

Choose a tag to compare

@github-actions github-actions released this 05 Sep 20:13

Channel: alpha (develop branch)
Binary: brew install arcavenae/tap/wirerust-a or download below
Commit: 8b7c11a
Signed: Apple Developer ID (notarized)

wirerust-a alpha-20260905.1

Pre-release

Choose a tag to compare

@github-actions github-actions released this 05 Sep 16:14

Channel: alpha (develop branch)
Binary: brew install arcavenae/tap/wirerust-a or download below
Commit: 649238f
Signed: Apple Developer ID (notarized)

wirerust-a alpha-20260804.1

Pre-release

Choose a tag to compare

@github-actions github-actions released this 04 Aug 19:33
62fc9f0

Channel: alpha (develop branch)
Binary: brew install arcavenae/tap/wirerust-a or download below
Commit: 62fc9f0
Signed: Apple Developer ID (notarized)

wirerust v0.13.2

Choose a tag to compare

@github-actions github-actions released this 25 Jul 02:36
9601d71

Changed

  • ENIP on_data PDU dispatch loop: unsafe *mut EnipFlowState split-borrow replaced
    with safe take-remove-reinsert (STORY-181, SEC-001, wave-85).

    The PDU dispatch loop in src/analyzer/enip.rs on_data previously acquired a raw
    *mut EnipFlowState pointer via self.flows.get_mut(&flow_key) and called
    self.process_pdu(unsafe { &mut *flow_ptr }, ...), relying on a multi-line SAFETY
    comment to guarantee that process_pdu never accesses self.flows. This pattern was
    sound but fragile — any future change to process_pdu touching self.flows would
    silently break soundness.

    The fix removes the raw pointer entirely. Before the dispatch loop,
    self.flows.remove(&flow_key) produces an owned EnipFlowState; process_pdu(&mut self, &mut flow, ...) is called with this local variable (structurally disjoint from
    self.flows); after the loop, self.flows.insert(flow_key, flow) re-inserts the flow.
    The compiler enforces disjointness — no convention required. No unsafe block, no
    #[allow(clippy::ptr_as_ptr)], no raw-pointer cast remains in on_data. Behavior is
    identical; all 2667 tests pass unchanged.

    Resolves SEC-001 from .factory/tech-debt-register.md (MEDIUM, carry-forward since
    PR Zious11#334).

Added

  • IEC-104 timed control command detection: TypeIDs 58–64 emit T1692.001 and T0836
    (STORY-180, BC-2.19.029 + BC-2.19.030, wave-85).

    The IEC-104 passive analyzer detects the CP56Time2a time-tagged variants of control
    command TypeIDs, closing the evasion gap documented in IEC104-TIMED-CMD-GAP-001 where
    TypeIDs 58–64 fell silently through the _ catch-all arm.

    Two new match arms in detect_iec104_threats (src/analyzer/iec104.rs):

    • 58..=60 (C_SC_TA_1 / C_DC_TA_1 / C_RC_TA_1 — timed switching commands): emits one
      T1692.001 "Unauthorized Message: Command Message" Possible / Medium / Impact finding
      with CASDU and conditional first_ioa evidence. No T0836 (binary switching control, not
      parameter writes). Parity with untimed arm 45..=47 (BC-2.19.019); summary wording
      distinguishes timed from untimed with "time-tagged" qualifier and C_SC_TA/C_DC_TA/C_RC_TA
      mnemonics (BC-2.19.029).

    • 61..=64 (C_SE_TA_1 / C_SE_TB_1 / C_SE_TC_1 / C_BO_TA_1 — timed set-point and
      bitstring write commands): emits T1692.001 Possible then T0836 "Modify Parameter" Possible,
      both with CASDU and conditional first_ioa evidence. T0836 is co-emitted because set-point
      and bitstring TypeIDs modify ICS control parameters. Parity with untimed arm 48..=51
      (BC-2.19.019); summaries name C_SE_TA/C_SE_TB/C_SE_TC/C_BO_TA mnemonics (BC-2.19.030).

    The catch-all arm comment at detect_iec104_threats is narrowed from "52–99" to
    "{52–57, 65–99}", noting that TypeIDs 58–64 are now handled by BC-2.19.029 and
    BC-2.19.030 (AC-180-007; BC-2.19.022 v1.1). The existing post-emission [TEST] loop
    covers the new arms automatically — no extra wiring required (BC-2.19.017 invariant 1).

    cargo test --test iec104_analyzer_tests: 248 passed (221 prior + 27 new STORY-180 tests).


Channel: stable
Binary: brew install arcavenae/tap/wirerust or download below
Signed: Apple Developer ID (notarized)

wirerust-a alpha-20260725.1

Pre-release

Choose a tag to compare

@github-actions github-actions released this 25 Jul 02:37

Channel: alpha (develop branch)
Binary: brew install arcavenae/tap/wirerust-a or download below
Commit: 89a5b39
Signed: Apple Developer ID (notarized)

wirerust-a alpha-20260724.1

Pre-release

Choose a tag to compare

@github-actions github-actions released this 24 Jul 21:05

Channel: alpha (develop branch)
Binary: brew install arcavenae/tap/wirerust-a or download below
Commit: 936bde0
Signed: Apple Developer ID (notarized)

wirerust v0.13.1

Choose a tag to compare

@github-actions github-actions released this 21 Jul 21:11
47b7d23

Added

  • bin/check-green-doc-tense: four phrase-level stub-era patterns added
    (STORY-176, AC-176-001, wave-84, PG-GATE-VOCAB-BLINDSPOT).

    The green-doc-tense gate gains four patterns (26-29) that catch stub-era
    vocabulary not covered by the original gate:

    • Pattern 26 \bskeleton compiles?\b: flags "harness skeleton compiles" /
      "VP-044 Kani skeleton compiles" -- compile-only harness scaffolding that
      has no real proof assertions yet. Bare-label forms ("proof skeleton",
      "VP-024 Sub-D skeleton") and past-tense forms ("skeleton originated") are
      not matched by specificity. Trailing \b word boundary now also excludes
      the past-tense form "skeleton compiled" (F-S176P1-002); leading \b
      excludes compound-word prefixes such as "exoskeleton" and "microskeleton".
    • Pattern 27 (exposes|is a|are) compile-only seam(s): flags present-tense
      assertions that a module or harness exposes compile-only seams. Requires
      an explicit present-tense verb so "as a compile-only seam" (past-tense
      narrative) and bare seam idioms ("Test seam accessors", "VP-047 seam")
      are not matched.
    • Pattern 28 \b(are|is) (currently) compile-only: flags present-tense
      predicate claims ("are currently compile-only", "is compile-only at the
      red-gate boundary"). "was compile-only" and forms without a preceding
      are/is are not matched.
    • Pattern 29 until … wired: flags CI-wiring-incomplete prose. Re-narrowed
      (F-S176P1-001): the original until.*is wired requirement was replaced by
      until.*wired with a negative lookahead that excludes object
      pronouns/articles immediately after "wired" (it, the, a, that,
      this, them). This catches bare "fails until wired" in addition to
      the original "until … is wired" form, while still excluding past-tense
      verb-object forms like "wired it" and "wired the handler".
    • Docstring TOKEN LIST entries 23-25 added (F-S176P1-005): the three
      patterns added by STORY-174 (AC-174-008) were implemented in the code
      but never documented in the TOKEN LIST or allowlist notes. Entries 23
      (All tests … MUST FAIL with interposed words), 24 (FAIL(S) Red Gate),
      and 25 (are/is todo!() stub(s)) are now fully documented.

    Zero false positives verified across the tracked Rust tree. Self-tested by
    bin/test_check_green_doc_tense.py (all known-bad patterns flagged, all
    known-good allowlist forms not).

  • .gitignore mutants.out*/ glob + bin/test_gitignore_mutants_glob.py regression guard
    (STORY-176, AC-176-003, wave-84).

    .gitignore gains mutants.out*/ under the cargo-mutants section, covering the
    default cargo-mutants output dirs mutants.out/ and mutants.out.j4-invalid/
    (complements the existing mutants-f6*/ glob). A new self-test
    bin/test_gitignore_mutants_glob.py asserts both dirs are git-ignored via 2
    git check-ignore assertions. The self-test is wired into CI's bin-selftest
    job and was green on merge.

  • bin/validate-citations: opt-in path:line:anchor symbol-at-line assertion
    (STORY-166, AC-166-001, wave-84/wave-75, PG-W75-VALIDATE-CITATIONS-SYMBOL-GAP).

    The citation grammar gains an optional third :anchor field --
    path:line:anchor or path:line-line:anchor (a range's anchor applies to
    the start line only). When present, the tool reads the cited line and
    asserts the anchor token appears -- either as a def/async def/fn/
    class declaration prefix, or (minimal acceptable form) as a bare
    substring. The anchor is re.escape()'d before matching, so regex-special
    characters (e.g. arr[0]) are treated literally. On mismatch, the tool
    exits 1 with a new failure class: SYMBOL NOT AT LINE: path:line (expected anchor '<anchor>', found '<line-text>'), where <line-text> is the cited
    line's stripped content truncated to 80 characters. Bare path:line and
    path:line-line citations are unchanged -- fully backward compatible.
    stdlib re only, no ctags or other external binary dependency. Self-tested
    by bin/test_validate_citations.py (five tests, T23–T27, added to the
    existing 22 tests).

Fixed

  • src/cli.rs ENIP write-burst doc-comment unit format (DOC-005, maint-2026-07-21).

    The --enip-write-burst-threshold arg doc-comment at src/cli.rs:259 used
    "within any 1-second window" (hyphenated, spelled out). Changed to "within any 1s window"
    to match the adjacent Modbus write-burst arg at src/cli.rs:185 (fixed in maint-2026-07-11
    as UNIT-FMT-5-20S-001). No behavior change; doc-comment only.

  • bin/check-green-doc-tense pattern leading-\b tightening + test coverage +
    subprocess timeout (wave-84 gate code-review CR-002/CR-005/CR-006/SEC-003).

    Gate-hardening fixes applied after wave-84 code review:
    pattern 26 (\bskeleton compiles?\b) gains a leading word boundary so
    "exoskeleton compiles" is no longer a false-positive; pattern 28
    (\b(?:are|is) … compile-only) gains a leading word boundary for
    consistency; two new GOOD test cases cover these boundaries
    (exoskeleton false-positive + "until wired the handler" negative-lookahead
    exercise); bin/test_gitignore_mutants_glob.py's git check-ignore call
    gains timeout=30 with a clear AssertionError on timeout (SEC-003).

Changed

  • ROUTE-W74-DEFERRED bin/ tooling housekeeping (STORY-166, AC-166-001(g)).
    Removed the dead _run() helper from bin/test_validate_citations.py
    (superseded by _run_with_real_files(), never called); moved inline
    os/stat/tempfile imports from individual test bodies to module-level
    imports; removed an unnecessary f-prefix on a placeholder-free string
    literal in test_T21_directory_target_not_a_file; documented
    parse_line()'s regex-mismatch None return path. No behavior change.

  • CI: bin-selftest step names are count-free (W75 NIT-1, ratified by
    STORY-166 AC-166-001(g)).
    Removed the hardcoded (22 tests) / (10 tests) parentheticals from the bin-selftest job's comment and step names
    in .github/workflows/ci.yml -- they silently stale as the suites grow.
    Follows the same count-free step-naming pattern already used by the
    green-doc-tense-gate job.


Channel: stable
Binary: brew install arcavenae/tap/wirerust or download below
Signed: Apple Developer ID (notarized)