Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
304 commits
Select commit Hold shift + click to select a range
01c32c4
fix(objects,server): take Event Type from the event algorithm (#210) …
jscott3201 Jul 27, 2026
0388118
fix(objects): apply COMMAND_FAILURE to Binary and Multi-state Output …
jscott3201 Jul 27, 2026
f532c13
fix(server): stop the fault detector overwriting a client-owned Relia…
jscott3201 Jul 27, 2026
2cbc538
fix(objects): re-enter FAULT when Reliability changes to a different …
jscott3201 Jul 27, 2026
6cce6ae
fix(objects)!: model Event_Detection_Enable on the remaining seven in…
jscott3201 Jul 28, 2026
20b8a11
fix(objects,server)!: gate Reliability writability on Out_Of_Service …
jscott3201 Jul 28, 2026
c2aa177
feat(types): resolve enumeration, bit-string (#244)
amab8901 Jul 29, 2026
7de37b2
fix(objects,server,services)!: encode bit strings MSB-first per Claus…
jscott3201 Jul 29, 2026
ce0ef1e
fix(objects,server): derive Protocol_Services_Supported from the disp…
jscott3201 Jul 29, 2026
b0c32ff
fix(types)!: remove the invented LiftCarDoorStatus enumeration (#245)…
jscott3201 Jul 29, 2026
3534f43
fix(types): add missing BackupAndRestoreState and Reliability values …
jscott3201 Jul 29, 2026
54188a0
fix(objects,server): make event commissioning reachable on BI, BV, MS…
jscott3201 Jul 30, 2026
c6c5b23
fix(objects,server,types)!: make CHANGE_OF_STATE alarm values reachab…
jscott3201 Jul 30, 2026
415eb32
fix(server)!: delete the dead IntrinsicReportingEngine (#237, #204) (…
jscott3201 Jul 30, 2026
6b9ac4f
fix(objects): model Event_Time_Stamps and Event_Message_Texts on the …
jscott3201 Jul 30, 2026
81848f7
feat(types): impl serde::Deserialize for ObjectType & PropertyIdentif…
amab8901 Aug 6, 2026
ee0ea81
fix(encoding,services,objects)!: full ASN.1 framing for event/fault p…
jscott3201 Aug 12, 2026
2a3157a
fix(server,objects): uniform array-index gating across RP/RPM/WP/WPM …
jscott3201 Aug 12, 2026
d200600
fix(objects)!: write validation for Reliability/NotifyType/EventEnabl…
jscott3201 Aug 12, 2026
fa81bba
feat(server,encoding,objects): structured property values over WriteP…
jscott3201 Aug 12, 2026
9574753
feat(types): add missing 135-2020 scalar enumerations and resolve arm…
jscott3201 Aug 12, 2026
e625135
fix(types)!: FileAccessMethod swap, DoorAlarmState rename, remove inv…
jscott3201 Aug 12, 2026
cfd48b8
feat(objects): add Time_Delay_Normal with normal-direction delay sele…
jscott3201 Aug 13, 2026
daab3a8
fix(server,objects): Event Enrollment delay honoring, same-state tran…
jscott3201 Aug 13, 2026
c8287ae
fix(server,objects): preserve event state across WPM rollback (#205, …
jscott3201 Aug 14, 2026
ba4eec8
fix(server): keep event detection active during DCC (#293)
jscott3201 Aug 14, 2026
2f97cd2
fix(objects): derive enrollment status flags from event state (#294)
jscott3201 Aug 14, 2026
3b37868
fix(objects): allow Event Enrollment renames (#295)
jscott3201 Aug 14, 2026
526711d
fix(objects): pair enrollment fault type and parameters (#297)
jscott3201 Aug 14, 2026
667700b
fix(types): reject malformed legacy fault parameters (#299)
jscott3201 Aug 14, 2026
c6fc61f
fix(server): reject remote enrollment references (#302)
jscott3201 Aug 14, 2026
7c8486c
fix(server): clear invalid enrollment reference state (#306)
jscott3201 Aug 14, 2026
87c5701
fix(server): honor Event Enrollment array indexes (#307)
jscott3201 Aug 14, 2026
98221e3
fix(encoding): reject enumerated values above u32 (#308)
jscott3201 Aug 14, 2026
7a52167
fix(server): reject malformed list edits atomically (#310)
jscott3201 Aug 14, 2026
8d8466e
fix(services): validate write priority before narrowing (#311)
jscott3201 Aug 14, 2026
3847e86
fix(transport): apply SC must-understand to destination options (#312)
jscott3201 Aug 14, 2026
fa51711
fix(services): validate property value priority before narrowing
jscott3201 Aug 14, 2026
e62f40c
Merge pull request #313 from jscott3201/fix/property-value-priority-n…
jscott3201 Aug 14, 2026
3e174ce
fix(encoding): validate ErrorPDU enums before narrowing
jscott3201 Aug 14, 2026
16752d7
Merge pull request #314 from jscott3201/fix/error-pdu-enumerated-narr…
jscott3201 Aug 14, 2026
094249f
fix(services): validate RPM error enums before narrowing
jscott3201 Aug 14, 2026
bb082b0
fix(services): reject non-enumerated RPM errors
jscott3201 Aug 14, 2026
be6cdaf
Merge pull request #315 from jscott3201/fix/rpm-error-enum-narrowing
jscott3201 Aug 14, 2026
b7361d0
fix(services): validate WriteGroup unsigned widths
jscott3201 Aug 14, 2026
c5e0ae0
Merge pull request #316 from jscott3201/fix/write-group-unsigned-narr…
jscott3201 Aug 14, 2026
808dfa3
fix(services): validate Who-Is and I-Am widths
jscott3201 Aug 14, 2026
a16c0d0
fix(services): validate I-Am application tags
jscott3201 Aug 14, 2026
f869ca8
fix(services): reject reserved I-Am tag forms
jscott3201 Aug 14, 2026
bb7230c
Merge pull request #317 from jscott3201/fix/who-is-unsigned-narrowing
jscott3201 Aug 14, 2026
78fce06
fix(client): preserve over-wide discovered APDU limits
jscott3201 Aug 14, 2026
fffba23
Merge pull request #318 from jscott3201/fix/client-discovered-max-apdu
jscott3201 Aug 14, 2026
3f823d8
fix(services): validate You-Are vendor ID
jscott3201 Aug 14, 2026
188797c
Merge pull request #320 from jscott3201/fix/you-are-vendor-narrowing
jscott3201 Aug 14, 2026
224d0bd
fix(services): validate Who-Has limit widths
jscott3201 Aug 14, 2026
0e8ebff
Merge pull request #321 from jscott3201/fix/who-has-unsigned-narrowing
jscott3201 Aug 14, 2026
68ae122
fix(services): validate device management widths
jscott3201 Aug 14, 2026
494319a
Merge pull request #322 from jscott3201/fix/device-mgmt-unsigned-narr…
jscott3201 Aug 14, 2026
5d79f62
fix(services): validate virtual terminal widths
jscott3201 Aug 14, 2026
f2f9520
Merge pull request #323 from jscott3201/fix/virtual-terminal-unsigned…
jscott3201 Aug 14, 2026
b3623b1
fix(services): validate private transfer widths
jscott3201 Aug 14, 2026
d1cc8b4
Merge pull request #324 from jscott3201/fix/private-transfer-unsigned…
jscott3201 Aug 14, 2026
6ec77c8
fix(services): validate atomic file counts
jscott3201 Aug 14, 2026
40be0b3
test(services): strengthen atomic file boundaries
jscott3201 Aug 14, 2026
043b511
Merge pull request #325 from jscott3201/fix/atomic-file-unsigned-narr…
jscott3201 Aug 14, 2026
e75da27
fix(services): validate read property widths
jscott3201 Aug 14, 2026
39a97ff
fix(services): reject trailing read property fields
jscott3201 Aug 14, 2026
e5ac704
Merge pull request #326 from jscott3201/fix/read-property-unsigned-na…
jscott3201 Aug 14, 2026
fa42a02
fix(services): validate write property widths
jscott3201 Aug 14, 2026
6079bb7
Merge pull request #328 from jscott3201/fix/write-property-unsigned-n…
jscott3201 Aug 14, 2026
44de125
fix(services): validate shared property widths
jscott3201 Aug 14, 2026
8b1a152
Merge pull request #329 from jscott3201/fix/common-property-unsigned-…
jscott3201 Aug 14, 2026
0b172e2
fix(services): validate RPM result widths
jscott3201 Aug 14, 2026
d65220d
Merge pull request #330 from jscott3201/fix/rpm-ack-unsigned-narrowing
jscott3201 Aug 14, 2026
a83fb55
fix(services): validate list element widths
jscott3201 Aug 14, 2026
c5f89ab
Merge pull request #331 from jscott3201/fix/list-element-unsigned-nar…
jscott3201 Aug 14, 2026
f40959e
fix(services): validate create object type width
jscott3201 Aug 14, 2026
d088b9a
fix(services): accept CreateObject item limit
jscott3201 Aug 14, 2026
d2cf6ee
Merge pull request #332 from jscott3201/fix/create-object-unsigned-na…
jscott3201 Aug 14, 2026
9de1a0d
fix(services): validate text message widths
jscott3201 Aug 14, 2026
b59620a
Merge pull request #333 from jscott3201/fix/text-message-unsigned-nar…
jscott3201 Aug 14, 2026
be05d13
fix(services): validate alarm summary state
jscott3201 Aug 14, 2026
5945224
fix(services): validate alarm transition bits
jscott3201 Aug 14, 2026
c6621f6
fix(services): reject alarm transition padding
jscott3201 Aug 14, 2026
9e7f242
fix(services): reject reserved alarm tag forms
jscott3201 Aug 14, 2026
9c60d4b
Merge pull request #334 from jscott3201/fix/alarm-summary-unsigned-na…
jscott3201 Aug 14, 2026
a20b1cd
fix(services): harden enrollment summary decoding (#335)
jscott3201 Aug 15, 2026
84e2457
fix(services): harden alarm operation decoding (#336)
jscott3201 Aug 15, 2026
677fadf
fix(encoding): reject noncanonical tag headers (#338)
jscott3201 Aug 15, 2026
0f67272
fix(services): harden ReadRange decoding (#340)
jscott3201 Aug 15, 2026
4a51c69
fix(services): harden COV unsigned decoding (#343)
jscott3201 Aug 15, 2026
8aea450
docs(agents): avoid duplicate ready reviews (#344)
jscott3201 Aug 15, 2026
3b17f60
fix(services): harden GetEventInformation end to end (#347)
jscott3201 Aug 15, 2026
de15247
fix(services): harden life safety notification decoding (#348)
jscott3201 Aug 15, 2026
c1ac432
fix(services): harden event notification envelope (#350)
jscott3201 Aug 15, 2026
944601b
fix(services): harden notification parameter boundaries (#352)
jscott3201 Aug 15, 2026
4d44dc9
fix(types): align property states with clause 21
jscott3201 Aug 15, 2026
656772e
fix(types): enforce property state domains
jscott3201 Aug 15, 2026
86cbb1e
fix(encoding): preserve property state domains
jscott3201 Aug 16, 2026
ac58842
fix(events): reject malformed enrollment parameters
jscott3201 Aug 16, 2026
0f7afa7
fix(events): preserve enrollment timing invariants
jscott3201 Aug 16, 2026
af70be4
fix(events): close parameter validation gaps
jscott3201 Aug 16, 2026
5892960
fix(encoding): enforce primitive application forms
jscott3201 Aug 16, 2026
297859c
fix(encoding): validate nested primitive forms
jscott3201 Aug 16, 2026
ec26a62
fix(encoding): enforce framed value invariants
jscott3201 Aug 16, 2026
fcb1c6c
fix(events): preserve legacy states and frame depth
jscott3201 Aug 16, 2026
1f9b845
fix(events): enforce notification value cardinality
jscott3201 Aug 16, 2026
a543274
fix(events): preserve empty abstract values
jscott3201 Aug 16, 2026
c924898
Merge pull request #353 from jscott3201/fix/property-states-model
jscott3201 Aug 16, 2026
2da7e54
fix(types): restore no_std compilation
jscott3201 Aug 17, 2026
85fab63
chore(objects): remove orphaned binary tests module
jscott3201 Aug 17, 2026
88b4963
Merge pull request #356 from jscott3201/fix/no-std-and-orphan-module
jscott3201 Aug 17, 2026
0ab32ad
fix(server): route notification recipients by their BACnetAddress
jscott3201 Aug 17, 2026
636bb34
fix(server): send a global-broadcast recipient globally
jscott3201 Aug 17, 2026
bd13a30
test(server): restore the DCC suppression guarantee, and correct stal…
jscott3201 Aug 17, 2026
d2c0dac
docs(server): correct the route enum's own description
jscott3201 Aug 17, 2026
84c98bf
test(server): restore the periodic Event_Enable guarantee too
jscott3201 Aug 17, 2026
9a39e6e
docs(objects): repair a sentence mangled by the previous doc pass
jscott3201 Aug 17, 2026
6766fee
Merge pull request #357 from jscott3201/fix/notification-recipient-ro…
jscott3201 Aug 17, 2026
85394c3
fix(client): refuse a peer max APDU below MinimumMessageSize
jscott3201 Aug 17, 2026
8a92d91
fix(client): blame the right limit, and correct a clause citation
jscott3201 Aug 17, 2026
7099f91
Merge pull request #361 from jscott3201/fix/reject-sub-minimum-peer-m…
jscott3201 Aug 17, 2026
202f0ca
fix(client): correlate responses with the request awaiting them
jscott3201 Aug 17, 2026
612005d
refactor(client): drop an unreachable expect from complete_transaction
jscott3201 Aug 17, 2026
22a2e28
fix(client): abort unexpected segmented PDUs instead of dropping them
jscott3201 Aug 17, 2026
5b06682
fix(client): discard a stale SegmentACK instead of aborting a live re…
jscott3201 Aug 17, 2026
b316399
docs(client): record why the server=FALSE SegmentACK check must come …
jscott3201 Aug 17, 2026
7a6551c
fix(client): abort an unexpected SegmentACK during reassembly
jscott3201 Aug 17, 2026
3943511
Merge pull request #363 from jscott3201/fix/tsm-response-correlation
jscott3201 Aug 17, 2026
ac65c9e
fix(client): bound routed confirmed requests by the routed peer's Max…
jscott3201 Aug 17, 2026
b2719bc
Merge pull request #369 from jscott3201/fix/routed-peer-max-apdu
jscott3201 Aug 17, 2026
d8a6464
fix(client): route SegmentACKs and Aborts back along the request's path
jscott3201 Aug 17, 2026
66f31de
Merge pull request #373 from jscott3201/fix/routed-reply-addressing
jscott3201 Aug 17, 2026
2b73ca1
fix(server,network,transport): Table 13-6 NPDU priority, remote recip…
jscott3201 Aug 17, 2026
3a0bc93
Merge pull request #376 from jscott3201/fix/notification-priority-and…
jscott3201 Aug 17, 2026
b2b50e8
fix(server,client): bind segmented transfers to their sequence space …
jscott3201 Aug 17, 2026
3540593
Merge pull request #382 from jscott3201/fix/segmentation-hygiene
jscott3201 Aug 17, 2026
4201676
fix(server): correlate routed acknowledgments so confirmed notificati…
jscott3201 Aug 17, 2026
34fbebd
Merge pull request #385 from jscott3201/fix/routed-confirmed-notifica…
jscott3201 Aug 17, 2026
fb6d58c
fix(transport): validate SC Secure Path options
jscott3201 Aug 20, 2026
dbd3feb
Merge pull request #387 from jscott3201/fix/secure-path-validation
jscott3201 Aug 20, 2026
f1ed89b
fix(server): execute authorized life safety silence operations
jscott3201 Aug 20, 2026
21bc3e6
fix(server): address life safety review findings
jscott3201 Aug 20, 2026
0553d42
Merge pull request #388 from jscott3201/fix/life-safety-operation-sil…
jscott3201 Aug 20, 2026
5182f78
fix: encode max segments conservatively
jscott3201 Aug 20, 2026
5010f0f
fix: validate SC segment limit before connect
jscott3201 Aug 20, 2026
0432904
Merge pull request #389 from jscott3201/fix/max-segments-encoding
jscott3201 Aug 20, 2026
7e263ca
fix(client): reject unsupported confirmed services
jscott3201 Aug 20, 2026
e2c1f24
fix(transport): validate BACnet/IP packet destinations
jscott3201 Aug 20, 2026
42cb651
fix(transport): harden confirmed-request ingress
jscott3201 Aug 20, 2026
0241375
fix(transport): close confirmed ingress review gaps
jscott3201 Aug 20, 2026
e84d4c8
fix(transport): close final ingress review gaps
jscott3201 Aug 20, 2026
451e4d6
fix(transport): make BIP6 startup fail closed
jscott3201 Aug 20, 2026
02c98a0
Merge pull request #390 from jscott3201/fix/client-unsupported-confir…
jscott3201 Aug 20, 2026
52c8964
fix(server): gate dispatch truth constants to tests
jscott3201 Aug 20, 2026
7cedbca
Merge pull request #391 from jscott3201/fix/server-test-only-executio…
jscott3201 Aug 20, 2026
23ae30d
fix GetEnrollmentSummary wire types
jscott3201 Aug 20, 2026
4889981
classify oversized enrollment filters as undefined
jscott3201 Aug 20, 2026
b245d92
classify enrollment filter wire shapes
jscott3201 Aug 20, 2026
aea35d8
Merge pull request #392 from jscott3201/fix/enrollment-summary-wire-t…
jscott3201 Aug 20, 2026
9f349cb
fix: align COV Multiple wire models
jscott3201 Aug 20, 2026
43a3285
fix: apply COV Multiple review findings
jscott3201 Aug 20, 2026
8f14912
docs: repair COV Multiple evidence path
jscott3201 Aug 20, 2026
2ac12bc
fix: validate COV Multiple calendar dates
jscott3201 Aug 20, 2026
d47c8c2
Merge pull request #393 from jscott3201/fix/cov-multiple-wire-models
jscott3201 Aug 20, 2026
3e3ebd9
fix: align audit service wire models
jscott3201 Aug 20, 2026
bdf3ca0
fix: enforce audit reserved bits and unsigned ranges
jscott3201 Aug 20, 2026
68ab2d3
Merge pull request #394 from jscott3201/fix/audit-wire-models
jscott3201 Aug 20, 2026
b81553e
fix(server): validate File access method
jscott3201 Aug 21, 2026
cc78eca
docs(conformance): correct stream-write denial class to PROPERTY
jscott3201 Aug 21, 2026
5af9010
Merge pull request #395 from jscott3201/fix/file-access-method-valida…
jscott3201 Aug 21, 2026
8a2b6fa
fix(objects): type Escalator operation direction
jscott3201 Aug 21, 2026
34c6dbb
Merge pull request #396 from jscott3201/fix/escalator-operation-direc…
jscott3201 Aug 21, 2026
8579fd7
fix(client): make device-table address identity route-safe
jscott3201 Aug 21, 2026
ef40366
fix(client): reject empty addresses in add_routed_device
jscott3201 Aug 21, 2026
97c26e4
docs(changelog): move #372 added-API entry under its own section
jscott3201 Aug 21, 2026
758ee90
Merge pull request #402 from jscott3201/fix/device-table-address-iden…
jscott3201 Aug 21, 2026
633d494
fix(client): honor peer receive-segmentation capability
jscott3201 Aug 21, 2026
3c2728a
docs(changelog): describe peer receive-segmentation preflight
jscott3201 Aug 21, 2026
5e1953c
docs(client): fix private intra-doc link and drop unused test import
jscott3201 Aug 21, 2026
65deffd
Merge pull request #403 from jscott3201/fix/peer-segmentation-capability
jscott3201 Aug 21, 2026
b48c887
fix(segmentation): honor duplicate receive windows
jscott3201 Aug 23, 2026
e095153
fix(segmentation): advance ComplexACK send on current NAK
jscott3201 Aug 23, 2026
440740f
Merge pull request #404 from jscott3201/fix/segmented-duplicate-window
jscott3201 Aug 23, 2026
56cd8af
fix(server): correlate routed segmented transactions by source
jscott3201 Aug 23, 2026
b7214fc
Merge pull request #405 from jscott3201/fix/routed-segment-identity
jscott3201 Aug 23, 2026
bbb5f65
fix(objects): derive max segments from segmentation mode
jscott3201 Aug 23, 2026
6377f15
Merge pull request #406 from jscott3201/fix/device-max-segments-transmit
jscott3201 Aug 23, 2026
4c89fca
fix(client): stop request timer during response reassembly
jscott3201 Aug 23, 2026
e732372
Merge pull request #408 from jscott3201/fix/client-request-timer-reas…
jscott3201 Aug 23, 2026
5b24529
fix(client): bind segmented cleanup to transaction owners
jscott3201 Aug 23, 2026
379e77c
Merge pull request #409 from jscott3201/fix/client-segment-timeout-in…
jscott3201 Aug 23, 2026
899a1e8
fix(client): gate segmented request terminal responses
jscott3201 Aug 23, 2026
e0efdab
Merge pull request #410 from jscott3201/fix/client-segmented-request-…
jscott3201 Aug 23, 2026
0f45390
fix(client): validate initial segmented responses
jscott3201 Aug 23, 2026
b28e054
Merge pull request #411 from jscott3201/fix/client-segmented-ack-admi…
jscott3201 Aug 23, 2026
e2bc8d5
fix(client): report TSM retry exhaustion as local abort
jscott3201 Aug 23, 2026
e9662e9
Merge pull request #412 from jscott3201/fix/client-tsm-timeout-indica…
jscott3201 Aug 23, 2026
261d8bb
fix(client): abort segmented response at session capacity
jscott3201 Aug 23, 2026
ab64beb
Merge pull request #413 from jscott3201/fix/client-segmented-session-…
jscott3201 Aug 23, 2026
cd0c35d
fix(server): classify read-only file writes as service errors
jscott3201 Aug 24, 2026
1898b2e
Merge pull request #414 from jscott3201/fix/atomic-write-file-read-on…
jscott3201 Aug 24, 2026
34e6dbc
fix(server): classify non-File Atomic File targets as service errors
jscott3201 Aug 24, 2026
c0d6e81
docs(conformance): attribute the read-only row to Clause 14.2.4.1 only
jscott3201 Aug 24, 2026
98613b5
Merge pull request #415 from jscott3201/fix/atomic-file-object-type-e…
jscott3201 Aug 24, 2026
e5a5083
fix(server): route Atomic File services through FileObject storage
jscott3201 Aug 24, 2026
3244d62
fix(objects): follow Clause 14.1.3.1 End Of File and tie caps to review
jscott3201 Aug 24, 2026
5e707ff
fix(server): bound record read windows and align File setter guards
jscott3201 Aug 24, 2026
7e0cfd5
docs(file): record the record-window clamp as a departure and fix the…
jscott3201 Aug 24, 2026
ca17ddd
Merge pull request #421 from jscott3201/fix/atomic-file-storage-hooks
jscott3201 Aug 24, 2026
ff6f81a
fix(objects): enforce Escalator mode enumeration domain
jscott3201 Aug 24, 2026
b70739b
Merge pull request #422 from jscott3201/fix/escalator-mode-domain
jscott3201 Aug 24, 2026
8ca261e
fix(services): enforce AtomicWriteFile record count
jscott3201 Aug 24, 2026
1b36ab8
Merge pull request #423 from jscott3201/fix/atomic-write-file-record-…
jscott3201 Aug 24, 2026
d141908
fix(objects): align Escalator status writability
jscott3201 Aug 24, 2026
d513321
Merge pull request #424 from jscott3201/fix/escalator-status-writability
jscott3201 Aug 24, 2026
9be9e02
fix(objects): withdraw notification forwarder placeholder
jscott3201 Aug 24, 2026
44c62ae
Merge pull request #425 from jscott3201/codex/pr-0001-withdraw-notifi…
jscott3201 Aug 24, 2026
83a466b
fix(server): withdraw incomplete Channel and WriteGroup support (#426)
jscott3201 Aug 24, 2026
d5d6ab9
feat(objects): add property metadata for Time Value and Binary Input …
jscott3201 Aug 24, 2026
1a2859e
fix(objects): reject overwide color temperature values (#428)
jscott3201 Aug 24, 2026
6212e8e
fix(objects): encode complete active COV subscriptions (#429)
jscott3201 Aug 25, 2026
2d59ca8
fix(services): correct notification parameter wire models (#432)
jscott3201 Aug 25, 2026
0a2f21f
feat(network): introduce single-owner endpoint ingress (#433)
jscott3201 Aug 25, 2026
45bf640
feat(endpoint-core): establish shared private endpoint core (#434)
jscott3201 Aug 25, 2026
da44bbc
feat(endpoint-core): prepare crate for publication (#435)
jscott3201 Aug 25, 2026
1c26199
feat(client): coordinate confirmed requester transactions (#436)
jscott3201 Aug 25, 2026
3d06c84
feat(server): coordinate confirmed notification transactions (#437)
jscott3201 Aug 25, 2026
255f231
feat(endpoint): add shared loopback runtime seam (#438)
jscott3201 Aug 26, 2026
8f85913
feat(endpoint): add hidden network-service egress seam (#439)
jscott3201 Aug 26, 2026
cf2a7e4
feat(device): add truthful clock synchronization (#440)
jscott3201 Aug 26, 2026
8b30b35
fix: enforce bounded event timestamp policy (#441)
jscott3201 Aug 26, 2026
2b11578
fix: preserve BACnetTimeStamp choices in event array reads (#442)
jscott3201 Aug 27, 2026
9692155
feat(objects): expose enrollment event timestamps (#443)
jscott3201 Aug 27, 2026
d4239f6
feat(objects): add atomic event transition commit kernel (#444)
jscott3201 Aug 27, 2026
6a0a133
feat(events): commit intrinsic transitions atomically (#445)
jscott3201 Aug 27, 2026
57a32ce
fix(events): source notifications from committed history (#446)
jscott3201 Aug 27, 2026
00a72ab
fix(server): commit Event Enrollment updates transactionally (#447)
jscott3201 Aug 27, 2026
5c84eaf
Event Enrollment: add atomic Reliability and FAULT evaluation (#448)
jscott3201 Aug 27, 2026
78b56f5
PR-0303: reset Event Enrollment continuity on observation gaps (#449)
jscott3201 Aug 27, 2026
a6b3eab
fix(event-enrollment): select reliability event type (#450)
jscott3201 Aug 27, 2026
e8421c3
feat(server): route Event Enrollment notifications (#451)
jscott3201 Aug 28, 2026
c77f784
feat(objects): expose recipient lookup outcomes (#452)
jscott3201 Aug 28, 2026
c1f2d71
feat(server): resolve device recipient bindings (#453)
jscott3201 Aug 28, 2026
f4313bf
feat(server): commit intrinsic event message text (#454)
jscott3201 Aug 28, 2026
5adeb9a
docs: replace stale memory prerequisite
jscott3201 Aug 29, 2026
d563290
feat(server): project committed event notification values (#455)
jscott3201 Aug 29, 2026
ea27447
feat(services): add AuditLogQuery ACK codec (#457)
jscott3201 Aug 29, 2026
7ad03f2
feat(audit): add persistent AuditLog storage foundation
jscott3201 Aug 30, 2026
5f9ff36
fix(audit): preserve recovery and WPM rollback
jscott3201 Aug 30, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
2 changes: 1 addition & 1 deletion .codex/agents/bacnet-performance-reviewer.toml
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ You are a BACnet performance and A/B benchmark reviewer for rusty-bacnet.

Mission:
- Establish or review reproducible base/head benchmarks for performance-sensitive protocol work.
- Check workload validity for codec, BVLL, NPDU, APDU, B/IP, BACnet/SC, router, BBMD, segmentation, services, Python, WASM, and optional data-link suites.
- Check workload validity for codec, BVLL, NPDU, APDU, B/IP, BACnet/SC, router, BBMD, segmentation, services, Python, and optional data-link suites.
- Interpret latency, throughput, memory, allocation, and error deltas conservatively.

Rules:
Expand Down
2 changes: 1 addition & 1 deletion .codex/agents/bacnet-services-objects-reviewer.toml
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ Rules:
- Do not edit files.
- Do not treat implemented structs as conformance evidence unless service behavior and tests exist.
- Map every support claim to ledger rows and tests where possible.
- Identify client/server parity and Python/WASM exposure risks when relevant.
- Identify client/server parity and Python exposure risks when relevant.

Return:
1. Reviewed service/object scope.
Expand Down
54 changes: 54 additions & 0 deletions .github/scripts/check-msrv.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,54 @@
#!/usr/bin/env bash
#
# Check the published crates at the workspace MSRV.
#
# The MSRV is a promise to people who depend on this workspace from crates.io,
# so the gate covers exactly the crates they can depend on. The list is derived
# from `cargo metadata` rather than written here: a hardcoded list drifts in the
# dangerous direction silently, because a newly published member that nobody
# remembers to add is simply never checked.
#
# Run with RUSTUP_TOOLCHAIN set to the MSRV, which overrides rust-toolchain.toml:
# RUSTUP_TOOLCHAIN=1.93 bash .github/scripts/check-msrv.sh
set -euo pipefail

cd "$(dirname "$0")/../.."

PKGS=$(
cargo metadata --no-deps --format-version 1 |
python3 -c 'import json,sys
for p in json.load(sys.stdin)["packages"]:
if p.get("publish") != []:
print(p["name"])' |
sort
)

if [ -z "$PKGS" ]; then
echo "error: no publishable crates found in cargo metadata" >&2
exit 1
fi

ARGS=""
for p in $PKGS; do
ARGS="$ARGS -p $p"
done

# Optional features a consumer can enable. Without them the gate sees only
# default features, which leaves the BACnet/SC and IPv6 module trees — and the
# MSRVs of rustls, tokio-rustls and tokio-tungstenite — unchecked.
#
# `serial`, `serial-gpio`, `ethernet` and `pcap` are deliberately absent: they
# need Linux system packages this job does not install. Extending the gate to
# them is tracked as #196.
FEATURES="bacnet-transport/sc-tls,bacnet-transport/ipv6"
FEATURES="$FEATURES,bacnet-client/sc-tls,bacnet-client/ipv6"
FEATURES="$FEATURES,bacnet-server/sc-tls"
FEATURES="$FEATURES,bacnet-cli/sc-tls"

echo "MSRV gate covers:"
for p in $PKGS; do echo " - $p"; done
echo "with features: $FEATURES"
echo

# shellcheck disable=SC2086
exec cargo check --locked $ARGS --features "$FEATURES"
173 changes: 82 additions & 91 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,19 @@ permissions:
id-token: write

# =============================================================================
# Tier 1 — CI (runs on PR updates to main/dev, pushes to main, and v* tags)
# Tier 1 — CI
#
# Two tiers of jobs share the triggers (PRs to main/dev, push to main, v* tags):
# Lean — every PR (incl. feature→dev), push to main, v* tags.
# Fast gate: fmt, clippy, file-size, no-secret, Linux test.
# Heavy — skips feature→dev PRs; runs on dev→main PRs, push to main, v* tags.
# Cross-OS tests, MSRV, cargo-audit, cargo-deny.
# This keeps the high-throughput feature→dev loop fast while the dev→main
# gate (and the tag/push-main release gate) run the full matrix before merge.
#
# Guard cheat-sheet (the `if:` on each job is one of these two):
# lean : github.event_name != 'push' || github.ref == 'refs/heads/main' || startsWith(github.ref, 'refs/tags/v')
# heavy: github.event_name == 'push' || github.base_ref == 'main'
# =============================================================================

jobs:
Expand All @@ -40,7 +52,7 @@ jobs:
- uses: actions/checkout@v4
- uses: dtolnay/rust-toolchain@master
with:
toolchain: "1.95.0"
toolchain: "1.97.1"
components: rustfmt
- run: cargo fmt --all --check

Expand All @@ -52,27 +64,14 @@ jobs:
- uses: actions/checkout@v4
- uses: dtolnay/rust-toolchain@master
with:
toolchain: "1.95.0"
toolchain: "1.97.1"
components: clippy
- uses: Swatinem/rust-cache@v2
- run: cargo clippy --workspace --exclude rusty-bacnet --exclude bacnet-wasm --all-targets --locked

wasm-check:
name: WASM Check
if: ${{ github.event_name != 'push' || github.ref == 'refs/heads/main' || startsWith(github.ref, 'refs/tags/v') }}
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: dtolnay/rust-toolchain@master
with:
toolchain: "1.95.0"
targets: wasm32-unknown-unknown
- uses: Swatinem/rust-cache@v2
- run: cargo check -p bacnet-wasm --target wasm32-unknown-unknown --locked
- run: cargo clippy --workspace --exclude rusty-bacnet --all-targets --locked

audit:
name: Cargo Audit
if: ${{ github.event_name != 'push' || github.ref == 'refs/heads/main' || startsWith(github.ref, 'refs/tags/v') }}
if: ${{ github.event_name == 'push' || github.base_ref == 'main' }}
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
Expand Down Expand Up @@ -104,11 +103,11 @@ jobs:

msrv:
name: MSRV (1.93)
if: ${{ github.event_name != 'push' || github.ref == 'refs/heads/main' || startsWith(github.ref, 'refs/tags/v') }}
if: ${{ github.event_name == 'push' || github.base_ref == 'main' }}
runs-on: ubuntu-latest
env:
# Override `rust-toolchain.toml` (which pins the dev/CI channel to
# 1.95.0) so this job exercises the documented MSRV from the
# 1.97.1) so this job exercises the documented MSRV from the
# workspace `Cargo.toml`.
RUSTUP_TOOLCHAIN: "1.93"
steps:
Expand All @@ -119,7 +118,10 @@ jobs:
- uses: Swatinem/rust-cache@v2
with:
key: msrv
- run: cargo check --workspace --exclude rusty-bacnet --exclude bacnet-wasm --locked
# Derives the publishable crates from cargo metadata and checks them with
# the optional features a consumer can enable. See the script for why the
# list is derived rather than written down.
- run: bash .github/scripts/check-msrv.sh

test:
name: Test (${{ matrix.os }})
Expand All @@ -129,20 +131,17 @@ jobs:
fail-fast: false
matrix:
include:
# Linux: full feature set (serial + ethernet are Linux-only deps)
# Linux only in the lean tier: the full-feature suite (serial +
# ethernet are Linux-only deps). macOS/Windows run in `test-cross`
# below, gated to dev→main PRs / push-main / tags so the
# feature→dev loop isn't held up by cross-OS runners.
- os: ubuntu-latest
features: "--features bacnet-transport/ipv6,bacnet-transport/sc-tls,bacnet-transport/serial,bacnet-transport/ethernet"
# macOS: ipv6 + sc-tls only
- os: macos-latest
features: "--features bacnet-transport/ipv6,bacnet-transport/sc-tls"
# Windows: ipv6 + sc-tls only
- os: windows-latest
features: "--features bacnet-transport/ipv6,bacnet-transport/sc-tls"
features: "--features bacnet-types/serde,bacnet-transport/ipv6,bacnet-transport/sc-tls,bacnet-transport/serial,bacnet-transport/ethernet"
steps:
- uses: actions/checkout@v4
- uses: dtolnay/rust-toolchain@master
with:
toolchain: "1.95.0"
toolchain: "1.97.1"
- uses: Swatinem/rust-cache@v2
with:
key: ${{ matrix.os }}
Expand All @@ -151,11 +150,37 @@ jobs:
# causing `cargo test` to invoke a broken `rustup-init`. This
# bit us on macos-15-arm64 image 20260511.0048 — see PR #21.
cache-bin: false
- run: cargo test --workspace --exclude rusty-bacnet --exclude bacnet-wasm --locked ${{ matrix.features }}
- run: cargo test --workspace --exclude rusty-bacnet --locked ${{ matrix.features }}

test-cross:
name: Test (${{ matrix.os }})
if: ${{ github.event_name == 'push' || github.base_ref == 'main' }}
runs-on: ${{ matrix.os }}
strategy:
fail-fast: false
matrix:
include:
# Cross-OS legs (macOS/Windows) — heavy tier, only on dev→main PRs,
# push to main, and v* tags. Linux is already covered by `test`
# above in the lean tier.
- os: macos-latest
features: "--features bacnet-types/serde,bacnet-transport/ipv6,bacnet-transport/sc-tls"
- os: windows-latest
features: "--features bacnet-types/serde,bacnet-transport/ipv6,bacnet-transport/sc-tls"
steps:
- uses: actions/checkout@v4
- uses: dtolnay/rust-toolchain@master
with:
toolchain: "1.97.1"
- uses: Swatinem/rust-cache@v2
with:
key: ${{ matrix.os }}
cache-bin: false
- run: cargo test --workspace --exclude rusty-bacnet --locked ${{ matrix.features }}

deny:
name: Cargo Deny
if: ${{ github.event_name != 'push' || github.ref == 'refs/heads/main' || startsWith(github.ref, 'refs/tags/v') }}
if: ${{ github.event_name == 'push' || github.base_ref == 'main' }}
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
Expand All @@ -168,7 +193,22 @@ jobs:
validate:
name: Validate Release
if: startsWith(github.ref, 'refs/tags/v')
needs: [fmt, clippy, test, deny, wasm-check, audit, no-secret-scan]
# Every Tier 1 job, listed in declaration order so the list can be audited
# against the jobs above at a glance. A Tier 1 job omitted here still runs on
# the tag and can still fail — it just stops gating the release, which is how
# file-size-cap and msrv came to be missing.
needs:
[
fmt,
clippy,
audit,
file-size-cap,
no-secret-scan,
msrv,
test,
test-cross,
deny,
]
runs-on: ubuntu-latest
outputs:
version: ${{ steps.version.outputs.version }}
Expand Down Expand Up @@ -204,7 +244,7 @@ jobs:
- uses: actions/checkout@v4
- uses: dtolnay/rust-toolchain@master
with:
toolchain: "1.95.0"
toolchain: "1.97.1"
- uses: Swatinem/rust-cache@v2

- name: Publish bacnet-types
Expand Down Expand Up @@ -243,6 +283,12 @@ jobs:
CARGO_REGISTRY_TOKEN: ${{ secrets.CARGO_REGISTRY_TOKEN }}
- run: sleep 30

- name: Publish bacnet-endpoint-core
run: cargo publish -p bacnet-endpoint-core --no-verify
env:
CARGO_REGISTRY_TOKEN: ${{ secrets.CARGO_REGISTRY_TOKEN }}
- run: sleep 30

- name: Publish bacnet-server
run: cargo publish -p bacnet-server --no-verify
env:
Expand Down Expand Up @@ -319,38 +365,6 @@ jobs:
name: wheels-sdist
path: dist

build-wasm:
name: Build WASM
if: startsWith(github.ref, 'refs/tags/v')
needs: validate
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: dtolnay/rust-toolchain@master
with:
toolchain: "1.95.0"
targets: wasm32-unknown-unknown
- uses: Swatinem/rust-cache@v2

- name: Install wasm-pack
run: curl https://rustwasm.github.io/wasm-pack/installer/init.sh -sSf | sh

- name: Build (bundler target)
run: wasm-pack build crates/bacnet-wasm --target bundler --out-dir ../../dist/wasm-npm

- name: Build (web target)
run: wasm-pack build crates/bacnet-wasm --target web --out-dir ../../dist/wasm-web

- uses: actions/upload-artifact@v4
with:
name: wasm-npm
path: dist/wasm-npm

- uses: actions/upload-artifact@v4
with:
name: wasm-web
path: dist/wasm-web

publish-pypi:
name: Publish to PyPI
if: startsWith(github.ref, 'refs/tags/v')
Expand All @@ -366,33 +380,10 @@ jobs:

- uses: pypa/gh-action-pypi-publish@release/v1

publish-npm:
name: Publish to npm
if: startsWith(github.ref, 'refs/tags/v')
needs: [build-wasm]
runs-on: ubuntu-latest
environment: release
steps:
- uses: actions/download-artifact@v4
with:
name: wasm-npm
path: dist/wasm-npm

- uses: actions/setup-node@v4
with:
node-version: "20"
registry-url: "https://registry.npmjs.org"

- name: Upgrade npm for trusted publishing
run: npm install -g npm@latest

- name: Publish to npm
run: cd dist/wasm-npm && npm publish --provenance --access public

github-release:
name: GitHub Release
if: startsWith(github.ref, 'refs/tags/v')
needs: [publish-crates, publish-pypi, publish-npm, build-cli-binaries]
needs: [publish-crates, publish-pypi, build-cli-binaries]
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
Expand Down Expand Up @@ -449,7 +440,7 @@ jobs:

- uses: dtolnay/rust-toolchain@master
with:
toolchain: "1.95.0"
toolchain: "1.97.1"
targets: ${{ matrix.target }}

- uses: Swatinem/rust-cache@v2
Expand Down
11 changes: 6 additions & 5 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,9 @@ dist/

# AI assistants
codex-id.json
claude-id.json
_codex-briefs/
codex-overnight-status.md
.claude/
CLAUDE.md
.copilot/
Expand All @@ -40,6 +43,9 @@ mcp.json
# Proprietary spec
_spec/

# Local conformance artifacts
/conformance/

# OS
.DS_Store
Thumbs.db
Expand All @@ -50,8 +56,3 @@ Thumbs.db
*.swp
*.swo
*~

# JavaScript/WASM
node_modules/
pkg/
*.tgz
Loading
Loading