docs: spec the notes-blob → communications unification; record v0.1.0:106
- ROADMAP: full spec to retire the notes blob into a single investor-anchored communications store (schema rebuild, email unification, log-form simplify, derived grid column, LLM-assisted retrofit-then-delete); mark contact_type retirement done - AGENTS.md: Current state -> v0.1.0:106 deployed; Next points at the census extension + comms unification
This commit is contained in:
@@ -108,12 +108,10 @@ Subsystem rules live in `docs/guides/` and lazy-load in Claude Code via `.claude
|
||||
|
||||
## Current state
|
||||
|
||||
_**Box live at v0.1.0:105 (deployed + verified 2026-06-20)** — clean StartOS migration chain (…→105) and the in-app SQL chain through `0008_drop_retired_tables` (`lp_profiles` + `feature_requests` physically dropped on the box), server up on :8080. This session = a **removal + bug-fix + feature batch** (v0.1.0:104, below) **+ a TEMPORARY admin contacts-census diagnostic (v0.1.0:105 — delete after use).** **The fundraising grid + email capture is the canonical system of record.** History: git log + `start9/0.4/startos/versions/`._
|
||||
_**Box live at v0.1.0:106 (deployed + verified 2026-06-21)** — clean StartOS migration chain (…→106), server up on :8080. **The fundraising grid + email capture is the canonical system of record.** History: git log + `start9/0.4/startos/versions/`._
|
||||
|
||||
- **Removed (v0.1.0:104):** the **Instructions** + **Feedback** (`feature_requests`) pages + backend, and `lp_profiles` + `investor_type` (across server / ingest / seeds). Migration `0008` drops both empty tables (a sanctioned one-off exception to never-hard-delete); `0001`'s `lp_profiles` ALTER was removed so a fresh DB doesn't break the migration chain. Net −570 lines.
|
||||
- **Fixes (v0.1.0:104):** [B] email sync no longer terminally parks a mailbox on a transient timeout — `'retrying'` retries every cycle, `'error'` re-included on an hourly backoff, so **Grant's & Jonathan's stuck mailboxes self-heal on this deploy** (`test_sync_ready.py`). [C] clock icon on the mobile email Review-log sets a reminder inline. [D] email-approval cards show date/time. **[Contacts 500-cap]** the mobile Contacts directory now pages through ALL contacts (was truncated at 500 of 720 — hid people from the list *and* search).
|
||||
- **New (v0.1.0:104):** admin-only **Purge Deleted Data** (Settings → Admin) — guarded, type-to-confirm hard-delete of soft-deleted rows; see the soft-delete convention + `test_purge_soft_deleted.py`.
|
||||
- **Verification:** **45/45** backend, render-smoke green, reviewer-agent APPROVE after fixing **1 blocker** (contact purge left a dangling `reminders.contact_id` — now NULLed + test-guarded). New UI behavior is **live-smoke / on-device only** (jsdom can't drive touch).
|
||||
- **Shipped (v0.1.0:106):** **retired `contacts.contact_type` (logical).** Desktop Contacts lost the Investors/Prospects tabs + TYPE badge → a grid-derived **Status** (existing-LP badge + pipeline-stage chip via `contact_grid_signals`); dashboard `total_lps`/`total_prospects` now count grid investor entities (committed>0 vs $0, graveyard + 'Untitled Investor' excluded) + fixed a `total_contacts` soft-delete leak. Column left physically inert; physical DROP deferred to a signed-off table-rebuild migration. **45/45** + new dashboard assertions, render-smoke green, reviewer APPROVE (no blockers).
|
||||
- **New SPEC in ROADMAP (Grant 2026-06-21): retire the notes blob → unify ALL activity into `communications`.** Traced in code: the blob (`fundraising_investors.notes`) and `communications` are dual-written by `log-communication`; they drift, leak soft-deletes into the grid + grounding corpus, and **emails land in the blob, never in `communications`** (so the timeline misses emails). Plan: rebuild the leaf `communications` table (add `fundraising_investor_id` NOT NULL, relax `contact_id` nullable, drop `duration_minutes`/`attendees`/`outcome`/`opportunity_id`), unify emails into comms, simplify the log form (+ `next_action`→auto-reminder, backdatable date, desktop==mobile), make the grid Notes column a derived view + Log button, retrofit blobs→comms, then DELETE the blob. Multi-session; see the ROADMAP spec.
|
||||
- **Bug A — Grant is handling:** `odell/marty/finance/ten31@` can't enroll for email capture ("could not resolve user_id") because the enroll flow requires a CRM `users` row; Grant is creating user accounts for those mailboxes.
|
||||
- **Next:** (A) **retire `contact_type`** (the next build) — replace the Contacts Investors/Prospects tabs + TYPE badge with grid-derived `existing_investor`/`pipeline_stage`, repoint the dashboard `total_lps`/`total_prospects` counts, then drop the column (live UI change → its own small design pass; see ROADMAP); (B) **contacts ↔ `fundraising_contacts` consolidation** — capture A/B/C from the live census (Settings → Admin → "Run census", or `GET /api/admin/contacts-census`), then **DELETE the TEMPORARY census endpoint + handler + route + button** (all tagged `TEMPORARY`; mirrors `backend/scripts/contacts_census.sql`); (C) confirm the two stuck mailboxes pulled current + Grant's 4 new mailbox users enroll; (D) carried: bell approve-on-phone → Matrix-thread-clears round-trip spot-check.
|
||||
- **Open / risks:** the Contacts pagination, the purge, and the email-sync auto-recovery are **live-smoke / not yet device-confirmed**. Carried: **Claude/Architect path unverified live on the box**; vision OCR small-in-frame misread (`mara.com→marac.com`); doc drift — `crm-overview.md` narrative + `EVALUATION.md` still describe `lp_profiles` (the active API/schema claims were fixed; the deeper Phase-0 narrative is deferred to a doc pass).
|
||||
- **Next:** (A) begin the **notes-blob → communications** work — start by **extending the contacts census** (count investors with notes but zero contacts; pure-structured vs legacy free-text blobs) to size the retrofit + the contactless gap; (B) **contacts ↔ `fundraising_contacts` consolidation** (path a — every investor ≥1 contact) + **DELETE the TEMPORARY census endpoint/handler/route/button** once A/B/C captured; (C) the deferred `contact_type` physical DROP can ride the `communications` rebuild; (D) confirm the two stuck mailboxes + Grant's 4 new mailbox users enroll; (E) carried: bell approve-on-phone → Matrix-thread-clears spot-check.
|
||||
- **Open / risks:** v106 desktop Contacts Status + dashboard counts are **live-smoke / not yet device-confirmed**. Carried: **Claude/Architect path unverified live on the box**; vision OCR small-in-frame misread (`mara.com→marac.com`); doc drift — `crm-overview.md` narrative + `EVALUATION.md` still describe `lp_profiles` (active API/schema claims fixed; deeper Phase-0 narrative deferred to a doc pass).
|
||||
|
||||
Reference in New Issue
Block a user