# Bundle-layer patch for dsh-codex-review. # # Applied by the loader when this package is listed in `dsh.profile.bundles` # (or installed with `dsh plugin add`), BEFORE the profile's own # `cordis.patch.yml`. The user's profile patch addresses the same row by id # (`- id: codex-review`) and its `config` REPLACES this one wholesale — a # patch's `config` is not deep-merged, so restate every field you want to keep. # # This row also has a settings card on the Plugins page (see `src/client/`), which # writes into the same row. A card edit replaces this whole `config` with the # fields the card drew plus the schema defaults — so a field set only here and # absent from the schema (`childMaxDepth`, `persona`) reverts to its default after # a card edit. Everything else survives because the schema restates it. # # The reviewer is pinned by `provider` + `model` through the subagent service's # `agentOptions`, NOT by the session's route. `openai-codex` is the # subscription-backed ChatGPT route; if another plugin owns that route (for # example `dsh-codex-auth`, which registers it from the Codex CLI login in # ~/.codex/auth.json), nothing else here changes. # # Verification, in order: `dsh --profile
--dump-config` must show this row # with no load errors, and `/review` must answer — a route that is declared but # has no credentials fails at the first call, in the command result, with the # provider's own message. - insert: - id: codex-review name: dsh-codex-review config: # --- Who reviews ---------------------------------------------------- # `backend` names a registered subagent backend, not a model: `spawn` # is the harness's in-process fresh child (empty conversation, same # tools and working directory as the parent), `fork` would inherit this # conversation, and `codex` names the out-of-process Codex CLI backend # when a plugin providing it is installed. backend: spawn # The reviewer's route. Deliberately not the session's own route: the # model that wrote the change is the worst judge of it. provider: openai-codex # Models the account provider registers: gpt-6.1-sol, gpt-6-astra, # gpt-6-luna, gpt-6-sol, gpt-5.6-luna, gpt-5.6-sol, gpt-5.6-terra, # gpt-5.5, gpt-5.4, gpt-5.3-codex-spark (text only). Which of them an # account may actually call is the account's business, so the settings # card offers this list and still accepts a typed id. model: gpt-5.6-sol # Reviewer memory across calls in one chat. `shared` opens one continuable # reviewer child per session and hands it every later review, so it # remembers the revisions it already reviewed; its answer arrives in the # conversation and the command result is only a receipt. `fresh` runs a # one-shot reviewer per call and renders the report as the command's own # result, with no memory. conversation: shared # null leaves the effort to the route; otherwise one of # off, minimal, low, medium, high, xhigh, max. reasoningEffort: null # 0 forbids the reviewer from delegating further, but the request is # rejected by backends that do not advertise `depthLimit`, so null # (send nothing) is the safe default outside the in-process backends. childMaxDepth: null # Optional per-child persona section; requires the backend's `persona` # capability. The prompt below carries the reviewer's standing # instruction, so this stays null by default. persona: null # --- The command ---------------------------------------------------- command: review description: Review the current change set with the pinned reviewer model inputHint: "[focus — files, area, or the question you want answered; \"reset\" forgets the reviewer]" # --- What the reviewer is told -------------------------------------- # The default brief, so that a bare `/review` is a complete request: the # stance, the search order, and the evidence bar are all here. instruction: |- You are a delegated code reviewer, not the author and not a fixer: you report, you never edit a file, and you never run a command that changes the repository. You did not write this code, so your value is an outside read: judge the change against what it claims to do and against the code it touches, not against how you would have written it. Hunt for, in roughly this order: - correctness: wrong result, off-by-one, wrong operator, inverted condition, unreachable branch, unhandled null/empty/zero, silent truncation or rounding; - failure handling: an error swallowed, a resource not released, a retry that cannot succeed, a partial write left behind; - contracts: a caller not updated, a changed return shape or default, a migration or back-compat break, a test still asserting the old behaviour; - security and data: unvalidated input crossing a boundary, injection, a secret in the diff or the log, a destructive command, a permission widened; - concurrency and state: a shared mutable value, an await inside a loop, a race, a cache that never expires. Verify before you claim: open the file, read the surrounding code, check the caller and the test. Anything you could not verify is a question, not a finding. diffCommand: git --no-pager diff HEAD statusCommand: git --no-pager status --short # The review text is clamped here before it reaches the session; the # child session keeps the whole report. maxOutputChars: 40000