Skip to content

fix(collaboration): scope catalog-state guidance to what we can attribute - #1407

Merged
Wibias merged 2 commits into
lidge-jun:devfrom
abhisheksharma2411:fix/1354-unknown-catalog-state-guidance
Aug 11, 2026
Merged

fix(collaboration): scope catalog-state guidance to what we can attribute#1407
Wibias merged 2 commits into
lidge-jun:devfrom
abhisheksharma2411:fix/1354-unknown-catalog-state-guidance

Conversation

@abhisheksharma2411

@abhisheksharma2411 abhisheksharma2411 commented Aug 10, 2026

Copy link
Copy Markdown

Fixes #1354.

Summary

v2 collaboration guidance mapped unknown to the same text as stale:

// src/server/responses/collaboration.ts
if (catalogState.state === "stale" || catalogState.state === "unknown") {
  return "<multi_agent_mode>The model catalog changed after Codex started; do not set "
    + "model or reasoning_effort overrides until Codex restarts.</multi_agent_mode>";
}

unknown does not mean the catalog changed. It means the comparison could not be made at all. collectCodexAppServerCatalogState returns unknown when the catalog mtime is unreadable, when process enumeration fails, or when any app-server's start time is unreadable:

// src/codex/app-server-processes.ts
if (catalogMtimeMs === null || withStarts.some(proc => proc.startedAtMs === null)) {
  return { state: "unknown", processes: withStarts, catalogMtimeMs };
}

A transient code-mode-host process that exits between enumeration and the start-time read lands exactly there, which is why the message appears intermittently and alternates with normal guidance from turn to turn, as the reporter describes.

So the text asserted a cause that was never established, and prescribed a remedy that cannot work — restarting Codex does not clear unknown, because the state is a failed measurement rather than a stale process.

Suppressing overrides while the state is unknown is still correct and is unchanged. Only the claim changes. unknown now gets its own message, mirroring the honest phrasing ocx doctor already uses for the same state (src/cli/doctor.ts):

Could not verify whether Codex's model catalog is current (app-server start time or catalog timestamp unreadable); do not set model or reasoning_effort overrides for this turn.

An operator reading a turn can now tell "the catalog changed" apart from "we could not check", and is no longer told to perform a restart that would not help.

Verification

Reproduced with a failing test before the fix — unknown returned the stale text verbatim:

expect(unknown).not.toContain("The model catalog changed after Codex started")
  Received: "<multi_agent_mode>The model catalog changed after Codex started; do not set
             model or reasoning_effort overrides until Codex restarts.</multi_agent_mode>"
(fail) v2 guidance does not assert a catalog change or a restart remedy when the state is unknown (#1354)

Commands run against the dev base (branch is on 3976d34):

bun test tests/multi-agent-compat.test.ts   → 42 pass, 0 fail
bun x tsc --noEmit                          → clean
coverage src/server/responses/collaboration.ts → 84.00% lines

The new test pins four things: stale keeps its exact wording; unknown asserts neither the cause nor the restart remedy; both still suppress the override instruction and positive model claims (so the #857 behaviour cannot regress); and the two messages stay distinguishable from each other.

The existing #857 test — which asserts both states suppress positive claims — passes unchanged.

Checklist

  • Scope stays focused and avoids unrelated cleanup. — two files, one behavioural branch split, no drive-by changes.
  • Docs or release notes were updated when needed. — no user-facing document describes this message; the unknown wording is deliberately aligned with the existing ocx doctor text so the two surfaces agree. Happy to add a note if you'd like one.
  • Security-sensitive changes were reviewed for secrets, auth, and unsafe defaults. — no secrets or auth touched. The change is strictly less assertive: it removes a false claim while keeping the conservative suppression, so no path becomes more permissive.

Notes for review

  • not_running and fresh are untouched.
  • I kept "do not set … overrides" in the unknown text so the instruction itself is unchanged; only the justification and the remedy differ.
  • Wording is lifted from doctor.ts on purpose — if you'd rather the two surfaces diverge, or prefer different phrasing, happy to adjust.

Review readiness checklist

This PR stays in draft until every box below is ticked. Tick all four boxes once the requirements are met:

  • All CI tests are green on my local testing.

  • I pushed my PR to the latest dev commit.

  • I resolved all correct Codex and CodeRabbit findings.

  • My PR is ready for review.

Summary by CodeRabbit

  • Bug Fixes

    • Suppressed model and reasoning-effort guidance when catalog information is stale or unavailable.
    • Preserved appropriate guidance for fresh and inactive catalog states.
    • Improved handling of mixed catalog states without applying blanket override restrictions.
  • Documentation

    • Added guidance explaining catalog states and how untrusted catalog information affects recommendations.
  • Tests

    • Added regression coverage for stale, unknown, mixed, fresh, and inactive catalog states.

@github-actions

Copy link
Copy Markdown
Contributor

Deterministic PR hygiene checks passed.

@github-actions github-actions Bot added the bug Something isn't working label Aug 10, 2026
@coderabbitai

coderabbitai Bot commented Aug 10, 2026

Copy link
Copy Markdown
Contributor

Review Change Stack

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: ASSERTIVE

Plan: Pro Plus

Run ID: e20a420e-8db9-4669-8f81-bd8e92f5c674

📥 Commits

Reviewing files that changed from the base of the PR and between 550091d and 04222e3.

📒 Files selected for processing (1)
  • docs-site/src/content/docs/guides/sub-agent-surface.md

📝 Walkthrough

Walkthrough

V2 collaboration guidance now suppresses catalog-derived guidance for stale and unknown states. Fresh and not_running states retain the existing guidance flow. Tests cover mixed process states and documentation describes the trust-state behavior.

Changes

Catalog Guidance

Layer / File(s) Summary
State-specific guidance and regression coverage
src/server/responses/collaboration.ts, tests/multi-agent-compat.test.ts
Stale and unknown states no longer emit catalog claims, roster, fallback, custom guidance, or blanket model and reasoning-effort override prohibitions. Tests cover mixed stale/fresh processes and fresh, not-running, stale, and unknown states.
Catalog trust-state documentation
docs-site/src/content/docs/guides/sub-agent-surface.md
The guide documents catalog states, suppressed disk-derived guidance, active tool-schema overrides, comparison failures, and recovery behavior.

Estimated code review effort: 2 (Simple) | ~10 minutes

Possibly related issues

  • lidge-jun/opencodex#1395 — The change addresses stale/unknown catalog guidance and adds mixed-process regression coverage.

Possibly related PRs

Suggested reviewers: lidge-jun, ingwannu

Sequence Diagram(s)

sequenceDiagram
  participant CatalogStateCollector
  participant CollaborationGuidance
  participant Caller
  CatalogStateCollector->>CollaborationGuidance: Provide catalog state
  alt stale or unknown
    CollaborationGuidance-->>Caller: Return no catalog-derived guidance
  else fresh or not_running
    CollaborationGuidance-->>Caller: Return preferred-model guidance
  end
Loading
🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 0.00% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title clearly describes the main change: limiting collaboration catalog guidance to attributable states.
Linked Issues check ✅ Passed The changes address #1354 by suppressing misleading guidance for unknown and stale states while preserving fresh and not-running behavior.
Out of Scope Changes check ✅ Passed The code, regression tests, and documentation changes directly support the linked issue and stated objectives.
✨ 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 commented Aug 10, 2026

Copy link
Copy Markdown
Contributor

✅ READY

  • all PR quality gates passed; the review readiness checklist is complete.

Review readiness checklist

  • ✅ All CI tests are green on my local testing.
  • ✅ I pushed my PR to the latest dev commit.
  • ✅ I resolved all correct Codex and CodeRabbit findings.
  • ✅ My PR is ready for review.

4/4 boxes ticked.

This pull request is already Ready for Review.
The review-ready label marks this PR as ready; review automation runs independently. If no CodeRabbit review appears, comment @coderabbitai review to request one.
Maintainers: @lidge-jun @Ingwannu @Wibias

@Ingwannu Ingwannu left a comment

Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

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

The wording split is directionally useful, but the current head still preserves the underlying request-scoping bug confirmed in #1395, so I am requesting changes.

collectCodexAppServerCatalogState() folds every current-user app-server into one global state, and the inbound request carries no sender PID or catalog fingerprint. A known-stale process A can therefore make a fresh process B receive this PR's do not set model or reasoning_effort instruction. Rewording only unknown does not fix that case, and the same identity limitation applies to both stale and unknown.

For either state, suppress OpenCodex's disk-derived preferred-model, roster, fallback, and custom guidance, but do not prohibit options advertised by the active spawn_agent tool. The minimal safe behavior is to return no OCX-authored v2 guidance for stale or unknown; keep fresh and not_running unchanged.

Please update the regression so a mixed stale/fresh process set can still produce the global stale observation without producing a blanket no-override instruction for an unidentified request. Also update the catalog/subagent behavior documentation, because this changes the user-visible guidance contract. Once that is done on current dev and exact-head CI is green, this can cover both #1354 and #1395 without a duplicate PR.

@coderabbitai

coderabbitai Bot commented Aug 10, 2026

Copy link
Copy Markdown
Contributor

@github-actions[bot]: The pull request is ready for review. I will review the changes.

⚠️ Action not completed

No files to review.

Note: CodeRabbit is an incremental review system and does not re-review already reviewed commits. This command is applicable only when automatic reviews are paused.

@Wibias Wibias left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Requesting changes. The wording split is useful, but the current head is not merge-ready.

Merge blockers

1. Global stale/unknown state still blocks valid overrides for unrelated fresh sessions

collectCodexAppServerCatalogState() folds every detected current-user app-server into one global state. A stale process A therefore makes the global result stale, even if the current request came from a fresh process B. multiAgentGuidanceText() has no sender PID/catalog identity, yet this PR still injects do not set model or reasoning_effort overrides for that global state.

That preserves the confirmed #1395 request-scoping bug. For stale and unknown, suppress OpenCodex-authored disk/catalog guidance, but do not prohibit model/reasoning options exposed by the active spawn_agent tool. The minimal safe behavior is to emit no OCX-authored v2 model guidance for those states, or otherwise make the active tool schema authoritative.

2. The new regression test locks in that incorrect contract

The added test explicitly requires both stale and unknown to contain do not set, so it codifies the #1395 bug instead of protecting the intended boundary.

Please add a mixed stale/fresh regression: one process starts before the catalog, another after it, collector resolves globally to stale, and an unidentified current v2 request must not receive a blanket no-override instruction.

Additional correctness gap

The new unknown message says (app-server start time or catalog timestamp unreadable), but unknown can also result from process-enumeration failure. That still asserts a cause which is not established. If any unknown guidance remains, keep it cause-neutral, e.g. Could not verify whether Codex's model catalog is current.

Docs / readiness

Because #1407 is now the selected overlapping fix path for #1354 and #1395, update the catalog/subagent guidance documentation to describe the actual stale/unknown contract.

The reviewed head is also behind current dev, and exact-head React Doctor / Cross-platform CI have not executed jobs yet (action_required, zero jobs). Rebase or merge current dev and get exact-head CI green before merge.

Security

I found no new exploitable security vulnerability in this diff. The blocking issues are correctness, request scoping, and regression coverage.

@Wibias
Wibias marked this pull request as draft August 10, 2026 22:09
@coderabbitai

coderabbitai Bot commented Aug 11, 2026

Copy link
Copy Markdown
Contributor

@github-actions: The pull request is ready for review. I will review the current changes.

⚠️ Action not completed

No files to review.

Note: CodeRabbit is an incremental review system and does not re-review already reviewed commits. This command is applicable only when automatic reviews are paused.

@abhisheksharma2411
abhisheksharma2411 force-pushed the fix/1354-unknown-catalog-state-guidance branch from 2e5f4f4 to 0ec70c5 Compare August 11, 2026 04:33
…bute

`collectCodexAppServerCatalogState()` folds every app-server owned by the
current user into ONE global observation, and an inbound request carries no
sender PID or catalog fingerprint. So a stale process A makes the global state
`stale` even when the request came from a fresh process B, and `unknown` can be
reached by a process-enumeration failure that says nothing about any particular
server.

v2 guidance nonetheless injected

    do not set model or reasoning_effort overrides until Codex restarts

off that global observation. Two problems follow:

  * it prohibits options the active `spawn_agent` tool legitimately advertises,
    for a request that cannot be attributed to the stale process (lidge-jun#1395); and
  * the same text was emitted for `unknown`, asserting a cause that was never
    established and a restart that cannot clear a failed measurement (lidge-jun#1354).

For `stale` and `unknown`, withhold opencodex's own disk-derived claims —
preferred model, roster, fallback, custom guidance — and say nothing about
overrides, leaving the active tool schema authoritative. `fresh` and
`not_running` are unchanged.

The previous regression asserted that both states contain `do not set`, which
codified the scoping bug; it is replaced by coverage that a mixed stale/fresh
process set resolving globally to `stale` produces no blanket no-override
instruction for an unidentified request.

Documents the four-state guidance contract in the sub-agent surface guide,
including why `unknown` is not a synonym for `stale`.

Verified:
  bun test tests/multi-agent-compat.test.ts        -> 43 pass, 0 fail
  bun test tests/codex-app-server-processes.test.ts -> 30 pass, 1 skip, 0 fail
  bun x tsc --noEmit                                -> clean

Fixes lidge-jun#1354
Fixes lidge-jun#1395
@abhisheksharma2411
abhisheksharma2411 force-pushed the fix/1354-unknown-catalog-state-guidance branch from 0ec70c5 to 550091d Compare August 11, 2026 04:33
@coderabbitai

coderabbitai Bot commented Aug 11, 2026

Copy link
Copy Markdown
Contributor

@github-actions[bot] The PR is marked ready for review. I will review the current changes.

✅ Action performed

Review finished.

Note: CodeRabbit is an incremental review system and does not re-review already reviewed commits. This command is applicable only when automatic reviews are paused.

@abhisheksharma2411

Copy link
Copy Markdown
Author

Thanks both — you're right, and the second point is the one that stings: my regression asserted do not set for both states, so it actively locked in the #1395 bug rather than protecting against it. Fixed on 550091d.

What changed

stale and unknown now return null — no opencodex-authored v2 model guidance at all. Preferred model, roster, fallback and custom guidance are withheld, and nothing is said about overrides, so the active spawn_agent schema stays authoritative. fresh and not_running are untouched.

Regression replaced. The new one builds a genuinely mixed process set through the collector — pid 42 starting before the catalog, pid 43 after — asserts the global observation really does resolve to stale, and then asserts an unidentified v2 request gets no blanket no-override instruction. That's the case the old test was papering over.

On the cause-neutrality point — you were right and I'd made the same mistake I was fixing. My unknown text said (app-server start time or catalog timestamp unreadable) while enumeration failure reaches that state too. Moot now that unknown emits nothing, but it was a fair catch.

Docs — added a four-state table to the sub-agent surface guide covering what each state does to guidance, why a global observation can't be attributed to a request, and why restarting clears stale but not necessarily unknown.

bun test tests/multi-agent-compat.test.ts         -> 43 pass, 0 fail
bun test tests/codex-app-server-processes.test.ts -> 30 pass, 1 skip, 0 fail
bun x tsc --noEmit                                -> clean

Rebased onto current dev (550091d sits directly on tip), so exact-head CI should have something to run now. Retitled and relabelled to reflect that this covers #1395 as well.

Happy to keep iterating if the null-guidance shape isn't quite what you had in mind for stale — I read "make the active tool schema authoritative" as returning nothing rather than emitting a softened message, but say the word if you'd prefer the latter.

@abhisheksharma2411 abhisheksharma2411 changed the title fix(collaboration): stop reporting unknown catalog state as a catalog change fix(collaboration): scope catalog-state guidance to what we can attribute Aug 11, 2026

@coderabbitai coderabbitai Bot 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.

Actionable comments posted: 1

🤖 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 `@docs-site/src/content/docs/guides/sub-agent-surface.md`:
- Line 231: Update the stale-state recovery statement in the sub-agent surface
guide to say that stale clears only when every detected current-user app-server
has started after the final catalog write; do not claim that restarting Codex
alone necessarily clears stale, while preserving the existing distinction for
unknown.
🪄 Autofix

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: Path: .coderabbit.yaml

Review profile: ASSERTIVE

Plan: Pro Plus

Run ID: 157ed10a-e253-4a05-8b8e-1906a1f87a8c

📥 Commits

Reviewing files that changed from the base of the PR and between 6b496df and 550091d.

📒 Files selected for processing (3)
  • docs-site/src/content/docs/guides/sub-agent-surface.md
  • src/server/responses/collaboration.ts
  • tests/multi-agent-compat.test.ts

Comment thread docs-site/src/content/docs/guides/sub-agent-surface.md Outdated
@github-actions
github-actions Bot marked this pull request as ready for review August 11, 2026 04:36
@coderabbitai

coderabbitai Bot commented Aug 11, 2026

Copy link
Copy Markdown
Contributor

@github-actions[bot] The pull request is ready for review. I will review the current changes.

⚠️ Action not completed

Already reviewed.

Note: CodeRabbit is an incremental review system and does not re-review already reviewed commits. This command is applicable only when automatic reviews are paused.

Clarify the distinction between 'stale' and 'unknown' states in the documentation.
@github-actions
github-actions Bot marked this pull request as draft August 11, 2026 05:10
@Wibias
Wibias marked this pull request as ready for review August 11, 2026 05:11
@coderabbitai

coderabbitai Bot commented Aug 11, 2026

Copy link
Copy Markdown
Contributor
🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
set -euo pipefail

echo '=== PR diff summary ==='
git diff --stat HEAD^ HEAD
echo
echo '=== Changed files ==='
git diff --name-only HEAD^ HEAD
echo
echo '=== Changed hunks ==='
git diff --unified=80 HEAD^ HEAD -- \
  src/server/responses/collaboration.ts \
  tests/multi-agent-compat.test.ts \
  docs-site/src/content/docs/guides/sub-agent-surface.md

echo
echo '=== Implementation outline ==='
ast-grep outline src/server/responses/collaboration.ts --items all --view expanded

echo
echo '=== Focused catalog-state references ==='
rg -n -C 5 '\b(stale|unknown|catalog|reasoning_effort|spawn_agent)\b' \
  src/server/responses/collaboration.ts \
  tests/multi-agent-compat.test.ts \
  docs-site/src/content/docs/guides/sub-agent-surface.md

Length of output: 96661


🏁 Script executed:

#!/bin/bash
set -euo pipefail

echo '=== Current commit and candidate bases ==='
git status --short --branch
git log --oneline --decorate -12
echo
git branch --all --contains HEAD || true
echo
echo '=== Available dev refs ==='
git for-each-ref --format='%(refname:short) %(objectname)' 'refs/remotes/*/dev' 'refs/heads/dev' || true

base_ref=""
for ref in origin/dev refs/remotes/origin/dev dev; do
  if git rev-parse --verify --quiet "$ref" >/dev/null; then
    base_ref="$ref"
    break
  fi
done

if [ -z "$base_ref" ]; then
  echo 'ERROR: No dev ref is available for full PR comparison.'
  exit 0
fi

merge_base="$(git merge-base HEAD "$base_ref")"
echo
echo "=== Full PR range: ${merge_base}..HEAD (base: ${base_ref}) ==="
git log --oneline "${merge_base}..HEAD"
echo
git diff --stat "${merge_base}..HEAD"
echo
git diff --unified=50 "${merge_base}..HEAD" -- \
  src/server/responses/collaboration.ts \
  tests/multi-agent-compat.test.ts \
  docs-site/src/content/docs/guides/sub-agent-surface.md

echo
echo '=== App-server collector outline ==='
collector="$(fd -a '^app-server-processes\.ts$' src | head -n 1)"
printf 'collector=%s\n' "$collector"
if [ -n "$collector" ]; then
  ast-grep outline "$collector" --items all --view expanded
  echo
  echo '=== Catalog-state collector implementation ==='
  rg -n -A100 -B15 '\bcollectCodexAppServerCatalogState\s*\(' "$collector"
fi

Length of output: 2546


🏁 Script executed:

#!/bin/bash
set -euo pipefail

echo '=== Commit ancestry ==='
git show -s --format='commit=%H%nparents=%P%nsubject=%s' 7779c057 550091d0 04222e36

echo
echo '=== Available PR diff: 7779c057..HEAD ==='
git diff --stat 7779c057..HEAD
git diff --unified=60 7779c057..HEAD -- \
  src/server/responses/collaboration.ts \
  tests/multi-agent-compat.test.ts \
  docs-site/src/content/docs/guides/sub-agent-surface.md

echo
echo '=== Guidance control flow, Lines 226-365 ==='
nl -ba src/server/responses/collaboration.ts | sed -n '226,365p'

echo
echo '=== Catalog-state collector source ==='
collector="$(fd -a '^app-server-processes\.ts$' src | head -n 1)"
printf 'collector=%s\n' "$collector"
if [ -z "$collector" ]; then
  echo 'ERROR: app-server-processes.ts was not found under src.'
  exit 0
fi
ast-grep outline "$collector" --items all --view expanded
rg -n -A130 -B20 '\bcollectCodexAppServerCatalogState\s*\(' "$collector"

echo
echo '=== Documentation state section with line numbers ==='
nl -ba docs-site/src/content/docs/guides/sub-agent-surface.md | sed -n '202,235p'

echo
echo '=== Tests for catalog-state guidance with line numbers ==='
nl -ba tests/multi-agent-compat.test.ts | sed -n '115,215p'

Length of output: 27091


🏁 Script executed:

#!/bin/bash
set -euo pipefail

echo '=== Guidance control flow ==='
sed -n '226,365p' src/server/responses/collaboration.ts | cat -n

echo
echo '=== Catalog-state collector files ==='
fd -a '^app-server-processes\.ts$' src

collector="$(fd -a '^app-server-processes\.ts$' src | head -n 1)"
if [ -z "$collector" ]; then
  echo 'ERROR: app-server-processes.ts was not found under src.'
  exit 0
fi

echo
echo "=== Collector outline: ${collector} ==="
ast-grep outline "$collector" --items all --view expanded

echo
echo '=== Collector implementation and related state tests ==='
rg -n -A150 -B30 '\bcollectCodexAppServerCatalogState\s*\(' "$collector"
test_collector="$(fd -a '^codex-app-server-processes\.test\.ts$' tests | head -n 1)"
if [ -n "$test_collector" ]; then
  echo
  echo "=== Collector test references: ${test_collector} ==="
  rg -n -A45 -B12 '\b(stale|fresh|unknown|not_running|collectCodexAppServerCatalogState)\b' "$test_collector"
fi

echo
echo '=== multiAgentGuidanceText call sites ==='
rg -n -A8 -B8 '\bmultiAgentGuidanceText\s*\(' src tests \
  -g '*.ts' -g '!tests/multi-agent-compat.test.ts'

echo
echo '=== Documentation state section ==='
sed -n '202,235p' docs-site/src/content/docs/guides/sub-agent-surface.md | cat -n

Length of output: 48343


@github-actions[bot] Review complete. I found no actionable issues in the inspected PR diff.

src/server/responses/collaboration.ts returns null for stale and unknown before it reads the catalog or builds preferred-model, roster, fallback, or custom guidance. This prevents a global process observation from blocking model or reasoning_effort options that the active spawn_agent schema supports.

tests/multi-agent-compat.test.ts covers both untrusted states and the mixed stale/fresh process case. The collector in src/codex/app-server-processes.ts also confirms that enumeration and timestamp failures resolve to unknown, while an app-server that started at or before the catalog write resolves to stale.

The repository sandbox did not permit test execution. The inspected test coverage and implementation are consistent with the PR objective.

⚠️ Action not completed

Already reviewed.

Note: CodeRabbit is an incremental review system and does not re-review already reviewed commits. This command is applicable only when automatic reviews are paused.

@coderabbitai

coderabbitai Bot commented Aug 11, 2026

Copy link
Copy Markdown
Contributor

Tip

For best results, initiate chat on the files or code changes.

@github-actions[bot] Acknowledged. The PR is ready for review. The current CodeRabbit review found no actionable issues.

You are interacting with an AI system.

@coderabbitai

coderabbitai Bot commented Aug 11, 2026

Copy link
Copy Markdown
Contributor

Tip

For best results, initiate chat on the files or code changes.

@github-actions[bot] Acknowledged. PR #1407 is marked ready for review. The current CodeRabbit review found no actionable issues.

You are interacting with an AI system.

@Wibias
Wibias dismissed Ingwannu’s stale review August 11, 2026 06:01

Addressed on later commits: stale/unknown no longer emit a blanket no-override instruction for unattributable global catalog state; docs and regressions cover the #1354/#1395 contract.

@Wibias Wibias left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Approving. The head scopes catalog-state guidance to what we can attribute: stale/unknown withhold disk-derived claims without a false restart/no-override prescription for unidentified requests, with regressions for mixed stale/fresh and unknown.

@Wibias

Wibias commented Aug 11, 2026

Copy link
Copy Markdown
Collaborator

Thanks @abhisheksharma2411 — this was useful because it stopped treating a failed catalog measurement (unknown) like a proven stale catalog, and then went further to stop global stale/unknown from blanket-blocking overrides on requests we cannot attribute to a specific app-server. Operators (and agents) now get honest guidance that matches ocx doctor, without a restart remedy that could never clear a measurement failure.

Merging now.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

bug Something isn't working review-ready

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants