UPL-proof document templates + reliable bounce sync

Templates (22 files):
- Replace "Reviewed By" with "Document prepared by" + consulting disclaimer
- Add "not a law firm / not legal advice" footer to all CPNI, CALEA, RMD docs
- Change "on behalf of" to "at the direction of" in discontinuance letter
- Reframe RMD penalty language as client acknowledgment

Bounce sync:
- New listmonk-bounce-sync.py replaces unreliable bash tail watcher
- Scans full mail.log, matches QIDs to campaign senders, inserts directly
  into Listmonk DB with proper subscriber_id foreign keys
- Idempotent, runs via cron every 5 minutes

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
justin 2026-05-21 15:06:29 -05:00
parent d39e10485f
commit ba2f6eb667
23 changed files with 367 additions and 17 deletions

View file

@ -556,10 +556,10 @@ def generate_exhibit_a(
"Responds promptly to FCC deficiency notices, curing issues within specified timeframes to avoid RMD removal or traffic blocking.",
])
_add_body(doc, (
"Noncompliance risks under the 2025 RMD R&O include a base forfeiture "
"of $10,000 for false or inaccurate information and $1,000 per day "
"until cured for failure to update RMD information within 10 "
"business days of a material change."
f"{entity_abbr} acknowledges that under the 2025 RMD R&O, noncompliance "
"penalties include a base forfeiture of $10,000 for false or inaccurate "
"information and $1,000 per day until cured for failure to update RMD "
"information within 10 business days of a material change."
))
# ── 6. Future Enhancements ──
@ -610,6 +610,18 @@ def generate_exhibit_a(
_add_body(doc, entity_name)
_add_body(doc, f"Date: {today}")
# ── Consulting Disclosure ─────────────────────────────────────
doc.add_paragraph() # spacer
disc_p = doc.add_paragraph()
disc_r = disc_p.add_run(
"Document prepared with assistance from Performance West Inc., "
"a regulatory compliance consulting firm. Performance West Inc. is not a law firm "
"and this document does not constitute legal advice or legal representation."
)
disc_r.font.size = Pt(7)
disc_r.font.color.rgb = RGBColor(0x99, 0x99, 0x99)
disc_r.font.italic = True
# Save
output = Path(output_path)
output.parent.mkdir(parents=True, exist_ok=True)