Repository navigation
build_ack answers letter-delimited inbounds with a readable ACK, engine and tee (BACKLOG #2875) - #2364
Conversation
Where the inbound MSH-1/MSH-2 holds a character of the ACK's fixed text, or two delimiters share a character, the ACK and NAK go out under |^~\& and an echoed value is blanked unless its default delimiters keep their roles and it holds no escape. Punctuation is still echoed. tee/mllp.py mirrors the rule, pinned by a parity test, and splits MSH and MSA safely under an M, S, H or A separator. The fuzz strict xfail and the DAST known defect alphanumeric-field-separator are retired; ADR 0155 amended. PR title: build_ack answers letter-delimited inbounds with a readable ACK, engine and tee (BACKLOG #2875) Banner: BACKLOG #2875 FIXED: build_ack falls back to |^~\& when the inbound delimiters collide with the ACK's fixed text; the tee matches.
|
QA (lane A, BACKLOG #2875, head 8e514fc): code-review skill at level xhigh (BUILDER.md step 11), args exactly as briefed. Three runs; a JSON findings list each time, no separate tag. Repair rounds followed runs 1 and 2. A third, limited round went past the two-round cap for two reasons: the fix turned a DAST strict xfail into an XPASS, which would turn the default pytest leg red; and round 2 had blanked MSA-2 for letters the ACK never writes (D, Q, Z), which would make verify_ack_control_id retry forever. A round-1 MSA-3 change was reverted because it broke the PHI redactor and the event-loop budget tests. Shipped open: findings 1-8 in the PR body. |
|
Lander: enqueuing at pinned head 8e514fc. QA (xhigh) covers this head, and no finding needs the owner. Every open finding is filed in the vault ledger (#3725; vault PR 2494, merged 11:16Z, completeness-reviewed). Required checks are green; the only red, 'ASVS anchors (advisory)', is not required. |
Batch 265 (transports), BACKLOG #2875. This is its own PR because it also retires the DAST ingress sweep's one
known_defectsentry and amends ADR 0155. The fix turned that entry's strict xfail into an XPASS, so the two had to move together.Merge danger
Reversible: yes. A hand revert of 8e514fc undoes all of it, including the policy JSON and the ADR amendment.
Blast radius:
build_ackin messagefoundry/mllpcodec.py, which builds every MLLP ACK and NAK the engine sends.known_defectsis now empty), scripts/security/dast_ingress_sweep.py, and ADR 0155 (an amendment).MSH#@*!%#still echoes).Evidence
^AB, for example, is accepted, stored and answered AA, but the ACK does not read back.^AB,-,+,., a duplicate character, the field separator in MSH-2, and anFfield separator. The strict xfail in tests/test_harness_fuzz.py is now a plain test. A parity test pins the tee to the engine.Builder report: lane A, BACKLOG #2875
Source branch
b265-2875, head8e514fcaadc608d9aff31ab2de58f7797375a524. That is 1 commit on origin/main 8ba57ee._ack_echoswitches to|^~\&when MSH-1 or MSH-2 holds a character of the ACK's own fixed text, or when two delimiters share a character. The fixed-text characters are the segment ids, ACK, P, the MSA-1 codes, the E and F escapes, digits,+,-and.. The shared-character test counts the parser's default fill of a short MSH-2.verify_ack_control_id).--strict tee/mllp.pyare clean.Dis now echoed and reads back with its control id intact.D~\&or:~\&) still splits a NAK text at component level. A full fix runs into the redactor and the event-loop budget tests.control_idortimestampis written verbatim, even after a silent fallback. No caller passescontrol_idtoday._rolesgives it its first role in MSH-2 order. The parser may read it differently._builtin_hl7.separatorsandescape_leaf. The leaf import rule blocks the reuse.|^~\&". This fallback is a deliberate exception and should be recorded there.|^~\&when the inbound delimiters collide with the ACK's fixed text; the tee matches; the strict xfail and the DAST known defect are retired.Hosted legs to read
dast.ymldast-ingress job. Itsknown_defectsis now empty, so it tolerates no reply findings.