Keep these files together in the sidecar:
df12-build-odw.js: the copied workflow script that the live run executes.odw.config.json: the ODW runtime, adapter, model, workspace, and permission configuration for the run.args.json: the project-specific workflow arguments.operator-notes.md: the run id, launch command, local sidecar patches, validation notes, health checks, failures, and operator decisions.
Set concurrency to 16 in odw.config.json for normal Codex and Claude Code
workshops. That leaves room for an eight-task worker pool, four planning-stage
agents, four build-stage agents, and review, triage, audit, or assessment
slack. Keep maxAgents high (such as the ODW default of 1000) because it is
the per-run dispatch guard rather than the live process-pool size.
Set the adapter timeout with the CodeRabbit flow in mind. With the default
host-run CodeRabbit review (coderabbitHostReview, see the configuration
list), agents never wait on CodeRabbit — the host absorbs rate-limit backoff in
its own wall-clock — so the adapter timeout only needs to cover honest stage
work; 4500–5400 seconds (75–90 minutes) is generous, and a longer silent stream
is a hung connection, not progress. Only when coderabbitHostReview=false do
implementation agents wait through 45–90 minute CodeRabbit backoffs with
vsleep themselves, and then the timeout must be at least 21600 seconds to
avoid killing a healthy task mid-backoff.
Make sure every adapter named by args.json exists in odw.config.json or in
ODW's built-in adapter set. The checked-in ODW workflow now defaults planning
and review judgement to the claude adapter, so a Codex-only sidecar config
must either add a claude adapter or explicitly route those stages back to
Codex.
Minimal sidecar odw.config.json shape for the Claude/Codex split:
{
"defaultAdapter": "codex-medium",
"concurrency": 16,
"maxAgents": 1000,
"workspaceMode": "inplace",
"timeout": 5400,
"schemaRetries": 2,
"runsRoot": "/abs/path/to/example-project.workshop/df12-build-RUN/runs",
"workflowsRoot": "~/.odw/workflows",
"claudeJobsScope": "project",
"adapters": {
"claude": {
"label": "Claude Code",
"command": [
"claude",
"--print",
"--permission-mode",
"acceptEdits",
"--no-session-persistence"
],
"stdin": "{prompt}",
"flags": {
"model": ["--model"]
}
},
"codex-medium": {
"label": "Codex GPT 5.5 medium",
"timeout": 3600,
"command": [
"codex",
"--ask-for-approval",
"never",
"exec",
"--skip-git-repo-check",
"--sandbox",
"danger-full-access",
"-c",
"model_reasoning_effort=\"medium\"",
"--cd",
"{workspace}",
"-"
],
"stdin": "{prompt}",
"flags": {
"model": ["--model"]
}
},
"codex-high": {
"label": "Codex GPT 5.5 high",
"command": [
"codex",
"--ask-for-approval",
"never",
"exec",
"--skip-git-repo-check",
"--sandbox",
"danger-full-access",
"-c",
"model_reasoning_effort=\"high\"",
"--cd",
"{workspace}",
"-"
],
"stdin": "{prompt}",
"flags": {
"model": ["--model"]
}
}
}
}
Inspectable logs in the sidecar
Point both log sinks at the sidecar so a run's agent transcripts and CodeRabbit
findings are durably inspectable next to the run, without touching workflow
behaviour — both are out-of-band sinks outside the project Git worktree, so
they never enter a diff, trip workflow-freshness, or affect a gate:
- Agent logs — set
runsRoot(inodw.config.json) to an absolute path inside the run's sidecar, e.g."$SIDECAR/runs". ODW writes each run's durable artefacts there:events.jsonl(an ordered stream withagent_started/agent_finishedperagent()call, tagged by adapter, label, and phase),result.json(the final return, including everyreviewRounds,assessments, host-gate result, and CodeRabbit summary), anderror.json. This is entirely ODW's domain — no workflow involvement. Regenerate the value per run, or use a shared~/.odw/runsfor a single pool; the sidecar keeps each run's logs beside its config and notes. - CodeRabbit findings — set
coderabbitFindingsFile(inargs.json) to a sidecar JSONL path, e.g."$SIDECAR/coderabbit-findings.jsonl". Every parsed finding (timestamp, task label, severity, file, comment, codegen instructions, suggestion count) is appended best-effort: a bad path or full disk degrades logging with a warning and never fails a task.
Patch the sidecar copy only to recover or tune a live workshop. Record the
patch in operator-notes.md, validate it there, then promote the proven change
back to the df12-build repository through a normal branch.