{
  "schemaVersion": "1.0",
  "title": "PR Review Convergence",
  "nodes": [
    {
      "type": "nav",
      "id": "nav",
      "props": {
        "variant": "bar",
        "title": "Nano Workforce",
        "items": [
          {
            "label": "Overview",
            "page": "overview"
          },
          {
            "label": "Connect over MCP",
            "page": "mcp"
          },
          {
            "label": "Lineage",
            "page": "lineage"
          },
          {
            "label": "Convergence",
            "page": "home"
          },
          {
            "label": "Epics",
            "page": "epic"
          },
          {
            "label": "Feature",
            "page": "feature"
          },
          {
            "label": "Delivery Graphs",
            "page": "delivery-graphs"
          },
          {
            "label": "Tasks",
            "page": "tasks",
            "badge": {
              "source": "app",
              "table": "user_tasks",
              "filter": [],
              "tone": "danger",
              "refreshMs": 5000,
              "hideWhenZero": true
            }
          },
          {
            "label": "Cockpit",
            "page": "cockpit"
          },
          {
            "label": "Board",
            "page": "board"
          },
          {
            "label": "Velocity",
            "page": "velocity"
          }
        ],
        "sticky": true
      }
    },
    {
      "type": "text",
      "id": "title",
      "props": {
        "text": "PR Review Convergence",
        "variant": "heading"
      }
    },
    {
      "type": "text",
      "id": "subtitle",
      "props": {
        "text": "Submit a pull request to run the autonomous review-convergence loop. Answer escalations from the Task inbox at /tasks; cancel a run at any time.",
        "variant": "sub"
      }
    },
    {
      "type": "actionForm",
      "id": "submit",
      "props": {
        "title": "Submit a pull request",
        "submitLabel": "Start review",
        "action": {
          "path": "/app/api/actions/start/convergence-loop",
          "body": "{{form}}"
        },
        "fields": [
          {
            "key": "pr",
            "label": "owner/repo#123 or a GitHub PR URL",
            "type": "text",
            "required": true,
            "requiredMessage": "A PR reference is required (owner/repo#123 or a PR URL)"
          },
          {
            "key": "maxRounds",
            "label": "Max review rounds (blank = fleet default)",
            "type": "number"
          },
          {
            "key": "autoMerge",
            "label": "Auto-merge \u2014 after convergence, drive the merge-loop",
            "type": "checkbox"
          }
        ]
      }
    },
    {
      "type": "dataGrid",
      "id": "prs",
      "props": {
        "title": "Pull requests",
        "collapsible": true,
        "rowKey": "pr_key",
        "refreshMs": 5000,
        "data": {
          "kind": "datasource",
          "source": "app",
          "table": "pull_requests_read_model",
          "orderBy": {
            "field": "updated_at",
            "dir": "desc"
          },
          "filter": [
            {
              "field": "list_bucket",
              "in": ["active"]
            }
          ]
        },
        "tabs": [
          {
            "label": "Active",
            "filter": [
              {
                "field": "list_bucket",
                "in": ["active"]
              }
            ]
          },
          {
            "label": "History",
            "filter": [
              {
                "field": "list_bucket",
                "in": ["history"]
              }
            ]
          }
        ],
        "columns": [
          {
            "field": "title",
            "template": "{{title}}",
            "header": "Item",
            "subtitleField": "pr_key",
            "truncate": true,
            "width": "36%",
            "linkField": "url"
          },
          {
            "field": "status",
            "header": "Status",
            "link": {
              "kind": "processExplorer",
              "keyField": "process_key"
            }
          },
          {
            "field": "incident_message",
            "header": "Incident",
            "truncate": true,
            "badge": {
              "tone": "danger",
              "label": "1"
            }
          },
          {
            "field": "current_round",
            "header": "Round"
          },
          {
            "field": "active_worker",
            "header": "Agent"
          },
          {
            "field": "updated_at",
            "header": "Updated",
            "format": "datetime",
            "width": "9rem"
          }
        ],
        "rowActions": [
          {
            "label": "Cancel",
            "confirm": "Cancel this PR's review run?",
            "showWhenField": "process_key",
            "action": {
              "path": "/app/actions/cancel",
              "body": {
                "processInstanceKey": "{{row.process_key}}"
              }
            }
          },
          {
            "label": "Dismiss",
            "confirm": "Dismiss this finished PR? It acknowledges the terminal pull request and files it under History.",
            "showWhenField": "ack_open",
            "action": {
              "path": "/app/api/actions/acknowledge-pr",
              "body": {
                "pr_key": "{{row.pr_key}}"
              }
            }
          }
        ],
        "detail": {
          "linkField": "url",
          "fields": [
            {
              "field": "repo",
              "label": "Repository"
            },
            {
              "field": "number",
              "label": "PR number"
            },
            {
              "field": "active_worker",
              "label": "Agent (leasing worker)"
            },
            {
              "field": "lease_until",
              "label": "Activation lease until"
            },
            {
              "field": "incident_message",
              "label": "Incident"
            },
            {
              "field": "incident_key",
              "label": "Incident key"
            },
            {
              "field": "merged_at",
              "label": "Merged at"
            },
            {
              "field": "outcome",
              "label": "Outcome"
            },
            {
              "field": "epic_phase_label",
              "label": "Epic phase"
            }
          ],
          "children": [
            {
              "title": "Epic",
              "source": "app",
              "table": "plans",
              "parentField": "root_request_key",
              "childField": "plan_key",
              "columns": [
                {
                  "field": "title",
                  "header": "Epic root",
                  "truncate": true,
                  "linkField": "issue_url"
                },
                {
                  "field": "epic_phase",
                  "header": "Phase"
                }
              ]
            },
            {
              "title": "Epic slices",
              "source": "app",
              "table": "plan_tasks",
              "parentField": "root_request_key",
              "childField": "plan_key",
              "orderBy": {
                "field": "task_index",
                "dir": "asc"
              },
              "columns": [
                {
                  "field": "task_id",
                  "header": "Slice"
                },
                {
                  "field": "title",
                  "header": "Title",
                  "truncate": true
                },
                {
                  "field": "status",
                  "header": "Status"
                },
                {
                  "field": "pr_key",
                  "header": "PR"
                }
              ]
            },
            {
              "title": "Rounds",
              "source": "app",
              "table": "rounds",
              "parentField": "pr_key",
              "childField": "pr_key",
              "orderBy": {
                "field": "round_no",
                "dir": "asc"
              },
              "columns": [
                {
                  "field": "round_no",
                  "header": "#"
                },
                {
                  "field": "status",
                  "header": "Result"
                },
                {
                  "field": "worker",
                  "header": "Worker"
                },
                {
                  "field": "summary",
                  "header": "Summary"
                }
              ],
              "lazyField": {
                "field": "transcript",
                "label": "Transcript",
                "lazy": true
              }
            },
            {
              "title": "Escalations",
              "source": "app",
              "table": "escalations",
              "parentField": "pr_key",
              "childField": "pr_key",
              "orderBy": {
                "field": "id",
                "dir": "asc"
              },
              "columns": [
                {
                  "field": "round_no",
                  "header": "#"
                },
                {
                  "field": "kind",
                  "header": "Kind"
                },
                {
                  "field": "worker",
                  "header": "Worker"
                },
                {
                  "field": "question",
                  "header": "Question"
                },
                {
                  "field": "status",
                  "header": "Status"
                },
                {
                  "field": "answer",
                  "header": "Answer"
                }
              ],
              "lazyField": {
                "field": "transcript",
                "label": "Agent response",
                "lazy": true
              }
            },
            {
              "title": "Depends on",
              "source": "app",
              "table": "pr_dependencies",
              "parentField": "pr_key",
              "childField": "pr_key",
              "orderBy": {
                "field": "created_at",
                "dir": "asc"
              },
              "columns": [
                {
                  "field": "depends_on_key",
                  "header": "PR that must merge first"
                },
                {
                  "field": "created_at",
                  "header": "Declared"
                }
              ]
            }
          ]
        }
      }
    }
  ]
}
