Skip to content

fix: distinguish install/dual-solve/crystallize failures from success#402

Open
dripsmvcp wants to merge 1 commit into
vouchdev:testfrom
dripsmvcp:fix/test-branch-silent-failures
Open

fix: distinguish install/dual-solve/crystallize failures from success#402
dripsmvcp wants to merge 1 commit into
vouchdev:testfrom
dripsmvcp:fix/test-branch-silent-failures

Conversation

@dripsmvcp

Copy link
Copy Markdown
Contributor

five small fixes to code that landed on test, all the same shape — a
failure or not-yet-ready state that was being reported as success. found
while auditing the branch; each has a regression test and none touches the
review gate.

install-mcp (codex toml_merge) — a config.toml the minimal serializer
can't round-trip (a non-bmp string value like an emoji, a nan/inf float)
was bucketed as skipped and printed (already present) with a clean Done,
so the user believes vouch is wired into codex when it isn't. serializer
failure now lands in a distinct failed bucket, is reported as such, and the
command exits non-zero. reproduced end-to-end: an existing config with an
emoji string value → the [mcp_servers.vouch] block silently never installs.

install-mcp path containment — a manifest dst that escapes the target
tree (../absolute) is now refused with an AdapterError instead of writing
outside target. defense in depth for the manifest file writer; every shipped
adapter uses contained relative paths, so no behavior change for real installs.

dual-solve review-ui_serialize computed the recommendation over the
empty candidate list on every poll, so a running job rendered "neither engine
produced a usable diff" for its entire (multi-minute) duration. the hint is now
omitted until candidates exist.

session.crystallize — retrying on a session that hasn't been ended rewrote
the session-<id> summary page with a fresh wall-clock Ended: stamp each
time (and re-embedded it), so #256's "idempotent retry" wasn't idempotent. an
open session now renders a stable marker; retries produce an identical body.

capture ingest-codex — rollout parsing had no size cap and would read an
oversized (or newline-free-blob) rollout whole into memory. bounded to 64 MiB
up front, matching the byte caps on other untrusted reads.

make check green — pytest (full, excl. embeddings), mypy, ruff.

five fixes to code merged on the test branch, all variants of "a failure
or not-yet-ready state reported as success":

- install-mcp (codex toml_merge): a config.toml the minimal serializer
  can't round-trip (non-bmp string value, nan/inf float) was bucketed as
  skipped and printed "(already present)" with a clean "Done", so the user
  believed vouch was wired into codex when it wasn't. add a distinct
  `failed` bucket, report it, and exit non-zero.
- install-mcp: reject a manifest `dst` that escapes the target tree
  (`..`/absolute) instead of writing outside it — defense in depth for the
  manifest file writer. shipped adapters use only contained relative paths.
- dual-solve review-ui: `_serialize` computed the recommendation over the
  empty candidate list on every poll, so a running job showed "neither
  engine produced a usable diff" for its whole duration. omit the hint
  until candidates exist.
- session.crystallize: retrying on a not-yet-ended session rewrote the
  summary page with a fresh wall-clock "Ended:" stamp each time (and
  re-embedded), so vouchdev#256's "idempotent retry" wasn't. render a stable
  marker for an open session.
- capture ingest-codex: cap rollout parsing at 64 MiB so an oversized or
  newline-free-blob rollout can't be read whole into memory, matching the
  byte caps on other untrusted reads.

each fix has a regression test; make check green.
@coderabbitai

coderabbitai Bot commented Jul 6, 2026

Copy link
Copy Markdown

Important

Review skipped

Auto reviews are disabled on base/target branches other than the default branch.

Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro Plus

Run ID: f2806a37-6e3b-43dc-84bf-78a1ba6ae1e1

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests

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.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@github-actions github-actions Bot added docs documentation, specs, examples, and repo guidance cli command line interface dual-solve dual-solve orchestration review-ui browser review ui adapters agent host adapters and install manifests tests tests and fixtures size: M 200-499 changed non-doc lines labels Jul 6, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

adapters agent host adapters and install manifests cli command line interface docs documentation, specs, examples, and repo guidance dual-solve dual-solve orchestration review-ui browser review ui size: M 200-499 changed non-doc lines tests tests and fixtures

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant