diff --git a/docs/00_overview/DASHBOARD.md b/docs/00_overview/DASHBOARD.md index 9cfa6714..bd795eb9 100644 --- a/docs/00_overview/DASHBOARD.md +++ b/docs/00_overview/DASHBOARD.md @@ -6,7 +6,7 @@ _Top-level index across MVP1 → GA v1+ as of **2026-05-18**. Click a release na | Release | Theme | Progress | Status | |---|---|---|---| -| [MVP1 / v0.1](MVP1_DASHBOARD.md) | The Loop | 39 / 39 scoped done · 2 remaining | **In progress** | +| [MVP1 / v0.1](MVP1_DASHBOARD.md) | The Loop | 40 / 40 scoped done · 3 remaining | **In progress** | | [MVP2 / v0.2](MVP2_DASHBOARD.md) | Observable | 1 / 1 scoped done · 1 remaining | **In progress** | | MVP3 / v0.3 | Production Stacks | — | **Not yet scoped** | | MVP4 / v0.4 | Multi-tenant, Multi-LLM | — | **Not yet scoped** | diff --git a/docs/00_overview/MVP1_DASHBOARD.md b/docs/00_overview/MVP1_DASHBOARD.md index bcf3944c..8e0c2ddb 100644 --- a/docs/00_overview/MVP1_DASHBOARD.md +++ b/docs/00_overview/MVP1_DASHBOARD.md @@ -14,16 +14,16 @@ Pull from the Idea backlog or capture a new feature spec. | Metric | Value | |---|---| -| Scoped items done | **39 / 39** (100%) — feat_/infra_/chore_/epic_ past idea stage | -| Path to MVP1 | **2** items remaining (features + bugs + chores) | +| Scoped items done | **40 / 40** (100%) — feat_/infra_/chore_/epic_ past idea stage | +| Path to MVP1 | **3** items remaining (features + bugs + chores) | | Open bugs | 0 | -| Open chores | 2 (idea-stage debt) | +| Open chores | 3 (idea-stage debt) | | Backlog ideas | 1 idea-only feat/infra (not yet scoped into MVP1) | | In flight | 0 feature(s) actively shipping | ## Pipeline -### Done (48) +### Done (49) | Feature | Type | One-liner | Depends on | Status | |---|---|---|---|---| @@ -56,6 +56,7 @@ Pull from the Idea backlog or capture a new feature spec. | [chore_cluster_delete_ui](implemented_features/2026_05_13_chore_cluster_delete_ui/idea.md) | Chore | Complete | — | Complete | | [chore_digest_worker_narrow_except](implemented_features/2026_05_14_chore_digest_worker_narrow_except/idea.md) | Chore | Complete | — | Complete | | [chore_env_guard_extend_deny_pattern](implemented_features/2026_05_13_chore_env_guard_extend_deny_pattern/idea.md) | Chore | Complete | — | Complete | +| [chore_form_dropdown_primitive](implemented_features/2026_05_18_chore_form_dropdown_primitive/feature_spec.md) | Chore | Ready for Execution | — | [PR #126](https://github.com/SoundMindsAI/relyloop/pull/126) merged 2026-05-16 | | [chore_infra_foundation_github_token_file_retirement](implemented_features/2026_05_13_chore_infra_foundation_github_token_file_retirement/idea.md) | Chore | Complete | — | Complete | | [chore_openapi_contract_validation](implemented_features/2026_05_13_chore_openapi_contract_validation/idea.md) | Chore | Complete | — | Complete | | [chore_proposals_list_wire_param_e2e_test](implemented_features/2026_05_13_chore_proposals_list_wire_param_e2e_test/idea.md) | Chore | Complete | — | Complete | @@ -88,13 +89,14 @@ _None._ _None._ -### Idea (3) +### Idea (4) | Feature | Type | One-liner | Depends on | Status | |---|---|---|---|---| | [infra_e2e_wire_seed_helper_into_studies_spec](../02_product/planned_features/infra_e2e_wire_seed_helper_into_studies_spec/idea.md) | Infra | `infra_e2e_seed_completed_study` shipped `POST /api/v1/_test/studies/seed-completed` and the `seedStudyCompletedWithDigest` TypeScript helper. The two consuming E2E tests in `ui/tests/e2e/studies.spec | — | Idea — deferred from `infra_e2e_seed_completed_study` PR #130. The endpoint + helper landed cleanly; the 2 Playwright E2E tests that consume them caused the smoke CI lane to fail (root cause undiagnosed — agent environment had no access to GitHub Actions logs to debug the Playwright report). | | [chore_data_table_primitive_followups](../02_product/planned_features/chore_data_table_primitive_followups/idea.md) | Chore | `feat_data_table_primitive` shipped with six known non-regression follow-up items captured only in chat transcripts. None block the PR but each is a real improvement that would otherwise evaporate whe | — | Partial — items 1, 2, 4, 6 shipped in PR (TBD) 2026-05-17. Items 3 + 5 remain open (larger refactors touching 8 DataTable consumers each). | -| [chore_form_dropdown_primitive](../02_product/planned_features/chore_form_dropdown_primitive/idea.md) | Chore | The DataTable primitive shipped with a lint-enforced source-of-truth discipline — every enum filter cites a backend `Literal[...]` and every FK filter cites a `useX()` hook. Forms didn't get the same | — | Idea — identified during tutorial UX debugging session 2026-05-17. | +| [chore_extract_shadcn_select_test_mock](../02_product/planned_features/chore_extract_shadcn_select_test_mock/idea.md) | Chore | A factor-and-share refactor was attempted during `chore_form_dropdown_primitive` post-implementation. I extracted the mock to `ui/src/__tests__/helpers/shadcn-select-mock.tsx` exporting `mockShadcnSel | — | Idea — captured during `chore_form_dropdown_primitive` execution (PR pending). | +| [chore_form_dropdown_guide_screenshot_refresh](../02_product/planned_features/chore_form_dropdown_guide_screenshot_refresh/idea.md) | Chore | Each affected guide has a Playwright spec at `ui/tests/e2e/guides/*.spec.ts` that captures screenshots when run against the real backend. The PR's UI changes produce different screenshots: | — | Idea — captured during `chore_form_dropdown_primitive` post-implementation guide-impact assessment. | ## Dependency graph @@ -185,6 +187,8 @@ graph LR class feat_data_table_primitive done; infra_e2e_seed_completed_study["e2e seed completed study"] class infra_e2e_seed_completed_study done; + chore_form_dropdown_primitive["form dropdown primitive"] + class chore_form_dropdown_primitive done; feat_study_lifecycle --> feat_digest_proposal feat_llm_judgments --> feat_digest_proposal infra_foundation --> feat_llm_judgments diff --git a/docs/00_overview/dashboard.html b/docs/00_overview/dashboard.html index ec9e1e41..4420f26b 100644 --- a/docs/00_overview/dashboard.html +++ b/docs/00_overview/dashboard.html @@ -371,7 +371,7 @@

Releases

MVP1 / v0.1
The Loop
-
39 / 39 scoped done · 2 remaining
+
40 / 40 scoped done · 3 remaining
In progress
diff --git a/docs/02_product/planned_features/chore_form_dropdown_primitive/feature_spec.md b/docs/00_overview/implemented_features/2026_05_18_chore_form_dropdown_primitive/feature_spec.md similarity index 100% rename from docs/02_product/planned_features/chore_form_dropdown_primitive/feature_spec.md rename to docs/00_overview/implemented_features/2026_05_18_chore_form_dropdown_primitive/feature_spec.md diff --git a/docs/02_product/planned_features/chore_form_dropdown_primitive/idea.md b/docs/00_overview/implemented_features/2026_05_18_chore_form_dropdown_primitive/idea.md similarity index 100% rename from docs/02_product/planned_features/chore_form_dropdown_primitive/idea.md rename to docs/00_overview/implemented_features/2026_05_18_chore_form_dropdown_primitive/idea.md diff --git a/docs/02_product/planned_features/chore_form_dropdown_primitive/implementation_plan.md b/docs/00_overview/implemented_features/2026_05_18_chore_form_dropdown_primitive/implementation_plan.md similarity index 100% rename from docs/02_product/planned_features/chore_form_dropdown_primitive/implementation_plan.md rename to docs/00_overview/implemented_features/2026_05_18_chore_form_dropdown_primitive/implementation_plan.md diff --git a/docs/02_product/planned_features/chore_form_dropdown_primitive/pipeline_status.md b/docs/00_overview/implemented_features/2026_05_18_chore_form_dropdown_primitive/pipeline_status.md similarity index 100% rename from docs/02_product/planned_features/chore_form_dropdown_primitive/pipeline_status.md rename to docs/00_overview/implemented_features/2026_05_18_chore_form_dropdown_primitive/pipeline_status.md diff --git a/docs/00_overview/mvp1_dashboard.html b/docs/00_overview/mvp1_dashboard.html index 48c3e7aa..a016cbcd 100644 --- a/docs/00_overview/mvp1_dashboard.html +++ b/docs/00_overview/mvp1_dashboard.html @@ -384,13 +384,13 @@

MVP1 Progress

Scoped items done
-
39 / 39
+
40 / 40
100% of feat_/infra_/chore_/epic_ items past idea stage
Path to MVP1
-
2
+
3
items left = features + bugs + chores
@@ -400,7 +400,7 @@

MVP1 Progress

Open chores
-
2
+
3
idea-stage chore_* (debt)
@@ -428,7 +428,7 @@

Pipeline

-

Idea 3

+

Idea 4

@@ -455,12 +455,24 @@

Idea 3

- +
Chore
-
The DataTable primitive shipped with a lint-enforced source-of-truth discipline — every enum filter cites a backend `Literal[...]` and every FK filter cites a `useX()` hook. Forms didn't get the same
+
A factor-and-share refactor was attempted during `chore_form_dropdown_primitive` post-implementation. I extracted the mock to `ui/src/__tests__/helpers/shadcn-select-mock.tsx` exporting `mockShadcnSel
+ + +
+ + +
+ +
+ Chore + +
+
Each affected guide has a Playwright spec at `ui/tests/e2e/guides/*.spec.ts` that captures screenshots when run against the real backend. The PR's UI changes produce different screenshots:
@@ -483,7 +495,7 @@

Implementing 0

-

Done 48

+

Done 49

@@ -833,6 +845,18 @@

Done 48

+
+ +
+ Chore + PR #126merged 2026-05-16 +
+
Ready for Execution
+ + +
+ +
@@ -1151,6 +1175,8 @@

Dependency graph (feat_ + infra_)

class feat_data_table_primitive done; infra_e2e_seed_completed_study["e2e seed completed study"] class infra_e2e_seed_completed_study done; + chore_form_dropdown_primitive["form dropdown primitive"] + class chore_form_dropdown_primitive done; feat_study_lifecycle --> feat_digest_proposal feat_llm_judgments --> feat_digest_proposal infra_foundation --> feat_llm_judgments @@ -1306,6 +1332,8 @@

Dependency graph (feat_ + infra_)

class feat_data_table_primitive done; infra_e2e_seed_completed_study["e2e seed completed study"] class infra_e2e_seed_completed_study done; + chore_form_dropdown_primitive["form dropdown primitive"] + class chore_form_dropdown_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 0be136fc..df0ce157 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-17 (after `chore_data_table_primitive_followups` items 1+2+4+6 of 6 merged as PR #132 — test mock helper extraction + `useLocalStorageSet` docstring lock + `?limit=` allowlist coercion + URL-state validation in `useDataTableUrlState`. Items 3 + 5 remain open per the chore's idea file. UI vitest **368 passing across 56 files** — +11 cases. Defense-in-depth: direct URLs with `?status=invented` or `?sort=garbage:asc` now hydrate as empty matchers instead of being sent to the backend and 422-ing). +**Last updated:** 2026-05-18 (after `chore_form_dropdown_primitive` merged as PR #136 — form-side `` primitive + form-select-discipline vitest lint guard + 4 modal migrations + tutorial Step 5 modal-first walkthrough. UI vitest **399 passing across 58 files** — +31 cases. Two follow-ups captured for post-merge: `chore_form_dropdown_guide_screenshot_refresh` (4 stale walkthrough guides need regen) + `chore_extract_shadcn_select_test_mock` (factor the duplicated shadcn-Select vi.mock pattern via `vi.hoisted`).) --- ## Current branch / execution context -- **Branch:** `main` (post-merge of PR #132 squash commit `ee4c8d4` 2026-05-17). Finalization docs PR off `docs/finalize-data-table-followups`. Prior squashes: PR #130 `13b3383` 2026-05-17 (infra_e2e_seed_completed_study), PR #128 `73459d2` 2026-05-17 (bug_cursor_decode_value_validation), PR #126 `d6115b3` 2026-05-16 (feat_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. +- **Branch:** `main` (post-merge of PR #136 squash commit `cb7d9ee` 2026-05-18). Finalization docs PR off `docs/finalize-form-dropdown-primitive`. Prior squashes: PR #132 `ee4c8d4` 2026-05-17 (chore_data_table_primitive_followups items 1+2+4+6), PR #130 `13b3383` 2026-05-17 (infra_e2e_seed_completed_study), PR #128 `73459d2` 2026-05-17 (bug_cursor_decode_value_validation), PR #126 `d6115b3` 2026-05-16 (feat_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 `` blocks + one UUID-paste `` onto one shared API. Plus a sibling vitest lint guard (`form-select-discipline.test.tsx`) blocking inline `` for backend-validated enums in form components — companion to the Story 2.13 column-discipline guard from `feat_data_table_primitive`. **Migrations (4 components, 7 FK sites):** `create-query-set-modal.tsx` cluster_id (UUID `` → cluster dropdown with health-status dots; label renamed "Cluster ID" → "Cluster"; submit gains explicit required-field guard); `create-study-modal.tsx` 4 FK selects at lines 246 / 283 / 301 / 326 (cluster/query-set/judgment-list/template — child-field reset preserved verbatim); `register-cluster-modal.tsx` config-repo (conditional render → always-visible with empty-state CTA Link — UX improvement, operators previously missed the field's existence); `generate-judgments-dialog.tsx` template (preserves `gen-template` data-testid for the existing E2E spec). **Primitive shape:** generic over `T`, takes `query: UseQueryResult` directly (consumer calls the listing hook in its own scope — refactored mid-implementation from the original `useEntities: () => useHook()` callback shape after hitting rules-of-hooks for dynamic-param consumers like `useQuerySets({ cluster_id })`). Ships loading / error-with-retry / empty-with-CTA / disabled-subset-with-tooltip slots. Opt-in `getStatus` callback renders Unicode-dot status indicators (`●` wrapped `aria-hidden="true"` so screen readers get clean names) with stable green-first sort. Opt-in `inlineWarning` renders an amber `

` under the trigger matching the existing helper-text styling. The `unreachable → unknown` wire-value mapping is caller-side per `HEALTH_STATUS_VALUES` from `enums.ts`. **Modal-level testing landmine:** shadcn `