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 host-review flow in mind. With the default
host-run review (reviewTool: "dakar" running dakar-review, or
reviewTool: "coderabbit" with coderabbitHostReview; see the configuration
list), agents never wait on the reviewer — the host absorbs rate-limit and
Flex-deferral 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 in CodeRabbit mode 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 selected
host-review findings are retained next to the run, without touching workflow
behaviour. Agent transcripts are durable; host-review findings are retained
only when the best-effort JSONL append succeeds. An invalid path or full disk
can make findings unavailable for inspection. 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, the host-gate result, the CodeScene result, and the host-review 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. - Review findings — set the canonical
hostReviewFindingsFilefield (inargs.json) to a sidecar JSONL path, e.g."$SIDECAR/coderabbit-findings.jsonl". Only that example filename is historical; the field and sink apply to the selected host reviewer. Every parsed finding (timestamp, task label, severity, file, comment, codegen instructions, suggestion count) is appended as a best-effort serialized JSONL write: a bad path or full disk degrades logging with a warning, reports the sink failure throughhostReview, and never fails a task. In the default Dakar mode, the sink carries Dakar findings with severities mapped onto the CodeRabbit scale (criticalbecomescritical,highbecomesmajor,mediumbecomesminor, andlowbecomestrivial). The formercoderabbitFindingsFilename remains a deprecated compatibility alias.
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.