{
  "campaign_root": "/srv/local_train/eval/work/REPLACE_WITH_FROZEN_E2_CAMPAIGN",
  "campaign_id": "REPLACE_WITH_FROZEN_CAMPAIGN_ID",
  "orchestrator_url": "http://127.0.0.1:8876",
  "admin_token_file": "/srv/local_train-local-secrets/orchestrator-admin.token",
  "state_db": "/srv/local_train-local-state/e2-business-driver.sqlite3",
  "owner_prefix": "e2-business-v1",
  "stage_config": "/srv/local_train-local-config/e2-pipeline-stage.json",
  "controller_lease_seconds": 120,
  "poll_seconds": 5,
  "stalled_after_seconds": 600,
  "stages": {
    "prepare": {
      "machine_id": "REPLACE_WITH_PRODUCTION_MACHINE_ID",
      "agent_role_id": "REPLACE_WITH_PREPARE_ROLE_ID",
      "memory_mb": 2048,
      "required_capabilities": ["production_host", "docker", "agent"],
      "prompt_template": "Prepare only frozen E2 source {instance_id}, campaign {campaign_id}, owner {owner}. Read stage configuration {stage_config} and verify preparation_sources hashes before using its preparation procedure. Public task: {task_file}; preserve exact bytes. Put receipts in {qualification_dir}. Use original grouping/near-duplicate checks, public-task review, default container preparation, baseline/control probe and cleanup. The existing ready_builder must produce {ready_path}; never manufacture ready flags. For the existing lane-b helper use prepare/finish/cleanup with --task-file {task_file} --out {qualification_dir}; do not use its legacy preflight/all command. queue.start performs the canonical preflight later. If this public task cannot qualify, register a zero-call blocked reason through the existing queue with a receipt; infrastructure uncertainty is an error, not a normal block. Do not claim another source, solve, run a teacher/student/private judge, change campaign state, reassign ownership or publish. Report the real final queue state and receipt paths. Worker task directory: {task_dir}."
    },
    "solve": {
      "machine_id": "REPLACE_WITH_PRODUCTION_MACHINE_ID",
      "handler": "e2-pipeline-stage",
      "memory_mb": 2048,
      "required_capabilities": ["production_host", "docker"]
    },
    "postprocess": {
      "machine_id": "REPLACE_WITH_PRODUCTION_MACHINE_ID",
      "handler": "e2-pipeline-stage",
      "memory_mb": 2048,
      "required_capabilities": ["production_host", "docker"]
    },
    "prepare-review": {
      "machine_id": "REPLACE_WITH_PRODUCTION_MACHINE_ID",
      "handler": "e2-pipeline-stage",
      "memory_mb": 1024,
      "required_capabilities": ["production_host"]
    },
    "review": {
      "machine_id": "REPLACE_WITH_MAC_REVIEW_MACHINE_ID",
      "agent_role_id": "REPLACE_WITH_REVIEW_ROLE_ID",
      "memory_mb": 1536,
      "required_capabilities": ["review", "agent"],
      "prompt_template": "Independently review E2 source {instance_id}; reviewer lease: {review_owner}. Read {inputs_dir}/review-input.json. Decode each files[name].content_base64 into a task-local folder, verify its sha256 and read all provided packet, pending review, public context and policies. Preserve all pending source/hash bindings. Review EVERY decision and actual tool call, including reasoning, actual observations, followup adoption, core fix/patch attribution and any independent masking reasons. Write complete schema-valid review.json at {task_dir}/review.json; all_decisions_reviewed and all_actual_tool_calls_reviewed may be true only after full review. Set keep, keep_with_masks or quarantine with explicit evidence; do not invent retained core or reinterpret path policy. Do not read raw runs/private judge/hidden tests/gold, invoke a solver/judge, change ownership, publish or claim admission. Original owner validation and native release determine admission."
    },
    "finalize-review": {
      "machine_id": "REPLACE_WITH_PRODUCTION_MACHINE_ID",
      "handler": "e2-pipeline-stage",
      "memory_mb": 2048,
      "required_capabilities": ["production_host", "publication"]
    }
  }
}
