{
  "$schema": "https://nanobpm.io/spec-app/nano-app.schema.json",
  "schemaVersion": 1,
  "id": "nano-workforce",
  "name": "Nano Workforce",
  "codename": "nano-workforce",
  "network": { "bind": "all" },
  "data": {
    "default": "app",
    "sources": {
      "app": {
        "driver": "sqlite",
        "url": "${NANO_APP_DB_URL:-file:./app.db}",
        "migrations": "db/migrations"
      }
    }
  },
  "instanceTracking": [
    {
      "table": "pull_requests",
      "keyField": "process_key",
      "statusField": "status",
      "activeStatuses": [
        "converging",
        "waiting_review",
        "escalated",
        "waiting_deps",
        "waiting_merge",
        "waiting_lane",
        "queued",
        "merging"
      ],
      "onTerminated": {
        "set": {
          "status": "abandoned"
        }
      },
      "pollMs": 5000
    },
    {
      "table": "plans",
      "keyField": "process_key",
      "statusField": "status",
      "activeStatuses": [
        "planning",
        "dispatched"
      ],
      "onTerminated": {
        "set": {
          "status": "abandoned"
        }
      },
      "pollMs": 5000
    },
    {
      "table": "feature_runs",
      "keyField": "process_key",
      "statusField": "status",
      "activeStatuses": [
        "running",
        "escalated",
        "awaiting_operator"
      ],
      "onTerminated": {
        "set": {
          "status": "abandoned"
        }
      },
      "pollMs": 5000
    },
    {
      "table": "plan_conformance",
      "keyField": "process_key",
      "statusField": "review_status",
      "activeStatuses": [
        "reviewing"
      ],
      "onTerminated": {
        "set": {
          "review_status": "reviewed"
        }
      },
      "pollMs": 5000
    },
    {
      "table": "delivery_graph_runs",
      "keyField": "process_key",
      "statusField": "status",
      "activeStatuses": [
        "running"
      ],
      "onTerminated": {
        "set": {
          "status": "failed"
        }
      },
      "pollMs": 5000
    },
    {
      "table": "delivery_units",
      "keyField": "process_key",
      "statusField": "dispatch_status",
      "activeStatuses": [
        "dispatched"
      ],
      "onTerminated": {
        "set": {
          "dispatch_status": "settled"
        }
      },
      "pollMs": 5000
    }
  ],
  "workers": [
    {
      "taskType": "pr.ensure-base-branch",
      "handler": "workers/ensure-base-branch/worker.ts"
    },
    {
      "taskType": "pr.persist-round",
      "handler": "workers/persist-round/worker.ts"
    },
    {
      "taskType": "pr.capture-head",
      "handler": "workers/capture-head/worker.ts"
    },
    {
      "taskType": "pr.persist-escalation",
      "handler": "workers/persist-escalation/worker.ts"
    },
    {
      "taskType": "pr.answer-escalation",
      "handler": "workers/answer-escalation/worker.ts"
    },
    {
      "taskType": "pr.finalize",
      "handler": "workers/finalize/worker.ts"
    },
    {
      "taskType": "pr.arm-merge",
      "handler": "workers/arm-merge/worker.ts"
    },
    {
      "taskType": "pr.merge",
      "handler": "workers/merge/worker.ts"
    },
    {
      "taskType": "pr.mark-merged",
      "handler": "workers/mark-merged/worker.ts"
    },
    {
      "taskType": "pr.merge-stall-probe",
      "handler": "workers/merge-stall-probe/worker.ts"
    },
    {
      "taskType": "pr.record-dependency",
      "handler": "workers/record-dependency/worker.ts"
    },
    {
      "taskType": "pr.record-plan",
      "handler": "workers/record-plan/worker.ts"
    },
    {
      "taskType": "pr.record-plan-review",
      "handler": "workers/record-plan-review/worker.ts"
    },
    {
      "taskType": "pr.select-wave",
      "handler": "workers/select-wave/worker.ts"
    },
    {
      "taskType": "pr.caps-prepare",
      "handler": "workers/caps-prepare/worker.ts"
    },
    {
      "taskType": "pr.record-wave",
      "handler": "workers/record-wave/worker.ts"
    },
    {
      "taskType": "pr.record-feature",
      "handler": "workers/record-feature/worker.ts"
    },
    {
      "taskType": "pr.record-feature-escalation",
      "handler": "workers/record-feature-escalation/worker.ts"
    },
    {
      "taskType": "pr.record-blocked-ack",
      "handler": "workers/record-blocked-ack/worker.ts"
    },
    {
      "taskType": "pr.converge-feature",
      "handler": "workers/converge-feature/worker.ts"
    },
    {
      "taskType": "pr.record-trial-merge",
      "handler": "workers/record-trial-merge/worker.ts"
    },
    {
      "taskType": "pr.resolve-trial-attention",
      "handler": "workers/resolve-trial-attention/worker.ts"
    },
    {
      "taskType": "pr.record-results",
      "handler": "workers/record-results/worker.ts"
    },
    {
      "taskType": "pr.retro-gather",
      "handler": "workers/retro-gather/worker.ts"
    },
    {
      "taskType": "pr.retro-record",
      "handler": "workers/retro-record/worker.ts"
    },
    {
      "taskType": "pr.conformance-record",
      "handler": "workers/conformance-record/worker.ts"
    },
    {
      "taskType": "pr.conformance-ack",
      "handler": "workers/conformance-ack/worker.ts"
    },
    {
      "taskType": "pr.progress-check",
      "handler": "workers/progress-check/worker.ts"
    },
    {
      "taskType": "pr.converge-gate",
      "handler": "workers/converge-gate/worker.ts"
    },
    {
      "taskType": "pr.readiness-probe",
      "handler": "workers/readiness-probe/worker.ts"
    },
    {
      "taskType": "pr.delivery-connector",
      "handler": "workers/delivery-connector/worker.ts"
    },
    {
      "taskType": "pr.record-feature-implementing",
      "handler": "workers/record-feature-implementing/worker.ts"
    },
    {
      "taskType": "pr.reconcile-implement",
      "handler": "workers/reconcile-implement/worker.ts"
    }
  ],
  "externalTaskTypes": [
    "senior:pr-review",
    "senior:fix-ci",
    "senior:rebase",
    "senior:plan",
    "senior:plan-review",
    "senior:feature",
    "senior:trial-merge",
    "senior:retro",
    "senior:conformance",
    "senior:scope-classify"
  ],
  "surfaces": {
    "taskInbox": {
      "enabled": true
    },
    "pages": {
      "enabled": true,
      "pagesDir": "pages",
      "homePage": "overview",
      "sourceName": "app"
    }
  },
  "ui": {
    "enabled": true,
    "portEnv": "PR_REVIEW_PORT",
    "path": "/",
    "label": "Nano Workforce",
    "icon": "assets/icon.svg"
  },
  "api": {
    "spec": "openapi.yaml",
    "dir": "operations",
    "validateResponses": "dev"
  }
}
