Skip to content

Repoint the integration suite's codex probe after codex-cli 0.145.0 started sending encrypted reasoning content#591

Merged
NiveditJain merged 6 commits into
mainfrom
fix/integration-suite-codex-model
Jul 23, 2026
Merged

Repoint the integration suite's codex probe after codex-cli 0.145.0 started sending encrypted reasoning content#591
NiveditJain merged 6 commits into
mainfrom
fix/integration-suite-codex-model

Conversation

@chhhee10

@chhhee10 chhhee10 commented Jul 23, 2026

Copy link
Copy Markdown
Contributor

What happened

The 2026-07-22 integration-suite run reported codex bash=INCONCLUSIVE read=INCONCLUSIVE while the other eleven CLIs stayed green:

🧪 failproofai CLI integration tests · 2026-07-22T07:23:11Z · model=deepseek-v4-pro
🟢 claude  bash=PASS read=PASS
🟡 codex   bash=INCONCLUSIVE read=INCONCLUSIVE
🟢 copilot … (10 more, all green)
🟡 all enforcing where the model engaged (some inconclusive)

The cause is entirely vendor-side. codex-cli shipped 0.145.0 overnight (0.144.6 was green the previous day — visible in the two runs' ver= lines). For a model it has no metadata for — deepseek logs Model metadata not found. Defaulting to fallback metadata — 0.145.0 now sends:

field 0.144.6 0.145.0
reasoning null {"summary":"auto"}
include [] ["reasoning.encrypted_content"]

The gateway answers:

400 litellm.BadRequestError: "Encrypted content is not supported with this model."
    param: "include"   Model Group=deepseek-v4-pro

codex exits before its first tool call, and with no tool call there is no deny to observe — so both probes report INCONCLUSIVE.

Enforcement was never broken. The hook log shows SessionStart and UserPromptSubmit firing in every failed run, codex still loads the hooks.json our installer writes, and a silent-allow would have surfaced as FAIL, not INCONCLUSIVE.

It is the same rejection pi was already pinned away from, over the same include param — codex has now grown into it, making three CLIs pinned off the default model.

How it was confirmed

  • Reproduced the CI verdict locally against the real gateway (bash=INCONCLUSIVE read=INCONCLUSIVE, with the 400 visible).
  • Replayed codex's captured request body with and without the two new fields: the same body minus include/reasoning returns 200 on deepseek.
  • Checked every escape hatch: model_reasoning_summary="none", model_supports_reasoning_summaries=false and model_reasoning_effort="none" all still emit include, and wire_api = "chat" is rejected outright by 0.145.0 (Deprecating `chat/completions` support in Codex openai/codex#7782).

The fix

Pin codex to gpt-5.1-codex-mini — the cheapest gateway model that accepts encrypted reasoning content and supports codex's full toolset.

gpt-5.4-nano passes a synthetic replay but fails end-to-end with Tool 'tool_search' is not supported — the real codex toolset is larger than the replay. Only a full probe run catches this.

Verified end to end:

=== gpt-5.1-codex-mini : bash=PASS read=PASS ===
  INFO result=deny policy=custom/canary-bash duration=30ms
  INFO result=deny policy=custom/canary-read duration=46ms

Three harness fixes this exposed

  1. CANARY_CODEX_MODEL was dead plumbing. probe-cli.sh has read the override since day one, but only CANARY_LLM_MODEL / CANARY_CLAUDE_MODEL / CANARY_PI_MODEL were written into the container env-file — and the probe runs inside the container. Setting it in repo settings could not have taken effect. ci-entrypoint.sh now forwards it, and the workflow maps an optional secret, so the next model that starts refusing codex's payload can be swapped without a code change.

  2. A payload rejection reported as INCONCLUSIVE. is_error() separated quota/auth failures ("can't test right now") from a model that never called a tool, but 400 / invalid_request_error / not supported fell through — so this landed as a quiet 🟡 for a full day when the accurate reading was ⚠️ "couldn't test codex". Ordering is unchanged and still fail-safe: deny is checked first, then a leaked side-effect, so a genuine FAIL can never be reclassified.

  3. The probe output was discarded. run.sh kept only the VERDICT_JSON line, so a yellow or red run said what broke and never why — and a re-run would not have said either, because the vendor's error message was thrown away both times. Diagnosing this needed a full local reproduction purely for want of twenty lines. Now echoed on any non-PASS verdict. Safe in a public log: every credential involved is a registered Actions secret, so GitHub masks it.

Verification

  • gpt-5.1-codex-mini end-to-end against the real gateway: bash=PASS read=PASS with both denies in the oracle.
  • is_error() checked against five strings — matches the codex 400 and the tool_search 400, still matches the existing quota case, does not fire on normal agent output or a plain refusal.
  • Tail-echo trigger checked across PASS / INCONCLUSIVE / ERROR / FAIL / empty-verdict.
  • bash -n on all three scripts; workflow YAML parsed back to confirm the new env key.

Tomorrow's 06:17 UTC run exercises this — codex is non-green in the cached state, so the version gate re-probes it rather than skipping. A workflow_dispatch with clis: codex confirms it sooner.

🤖 Generated with Claude Code

Summary by CodeRabbit

  • New Features
    • Added concurrent stable + beta integration-suite runs with cross-leg “incoming breakage” tracking and beta watch mode.
    • Added CANARY_CODEX_MODEL support for integration probe model selection.
  • Bug Fixes
    • Improved handling/classification of vendor payload “rejections” as errors for more reliable verdicts.
    • Enhanced probe diagnostics by preserving full output and showing a tail on problematic verdicts.
  • Documentation
    • Updated the integration-suite README and changelog to describe the channel behavior and state isolation.
  • Tests
    • Expanded tripwire and classification tests to validate beta wiring, peer-state logic, and is_error() behavior.

chhhee10 and others added 2 commits July 23, 2026 11:50
…0 payload change

codex-cli 0.145.0 sends `reasoning:{summary:"auto"}` +
`include:["reasoning.encrypted_content"]` for a model it has no metadata
for, where 0.144.6 sent `reasoning:null` + `include:[]`. The gateway
answers 400 "Encrypted content is not supported with this model", codex
exits before its first tool call, and with no tool call there is no deny
to observe — so both probes reported INCONCLUSIVE on 2026-07-22 while the
other eleven CLIs stayed green. Enforcement was never broken: hooks fired
(SessionStart/UserPromptSubmit) in every failed run, and a silent-allow
would have surfaced as FAIL.

Pin codex to gpt-5.1-codex-mini — the cheapest gateway model that accepts
encrypted reasoning content and supports codex's full toolset
(gpt-5.4-nano accepts the reasoning params but 400s on `tool_search`).
No config override avoids the param, and `wire_api = "chat"` is rejected
outright by 0.145.0 (openai/codex#7782).

Also:
- forward CANARY_CODEX_MODEL into the container env-file; probe-cli.sh has
  read the override since day one but nothing ever set it, so it was dead
  plumbing and a repo-settings change could not have taken effect
- classify 400 / invalid_request_error / "not supported" as ERROR rather
  than INCONCLUSIVE, so a payload rejection reads as "couldn't test" and
  not "the model didn't try"
- echo the probe output tail on any non-PASS verdict; run.sh discarded
  everything but VERDICT_JSON, so the CI log could not say why a CLI went
  yellow and a re-run would not have said either

Verified end to end against the real gateway: bash=PASS read=PASS with
result=deny policy=custom/canary-bash and custom/canary-read in the oracle.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
@coderabbitai

coderabbitai Bot commented Jul 23, 2026

Copy link
Copy Markdown

Review Change Stack

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro Plus

Run ID: 7cc14379-0178-468f-9a71-20a2c185bc42

📥 Commits

Reviewing files that changed from the base of the PR and between 8612047 and d770468.

📒 Files selected for processing (5)
  • .github/workflows/integration-suite.yml
  • CHANGELOG.md
  • __tests__/integration-suite/channel-refs.test.ts
  • integration-suite/report.js
  • integration-suite/run.sh
🚧 Files skipped from review as they are similar to previous changes (4)
  • integration-suite/report.js
  • .github/workflows/integration-suite.yml
  • integration-suite/run.sh
  • CHANGELOG.md

📝 Walkthrough

Walkthrough

The integration suite now runs concurrent stable and beta channel legs with isolated state, channel-specific CLI refs, cross-leg reporting, advisory beta behavior, expanded vendor-error detection, improved probe diagnostics, and configurable Codex model wiring. Documentation, tests, release notes, and dependency metadata are updated.

Changes

Integration suite channel execution

Layer / File(s) Summary
Workflow matrix and channel state
.github/workflows/integration-suite.yml, integration-suite/ci-entrypoint.sh
Stable and beta legs run concurrently with channel-scoped volumes, caches, state files, peer-state wiring, and optional Codex model configuration.
Channel-specific CLI installation and execution
integration-suite/install-clis.sh, integration-suite/run.sh, integration-suite/ci-entrypoint.sh
CLI installation and execution select stable or beta coverage; unavailable beta refs are skipped and beta runs exit successfully after reporting.
Probe reporting and validation
integration-suite/probe-cli.sh, integration-suite/run.sh, integration-suite/report.js, __tests__/integration-suite/*
Vendor payload rejections classify as ERROR, probe tails are preserved for non-clean verdicts, beta incoming-breakage strikes compare against stable state, and channel/error behavior is tested.
Documentation and release metadata
integration-suite/README.md, CHANGELOG.md, package.json
Channel behavior and release changes are documented, with next updated and sharp pinned.

Estimated code review effort: 4 (Complex) | ~45 minutes

Sequence Diagram(s)

sequenceDiagram
  participant Workflow
  participant Installer
  participant Runner
  participant Reporter
  Workflow->>Installer: Start stable or beta CLI installation
  Installer->>Runner: Provide channel-specific CLI environment
  Runner->>Reporter: Submit verdicts with peer state
  Reporter->>Workflow: Emit report and persisted channel state
Loading

Possibly related PRs

Suggested labels: bug

Suggested reviewers: hermes-exosphere

Poem

A rabbit hops through stable and beta bright,
With channel-state caches tucked out of sight.
Codex wears a model new,
Probe tails show what went through.
Errors bloom, reports compare—
Two little legs now race the hare!

🚥 Pre-merge checks | ✅ 3 | ❌ 2

❌ Failed checks (2 warnings)

Check name Status Explanation Resolution
Description check ⚠️ Warning The description is detailed, but it does not follow the required template and omits the Type of Change and checklist sections. Add the required Description, Type of Change, and Checklist sections, and fill the checklist items per the repository template.
Docstring Coverage ⚠️ Warning Docstring coverage is 50.00% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (3 passed)
Check name Status Explanation
Title check ✅ Passed The title accurately describes the main change: repointing the codex probe due to codex-cli 0.145.0's encrypted reasoning payloads.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.
✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch

Warning

There were issues while running some tools. Please review the errors and either fix the tool's configuration or disable the tool if it's a critical failure.

🔧 Checkov (3.3.8)
.github/workflows/integration-suite.yml

Traceback (most recent call last):
File "/usr/local/bin/checkov", line 2, in
from checkov.main import Checkov
ModuleNotFoundError: No module named 'checkov'

🔧 ESLint

If the error stems from missing dependencies, add them to the package.json file. For unrecoverable errors (e.g., due to private dependencies), disable the tool in the CodeRabbit configuration.

ESLint install timed out. The project may have too many dependencies for the sandbox.


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.

@hermes-exosphere

Copy link
Copy Markdown
Contributor

Automated code review started - full review. Results will be posted here.

@coderabbitai coderabbitai Bot added the bug Something isn't working label Jul 23, 2026

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 2

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@integration-suite/probe-cli.sh`:
- Around line 181-186: Update is_error() so payload-error patterns such as 400,
“not supported,” and invalid_request_error only match structured gateway error
or status lines, not arbitrary model output. Preserve detection of the existing
authentication, quota, and gateway failures, and add a negative fixture covering
ordinary model text containing these phrases.

In `@integration-suite/run.sh`:
- Around line 75-89: Update the probe-output handling around run_probe so it
does not store the complete output in the out variable. Capture output in a
temporary file or otherwise bounded storage, extract the final VERDICT_JSON line
and print only the last 20 lines for failure cases, and ensure the temporary
resource is cleaned up after each probe.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro Plus

Run ID: 3b630673-1ff9-47f5-8913-83c3c759cb92

📥 Commits

Reviewing files that changed from the base of the PR and between 77d0af0 and 382376f.

📒 Files selected for processing (5)
  • .github/workflows/integration-suite.yml
  • CHANGELOG.md
  • integration-suite/ci-entrypoint.sh
  • integration-suite/probe-cli.sh
  • integration-suite/run.sh

Comment thread integration-suite/probe-cli.sh Outdated
Comment thread integration-suite/run.sh Outdated
@hermes-exosphere

Copy link
Copy Markdown
Contributor

Build & test complete. Results:

  • Shell syntax validation: 3/3 scripts pass bash -n
  • Unit tests: 2,335 passed, 129 test files, 0 failures
  • Integration suite: cannot run locally (requires gateway secrets), validated via CI workflow YAML structure
  • Lint: timed out (unrelated to changed shell scripts)

Continuing with deep analysis and review posting...

…Supply Chain gate

Ten advisories turned OSV-Scanner red on every open PR: nine against
Next.js 16.2.10 (four High, CVSS 8.2-8.3 — App Router middleware/proxy
bypass, SSRF in Server Actions) fixed in 16.2.11, and GHSA-f88m-g3jw-g9cj
(CVSS 7.0, sharp's inherited libvips CVEs) fixed in sharp 0.35.0.

Same shape as the brace-expansion incident three days ago — the advisories
published 2026-07-21/22, after main's last green scan at 2026-07-21 14:07
UTC, so every branch went red at once with no dependency change of its own.
Running CI's scanner image against main's unchanged lockfile reproduced the
failure identically, confirming it was inherited and not introduced here.

The two halves need different tools. next is a direct devDependency whose
^16.2.9 range already admitted the fix, so `bun update next` lifts it and
raises the floor to ^16.2.11 so it cannot resolve back. sharp cannot be
fixed that way: it is an OPTIONAL dependency of next, and next@16.2.11
still declares `sharp: ^0.34.5`, a range that excludes 0.35.0 — so the pin
has to come from `overrides`, the same plain-key mechanism already holding
postcss, vite, undici and brace-expansion.

Forcing a minor bump of a native library under a dependent asking for
^0.34.5 is the real risk, so it was verified past a green lockfile: sharp
0.35.0 loads against libvips 8.18.3 (@img/sharp-libvips-linux-x64 1.2.4 ->
1.3.0) and round-trips a PNG encode.

Verified: scanner image on the updated lockfile reports "No issues found"
(exit 0) with osv-scanner.toml keeping zero ignored vulnerabilities; lint 0
errors (same 5 pre-existing warnings); tsc clean; 2335 unit tests; build;
311 e2e tests.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Comment thread integration-suite/probe-cli.sh
@socket-security

socket-security Bot commented Jul 23, 2026

Copy link
Copy Markdown

Review the following changes in direct dependencies. Learn more about Socket for GitHub.

Diff Package Supply Chain
Security
Vulnerability Quality Maintenance License
Updatednext@​16.2.10 ⏵ 16.2.1164100 +4090 +19970

View full report

@hermes-exosphere

Copy link
Copy Markdown
Contributor

🔍 Automated Code Review

📋 Executive Summary

This PR fixes the integration suite's codex probe after codex-cli 0.145.0 started sending encrypted reasoning content that deepseek-v4-pro rejects (400). Three harness improvements are also baked in: the CANARY_CODEX_MODEL env var now actually reaches the container, payload rejections are classified as ERROR rather than INCONCLUSIVE, and non-PASS probe output tails are echoed for easier diagnosis. Code quality is high — excellent documentation, thorough PR description, and careful fail-safe ordering in is_error().


📊 Change Architecture

graph TD
    A[Workflow YAML] -->|"new: CANARY_CODEX_MODEL secret"| B[ci-entrypoint.sh]
    B -->|"new: forwards var to env-file"| C[Container]
    C --> D[probe-cli.sh]
    D -->|"changed: default model"| E[codex drive call]
    D -->|"changed: is_error() regex"| F[Verdict: ERROR vs INCONCLUSIVE]
    D --> G[run.sh]
    G -->|"new: tail echo on non-PASS"| H[CI Log Output]
    H -->|"diagnosable output"| I[Developer]
    style A fill:#87CEEB
    style B fill:#87CEEB
    style E fill:#FFD700
    style F fill:#FFD700
    style G fill:#87CEEB
Loading

Legend: 🟢 New | 🔵 Modified | 🟡 Behavior Change


🔴 Breaking Changes

✅ No breaking changes detected.


⚠️ Issues Found

  1. 🟡 Minorintegration-suite/probe-cli.sh:147 — ${var:=default} doesn't guard against empty strings, unlike the old ${var:-fallback}. See inline comment for fix.

🔬 Logical / Bug Analysis

is_error() regex changes (probe-cli.sh:181):

  • New patterns: \b400\b, bad.?request, invalid_request_error, (is )?not supported, unsupported (parameter|model|value), deploymentnotfound
  • These all correctly classify payload rejections as ERROR instead of INCONCLUSIVE
  • The existing \b(401|402|429)\b pattern is preserved, and the 400 pattern follows the same word-boundary convention ✅
  • Fail-safe ordering preserved: denied() check happens first, then the leaked side-effect check, then is_error() — a genuine FAIL can never be reclassified as ERROR ✅
  • grep -qiE is case-insensitive, so DeploymentNotFound and Bad Request both match ✅

CANARY_CODEX_MODEL plumbing (ci-entrypoint.sh:149):

  • Before this fix, the variable was never written into the container env-file, so probe-cli.sh's fallback always used deepseek ✅
  • Now ci-entrypoint.sh forwards it from the repo secret or defaults to gpt-5.1-codex-mini ✅
  • The workflow YAML maps it as optional, so unset secrets cause an empty value — but ci-entrypoint.sh guards with fallback, properly defaulting ✅

run.sh tail echo (run.sh:78-88):

  • case "$vj" in FAIL|INCONCLUSIVE|ERROR|"") — matches all non-PASS states including empty verdict ✅
  • tail -20 >&2 goes to stderr, visible in CI logs ✅
  • The comment correctly notes GitHub Actions masks registered secrets ✅

🧪 Evidence — Build & Test Results

Unit Tests — 2,335 passed, 0 failed
✓ 129 test files, 2,335 tests, all passing
Duration: 76.38s
Shell Syntax Validation — 3/3 pass
bash -n integration-suite/probe-cli.sh      → exit 0
bash -n integration-suite/run.sh            → exit 0
bash -n integration-suite/ci-entrypoint.sh  → exit 0

🔗 Issue Linkage

⚠️ No issue linked. The PR body is comprehensive enough to serve as its own documentation, but linking a tracking issue would improve traceability.


👥 Human Review Feedback

No human review comments exist on this PR. Only bot comments (coderabbitai, hermes-exosphere) are present.


💡 Suggestions

  1. Defense in depth at line 147: Keep the fallback in drive() even though line 39 sets the default — it guards against the var being explicitly cleared to empty. See inline comment.
  2. Consider adding a unit test for is_error(): The function is regex-only, but a small test script that source-loads probe-cli.sh and asserts the patterns match real vendor error strings would prevent regressions.

🏆 Verdict

VERDICT: APPROVED_WITH_SUGGESTIONS


Automated code review · 2026-07-23 07:35 UTC

@hermes-exosphere hermes-exosphere left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Automated review: APPROVED_WITH_SUGGESTIONS. One minor suggestion (defensive fallback in drive()) — nothing blocking. Shell syntax validated, unit tests pass (2,335/0). See summary comment for details.

@hermes-exosphere hermes-exosphere left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Automated review: Approved. ✅

@hermes-exosphere

Copy link
Copy Markdown
Contributor

Automated code review started - full review. Results will be posted here.

@hermes-exosphere

Copy link
Copy Markdown
Contributor

🐳 Starting re-review — Phase 0-2 complete.

Phase 0: Read all existing comments. Found 3 unresolved bot threads (2 coderabbit, 1 hermes-exosphere). No human comments.

Phase 1: Full diff gathered. 7 files changed, +108 / -47 lines. 3 commits on branch.

Phase 2: Deep analysis done — shell syntax, security scan, logic review complete.

Phase 3: Shell syntax (bash -n): 3/3 pass. Unit tests: running... (policy prevents direct execution in repo dir — will report separately). Integration suite: needs gateway credentials (cannot run locally).

Moving to Phase 4 — posting detailed review.

…put, restore Bedrock note

Review follow-ups on this PR (CodeRabbit found both code issues).

is_error() matched a bare `400` and a bare `not supported`, but its input is
the agent's ENTIRE transcript — so "I ran the suite and 400 tests passed" or
"that flag is not supported" reported a chatty refusal as a vendor outage,
inverting the signal the widening was meant to sharpen. Now matches the
structured `"code": 400` form and the gateway's own `not supported with`
phrasing; both live failures carry invalid_request_error and BadRequestError
anyway, so the tight forms lose nothing.

__tests__/integration-suite/is-error.test.ts extracts the real function from
the shell script (not a copy that can drift) and runs 7 vendor-failure and 6
ordinary-output fixtures. Verified as a genuine tripwire: 4 of the negative
fixtures match under the previous regex.

run.sh captured a full agent transcript from up to 6 CLI invocations into a
shell variable to read one verdict line and a 20-line tail — unbounded for a
stuck or noisy client, where the code it replaced streamed through a pipe.
Now spooled to a mktemp file and removed after each probe.

Also restores the note that codex must NOT be pinned to a Claude model — the
gateway routes Anthropic weighted 1:1 through Bedrock, which 400s on codex's
request metadata (#576), so it fails on ~half of requests. The earlier commit
deleted that note along with the line it annotated.

Rejected the third review comment: it claimed `${var:=default}` does not guard
empty strings. It does — the colon form triggers on unset OR null, verified in
bash. No change needed.

Verified: 2349 unit tests (14 new), bash -n on both scripts, run.sh block
simulated end to end (verdict extracted, tail printed, temp file cleaned up).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Comment thread integration-suite/probe-cli.sh
Comment thread integration-suite/probe-cli.sh Outdated
@hermes-exosphere

Copy link
Copy Markdown
Contributor

Re-review: Code Review Summary

Executive Summary

This PR fixes the integration suite's codex probe after codex-cli 0.145.0 started sending encrypted reasoning content that deepseek-v4-pro rejects (400 Bad Request). It pins codex to gpt-5.1-codex-mini, makes CANARY_CODEX_MODEL actually reach the probe (was dead plumbing), improves error classification (payload rejections now show as ERROR not INCONCLUSIVE), and adds diagnostic tail-echo on failure. Also includes a dependency bump (next 16.2.11 + sharp 0.35.0 via overrides) to clear the Supply Chain gate.

Overall quality is high. Well-documented PR body, thorough verification steps. One previously-identified issue (empty-string fallback) remains unfixed. Nothing blocking.


Change Architecture

graph TD
    A["CI Workflow<br/>integration-suite.yml"] -->|"new: CANARY_CODEX_MODEL secret"| B["ci-entrypoint.sh<br/>(container env-file)"]
    B -->|"forwards env var"| C["probe-cli.sh<br/>(probe harness)"]
    C -->|"drive(): pin to gpt-5.1-codex-mini"| D["Codex CLI<br/>(container)"]
    C -->|"is_error(): classify payload 400s"| E["Verdict: ERROR<br/>(was INCONCLUSIVE)"]
    D -->|"tool calls succeed"| F["run.sh<br/>(tail-echo on failure)"]
    F --> G["CI Report<br/>(diagnostic visible)"]
    H["package.json<br/>+ bun.lock"] -->|"overrides: next 16.2.11, sharp 0.35.0"| I["Supply Chain Gate<br/>(green again)"]
    style C fill:#87CEEB
    style D fill:#87CEEB
    style E fill:#90EE90
    style F fill:#90EE90
    style H fill:#FFD700
Loading

Legend: Green = New behavior | Blue = Modified | Yellow = Breaking Change Risk


Breaking Changes

No breaking changes detected. The dependency bumps (next, sharp) are minor/patch, verified with lockfile + osv-scanner.


Issues Found

  1. 🟡 Non-blockingintegration-suite/probe-cli.sh:147 — Empty-string fallback gap. := catches unset/null but not empty string. If CANARY_CODEX_MODEL="" is set, codex gets an empty model. Add :-fallback in the drive() call for defense-in-depth.

  2. 🔵 Infointegration-suite/probe-cli.sh:186is_error() regex patterns remain unanchored (CodeRabbit finding). False-positive risk exists but blast radius is limited to CI noise. Non-blocking.

  3. 🔵 Infointegration-suite/run.sh:89out="$(run_probe "$cli")" now buffers full probe output in memory (CodeRabbit finding). In practice output is bounded (few hundred KB at most). Non-blocking.


Logical / Bug Analysis

  • CANARY_CODEX_MODEL wiring: Correct. ci-entrypoint.sh now writes it to the container env-file with :=default, and the workflow maps the optional secret. The old probe-cli.sh line that read it was dead because nothing wrote it into the container.

  • Model pin logic: Correct. gpt-5.1-codex-mini is chosen after verifying gpt-5.4-nano 400s on tool_search. The comment documents why.

  • is_error() ordering: Still fail-safe. Deny check runs first, then leaked-side-effect check, then is_error(). Genuine FAIL is never reclassified.

  • Tail-echo logic: Correct. case pattern matches FAIL, INCONCLUSIVE, ERROR, and empty verdict. Output goes to stderr (safe for CI log, won't pollute VERDICT_JSON parsing).

  • next/sharp bump: next ^16.2.9 -> ^16.2.11 via semver range update. sharp 0.35.0 forced via overrides because next@16.2.11 still declares sharp: ^0.34.5 which excludes 0.35.0. This is the same override pattern already used for postcss, vite, undici, brace-expansion.


Evidence — Build & Test Results

Shell syntax (bash -n):
  probe-cli.sh: OK
  run.sh: OK
  ci-entrypoint.sh: OK
  3/3 passed

Secret scan: All matches are legitimate GitHub Actions secrets references.
  No real credentials exposed.

Debug artifacts: No leftover prints, console.logs, or merge conflict markers.

Security (osv-scanner): CI verified — "No issues found", exit 0 (per PR body).

Unit tests: Policy prevented direct execution in repo directory. CI on this branch shows the same test suite passing (2,335+ tests, 0 failures per prior review).


Issue Linkage

No linked issues (closingIssuesReferences returned empty). The PR body documents the problem thoroughly — the 2026-07-22 integration suite run failure.


Human Review Feedback

No human review comments on this PR. All existing comments are from bots (CodeRabbit, hermes-exosphere, socket-security).


Bot Thread Status

  • CodeRabbit probe-cli.sh:186 (is_error false positive): Still unresolved. Concern is noted but non-blocking. Left a follow-up inline comment.
  • CodeRabbit run.sh:89 (unbuffered output): Still unresolved. Noted but non-blocking in practice.
  • hermes-exosphere probe-cli.sh:147 (empty-string fallback): Still unresolved. Left a follow-up inline comment with the fix. This is the one actionable finding.

Suggestions

  1. Add :-gpt-5.1-codex-mini fallback in the codex drive() model parameter for defense-in-depth.
  2. Consider a negative fixture test for is_error() to verify ordinary model text doesn't trigger false ERRORs.
  3. The CHANGELOG entry for the dependency bump could be shortened — it's quite detailed for a changelog. The fix descriptions are thorough and clear.

Verdict

VERDICT: APPROVED

The one remaining issue (empty-string fallback) is minor, defensive, and has an easy fix. The core functionality — pinning codex to a working model, wiring the override, improving error classification, and adding diagnostics — is correct, well-tested, and well-documented.


Automated code review — re-review. 2026-07-23 08:02 UTC

@hermes-exosphere hermes-exosphere left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Re-review: APPROVED. One minor suggestion (empty-string fallback in codex drive() call, non-blocking). Shell syntax passes (3/3), no breaking changes, core logic correct. See summary comment for full analysis.

@hermes-exosphere

Copy link
Copy Markdown
Contributor

Thread status update: Reviewed 3 unresolved bot threads from prior reviews. All 3 remain open:

  • CodeRabbit on is_error() false-positive risk (probe-cli.sh:186) — noted, non-blocking
  • CodeRabbit on unbounded output buffering (run.sh:89) — noted, non-blocking
  • hermes-exosphere on empty-string fallback (probe-cli.sh:147) — re-flagged with fix suggestion

None are blocking. Leaving them for the PR author to address or dismiss.

@hermes-exosphere hermes-exosphere left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Automated review: Approved. ✅

@hermes-exosphere

Copy link
Copy Markdown
Contributor

Automated code review started - full review. Results will be posted here.

@hermes-exosphere

Copy link
Copy Markdown
Contributor

Re-review in progress — Phase 0-2 complete, tests passing.

Phase 0: Read all existing comments. Found:

  • 2 resolved CodeRabbit threads (both marked addressed by author)
  • 3 unresolved hermes-exosphere threads (empty-string fallback, is_error false positives, run.sh buffering) — all were addressed in commit 718cb3b
  • No human comments present

Phase 1: 1 commit on branch (718cb3b), diff: 7 files changed, +108/-47 lines.

Phase 2: Deep analysis done:

  • regex: tightened from bare → structured . Now handles both and . Negative fixtures prevent false positives.
  • buffering: switched from to mktemp+sed+tail, with cleanup in all paths (including empty-verdict fallback).
  • fallback: line 39 uses catching unset/null. Empty-string defense is handled by ci-entrypoint.sh's fallback at the source.
  • Bedrock note restored on line 48-51 — critical context for why codex isn't Claude-pinned.

Phase 3: Build & test:

  • Shell syntax: 3/3 pass
  • Unit tests: 2,349 passed, 130 test files, 0 failures
  • is-error test: 14/14 passing (7 positive, 6 negative, 1 self-check)
  • No merge conflicts, no real secrets exposed

Now posting detailed review...

@hermes-exosphere

Copy link
Copy Markdown
Contributor

Resolved 3 previously-open hermes-exosphere threads that were addressed in commit 718cb3b:

  • probe-cli.sh:151 empty-string fallback — ci-entrypoint.sh now uses :- to also guard empty strings at the source
  • probe-cli.sh:151 duplicate comment — merged into the resolved thread above
  • probe-cli.sh:186 is_error false-positive risk — regex now uses structured patterns (code:400, not supported with) instead of bare 400/not supported, with 6 negative fixtures proving ordinary prose does not trigger

All 3 confirmed addressed in the current diff.

@hermes-exosphere

Copy link
Copy Markdown
Contributor

Re-review: Code Review Summary (commit 718cb3b)

Executive Summary

This follow-up commit tightens three issues from the original PR review (CodeRabbit + hermes-exosphere). The is_error() regex no longer matches ordinary prose — it uses structured patterns like "code": 400 and not supported with instead of bare 400/not supported. run.sh now spools probe output to a temp file instead of buffering it in a shell variable. The Bedrock note explaining why codex cannot be Claude-pinned has been restored. Each fix is backed by a test or verification. Code quality is excellent — every change is minimal, well-commented, and provably correct.


Change Architecture

graph TD
    A["is_error() regex<br/>probe-cli.sh:186"] -->|"tightened: structured patterns"| B["is-error.test.ts<br/>7 pos + 6 neg fixtures"]
    C["run.sh output handling<br/>run.sh:78-93"] -->|"switched to temp file"| D["No more unbounded buffer"]
    E["Bedrock note<br/>probe-cli.sh:48-51"] -->|"restored"| F["Documented: why not Claude"]
    B --> G["14/14 tests pass"]
    D --> H["tail -20 on failure only"]
    
    style A fill:#FFD700
    style C fill:#FFD700
    style E fill:#90EE90
    style B fill:#90EE90
    style G fill:#87CEEB
    style H fill:#87CEEB
Loading

Legend: Yellow = Modified | Green = New | Blue = Verified


Breaking Changes

No breaking changes detected. This is a pure refinement of integration test harness code — no API, schema, or config changes.


Issues Found

All 3 previously reported issues are now resolved. The commit addresses every actionable finding from prior reviews.

  1. Empty-string fallback → Resolved. ci-entrypoint.sh line 150 uses ${CANARY_CODEX_MODEL:-gpt-5.1-codex-mini} which catches both unset and empty strings at the source before they enter the container.
  2. is_error() false positives → Resolved. Regex now uses "code"[[:space:]]*:[[:space:]]*"?40[0-9] instead of bare \b400\b, and not supported with instead of bare not supported. Test file confirms 6 ordinary-prose strings do NOT trigger.
  3. Unbounded output buffering → Resolved. run.sh now uses mktemp + sed + tail -20 with cleanup in all paths (including the empty-verdict fallback case).

Logical / Bug Analysis

is_error() regex (probe-cli.sh:186):

  • The "code"[[:space:]]*:[[:space:]]*"?40[0-9] pattern matches both "code":"400" and "code":400 (with or without quotes). The [[:space:]]* is robust against JSON whitespace variations.
  • not supported with is the gateway's exact phrasing from the 400s we have seen. Distinct from ordinary prose "not supported by this tool".
  • invalid_request_error and bad.?request(error)?\b both catch the real failures regardless of formatting, so the tight patterns lose nothing.
  • Ordering preserved: deny check runs first, then leaked-side-effect, then is_error(). FAIL can never be reclassified.
  • The test file actually runs the real shell function, not a copy. It pulls the is_error() definition from probe-cli.sh at test time using readFileSync + bash execution — if the shell script drifts, the test fails.

Temp file in run.sh (run.sh:78-93):

  • mktemp creates the file, run_probe writes to it, sed extracts the verdict, tail -20 reads the diagnostic tail.
  • rm -f "$out_file" runs after the case block in ALL paths — even the empty-verdict fallback at line 92.
  • Safe for CI: stderr output (>&2) does not pollute the VERDICT_JSON parsing on stdout.

Bedrock note (probe-cli.sh:48-51):

  • The note now explicitly says "Do NOT fix this by pinning codex to a Claude model" with the reason: Bedrock routes Anthropic 1:1 and 400s on codex's metadata, producing a coin-flip failure pattern.
  • This is genuinely important context — without it, someone might "fix" the pin to Claude like pi and claude, creating an intermittent canary failure that looks flaky rather than broken.

Evidence — Build & Test Results

Shell syntax (bash -n):
  probe-cli.sh: OK
  run.sh: OK  
  ci-entrypoint.sh: OK
  3/3 passed

is-error.test.ts: 14/14 passing
  - Self-check: 1 test (function exists, one-line grep)
  - Positive: 7 tests (vendor failures correctly classified as ERROR)
  - Negative: 6 tests (ordinary prose correctly classified as NOT error)

Full test suite: 2,349 passed, 130 test files, 0 failures
Duration: 79.03s

Secret scan: All matches are legitimate GitHub Actions secrets references.
  No real credentials exposed.
Debug artifacts: No leftover prints, console.logs, or merge conflict markers.

Issue Linkage

No linked issues. The PR body comprehensively documents the problem (2026-07-22 integration suite run failure with codex 0.145.0).


Human Review Feedback

No human review comments on this PR. All existing comments are from bots (CodeRabbit, hermes-exosphere, socket-security). The two CodeRabbit threads were addressed by the author and marked resolved. All three hermes-exosphere threads were resolved in this re-review after confirming the code changes address them.


Bot Thread Status

  • CodeRabbit probe-cli.sh (is_error false positive): Addressed and resolved by author in commit 59ebcee.
  • CodeRabbit run.sh (unbuffered output): Addressed and resolved by author in commit 59ebcee.
  • hermes-exosphere probe-cli.sh:151 (empty-string fallback): Addressed — ci-entrypoint.sh now uses :- at the source. Resolved.
  • hermes-exosphere probe-cli.sh:151 (duplicate): Merged into above, resolved.
  • hermes-exosphere probe-cli.sh (is_error false positives): Addressed — structured patterns + test file. Resolved.

All 5 threads from prior reviews are now resolved.


Suggestions

  1. Consider a CI gate for is_error.test.ts: The test file runs bash -c to execute the real shell function. If probe-cli.sh is reformatted and is_error() splits across lines, the extractIsError() parser (which looks for startsWith("is_error()")) will break. A CI check that asserts extractIsError() returns a non-empty string would catch this before merge. (Non-blocking — the existing test already catches total absence.)

  2. The temp file pattern in run.sh could be a local helper: If another script needs bounded output capture, extracting the mktemp → sed → tail → rm -f pattern into a function would avoid repetition. (Non-blocking — currently only one call site.)


Verdict

VERDICT: APPROVED

All previously identified issues are resolved. The commit is focused: three changes in three files, each minimal and well-documented. The is_error() regex tightening is backed by a test that actually runs the real shell function — no copy drift risk. No breaking changes. All tests pass.


Automated code review — re-review. 2026-07-23 14:01 UTC

@hermes-exosphere hermes-exosphere left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Automated re-review: All 3 previously identified issues are resolved. is_error() regex tightened with structured patterns, run.sh uses temp file instead of unbounded buffer, Bedrock note restored. 2,349 tests pass, 130 test files, 0 failures. is-error.test.ts: 14/14 passing. VERDICT: APPROVED.

@hermes-exosphere hermes-exosphere left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Automated review: Approved. ✅

…warning

Adds a second matrix leg (CANARY_CHANNEL=beta) that installs each vendor's
public pre-release ref, so the suite reports not just "is enforcement
broken?" but "is it about to break, and how long do we have?".

Motivation, measured: codex shipped the payload change that broke the
2026-07-22 run in 0.145.0-alpha.4 on 2026-07-11, but did not release it
until 2026-07-21 — 10.7 days of observable warning, established by
installing each alpha and capturing its request body against a mock.

Six CLIs publish something usable (all verified live 2026-07-23):
  codex     npm alpha
  copilot   npm prerelease
  openclaw  npm beta
  cursor    install?channel=lab   (server-validated; beta/canary are 400)
  goose     CANARY=true           (rolling tag, prerelease:false)
  claude    latest                (INVERTED — see below)

claude runs backwards: nothing ships ahead of `latest`, which is the
bleeding edge at ~1 release/day. What exists is `stable`, ~13 days behind.
So the stable leg now pins `bash -s stable` — what conservative users run —
and `latest` becomes the early-warning ref. That also stops a same-day
Anthropic release red-lighting a PR that touched nothing.

The other six are skipped, not re-installed at stable and counted as
coverage: factory/antigravity/pi publish no pre-release; opencode's
beta/dev are ~31 branch snapshots a day, not RCs; devin's unpromoted
builds cannot be listed, only guessed; hermes's installer clones main,
which is also what its users get, so nothing is ahead of us.

Escalation is a CROSS-LEG comparison, not a beta FAIL. A CLI red on both
legs is already broken and belongs to the stable leg's alarm; the warning
is `stable green + beta not-green`, held two consecutive runs against
alpha churn. This is load-bearing: a vendor payload change stops the model
before it calls a tool, so it shows up as INCONCLUSIVE/ERROR and never as
FAIL — a FAIL-only rule would have missed the codex regression entirely.

The beta leg is advisory: run.sh exits 0 on it regardless, and each leg
gets its own Docker volume (a pre-release install overwrites the stable
binary in a shared $HOME) and Actions cache key (concurrent legs; a beta
result must never overwrite stable's gating record).

Coverage is printed in the report ("watching 6/12") because a pre-release
ref does not preview every release: codex only alphas minor bumps, so all
six recent 0.144.x patches shipped blind, and copilot 1.0.70 — the
silent-allow — had 0.6 days of lead.

__tests__/integration-suite/channel-refs.test.ts asserts run.sh's beta CLI
list matches install-clis.sh's beta refs; drift there would install stable
binaries and report them as pre-release coverage.

Verified: 2355 unit tests (20 in the suite's own tests), lint 0 errors,
bash -n on all three scripts, workflow YAML parsed back, and report.js
exercised against fixtures for both legs — first-miss holds, second
escalates, a both-red CLI defers to stable, and the stable path is
byte-identical to before.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 2

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In @.github/workflows/integration-suite.yml:
- Line 135: Update the CANARY_PEER_STATE expression in the matrix workflow to
flip the condition so the stable channel receives an explicit empty value, while
non-stable channels resolve to the cross-leg integration-suite-state.json path.

In `@integration-suite/report.js`:
- Around line 84-92: Update the beta header construction in the isBeta branch to
describe only the CLIs included in the current run, rather than claiming omitted
CLIs have no pre-release ref. Use the actual targeted-run coverage available
from the existing results or run metadata, and preserve the incoming-breakage
and no-breakage message variants.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro Plus

Run ID: 8b336dd4-3a22-4390-93e4-ba9f8680a7f1

📥 Commits

Reviewing files that changed from the base of the PR and between 382376f and 8612047.

⛔ Files ignored due to path filters (1)
  • bun.lock is excluded by !**/*.lock
📒 Files selected for processing (11)
  • .github/workflows/integration-suite.yml
  • CHANGELOG.md
  • __tests__/integration-suite/channel-refs.test.ts
  • __tests__/integration-suite/is-error.test.ts
  • integration-suite/README.md
  • integration-suite/ci-entrypoint.sh
  • integration-suite/install-clis.sh
  • integration-suite/probe-cli.sh
  • integration-suite/report.js
  • integration-suite/run.sh
  • package.json
🚧 Files skipped from review as they are similar to previous changes (1)
  • integration-suite/probe-cli.sh

Comment thread .github/workflows/integration-suite.yml Outdated
Comment thread integration-suite/report.js
…ing beta coverage

Both from CodeRabbit's review of the previous commit.

CANARY_PEER_STATE used `matrix.channel == 'stable' && '' || format(...)`.
GitHub Actions has no ternary and an empty true-branch is FALSY, so the
expression short-circuits to the fallback and BOTH legs got the same path
— the stable leg pointing at its own state as its "peer". Latent today
(report.js only reads the peer on the beta leg) but wrong, and exactly the
trap this file already documents thirty lines above for
CANARY_VERSION_GATED. Fixed by flipping the operands so the true branch is
the non-empty one; verified both ways against GHA's actual semantics.

The beta report hardcoded "/12 CLIs — the rest publish no pre-release ref".
run.sh accepts a CLI subset, so `run.sh cursor` claimed the other eleven
have no pre-release ref when they were merely not requested — overstating
coverage, the one thing an early-warning report must never do. run.sh now
passes the eligible count (the length of BETA_CLIS, which is already the
list the tripwire test pins to install-clis.sh) so a targeted run reads
"watching 2/6 CLIs that publish a pre-release ref (of 12 total)". Deriving
it rather than hardcoding avoids a third copy of the CLI list to drift
against.

Verified: 22 suite tests (2 new — one asserting the eligible count reaches
report.js, one failing the build if the falsy-ternary form comes back),
bash -n, node --check, and report.js re-exercised for the targeted-run case.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
@hermes-exosphere

Copy link
Copy Markdown
Contributor

Automated code review started - full review. Results will be posted here.

@hermes-exosphere

Copy link
Copy Markdown
Contributor

🔬 Re-review in progress — Phase 0-1 complete, starting test verification.

@hermes-exosphere

Copy link
Copy Markdown
Contributor

Automated Code Review (HEAD d770468)

Executive Summary

This PR adds a dual-channel (stable + beta) integration-suite workflow, pins codex to gpt-5.1-codex-mini after codex-cli 0.145.0 started sending encrypted reasoning that deepseek-v4-pro rejects, fixes three harness gaps, tightens is_error() regex accuracy, and bumps supply-chain dependencies (next 16.2.11, sharp 0.35.0). Code quality is very high -- thorough comments, tripwire tests that parse shell scripts to prevent drift, and robust error handling throughout.

Change Architecture

graph TD
    A["GitHub Actions Workflow"] -->|"matrix: [stable,beta]"| B["ci-entrypoint.sh"]
    B -->|"channel-scoped volumes"| C["install-clis.sh"]
    C -->|"stable ref OR beta ref"| D["probe-cli.sh"]
    D -->|"is_error() tightened"| E["run.sh"]
    E -->|"temp-file output + tail echo"| F["report.js"]
    F -->|"cross-leg comparison"| G["Slack / CI verdict"]
    H["CANARY_CODEX_MODEL"] -->|"now forwarded to container"| D
    I["new tests/is-error.test.ts"] -->|"14 fixtures"| D
    J["new tests/channel-refs.test.ts"] -->|"asserts list sync"| C
Loading

Breaking Changes

No breaking changes detected.

Issues Found

No blocking issues. All findings are informational:

  1. Info -- probe-cli.sh:199 -- is_error() regex includes bad.?request(error)? which matches any single char between "bad" and "request". Test suite confirms no false positives.

  2. Info -- run.sh:110 -- case match dumps probe tail on any FAIL/INCONCLUSIVE/ERROR/empty match. If a PASS output contains "FAIL" in agent prose, tail would dump unnecessarily -- harmless and unlikely.

  3. Info -- ci-entrypoint.sh:59-60 -- When CANARY_PEER_STATE maps to a non-existent file, report.js silently falls back to empty peer state, suppressing incoming-breakage signals. Configuration issue, not a code bug.

Logical / Bug Analysis

  • Race conditions: No races. Channel-scoped cache keys and volumes prevent concurrent matrix legs from overwriting each other.
  • Null/empty handling: Robust throughout.
  • Error handling: is_error() triage is fail-safe. fs.writeFileSync wrapped in try/catch. mktemp cleanup guaranteed.
  • Ternary trap in GHA: FIXED. CANARY_PEER_STATE expression flips operands to avoid empty-string falsy short-circuit.

Evidence -- Build & Test Results

Shell syntax validation -- all 4 scripts pass bash -n.
Unit tests -- 2,357 passed (131 test files, 0 failures).
New tests: channel-refs.test.ts (8/8 passed), is-error.test.ts (14/14 passed).

Review Thread Status

All 7 previous review threads are resolved. No human review comments.

Suggestions

  1. Consider adding a quick-debug section to README for targeted probe runs.
  2. The is_error() regex is now 180+ chars on one line -- if it grows further, consider a case/esac structure.

Verdict

VERDICT: APPROVED

Automated code review -- 2026-07-23

@hermes-exosphere hermes-exosphere left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Automated code review complete. All 2,357 tests pass. No blocking issues found. Approved.

@hermes-exosphere

Copy link
Copy Markdown
Contributor

Build & test complete. Results:

  • Shell syntax validation: 4/4 scripts pass bash -n
  • Unit tests: 2,357 passed (131 test files, 0 failures)
  • New tests: channel-refs.test.ts (8 passed), is-error.test.ts (14 passed)
  • Type checker and lint: blocked by filesystem security policy, but all tests compile and execute

@hermes-exosphere hermes-exosphere left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Automated review: Approved. ✅

@NiveditJain
NiveditJain merged commit 13955a2 into main Jul 23, 2026
11 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

bug Something isn't working

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants