Failure-mode parity analysis takes each defect class fixed in another agent's changelog (here Claude Code 2.1.318, Nov 4 2026) and asks, for a given codebase (here yoyo v0.4.0, commit 608a504b), three questions: does the same failure mode exist, how does our handling differ, and is the difference a legitimate policy contrast or an unbuilt gap? The output is a per-row verdict — parity, deliberate contrast, or open ticket — not a bug list.
Key Points
Each upstream fix becomes a row; each row resolves to one of: already matched (verified by probe), a named contrast (both designs defensible, e.g. degrade-and-warn vs. refuse), or an open gap (ticket exists, work unbuilt).
The two defensible axes surfaced here are degrade-and-warn vs. refuse (TLS trust material) and exit-code honesty in headless mode (silent success vs. nonzero exit plus a note).
A recurring yoyo theme is that it already refuses earlier than upstream in configuration handling, but leaks silence in other surfaces (failing slash commands, config get).
"Model-visible failure" is treated as its own defect class: a tool that vanishes or is called too early must tell the model, not just the log.
Rows must be dated and evidenced (probe results, owner decisions, issue numbers) so later passes can tell "unbuilt" from "unknown".
Concepts
Defect class — a category of failure (bad trust material, dishonest exit status, silent config replacement), not a single bug.
Named contrast — a row where yoyo's behavior deliberately differs from upstream and the difference is documented rather than fixed.
Degrade-and-warn — proceed using whatever is readable, emit a stderr warning.
Refuse at startup — fail fast, name the offending variable, exit nonzero.
Exit-code honesty — a headless run must not exit 0 when the reply was truncated by an API error.
Per-surface silence — a failure that prints nothing on one interface (-p) while being handled elsewhere.
Model-visible failure note — the agent is told a tool/connector is unavailable, rather than discovering it by a failed call.
external_tool_failure_note — yoyo's mechanism for the above.
Details
1. Bad CA bundle environment variable
Upstream: every connection failed when NODE_EXTRA_CA_CERTS was empty, not PEM, or began with a damaged certificate. Fix: use the readable certs and emit a stderr warning.
yoyo:tls_preflight.rs, Day 249, issue #1138 — refuses at startup when SSL_CERT_FILE loads nothing.
Contrast: degrade-and-warn vs. refuse; both name the variable. Open row: the partial-damage case (some certs readable, some not) is the untested decision point in yoyo — its behavior there is what the next pass must check.
2. -p reporting success after a truncated reply
Upstream: headless mode exited 0 when an API error cut off a reply; corrected via a turn.step hook. The class is exit-code honesty in headless mode.
yoyo: #1026, owner decision 2026-11-03 — a default-limit cut and a refusal exit nonzero; a user-chosen max_tokens cut exits 0 with a note; the note also appears in json/stream-json output. Status: unbuilt as of Day 250.
3. Invalid JSON config silently replaced by defaults
Upstream: non-interactive launch used to swap defaults for an invalid JSON config; it now fails and explains how to restore.
yoyo: already refuses on a malformed .yoyo.toml under -p — exit 2, names the offending lines, tells the user to move the file aside (verified by probe, Day 250). Residual gap:config get only warns and exits 0, so the same class survives on that surface.
4. Repeated probing of a dead stdio MCP server
Upstream: a stdio MCP server that died during the version probe was re-probed on every start. yoyo: pre-flight double-spawns every stdio server — tracked by the #1134 lifecycle ticket.
5. MCP calls against not-yet-loaded tools
Upstream: a call made before the tool was loaded now returns its input schema; and when an approved connector tool becomes unavailable after a restart, the model is told. yoyo: same model-visible-failure class, handled by external_tool_failure_note.
6. Failing custom slash commands printing nothing in -p
A per-surface silence class: the failure is reported on other surfaces but produces no output headlessly. yoyo's #1127 is the wording sibling of this row.
Method
Rendering diagram…
Each row carries its evidence: source file and day, issue number, owner decision date, or probe date — so a later re-run can distinguish a deliberate contrast from work that simply has not landed yet.