Repository navigation
Releases: ArcavenAE/wirerust
Release list
wirerust-a alpha-20260929.1
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
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
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
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
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
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
Changed
-
ENIP
on_dataPDU dispatch loop: unsafe*mut EnipFlowStatesplit-borrow replaced
with safe take-remove-reinsert (STORY-181, SEC-001, wave-85).The PDU dispatch loop in
src/analyzer/enip.rson_datapreviously acquired a raw
*mut EnipFlowStatepointer viaself.flows.get_mut(&flow_key)and called
self.process_pdu(unsafe { &mut *flow_ptr }, ...), relying on a multi-line SAFETY
comment to guarantee thatprocess_pdunever accessesself.flows. This pattern was
sound but fragile — any future change toprocess_pdutouchingself.flowswould
silently break soundness.The fix removes the raw pointer entirely. Before the dispatch loop,
self.flows.remove(&flow_key)produces an ownedEnipFlowState;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. Nounsafeblock, no
#[allow(clippy::ptr_as_ptr)], no raw-pointer cast remains inon_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_threatsis 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
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
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
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\bword 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 originaluntil.*is wiredrequirement was replaced by
until.*wiredwith 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). - Pattern 26
-
.gitignoremutants.out*/glob +bin/test_gitignore_mutants_glob.pyregression guard
(STORY-176, AC-176-003, wave-84)..gitignoregainsmutants.out*/under the cargo-mutants section, covering the
default cargo-mutants output dirsmutants.out/andmutants.out.j4-invalid/
(complements the existingmutants-f6*/glob). A new self-test
bin/test_gitignore_mutants_glob.pyasserts both dirs are git-ignored via 2
git check-ignoreassertions. The self-test is wired into CI'sbin-selftest
job and was green on merge. -
bin/validate-citations: opt-inpath:line:anchorsymbol-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
:anchorfield --
path:line:anchororpath: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 adef/async def/fn/
classdeclaration prefix, or (minimal acceptable form) as a bare
substring. The anchor isre.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. Barepath:lineand
path:line-linecitations are unchanged -- fully backward compatible.
stdlibreonly, no ctags or other external binary dependency. Self-tested
bybin/test_validate_citations.py(five tests, T23–T27, added to the
existing 22 tests).
Fixed
-
src/cli.rsENIP write-burst doc-comment unit format (DOC-005, maint-2026-07-21).The
--enip-write-burst-thresholdarg doc-comment atsrc/cli.rs:259used
"within any 1-second window" (hyphenated, spelled out). Changed to "within any 1s window"
to match the adjacent Modbus write-burst arg atsrc/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-tensepattern leading-\btightening + 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'sgit check-ignorecall
gainstimeout=30with a clearAssertionErroron timeout (SEC-003).
Changed
-
ROUTE-W74-DEFERRED bin/ tooling housekeeping (STORY-166, AC-166-001(g)).
Removed the dead_run()helper frombin/test_validate_citations.py
(superseded by_run_with_real_files(), never called); moved inline
os/stat/tempfileimports from individual test bodies to module-level
imports; removed an unnecessaryf-prefix on a placeholder-free string
literal intest_T21_directory_target_not_a_file; documented
parse_line()'s regex-mismatchNonereturn path. No behavior change. -
CI:
bin-selfteststep names are count-free (W75 NIT-1, ratified by
STORY-166 AC-166-001(g)). Removed the hardcoded(22 tests)/(10 tests)parentheticals from thebin-selftestjob'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-gatejob.
Channel: stable
Binary: brew install arcavenae/tap/wirerust or download below
Signed: Apple Developer ID (notarized)