Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion docs/00_overview/DASHBOARD.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ _Top-level index across MVP1 → GA v1+ as of **2026-05-23**. Click a release na

| Release | Theme | Progress | Status |
|---|---|---|---|
| [MVP1 / v0.1](MVP1_DASHBOARD.md) | The Loop | 70 / 71 scoped done · 6 remaining | **In progress** |
| [MVP1 / v0.1](MVP1_DASHBOARD.md) | The Loop | 71 / 71 scoped done · 5 remaining | **In progress** |
| [MVP1.5 / v0.1.5](MVP1_5_DASHBOARD.md) | Real Signals | 1 item(s) queued | **Held / queued** |
| [MVP2 / v0.2](MVP2_DASHBOARD.md) | Observable | 1 / 1 scoped done · 1 remaining | **In progress** |
| MVP3 / v0.3 | Production Stacks | — | **Not yet scoped** |
Expand Down
31 changes: 12 additions & 19 deletions docs/00_overview/MVP1_DASHBOARD.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,34 +6,28 @@ _Reflects feature-folder state as of **2026-05-23** (latest mtime of any planned

## Next up

**[chore_dashboard_pr_extraction_from_idea](../02_product/planned_features/chore_dashboard_pr_extraction_from_idea/feature_spec.md)** — Chore, currently in **Plan**
All scoped MVP1 features shipped 🎉

> Extend `_extract_pr_number` to accept the idea body as a fourth argument, and have `_load_implemented` read `idea.md` and pass it through.

Plan approved; run /impl-execute to ship

```bash
/impl-execute docs/02_product/planned_features/chore_dashboard_pr_extraction_from_idea/implementation_plan.md --all
```
Pull from the Idea backlog or capture a new feature spec.

## MVP1 Progress

| Metric | Value |
|---|---|
| Scoped items done | **70 / 71** (99%) — feat_/infra_/chore_/epic_ past idea stage |
| Pending work | **13** items (every not-done feat/infra/chore/bug across all priorities) |
| Scoped items done | **71 / 71** (100%) — feat_/infra_/chore_/epic_ past idea stage |
| Pending work | **12** items (every not-done feat/infra/chore/bug across all priorities) |
| → P0 — do next | **0** unblocking / paying daily cost |
| → P1 | **0** high-value, ready when P0 clears |
| → P2 (default) | 12 important to file, not blocking |
| → P2 (default) | 11 important to file, not blocking |
| → Backlog | 1 captured for record, not planned |
| Open bugs | 0 |
| Legacy "Path to MVP1" | 6 items — scoped-not-done + bugs + chore-ideas only (excludes feat/infra ideas) |
| Legacy "Path to MVP1" | 5 items — scoped-not-done + bugs + chore-ideas only (excludes feat/infra ideas) |
| Backlog ideas | 7 idea-only feat/infra (not yet scoped into MVP1) |
| In flight | 0 feature(s) actively shipping |

## Pipeline

### Done (87)
### Done (88)

| Feature | Type | One-liner | Depends on | Status |
|---|---|---|---|---|
Expand Down Expand Up @@ -80,6 +74,7 @@ Plan approved; run /impl-execute to ship
| [chore_cluster_delete_ui](implemented_features/2026_05_13_chore_cluster_delete_ui/idea.md) | Chore | The `/clusters` list page (Story 2.1) and `/clusters/{id}` detail page render registered clusters fine, but there is no Delete button. When an operator registers a cluster with stale credentials or a | — | Complete |
| [chore_create_study_modal_e2e_stability](implemented_features/2026_05_20_chore_create_study_modal_e2e_stability/idea.md) | Chore | The Playwright smoke lane runs every `ui/tests/e2e/*.spec.ts` against a real-backend stack. The create-study modal's Step-1 cluster trigger (rendered by [`EntitySelect`](../../ui/src/components/common | — | [PR #161](https://github.com/SoundMindsAI/relyloop/pull/161) merged 2026-05-20 |
| [chore_create_study_wizard_polish](implemented_features/2026_05_20_chore_create_study_wizard_polish/feature_spec.md) | Chore | Step 4 auto-fills from the template's `declared_params` with conservative ranges, rejects unknown/missing params at create time with new machine-readable error codes, and surfaces four new glossary en | — | [PR #157](https://github.com/SoundMindsAI/relyloop/pull/157) merged 2026-05-20 |
| [chore_dashboard_pr_extraction_from_idea](implemented_features/2026_05_23_chore_dashboard_pr_extraction_from_idea/feature_spec.md) | Chore | Extend `_extract_pr_number` to accept the idea body as a fourth argument, and have `_load_implemented` read `idea.md` and pass it through. | — | [PR #221](https://github.com/SoundMindsAI/relyloop/pull/221) merged 2026-05-23 |
| [chore_data_table_columnvisibility_tanstack](implemented_features/2026_05_19_chore_data_table_columnvisibility_tanstack/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 | — | Complete |
| [chore_detail_page_shell_primitive](implemented_features/2026_05_19_chore_detail_page_shell_primitive/idea.md) | Chore | Six of the seven `/{entity}/[id]` detail routes hand-roll the same three-state scaffold around their data query. The structure is **identical** down to the className strings, with two minor copy varia | — | Complete |
| [chore_digest_worker_narrow_except](implemented_features/2026_05_14_chore_digest_worker_narrow_except/idea.md) | Chore | … | — | Complete |
Expand Down Expand Up @@ -129,11 +124,9 @@ Plan approved; run /impl-execute to ship

_None._

### Plan (1)
### Plan (0)

| # | Priority | Feature | Type | One-liner | Depends on | Status |
|---|---|---|---|---|---|---|
| 1 | P2 | [chore_dashboard_pr_extraction_from_idea](../02_product/planned_features/chore_dashboard_pr_extraction_from_idea/feature_spec.md) | Chore | Extend `_extract_pr_number` to accept the idea body as a fourth argument, and have `_load_implemented` read `idea.md` and pass it through. | — | [PR #4](https://github.com/SoundMindsAI/relyloop/pull/4) merged 2026-05-15 |
_None._

### Spec (0)

Expand Down Expand Up @@ -167,8 +160,6 @@ graph LR
classDef plan fill:#fef9c3,stroke:#854d0e,color:#854d0e;
classDef spec fill:#dbeafe,stroke:#1e40af,color:#1e40af;
classDef idea fill:#f1f5f9,stroke:#334155,color:#334155;
chore_dashboard_pr_extraction_from_idea["dashboard pr extraction from idea"]
class chore_dashboard_pr_extraction_from_idea plan;
infra_foundation["foundation"]
class infra_foundation done;
feat_study_lifecycle["study lifecycle"]
Expand Down Expand Up @@ -299,6 +290,8 @@ graph LR
class feat_orchestrator_zero_streak_abort done;
feat_study_preflight_overlap_probe["study preflight overlap probe"]
class feat_study_preflight_overlap_probe done;
chore_dashboard_pr_extraction_from_idea["dashboard pr extraction from idea"]
class chore_dashboard_pr_extraction_from_idea done;
chore_migration_test_head_brittleness["migration test head brittleness"]
class chore_migration_test_head_brittleness done;
chore_reconciler_terminal_closed_no_poll["reconciler terminal closed no poll"]
Expand Down
2 changes: 1 addition & 1 deletion docs/00_overview/dashboard.html
Original file line number Diff line number Diff line change
Expand Up @@ -384,7 +384,7 @@ <h2>Releases</h2>
<div class="roadmap-row">
<div class="release-name"><a href="mvp1_dashboard.html">MVP1 / v0.1</a></div>
<div class="theme">The Loop</div>
<div class="progress">70 / 71 scoped done · 6 remaining</div>
<div class="progress">71 / 71 scoped done · 5 remaining</div>
<span class="state-pill in_progress">In progress</span>
</div>

Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
# Feature Specification — `_extract_pr_number` reads `idea.md` for legacy idea-only features

**Date:** 2026-05-23
**Status:** Draft
**Status:** Implemented (PR #221 squash-merged as `8a6452d5` on 2026-05-23)
**Owners:** Eric Starr (engineering)
**Related docs:**
- [`idea.md`](idea.md)
Expand Down Expand Up @@ -190,7 +190,7 @@ N/A — no UI changes.

### AC-1: `**Status:** **Shipped** as PR #N` pattern extracts correctly

- **Given** an idea body whose first non-blank line after the title is `**Status:** **Shipped** as PR [#124](https://github.com/SoundMindsAI/relyloop/pull/124)` (precedent: `feat_contextual_help_mvp2`; the literal `(squash-merged 2026-05-15…)` trailer is omitted from this AC body because it trips the dashboard regen's pre-existing priority-3 fuzzy `PR #N…merged` regex — see tangential observation `chore_dashboard_regen_quoted_pr_false_positive` for the underlying issue. The strict Pattern A regex anchors at the `**Status:**` line, so the trailing prose doesn't affect AC-1's pass/fail.)
- **Given** an idea body whose first non-blank line after the title is `**Status:** **Shipped** as PR [#124](https://github.com/SoundMindsAI/relyloop/pull/124)` (precedent: `feat_contextual_help_mvp2`; the literal squash-merged-date trailer is omitted from this AC body because it trips the dashboard regen's pre-existing priority-3 fuzzy `PR #N…merge`-context regex — see tangential observation `chore_dashboard_regen_quoted_pr_false_positive` for the underlying issue. The strict Pattern A regex anchors at the `**Status:**` line, so the trailing prose doesn't affect AC-1's pass/fail.)
- **When** `_extract_pr_number(pipe="", plan="", spec="", idea=<that body>)` is called
- **Then** it returns `124`.

Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
# Implementation Plan — `_extract_pr_number` reads `idea.md` for legacy idea-only features

**Date:** 2026-05-23
**Status:** Draft
**Status:** Complete (PR #221 squash-merged as `8a6452d5` on 2026-05-23)
**Primary spec:** [`feature_spec.md`](feature_spec.md)
**Policy source(s):** [`CLAUDE.md`](../../../../CLAUDE.md) (Conventional Commits, 80% coverage gate, no main commits).

Expand Down Expand Up @@ -331,7 +331,7 @@ N/A.
class TestMutualExclusion:
def test_pattern_a_and_b_share_no_lines(self) -> None: ...
```
6. Write each test body, using the AC-N "Given/When/Then" from the spec as the test contract. Each test must include the literal idea-body text the spec cites as its precedent example (e.g., AC-1's body is `**Status:** **Shipped** as PR [#124](https://github.com/SoundMindsAI/relyloop/pull/124) (squash-merged 2026-05-15, commit `9d22f62`).` — verified against the actual `feat_contextual_help_mvp2/idea.md`).
6. Write each test body, using the AC-N "Given/When/Then" from the spec as the test contract. Each test must include the literal idea-body text the spec cites as its precedent example (e.g., AC-1's body mirrors `feat_contextual_help_mvp2`'s `**Status:** **Shipped** as PR [#124](url) (squash-merged-date trailer)` shape — verified against the actual `feat_contextual_help_mvp2/idea.md`; the literal date is held in the test fixture, not quoted here, to avoid tripping the dashboard regen's priority-3 fuzzy regex).
7. The AC-12 test uses `pytest.fixture` or `tempfile.mkdtemp` to construct a real on-disk folder with a date-prefixed slug (e.g., `2026_05_20_chore_test_stub`) containing only `idea.md`. The `_load_implemented` call returns a `Feature` whose `pr_number` field is asserted.
8. Update `architecture.md` per the FR-3 requirement. Add a ~6-line subsection at the end of §"Where the code lives" (immediately after the `scripts/` mention at ~L141). Content:
```markdown
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
# Pipeline Status — chore_dashboard_pr_extraction_from_idea

## Idea
- Status: Complete
- File: idea.md
- Preflight: passed 2026-05-23 (4 sections patched — line-drift fix 476→499, dependency PR# refreshed, "⚠️ Audit finding" block added flagging Pattern C false-positive risk, new "Open questions" §1/§2/§3 with locked defaults)

## Spec
- Status: Approved
- Date: 2026-05-23
- File: feature_spec.md
- Cross-model review: GPT-5.5 passed (3 cycles, converged at cycle 3 with 0 H/0 M/1 Low — applied)
- Cycle 1: 7 findings (1 H / 4 M / 2 L) — 6 actionable accepted
- Cycle 2: 4 findings (1 H / 3 M / 0 L) — all 4 accepted (Pattern A boundary, §3 stale snippets, metadata-block algorithm, structural verification)
- Cycle 3: 1 finding (0 H / 0 M / 1 L) — accepted (AC count bookkeeping)
- Phases: 1 (single phase, single PR)

## Plan
- Status: Approved
- Date: 2026-05-23
- File: implementation_plan.md
- Cross-model review: GPT-5.5 passed (1 cycle, 3 findings: 0 High / 1 Medium / 2 Low — all accepted and applied: AC-12 ownership clarified, metadata-block title-once flag added, pytest collection grep fixed)
- Stories: 2 across 1 epic
- Phases covered: 1 (single phase, single PR)

## Implementation
- Status: Complete
- Date: 2026-05-23
- PR: #221 (squash-merged as `8a6452d5` to `main`)
- CI: green (5 jobs on each of 3 pushes — lint + typecheck + unit + integration + contract + Docker build + frontend + smoke)
- Stories completed: 2/2 (1.1 extraction logic, 1.2 call sites + tests + docs)
- Gemini review: 3 Medium findings, all accepted and applied in `5a90d989` (Pattern B + C markdown-link symmetry + `_load_implemented` one-liner fallback)
- Final GPT-5.5 review: 2 findings (0 High / 2 Medium / 0 Low) — 1 deferred (cosmetic anomaly on own planned-row, resolves on merge; captured as `chore_dashboard_regen_quoted_pr_false_positive`), 1 accepted and applied in `d03e3d5f` (metadata-block helper rejects later H1 as title)
- Tangential capture: [`chore_dashboard_regen_quoted_pr_false_positive`](../chore_dashboard_regen_quoted_pr_false_positive/idea.md) — pre-existing priority-3 fuzzy-regex weakness
- Empirical verification: forward gain of 2 strict-pattern legacy chores correctly populate Status column (`chore_create_study_modal_e2e_stability` → PR #161, `chore_precommit_node_path_resolution` → PR #171); plus material UX improvement on many idea-only rows via the `_load_implemented` one-liner fallback. ZERO existing PR-linked rows changed PR number.
63 changes: 32 additions & 31 deletions docs/00_overview/mvp1_dashboard.html
Original file line number Diff line number Diff line change
Expand Up @@ -382,28 +382,28 @@ <h1>RelyLoop MVP1 Dashboard</h1>
<main>

<section>
<div class="next-up">
<div class="eyebrow">Next up — Chore, currently in <strong>Plan</strong></div>
<div class="title"><a href="../../docs/02_product/planned_features/chore_dashboard_pr_extraction_from_idea/feature_spec.md">Dashboard Pr Extraction From Idea</a></div>
<div class="one-liner">Extend `_extract_pr_number` to accept the idea body as a fourth argument, and have `_load_implemented` read `idea.md` and pass it through.</div>
<div class="stage-hint">Plan approved; run /impl-execute to ship</div>
<code class="cmd">/impl-execute docs/02_product/planned_features/chore_dashboard_pr_extraction_from_idea/implementation_plan.md --all</code>
<div class="next-up done">
<div class="eyebrow">Next up</div>
<div class="title">All scoped MVP1 features shipped 🎉</div>
<div class="one-liner">
Pull from the Idea backlog or capture a new feature spec.
</div>
</div>
</section>


<section>
<h2>MVP1 Progress</h2>
<div class="kpi-row">
<div class="kpi ">
<div class="kpi complete">
<div class="label">Scoped items done</div>
<div class="value">70 / 71</div>
<div class="sub">99% of feat_/infra_/chore_/epic_ items past idea stage</div>
<div class="bar"><span style="width:99%"></span></div>
<div class="value">71 / 71</div>
<div class="sub">100% of feat_/infra_/chore_/epic_ items past idea stage</div>
<div class="bar"><span style="width:100%"></span></div>
</div>
<div class="kpi warn">
<div class="label">Pending work</div>
<div class="value">13</div>
<div class="value">12</div>
<div class="sub">every not-done feat/infra/chore/bug across all priorities</div>
</div>
<div class="kpi ">
Expand All @@ -425,7 +425,7 @@ <h2>MVP1 Progress</h2>
</div>
<div class="kpi">
<div class="label">P2 (default)</div>
<div class="value">12</div>
<div class="value">11</div>
<div class="sub">important to file, not blocking</div>
</div>
<div class="kpi">
Expand All @@ -435,7 +435,7 @@ <h2>MVP1 Progress</h2>
</div>
<div class="kpi">
<div class="label">Legacy "Path to MVP1"</div>
<div class="value">6</div>
<div class="value">5</div>
<div class="sub">scoped not-done + bugs + chore-ideas only (excludes feat/infra ideas)</div>
</div>
</div>
Expand Down Expand Up @@ -628,19 +628,7 @@ <h3>Spec <span class="count">0</span></h3>
</div>

<div class="col plan">
<h3>Plan <span class="count">1</span></h3>

<div class="card chore" data-prefix="chore" data-priority="P2">
<div class="name"><a href="../../docs/02_product/planned_features/chore_dashboard_pr_extraction_from_idea/feature_spec.md">Dashboard Pr Extraction From Idea</a></div>
<div class="meta">
<span class="badge chore">Chore</span>
<span class="badge priority" data-priority="P2">P2</span>
<a class="pr" href="https://github.com/SoundMindsAI/relyloop/pull/4">PR #4</a> <span>merged 2026-05-15</span>
</div>
<div class="one-liner">Extend `_extract_pr_number` to accept the idea body as a fourth argument, and have `_load_implemented` read `idea.md` and pass it through.</div>


</div>
<h3>Plan <span class="count">0</span></h3>

</div>

Expand All @@ -650,7 +638,7 @@ <h3>Implementing <span class="count">0</span></h3>
</div>

<div class="col done">
<h3>Done <span class="count">87</span></h3>
<h3>Done <span class="count">88</span></h3>

<div class="card feat" data-prefix="feat" data-priority="P2">
<div class="name"><a href="../../docs/00_overview/implemented_features/2026_05_21_feat_agent_propose_search_space/feature_spec.md">Agent Propose Search Space</a></div>
Expand Down Expand Up @@ -1211,6 +1199,19 @@ <h3>Done <span class="count">87</span></h3>
</div>


<div class="card chore" data-prefix="chore" data-priority="P2">
<div class="name"><a href="../../docs/00_overview/implemented_features/2026_05_23_chore_dashboard_pr_extraction_from_idea/feature_spec.md">Dashboard Pr Extraction From Idea</a></div>
<div class="meta">
<span class="badge chore">Chore</span>

<a class="pr" href="https://github.com/SoundMindsAI/relyloop/pull/221">PR #221</a> <span>merged 2026-05-23</span>
</div>
<div class="one-liner">Extend `_extract_pr_number` to accept the idea body as a fourth argument, and have `_load_implemented` read `idea.md` and pass it through.</div>


</div>


<div class="card chore" data-prefix="chore" data-priority="P2">
<div class="name"><a href="../../docs/00_overview/implemented_features/2026_05_19_chore_data_table_columnvisibility_tanstack">Data Table Columnvisibility Tanstack</a></div>
<div class="meta">
Expand Down Expand Up @@ -1795,8 +1796,6 @@ <h2>Dependency graph (feat_ + infra_)</h2>
classDef plan fill:#fef9c3,stroke:#854d0e,color:#854d0e;
classDef spec fill:#dbeafe,stroke:#1e40af,color:#1e40af;
classDef idea fill:#f1f5f9,stroke:#334155,color:#334155;
chore_dashboard_pr_extraction_from_idea[&quot;dashboard pr extraction from idea&quot;]
class chore_dashboard_pr_extraction_from_idea plan;
infra_foundation[&quot;foundation&quot;]
class infra_foundation done;
feat_study_lifecycle[&quot;study lifecycle&quot;]
Expand Down Expand Up @@ -1927,6 +1926,8 @@ <h2>Dependency graph (feat_ + infra_)</h2>
class feat_orchestrator_zero_streak_abort done;
feat_study_preflight_overlap_probe[&quot;study preflight overlap probe&quot;]
class feat_study_preflight_overlap_probe done;
chore_dashboard_pr_extraction_from_idea[&quot;dashboard pr extraction from idea&quot;]
class chore_dashboard_pr_extraction_from_idea done;
chore_migration_test_head_brittleness[&quot;migration test head brittleness&quot;]
class chore_migration_test_head_brittleness done;
chore_reconciler_terminal_closed_no_poll[&quot;reconciler terminal closed no poll&quot;]
Expand Down Expand Up @@ -1990,8 +1991,6 @@ <h2>Dependency graph (feat_ + infra_)</h2>
classDef plan fill:#fef9c3,stroke:#854d0e,color:#854d0e;
classDef spec fill:#dbeafe,stroke:#1e40af,color:#1e40af;
classDef idea fill:#f1f5f9,stroke:#334155,color:#334155;
chore_dashboard_pr_extraction_from_idea[&quot;dashboard pr extraction from idea&quot;]
class chore_dashboard_pr_extraction_from_idea plan;
infra_foundation[&quot;foundation&quot;]
class infra_foundation done;
feat_study_lifecycle[&quot;study lifecycle&quot;]
Expand Down Expand Up @@ -2122,6 +2121,8 @@ <h2>Dependency graph (feat_ + infra_)</h2>
class feat_orchestrator_zero_streak_abort done;
feat_study_preflight_overlap_probe[&quot;study preflight overlap probe&quot;]
class feat_study_preflight_overlap_probe done;
chore_dashboard_pr_extraction_from_idea[&quot;dashboard pr extraction from idea&quot;]
class chore_dashboard_pr_extraction_from_idea done;
chore_migration_test_head_brittleness[&quot;migration test head brittleness&quot;]
class chore_migration_test_head_brittleness done;
chore_reconciler_terminal_closed_no_poll[&quot;reconciler terminal closed no poll&quot;]
Expand Down
Loading