Repository navigation
ISS-14039: Accept a Fable review for a Claude cloud import - #427
Merged
Merged
Conversation
A Claude-provider cloud import's independent-review gate (refresh-import, ready and the PR guard) now accepts a Codex review or a review whose trace proves the Fable 5.2 model, neither from the session's writer. A Codex-provider import still needs a Claude review. Review receipts record the model their trace shows, and the handoff receipt check refuses a recorded model the trace does not show. The Claude launcher takes an optional reviewModel for the four review roles and refuses any other role or model with REVIEW_MODEL_REFUSED. vibe-core 1.0.5, vibe 1.1.82.
The cloud gate's comment now cites the operator ruling by date and ticket, as plugin text does elsewhere.
Records the reworded gate comment under vibe-core 1.0.5.
The launcher's entry point runs at module load, so an argv mistake reached safeFailure before the ReviewModelError class was initialized and the launcher crashed with no output. The class and its code now sit with the other module constants.
shafty023
added a commit
that referenced
this pull request
Nov 12, 2026
ISS-14039 (#427) took vibe 1.1.82 and vibe-core 1.0.5. Keep both sides of the claude-worker launcher (the broken-provider mapping and the review model), rebuild the bundles, drop the ticket slugs the merge brought into runtime files, and remeasure the word count against the new main.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
refreshImportWitnessandcloudPrProblemin vibe-core'slib/vibe/scripts/cloud-worker.mjsrequired a receipt with runtimecodex. With Codex limit-stopped on both machines, three PRs were blocked. Operator ruling (2026-11-11): "Accept a Fable review instead".claude-fable-5-2. The receipt counts only if it is not from the session's writer (vibe-writer.jsonwriter id or a migrated one). A Codex-provider import still needs a Claude review, unchanged. The refusal readsindependent codex or Fable 5.2 (claude-fable-5-2) review is missing. The PR guard's retry text names both reviewers. The accepted ids are one list,FABLE_REVIEW_MODELSin newlib/vibe/scripts/review-models.mjs.captureReviewReceipt(lib/handoff/scripts/review-receipts.mjs) recordsmodelfrom the launcher trace, which is the CLI's own stream-json output. Every init record and every assistant message must name one model; otherwise the field is null. A probe ofclaude --print --output-format stream-json --model fablerecordedclaude-fable-5-2in both places. The handoff receipt check refuses a recorded model the trace does not show.verifiedReviewModelre-reads the fingerprinted trace for the gate. Receipts from before this release have nomodeland still pass handoff, but they prove no model.claude-worker.mjstakes an optionalreviewModel(one ofFABLE_REVIEW_MODELS) for the four receipt review roles only. It is passed to--modeland the agent definition. A wrong role or an unknown model fails before launch withREVIEW_MODEL_REFUSEDand its reason, not the generic turn failure. The bundles are rebuilt.VIBE_CORE_MIN1.0.5). The README line and pin tests are bumped. CHANGELOG entries are added. Docs: the handoff PR reference and fleet-orchestrator's Cloud workers line.cloud-worker.mjsand to thereviewModelinput inclaude-worker.ts, because ISS-13446's branch edits both files.Breaking changes
None. Additive: a new optional launcher input and a new receipt field. Old receipts behave as before.
Test plan
review-receipts.test.mjscase: model recorded from the trace; null for mixed, relaunched or init-less traces; forged model refused; legacy receipt still passes; trace changed after capture proves nothing.vibe-triage.test.mjsISS-14039 case on real receipts and the real gate. Opus refused. Forged Fable claim refused. The writer's own Fable or Codex review refused. A Fable review passesrefresh-import,cloudPrProblemandready. A later trace edit is refused. The injected Codex-receipt cases still pass.claude-worker.test.tscase: a review role runs with--model claude-fable-5-2; without the input it keeps its own model. A wrong role and an unknown model returnREVIEW_MODEL_REFUSEDwith the reason.code_tests_for_changes. Locally, the node:test files (137),tsc, the dist rebuild,tools/plugin-manifestsand the Python pins (30) pass. In a cloud validate run, the vitest files (claude-worker,claude-worker-preflight,writer-harness-switch,writer-migration) and the node:test files pass.reviewModel: "claude-fable-5-2", and its receipt recordsmodel: claude-fable-5-2from its trace, so this PR exercises the launcher input end to end. Only the gate's pull-request inventory step was blocked, by ISS-14051 (below).reviewRuntimes. Today only injected stubs cover that arm.claude-worker.test.tscase ("grants test-repair authority") timed out at 5 s under load average about 38 locally. The file passed 61 of 61 with a longer timeout and in the cloud run. It was not rerun; CI runs it.reply-checkerpin test and the full suites. CI runs them.usage.test.ts"names an argument mistake as an invalid request". The launcher's entry point runs at module load, so the argv error reachedsafeFailurebefore theReviewModelErrorclass (declared at the end of the file) was initialized. The launcher then crashed with no output. The class now sits with the other module constants. Local checks missed this becauseusage.test.tsspawns the bundle rather than importingclaude-worker.ts, so the graph's selection did not include it. It passes locally now, and so does the new launcher test. The receipts above are on 35484ad; this commit only moves that declaration and the CHANGELOG line.Vibe gate override: ISS-14051: comment-rules checkGuardedConstants is quadratic over generated dist bundles (main-sync.mjs, 229k lines); the pull-request inventory never finishes