Skip to content

Commit e4dbf4c

Browse files
authored
P0: release.yml typecheck + bind audit + loopback middleware (#84)
Three P0 fixes bundled — foundation cleanup before v0.3.0 phase work. Closes release.yml drift (PR #51's tabs broke v0.3.0 tag releases), production bind exposure (Critic F1), and 9-endpoint LAN gap on /system/* (Critic F2+F3). 5 new tests; 243 full pass.
1 parent 6fd9b13 commit e4dbf4c

21 files changed

Lines changed: 2859 additions & 40 deletions

File tree

.github/workflows/ci.yml

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -84,9 +84,11 @@ jobs:
8484

8585
# checkJs is true in tsconfig for IDE feedback, but 947 pre-existing
8686
# JS errors remain. Override to false in CI so only .ts files block.
87+
# Sourced from `typecheck:ci` in frontend/package.json so the release
88+
# workflow runs an identical command — drift broke v0.3.x release runs.
8789
- name: Frontend typecheck
8890
working-directory: frontend
89-
run: bunx tsc --noEmit --checkJs false
91+
run: bun run typecheck:ci
9092

9193
- name: Run Vitest (frontend)
9294
working-directory: frontend

.github/workflows/release.yml

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -93,9 +93,14 @@ jobs:
9393
working-directory: frontend
9494
run: bun install
9595

96+
# Single-sourced typecheck command (mirrors ci.yml). The `typecheck:ci`
97+
# script in frontend/package.json sets `--checkJs false` so pre-existing
98+
# JS-side errors don't block the release; only .ts/.tsx files gate.
99+
# Drift between CI and release-time typecheck flags broke v0.3.x release
100+
# runs — keep this command identical to ci.yml's step.
96101
- name: Frontend typecheck
97102
working-directory: frontend
98-
run: bunx tsc --noEmit
103+
run: bun run typecheck:ci
99104

100105
# Invoke node directly (not `bun run test`) because `bun run` auto-aliases
101106
# `node` to `bun` in script bodies, and bun doesn't support

.planning/ROADMAP.md

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -53,14 +53,17 @@ All 11 open GitHub issues are closed or have a documented workaround surfaced in
5353
**Depends on:** Phase 0
5454
**User-value density:** This phase closes the most issues in the milestone — #35 (HF token + diarization sub-issues), #54 (macOS quarantine via documented `xattr -cr` workaround surfaced in error UI), #56 (AppImage white-screen via documented `WEBKIT_DISABLE_COMPOSITING_MODE=1` workaround), #58 (`pkg_resources`), and partial #55 (CosyVoice docs).
5555
**Closes issues:** #35, #54 (documented workaround), #55 (partial), #56 (documented workaround), #58
56-
**Requirements:** INST-01, INST-02, INST-03, INST-04, INST-05, INST-06, DOCS-01, DOCS-02, DOCS-03, DOCS-04, DOCS-05, AUTH-01, AUTH-02, AUTH-03, AUTH-04, AUTH-05
56+
**Requirements:** INST-01, INST-02, INST-03, INST-04, INST-05, INST-06, DOCS-01, DOCS-02, DOCS-03, DOCS-04, DOCS-05, AUTH-01, AUTH-02, AUTH-03, AUTH-04, AUTH-05, AUTH-06 (scope additions: #76 .deb ffprobe, #80 Docker LAN)
5757
**Success Criteria** (what must be TRUE):
5858
1. A new user on macOS / Windows / Linux follows `docs/install/{macos,windows,linux,docker}.md` end-to-end and reaches a working app (validated by `scripts/validate-install-docs.py` against the actual install script)
5959
2. User enters an HF token in Settings → API Keys once; the token survives app restart, is forwarded to engine subprocesses, and never appears in any log file or error traceback
6060
3. When the app raises a known error class (quarantined `.app`, AppImage WebKit white-screen, missing `pkg_resources`, missing HF token, etc.), the error UI shows an "Open docs for this error" button that links to the right `docs/install/*.md` section
6161
4. README install section is split into per-OS files with templated version badges, no longer inlining 600 lines; `docs/install/troubleshooting.md` covers the top 10 install errors
6262
5. CosyVoice install guide (`docs/engines/cosyvoice.md`), diarization guide (`docs/features/diarization.md`), and HF token guide (`docs/setup/huggingface-token.md`) exist and are linked from README + error UI
63-
**Plans:** TBD
63+
**Plans:** 3 plans (3 waves)
64+
- [ ] 01-01-PLAN.md — Wave 1 — Token resolver (3-source cascade), encrypted SQLite settings store, logging redactor, subprocess env injection, patch all 5 bare `os.environ.get("HF_TOKEN")` call sites
65+
- [ ] 01-02-PLAN.md — Wave 2 — Docs scaffolding (split README + 8 docs files), `scripts/validate-install-docs.py` CI gate, error→docs deeplink map (Python + TS), ErrorBoundary wiring, Settings → API Keys panel UI
66+
- [ ] 01-03-PLAN.md — Wave 3 — AppRun strategy spike + AppImage WebKit conditional launcher, .deb ffprobe relocation + postinst cleanup (#76), centralized `apiBase.ts` + Docker LAN fix (#80), macOS Gatekeeper detection probe
6467
**UI hint:** yes
6568

6669
### Phase 2: Engine Isolation (SubprocessBackend → IndexTTS + WAV-export dubbing fix)
@@ -150,7 +153,7 @@ All 11 open GitHub issues are closed or have a documented workaround surfaced in
150153
| Phase | Plans Complete | Status | Completed |
151154
|-------|----------------|--------|-----------|
152155
| 0. Gates | 0/0 | Not started | - |
153-
| 1. Install + Token + Docs + Error UX | 0/0 | Not started | - |
156+
| 1. Install + Token + Docs + Error UX | 0/3 | Planned | - |
154157
| 2. Engine Isolation | 0/0 | Not started | - |
155158
| 3. Supertonic-3 + Mirror Reliability | 0/0 | Not started | - |
156159
| 4. Adaptive & Specialty Engines (spike-first) | 0/0 | Not started | - |
@@ -161,20 +164,20 @@ All 11 open GitHub issues are closed or have a documented workaround surfaced in
161164

162165
## Coverage Summary
163166

164-
**v1 requirements mapped:** 62 / 62 ✓
167+
**v1 requirements mapped:** 74 / 74 ✓ (updated 2026-05-18 — Phase 1 row corrected per checker B-3 to include INST-12 + AUTH-06; total now matches REQUIREMENTS.md 74)
165168
**Orphaned requirements:** 0 ✓
166169
**Duplicates:** 0 ✓
167170

168171
| Phase | Requirement Count | Requirement IDs |
169172
|-------|-------------------|-----------------|
170173
| Phase 0 | 6 | GATE-01 — GATE-06 |
171-
| Phase 1 | 16 | INST-01 — INST-06, DOCS-01 — DOCS-05, AUTH-01 — AUTH-05 |
174+
| Phase 1 | 18 | INST-01 — INST-06, INST-12, DOCS-01 — DOCS-05, AUTH-01 — AUTH-06 |
172175
| Phase 2 | 8 | ENGINE-01 — ENGINE-07, BUG-01 |
173176
| Phase 3 | 11 | TTS-01 — TTS-06, INST-07 — INST-11 |
174177
| Phase 4 | 13 | SPIKE-01 — SPIKE-02, GGUF-01 — GGUF-06, SING-01 — SING-05 |
175178
| Phase 5 | 12 | REPORT-01 — REPORT-12 |
176179
| Phase 6 | 6 | REL-01 — REL-06 |
177-
| **Total** | **62** ||
180+
| **Total** | **74** ||
178181

179182
---
180183

.planning/STATE.md

Lines changed: 29 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
# STATE: OmniVoice Studio v0.3.x Stabilization
22

3-
**Last updated:** 2026-05-18 — Completed quick task 260518-lp7: hide dictation pill widget when idle
3+
**Last updated:** 2026-05-18 — Phase 1 planned (3 plans, 3 waves); ready for execute
44

55
---
66

@@ -10,17 +10,17 @@
1010

1111
**Milestone:** v0.3.x stabilization — "Empty the inbox" (close all 11 open GitHub issues) plus two surgical additions (Supertonic-3 engine, opt-in bug reporting) plus two spike-first model additions (`Serveurperso/OmniVoice-GGUF` hardware-adaptive default, `ModelsLab/omnivoice-singing` for the dubbing pipeline).
1212

13-
**Current focus:** Roadmap defined (7 phases, 62 v1 requirements). Awaiting `/gsd:plan-phase 0` to decompose Phase 0 (Gates) into executable plans.
13+
**Current focus:** Phase 1 planned. Three plans cover all 16 official Phase 1 requirements plus accepted scope additions (#76 .deb ffprobe, #80 Docker LAN). Ready for `/gsd:execute-phase 1`.
1414

1515
---
1616

1717
## Current Position
1818

1919
| Field | Value |
2020
|-------|-------|
21-
| Phase | 0Gates |
22-
| Plan | none yet |
23-
| Status | Roadmap complete (revised to insert Phase 4), planning not started |
21+
| Phase | 1Install + Token Persistence + Docs Scaffolding + Error UX |
22+
| Plan | 01-01, 01-02, 01-03 (all PLAN.md committed, awaiting execute) |
23+
| Status | Phase 1 planned, ready for execute |
2424
| Mode | yolo (autonomous) |
2525
| Granularity | standard |
2626
| Project mode | mvp (per phase) |
@@ -29,7 +29,7 @@
2929

3030
```
3131
[ ] Phase 0 Gates (hard gate — must merge and be green before any other phase)
32-
[ ] Phase 1 Install + Token Persistence + Docs Scaffolding + Error UX
32+
[~] Phase 1 Install + Token Persistence + Docs Scaffolding + Error UX ← planned (3 plans, 3 waves)
3333
[ ] Phase 2 Engine Isolation (SubprocessBackend → IndexTTS + WAV-export fix)
3434
[ ] Phase 3 Supertonic-3 Engine + Installer Mirror Reliability
3535
[ ] Phase 4 Adaptive & Specialty Engines (spike-first: GGUF + Singing)
@@ -64,17 +64,29 @@
6464
6. **Bug reporting is opt-in only.** Default-deny allow-list payload, GitHub-Issues prefilled URL only, no PAT / no third-party telemetry endpoint.
6565
7. **`xattr -cr` (#54) and `WEBKIT_DISABLE_COMPOSITING_MODE=1` (#56) count as closed if documented + surfaced in error UI.** Real fixes are infrastructure-level (signing cert, upstream Tauri bug).
6666
8. **Mode is `yolo` (autonomous), per-phase mode is `mvp`.** Auto-approve gates as user directed.
67+
9. **Phase 1 scope locked (2026-05-18):** Three plans cover 17 requirements (INST-01..06, DOCS-01..05, AUTH-01..06) plus two accepted scope additions (#76 .deb ffprobe conflict, #80 Docker LAN frontend). v0.3.0 ships as a single fat release bundling all 7 phases — no incremental v0.3.x tags.
68+
10. **Phase 1 wave structure (2026-05-18):**
69+
- **Wave 1 (Plan 01-01):** Token resolver (3-source cascade) + encrypted SQLite settings store + logging redactor + subprocess env injection + patch all 5 bare `os.environ.get("HF_TOKEN")` call sites. Closes #35 read-side bug.
70+
- **Wave 2 (Plan 01-02):** Split README into per-OS docs + 5 new docs + `scripts/validate-install-docs.py` CI gate + error→docs deeplink map (Python + TS halves) + ErrorBoundary deeplink wiring + Settings → API Keys panel UI (consumes Wave 1 resolver state endpoint).
71+
- **Wave 3 (Plan 01-03):** AppRun strategy spike + AppImage WebKit conditional launcher (#56) + .deb ffprobe relocation + postinst cleanup (#76) + centralized `apiBase.ts` + Docker LAN frontend fix (#80) + macOS Gatekeeper detection probe + INST-01 no-regression assertion.
72+
11. **Open Question resolutions for Phase 1 (2026-05-18):**
73+
- AppRun location: spike-first (Task 01-03-1) — outcome documented in `.planning/decisions/apprun-strategy.md`
74+
- Settings table: AUTH-02 adds via real alembic migration (project already has `alembic.ini` + `backend/migrations/`), not `init_db()` patch
75+
- Project repo URL: `backend/core/links.py` reads from `pyproject.toml [project.urls]` + `tauri.conf.json` updater endpoint (single source of truth)
76+
- localhost hardcodes: `frontend/src/utils/media.js:20` confirmed as only site; centralized via `apiBase.ts`
77+
- First-launch failure UI: backend startup probe emits `GATEKEEPER_QUARANTINE` error class → React ErrorBoundary renders docs deeplink (Tauri itself launches; backend detects)
6778

6879
### Open TODOs
6980

70-
- Run `/gsd:plan-phase 0` to decompose Phase 0 (Gates) into executable plans.
81+
- Run `/gsd:execute-phase 1` to execute the 3 Phase 1 plans (Wave 1 → Wave 2 → Wave 3).
82+
- Run `/gsd:plan-phase 0` to decompose Phase 0 (Gates) into executable plans (Phase 0 is the hard gate; technically should land first, but Phase 1 plans don't block on its execution).
7183
- Confirm open PRs #51 / #53 / #61 land before Phase 0 finalizes the CI matrix.
72-
- Resolve Phase 2 / 3 / 5 research questions enumerated in `.planning/research/SUMMARY.md` Open Questions table (note: SUMMARY.md "Phase 4" rows now correspond to this roadmap's Phase 5 — bug reporting — after the insertion).
84+
- Resolve Phase 2 / 3 / 5 research questions enumerated in `.planning/research/SUMMARY.md` Open Questions table.
7385
- Schedule Phase 4 research dimension (web-fetch model cards for `Serveurperso/OmniVoice-GGUF` and `ModelsLab/omnivoice-singing`, license + runtime confirmation) before any GGUF/SING code work.
7486

7587
### Blockers
7688

77-
None.
89+
None. Phase 1 plans are independent of Phase 0 plan creation (though Phase 0 execution must merge before Phase 1 PRs per Key Decision #2).
7890

7991
### Quick Tasks Completed
8092

@@ -87,14 +99,16 @@ None.
8799

88100
## Session Continuity
89101

90-
**Last session ended after:** Roadmap revision to insert Phase 4 (Adaptive & Specialty Engines). Files written:
91-
- `.planning/ROADMAP.md` (revised: 7 phases, new Phase 4 inserted between Supertonic-3 and Bug Reporting)
92-
- `.planning/REQUIREMENTS.md` (revised: 13 new requirements added, traceability table extended to 62 rows, REPORT-* renumbered to Phase 5, REL-* to Phase 6)
93-
- `.planning/STATE.md` (this file — updated to 7 phases / 62 requirements)
102+
**Last session ended after:** Phase 1 planning. Files written:
103+
- `.planning/phases/01-install-token-persistence-docs-scaffolding-error-ux/01-01-PLAN.md` (Wave 1 — token persistence + read-side fix)
104+
- `.planning/phases/01-install-token-persistence-docs-scaffolding-error-ux/01-02-PLAN.md` (Wave 2 — docs scaffolding + error UX)
105+
- `.planning/phases/01-install-token-persistence-docs-scaffolding-error-ux/01-03-PLAN.md` (Wave 3 — installer/bundler fixes)
106+
- `.planning/ROADMAP.md` (Phase 1 plan list populated, progress 0/3)
107+
- `.planning/STATE.md` (this file — Phase 1 planned, ready for execute)
94108

95-
**Resume with:** `/gsd:plan-phase 0`
109+
**Resume with:** `/gsd:execute-phase 1` (or `/gsd:plan-phase 0` to decompose Phase 0 in parallel).
96110

97111
---
98112

99113
*State initialized: 2026-05-16 after roadmap creation*
100-
*Last updated: 2026-05-16 after Phase 4 insertion (Adaptive & Specialty Engines)*
114+
*Last updated: 2026-05-18 after Phase 1 planning (3 plans across 3 waves)*

0 commit comments

Comments
 (0)