{
  "name": "Synthetic agency approval gates — teaching example",
  "active": false,
  "nodes": [
    {
      "parameters": {},
      "id": "demo-start",
      "name": "Manual start",
      "type": "n8n-nodes-base.manualTrigger",
      "typeVersion": 1,
      "position": [
        240,
        300
      ]
    },
    {
      "parameters": {
        "mode": "runOnceForAllItems",
        "jsCode": "// Synthetic teaching example. No AI, network calls, deployment or billing.\nconst proposal = { id: 'PROP-DEMO-1', version: 2, clientId: 'CLIENT-DEMO' };\nconst baseline = {\n  messageId: 'MSG-DEMO-1', senderVerified: true,\n  proposalId: proposal.id, proposalVersion: 2, clientId: proposal.clientId,\n  approval: { approved: true, proposalId: proposal.id, proposalVersion: 2, clientId: proposal.clientId },\n  stagingChecksPassed: true, recoveryReady: true,\n};\nconst cases = [\n  { name: 'approved_scope_and_tests', input: baseline },\n  { name: 'sender_not_verified', input: { ...baseline, messageId: 'MSG-DEMO-2', senderVerified: false } },\n  { name: 'approval_denied', input: { ...baseline, messageId: 'MSG-DEMO-3', approval: { ...baseline.approval, approved: false } } },\n  { name: 'approval_for_old_version', input: { ...baseline, messageId: 'MSG-DEMO-4', approval: { ...baseline.approval, proposalVersion: 1 } } },\n  { name: 'approval_for_other_client', input: { ...baseline, messageId: 'MSG-DEMO-5', approval: { ...baseline.approval, clientId: 'OTHER-DEMO' } } },\n  { name: 'staging_checks_failed', input: { ...baseline, messageId: 'MSG-DEMO-6', stagingChecksPassed: false } },\n  { name: 'recovery_not_ready', input: { ...baseline, messageId: 'MSG-DEMO-7', recoveryReady: false } },\n  { name: 'duplicate_in_this_run', input: baseline },\n];\nconst seen = new Set(); // Per-run only: production requires durable storage + atomic locks.\nreturn cases.map(({name, input}) => {\n  let state;\n  const a = input.approval;\n  if (seen.has(input.messageId)) state = 'ignore_duplicate';\n  else if (input.senderVerified !== true) state = 'hold_identity';\n  else if (a?.approved !== true) state = 'hold_approval';\n  else if (a.proposalId !== input.proposalId || a.proposalVersion !== input.proposalVersion || a.clientId !== input.clientId) state = 'hold_scope';\n  else if (input.stagingChecksPassed !== true || input.recoveryReady !== true) state = 'hold_verification';\n  else state = 'ready_for_human_review';\n  seen.add(input.messageId);\n  return { json: { scenario: name, state, simulated: true, productionActionExecuted: false } };\n});\n"
      },
      "id": "demo-gates",
      "name": "Simulate eight gate scenarios",
      "type": "n8n-nodes-base.code",
      "typeVersion": 2,
      "position": [
        500,
        300
      ]
    }
  ],
  "connections": {
    "Manual start": {
      "main": [
        [
          {
            "node": "Simulate eight gate scenarios",
            "type": "main",
            "index": 0
          }
        ]
      ]
    }
  },
  "settings": {
    "executionOrder": "v1"
  },
  "pinData": {},
  "tags": []
}