CR-014 - bodies carry customer context and the link carries the content
Nick's decision, 2026-08-20: 'email bodies provide links back to the system. we can talk about customers we just cant exposed their confidential documents.' The T7.6-era rule (no customer IP at all, so number + link only) is refined: context IN, content OUT. - wp_titled() and wp_where() compose 'number - title' and the CR-004 location (structured paths first, legacy free text second); the where-line is dropped entirely when unset rather than mailing 'Where: '. - assign, qa-ready, qa-reject and hold bodies gain title + location. The scope summary the original CR asked for stays OUT - scope text is document content; the link is its summary. Rejection comments stay on the package. - hold_body gains the house footer it alone lacked. - kitting and material-request bodies adopt wp_titled for the same identity line (their delivery-location rule is unchanged). - notify.py's docstring states the new rule where the transport documents it. Pins flipped WITH the rule, reasons in code: qa_gate_check's location canary is now asserted PRESENT in QA bodies; a new DESC_CANARY (document content) is asserted absent from every message (40 -> 41 checks). The sink also gains a decoded-body view: the em-dash switches smtplib to quoted-printable, whose column-76 soft breaks made raw-payload substring pins pass or fail on luck of line position - content pins now read the decoded body, header pins still read the wire payload. Battery: qa_gate_check 41/41, kitting_notify_check 17/17, mreq_check 19/19. Items: CR-014 (rule per decisions-2026-08-20.md), CR-011 pins. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
@@ -121,13 +121,14 @@ def main():
|
||||
len((wp.get("data") or {}).get("materialRequests") or []) == 1)
|
||||
chk("...and the warehouse owner is notified through the T7.6 gate",
|
||||
wait_for(lambda: any("Material request" in m["data"] for m in sink.messages), 12))
|
||||
body = next((m for m in sink.messages if "Material request" in m["data"]), {"data": "", "to": [""]})
|
||||
body = next((m for m in sink.messages if "Material request" in m["data"]),
|
||||
{"data": "", "text": "", "to": [""]})
|
||||
chk("...the mail goes to the owner, says the size, the date, the delivery "
|
||||
"and carries the deep link",
|
||||
body["to"] == ["sue@example.test"] and "2 lines" in body["data"]
|
||||
and "2026-09-01" in body["data"] and "Shark cage 7" in body["data"]
|
||||
and ("/wp-creation-index.html?project=projA&wp=" + wp_id) in body["data"],
|
||||
ascii_(body["data"], 300))
|
||||
body["to"] == ["sue@example.test"] and "2 lines" in body["text"]
|
||||
and "2026-09-01" in body["text"] and "Shark cage 7" in body["text"]
|
||||
and ("/wp-creation-index.html?project=projA&wp=" + wp_id) in body["text"],
|
||||
ascii_(body["text"], 300))
|
||||
_, ev = api(base, "/api/audit?entity_type=wp&entity_id=%s&action=material_requested" % wp_id, root)
|
||||
chk("...and the audit history has it", bool(ev))
|
||||
|
||||
|
||||
Reference in New Issue
Block a user