@@ -1048,8 +1049,6 @@
Dependency graph (feat_ + infra_)
classDef plan fill:#fef9c3,stroke:#854d0e,color:#854d0e;
classDef spec fill:#dbeafe,stroke:#1e40af,color:#1e40af;
classDef idea fill:#f1f5f9,stroke:#334155,color:#334155;
- feat_data_table_primitive["data table primitive"]
- class feat_data_table_primitive plan;
infra_foundation["foundation"]
class infra_foundation done;
feat_study_lifecycle["study lifecycle"]
@@ -1124,6 +1123,8 @@ Dependency graph (feat_ + infra_)
class infra_structlog_test_helpers done;
feat_contextual_help["contextual help"]
class feat_contextual_help done;
+ feat_data_table_primitive["data table primitive"]
+ class feat_data_table_primitive done;
feat_study_lifecycle --> feat_digest_proposal
feat_llm_judgments --> feat_digest_proposal
infra_foundation --> feat_llm_judgments
@@ -1199,8 +1200,6 @@ Dependency graph (feat_ + infra_)
classDef plan fill:#fef9c3,stroke:#854d0e,color:#854d0e;
classDef spec fill:#dbeafe,stroke:#1e40af,color:#1e40af;
classDef idea fill:#f1f5f9,stroke:#334155,color:#334155;
- feat_data_table_primitive["data table primitive"]
- class feat_data_table_primitive plan;
infra_foundation["foundation"]
class infra_foundation done;
feat_study_lifecycle["study lifecycle"]
@@ -1275,6 +1274,8 @@ Dependency graph (feat_ + infra_)
class infra_structlog_test_helpers done;
feat_contextual_help["contextual help"]
class feat_contextual_help done;
+ feat_data_table_primitive["data table primitive"]
+ class feat_data_table_primitive done;
feat_study_lifecycle --> feat_digest_proposal
feat_llm_judgments --> feat_digest_proposal
infra_foundation --> feat_llm_judgments
diff --git a/state.md b/state.md
index 00244665..d1bff561 100644
--- a/state.md
+++ b/state.md
@@ -2,13 +2,13 @@
> Read this first. Snapshots the active branch, what just shipped, what's in flight, what's queued, and where the project currently sits in the MVP1 → GA roadmap. Updated whenever a feature lands or a priority shifts.
-**Last updated:** 2026-05-16 (during `feat_data_table_primitive` Epic 4 docs work — shared `` primitive consolidating 8 hand-rolled tables onto @tanstack/react-table + FTS / sort / filter / URL-state surface across 6 list endpoints + 9 new E2E specs. Branch `feat/data-table-primitive` carries all 4 epics; PR open pending Epic 4 phase gate).
+**Last updated:** 2026-05-16 (after `feat_data_table_primitive` merged as PR #126 — 18th MVP1 feature; shared `` primitive consolidating 8 hand-rolled tables onto @tanstack/react-table + FTS / sort / filter / URL-state surface across 6 list endpoints. All 7 CI checks green; 4 review-fix cycles before merge).
---
## Current branch / execution context
-- **Branch:** `feat/data-table-primitive` (Epic 4 docs in flight). `v0.1.0` annotated tag still on `main` commit `d099536` 2026-05-13; GitHub Release at https://github.com/SoundMindsAI/relyloop/releases/tag/v0.1.0.
+- **Branch:** `main` (post-merge of PR #126 squash commit `d6115b3` 2026-05-16). Finalization docs PR off `docs/finalize-data-table-primitive`. `v0.1.0` annotated tag still on `main` commit `d099536` 2026-05-13; GitHub Release at https://github.com/SoundMindsAI/relyloop/releases/tag/v0.1.0.
- **Active feature:** none in flight. **Three PRs shipped 2026-05-15:** PR #122 (Phase 1, 16th MVP1 feature — Tooltip primitive + 26 placements on create-study modal + study detail), PR #123 (Phase 1 finalization docs), PR #124 (Phases 2 + 3 — 17th MVP1 feature; 21 additional tooltips on judgments + proposals + cluster registration + 2 new first-run components: chat ExamplePrompts strip + Stripe-style StartHereChecklist on home page). The original "MVP1 Phase 1 only" scope-lock was reversed mid-day: operator decided to ship Phases 2 + 3 together with a Stripe-style design call rather than wait for MVP2. PR #124 took 2 hours from idea-folder reuse to merge. 47 total tooltip placements + 2 new first-run components live in `main`. **PR #122 shipped 2026-05-15 morning** — `feat_contextual_help` Phase 1 (16th MVP1 feature). Adds the first Tooltip primitive (`@radix-ui/react-tooltip@~1.2.8` + shadcn-style wrapper at `ui/src/components/ui/tooltip.tsx`), two glossary-backed wrappers (`InfoTooltip` standalone + asChild modes; `HelpPopover` click-to-open with `react-markdown` safety filter), and a 49-key glossary source-of-truth at `ui/src/lib/glossary.ts` (8 enum groups parity-tested against `enums.ts`). 26 tooltip placements across the create-study modal (Step 1 target + Step 3 template + 9 Step 5 inputs), study-header (status badge dynamic key + Best metric + Trials), trials-table (5 column headers + Sort label), and digest panel (5 section labels + Open PR enabled + Open PR disabled). The disabled Open PR button refactored from native `disabled` to `aria-disabled="true"` so it stays focusable and the tooltip reveals on focus (AC-11). Gemini Code Assist: 2 findings (1 accepted + fixed, 1 rejected with cited counter-evidence). Final GPT-5.5 review: 1 Medium accepted-framing-but-deferred. Spec converged at GPT-5.5 cycle 3 (24 findings, 23 accepted + 1 rejected); plan converged at cycle 2 (12 findings, 10 accepted + 1 rejected + 1 spec patch). UI vitest now **279 passing across 48 files** (was 249 across 45 — +3 new test files, +30 cases). Playwright E2E **8 passing** (was 5 — +3 new contextual-help tests). One follow-up filed: `infra_e2e_seed_completed_study/idea.md` tracks the E2E gap for digest-panel triggers + AC-11 (cross-subsystem helper for seeding a completed study with digest + proposal; component-level coverage is in place). Phases 2 + 3 deferred to MVP2 via `feat_contextual_help_mvp2/` (judgments + proposals tooltips; chat + cluster + home onboarding; the home-page "Start here" panel is the only product-design-shaped item).
**Earlier — seven PRs shipped 2026-05-14:** `feat_judgments_periodic_resume_sweep` (PR #104, 14th MVP1 feature), `bug_query_inline_crud_since_filter_uuidv7_ms_collision` (PR #106 — UUIDv7 ms-collision test flake), `infra_dashboard_regen_pre_commit_conflict §2+§4` (PR #108 — dashboard regen idempotency + relative-link rewriting), `infra_make_targets_split_backend_only` (PR #110 — `make backend-fmt/lint/typecheck` + symmetric `ui-fmt` so Node-18 contributors aren't blocked), `chore_digest_worker_narrow_except` (PR #112 — narrowed `except Exception` allowlist to `(ValueError,)` + ERROR-level `digest_importance_failed_unexpected` event), `infra_structlog_test_helpers` (PR #114 — factored the two structlog test-assertion patterns into `backend/tests/_log_helpers.py`), and `chore_chat_last_message_preview` (PR #117 — `last_message_preview` + `last_message_at` on `ConversationSummary` via LATERAL JOIN; frontend shows preview under title + swaps displayed timestamp from `created_at` to `last_message_at`). Plus PR #116 dropped `chore_studies_ui_shadcn_polish` as won't-do (forward-compat audit on NavigationMenu primitive + ClusterFilterSelect precedent on native `