diff --git a/BACKLOG.md b/BACKLOG.md index 7c07ba75..470d5fb0 100644 --- a/BACKLOG.md +++ b/BACKLOG.md @@ -4,7 +4,7 @@ Source: `active/sonic-architect-app` (keep in `active/` as reference). Most of t ## Shipped — Data - ✅ `data/genreProfiles.ts` — 35 EDM genre spectral targets, LUFS/crest factor/PLR ranges. **Landed:** [`apps/ui/src/data/genreProfiles.ts`](apps/ui/src/data/genreProfiles.ts). -- ✅ `data/abletonDevices.ts` — 14 spectral-band → Ableton Live 12 device mappings + FX rule engine. **Landed:** [`apps/ui/src/data/abletonDevices.ts`](apps/ui/src/data/abletonDevices.ts). +- ✅ `data/abletonDevices.ts` — 14 spectral-band → Ableton Live 12 device mappings + FX rule engine. **Landed:** [`apps/ui/src/data/abletonDevices.ts`](apps/ui/src/data/abletonDevices.ts). *Ported but demoted to a research-only scoring baseline (owner decision 2026-06-11): imported by no product code, consumed only by the recommendation-eval bridge. See the NEEDS-WIRING decision in [`apps/backend/NEEDS.md`](apps/backend/NEEDS.md).* ## Shipped — Mix Analysis - ✅ `services/mixDoctor.ts` + `components/MixDoctorPanel.tsx` — spectral-balance scoring against genre profiles. **Landed:** [`apps/ui/src/services/mixDoctor.ts`](apps/ui/src/services/mixDoctor.ts), [`apps/ui/src/components/MixDoctorPanel.tsx`](apps/ui/src/components/MixDoctorPanel.tsx). diff --git a/CLAUDE.md b/CLAUDE.md index bfac519d..734e5bd1 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -440,7 +440,7 @@ A quick map from intent to the right place to start: ## Backport Candidates -The full original `sonic-architect-app` backlog is **shipped** — genre profiles, Ableton device mappings, mix doctor, eight detectors, Phase 3 audition-sample generation, and `patchSmith.ts` (Phase 3 Vital preset generation, [`apps/ui/src/services/patchSmith.ts`](apps/ui/src/services/patchSmith.ts)). See [`BACKLOG.md`](BACKLOG.md) for the landed inventory. Consult it before re-implementing genre detection, mix analysis, acid/reverb/vocal/supersaw/bass/kick detection — they're already in [`apps/backend/analyze_detection.py`](apps/backend/analyze_detection.py) and emit fields visible in `EXPECTED_TOP_LEVEL_KEYS`. +The full original `sonic-architect-app` backlog is **shipped** — genre profiles, Ableton device mappings (`abletonDevices.ts` — ported but **research-only** since the 2026-06-11 demotion decision: a scoring baseline for the recommendation-proof harness, imported by no product code; see the NEEDS-WIRING decision in `apps/backend/NEEDS.md`), mix doctor, eight detectors, Phase 3 audition-sample generation, and `patchSmith.ts` (Phase 3 Vital preset generation, [`apps/ui/src/services/patchSmith.ts`](apps/ui/src/services/patchSmith.ts)). See [`BACKLOG.md`](BACKLOG.md) for the landed inventory. Consult it before re-implementing genre detection, mix analysis, acid/reverb/vocal/supersaw/bass/kick detection — they're already in [`apps/backend/analyze_detection.py`](apps/backend/analyze_detection.py) and emit fields visible in `EXPECTED_TOP_LEVEL_KEYS`. ## Companion Agent Docs diff --git a/apps/backend/NEEDS.md b/apps/backend/NEEDS.md index de91b4e0..da8e18da 100644 --- a/apps/backend/NEEDS.md +++ b/apps/backend/NEEDS.md @@ -85,8 +85,9 @@ citations**, so the chain-of-custody penalty drives its adjusted aggregate to #2). The rules **are** feature-triggered, so attaching the triggering measurement as a citation is a concrete, harness-rewarded improvement — a candidate sub-goal-3 "score-driven change" (frontend edit to `abletonDevices.ts` → - `npm run verify`). But see the dead-code finding under NEEDS-WIRING before - investing in this path. + `npm run verify`). Moot since 2026-06-11: the NEEDS-WIRING decision below + demoted `abletonDevices.ts` to a research-only baseline, so this candidate is + no longer a *product* improvement path. This is the first real signal toward the Gemini verdict — likely Gemini earns its place on citation + full-surface coverage. Confirm on real renders; the synthetic @@ -169,22 +170,23 @@ factor, onset density) is the app's own projection (`analyzer.ts`); reuse it rat than re-deriving, and only then is the deterministic score a real verdict input rather than the synthetic illustration above. -**FINDING — the deterministic source is currently dead code (affects sub-goal 3 -framing).** `apps/ui/src/data/abletonDevices.ts` is imported **nowhere** in the UI -(no component, no test) — verified by grep. ASA's product recommendations come -entirely from Gemini (`Phase2Result`); the deterministic engine is unwired, -ported-but-unused. Consequence: a "score-driven improvement" to `abletonDevices.ts` -(e.g. the citation-emit fix flagged above) would **not reach any user** — it would -raise a harness number for code nobody runs, which is harness-gaming, not a product -improvement (PURPOSE.md decision #5). So before sub-goal 3 treats the deterministic -path as a real recommendation source, decide one of: -1. **Wire `abletonDevices.ts` into the product** (so its recs — and any citation - improvement — actually reach users), then score + improve it; or -2. **Treat it as a research-only baseline** in the three-source comparison (score - it, but land score-driven *product* improvements on the **Gemini** path - instead — which needs the `chore/...` branch + renders). -This is the honest reason no score-driven improvement was "landed" this session: -the only render-free candidate would have improved dead code. +**FINDING — the deterministic source is dead code on the product path. ✅ DECIDED +2026-06-11: demoted to research-only baseline (option 2).** +`apps/ui/src/data/abletonDevices.ts` is imported **nowhere** in the UI (no +component, no test) — verified by grep. ASA's product recommendations come +entirely from the Phase 2 providers (`Phase2Result`); the deterministic engine is +unwired, ported-but-unused. Consequence: a "score-driven improvement" to +`abletonDevices.ts` (e.g. the citation-emit fix flagged above) would **not reach +any user** — it would raise a harness number for code nobody runs, which is +harness-gaming, not a product improvement (PURPOSE.md decision #5). The owner +resolved the wire-or-demote choice: **demote**. Standing consequences: +1. The module stays where it is as the scored free baseline in the three-source + comparison (its file header now records the status); it is **not** to be + wired into the product. +2. Score-driven *product* improvements land on the **Phase 2 provider** path + instead. The citation-emit candidate above is off the table as a product + change (it remains a legitimate baseline-fairness tweak if the comparison + ever needs it). --- diff --git a/apps/backend/RECOMMENDATION_VERDICT.md b/apps/backend/RECOMMENDATION_VERDICT.md index 2587bc9d..04d90a91 100644 --- a/apps/backend/RECOMMENDATION_VERDICT.md +++ b/apps/backend/RECOMMENDATION_VERDICT.md @@ -88,4 +88,7 @@ not a synthesis artifact. 2. **`melodic_techno_arp_124` Gemini 0 recs** — investigate the parse/shape outlier on a real render before trusting that fixture's contribution. 3. The deterministic `AudioFeatures` projection is approximate (not the app's - `analyzer.ts`); reconcile when wiring the deterministic path for real. + `analyzer.ts`). The wire-or-demote question was resolved 2026-06-11: the + deterministic engine is a research-only baseline and will not be wired into + the product (see `NEEDS.md`), so reconciling the projection matters only for + baseline fairness in this comparison, not for any product path. diff --git a/apps/backend/scripts/emit_deterministic_recs.ts b/apps/backend/scripts/emit_deterministic_recs.ts index f295db0c..141868b9 100644 --- a/apps/backend/scripts/emit_deterministic_recs.ts +++ b/apps/backend/scripts/emit_deterministic_recs.ts @@ -1,8 +1,10 @@ /** * Deterministic recommendation source bridge (GOAL.md sub-goal 3 inner loop). * - * EVAL / RESEARCH ONLY. Wraps the product's deterministic recommendation engine - * (`apps/ui/src/data/abletonDevices.ts`) and emits the scorer's normalized rec + * EVAL / RESEARCH ONLY. Wraps the deterministic recommendation engine + * (`apps/ui/src/data/abletonDevices.ts` — itself research-only since the + * 2026-06-11 demotion decision; see apps/backend/NEEDS.md) and emits the + * scorer's normalized rec * shape so `scripts/evaluate_recommendations.py --source deterministic` can grade * the *free* path without a Gemini call. Importing the real module keeps a single * source of truth — no Python re-port to drift from the TS. diff --git a/apps/ui/src/data/abletonDevices.ts b/apps/ui/src/data/abletonDevices.ts index 1235dc10..bb25559b 100644 --- a/apps/ui/src/data/abletonDevices.ts +++ b/apps/ui/src/data/abletonDevices.ts @@ -3,6 +3,17 @@ * * Maps spectral characteristics to specific Ableton device recommendations. * This is deterministic — no hallucination possible. + * + * RESEARCH-ONLY BASELINE — not on the product path (owner decision, 2026-06-11). + * No UI component or service imports this module; product recommendations come + * from the Phase 2 interpretation providers. Its sole consumer is the eval + * bridge `apps/backend/scripts/emit_deterministic_recs.ts`, which scores it as + * the free deterministic baseline in GOAL.md sub-goal 3's three-source + * comparison. Do NOT wire it into the product, and land score-driven *product* + * improvements on the Phase 2 path instead — raising this module's harness + * score improves code no user runs (see the NEEDS-WIRING decision in + * apps/backend/NEEDS.md). Keep it import-pure: the bridge runs it under Node + * native type-stripping with no build step. */ export interface DeviceRecommendation {