Sidecar artefacts

Updated Sep 16, 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 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 (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, the host-gate result, the CodeScene result, and the host-review 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.
  • Review findings — set the canonical hostReviewFindingsFile field (in args.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 through hostReview, and never fails a task. In the default Dakar mode, the sink carries Dakar findings with severities mapped onto the CodeRabbit scale (critical becomes critical, high becomes major, medium becomes minor, and low becomes trivial). The former coderabbitFindingsFile name 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.