test(tts): refactor harness to pterm + gepeto + 14 review READMEs + TAC rail 6 - #2338
Conversation
|
Warning Review limit reached
Next review available in: 24 minutes Enable usage-based reviews in Billing to review now. Otherwise, wait until the next included review is available. How can I continue?After more reviews become available, a review can be triggered using the To avoid repeated limits, reduce automatic review volume by pausing incremental auto-reviews earlier, using label-based review opt-in, excluding WIP or generated PR titles, or requesting reviews manually when the PR is ready. If your team needs uninterrupted high-volume reviews, an organization admin can enable usage-based reviews. How do review limits work?CodeRabbit enforces per-developer PR review limits for each organization. Most developers receive the normal plan review availability. For paid Pro and Pro+ PR reviews, CodeRabbit uses adaptive limits for sustained high-volume activity. When a developer's recent PR review activity reaches the 95th percentile or higher among CodeRabbit users, additional reviews become available more gradually as earlier reviews age out of the rolling window. Please refer docs for additional details. Review details⚙️ Run configurationConfiguration used: Path: .coderabbit.yaml Review profile: CHILL Plan: Pro Plus Run ID: 📒 Files selected for processing (24)
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
5a3ac29 to
4bb52e9
Compare
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 5a3ac29f41
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
| methods: { | ||
| // Dynamically render the menu based on the current state. | ||
| menu: async (kernel, info) => { |
There was a problem hiding this comment.
Export the menu hook at the manifest root
Pinokio discovers the dynamic UI through a top-level menu property, as demonstrated by the existing Ultimate-TTS launcher in pmoves/docs/ARTSTUFF/Ultimate-TTS-Studio.git/pinokio.js. Nesting this hook under methods means opening this newly added launcher never invokes the menu builder, leaving its install and test actions inaccessible.
Useful? React with 👍 / 👎.
| path: "../../..", // pmoves/ (the Python source root) | ||
| message: [ | ||
| "python pmoves/tools/test_all_tts_engines.py --no-play 2>&1 | tee {{cwd}}/logs/api/start.log", |
There was a problem hiding this comment.
Invoke the harness relative to the configured working directory
For every full launcher run, path: "../../.." already changes the shell directory from .../test_all_tts_engines/pinokio to the repository's pmoves/ directory. The command then resolves pmoves/tools/test_all_tts_engines.py as pmoves/pmoves/tools/test_all_tts_engines.py, which does not exist, so the harness exits before testing any engine; start-one.js contains the same duplicated path.
Useful? React with 👍 / 👎.
| text: "Install (gradio_client)", | ||
| method: "shell.run", | ||
| params: { | ||
| uri: "install.js", | ||
| }, |
There was a problem hiding this comment.
Launch the installer script instead of passing it to shell.run
When the environment is absent, this menu item invokes shell.run with only an unsupported uri parameter and no message, so selecting Install does not execute install.js. Pinokio launcher menus link to script files with href: "install.js" or invoke them through script.start; without one of those forms, a fresh installation cannot create the environment.
Useful? React with 👍 / 👎.
| // info.exists() — relative to the script root (pmoves/tools/test_all_tts_engines/pinokio/) | ||
| const installed = info.exists("venv") |
There was a problem hiding this comment.
Check for the virtual environment where install.js creates it
After installation, install.js runs with path: "../../.." and venv: "venv", which creates/uses the environment beneath that working directory (pmoves/venv). info.exists("venv") is relative to the launcher directory instead, so it continues to report the app as uninstalled and never exposes the Run actions even after a successful install.
Useful? React with 👍 / 👎.
| action: | ||
| type: file_exists | ||
| target: "pmoves/tools/test_all_tts_engines/engines/{kitten_tts,kokoro,f5_tts,indextts,indextts2,fish,fish_s2,chatterbox,chatterbox_turbo,chatterbox_multilingual,voxcpm,higgs,qwen,vibevoice}.md" |
There was a problem hiding this comment.
Split brace-expanded TAC targets into concrete file checks
The repository's tac_runner.py implements file_exists as a literal Path(target).exists() call and performs no shell or brace expansion. Consequently this target—and the analogous launcher target below it—always checks for a filename containing braces and reports the new GRADIO MCP rail as failed even though all listed files exist; use individual nodes or an action type that explicitly supports multiple paths.
Useful? React with 👍 / 👎.
…(P1)
Lane 4 (refactor test_all_tts_engines.py to use Pinokio's pterm + gepeto).
P1 — pure documentation + launcher scaffold. No code changes to the
harness yet; the functional commit lands the pterm refactor + TAC rail 6.
What's in this commit:
* 14 per-engine review READMEs at
pmoves/tools/test_all_tts_engines/engines/{kitten_tts,kokoro,f5_tts,
indextts,indextts2,fish,fish_s2,chatterbox,chatterbox_turbo,
chatterbox_multilingual,voxcpm,higgs,qwen,vibevoice}.md
Each README captures the contract an implementer/reviewer needs
without re-reading launch.py:
- upstream attribution
- gradio_client test recipe (copy-pasteable)
- canonical synth_kwargs (from test_all_tts_engines.py)
- voice list
- hardware requirements
- reviewer checklist
- common failure modes (symptom / cause / fix)
- file locations
- reviewer notes (free-form)
* Repo-level README at pmoves/tools/test_all_tts_engines/README.md:
- how to actually test (3 recipes: harness, per-engine, gepeto)
- why pterm + gepeto (vs the hand-rolled wrapper)
- architecture diagram
- per-engine README index
- TAC rail 6 cross-ref
- "no-mock guarantee" language
* Gepeto launcher at pmoves/tools/test_all_tts_engines/pinokio/:
- install.js: uv pip install gradio_client
- start.js: runs the full test suite, pushes pterm notification,
copies summary to clipboard
- start-one.js: runs the harness for a single engine
- pinokio.js: dynamic UI (install when venv missing, "Run all" /
"Run one" submenu / "Per-engine READMEs" once installed)
- pinokio.json: metadata (title, description, icon, nvidia gpu)
Per gepeto SKILL.md "Quick scripts" section: this is a script launcher
without a web UI, so it lives in the tools/ tree where Pinokio can
discover it via `pterm start`.
The harness itself is unchanged in this commit — the refactor lands in
the functional commit (`pterm_preflight` is replaced with
`pterm_bring_up_tts_studio` using the real `pterm list` / `pterm status`
/ `pterm start` / `pterm running` subcommands, not the fake
`pterm search` / `pterm run` subcommands the old hand-rolled wrapper
was calling).
…ctional)
Lane 4 — refactor tools/test_all_tts_engines.py to use Pinokio's real
pterm CLI surface (no more hand-rolled subprocess wrappers calling
fake subcommands).
What changed:
* pmoves/tools/test_all_tts_engines.py
- REMOVED: _resolve_pterm, _run_pterm, _parse_pterm_status,
pterm_preflight (180 lines of hand-rolled wrapper)
- ADDED: pterm_bring_up_tts_studio, pterm_notify, pterm_clipboard_write
+ thin helpers _pterm_path, _pterm_call, _pterm_find_tts_app,
_pterm_wait_ready
- The old code called `pterm search "ultimate tts"` and `pterm run <id>`,
which are NOT real pterm subcommands. The refactor uses:
pterm list — discover installed apps (JSON array)
pterm status <id> — JSON { state, ready, ready_url }
pterm start <id> — daemon: boot the app
pterm running <id> — JSON { running, ready_url } (truthful poll)
pterm push "msg" --title... — desktop notification
pterm clipboard write "..." — system clipboard
- The 50-line JSON→key=value→colon-separated-text fallback parser is
GONE; pterm's output is JSON, we trust it.
- main() gains --notify and --clip-report flags for direct CLI users
(the gepeto launcher also wires these via pinokio/start.js).
- Docstring updated to explain the pterm + gepeto integration.
- File is now 1013 lines (was 947; the docstring + new pterm code
more than offset the wrapper removal).
* pmoves/configs/tac_trees/voice-engines-integration.tac.yaml
- Bumped version 1.0.0 → 1.1.0; description now mentions 6 rails
(was 4: contract / routing / runbook / license, plus ears as
rail 5 from earlier; now rail 6 = gradio_mcp)
- NEW: vei.gradio-mcp rail with 9 children
1. harness imports real gradio_client
2. 14 engine entries declared
3. 14 per-engine review READMEs present
4. repo-level README present
5. gepeto launcher present
6. pterm primitives used (named-function grep)
7. NO hand-rolled wrapper functions (grep_negative)
8. encoding="utf-8" pinned on pterm subprocess calls
9. self-ref (the rail exists and is the source of truth)
- Header comment updated; cross-ref added to
pmoves/tools/test_all_tts_engines/
No more hand-rolled pterm wrapper. The harness is now ~50 lines of
clean pterm orchestration + the existing gradio_client logic (which
was fine before — the test surface was always real).
Pair this with P1 (READMEs + gepeto launcher) and the docs commit
(AGNOTE CLAIM) for the full lane.
Lane 4 — close the lane with the trail + the spec doc.
* pmoves/docs/AGENTS/AGNOTE4482PHI.t1.md
- New CLAIM entry: Mavis::TTS-PTERM-GEPETO-REVIEW-READMES-CLAIM::2026-08-01
- Captures: root cause (hand-rolled wrapper called fake pterm
subcommands), what shipped (P1 1591-line READMEs+launcher,
functional 337-line refactor+TAC rail 6), validation
(AST/node/YAML/grep checks), out-of-scope (live run requires
Ultimate-TTS-Studio up on a GPU node), three-body
(delivery=Mavis, control=DARKXSIDE, memory=this trail+2 commits
+ spec + 19 new files), CHIT unsigned-local.
- This CLAIM becomes a RELEASE entry on admin-merge.
* pmoves/docs/specs/tts-pterm-gepeto-review-readmes-2026-08-01.md
- 12.8KB spec covering: TL;DR, root cause, the 3-stacked commit
breakdown, why pterm+gepeto (and not hand-rolled), architecture
diagram, TAC rail 6 with 9 children, validation table, out of
scope, related links.
- This is the "cold-read" doc for a fresh local model that picks
up Lane 4 in a future session (per the operator's "second home
for agents" framing).
Pair this with P1 (4eb8de3) and functional (7e464c0) for the
full lane. Push to origin, open PR, watch CI, on green operator
admin-merges.
CHIT trail unsigned-local (no CHIT_PASSPHRASE in Mavis session).
4bb52e9 to
ba5a3cc
Compare
…6-08-02) (#2345) Backlog cleanup: AGNOTE entries without paired RELEASEs were gappy because the operator's squash-merges typically close the lane but the AGNOTE entry for the lane-level RELEASE needs to be added separately. This commit adds the missing RELEASEs: 1. Creator Collab Slice 7 Prep SHIPPED + Lane SHIPPED (2026-07-29/30) — closes the 2026-07-29T07:00 Slice 7 Prep CLAIM, plus the Slice 1/2/4/5 CLAIMs (all absorbed into the operator's squash-merge on PR #2293, never got paired RELEASEs). The single combined RELEASE names each slice so the trail stays legible as a lane-level framing, not 7 fragmented entries. 2. Lane 3 — supabase-stack-default-up SHIPPED (2026-07-31) — closes the 2026-07-31T20:50 Lane 3 CLAIM. Documents the squash `13c2878559` on PR #2312, the 4 stacked commits (P1 / functional / docs / redo), the 3 layered env_file issues + 2 collaterals (kong routes + auth clients) the lane closed, the 5 PNG + 5 JSON + summary evidence artifacts. 3. Lane 4 — TTS test harness: pterm + gepeto SHIPPED (2026-08-01) — closes the 2026-08-01T18:30 Lane 4 CLAIM. Documents the squash `2f72861d68` on PR #2338, the 3 stacked commits (P1 / functional / docs), the wrap-don't-reinvent violation that the original hand-rolled pterm wrapper was (called fake subcommands `pterm search` and `pterm run` that don't exist in the real pterm CLI), the 14 per-engine review READMEs + gepeto launcher + TAC rail 6 (vei.gradio-mcp). 4. Lane 5 — NATS broker deployment: slice 3 + slice 6 streams SHIPPED (2026-08-01) — closes the 2026-08-01T20:30 Lane 5 CLAIM. Documents the void-publishing bug, the 3 new streams added (COMFY_COLLAB, ROOMS, HELPDESK), the silent-discard hazard that the `limits` retention choice avoids, the out-of-scope items (TOKENISM_ATTRIBUTION migration is operational, not code; cross-node NATS mesh is a separate lane; voice subjects are a separate voice-fabric lane). The squash is pending — PR #2344 open, awaiting admin-merge. All 4 entries are trail-only (no code change). CHIT trail unsigned-local (no CHIT_PASSPHRASE in Mavis session). The lane-level CLAIM → RELEASE gaps are now closed; future admin-merges should land the RELEASE in the same commit that the operator squash-merges. Co-authored-by: Mavis <Mavis@pmoves.local>
…6-08-02) (#2345) Backlog cleanup: AGNOTE entries without paired RELEASEs were gappy because the operator's squash-merges typically close the lane but the AGNOTE entry for the lane-level RELEASE needs to be added separately. This commit adds the missing RELEASEs: 1. Creator Collab Slice 7 Prep SHIPPED + Lane SHIPPED (2026-07-29/30) — closes the 2026-07-29T07:00 Slice 7 Prep CLAIM, plus the Slice 1/2/4/5 CLAIMs (all absorbed into the operator's squash-merge on PR #2293, never got paired RELEASEs). The single combined RELEASE names each slice so the trail stays legible as a lane-level framing, not 7 fragmented entries. 2. Lane 3 — supabase-stack-default-up SHIPPED (2026-07-31) — closes the 2026-07-31T20:50 Lane 3 CLAIM. Documents the squash `13c2878559` on PR #2312, the 4 stacked commits (P1 / functional / docs / redo), the 3 layered env_file issues + 2 collaterals (kong routes + auth clients) the lane closed, the 5 PNG + 5 JSON + summary evidence artifacts. 3. Lane 4 — TTS test harness: pterm + gepeto SHIPPED (2026-08-01) — closes the 2026-08-01T18:30 Lane 4 CLAIM. Documents the squash `2f72861d68` on PR #2338, the 3 stacked commits (P1 / functional / docs), the wrap-don't-reinvent violation that the original hand-rolled pterm wrapper was (called fake subcommands `pterm search` and `pterm run` that don't exist in the real pterm CLI), the 14 per-engine review READMEs + gepeto launcher + TAC rail 6 (vei.gradio-mcp). 4. Lane 5 — NATS broker deployment: slice 3 + slice 6 streams SHIPPED (2026-08-01) — closes the 2026-08-01T20:30 Lane 5 CLAIM. Documents the void-publishing bug, the 3 new streams added (COMFY_COLLAB, ROOMS, HELPDESK), the silent-discard hazard that the `limits` retention choice avoids, the out-of-scope items (TOKENISM_ATTRIBUTION migration is operational, not code; cross-node NATS mesh is a separate lane; voice subjects are a separate voice-fabric lane). The squash is pending — PR #2344 open, awaiting admin-merge. All 4 entries are trail-only (no code change). CHIT trail unsigned-local (no CHIT_PASSPHRASE in Mavis session). The lane-level CLAIM → RELEASE gaps are now closed; future admin-merges should land the RELEASE in the same commit that the operator squash-merges. Co-authored-by: Mavis <Mavis@pmoves.local>
Lane 4 — TTS test harness: pterm + gepeto + review READMEs
Refactors
pmoves/tools/test_all_tts_engines.pyto use Pinokio's realptermCLI surface (no more hand-rolled subprocess wrappers callingfake subcommands), adds a gepeto-style 1-click launcher, writes 14
per-engine review READMEs + a repo-level README, and codifies the
test+implement protocol as TAC rail 6 (
vei.gradio-mcp).Why this lane
The original
_resolve_pterm/_run_pterm/_parse_pterm_status/pterm_preflightwas a 180-line hand-rolled wrapper that calledpterm searchandpterm run— subcommands that DO NOT EXIST in thereal pterm CLI — and had a 50-line JSON → key=value → colon-separated-text
fallback parser because pterm's actual output format wasn't known.
This was a wrap-don't-reinvent violation. The real pterm surface
(documented in
pmoves/AGENTS.mdand theptermskill):What ships (3 stacked commits)
P1
4eb8de3f05(READMEs + gepeto launcher, +1591 lines, 20 files)pmoves/tools/test_all_tts_engines/engines/*.mdpmoves/tools/test_all_tts_engines/README.mdpmoves/tools/test_all_tts_engines/pinokio/(5 files: install.js, start.js, start-one.js, pinokio.js, pinokio.json)Functional
7e464c0122(pterm refactor + TAC rail 6, +337/-164, 2 files)pmoves/tools/test_all_tts_engines.py— REMOVED the 4 hand-rolled functions (180 lines), ADDEDpterm_bring_up_tts_studio/pterm_notify/pterm_clipboard_write+ thin helpers; main() gains--notifyand--clip-reportflagspmoves/configs/tac_trees/voice-engines-integration.tac.yaml— bumped to 1.1.0, NEWvei.gradio-mcprail with 9 childrenDocs
5a3ac29f41(AGNOTE CLAIM + spec doc, +229 lines, 2 files)pmoves/docs/AGENTS/AGNOTE4482PHI.t1.md— new CLAIM entry (Mavis::TTS-PTERM-GEPETO-REVIEW-READMES-CLAIM::2026-08-01)pmoves/docs/specs/tts-pterm-gepeto-review-readmes-2026-08-01.md— 12.8KB cold-read specTAC rail 6 —
vei.gradio-mcp(9 children)harnessfrom gradio_client import Clientis present (no mock)engine-countENGINES(grep for all 14 ids)per-engine-readmesengines/<id>.mdfiles existrepo-readmepmoves/tools/test_all_tts_engines/README.mdexistsgepeto-launcherinstall.js,start.js,start-one.js,pinokio.js,pinokio.jsonpterm-cleanpterm_bring_up_tts_studio/pterm_notify/pterm_clipboard_writeno-handrolled_resolve_pterm/_run_pterm/_parse_pterm_status/pterm_preflightare GONEpterm-call-shapeencoding="utf-8"tac-self-refValidation
test_all_tts_engines.pysyntax (AST parse)node --check)vei.gradio-mcprail with 9 childrenencoding="utf-8"pinned on pterm subprocess callsOut of scope
Ultimate-TTS-Studio up on a GPU node — that's a runtime gate, not
a structure gate).
fleet-fork-synclane).lane, since the flute-gateway already exposes
tts_list_engines/tts_synthesizeetc. via SSE per TAC rail 1vei.contract.mcp-tools).Spec
pmoves/docs/specs/tts-pterm-gepeto-review-readmes-2026-08-01.md—the cold-read doc for a fresh local model that picks this lane up in
a future session.
Trail
Mavis::TTS-PTERM-GEPETO-REVIEW-READMES-CLAIM::2026-08-01inpmoves/docs/AGENTS/AGNOTE4482PHI.t1.md. CHIT trail unsigned-local(no
CHIT_PASSPHRASEloaded in Mavis session).