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 @@ -7,7 +7,7 @@ _Top-level index across MVP1 → GA v1+ as of **2026-06-09**. Click a release na
| Release | Theme | Progress | Status |
|---|---|---|---|
| [MVP1 / v0.1](MVP1_DASHBOARD.md) | The Loop | 100 / 100 scoped done | **Complete** |
| [MVP2 / v0.2](MVP2_DASHBOARD.md) | Three-Engine + Real Signals | 25 / 28 scoped done · 17 remaining | **In progress** |
| [MVP2 / v0.2](MVP2_DASHBOARD.md) | Three-Engine + Real Signals | 26 / 28 scoped done · 16 remaining | **In progress** |
| MVP3 / v0.3 | Observable | — | **Not yet scoped** |
| [GA v1 / v1.0](GA_DASHBOARD.md) | Production-ready | 1 item(s) queued | **Held / queued** |

Expand Down
20 changes: 10 additions & 10 deletions docs/00_overview/MVP2_DASHBOARD.md
Original file line number Diff line number Diff line change
Expand Up @@ -21,20 +21,20 @@ Plan approved; run /impl-execute to ship
| Metric | Value |
|---|---|
| Filed under MVP2 | **47** folders total (done + specced not-done + idea backlog + bugs) |
| Specced features done | **25 / 28** (89%) — of features *past the idea stage* (those with a spec); the idea backlog below is NOT in this denominator, so 100% ≠ release complete |
| Pending work | **20** items (every not-done feat/infra/chore/bug across all priorities) |
| Specced features done | **26 / 28** (93%) — of features *past the idea stage* (those with a spec); the idea backlog below is NOT in this denominator, so 100% ≠ release complete |
| Pending work | **19** 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) | 13 important to file, not blocking |
| → P2 (default) | 12 important to file, not blocking |
| → Backlog | 7 captured for record, not planned |
| Open bugs | 7 |
| Legacy "Path to MVP2" | 17 items — scoped-not-done + bugs + chore-ideas only (excludes feat/infra ideas) |
| Legacy "Path to MVP2" | 16 items — scoped-not-done + bugs + chore-ideas only (excludes feat/infra ideas) |
| Backlog ideas | 3 idea-only feat/infra (not yet scoped into MVP2) |
| In flight | 1 feature(s) actively shipping |

## Pipeline

### Done (27)
### Done (28)

| Feature | Type | One-liner | Depends on | Status |
|---|---|---|---|---|
Expand All @@ -47,6 +47,7 @@ Plan approved; run /impl-execute to ship
| [feat_overnight_studies_summary_card](implemented_features/2026_06_04_feat_overnight_studies_summary_card/feature_spec.md) | Feature | A "ran while you were away" card surfaces at the top of `/studies` when at least one overnight chain has completed since the operator's last visit. | — | [PR #444](https://github.com/SoundMindsAI/relyloop/pull/444) merged 2026-06-04 |
| [feat_proposal_full_param_space_view](implemented_features/2026_06_04_feat_proposal_full_param_space_view/feature_spec.md) | Feature | A new `<FullParamSpacePanel>` renders below `<ConfigDiffPanel>` on `/proposals/[id]`. | — | [PR #446](https://github.com/SoundMindsAI/relyloop/pull/446) merged 2026-06-04 |
| [feat_query_normalization_tuning](implemented_features/2026_06_05_feat_query_normalization_tuning/feature_spec.md) | Feature | A template that opts in by declaring `query_normalizer` as a Categorical param gets the Optuna loop deciding empirically — on the operator's judgment set — whether lowercasing, trimming, or contractio | — | [PR #459](https://github.com/SoundMindsAI/relyloop/pull/459) merged 2026-06-05 |
| [feat_query_normalizer_typed_pipeline](implemented_features/2026_06_09_feat_query_normalizer_typed_pipeline/feature_spec.md) | Feature | A new typed search-space member `NormalizerPipelineParam` lets a template declare an **ordered list of normalization steps**; the Optuna loop samples over the powerset of declared steps and proposes t | — | [PR #509](https://github.com/SoundMindsAI/relyloop/pull/509) merged 2026-06-09 |
| [feat_studies_convergence_visibility](implemented_features/2026_06_02_feat_studies_convergence_visibility/feature_spec.md) | Feature | The studies list shows a completed-trial count and a convergence badge (`Converged` / `Still improving` / `Too few trials`) per study, reusing the shipped classifier. | — | [PR #421](https://github.com/SoundMindsAI/relyloop/pull/421) merged 2026-06-02 |
| [feat_study_convergence_indicator](implemented_features/2026_06_01_feat_study_convergence_indicator/feature_spec.md) | Feature | Every completed study carries a plain-language **convergence verdict** — `converged` / `still_improving` / `too_few_trials` — backed by a best-metric-so-far curve. | — | [PR #352](https://github.com/SoundMindsAI/relyloop/pull/352) merged 2026-06-01 |
| [feat_study_sub_warmup_guard](implemented_features/2026_05_29_feat_study_sub_warmup_guard/feature_spec.md) | Feature | A non-blocking inline warning appears under the `max_trials` input whenever the derived preset is `custom` AND `max_trials < STUDIES_TPE_WARMUP_FLOOR (= 50)`, naming Focused/Standard as one-click reme | — | [PR #316](https://github.com/SoundMindsAI/relyloop/pull/316) merged 2026-05-29 |
Expand All @@ -72,13 +73,12 @@ Plan approved; run /impl-execute to ship
|---|---|---|---|---|---|---|
| 1 | P2 | [bug_cluster_url_ssrf_hostname_bypass](planned_features/02_mvp2/bug_cluster_url_ssrf_hostname_bypass/feature_spec.md) | Bug | When private clusters are disallowed (`RELYLOOP_ALLOW_PRIVATE_CLUSTERS=False`), a `base_url` whose host **resolves** to a private / loopback / link-local / reserved / multicast / unspecified / carrier | — | [PR #510](https://github.com/SoundMindsAI/relyloop/pull/510) |

### Plan (3)
### Plan (2)

| # | Priority | Feature | Type | One-liner | Depends on | Status |
|---|---|---|---|---|---|---|
| 1 | P2 | [feat_apply_path_normalizer_declaration](planned_features/02_mvp2/feat_apply_path_normalizer_declaration/feature_spec.md) | Feature | The winning normalizer ships as a **structured, language-agnostic manifest** in the config-repo PR — not just prose. | — | — |
| 2 | P2 | [feat_query_normalizer_typed_pipeline](planned_features/02_mvp2/feat_query_normalizer_typed_pipeline/feature_spec.md) | Feature | A new typed search-space member `NormalizerPipelineParam` lets a template declare an **ordered list of normalization steps**; the Optuna loop samples over the powerset of declared steps and proposes t | — | — |
| 3 | P2 | [chore_demo_seeding_integration_tests_rewrite](planned_features/02_mvp2/chore_demo_seeding_integration_tests_rewrite/feature_spec.md) | Chore | The 9 skipped cases are rewritten to the async "POST + poll-until-terminal" shape, the timeout case is re-homed to the worker layer, a new `AC-Async` case asserts the `running → complete` polling tran | — | [PR #286](https://github.com/SoundMindsAI/relyloop/pull/286) |
| 2 | P2 | [chore_demo_seeding_integration_tests_rewrite](planned_features/02_mvp2/chore_demo_seeding_integration_tests_rewrite/feature_spec.md) | Chore | The 9 skipped cases are rewritten to the async "POST + poll-until-terminal" shape, the timeout case is re-homed to the worker layer, a new `AC-Async` case asserts the `running → complete` polling tran | — | [PR #286](https://github.com/SoundMindsAI/relyloop/pull/286) |

### Spec (0)

Expand Down Expand Up @@ -120,8 +120,6 @@ graph LR
class chore_demo_seeding_integration_tests_rewrite plan;
feat_apply_path_normalizer_declaration["apply path normalizer declaration"]
class feat_apply_path_normalizer_declaration plan;
feat_query_normalizer_typed_pipeline["query normalizer typed pipeline"]
class feat_query_normalizer_typed_pipeline plan;
feat_contextual_help_mvp2["contextual help mvp2"]
class feat_contextual_help_mvp2 done;
feat_study_sub_warmup_guard["study sub warmup guard"]
Expand Down Expand Up @@ -172,6 +170,8 @@ graph LR
class feat_query_normalization_tuning done;
feat_ubi_llm_study_comparison["ubi llm study comparison"]
class feat_ubi_llm_study_comparison done;
feat_query_normalizer_typed_pipeline["query normalizer typed pipeline"]
class feat_query_normalizer_typed_pipeline done;
feat_ubi_judgments --> infra_adapter_solr
```

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 @@ -392,7 +392,7 @@ <h2>Releases</h2>
<div class="roadmap-row">
<div class="release-name"><a href="mvp2_dashboard.html">MVP2 / v0.2</a></div>
<div class="theme">Three-Engine + Real Signals</div>
<div class="progress">25 / 28 scoped done · 17 remaining</div>
<div class="progress">26 / 28 scoped done · 16 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 @@
# Implementation Plan — Typed normalizer pipeline (ordered step list) + JS snippet + smart-quote contractions

**Date:** 2026-06-01 (gates cleared 2026-06-09)
**Status:** Ready for Execution — Phase 1 (`feat_query_normalization_tuning`) merged (PR #459, symbols verified present 2026-06-09); Q-1 locked (include `expand_contractions_custom` inert, 6 steps) + Q-2 locked (frontend vitest fixture). Story 0 precondition gate confirmed passing.
**Date:** 2026-06-01 (gates cleared + shipped 2026-06-09)
**Status:** Complete (PR #509, squash-merged `7a24849`, merged 2026-06-09). Q-1 locked (include `expand_contractions_custom` inert, 6 steps) + Q-2 locked (frontend vitest fixture); all 8 stories shipped.
**Primary spec:** [`feature_spec.md`](feature_spec.md)
**Phase 1 foundation:** [`../feat_query_normalization_tuning/feature_spec.md`](../feat_query_normalization_tuning/feature_spec.md) (UNMERGED — plan stage), [`../feat_query_normalization_tuning/implementation_plan.md`](../feat_query_normalization_tuning/implementation_plan.md)
**Policy source(s):** CLAUDE.md (Absolute Rules #3, #4, #8 — adapter-confined, no hardcoded models, source-of-truth enum discipline), `docs/01_architecture/optimization.md`, `docs/01_architecture/adapters.md`
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
# Pipeline Status — Typed normalizer pipeline (Phase 2 of query-normalization-tuning)

> **DESIGN-AHEAD.** Implementation is GATED on Phase 1 (`feat_query_normalization_tuning`) merging to `main`. Phase 1 is currently UNMERGED (plan stage). Do NOT run `/impl-execute` until Phase 1 ships — see `feature_spec.md` §5 and the design-ahead banner.
**Release:** mvp2

> **SHIPPED 2026-06-09 (PR #509).** The design-ahead gate cleared: Phase 1 (`feat_query_normalization_tuning`) merged, and Q-1 (include `expand_contractions_custom` inert — 6 steps) + Q-2 (JS parity via frontend vitest fixture) were locked.

## Idea
- Status: Complete
Expand All @@ -27,4 +29,9 @@
- Execution gate: Story 0 asserts Phase 1 symbols exist and aborts otherwise. Open Questions Q-1 + Q-2 must be locked before `/impl-execute`.

## Implementation
- Status: Not started — BLOCKED on Phase 1 (`feat_query_normalization_tuning`) merge + Q-1/Q-2 lock.
- Status: **Complete** (PR #509, squash-merged `7a24849`, 2026-06-09)
- CI: all 19 `pr.yml` checks green (smoke skipped — opt-in/off); coverage 81.64% ≥ 80%
- Stories: 8/8 complete across 5 epics (Story 0 gate confirmed passing; Epic 1 domain ×4; Epic 2 PR body ×1; Epic 3 frontend ×2; Epic 4 docs ×1)
- Migration: none (Alembic head stays 0023)
- Cross-model review: Opus self-review (GPT-5.5 unreachable in the Claude Code remote sandbox); Gemini Code Assist — 2 Medium findings, both accepted (`7047190`: strip_punctuation snippets use the runtime's regex)
- Q-1 locked: include `expand_contractions_custom` inert (6 steps). Q-2 locked: JS parity via frontend vitest fixture.
50 changes: 25 additions & 25 deletions docs/00_overview/mvp2_dashboard.html
Original file line number Diff line number Diff line change
Expand Up @@ -397,13 +397,13 @@ <h2>MVP2 Progress</h2>
<div class="kpi-row">
<div class="kpi ">
<div class="label">Specced features done</div>
<div class="value">25 / 28</div>
<div class="sub">89% specced · 47 filed under MVP2</div>
<div class="bar"><span style="width:89%"></span></div>
<div class="value">26 / 28</div>
<div class="sub">93% specced · 47 filed under MVP2</div>
<div class="bar"><span style="width:93%"></span></div>
</div>
<div class="kpi warn">
<div class="label">Pending work</div>
<div class="value">20</div>
<div class="value">19</div>
<div class="sub">every not-done feat/infra/chore/bug across all priorities</div>
</div>
<div class="kpi bug">
Expand All @@ -425,7 +425,7 @@ <h2>MVP2 Progress</h2>
</div>
<div class="kpi">
<div class="label">P2 (default)</div>
<div class="value">13</div>
<div class="value">12</div>
<div class="sub">important to file, not blocking</div>
</div>
<div class="kpi">
Expand All @@ -435,7 +435,7 @@ <h2>MVP2 Progress</h2>
</div>
<div class="kpi">
<div class="label">Legacy "Path to MVP2"</div>
<div class="value">17</div>
<div class="value">16</div>
<div class="sub">scoped not-done + bugs + chore-ideas only (excludes feat/infra ideas)</div>
</div>
</div>
Expand Down Expand Up @@ -680,7 +680,7 @@ <h3>Spec <span class="count">0</span></h3>
</div>

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

<div class="card feat" data-prefix="feat" data-priority="P2">
<div class="name"><a href="../../docs/00_overview/planned_features/02_mvp2/feat_apply_path_normalizer_declaration/feature_spec.md">Apply Path Normalizer Declaration</a></div>
Expand All @@ -695,19 +695,6 @@ <h3>Plan <span class="count">3</span></h3>
</div>


<div class="card feat" data-prefix="feat" data-priority="P2">
<div class="name"><a href="../../docs/00_overview/planned_features/02_mvp2/feat_query_normalizer_typed_pipeline/feature_spec.md">Query Normalizer Typed Pipeline</a></div>
<div class="meta">
<span class="badge feat">Feature</span>
<span class="badge priority" data-priority="P2">P2</span>

</div>
<div class="one-liner">A new typed search-space member `NormalizerPipelineParam` lets a template declare an **ordered list of normalization steps**; the Optuna loop samples over the powerset of declared steps and proposes t</div>


</div>


<div class="card chore" data-prefix="chore" data-priority="P2">
<div class="name"><a href="../../docs/00_overview/planned_features/02_mvp2/chore_demo_seeding_integration_tests_rewrite/feature_spec.md">Demo Seeding Integration Tests Rewrite</a></div>
<div class="meta">
Expand Down Expand Up @@ -740,7 +727,7 @@ <h3>Implementing <span class="count">1</span></h3>
</div>

<div class="col done">
<h3>Done <span class="count">27</span></h3>
<h3>Done <span class="count">28</span></h3>

<div class="card feat" data-prefix="feat" data-priority="P2">
<div class="name"><a href="../../docs/00_overview/implemented_features/2026_05_15_feat_contextual_help_mvp2">Contextual Help</a></div>
Expand Down Expand Up @@ -859,6 +846,19 @@ <h3>Done <span class="count">27</span></h3>
</div>


<div class="card feat" data-prefix="feat" data-priority="P2">
<div class="name"><a href="../../docs/00_overview/implemented_features/2026_06_09_feat_query_normalizer_typed_pipeline/feature_spec.md">Query Normalizer Typed Pipeline</a></div>
<div class="meta">
<span class="badge feat">Feature</span>

<a class="pr" href="https://github.com/SoundMindsAI/relyloop/pull/509">PR #509</a> <span>merged 2026-06-09</span>
</div>
<div class="one-liner">A new typed search-space member `NormalizerPipelineParam` lets a template declare an **ordered list of normalization steps**; the Optuna loop samples over the powerset of declared steps and proposes t</div>


</div>


<div class="card feat" data-prefix="feat" data-priority="P2">
<div class="name"><a href="../../docs/00_overview/implemented_features/2026_06_02_feat_studies_convergence_visibility/feature_spec.md">Studies Convergence Visibility</a></div>
<div class="meta">
Expand Down Expand Up @@ -1109,8 +1109,6 @@ <h2>Dependency graph (feat_ + infra_)</h2>
class chore_demo_seeding_integration_tests_rewrite plan;
feat_apply_path_normalizer_declaration[&quot;apply path normalizer declaration&quot;]
class feat_apply_path_normalizer_declaration plan;
feat_query_normalizer_typed_pipeline[&quot;query normalizer typed pipeline&quot;]
class feat_query_normalizer_typed_pipeline plan;
feat_contextual_help_mvp2[&quot;contextual help mvp2&quot;]
class feat_contextual_help_mvp2 done;
feat_study_sub_warmup_guard[&quot;study sub warmup guard&quot;]
Expand Down Expand Up @@ -1161,6 +1159,8 @@ <h2>Dependency graph (feat_ + infra_)</h2>
class feat_query_normalization_tuning done;
feat_ubi_llm_study_comparison[&quot;ubi llm study comparison&quot;]
class feat_ubi_llm_study_comparison done;
feat_query_normalizer_typed_pipeline[&quot;query normalizer typed pipeline&quot;]
class feat_query_normalizer_typed_pipeline done;
feat_ubi_judgments --&gt; infra_adapter_solr</div>
<noscript><pre>graph LR
classDef done fill:#dcfce7,stroke:#14532d,color:#14532d;
Expand All @@ -1172,8 +1172,6 @@ <h2>Dependency graph (feat_ + infra_)</h2>
class chore_demo_seeding_integration_tests_rewrite plan;
feat_apply_path_normalizer_declaration[&quot;apply path normalizer declaration&quot;]
class feat_apply_path_normalizer_declaration plan;
feat_query_normalizer_typed_pipeline[&quot;query normalizer typed pipeline&quot;]
class feat_query_normalizer_typed_pipeline plan;
feat_contextual_help_mvp2[&quot;contextual help mvp2&quot;]
class feat_contextual_help_mvp2 done;
feat_study_sub_warmup_guard[&quot;study sub warmup guard&quot;]
Expand Down Expand Up @@ -1224,6 +1222,8 @@ <h2>Dependency graph (feat_ + infra_)</h2>
class feat_query_normalization_tuning done;
feat_ubi_llm_study_comparison[&quot;ubi llm study comparison&quot;]
class feat_ubi_llm_study_comparison done;
feat_query_normalizer_typed_pipeline[&quot;query normalizer typed pipeline&quot;]
class feat_query_normalizer_typed_pipeline done;
feat_ubi_judgments --&gt; infra_adapter_solr</pre></noscript>
</div>
</section>
Expand Down
Loading