{
  "formatVersion": "2.1.0",
  "id": "graph:content-pipeline",
  "revision": "1.0.0",
  "name": "Content pipeline",
  "graph": {
    "nodes": [
      {
        "id": "node:audience-insights",
        "name": "Audience insights",
        "kind": "task",
        "layout": {
          "x": 120,
          "y": 200
        },
        "inputs": [
          {
            "id": "in:brief",
            "direction": "input",
            "type": "builtin:object",
            "required": true
          }
        ],
        "outputs": [
          {
            "id": "out:result",
            "direction": "output",
            "type": "builtin:object"
          }
        ],
        "parameters": {
          "skillKey": "professional-answer",
          "taskVariable": {
            "question": "Who is the primary audience for this campaign?",
            "outputContract": {
              "shortAnswer": "One paragraph summary.",
              "fullAnswer": "Bullet list of segments and pains."
            }
          },
          "inputsConfig": {
            "brief": {
              "path": "input"
            }
          },
          "smartInput": {
            "paths": [
              {
                "path": "input",
                "label": "Campaign brief"
              }
            ]
          },
          "executionMapping": {
            "path": "content.audience",
            "mode": "replace",
            "map": {
              "shortAnswer": "output.parsed.shortAnswer",
              "fullAnswer": "output.parsed.fullAnswer"
            }
          },
          "taskConfiguration": {
            "executionStrategies": [],
            "aiTaskStrategies": {
              "pre": "synthesis"
            }
          },
          "metadata": {
            "catalogBinding": {
              "supportedCapabilities": {
                "synthesisContext": [
                  "execution-memory-only"
                ]
              }
            }
          }
        }
      },
      {
        "id": "node:competitor-angles",
        "name": "Competitor angles",
        "kind": "task",
        "layout": {
          "x": 360,
          "y": 200
        },
        "inputs": [
          {
            "id": "in:brief",
            "direction": "input",
            "type": "builtin:object",
            "required": true
          }
        ],
        "outputs": [
          {
            "id": "out:result",
            "direction": "output",
            "type": "builtin:object"
          }
        ],
        "parameters": {
          "skillKey": "professional-answer",
          "taskVariable": {
            "question": "What angles are competitors using in this space?",
            "outputContract": {
              "shortAnswer": "Top three competitor themes.",
              "fullAnswer": "Detailed comparison bullets."
            }
          },
          "inputsConfig": {
            "brief": {
              "path": "input"
            }
          },
          "smartInput": {
            "paths": [
              {
                "path": "input",
                "label": "Campaign brief"
              }
            ]
          },
          "executionMapping": {
            "path": "content.competitors",
            "mode": "replace",
            "map": {
              "shortAnswer": "output.parsed.shortAnswer",
              "fullAnswer": "output.parsed.fullAnswer"
            }
          },
          "taskConfiguration": {
            "executionStrategies": [],
            "aiTaskStrategies": {
              "pre": "synthesis"
            }
          },
          "metadata": {
            "catalogBinding": {
              "supportedCapabilities": {
                "synthesisContext": [
                  "execution-memory-only"
                ]
              }
            }
          }
        }
      },
      {
        "id": "node:seo-keywords",
        "name": "SEO keywords",
        "kind": "task",
        "layout": {
          "x": 600,
          "y": 200
        },
        "inputs": [
          {
            "id": "in:brief",
            "direction": "input",
            "type": "builtin:object",
            "required": true
          }
        ],
        "outputs": [
          {
            "id": "out:result",
            "direction": "output",
            "type": "builtin:object"
          }
        ],
        "parameters": {
          "skillKey": "professional-answer",
          "taskVariable": {
            "question": "Which keywords should this campaign target?",
            "outputContract": {
              "shortAnswer": "Primary keyword cluster.",
              "fullAnswer": "Grouped keyword list with intent."
            }
          },
          "inputsConfig": {
            "brief": {
              "path": "input"
            }
          },
          "smartInput": {
            "paths": [
              {
                "path": "input",
                "label": "Campaign brief"
              }
            ]
          },
          "executionMapping": {
            "path": "content.seo",
            "mode": "replace",
            "map": {
              "shortAnswer": "output.parsed.shortAnswer",
              "fullAnswer": "output.parsed.fullAnswer"
            }
          },
          "taskConfiguration": {
            "executionStrategies": [],
            "aiTaskStrategies": {
              "pre": "synthesis"
            }
          },
          "metadata": {
            "catalogBinding": {
              "supportedCapabilities": {
                "synthesisContext": [
                  "execution-memory-only"
                ]
              }
            }
          }
        }
      },
      {
        "id": "node:finalizer:package",
        "name": "Package finalizer",
        "kind": "finalizer",
        "layout": {
          "x": 360,
          "y": 380
        },
        "inputs": [
          {
            "id": "in:node:audience-insights",
            "direction": "input",
            "type": "builtin:object",
            "required": true
          },
          {
            "id": "in:node:competitor-angles",
            "direction": "input",
            "type": "builtin:object",
            "required": true
          },
          {
            "id": "in:node:seo-keywords",
            "direction": "input",
            "type": "builtin:object",
            "required": true
          }
        ],
        "outputs": [
          {
            "id": "out:package",
            "direction": "output",
            "type": "builtin:object"
          }
        ],
        "parameters": {
          "finalizerType": "aggregate",
          "config": {
            "sections": [
              {
                "sourceNodeId": "node:audience-insights",
                "sourcePortId": "out:result",
                "executionMemoryPath": "content.audience"
              },
              {
                "sourceNodeId": "node:competitor-angles",
                "sourcePortId": "out:result",
                "executionMemoryPath": "content.competitors"
              },
              {
                "sourceNodeId": "node:seo-keywords",
                "sourcePortId": "out:result",
                "executionMemoryPath": "content.seo"
              }
            ]
          }
        }
      }
    ],
    "edges": [
      {
        "id": "edge:node:audience-insights-to-finalizer",
        "from": {
          "nodeId": "node:audience-insights",
          "portId": "out:result"
        },
        "to": {
          "nodeId": "node:finalizer:package",
          "portId": "in:node:audience-insights"
        }
      },
      {
        "id": "edge:node:competitor-angles-to-finalizer",
        "from": {
          "nodeId": "node:competitor-angles",
          "portId": "out:result"
        },
        "to": {
          "nodeId": "node:finalizer:package",
          "portId": "in:node:competitor-angles"
        }
      },
      {
        "id": "edge:node:seo-keywords-to-finalizer",
        "from": {
          "nodeId": "node:seo-keywords",
          "portId": "out:result"
        },
        "to": {
          "nodeId": "node:finalizer:package",
          "portId": "in:node:seo-keywords"
        }
      }
    ],
    "inputs": [
      {
        "id": "graph-input:brief-audience-insights",
        "name": "Campaign brief",
        "type": "builtin:object",
        "target": {
          "nodeId": "node:audience-insights",
          "portId": "in:brief"
        },
        "contract": {
          "semanticKind": "content",
          "required": true,
          "schema": {
            "type": "object",
            "properties": {
              "title": {
                "type": "string"
              },
              "objective": {
                "type": "string"
              }
            }
          }
        }
      },
      {
        "id": "graph-input:brief-competitor-angles",
        "name": "Campaign brief",
        "type": "builtin:object",
        "target": {
          "nodeId": "node:competitor-angles",
          "portId": "in:brief"
        },
        "contract": {
          "semanticKind": "content",
          "required": true,
          "schema": {
            "type": "object",
            "properties": {
              "title": {
                "type": "string"
              },
              "objective": {
                "type": "string"
              }
            }
          }
        }
      },
      {
        "id": "graph-input:brief-seo-keywords",
        "name": "Campaign brief",
        "type": "builtin:object",
        "target": {
          "nodeId": "node:seo-keywords",
          "portId": "in:brief"
        },
        "contract": {
          "semanticKind": "content",
          "required": true,
          "schema": {
            "type": "object",
            "properties": {
              "title": {
                "type": "string"
              },
              "objective": {
                "type": "string"
              }
            }
          }
        }
      }
    ],
    "outputs": [
      {
        "id": "graph-output:content-package",
        "name": "Content package",
        "type": "builtin:object",
        "source": {
          "nodeId": "node:finalizer:package",
          "portId": "out:package"
        },
        "contract": {
          "semanticKind": "final-output",
          "required": true,
          "schema": {
            "type": "object"
          }
        }
      }
    ],
    "metadata": {
      "graphEntry": {
        "summary": "Campaign brief required to run the content pipeline.",
        "executionSchema": {
          "type": "object",
          "properties": {
            "title": {
              "type": "string"
            },
            "objective": {
              "type": "string"
            }
          }
        }
      },
      "graphResponse": {
        "summary": "Structured content package from parallel research steps.",
        "finalOutputSchema": {
          "type": "object"
        }
      },
      "modelConfig": {
        "cases": [
          {
            "id": "default",
            "modelConfig": {
              "preActionModel": {
                "kind": "profileChoice",
                "key": "cheap/default"
              },
              "skillModel": {
                "kind": "profileChoice",
                "key": "vol/default"
              },
              "postActionModel": {
                "kind": "profileChoice",
                "key": "cheap/default"
              }
            }
          },
          {
            "id": "rush",
            "when": {
              "path": "runtime.input.priority",
              "op": "eq",
              "value": "rush"
            },
            "modelConfig": {
              "preActionModel": {
                "kind": "profileChoice",
                "key": "vol/default"
              },
              "skillModel": {
                "kind": "profileChoice",
                "key": "deep/openai_deep"
              },
              "postActionModel": {
                "kind": "profileChoice",
                "key": "vol/default"
              }
            }
          }
        ],
        "fallbackPolicy": {
          "enabled": true,
          "allowedTriggers": [
            "nodeSlotMissing",
            "nodeModelUnavailable"
          ],
          "maxAttemptsPerSlot": 1
        }
      }
    }
  },
  "types": []
}
