mirror of
https://github.com/Comfy-Org/comfy-skills.git
synced 2026-11-04 23:37:45 +00:00
[PR #33] [MERGED] fix(skills): carry the bounce-retry qualifiers into generate-video/image/audio #35
Labels
No labels
pull-request
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set.
Reference
Comfy-Org/comfy-skills#35
Loading…
Add table
Add a link
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
📋 Pull Request Information
Original PR: https://github.com/Comfy-Org/comfy-skills/pull/33
Author: @mattmillerai
Created: 9/9/2026
Status: ✅ Merged
Merged: 9/16/2026
Merged by: @mattmillerai
Base:
fix/partner-generate-guess-and-bounce← Head:matt/be-10663-bounce-retry-qualifiers📝 Commits (1)
3e8cde6fix(skills): carry the bounce-retry qualifiers into generate-video/image/audio📊 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
ELI-5
When you ask for a paid partner model by name, the tool takes a guess at the model's slug. If the guess is wrong, the server doesn't just say "no" — it says "did you mean this one?", and sometimes "…and that one needs a tier passed in
params.model". #19 already taught the skills to retry with the suggested slug. This PR adds the three things that make the retry actually correct: carry the tier the bounce names (or you silently run a different-priced tier), say out loud which slug you swapped to (the suggestion is ranked by word overlap across the whole registry, so it can be a plausible-but-different model), and insidesubmit_batchresend only the item that bounced (its siblings are already queued and charged).What changed
Four sentences, in both the
skills/copy and itsclaude-code/commands/twin, extended to carry the three qualifiers from the mergedcomfy-cloud-mcp-serverrouting bullet (src/instructions.ts, PR #1389, copied frommainrather than from the branch):skills/comfy-generate-video.md— the "Family exists only as partner/API" bullet, and the Hailuo/MiniMax bullet.skills/comfy-generate-image.md/skills/comfy-generate-audio.md— Step 0.claude-code/commands/generate-{video,image,audio}.md— the same three sentences.#19's else-branch wording is unchanged in all six files (
"unknown model"with no close match named /"not yet implemented"→ Step 1, or the paidapi_*template per the video bullet) — verified: thewith no close match namedclause is still present in all 6.skills/comfy-generate-3d.mdis deliberately untouched, and this is verified rather than assumed:THREED_MODELSis{}insrc/partner/client/registry/threed.ts, and inassertPartnerModelSupported(src/tools-execution.ts) the branchargs.type !== 'image' && !modalityHasPersistSupport(args.type)throwstemplateRedirectMessagebeforepartnerUnknownModelMessagecan ever emit aDid you meanbounce. So the 3D skill's existing "continue below" is correct for every reachable outcome, and adding bounce-retry text there would describe an unreachable state.Why these three qualifiers — evidence read from
comfy-cloud-mcp-servermainsubmitBatchPartnerItemcallsassertPartnerModelSupported(item)per item, andpreflightBatchItemruns the same check acrossitems[]before the batch spend gate. The per-item outcome is deliberately isolated — the source comment reads "the tool promises failures land infailed[], so a healthy sibling still submits" — so a healthy sibling is queued and charged, which is exactly why a blanket resend of the whole batch double-charges.params.model.tierRoutingSentence(src/partner/model-search.ts) appends"<tier>" is a tier of <slug> — pass params: {"model": "<tier>"}.whenever the guess matched a tier. Re-calling the bare slug runs that entry's default tier at a different price.rankPartnerModelsscores by token overlap across the entire registry (and, since a later change, overparams.modeltier names too), so a suggestion can be a plausible-but-different model. A silent swap is how a user gets billed for a model they did not ask for.Verification
This repo has no test suite, linter or formatter (CI is
detect-unreviewed-merge.ymlonly), so verification is diff review plus checks against the artifacts named in the work item:grep -c "Did you mean"= 1 in each ofskills/comfy-generate-{video,image,audio}.md.git diff --name-only origin/main -- '*3d*'returns 0 files.before queuing,params.modeltier, say-which-slug,resend only the bounced item).Comfy-Org/comfy-cloud-mcp-servermain(not the PR branch):src/instructions.ts,src/partner/model-search.ts,src/tools-execution.ts,src/partner/client/registry/threed.ts.Pre-flighting the upstream
guide-negative-claimslintAfter merge, the mcp-server's
refresh-skills.ymlopens a snapshot PR and runssrc/guide-negative-claims.test.tsagainst it. Rather than discover that lint's verdict from a draft PR with a> [!WARNING]banner, I ported itslogicalLines/splitSentences/deniesCapability/claimFingerprintlogic and ran it over the changed files at three revisions. Results:NEGATIVE_CLAIM_INVENTORYrows made stalemain→ #19 base)main→ head)This is the lint working as designed — it exists to make a changed negative claim a deliberate act — not a sign the wording is wrong, so the fix is inventory rows upstream, not a reworded snapshot. The important part is which row is mine, and it is called out under Residual below.
Judgment calls
REVIEW_REQUIRED, mergeable, opened 2026-08-20) and none of its rewrite is onmain. The standing fleet directive is the opposite of stopping — when the blocker is an unmerged PR that carries buildable code, stack on its branch rather than gate — and stacking also satisfies the prerequisite's actual intent, which was "do not fork a competing rewrite of the same lines": this branch builds on #19's exact text and re-words none of it.claude-code/commands/generate-video.md. The work item said to mirror it "if that file carries the Hailuo bullet". It carries a Hailuo bullet (line 60), but that bullet is about telling the oldhailuofamily apart from H3 — it contains no slug-refusal clause to extend, so appending a bounce-retry qualifier there would be a non-sequitur. The commands twin's Step 0 partner bullet already carries the full qualifier set, so the guidance is not missing from that file.Did you mean: …marker and the before-queuing point are carried verbatim in substance.Provenance
detect-unreviewed-merge.ymlonly); diff review — 4 sentences × their copies, 6 files, 7 insertions / 7 deletions, nothing else touched;grep -c "Did you mean"= 1 in each of the threeskills/generate files; 3D diff vsorigin/main= 0 files; else-branch clause intact in 6/6 files; portedguide-negative-claimslint run over the changed files at 3 revisions (results tabled above).claude-code/commands/generate-video.md(that file's Hailuo bullet has no slug-refusal clause to extend); wording restructured for readability as described under Judgment calls.Residual
NEGATIVE_CLAIM_INVENTORYrow goes stale because of this PR specifically, and it is outside the scope of the ticket that owns the inventory refresh. That work item is scoped to updating the inventory after #19's reword; the row this PR invalidates is the Hailuo/MiniMax one, which #19 never touches:Confirm the live set withsearch_models({ source: "partner", q: "minimax" })rather than trusting this list; if a slug is refused, the "unknown model" bounce names the closest real one.inComfy-Org/comfy-cloud-mcp-serversrc/guide-negative-claims.ts. Its new rendered form ends… names the closest real one — re-call with that slug (and anyparams.modeltier it names), saying which one you switched to.Unless that row is updated alongside #19's, the refresh PR will failguide-negative-claims.test.ts's "no inventory row is stale" assertion on a row nobody is expecting, in addition to the 8 unrecorded claims themain→ head comparison produces. Bothguide-negative-claims.test.tsandguide-capability-assertions.test.tsare unexercised artifacts here — they live in another repo and run against a snapshot that does not exist untilrefresh-skills.ymlbuilds it, so the table above is a faithful port of the lint's logic, not a run of the real suite.main, not from the mechanism the work item cited. The work item justified "resend only the bounced item" viamapWithConcurrency(items, BATCH_SUBMIT_CONCURRENCY=4, …)racing siblings into the queue. Onmaintoday,preflightBatchItemstatically rejects doomed partner items before the spend gate, so the concurrency race is no longer the operative mechanism. The shipped guidance is still correct, for the reason quoted above — per-item failure isolation means healthy siblings submit and are charged regardless — but a reader reconciling this text against the cited concurrency evidence should know the two no longer describe the same code path.partner_generate/submit_batchcall was made. This change adds a recovery path rather than denying a capability, so the falsification trigger is not load-bearing here; nonetheless the premises it encodes (Did you meansuggestions, theparams.modeltier redirect, per-item batch isolation, the empty 3D registry) were verified by reading the merged source of record oncomfy-cloud-mcp-servermain, not by exercising the live MCP server, for which this environment has no credentials.claude-code/commands/generate-video.mddid not receive the Hailuo mirror, per the judgment call above. If a maintainer wants that file's Hailuo bullet to restate the retry rule anyway, it needs a slug-refusal clause written first — it has none today.🔄 This issue represents a GitHub Pull Request. It cannot be merged through Gitea due to API limitations.