Add Matrix intake bot (M1+M2): typed message → approved fundraising-grid write

New backend/matrix_intake/ runs as its own process (matrix-nio isolated from the
stdlib CRM): local-Qwen parse via Spark Control → in-thread human approval
(yes/edit/no) → write through the CRM's own log-communication endpoint, tagged
source=matrix_intake. Adds read-only GET /api/intake/match (returns grid row id,
no-duplicate contract); threads provenance through handle_log_fundraising_communication.
Reviewer-passed: pop-before-commit closes a double-approve race; edit-grammar fix.
Text-only v1; business-card photo (M3) deferred (no Spark vision model).
26/26 tests green; live Matrix smoke pending deploy.
This commit is contained in:
Keysat
2026-06-17 07:51:27 -05:00
parent 172c76553b
commit 7ad0ee7624
20 changed files with 1169 additions and 7 deletions
+7
View File
@@ -0,0 +1,7 @@
"""Matrix intake bot — a dedicated Matrix room that turns a typed message into a
proposed fundraising-grid add/edit, gated on in-thread human approval before any write.
Separate process from the CRM (its only third-party dep, matrix-nio, lives here, never
in the stdlib CRM runtime). Parses with local Qwen via Spark Control; on approval, writes
through the CRM's own API. See docs/guides/matrix-intake.md and ROADMAP.md.
"""