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
4 changes: 2 additions & 2 deletions docs/00_overview/DASHBOARD.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,8 +6,8 @@ _Top-level index across MVP1 → GA v1+ as of **2026-06-04**. Click a release na

| Release | Theme | Progress | Status |
|---|---|---|---|
| [MVP1 / v0.1](MVP1_DASHBOARD.md) | The Loop | 94 / 94 scoped done | **Complete** |
| [MVP2 / v0.2](MVP2_DASHBOARD.md) | Three-Engine + Real Signals | 18 / 28 scoped done · 26 remaining | **In progress** |
| [MVP1 / v0.1](MVP1_DASHBOARD.md) | The Loop | 95 / 95 scoped done | **Complete** |
| [MVP2 / v0.2](MVP2_DASHBOARD.md) | Three-Engine + Real Signals | 18 / 27 scoped done · 25 remaining | **In progress** |
| MVP3 / v0.3 | Observable | — | **Not yet scoped** |
| GA v1 / v1.0 | Production-ready | — | **Not yet scoped** |

Expand Down
9 changes: 6 additions & 3 deletions docs/00_overview/MVP1_DASHBOARD.md
Original file line number Diff line number Diff line change
Expand Up @@ -14,8 +14,8 @@ Pull from the Idea backlog or capture a new feature spec.

| Metric | Value |
|---|---|
| Filed under MVP1 | **130** folders total (done + specced not-done + idea backlog + bugs) |
| Specced features done | **94 / 94** (100%) — of features *past the idea stage* (those with a spec); the idea backlog below is NOT in this denominator, so 100% ≠ release complete |
| Filed under MVP1 | **131** folders total (done + specced not-done + idea backlog + bugs) |
| Specced features done | **95 / 95** (100%) — 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 | **0** 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 |
Expand All @@ -28,7 +28,7 @@ Pull from the Idea backlog or capture a new feature spec.

## Pipeline

### Done (130)
### Done (131)

| Feature | Type | One-liner | Depends on | Status |
|---|---|---|---|---|
Expand Down Expand Up @@ -62,6 +62,7 @@ Pull from the Idea backlog or capture a new feature spec.
| [feat_study_lifecycle](implemented_features/2026_05_10_feat_study_lifecycle/feature_spec.md) | Feature | A relevance engineer creates a study via API or chat, the orchestrator enqueues N parallel `run_trial` jobs, trials accumulate in real time on the study detail page, the orchestrator detects stop-cond | — | [PR #18](https://github.com/SoundMindsAI/relyloop/pull/18) merged 2026-05-10 |
| [feat_study_preflight_overlap_probe](implemented_features/2026_05_22_feat_study_preflight_overlap_probe/feature_spec.md) | Feature | `POST /api/v1/studies` issues a single bounded `ids`-existence query against the study's target asking "for the *first* query in the query set that has any judgments (chosen deterministically by `id A | — | [PR #193](https://github.com/SoundMindsAI/relyloop/pull/193) merged 2026-05-21 |
| [feat_study_target_judgment_mismatch_guard](implemented_features/2026_05_21_feat_study_target_judgment_mismatch_guard/feature_spec.md) | Feature | `POST /api/v1/studies` rejects the mismatch at create time with a specific machine-readable error code (`JUDGMENT_TARGET_MISMATCH`, 422). | — | [PR #184](https://github.com/SoundMindsAI/relyloop/pull/184) merged 2026-05-21 |
| [feat_walkthrough_video_cursor_captions](implemented_features/2026_06_04_feat_walkthrough_video_cursor_captions/feature_spec.md) | Feature | All 10 walkthrough videos are re-recorded with (1) a visible **synthetic arrow cursor** that glides to each target and pulses on click, (2) **smoother, human-paced** motion, and (3) **WebVTT step capt | — | [PR #451](https://github.com/SoundMindsAI/relyloop/pull/451) merged 2026-06-04 |

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

medium

The one-liner for feat_walkthrough_video_cursor_captions is truncated at 199 characters, which cuts off the word captions and leaves the markdown bold formatting (**) unclosed (**WebVTT step capt). This breaks the rendering of the table cell in the generated dashboard.

To fix this permanently, please shorten the one-liner in the source feature spec file (docs/00_overview/implemented_features/2026_06_04_feat_walkthrough_video_cursor_captions/feature_spec.md) so that it fits within the generator's character limit (e.g., under 190 characters) and doesn't get truncated.

Suggested change
| [feat_walkthrough_video_cursor_captions](implemented_features/2026_06_04_feat_walkthrough_video_cursor_captions/feature_spec.md) | Feature | All 10 walkthrough videos are re-recorded with (1) a visible **synthetic arrow cursor** that glides to each target and pulses on click, (2) **smoother, human-paced** motion, and (3) **WebVTT step capt || [PR #451](https://github.com/SoundMindsAI/relyloop/pull/451) merged 2026-06-04 |
| [feat_walkthrough_video_cursor_captions](implemented_features/2026_06_04_feat_walkthrough_video_cursor_captions/feature_spec.md) | Feature | All 10 walkthrough videos re-recorded with a visible synthetic arrow cursor, smoother human-paced motion, and WebVTT step captions. || [PR #451](https://github.com/SoundMindsAI/relyloop/pull/451) merged 2026-06-04 |

| [infra_adapter_elastic](implemented_features/2026_05_10_infra_adapter_elastic/feature_spec.md) | Infra | A single `ElasticAdapter` implements the `SearchAdapter` Protocol and serves both Elasticsearch (8.11+ / 9.x) and OpenSearch (2.x / 3.x), distinguished by a `engine_type` column. | — | [PR #16](https://github.com/SoundMindsAI/relyloop/pull/16) merged 2026-05-10 |
| [infra_ci_smoke_makeup](implemented_features/2026_05_13_infra_ci_smoke_makeup/idea.md) | Infra | CI runs `make test-unit && make test-integration && make test-contract` against a service-container Postgres on `localhost:5432` — a synthetic environment that masks every real-world `make up` failure | — | Complete |
| [infra_dashboard_regen_pre_commit_conflict](implemented_features/2026_05_14_infra_dashboard_regen_pre_commit_conflict/idea.md) | Infra | The pre-commit pipeline does: | — | Complete |
Expand Down Expand Up @@ -378,6 +379,8 @@ graph LR
class chore_e2e_api_base_url_construction done;
chore_state_md_size_compression["state md size compression"]
class chore_state_md_size_compression done;
feat_walkthrough_video_cursor_captions["walkthrough video cursor captions"]
class feat_walkthrough_video_cursor_captions done;
feat_study_lifecycle --> feat_digest_proposal
feat_llm_judgments --> feat_digest_proposal
infra_foundation --> feat_llm_judgments
Expand Down
29 changes: 13 additions & 16 deletions docs/00_overview/MVP2_DASHBOARD.md
Original file line number Diff line number Diff line change
Expand Up @@ -20,15 +20,15 @@ Plan approved; run /impl-execute to ship

| Metric | Value |
|---|---|
| Filed under MVP2 | **50** folders total (done + specced not-done + idea backlog + bugs) |
| Specced features done | **18 / 28** (64%) — 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 | **30** items (every not-done feat/infra/chore/bug across all priorities) |
| Filed under MVP2 | **49** folders total (done + specced not-done + idea backlog + bugs) |
| Specced features done | **18 / 27** (67%) — 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 | **29** 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) | 26 important to file, not blocking |
| → P2 (default) | 25 important to file, not blocking |
| → Backlog | 4 captured for record, not planned |
| Open bugs | 9 |
| Legacy "Path to MVP2" | 26 items — scoped-not-done + bugs + chore-ideas only (excludes feat/infra ideas) |
| Legacy "Path to MVP2" | 25 items — scoped-not-done + bugs + chore-ideas only (excludes feat/infra ideas) |
| Backlog ideas | 4 idea-only feat/infra (not yet scoped into MVP2) |
| In flight | 0 feature(s) actively shipping |

Expand Down Expand Up @@ -63,22 +63,21 @@ Plan approved; run /impl-execute to ship

_None._

### Plan (12)
### Plan (11)

| # | 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_normalization_tuning](planned_features/02_mvp2/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 | — | — |
| 3 | 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 | — | — |
| 4 | P2 | [feat_ubi_llm_study_comparison](planned_features/02_mvp2/feat_ubi_llm_study_comparison/feature_spec.md) | Feature | A single dedicated route `/studies/compare?a={id}&b={id}` renders the two studies side-by-side with a per-panel diff column: a sentence-level digest-narrative diff, a best-trial parameter table with s | — | [PR #320](https://github.com/SoundMindsAI/relyloop/pull/320) |
| 5 | P2 | [feat_walkthrough_video_cursor_captions](planned_features/02_mvp2/feat_walkthrough_video_cursor_captions/feature_spec.md) | Feature | All 10 walkthrough videos are re-recorded with (1) a visible **synthetic arrow cursor** that glides to each target and pulses on click, (2) **smoother, human-paced** motion, and (3) **WebVTT step capt | — | [PR #448](https://github.com/SoundMindsAI/relyloop/pull/448) |
| 6 | P2 | [chore_arq_pool_aclose_deprecation](planned_features/02_mvp2/chore_arq_pool_aclose_deprecation/feature_spec.md) | Chore | Both call sites use `await arq_pool.aclose()`; no `DeprecationWarning` on shutdown; a regression guard asserts the async-correct form on both paths so a future edit cannot silently reintroduce `close( | — | — |
| 7 | P2 | [chore_cluster_detail_rung_badge](planned_features/02_mvp2/chore_cluster_detail_rung_badge/feature_spec.md) | Chore | The cluster-detail page surfaces a `<UbiRungBadge>` for the cluster, scoped by a user-selected (or auto-seeded) query set + target. | — | [PR #320](https://github.com/SoundMindsAI/relyloop/pull/320) |
| 8 | 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) |
| 9 | P2 | [chore_studies_post_arq_spy_fixture](planned_features/02_mvp2/chore_studies_post_arq_spy_fixture/feature_spec.md) | Chore | A reusable `arq_pool_spy` integration fixture that records every `enqueue_job(name, *args)` call, letting studies-POST tests positively assert `spy.calls == []` on rejection and `spy.calls == [("start | — | — |
| 10 | P2 | [chore_ubi_reader_search_after_pagination](planned_features/02_mvp2/chore_ubi_reader_search_after_pagination/feature_spec.md) | Chore | A new engine-neutral `SearchAdapter.scan_all` cursor-scan lets `UbiReader` iterate the **entire** matching event/query stream for a window (subject to a caller ceiling), folding each page into the agg | — | [PR #413](https://github.com/SoundMindsAI/relyloop/pull/413) |
| 11 | P2 | [bug_baseline_phase_test_isolation](planned_features/02_mvp2/bug_baseline_phase_test_isolation/feature_spec.md) | Bug | The three `TestComputeBaselineWaitS` cases pass standalone — `.venv/bin/python -m pytest backend/tests/unit/workers/test_orchestrator_baseline_phase.py -p no:randomly` is all-green with no reliance on | — | — |
| 12 | P2 | [bug_judgment_header_omits_click_bucket](planned_features/02_mvp2/bug_judgment_header_omits_click_bucket/feature_spec.md) | Bug | The header renders all three buckets (`llm`, `human`, `click`) so the displayed terms sum to the displayed total count, making the doc-comment claim ("the UI's source-breakdown card now renders all th | — | — |
| 5 | P2 | [chore_arq_pool_aclose_deprecation](planned_features/02_mvp2/chore_arq_pool_aclose_deprecation/feature_spec.md) | Chore | Both call sites use `await arq_pool.aclose()`; no `DeprecationWarning` on shutdown; a regression guard asserts the async-correct form on both paths so a future edit cannot silently reintroduce `close( | — | — |
| 6 | P2 | [chore_cluster_detail_rung_badge](planned_features/02_mvp2/chore_cluster_detail_rung_badge/feature_spec.md) | Chore | The cluster-detail page surfaces a `<UbiRungBadge>` for the cluster, scoped by a user-selected (or auto-seeded) query set + target. | — | [PR #320](https://github.com/SoundMindsAI/relyloop/pull/320) |
| 7 | 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) |
| 8 | P2 | [chore_studies_post_arq_spy_fixture](planned_features/02_mvp2/chore_studies_post_arq_spy_fixture/feature_spec.md) | Chore | A reusable `arq_pool_spy` integration fixture that records every `enqueue_job(name, *args)` call, letting studies-POST tests positively assert `spy.calls == []` on rejection and `spy.calls == [("start | — | — |
| 9 | P2 | [chore_ubi_reader_search_after_pagination](planned_features/02_mvp2/chore_ubi_reader_search_after_pagination/feature_spec.md) | Chore | A new engine-neutral `SearchAdapter.scan_all` cursor-scan lets `UbiReader` iterate the **entire** matching event/query stream for a window (subject to a caller ceiling), folding each page into the agg | — | [PR #413](https://github.com/SoundMindsAI/relyloop/pull/413) |
| 10 | P2 | [bug_baseline_phase_test_isolation](planned_features/02_mvp2/bug_baseline_phase_test_isolation/feature_spec.md) | Bug | The three `TestComputeBaselineWaitS` cases pass standalone — `.venv/bin/python -m pytest backend/tests/unit/workers/test_orchestrator_baseline_phase.py -p no:randomly` is all-green with no reliance on | — | — |
| 11 | P2 | [bug_judgment_header_omits_click_bucket](planned_features/02_mvp2/bug_judgment_header_omits_click_bucket/feature_spec.md) | Bug | The header renders all three buckets (`llm`, `human`, `click`) so the displayed terms sum to the displayed total count, making the doc-comment claim ("the UI's source-breakdown card now renders all th | — | — |

### Spec (0)

Expand Down Expand Up @@ -136,8 +135,6 @@ graph LR
class feat_query_normalizer_typed_pipeline plan;
feat_ubi_llm_study_comparison["ubi llm study comparison"]
class feat_ubi_llm_study_comparison plan;
feat_walkthrough_video_cursor_captions["walkthrough video cursor captions"]
class feat_walkthrough_video_cursor_captions 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
4 changes: 2 additions & 2 deletions docs/00_overview/dashboard.html
Original file line number Diff line number Diff line change
Expand Up @@ -384,15 +384,15 @@ <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">94 / 94 scoped done</div>
<div class="progress">95 / 95 scoped done</div>
<span class="state-pill complete">Complete</span>
</div>


<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">18 / 28 scoped done · 26 remaining</div>
<div class="progress">18 / 27 scoped done · 25 remaining</div>
<span class="state-pill in_progress">In progress</span>
</div>

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -28,4 +28,10 @@
- Phases covered: single phase (all of spec scope)

## Implementation
- Status: Not started
- Status: Complete — merged to main as PR #451 (squash `199a3ed5`), 2026-06-04
- All 7 stories implemented; all 10 decks re-recorded operator-path (video-only).
- Post-PR review: Gemini + CodeQL 5 findings accepted; final GPT-5.5 1 finding rejected (golden corpus committed `f71d0e70`, partial-diff false positive). CodeQL clean ("No new alerts").
- Gates: 1154 vitest · 61 build_guides pytest · 13 freshness self-test · asset-ref guard (30 refs) · mkdocs build --strict · reuse lint. All 18 pr.yml checks green.

## Done
- Status: Complete. Folder moved to `implemented_features/2026_06_04_feat_walkthrough_video_cursor_captions/` (this finalization PR).
23 changes: 20 additions & 3 deletions docs/00_overview/mvp1_dashboard.html
Original file line number Diff line number Diff line change
Expand Up @@ -397,8 +397,8 @@ <h2>MVP1 Progress</h2>
<div class="kpi-row">
<div class="kpi complete">
<div class="label">Specced features done</div>
<div class="value">94 / 94</div>
<div class="sub">100% specced · 130 filed under MVP1</div>
<div class="value">95 / 95</div>
<div class="sub">100% specced · 131 filed under MVP1</div>
<div class="bar"><span style="width:100%"></span></div>
</div>
<div class="kpi complete">
Expand Down Expand Up @@ -483,7 +483,7 @@ <h3>Implementing <span class="count">0</span></h3>
</div>

<div class="col done">
<h3>Done <span class="count">130</span></h3>
<h3>Done <span class="count">131</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 @@ -875,6 +875,19 @@ <h3>Done <span class="count">130</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_04_feat_walkthrough_video_cursor_captions/feature_spec.md">Walkthrough Video Cursor Captions</a></div>
<div class="meta">
<span class="badge feat">Feature</span>

<a class="pr" href="https://github.com/SoundMindsAI/relyloop/pull/451">PR #451</a> <span>merged 2026-06-04</span>
</div>
<div class="one-liner">All 10 walkthrough videos are re-recorded with (1) a visible **synthetic arrow cursor** that glides to each target and pulses on click, (2) **smoother, human-paced** motion, and (3) **WebVTT step capt</div>

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

medium

The one-liner for feat_walkthrough_video_cursor_captions is truncated here as well, cutting off the word captions and leaving the unclosed markdown asterisks (**) in the HTML text. Shortening the source feature spec's one-liner will automatically resolve this truncation in the regenerated HTML dashboard.

Suggested change
<div class="one-liner">All 10 walkthrough videos are re-recorded with (1) a visible **synthetic arrow cursor** that glides to each target and pulses on click, (2) **smoother, human-paced** motion, and (3) **WebVTT step capt</div>
<div class="one-liner">All 10 walkthrough videos re-recorded with a visible synthetic arrow cursor, smoother human-paced motion, and WebVTT step captions.</div>



</div>


<div class="card infra" data-prefix="infra" data-priority="P2">
<div class="name"><a href="../../docs/00_overview/implemented_features/2026_05_10_infra_adapter_elastic/feature_spec.md">Adapter Elastic</a></div>
<div class="meta">
Expand Down Expand Up @@ -2375,6 +2388,8 @@ <h2>Dependency graph (feat_ + infra_)</h2>
class chore_e2e_api_base_url_construction done;
chore_state_md_size_compression[&quot;state md size compression&quot;]
class chore_state_md_size_compression done;
feat_walkthrough_video_cursor_captions[&quot;walkthrough video cursor captions&quot;]
class feat_walkthrough_video_cursor_captions done;
feat_study_lifecycle --&gt; feat_digest_proposal
feat_llm_judgments --&gt; feat_digest_proposal
infra_foundation --&gt; feat_llm_judgments
Expand Down Expand Up @@ -2616,6 +2631,8 @@ <h2>Dependency graph (feat_ + infra_)</h2>
class chore_e2e_api_base_url_construction done;
chore_state_md_size_compression[&quot;state md size compression&quot;]
class chore_state_md_size_compression done;
feat_walkthrough_video_cursor_captions[&quot;walkthrough video cursor captions&quot;]
class feat_walkthrough_video_cursor_captions done;
feat_study_lifecycle --&gt; feat_digest_proposal
feat_llm_judgments --&gt; feat_digest_proposal
infra_foundation --&gt; feat_llm_judgments
Expand Down
Loading