Skip to content

feat: interchangeability gate (run-parity, 8/8 on both providers) + first CI workflow (codex-parity slice 4) - #150

Merged
sameeeeeeep merged 2 commits into
mainfrom
claude/codex-parity-gate
Sep 7, 2026
Merged

sameeeeeeep merged 2 commits into
mainfrom
claude/codex-parity-gate

Conversation

@sameeeeeeep

Copy link
Copy Markdown
Owner

What

Codex-parity slice 4.

  • examples/harness/run-parity.mjs — the interchangeability gate. Isolated daemon, real gate/consent/broker MCP/models. Per signed-in provider (grant restricted to it): plain completion, agentic read via a broker MCP tool, write approve→deny. Then the mixed cases: Claude-only app with a Codex global default stays in grant; dual-granted app + WebSearch routes agentic turns to Claude, plain turns to the Codex default, and refuses an explicit Codex request by name. Routing asserted from result.model. SKIP is reported, never silent. npm run try-parity.
  • dev-extension.mjs fix — a daemon-time refusal of claude_stream crashed every harness (async Promise executor swallowed the rejection).
  • .github/workflows/ci.yml — first CI: builds, typecheck, fixture daemon suites (ubuntu), headless Swift tests (macos). No provider sign-in needed.
  • docs/GO-LIVE.md — P0: parity gate green before release.

Evidence

  • First real run: 8 PASS · 0 FAIL · 0 SKIP on claude-code + codex (gpt-6-astra), 138 s.
  • Daemon routing lines confirm every cell (e.g. dual.parity plain → gpt-6-astra, agentic → sonnet).
  • CI: this PR's own run is the proof of 4b.

🤖 Generated with Claude Code

sameeeeeeep and others added 2 commits September 7, 2026 21:48
…ows per provider + the mixed cases)

Codex-parity slice 4a. The Codex integration was validated with only Codex registered; the first mixed
run broke. This gate spins an isolated daemon (own RELAY_DIR/port, real gate/consent/broker MCP/models)
and runs, once per signed-in provider with the app's grant restricted to that provider: a plain
completion (implicit model must stay in grant), an agentic read through a broker MCP tool (tools ARE
portable via the broker), and write consent approve-then-deny. Then the two mixed cases: a Claude-only
app with the global default on Codex must stay in its grant (the 2026-09-07 Brandbrain bug), and a
dual-granted app with a Claude-only tool must route its agentic turn to Claude, honour the Codex default
for plain turns, and refuse an explicit Codex request by name. Routing is asserted from the daemon's own
`done` result (`result.model` is the resolved model) — not inferred. A provider that isn't online is a
SKIP, never a silent pass. `npm run try-parity`. First real run: 8 PASS / 0 FAIL on claude-code + codex.

Also fixes the shared harness client: `stream()` used an async Promise executor, so a daemon-time
refusal of the claude_stream REQUEST (before any stream existed) was an unhandled rejection that killed
the whole harness process instead of rejecting the promise the caller could assert on.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
…ss Swift tests (no sign-in needed)

Codex-parity slice 4b. There was no CI. A hosted runner has no Claude Code or Codex account, so this
runs the half that needs none: protocol/sidekick/sdk builds, workspace typecheck, the fixture-backed
daemon suites (routing incl. the mixed-provider and tool pre-flight cases, the Codex App Server
contract, storage) on ubuntu, and the LauncherRouting + ConsentRouting headless tests on macos. The
real-provider matrix is `npm run try-parity` on a signed-in Mac, now a P0 line in docs/GO-LIVE.md.
Motivation on record: a red `tsc` shipped past a tests-only gate earlier today.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
@sameeeeeeep
sameeeeeeep merged commit af9b386 into main Sep 7, 2026
2 checks passed
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