docs: prune Current state after 8f/8g; note 8g primitives + get-opp omission
This commit is contained in:
@@ -110,10 +110,8 @@ Subsystem rules live in `docs/guides/` and lazy-load in Claude Code via `.claude
|
|||||||
_**Box live at v0.1.0:94**; `main` ahead by mobile Phases 0–7 + P3b + drag-reorder + **8a–8g** — **all deploy-pending** (no s9pk built). **The fundraising grid + email capture is the canonical system of record.** Active thread: **mobile-first redesign → Phase 8**, building to `design/phase8-conformance.md` (the 8a–8i spec, anchored on each `*.dc.html` DEFAULT `data-props` — NOT the `screenshots/` PNGs). **Plan (Grant, 2026-06-19): finish features first → then Grant device-tests + deploys** (nothing verified on a real phone). History: git log + `start9/0.4/startos/versions/`._
|
_**Box live at v0.1.0:94**; `main` ahead by mobile Phases 0–7 + P3b + drag-reorder + **8a–8g** — **all deploy-pending** (no s9pk built). **The fundraising grid + email capture is the canonical system of record.** Active thread: **mobile-first redesign → Phase 8**, building to `design/phase8-conformance.md` (the 8a–8i spec, anchored on each `*.dc.html` DEFAULT `data-props` — NOT the `screenshots/` PNGs). **Plan (Grant, 2026-06-19): finish features first → then Grant device-tests + deploys** (nothing verified on a real phone). History: git log + `start9/0.4/startos/versions/`._
|
||||||
|
|
||||||
- **Mobile redesign — 4 core surfaces built (Grid · Contacts · Pipeline · Reminders), each a rules-of-hooks-safe `useIsMobile()` → `Mobile*`/`Desktop*` pair (desktop untouched).** Foundation: bottom-tab bar + `:root` mobile vars; 4-stage enum; derived grid signals injected-on-GET/stripped-on-write at both points; mobile writes use **one-row endpoints only** (log-communication, pipeline link/stage, reminders, `update-row`) — never whole-grid PUT.
|
- **Mobile redesign — 4 core surfaces built (Grid · Contacts · Pipeline · Reminders), each a rules-of-hooks-safe `useIsMobile()` → `Mobile*`/`Desktop*` pair (desktop untouched).** Foundation: bottom-tab bar + `:root` mobile vars; 4-stage enum; derived grid signals injected-on-GET/stripped-on-write at both points; mobile writes use **one-row endpoints only** (log-communication, pipeline link/stage, reminders, `update-row`) — never whole-grid PUT.
|
||||||
- **Phase 8 done so far (8a–8f):** cards re-authored (existing-LP **earmark**/avatar **ring**, PRIORITY/Existing-LP pills, 4-stage chip, recency; disposition badges dropped); **Contacts + Pipeline detail → drag-dismiss bottom sheets** (email-copy pill, Log/Email, Org card, stat tiles, inline move-stage, notes timeline); **Grid-detail notes timeline** + shared `LogCommunicationSheet`; **top-bar quick-log pencil** (`MobileQuickLog`, all tabs); **sort controls** on Grid/Pipeline/Contacts (shared `SortPill`/`SortSheet`; Contacts type-tabs dropped + Priority sort); **8e Reminders re-bucketed** — Active/Done/All tabs dropped → title + urgency **summary line** + gradient add; **4 buckets** Overdue/Today/This-week/Later each with a colored **dot**; urgency-colored **`DueChip`** pill (`--due-*` theme vars) replaces plain due text; collapsible **Completed** section (done+cancelled, strikethrough, tap-check reopens); card now note + org + due-chip (assignee dropped from card, still in edit sheet); **swipe-right → snooze preset sheet** (+1/+3/+7/+14d, dc-style) replacing the old fixed +7d; **add-flow investor picker** — a stacked searchable sheet over the canonical grid investors that writes **`source_row_id` → a real server-resolved `investor_id` link** (replaces the old free-text label that never actually linked; "team task" = no investor). Per-phase detail in git log + the Design convention's primitives list.
|
- **Phase 8 done (8a–8g)** — cards/details/sheets re-authored to the dc anatomy. The durable per-primitive record is the **Design convention's primitives list**; per-phase "what changed" is in git log. Recent: **8f** Pipeline card (horizontal-scroll stage pills + count badge, earmark/Priority/recency card, StageChip+count+sum column header, tappable page dots; the opportunities list now injects read-only `existing_investor` + `last_contact_date`, no strip-point — opp writes use a field allowlist); **8g** add-investor sheet (optional `.stage-pick` picker defaulting to "Not in pipeline", Priority toggle, optional reminder; `submitCreate` = create → optional pipeline-link → optional reminder, all one-row; backend honors `priority` only on the create-if-missing branch).
|
||||||
- **8f Pipeline card → dc anatomy:** segmented control is now **horizontal-scroll pills** (label + count badge; the active pill tints to its own stage color via `--seg-*`); cards re-authored to **earmark corner + name + Priority pill / `$amount · dot · recency` / labeled `‹ Prev`·`Next ›` move footer** (was name + contact·org sub + bare ‹/›); stage-column header is **StageChip + investor count + committed sum**; **page dots tappable** (active = 22px accent bar). Backend: the **opportunities list injects derived read-only `existing_investor`** (via `contact_grid_signals` committed>0 — agrees with the detail's "Existing LP" pill) **+ `last_contact_date`** (`MAX(communication_date)` on the deal's contact, soft-delete-filtered — drives the card recency + the Staleness sort). No strip-point needed (opp writes use a field allowlist, never a blob PUT). Card amount stays `expected_amount` (the deal forecast); earmark is the orthogonal existing-LP flag.
|
|
||||||
- **8g add-investor stage + priority (+ reminder):** the mobile "New investor" sheet now also captures an **optional initial pipeline stage** (a `.stage-pick` chip picker — **defaults to "Not in pipeline"**, Grant's call: no surprise opportunity rows), a **"Flag as Priority"** toggle, and an **optional reminder** (title + progressive due-date). On submit `submitCreate` orchestrates one-row calls in sequence: create (`log-communication` `create_investor_if_missing`, now carrying `priority`) → **if a stage was picked**, link at that stage (reusing `applyStage`'s idempotent link-then-PATCH) → **if a reminder title was given**, `POST /api/reminders` with the new row's `source_row_id`. The link/reminder steps are non-fatal (a failure toasts but never loses the created investor). Backend: `handle_log_fundraising_communication` honors an optional `priority` **only on the create branch** (existing-row logs never touch priority). Guarded by `test_grid_add_investor.py` (priority-on-create + defaults-False + the create→link and create→reminder handshakes on a freshly-synced row).
|
|
||||||
- **Live (deployed):** W2 NL query (v94); W1 reminders (v93); grid Pipeline (v88); Matrix intake + Gmail capture (DWD) + daily digest; Thesis/Architect (dual-approval); outreach — all draft-only.
|
- **Live (deployed):** W2 NL query (v94); W1 reminders (v93); grid Pipeline (v88); Matrix intake + Gmail capture (DWD) + daily digest; Thesis/Architect (dual-approval); outreach — all draft-only.
|
||||||
- **Tests:** **40/40 backend green** (`python3 backend/run_tests.py`; +`test_grid_comm_timeline.py` for the 8c timeline filter, +priority assertions in `test_contacts_grid_signals.py`; +8f opportunities-list `last_contact_date`/`existing_investor` soft-delete assertions in `test_soft_delete_reads.py`; +`test_grid_add_investor.py` for the 8g create flow), `py_compile` clean; 8c–8g surfaces interaction-verified via throwaway 375px jsdom harnesses (deleted after — 8f mounted `MobilePipeline` and 8g `MobileFundraisingGrid` against the **vendored** React/Babel + mocked `api`; 8g drove the create sheet end-to-end and asserted the create→link→reminder POST payloads). **jsdom note:** legacy `ReactDOM.render` doesn't fire `onChange` for synthetic input events — drive controlled inputs with `react-dom/test-utils` `Simulate.change`, not the prototype value-setter trick.
|
- **Tests:** **40/40 backend green** (`python3 backend/run_tests.py`), `py_compile` clean. Mobile surfaces interaction-verified via throwaway 375px jsdom harnesses (deleted after); harness recipe + the `Simulate.change` input gotcha live in the `mobile-surface-verification` memory.
|
||||||
- **Next — Phase 8, in order, build to `design/phase8-conformance.md`:** **8h** loose ends (incl. Grid detail G4/G5/G6 stage-card/reminder-card/timeline; "Open-in-Grid" deep-link-to-investor) → **8i** shell SVG icons + `·Ten31·` wordmark. **Skip Pipeline accordion** (Grant). **Then (after feature-complete):** deploy P0–P8 + P3b in one s9pk (**authorize + version-bump first**) and device-test light/dark on a phone.
|
- **Next — Phase 8, build to `design/phase8-conformance.md`:** **8h** loose ends (Grid detail G4/G5/G6 stage-card/reminder-card/timeline; "Open-in-Grid" deep-link-to-investor) → **8i** shell SVG icons + `·Ten31·` wordmark. **Skip Pipeline accordion** (Grant). **Then (feature-complete):** deploy P0–P8 + P3b in one s9pk (**authorize + version-bump first**) and device-test light/dark on a phone.
|
||||||
- **Open / risks:** all mobile work + light theme **built but never deployed or device-tested** (smoke/jsdom only); `MobileDetailRow` now unused-but-retained (legacy-usage sweep); Pipeline detail "Committed" tile shows grid-committed not deal-expected (deal forecast in a footnote); W2 happy-path only; **Claude/Architect path unverified live on the box**; v2.0 reserve-asset spine **not canonical**; doc drift — `crm-overview.md`/`EVALUATION.md` still call `lp_profiles` live.
|
- **Open / risks:** all mobile work + light theme **built but never deployed or device-tested** (smoke/jsdom only); `MobileDetailRow` unused-but-retained (legacy-usage sweep); Pipeline detail "Committed" tile shows grid-committed not deal-expected (forecast in a footnote); `handle_get_opportunity` (single-opp GET) deliberately does NOT inject `existing_investor`/`last_contact_date` — no surface needs it (the card uses the list injection; the detail derives `existing` from the contact fetch); W2 happy-path only; **Claude/Architect path unverified live on the box**; v2.0 reserve-asset spine **not canonical**; doc drift — `crm-overview.md`/`EVALUATION.md` still call `lp_profiles` live.
|
||||||
|
|||||||
Reference in New Issue
Block a user