Sidecar artefacts

Updated Jul 27, 2026

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 (in odw.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 with agent_started/agent_finished per agent() call, tagged by adapter, label, and phase), result.json (the final return, including every reviewRounds, assessments, host-gate result, and CodeRabbit summary), and error.json. This is entirely ODW's domain — no workflow involvement. Regenerate the value per run, or use a shared ~/.odw/runs for a single pool; the sidecar keeps each run's logs beside its config and notes.
  • CodeRabbit findings — set coderabbitFindingsFile (in args.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.