Repository navigation
docs(fusa): [c-RCP-18-tracker Part 1] propagate tc18_master_id for REQ-WIRE-* - #108
Merged
Merged
Conversation
…Q-WIRE-* Pilot batch of the cross-repo TC18-master-catalog-propagation effort on cpp-RCP (RELAY's `docs/tc18-master-catalog.json`, 447 entries), following the pattern already established across four merged go-RCP batches (#161-#164). Links the TC18-scoped `REQ-WIRE-*` requirements (the AVTP-header/ACF-message wire-encoding layer, cpp-RCP's equivalent of go-RCP's `REQ-AVTP-*` prefix) to their master catalog entry via a new `tc18_master_id` field, matching the field convention already used in go-RCP's and c-RCP's own `.fusa-reqs.json`. None of the 15 `REQ-WIRE-*` entries previously carried a `tc18` citation at all (confirmed before starting: only 10 of 376 requirements repo-wide have one, none of them REQ-WIRE-*), so this batch is pure addition, not correction. Every citation below was verified directly against TC18.txt (the plaintext extraction already used elsewhere in this repo's own `tc18` citations), not copied from go-RCP's analogous mapping -- several diverge from go-RCP's REQ-AVTP-* choices where cpp-RCP's wording pointed at a different, more precise clause. 8 requirements linked: - REQ-WIRE-001 (NTSCF header round-trip) -> TC18-11.1-004 -- Figure 6 "NTSCF-Header Version 0"; stream_id/sequence_num_lsb/ntscf_data_length fields, cross-confirmed via the field-labelled Figure 21 ACF_GBB/NTSCF worked example in Section 13.6 (Figure 5/6 themselves render as blank diagrams in the plaintext extraction, so Figure 20/21's worked examples are what make the field layout independently text-verifiable). - REQ-WIRE-002 (TSCF header + avtp_timestamp round-trip) -> TC18-11.1-002 -- Figure 5 "TSCF-Header Version 0", same cross-confirmation via Figure 20. - REQ-WIRE-004 (ACF_ABB carries no timestamp) -> TC18-11.3-003 -- Table 17's explicit, format-wide rule "acf_msg_type 0x0E - ABB message without message_timestamp / 0x0D - GBB message, with message_timestamp" / "message_timestamp Present in ACF_GBB, omitted in ACF_ABB". Chose Table 17 (Section 11.3, responses) over Table 4 (Section 11.2.1, standard requests) because Table 17 states the ABB/GBB timestamp- presence rule as a protocol-wide invariant while Table 4 only fixes mtv=0b for the standard-request case specifically; cpp-RCP's encode_acf_abb/decode_acf_abb are generic codecs used for both directions. go-RCP's analogous REQ-AVTP-011 used TC18-11.2.1-004 instead -- not reused here since REQ-WIRE-004's claim ("since it defines no timestamp slot") is the more general one Table 17 makes explicitly. - REQ-WIRE-005 (ACF_GBB 64-bit message_timestamp octet layout) -> TC18-11.3-003 -- same Table 17, whose field order (acf_msg_type/ acf_msg_length/pad/mtv/rsv/byte_bus_id, then message_timestamp, then evt/hs/cs/transaction_num/op/rsp/err/ms/read_size-or-segment_num) matches the exact octet ranges the requirement specifies, for the genuine-timestamp GBB case (as opposed to the conditional-request GBB tables in Section 11.2.2.x, which repurpose those same bytes to encode a condition rather than a real timestamp -- confirmed by reading Tables 6/7/8/9/12, all of which set mtv=0 and use non-timestamp field names in that byte range). - REQ-WIRE-006 (shared byte_message_info fields) -> TC18-11.2.1-005 -- Table 4's full field-by-field list matches every field the requirement names, and unlike Table 17 does not contradict the "evt ack flag + 3-bit sub-opcode" claim: Table 17's evt semantics are response-specific (0x0=simple/data/error, 0x1-0x8=counter, 0xF=ack) and would have been a wrong-linking, whereas Table 4's evt entry ("Endpoint specific usage, see section 13.5") and Section 13.5's own text ("evt[3] is used to request an acknowledge. I.e. evt[3] = 1 requests acknowledge.") are exactly the ack-flag/sub-opcode split cpp-RCP tests. - REQ-WIRE-009 (standard request = unconditional ACF_ABB) -> TC18-11.2.1-002 -- "A request that is meant for best effort execution shall be sent in ACF_ABB format." - REQ-WIRE-010 (four response kinds distinguishable) -> TC18-11.3.1-001 -- anchors the Section 11.3.1-11.3.4 sequence (Acknowledge/Write/Read/ Error identification by evt/op/err) that response_kind_of implements in full; matches go-RCP's REQ-AVTP-021 choice, independently re-derived here. - REQ-WIRE-011 (avtp_timestamp validity explicit via tv, not zero-value) -> TC18-11.1-002 -- Figure 5's tv bit is a validity marker held separately from the avtp_timestamp value field itself, cross-confirmed via Figure 20's rendered field labels ("...mr rsv tv sequence_num_lsb reserved tu...AVTP Time avtp_timestamp"). 7 requirements deliberately left untouched: - REQ-WIRE-003 (subtype-mismatch decode rejection, AvtpErrc::bad_subtype) -- defensive input-validation coding; TC18 defines what subtype value each header uses but has no MUST clause requiring a decoder to reject a mismatched one. Same category go-RCP left untouched for its analogous REQ-AVTP-003/004 (short-buffer / version-mismatch checks). - REQ-WIRE-007 (StreamId MAC/suffix round-trip) -- IEEE 1722 baseline concept (stream_id = MAC + unique_id), not a TC18-specific clause and outside the master catalog's Section 11-13 scope. Matches go-RCP's REQ-AVTP-006 reasoning exactly. - REQ-WIRE-008 (byte_bus_id echoed unchanged on responses) -- the precise textual match ("The endpoint will create responses and (if requested) acknowledges using the byte_bus_id that was included in the request") lives in TC18 Section 10.1/10.2, which the master catalog does not cover (catalog is scoped to Section 11-13 only). Section 13.1's "byte_bus_id is only unique in the context of a STREAM_ID" and Table 17's generic field list don't state the echo-on-response rule explicitly enough to cite with confidence; left unlinked rather than force a lower-confidence match. - REQ-WIRE-012 (effective_timestamp: TSCF-preferred, then ACF_GBB, then none) -- no single TC18 clause states this combined fallback rule. TC18 keeps TSCF avtp_timestamp (request execution time, Section 11.1/11.4.3) and ACF_GBB message_timestamp (response capture time, Section 11.3/11.4.2) as semantically distinct concepts tied to different message directions; this reads as a cpp-RCP-internal utility abstraction over both, not a spec-mandated behavior. - REQ-WIRE-013 (decoders reject short buffers, AvtpErrc::short_buffer) -- defensive bounds-checking, no distinct TC18 MUST clause. Same category as REQ-WIRE-003 and go-RCP's REQ-AVTP-003. - REQ-WIRE-014 (ACF message-type mismatch rejected, AcfErrc:: bad_acf_msg_type) -- defensive input-validation coding, same category as REQ-WIRE-003/013; TC18 defines the acf_msg_type constant values (Table 4/17) but not a MUST to reject a decoder-observed mismatch. - REQ-WIRE-015 (RELAY spec Section 15.5 canonical ControlFlags/Message conversion) -- out of TC18 scope entirely. Its own `standard` field is already "relay" (not "iso26262"), and its text governs conversion to RELAY's own internal Go `Message` shape per RELAY spec Section 15.5, not any TC18 clause. Verification (commands and results, see also this repo's own .github/workflows/ci.yml): - cmake -B build -DCMAKE_BUILD_TYPE=Release -DCMAKE_CXX_STANDARD=17 -DCMAKE_EXPORT_COMPILE_COMMANDS=ON -DRELAY_BUILD_CLI=ON -G Ninja && cmake --build build --parallel: clean build, 219/219 targets. - ctest --test-dir build --output-on-failure -j1: 53/53 tests passing (100%), identical to pre-change. - Pinned cpfusa v0.18.0 (git clone --depth=1 --branch v0.18.0 https://github.com/SoundMatt/cpp-FuSa): cpfusa check 0 errors (2 pre-existing warnings / 1 info, unrelated to this change, identical before/after). - cpfusa trace --format json: totalRequirements/tracedRequirements/ testedRequirements/secTestedRequirements = 376/376/376/64, byte-for- byte identical before and after this change (verified via git stash) -- this batch adds citation metadata only, never adds/removes/ re-tests a requirement. - git status --short / git clean -ndx: only .fusa-reqs.json modified; build/ is gitignored; no stray artifacts. This is the pilot batch establishing the propagation pattern for cpp-RCP's remaining prefixes. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> Signed-off-by: Matt Jones <47545907+SoundMatt@users.noreply.github.com>
SoundMatt
added a commit
that referenced
this pull request
Aug 19, 2026
…Q-CANEP-*/REQ-I2C-*/REQ-ISELED-*/REQ-LINEP-*/REQ-MDIO-*/REQ-ADC-* (#109) * docs(fusa): [c-RCP-18-tracker Part 1] propagate tc18_master_id for REQ-CANEP-*/REQ-I2C-*/REQ-ISELED-*/REQ-LINEP-*/REQ-MDIO-*/REQ-ADC-* This batch links 21 of the 32 requirements across REQ-CANEP-* (7), REQ-I2C-* (5), REQ-ISELED-* (5), REQ-LINEP-* (4), REQ-MDIO-* (5), and REQ-ADC-* (6) to their TC18 master-catalog clauses (RELAY's docs/tc18-master-catalog.json), verified directly against TC18.txt (the line-numbered plaintext extraction) and cpp-RCP's own include/rcp/{can,i2c,iseled,lin,mdio,adc}.hpp headers and their tests/test_*.cpp files — not copied from go-RCP's already-merged equivalent batches, per the task's instruction to verify independently since cpp-RCP's own wording/implementation choices can differ even where the underlying TC18 clause is identical. All six prefixes are the genuine per-endpoint-type TC18 packages (same role as go-RCP's already-confirmed CAN/I2C/ISELED/LIN/MDIO/ADC equivalents), not part of cpp-RCP's non-TC18 integration-shell set — confirmed by reading each header's own doc comment, none of which carries a TC18-scope disclaimer. Linked (21): REQ-LINEP-001 -> TC18-13.2-002 ep_type=0x06, Table 32 "ep_type values" REQ-LINEP-002 -> TC18-13.7.10.3-001 Figure 39 raw "Lin payload" wire region, no PID/checksum/schedule sub-fields REQ-LINEP-003 -> TC18-13.7.10.1-001 match-based reply behavior underlying responded/no-responded branching REQ-CANEP-001 -> TC18-13.2-002 ep_type=0x0B, Table 32 "ep_type values" REQ-CANEP-003 -> TC18-13.7.11.3-004 "Sending remote frames is not supported." REQ-CANEP-004 -> TC18-13.7.11.3-002 CAN XL 2054-byte ceiling + segmentation requirement REQ-CANEP-005 -> TC18-13.7.11.2-002 Table 56 CAN bit time registers 1/2/3 (Classical/FD/XL) REQ-CANEP-006 -> TC18-13.7.11.2-002 Table 56 acceptance/receive filter register fields REQ-ISELED-001 -> TC18-13.2-002 ep_type=0x0C, Table 32 "ep_type values" REQ-ISELED-002 -> TC18-13.7.12.3-001 Figure 41 request shape (+ Figure 42 response shape cited in-text) REQ-ISELED-003 -> TC18-13.7.12.3-004 "A response always contains the 12 bit address and 12 bit data plus the optional 4 bit CRC." REQ-ISELED-004 -> TC18-13.7.12.1-002 "single trigger event ... when transmission ... has been completed" REQ-MDIO-001 -> TC18-13.2-002 ep_type=0x0D, Table 32 "ep_type values" REQ-MDIO-002 -> TC18-13.7.13.3-002 Table 60 mdio_payload width rules per mdio_mode REQ-I2C-002 -> TC18-13.7.7.1-003 optional wait-for-bit-sequence request REQ-I2C-003 -> TC18-13.7.7.3-001 transparent raw payload incl. address (Figure 30) REQ-I2C-004 -> TC18-13.7.7.4-001 optional HW trigger event generation (Table 50's own Event column is blank in the extraction, so specific signal names are this implementation's own) REQ-ADC-001 -> TC18-13.7.9.3-003 "A measured value may contain the average of multiple ADC samples..." REQ-ADC-002 -> TC18-13.7.9.1-006 averaging-interval + COMBINE_NR_VAL clause (also corrects this entry's PRE-EXISTING tc18 citation, added before this batch: it quoted this exact text but misattributed it to §13.7.9.2 L5040 — verified against TC18.txt, the quote only occurs at §13.7.9.1 L5455-5457) REQ-ADC-003 -> TC18-13.7.9.1-010 "The ADC only samples the input, when a request is executed..." REQ-ADC-004 -> TC18-13.7.9.1-002 PWM-triggered ADC read concept Deliberately skipped (11), with reasoning: REQ-I2C-001 i2c_mode's coarse hs-bit decode is an explicitly documented open item (header comment: "pending a future spec errata pass") — no single TC18 clause cleanly covers an intentionally-unresolved ambiguity. REQ-I2C-005 boilerplate error-category/non-empty-message test, no distinct TC18 clause. REQ-CANEP-002 11-bit/29-bit CAN identifier numeric range boundaries (0x7FF / 0x1FFFFFFF) are standard CAN-protocol facts; TC18's own CAN section text only states "In case the CAN ID is 11bits, then it shall be right aligned..." (right-alignment, not range validation) and never states the 29-bit extended range numerically anywhere in the extraction — grepped TC18.txt to confirm no "29-bit"/"29 bit"/"0x1FFFFFFF" text exists. REQ-CANEP-007 Combines two things, neither independently citable: (a) "CAN has no TriggerRegistry" is a structural absence (TC18's CAN section genuinely has no trigger- signal subsection, unlike I2C/ADC/UART/PWM), which cannot be supported by a positive spec quote; (b) the CanErrc-category half is the same boilerplate pattern skipped everywhere else in this batch. REQ-ISELED-005 boilerplate error-category test, no distinct TC18 clause. REQ-MDIO-003 register write-then-read round-trip and "unwritten register reads 0" are this implementation's own internal-fidelity choices; TC18's MDIO section has no register-persistence-semantics text to cite. REQ-MDIO-004 (mdio_mode, mdio_address) register-space distinctness is implementation-internal; MDIO's TC18 section (13.7.13.1-.3) has no trigger-signal subsection at all (unlike I2C/ADC/UART/PWM), so "notify TransferComplete on every request" also has no TC18 basis to cite. REQ-ADC-005 AdcErrc::no_signal is explicitly documented in adc.hpp's own header comment as "an internal condition... not a TC18 error code" (TC18's Table 27 error-code list has no ADC-specific no-signal entry) — the missing-triggered-capture behavior this requirement tests is this implementation's own choice, not a spec clause. REQ-ADC-006 boilerplate error-category test, no distinct TC18 clause. REQ-LINEP-004 boilerplate error-category test, no distinct TC18 clause. Citation correction found: REQ-ADC-002's tc18 field (added before this batch, likely from an earlier ADC-focused pass — this batch found it already present but WITHOUT a tc18_master_id) cited "§13.7.9.2 ... TC18.txt L5040" for the "an implementation may decide to fix" quote. Verified against TC18.txt directly: that quote exists exactly once, at §13.7.9.1 L5455-5457, not §13.7.9.2, and not at L5040. Corrected in this commit alongside adding the missing tc18_master_id. Drift finding (not corrected, out of this pass's metadata-only scope): REQ-ISELED-004's title/text still describe a NativeCrcError trigger signal and IseledErrc::native_crc_mismatch error that include/rcp/iseled.hpp's own header comment documents were removed by the issue #71/cpp-RCP-02 wire-format fix (the invented CRC-8 was removed because this repo has no verified copy of the real ISELED CRC algorithm). tests/test_iseled.cpp's REQ-ISELED-004 case now only exercises the single surviving TransferComplete signal. This entry is still linkable (TC18-13.7.12.1-002, "single trigger event ... when transmission ... has been completed" matches the current, narrower tested behavior), but its title/text predate that fix and should be updated by a future pass; flagged here rather than silently correcting content outside this PR's stated scope. Verification (branch tc18-533-propagate-canep-i2c-iseled-linep-mdio-adc-master-id, based on origin/main @ 0bbe7dd, re-confirmed fresh immediately before push): - cmake -B build -DCMAKE_BUILD_TYPE=Release -DCMAKE_CXX_STANDARD=17 -DCMAKE_EXPORT_COMPILE_COMMANDS=ON -DRELAY_BUILD_CLI=ON -G Ninja && cmake --build build --parallel: 219/219 targets, 0 errors (pre-existing toolchain -Wnonnull notes in unrelated test_l2.cpp/test_udp.cpp translation units only, not from this change). - ctest --test-dir build --output-on-failure -j1: 53/53 suites passed (100%), 47.51s. - cpp-FuSa v0.18.0 (built from source, matching .github/workflows/ci.yml's pin) `cpfusa check`: 0 errors, 2 warnings, 1 info — identical before and after this change (pre-existing FUSA004/FUSA005/HARA005 findings, unrelated to .fusa-reqs.json). - `cpfusa trace --format json` coverage: totalRequirements=376, tracedRequirements=376, testedRequirements=376, secTestedRequirements=64 — identical before and after (confirmed via git stash A/B comparison), consistent with PR #108's own stated 376/376/376/64 baseline. Metadata-only change, no coverage impact. - git diff --stat: .fusa-reqs.json | 83 ++++++++++++++++++++-------- (62 insertions, 21 deletions) across exactly 21 requirement entries (20 newly linked + REQ-ADC-002's pre-existing tc18 field corrected and given its tc18_master_id). Signed-off-by: Matt Jones <47545907+SoundMatt@users.noreply.github.com> Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> * docs(fusa): fix REQ-ISELED-004's tc18_master_id (review follow-up) Independent review found the original batch linked REQ-ISELED-004 -- whose own text is entirely about NativeCrcError/native_crc_mismatch CRC verification -- to TC18-13.7.12.1-002, the *adjacent* trigger-event clause ('The ISELED endpoint creates a single trigger event...'), not the CRC clause the requirement is actually about. TC18-13.7.12.1-001 ('The optional CRC generation as specified in the ISLED standard can be enabled. If so, the CRC will be generated and attached to the write messages to the ISELED network. For read data accordingly the CRC will be also calculated and checked.', TC18.txt L5910-5912) is the correct match -- verified directly against TC18.txt. The original batch's own NOTE about this entry's stale title/text (referencing a NativeCrcError signal issue #71/cpp-RCP-02 already removed) is preserved, since that finding is independently correct and still out of scope for this metadata-only pass. Signed-off-by: Matt Jones <47545907+SoundMatt@users.noreply.github.com> Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> --------- Signed-off-by: Matt Jones <47545907+SoundMatt@users.noreply.github.com> Co-authored-by: Claude Sonnet 5 <noreply@anthropic.com>
This was referenced Aug 19, 2026
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Pilot batch of the cross-repo TC18-master-catalog-propagation effort on cpp-RCP (RELAY's
docs/tc18-master-catalog.json, 447 entries), following the pattern already established across four merged go-RCP batches (#161-#164). Links the TC18-scopedREQ-WIRE-*requirements (the AVTP-header/ACF-message wire-encoding layer, cpp-RCP's equivalent of go-RCP'sREQ-AVTP-*prefix) to their master catalog entry via a newtc18_master_idfield, matching the field convention already used in go-RCP's and c-RCP's own.fusa-reqs.json. None of the 15REQ-WIRE-*entries previously carried atc18citation at all (confirmed before starting: only 10 of 376 requirements repo-wide have one, none of them REQ-WIRE-*), so this batch is pure addition, not correction.Every citation below was verified directly against
TC18.txt(the plaintext extraction already used elsewhere in this repo's owntc18citations), not copied from go-RCP's analogous mapping — several diverge from go-RCP's REQ-AVTP-* choices where cpp-RCP's wording pointed at a different, more precise clause.8 requirements linked
REQ-WIRE-001TC18-11.1-004REQ-WIRE-002TC18-11.1-002REQ-WIRE-004TC18-11.3-003encode_acf_abb/decode_acf_abbare generic codecs used for both directions. go-RCP's analogousREQ-AVTP-011usedTC18-11.2.1-004instead — not reused here since REQ-WIRE-004's claim ("since it defines no timestamp slot") is the more general one Table 17 makes explicitly.REQ-WIRE-005TC18-11.3-003REQ-WIRE-006TC18-11.2.1-005REQ-WIRE-009TC18-11.2.1-002REQ-WIRE-010TC18-11.3.1-001response_kind_ofimplements in full; matches go-RCP'sREQ-AVTP-021choice, independently re-derived here.REQ-WIRE-011TC18-11.1-0027 requirements deliberately left untouched
REQ-WIRE-003(subtype-mismatch decode rejection,AvtpErrc::bad_subtype) — defensive input-validation coding; TC18 defines what subtype value each header uses but has no MUST clause requiring a decoder to reject a mismatched one. Same category go-RCP left untouched for its analogousREQ-AVTP-003/004(short-buffer / version-mismatch checks).REQ-WIRE-007(StreamId MAC/suffix round-trip) — IEEE 1722 baseline concept (stream_id = MAC + unique_id), not a TC18-specific clause and outside the master catalog's §11-13 scope. Matches go-RCP'sREQ-AVTP-006reasoning exactly.REQ-WIRE-008(byte_bus_id echoed unchanged on responses) — the precise textual match ("The endpoint will create responses and (if requested) acknowledges using the byte_bus_id that was included in the request") lives in TC18 §10.1/10.2, which the master catalog does not cover (catalog is scoped to §11-13 only). §13.1's "byte_bus_id is only unique in the context of a STREAM_ID" and Table 17's generic field list don't state the echo-on-response rule explicitly enough to cite with confidence; left unlinked rather than force a lower-confidence match.REQ-WIRE-012(effective_timestamp: TSCF-preferred, then ACF_GBB, then none) — no single TC18 clause states this combined fallback rule. TC18 keeps TSCF avtp_timestamp (request execution time, §11.1/§11.4.3) and ACF_GBB message_timestamp (response capture time, §11.3/§11.4.2) as semantically distinct concepts tied to different message directions; this reads as a cpp-RCP-internal utility abstraction over both, not a spec-mandated behavior.REQ-WIRE-013(decoders reject short buffers,AvtpErrc::short_buffer) — defensive bounds-checking, no distinct TC18 MUST clause. Same category asREQ-WIRE-003and go-RCP'sREQ-AVTP-003.REQ-WIRE-014(ACF message-type mismatch rejected,AcfErrc::bad_acf_msg_type) — defensive input-validation coding, same category asREQ-WIRE-003/013; TC18 defines the acf_msg_type constant values (Table 4/17) but not a MUST to reject a decoder-observed mismatch.REQ-WIRE-015(RELAY spec §15.5 canonical ControlFlags/Message conversion) — out of TC18 scope entirely. Its ownstandardfield is already"relay"(not"iso26262"), and its text governs conversion to RELAY's own internal GoMessageshape per RELAY spec §15.5, not any TC18 clause.Verification
(commands and results — see also this repo's own
.github/workflows/ci.yml)cmake -B build -DCMAKE_BUILD_TYPE=Release -DCMAKE_CXX_STANDARD=17 -DCMAKE_EXPORT_COMPILE_COMMANDS=ON -DRELAY_BUILD_CLI=ON -G Ninja && cmake --build build --parallel: clean build, 219/219 targets.ctest --test-dir build --output-on-failure -j1: 53/53 tests passing (100%), identical to pre-change.cpfusav0.18.0 (git clone --depth=1 --branch v0.18.0 https://github.com/SoundMatt/cpp-FuSa):cpfusa check0 errors (2 pre-existing warnings / 1 info, unrelated to this change, identical before/after).cpfusa trace --format json:totalRequirements/tracedRequirements/testedRequirements/secTestedRequirements= 376/376/376/64, byte-for-byte identical before and after this change (verified viagit stash) — this batch adds citation metadata only, never adds/removes/re-tests a requirement.git status --short/git clean -ndx: only.fusa-reqs.jsonmodified;build/is gitignored; no stray artifacts.This is the pilot batch establishing the propagation pattern for cpp-RCP's remaining prefixes.
Co-Authored-By: Claude Sonnet 5 noreply@anthropic.com