{
  "id": "gitstarsNotificationLab", "name": "Git-Stars notification rehearsal - synthetic addresses only", "active": false,
  "nodes": [
    {"id":"manual","name":"Run rehearsal","type":"n8n-nodes-base.manualTrigger","typeVersion":1,"position":[0,0],"parameters":{}},
    {"id":"samples","name":"Synthetic form submissions","type":"n8n-nodes-base.set","typeVersion":3.4,"position":[220,0],"parameters":{"mode":"raw","jsonOutput":"{\"submissions\":[{\"requestId\":\"REQ-1\",\"email\":\"first@example.invalid\"},{\"requestId\":\"REQ-1\",\"email\":\"first@example.invalid\"},{\"requestId\":\"REQ-2\",\"email\":\"not-an-email\"},{\"requestId\":\"REQ-3\",\"email\":\"retry@example.invalid\"}]}","options":{}}},
    {"id":"validation","name":"Validate and deduplicate this batch","type":"n8n-nodes-base.code","typeVersion":2,"position":[440,0],"parameters":{"jsCode":"const seen = new Set();\nreturn $input.first().json.submissions.map(row => {\n  const requestId = String(row.requestId ?? '').trim();\n  const email = String(row.email ?? '').trim().toLowerCase();\n  let outcome = 'ready';\n  if (!/^REQ-[0-9]+$/.test(requestId) || !/^[^\\s@]+@example\\.invalid$/.test(email)) outcome = 'invalid';\n  else if (seen.has(requestId)) outcome = 'duplicate-in-batch';\n  else seen.add(requestId);\n  return { json: { requestId, email, outcome, send: outcome === 'ready' } };\n});"}},
    {"id":"eligible","name":"Ready to send?","type":"n8n-nodes-base.if","typeVersion":2.2,"position":[660,0],"parameters":{"conditions":{"options":{"caseSensitive":true,"leftValue":"","typeValidation":"strict","version":2},"conditions":[{"id":"send","leftValue":"={{ $json.send }}","rightValue":true,"operator":{"type":"boolean","operation":"true","singleValue":true}}],"combinator":"and"},"options":{}}},
    {"id":"loop","name":"One notification at a time","type":"n8n-nodes-base.splitInBatches","typeVersion":3,"position":[880,-100],"parameters":{"batchSize":1,"options":{}}},
    {"id":"mail","name":"Send to test mailbox","type":"n8n-nodes-base.emailSend","typeVersion":2.1,"position":[1100,-60],"retryOnFail":true,"maxTries":2,"waitBetweenTries":1000,"parameters":{"fromEmail":"demo@example.invalid","toEmail":"={{ $json.email }}","subject":"={{ 'Synthetic request ' + $json.requestId }}","emailFormat":"text","text":"={{ 'Test only. Request ID: ' + $json.requestId }}","options":{}}},
    {"id":"done","name":"Completed eligible items","type":"n8n-nodes-base.noOp","typeVersion":1,"position":[1100,-260],"parameters":{}},
    {"id":"skipped","name":"Inspect rejected items","type":"n8n-nodes-base.noOp","typeVersion":1,"position":[880,160],"parameters":{}}
  ],
  "connections": {
    "Run rehearsal":{"main":[[{"node":"Synthetic form submissions","type":"main","index":0}]]},
    "Synthetic form submissions":{"main":[[{"node":"Validate and deduplicate this batch","type":"main","index":0}]]},
    "Validate and deduplicate this batch":{"main":[[{"node":"Ready to send?","type":"main","index":0}]]},
    "Ready to send?":{"main":[[{"node":"One notification at a time","type":"main","index":0}],[{"node":"Inspect rejected items","type":"main","index":0}]]},
    "One notification at a time":{"main":[[{"node":"Completed eligible items","type":"main","index":0}],[{"node":"Send to test mailbox","type":"main","index":0}]]},
    "Send to test mailbox":{"main":[[{"node":"One notification at a time","type":"main","index":0}]]}
  },
  "settings":{"executionOrder":"v1"}, "pinData":{}, "tags":[]
}
