Skip to content

ISS-14039: Accept a Fable review for a Claude cloud import - #427

Merged
shafty023 merged 4 commits into
mainfrom
vibe/iss-14039-fable-review
Nov 12, 2026
Merged

shafty023 merged 4 commits into
mainfrom
vibe/iss-14039-fable-review

Conversation

@shafty023

@shafty023 shafty023 commented Nov 11, 2026 •

Copy link
Copy Markdown
Collaborator

Summary

  • Problem. A Claude-provider cloud import could reach ready or a PR only after an independent Codex review: refreshImportWitness and cloudPrProblem in vibe-core's lib/vibe/scripts/cloud-worker.mjs required a receipt with runtime codex. With Codex limit-stopped on both machines, three PRs were blocked. Operator ruling (2026-11-11): "Accept a Fable review instead".
  • Gate. For a Claude import, the gate now accepts a Codex receipt, or a Claude receipt whose trace proves the model claude-fable-5-2. The receipt counts only if it is not from the session's writer (vibe-writer.json writer id or a migrated one). A Codex-provider import still needs a Claude review, unchanged. The refusal reads independent 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_MODELS in new lib/vibe/scripts/review-models.mjs.
  • Proof of model. captureReviewReceipt (lib/handoff/scripts/review-receipts.mjs) records model from 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 of claude --print --output-format stream-json --model fable recorded claude-fable-5-2 in both places. The handoff receipt check refuses a recorded model the trace does not show. verifiedReviewModel re-reads the fingerprinted trace for the gate. Receipts from before this release have no model and still pass handoff, but they prove no model.
  • Launcher. claude-worker.mjs takes an optional reviewModel (one of FABLE_REVIEW_MODELS) for the four receipt review roles only. It is passed to --model and the agent definition. A wrong role or an unknown model fails before launch with REVIEW_MODEL_REFUSED and its reason, not the generic turn failure. The bundles are rebuilt.
  • vibe-core 1.0.5, vibe 1.1.82 (VIBE_CORE_MIN 1.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.
  • Scope is kept to the gate in cloud-worker.mjs and to the reviewModel input in claude-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

  • New review-receipts.test.mjs case: 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.
  • New vibe-triage.test.mjs ISS-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 passes refresh-import, cloudPrProblem and ready. A later trace edit is refused. The injected Codex-receipt cases still pass.
  • New claude-worker.test.ts case: 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 return REVIEW_MODEL_REFUSED with the reason.
  • Selected with closedloop-graph code_tests_for_changes. Locally, the node:test files (137), tsc, the dist rebuild, tools/plugin-manifests and 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.
  • Handoff: all four launcher review receipts (guardrails, adversarial, Storybook decomposer, verify) are on 35484ad, with no blocking findings. The adversarial reviewer ran with reviewModel: "claude-fable-5-2", and its receipt records model: claude-fable-5-2 from 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).
  • Missing test for engineering: a Claude import cleared by a real native Codex receipt through reviewRuntimes. Today only injected stubs cover that arm.
  • One unrelated claude-worker.test.ts case ("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.
  • Not run locally: the vibe-bench reply-checker pin test and the full suites. CI runs them.
  • CI fix (2bd9d8a): the first CI run failed usage.test.ts "names an argument mistake as an invalid request". The launcher's entry point runs at module load, so the argv error reached safeFailure before the ReviewModelError class (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 because usage.test.ts spawns the bundle rather than importing claude-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

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
shafty023 merged commit 8fe42f5 into main Nov 12, 2026
12 checks passed
@shafty023
shafty023 deleted the vibe/iss-14039-fable-review branch November 12, 2026 04:24
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.
shafty023 added a commit that referenced this pull request Nov 12, 2026
Merge origin/main (ISS-14039, #427) and take vibe 1.1.84 and vibe-core 1.0.7, past the numbers #427 used and #426 has reserved. VIBE_CORE_MIN, the README version line, the release-pin tests and the CHANGELOG entries follow, and the vibe-workers bundles are rebuilt.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant