[PR #19] fix(skills): reword partner_generate routing to guess-and-bounce (BE-8057) #19

Open
opened 2026-10-26 22:34:01 +00:00 by bsakaguchi · 0 comments
Owner

📋 Pull Request Information

Original PR: https://github.com/Comfy-Org/comfy-skills/pull/19
Author: @mattmillerai
Created: 8/20/2026
Status: 🔄 Open

Base: main ← Head: fix/partner-generate-guess-and-bounce


📝 Commits (7)

  • 5191de1 fix(skills): reword partner_generate routing to guess-and-bounce
  • b0a019f fix(skills): retry the slug partner_generate names, and port to the plugin
  • 3e8cde6 fix(skills): carry the bounce-retry qualifiers into generate-video/image/audio
  • 56f4893 Merge pull request #33 from Comfy-Org/matt/be-10663-bounce-retry-qualifiers
  • d3d0353 Merge origin/main into fix/partner-generate-guess-and-bounce
  • 2c477ff fix(generate): retry a bounced partner slug only within the guessed provider
  • 58eb943 fix(generate): stop after the single partner_generate re-call

📊 Changes

6 files changed (+7 additions, -7 deletions)

View changed files

📝 claude-code/commands/generate-audio.md (+1 -1)
📝 claude-code/commands/generate-image.md (+1 -1)
📝 claude-code/commands/generate-video.md (+1 -1)
📝 skills/comfy-generate-audio.md (+1 -1)
📝 skills/comfy-generate-image.md (+1 -1)
📝 skills/comfy-generate-video.md (+2 -2)

📄 Description

ELI5

The image, video and audio instructions told the assistant to pick a model from a list the paid-provider generator publishes — but that list never existed, so the assistant gave up on the fast paid route. Now it guesses a model name, and if the guess is wrong the service replies with the closest real names, so it retries once with one of those and says which one it switched to. It only retries with a name from the same provider the user asked for; if the closest names belong to a different provider, it asks the user first instead of charging them for a provider they never picked.

The false premise

skills/comfy-generate-{video,audio,image}.md each pointed at partner_generate's tool description "for the currently-wired model ids". The registered description (Comfy-Org/comfy-cloud-mcp-server src/tools-execution.ts:1097, main @ 2fbbb8ae — re-read at authoring time, verbatim) does not contain one:

Generate image/video/audio via a partner provider (Grok, Gemini, Flux, OpenAI, Kling, ByteDance, ElevenLabs, …). … Named provider → call this NOW with a best-guess slug (e.g. bfl/flux-2-pro); a wrong one bounces back naming the closest real slugs — skip the lookup.

Providers, one example slug, and an explicit instruction to guess. No model ids, and per the ticket's research none ever.

What changed

Three lines, one per file, all on skills/:

File Line Change
skills/comfy-generate-video.md 7 The "Family exists only as partner/API" bullet: "one of the model ids partner_generate's own tool description lists" → "one of the providers partner_generate names, or you can guess a plausible slug for it"; "serves only the slugs it lists" → the bounce-corrects-you framing.
skills/comfy-generate-audio.md 5 Step 0: "see its tool description for the currently-wired model ids. Pass … the partner's model slug" → "its description names providers, not model ids, so pass … your best-guess model slug (a wrong one bounces back naming the closest real slugs)".
skills/comfy-generate-image.md 5 Same as audio.

Review round (commit b0a019f)

Two gaps surfaced in review, both fixed:

a. Retry the bounce. The reword told the agent a wrong slug "bounces back naming the closest real slugs" but never said to use them — so the guidance stopped one step short of the behavior it argued for: guess, receive a correction, then fall through to the workflow path anyway. All three skills now say to retry once with the closest slug named, and their fall-through narrows to "unknown model" with no close match named (the wording the video bullet already used downstream). Raised by CodeRabbit; valid and in scope.

b. Ported to the canonical surface. See the revised Residual section below — the original scope call is reversed, deliberately.

Everything else in each Step 0 is byte-identical (apart from main's later "build/create a workflow → skip partner_generate" sentence, carried through the merge described below), including the "unknown model" / "not yet implemented" fall-through in audio/image and the video bullet's api_*-template-via-run_template recovery, which is load-bearing (MiniMax H3's r2v/flf2v shapes route that way per the file's own model-facts section). The MiniMax model-facts bullets rewritten by #18 are untouched, as is data/skills.json in comfy-cloud-mcp-server (the mirror — patching it is reverted by refresh-skills.yml).

Bounce-retry qualifiers (#33, merged into this branch as 3e8cde6)

Stacked PR #33 extended the retry sentence in all six files (plus the Hailuo/MiniMax bullet in skills/comfy-generate-video.md) with the three qualifiers from the merged comfy-cloud-mcp-server routing bullet: the rejection happens before queuing and names its suggestions as Did you mean: …. A tier-shaped guess must be retried with the named params.model tier, because re-calling the bare slug runs a differently priced default tier. The substituted slug must be stated, since suggestions are ranked by token overlap across the whole registry. Inside submit_batch, only the bounced item is resent, because its siblings may already be queued and charged. generate-3d stays untouched on purpose: with an empty 3D registry the server returns its does-not-serve-type redirect before any "Did you mean" bounce. The net diff is now 6 files, 7 insertions and 7 deletions.

Same-provider retry gate (2c477ff)

CodeRabbit pointed out that the Did you mean suggestions are ranked across the whole registry, so the top one can come from a provider the user never named, and the retry is the call that queues and charges. In all six Step 0 blocks the retry now fires only when the suggested slug keeps the guessed slug's provider prefix. Otherwise the agent stops and asks which model to use. The MiniMax/Hailuo bullet carries the same limit: it retries only with a minimax/ slug. This matches the server's own unknown-model routing bullet, which also gates the re-call on a suggestion for the guessed provider.

One re-call, then stop (58eb943)

CodeRabbit pointed out that none of the six Step 0 blocks said what to do when the single re-call bounces again. Each block now says: do not re-call a second time, and handle it as "unknown model" with no close match named. That reuses the fallback each file already defines.

Merge with main (d3d0353)

main had since appended one sentence to the same Step 0 / partner-only bullet in all six files: partner_generate returns only the output, never a workflow, so a request to BUILD or CREATE a workflow skips it. The conflict was resolved by keeping this PR's guess-and-bounce wording and appending main's sentence verbatim, so both intents survive. The net diff against main is unchanged: 6 files, 7 insertions, 7 deletions.

Verification — guess-and-bounce actually works

comfy-skills has no test or lint toolchain (no package.json, Makefile, or pre-commit; its only CI workflow is the SOC 2 unreviewed-merge detector), so the substantive check is the prose against the server. Probed in-process against the comfy-cloud-mcp-server clone at 2fbbb8ae via partnerUnknownModelMessage() — the pure message builder, no dispatch, no credits, no network:

Guess Bounce
kling/kling-3-turbo (video) unknown model … **Did you mean: kling/kling-3.0-turbo-t2v, kling/kling-v3-t2v?**
openai/gpt-image-2 (image) unknown model … **Did you mean: openai/images-generations, bfl/flux-2-max, bfl/flux-2-pro, …?**
elevenlabs/eleven-v3 (audio) unknown model … **Did you mean: elevenlabs/sound-generation?**
minimax/hailuo-02, openai/sora-2 (video) unknown model … with no "Did you mean", falling through to Discover registered partner models with search_models (they carry source:"partner") or search_nodes (category "partner/").

So a wrong slug does cost one call and does name the closest real slugs — across all three modalities the edited files cover. Note the plural: the bounce names up to five, which is why the audio/image wording says "slugs".

Negative-claim falsification

The diff keeps a capability denial in the video bullet — "Many paid video families still are not served by it and come back "unknown model" with no close match named" — so per the #581 regression rule I went and tried to break it rather than assert it:

  • The live registry (src/partner/client/registry/, what partner_generate resolves against) holds 20 slugs total: 15 image, 4 video, 1 audio. The four video ones are byteplus/seedance-2.0-t2v, kling/kling-3.0-turbo-t2v, kling/kling-v3-t2v, veo/veo-3-t2v.
  • The partner catalog by contrast carries 76 video entries across ~20 providers (bria, heygen, hitpaw, ltx, minimax, moonvalley, openai, pika, pixverse, runway, topaz, vidu, wan, xai, …), none of which resolve. The catalog file's own header marks it parked with no runtime reader.
  • The non-direct route does not rescue them either: src/partner/workflows/ covers bfl, vertexai, xai only.
  • Probing the families the video file itself names — MiniMax, Sora, Runway — reproduces unknown model with no close match, as tabled above.

The denial is therefore true as written and bounded: it is scoped to "many … families", not to the tool, and the sentence immediately after it (unchanged) redirects to a route that does work — the family's own api_* template via run_template. The net direction of this PR is capability-expanding: it removes a false premise that was causing agents to skip partner_generate altogether.

One nuance I did not fold in, deliberately: on a no-close-match bounce the server still points at search_models({source: "partner"}) as a live discovery path. The tool description tells agents to "skip the lookup", and the existing run_template redirect already keeps the branch from being a dead end, so adding a third pointer here would both contradict the tool and exceed this ticket's scope.

Residual — scope reversed: the plugin surface IS now patched

The original revision of this PR deliberately touched skills/ only, and this section argued the claude-code/ fork should be left alone because partially patching a stale file leaves it internally inconsistent. That call is reversed in b0a019f, for a reason found in review and not visible when the original scope was set:

README.md names claude-code/commands/ the canonical surface — "the slash commands … Edit commands here" — and skills/ "legacy … Frozen; will be removed once that installer fully retires."

So the original three-file change landed only in the frozen copy. The fix shipped to nobody who installs the plugin.

Worse, the two commands files were not merely stale on this one span — they still gated partner routing on `category: "api node/"`, the dead prefix cf7949d removed from skills/ after establishing it "matches ZERO nodes — the live catalog files them under partner/". On the installed plugin the partner shortcut therefore could never fire: every named provider failed the category check and fell through to the workflow path, which is precisely the failure mode this PR exists to fix, one layer down. Porting the wording without that retarget would have been inert.

b0a019f therefore ports Step 0 into claude-code/commands/generate-{audio,image,video}.md and retargets api node/ → partner/ in the same sentence. generate-audio.md:9 and generate-image.md:9 are now byte-identical to their skills/ counterparts, so the "internally inconsistent" objection does not apply to them at all; generate-video.md:11 remains a partial patch of a file still missing the #15/#17/#18 material, and that is the one place the original objection still has force — flagged rather than papered over.

Still deliberately unfixed, deferred to follow-ups:

  • claude-code/commands/generate-3d.md — still carried api node/3d, the same dead prefix. main has since retargeted it, so after the merge no api node/ reference remains anywhere in the repo.
  • The wider skills/ ↔ claude-code/commands/ drift — the MiniMax H3 route disambiguation, the api_*-template recovery, the "Family exists only as OSS" bullet, and the OSS-vs-paid consent prompt. This needs a human decision, not a sync: README's authoring rule ("never hard-code … which model names are live") is in direct tension with skills/comfy-generate-video.md, which names MiniMax H3, Hailuo and specific node classes inline. Blind-syncing would push the canonical surface against its own stated rule. CodeRabbit's request to give audio/image the video skill's both-routes-and-ask treatment falls inside this same decision and is deferred with it.

Refs still stands rather than Closes: the sync-or-delete question remains open.

Judgment calls

  • "closest real ones" / "closest real slugs" (plural) rather than the ticket's "the closest real one" — the bounce empirically names up to five, and the tool's own description says "slugs".
  • Kept "unknown model" in the video bullet rather than dropping the denial entirely, on the falsification evidence above.
  • Reversed the "nothing outside skills/" scope call in the review round, on the README evidence that skills/ is the frozen copy and claude-code/commands/ the canonical one — a skills-only fix ships to nobody. Confined to Step 0 of the three files this PR already edits; the rest of the fork's drift is deferred, not swept in.
  • Retarget bundled, not split out — api node/ → partner/ sits in the very sentence being rewritten, and the ported guidance is dead without it. Splitting it into its own PR would have merged known-inert prose.

Unexercised

  • partner_generate was never actually called. Verification is read/pure-function only (registry contents + the message builder); dispatching a real partner generation spends credits and money, so it is out of bounds for this loop. The claim under test — what the bounce says on a wrong slug — is fully determined by partnerUnknownModelMessage, which is what I ran.
  • Ground truth is pinned to comfy-cloud-mcp-server main @ 2fbbb8ae, the commit the ticket names and the current origin/main at authoring time. If the tool description moves again this prose needs a re-read.

Provenance

  • Authored by: agent-work loop
  • Verified:
    • claude plugin validate ./claude-code prints "Validation passed" on the current head (58eb943).
    • claude-code/commands/generate-{audio,image}.md:9 is byte-identical to skills/comfy-generate-{audio,image}.md:5.
    • grep -rn "api node/" finds no hits anywhere in the repo.
    • git diff --shortstat origin/main...HEAD = 6 files, 7 insertions, 7 deletions (in-line rewording only).
    • Bounce table above: a read-only npx tsx probe of partnerUnknownModelMessage() and the partner registry at comfy-cloud-mcp-server @ 2fbbb8ae, with no dispatch.
    • The repo has no test or lint suite; its only CI workflow is the unreviewed-merge detector.
  • Deviations:
    • The scope grew from three skills/ files to their claude-code/commands/ twins. The rationale is in Residual.
    • #33's bounce-retry qualifiers were merged into this branch, so the head now carries them as well.
    • main was merged in to clear a conflict. Its new "build a workflow → skip partner_generate" sentence is kept alongside this PR's wording.
    • Review added a same-provider gate on the retry (a cross-provider suggestion now asks the user) and a one-re-call limit (a second bounce falls back as no close match).
    • The wider fork drift stays unfixed and is deferred. partner_generate was never actually called (see Unexercised).

Refs BE-8057, BE-6922.


🔄 This issue represents a GitHub Pull Request. It cannot be merged through Gitea due to API limitations.

## 📋 Pull Request Information **Original PR:** https://github.com/Comfy-Org/comfy-skills/pull/19 **Author:** [@mattmillerai](https://github.com/mattmillerai) **Created:** 8/20/2026 **Status:** 🔄 Open **Base:** `main` ← **Head:** `fix/partner-generate-guess-and-bounce` --- ### 📝 Commits (7) - [`5191de1`](https://github.com/Comfy-Org/comfy-skills/commit/5191de1d3291c9a118a24014a6f62d7b3cae74d8) fix(skills): reword partner_generate routing to guess-and-bounce - [`b0a019f`](https://github.com/Comfy-Org/comfy-skills/commit/b0a019f6ad0718f39fafa5a8323873929e345a41) fix(skills): retry the slug partner_generate names, and port to the plugin - [`3e8cde6`](https://github.com/Comfy-Org/comfy-skills/commit/3e8cde6051257b32b35ae53db1f0f3579adce0e1) fix(skills): carry the bounce-retry qualifiers into generate-video/image/audio - [`56f4893`](https://github.com/Comfy-Org/comfy-skills/commit/56f4893b3402753653833db58e30bb27a93aaa8b) Merge pull request #33 from Comfy-Org/matt/be-10663-bounce-retry-qualifiers - [`d3d0353`](https://github.com/Comfy-Org/comfy-skills/commit/d3d03533490c9f3890f0099f64ea41394c65158f) Merge origin/main into fix/partner-generate-guess-and-bounce - [`2c477ff`](https://github.com/Comfy-Org/comfy-skills/commit/2c477ffac42edcba92196fc33e1c7a61fdce1d69) fix(generate): retry a bounced partner slug only within the guessed provider - [`58eb943`](https://github.com/Comfy-Org/comfy-skills/commit/58eb94316d7d21f469e0c74b24b6d9947b772023) fix(generate): stop after the single partner_generate re-call ### 📊 Changes **6 files changed** (+7 additions, -7 deletions) <details> <summary>View changed files</summary> 📝 `claude-code/commands/generate-audio.md` (+1 -1) 📝 `claude-code/commands/generate-image.md` (+1 -1) 📝 `claude-code/commands/generate-video.md` (+1 -1) 📝 `skills/comfy-generate-audio.md` (+1 -1) 📝 `skills/comfy-generate-image.md` (+1 -1) 📝 `skills/comfy-generate-video.md` (+2 -2) </details> ### 📄 Description ## ELI5 The image, video and audio instructions told the assistant to pick a model from a list the paid-provider generator publishes — but that list never existed, so the assistant gave up on the fast paid route. Now it guesses a model name, and if the guess is wrong the service replies with the closest real names, so it retries once with one of those and says which one it switched to. It only retries with a name from the same provider the user asked for; if the closest names belong to a different provider, it asks the user first instead of charging them for a provider they never picked. ## The false premise `skills/comfy-generate-{video,audio,image}.md` each pointed at `partner_generate`'s tool description "for the currently-wired model ids". The registered description (`Comfy-Org/comfy-cloud-mcp-server` `src/tools-execution.ts:1097`, `main` @ `2fbbb8ae` — re-read at authoring time, verbatim) does not contain one: > Generate image/video/audio via a partner provider (Grok, Gemini, Flux, OpenAI, Kling, ByteDance, ElevenLabs, …). … **Named provider → call this NOW with a best-guess slug (e.g. `bfl/flux-2-pro`); a wrong one bounces back naming the closest real slugs — skip the lookup.** Providers, one example slug, and an explicit instruction to guess. No model ids, and per the ticket's research none ever. ## What changed Three lines, one per file, all on `skills/`: | File | Line | Change | |---|---|---| | `skills/comfy-generate-video.md` | 7 | The "Family exists only as partner/API" bullet: "one of the model ids `partner_generate`'s own tool description lists" → "one of the providers `partner_generate` names, or you can guess a plausible slug for it"; "serves only the slugs it lists" → the bounce-corrects-you framing. | | `skills/comfy-generate-audio.md` | 5 | Step 0: "see its tool description for the currently-wired model ids. Pass … the partner's model slug" → "its description names providers, not model ids, so pass … your best-guess model slug (a wrong one bounces back naming the closest real slugs)". | | `skills/comfy-generate-image.md` | 5 | Same as audio. | ### Review round (commit `b0a019f`) Two gaps surfaced in review, both fixed: **a. Retry the bounce.** The reword told the agent a wrong slug "bounces back naming the closest real slugs" but never said to *use* them — so the guidance stopped one step short of the behavior it argued for: guess, receive a correction, then fall through to the workflow path anyway. All three skills now say to retry once with the closest slug named, and their fall-through narrows to `"unknown model"` **with no close match named** (the wording the video bullet already used downstream). Raised by CodeRabbit; valid and in scope. **b. Ported to the canonical surface.** See the revised Residual section below — the original scope call is reversed, deliberately. Everything else in each Step 0 is byte-identical (apart from `main`'s later "build/create a workflow → skip `partner_generate`" sentence, carried through the merge described below), including the `"unknown model"` / `"not yet implemented"` fall-through in audio/image and the video bullet's `api_*`-template-via-`run_template` recovery, which is load-bearing (MiniMax H3's r2v/flf2v shapes route that way per the file's own model-facts section). The MiniMax model-facts bullets rewritten by #18 are untouched, as is `data/skills.json` in `comfy-cloud-mcp-server` (the mirror — patching it is reverted by `refresh-skills.yml`). ### Bounce-retry qualifiers (#33, merged into this branch as `3e8cde6`) Stacked PR #33 extended the retry sentence in all six files (plus the Hailuo/MiniMax bullet in `skills/comfy-generate-video.md`) with the three qualifiers from the merged `comfy-cloud-mcp-server` routing bullet: the rejection happens **before queuing** and names its suggestions as `Did you mean: …`. A tier-shaped guess must be retried with the named `params.model` tier, because re-calling the bare slug runs a differently priced default tier. The substituted slug must be **stated**, since suggestions are ranked by token overlap across the whole registry. Inside `submit_batch`, **only the bounced item** is resent, because its siblings may already be queued and charged. `generate-3d` stays untouched on purpose: with an empty 3D registry the server returns its does-not-serve-type redirect before any "Did you mean" bounce. The net diff is now 6 files, 7 insertions and 7 deletions. ### Same-provider retry gate (`2c477ff`) CodeRabbit pointed out that the `Did you mean` suggestions are ranked across the whole registry, so the top one can come from a provider the user never named, and the retry is the call that queues and charges. In all six Step 0 blocks the retry now fires only when the suggested slug keeps the guessed slug's provider prefix. Otherwise the agent stops and asks which model to use. The MiniMax/Hailuo bullet carries the same limit: it retries only with a `minimax/` slug. This matches the server's own unknown-model routing bullet, which also gates the re-call on a suggestion for the guessed provider. ### One re-call, then stop (`58eb943`) CodeRabbit pointed out that none of the six Step 0 blocks said what to do when the single re-call bounces again. Each block now says: do not re-call a second time, and handle it as "unknown model" with no close match named. That reuses the fallback each file already defines. ### Merge with `main` (`d3d0353`) `main` had since appended one sentence to the same Step 0 / partner-only bullet in all six files: `partner_generate` returns only the output, never a workflow, so a request to BUILD or CREATE a workflow skips it. The conflict was resolved by keeping this PR's guess-and-bounce wording and appending `main`'s sentence verbatim, so both intents survive. The net diff against `main` is unchanged: 6 files, 7 insertions, 7 deletions. ## Verification — guess-and-bounce actually works `comfy-skills` has no test or lint toolchain (no `package.json`, `Makefile`, or pre-commit; its only CI workflow is the SOC 2 unreviewed-merge detector), so the substantive check is the prose against the server. Probed in-process against the `comfy-cloud-mcp-server` clone at `2fbbb8ae` via `partnerUnknownModelMessage()` — the pure message builder, **no dispatch, no credits, no network**: | Guess | Bounce | |---|---| | `kling/kling-3-turbo` (video) | `unknown model … **Did you mean: kling/kling-3.0-turbo-t2v, kling/kling-v3-t2v?**` | | `openai/gpt-image-2` (image) | `unknown model … **Did you mean: openai/images-generations, bfl/flux-2-max, bfl/flux-2-pro, …?**` | | `elevenlabs/eleven-v3` (audio) | `unknown model … **Did you mean: elevenlabs/sound-generation?**` | | `minimax/hailuo-02`, `openai/sora-2` (video) | `unknown model …` with **no** "Did you mean", falling through to `Discover registered partner models with search_models (they carry source:"partner") or search_nodes (category "partner/").` | So a wrong slug does cost one call and does name the closest real slugs — across all three modalities the edited files cover. Note the plural: the bounce names up to five, which is why the audio/image wording says "slugs". ## Negative-claim falsification The diff keeps a capability denial in the video bullet — "Many paid video families still are not served by it and come back `"unknown model"` with no close match named" — so per the `#581` regression rule I went and tried to break it rather than assert it: * The live registry (`src/partner/client/registry/`, what `partner_generate` resolves against) holds **20 slugs total: 15 image, 4 video, 1 audio**. The four video ones are `byteplus/seedance-2.0-t2v`, `kling/kling-3.0-turbo-t2v`, `kling/kling-v3-t2v`, `veo/veo-3-t2v`. * The partner catalog by contrast carries **76 video entries across ~20 providers** (bria, heygen, hitpaw, ltx, minimax, moonvalley, openai, pika, pixverse, runway, topaz, vidu, wan, xai, …), none of which resolve. The catalog file's own header marks it parked with no runtime reader. * The non-direct route does not rescue them either: `src/partner/workflows/` covers `bfl`, `vertexai`, `xai` only. * Probing the families the video file itself names — MiniMax, Sora, Runway — reproduces `unknown model` with no close match, as tabled above. The denial is therefore true as written and **bounded**: it is scoped to "many … families", not to the tool, and the sentence immediately after it (unchanged) redirects to a route that does work — the family's own `api_*` template via `run_template`. The net direction of this PR is capability-**expanding**: it removes a false premise that was causing agents to skip `partner_generate` altogether. One nuance I did **not** fold in, deliberately: on a no-close-match bounce the server still points at `search_models({source: "partner"})` as a live discovery path. The tool description tells agents to "skip the lookup", and the existing `run_template` redirect already keeps the branch from being a dead end, so adding a third pointer here would both contradict the tool and exceed this ticket's scope. ## Residual — scope reversed: the plugin surface IS now patched The original revision of this PR deliberately touched `skills/` only, and this section argued the `claude-code/` fork should be left alone because partially patching a stale file leaves it internally inconsistent. **That call is reversed in `b0a019f`**, for a reason found in review and not visible when the original scope was set: > `README.md` names `claude-code/commands/` the canonical surface — *"the slash commands … **Edit commands here**"* — and `skills/` *"legacy … Frozen; will be removed once that installer fully retires."* So the original three-file change landed **only in the frozen copy**. The fix shipped to nobody who installs the plugin. Worse, the two commands files were not merely stale on this one span — they still gated partner routing on `` `category: "api node/"` ``, the dead prefix `cf7949d` removed from `skills/` after establishing it *"matches ZERO nodes — the live catalog files them under `partner/`"*. On the installed plugin the partner shortcut therefore **could never fire**: every named provider failed the category check and fell through to the workflow path, which is precisely the failure mode this PR exists to fix, one layer down. Porting the wording without that retarget would have been inert. `b0a019f` therefore ports Step 0 into `claude-code/commands/generate-{audio,image,video}.md` and retargets `api node/` → `partner/` in the same sentence. `generate-audio.md:9` and `generate-image.md:9` are now **byte-identical** to their `skills/` counterparts, so the "internally inconsistent" objection does not apply to them at all; `generate-video.md:11` remains a partial patch of a file still missing the `#15`/`#17`/`#18` material, and that is the one place the original objection still has force — flagged rather than papered over. **Still deliberately unfixed, deferred to follow-ups:** * ~~`claude-code/commands/generate-3d.md` — still carried `api node/3d`, the same dead prefix.~~ `main` has since retargeted it, so after the merge no `api node/` reference remains anywhere in the repo. * The wider `skills/` ↔ `claude-code/commands/` drift — the MiniMax H3 route disambiguation, the `api_*`-template recovery, the "Family exists only as OSS" bullet, and the OSS-vs-paid consent prompt. This needs a **human decision, not a sync**: README's authoring rule ("never hard-code … which model names are live") is in direct tension with `skills/comfy-generate-video.md`, which names MiniMax H3, Hailuo and specific node classes inline. Blind-syncing would push the canonical surface against its own stated rule. CodeRabbit's request to give audio/image the video skill's both-routes-and-ask treatment falls inside this same decision and is deferred with it. `Refs` still stands rather than `Closes`: the sync-or-delete question remains open. ## Judgment calls * **"closest real ones" / "closest real slugs" (plural)** rather than the ticket's "the closest real one" — the bounce empirically names up to five, and the tool's own description says "slugs". * **Kept `"unknown model"` in the video bullet** rather than dropping the denial entirely, on the falsification evidence above. * **Reversed the "nothing outside `skills/`" scope call** in the review round, on the README evidence that `skills/` is the frozen copy and `claude-code/commands/` the canonical one — a skills-only fix ships to nobody. Confined to Step 0 of the three files this PR already edits; the rest of the fork's drift is deferred, not swept in. * **Retarget bundled, not split out** — `api node/` → `partner/` sits in the very sentence being rewritten, and the ported guidance is dead without it. Splitting it into its own PR would have merged known-inert prose. ## Unexercised * `partner_generate` was never actually **called**. Verification is read/pure-function only (registry contents + the message builder); dispatching a real partner generation spends credits and money, so it is out of bounds for this loop. The claim under test — what the bounce says on a wrong slug — is fully determined by `partnerUnknownModelMessage`, which is what I ran. * Ground truth is pinned to `comfy-cloud-mcp-server` `main` @ `2fbbb8ae`, the commit the ticket names and the current `origin/main` at authoring time. If the tool description moves again this prose needs a re-read. ## Provenance - **Authored by:** agent-work loop - **Verified:** - `claude plugin validate ./claude-code` prints "Validation passed" on the current head (`58eb943`). - `claude-code/commands/generate-{audio,image}.md:9` is byte-identical to `skills/comfy-generate-{audio,image}.md:5`. - `grep -rn "api node/"` finds no hits anywhere in the repo. - `git diff --shortstat origin/main...HEAD` = 6 files, 7 insertions, 7 deletions (in-line rewording only). - Bounce table above: a read-only `npx tsx` probe of `partnerUnknownModelMessage()` and the partner registry at `comfy-cloud-mcp-server` @ `2fbbb8ae`, with no dispatch. - The repo has no test or lint suite; its only CI workflow is the unreviewed-merge detector. - **Deviations:** - The scope grew from three `skills/` files to their `claude-code/commands/` twins. The rationale is in Residual. - #33's bounce-retry qualifiers were merged into this branch, so the head now carries them as well. - `main` was merged in to clear a conflict. Its new "build a workflow → skip `partner_generate`" sentence is kept alongside this PR's wording. - Review added a same-provider gate on the retry (a cross-provider suggestion now asks the user) and a one-re-call limit (a second bounce falls back as no close match). - The wider fork drift stays unfixed and is deferred. `partner_generate` was never actually called (see Unexercised). Refs BE-8057, BE-6922. --- <sub>🔄 This issue represents a GitHub Pull Request. It cannot be merged through Gitea due to API limitations.</sub>
Sign in to join this conversation.
No labels
pull-request
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
Comfy-Org/comfy-skills#19
No description provided.