Agency Finance
Prepare milestone-backed net-balance reminders — Discord embed review draft
Prepare reminder review drafts only for supported delivered-milestone invoices after applying compatible supplied credits. Prepare a Discord embed review draft.
Experimental native example · local preview · revision 1
WORKFLOW PREVIEW
See how it works
Use + and − to zoom, F to fit. Press Enter on a node to inspect it.
Private preview. These tested drafts are available for inspection. Adding them to a Vora workspace is still being tested.
What you need
- Authorized supplied job facts matching the original closed input contract.
- Explicit review metadata and target destination fields; no implicit team, channel, list or project selection.
Follow the workflow step by step
Supplied agency job and review metadata
Receive the explicitly supplied manual input packet.
Prepare milestone-backed net-balance reminders
Prepare reminder review drafts only for supported delivered-milestone invoices after applying compatible supplied credits.
- default: Discord embed review draft
Discord embed review draft
Prepare reminder review drafts only for supported delivered-milestone invoices after applying compatible supplied credits.
Setup and review
- Download the workflow JSON and inspect its jobInput and deliveryMetadata contracts.
- Supply the original agency job input plus explicit review metadata and destination.
- Run in an isolated test and inspect the complete jobResult, target status, holds and escape report before taking an external action.
Inspect every node
Expand a node to inspect its complete settings. Review the runtime and adoption evidence before installing it.
Supplied agency job and review metadata · wfManualTrigger
{
"label": "Supplied agency job and review metadata"
}Prepare milestone-backed net-balance reminders · code
{
"label": "Prepare milestone-backed net-balance reminders",
"code": "return (function(context){\nconst componentFunctions={\"agency-invoice-delivery-reconciliation\":function(context){\nconst slug=\"invoice-delivery-reconciliation\";\n\nfunction fail(reason){throw new Error('Invalid '+slug+' input: '+reason);}\nfunction safe(value){if(!Number.isSafeInteger(value))fail('unsafe integer arithmetic');return value;}\nfunction nonneg(value,name='quantity'){if(!Number.isSafeInteger(value)||value<0)fail(name+' must be nonnegative');return value;}\nfunction positive(value,name='quantity'){nonneg(value,name);if(value===0)fail(name+' must be positive');return value;}\nfunction ident(value){if(typeof value!=='string'||!value.trim())fail('blank identity');return value.trim();}\nfunction unique(values,key){const seen=new Set();for(const value of values){const k=ident(key?value[key]:value);if(seen.has(k))fail('duplicate identity');seen.add(k);}return values;}\nfunction rows(values,key='id'){return unique(values,key);}\nfunction sum(values){return values.reduce((total,value)=>safe(total+value),0);}\nfunction mul(a,b){return safe(a*b);}\nfunction sorted(values){return [...values].sort((a,b)=>a<b?-1:a>b?1:0);}\nfunction distinct(values){return [...new Set(values)];}\nfunction pair(a,b){return JSON.stringify([a,b]);}\nfunction day(value){if(typeof value!=='string'||!/^\\d{4}-\\d{2}-\\d{2}$/.test(value))fail('invalid calendar date');const n=Date.parse(value+'T00:00:00Z');if(!Number.isFinite(n)||new Date(n).toISOString().slice(0,10)!==value)fail('invalid calendar date');return n/86400000;}\nfunction dayText(value){const date=new Date(mul(value,86400000));if(!Number.isFinite(date.getTime())||date.getUTCFullYear()<0||date.getUTCFullYear()>9999)fail('four-digit calendar range');return date.toISOString().slice(0,10);}\nfunction stamp(value){const match=typeof value==='string'&&value.match(/^(\\d{4}-\\d{2}-\\d{2})T(\\d{2}):(\\d{2}):(\\d{2})(Z|[+-]\\d{2}:\\d{2})$/);if(!match)fail('invalid offset timestamp');day(match[1]);if(+match[2]>23||+match[3]>59||+match[4]>59)fail('invalid clock time');if(match[5]!=='Z'&&(+match[5].slice(1,3)>23||+match[5].slice(4)>59))fail('invalid offset');const n=Date.parse(value);if(!Number.isFinite(n))fail('invalid timestamp');return n/1000;}\nfunction stampText(value){const date=new Date(mul(value,1000));if(!Number.isFinite(date.getTime())||date.getUTCFullYear()<0||date.getUTCFullYear()>9999)fail('four-digit calendar range');return date.toISOString();}\nfunction interval(start,end){if(end<=start)fail('reversed or empty interval');}\nfunction normalize(value,key=''){if(typeof value==='string'&&(key==='id'||key.endsWith('Id')||key.endsWith('Ids')||['members','clients','partners','pageIds','expectedIds','jobs','requiredAttendees','requires','dependsOn'].includes(key)))return value.trim();if(Array.isArray(value))return value.map(v=>normalize(v,key));if(value&&typeof value==='object')return Object.fromEntries(Object.entries(value).map(([k,v])=>[k,normalize(v,k)]));return value;}\nfunction graphCheck(nodes,edges){const byId=new Map(rows(nodes).map(n=>[n.id,n]));const visiting=new Set(),done=new Set();function visit(id){if(visiting.has(id))fail('dependency cycle');if(done.has(id))return;const node=byId.get(id);if(!node)fail('unknown dependency reference');visiting.add(id);unique(edges(node));for(const target of edges(node)){if(target===id)fail('self prerequisite');visit(target);}visiting.delete(id);done.add(id);}for(const id of byId.keys())visit(id);return byId;}\nfunction monthNumber(date){day(date);return Number(date.slice(0,4))*12+Number(date.slice(5,7))-1;}\nfunction sweep(items,startKey,endKey,limit){const points=sorted(distinct(items.flatMap(item=>[item[startKey],item[endKey]]))).sort((a,b)=>a-b),out=[];for(let i=0;i+1<points.length;i++){const start=points[i],end=points[i+1],active=sorted(items.filter(item=>item[startKey]<=start&&item[endKey]>start).map(item=>item.id));if(active.length>limit){const last=out.at(-1);if(last&&last.end===start&&JSON.stringify(last.active)===JSON.stringify(active))last.end=end;else out.push({start,end,active});}}return out;}\nfunction httpUrl(value){if(typeof value!=='string'||/[\\u0000-\\u0020\\u007f<>\"\\\\]/.test(value)||/%(?![0-9a-f]{2})/i.test(value))return null;const m=value.match(/^https?:\\/\\/([^/?#]+)([^#]*)(?:#.*)?$/i);if(!m||m[1].includes('@'))return null;const authority=m[1].match(/^([^:]+)(?::(\\d{1,5}))?$/);if(!authority||(authority[2]&&Number(authority[2])>65535))return null;const host=authority[1],labels=host.split('.');if(host.length>253||labels.some(l=>!l||l.length>63||!/^[a-z0-9](?:[a-z0-9-]*[a-z0-9])?$/i.test(l)))return null;if(labels.every(l=>/^\\d+$/.test(l))&&(labels.length!==4||labels.some(l=>Number(l)>255||(l.length>1&&l[0]==='0'))))return null;const q=m[2].indexOf('?'),raw=q<0?'':m[2].slice(q+1),query=[];try{if(raw)for(const part of raw.split('&')){const at=part.indexOf('='),key=at<0?part:part.slice(0,at),val=at<0?'':part.slice(at+1);query.push([decodeURIComponent(key.replace(/\\+/g,' ')),decodeURIComponent(val.replace(/\\+/g,' '))]);}}catch{return null;}return {query};}\n\nconst input=normalize(context.input);\nreturn (input=>{\n const delivered=unique(input.deliveredMilestoneIds.map(ident)),seen=new Set(),byMilestone=new Map(),unsupportedBills=[];for(const b of input.billed){ident(b.invoiceId);ident(b.milestoneId);const key=pair(b.invoiceId,b.milestoneId);if(seen.has(key))fail('duplicate invoice milestone pair');seen.add(key);const invoices=byMilestone.get(b.milestoneId)||[];invoices.push(b.invoiceId);byMilestone.set(b.milestoneId,invoices);if(!delivered.includes(b.milestoneId))unsupportedBills.push({invoiceId:b.invoiceId,milestoneId:b.milestoneId});}unsupportedBills.sort((a,b)=>a.invoiceId<b.invoiceId?-1:a.invoiceId>b.invoiceId?1:a.milestoneId<b.milestoneId?-1:a.milestoneId>b.milestoneId?1:0);return {unbilledMilestoneIds:sorted(delivered.filter(id=>!byMilestone.has(id))),unsupportedBills,multiplyBilled:sorted([...byMilestone.keys()]).filter(id=>distinct(byMilestone.get(id)).length>1).map(milestoneId=>({milestoneId,invoiceIds:sorted(distinct(byMilestone.get(milestoneId)))}))};\n})(input);\n},\n\"agency-credit-adjusted-balance-review\":function(context){\nconst slug=\"credit-adjusted-balance-review\";\n\nfunction fail(reason){throw new Error('Invalid '+slug+' input: '+reason);}\nfunction safe(value){if(!Number.isSafeInteger(value))fail('unsafe integer arithmetic');return value;}\nfunction nonneg(value,name='quantity'){if(!Number.isSafeInteger(value)||value<0)fail(name+' must be nonnegative');return value;}\nfunction positive(value,name='quantity'){nonneg(value,name);if(value===0)fail(name+' must be positive');return value;}\nfunction ident(value){if(typeof value!=='string'||!value.trim())fail('blank identity');return value.trim();}\nfunction unique(values,key){const seen=new Set();for(const value of values){const k=ident(key?value[key]:value);if(seen.has(k))fail('duplicate identity');seen.add(k);}return values;}\nfunction rows(values,key='id'){return unique(values,key);}\nfunction sum(values){return values.reduce((total,value)=>safe(total+value),0);}\nfunction mul(a,b){return safe(a*b);}\nfunction sorted(values){return [...values].sort((a,b)=>a<b?-1:a>b?1:0);}\nfunction distinct(values){return [...new Set(values)];}\nfunction pair(a,b){return JSON.stringify([a,b]);}\nfunction day(value){if(typeof value!=='string'||!/^\\d{4}-\\d{2}-\\d{2}$/.test(value))fail('invalid calendar date');const n=Date.parse(value+'T00:00:00Z');if(!Number.isFinite(n)||new Date(n).toISOString().slice(0,10)!==value)fail('invalid calendar date');return n/86400000;}\nfunction dayText(value){const date=new Date(mul(value,86400000));if(!Number.isFinite(date.getTime())||date.getUTCFullYear()<0||date.getUTCFullYear()>9999)fail('four-digit calendar range');return date.toISOString().slice(0,10);}\nfunction stamp(value){const match=typeof value==='string'&&value.match(/^(\\d{4}-\\d{2}-\\d{2})T(\\d{2}):(\\d{2}):(\\d{2})(Z|[+-]\\d{2}:\\d{2})$/);if(!match)fail('invalid offset timestamp');day(match[1]);if(+match[2]>23||+match[3]>59||+match[4]>59)fail('invalid clock time');if(match[5]!=='Z'&&(+match[5].slice(1,3)>23||+match[5].slice(4)>59))fail('invalid offset');const n=Date.parse(value);if(!Number.isFinite(n))fail('invalid timestamp');return n/1000;}\nfunction stampText(value){const date=new Date(mul(value,1000));if(!Number.isFinite(date.getTime())||date.getUTCFullYear()<0||date.getUTCFullYear()>9999)fail('four-digit calendar range');return date.toISOString();}\nfunction interval(start,end){if(end<=start)fail('reversed or empty interval');}\nfunction normalize(value,key=''){if(typeof value==='string'&&(key==='id'||key.endsWith('Id')||key.endsWith('Ids')||['members','clients','partners','pageIds','expectedIds','jobs','requiredAttendees','requires','dependsOn'].includes(key)))return value.trim();if(Array.isArray(value))return value.map(v=>normalize(v,key));if(value&&typeof value==='object')return Object.fromEntries(Object.entries(value).map(([k,v])=>[k,normalize(v,k)]));return value;}\nfunction graphCheck(nodes,edges){const byId=new Map(rows(nodes).map(n=>[n.id,n]));const visiting=new Set(),done=new Set();function visit(id){if(visiting.has(id))fail('dependency cycle');if(done.has(id))return;const node=byId.get(id);if(!node)fail('unknown dependency reference');visiting.add(id);unique(edges(node));for(const target of edges(node)){if(target===id)fail('self prerequisite');visit(target);}visiting.delete(id);done.add(id);}for(const id of byId.keys())visit(id);return byId;}\nfunction monthNumber(date){day(date);return Number(date.slice(0,4))*12+Number(date.slice(5,7))-1;}\nfunction sweep(items,startKey,endKey,limit){const points=sorted(distinct(items.flatMap(item=>[item[startKey],item[endKey]]))).sort((a,b)=>a-b),out=[];for(let i=0;i+1<points.length;i++){const start=points[i],end=points[i+1],active=sorted(items.filter(item=>item[startKey]<=start&&item[endKey]>start).map(item=>item.id));if(active.length>limit){const last=out.at(-1);if(last&&last.end===start&&JSON.stringify(last.active)===JSON.stringify(active))last.end=end;else out.push({start,end,active});}}return out;}\nfunction httpUrl(value){if(typeof value!=='string'||/[\\u0000-\\u0020\\u007f<>\"\\\\]/.test(value)||/%(?![0-9a-f]{2})/i.test(value))return null;const m=value.match(/^https?:\\/\\/([^/?#]+)([^#]*)(?:#.*)?$/i);if(!m||m[1].includes('@'))return null;const authority=m[1].match(/^([^:]+)(?::(\\d{1,5}))?$/);if(!authority||(authority[2]&&Number(authority[2])>65535))return null;const host=authority[1],labels=host.split('.');if(host.length>253||labels.some(l=>!l||l.length>63||!/^[a-z0-9](?:[a-z0-9-]*[a-z0-9])?$/i.test(l)))return null;if(labels.every(l=>/^\\d+$/.test(l))&&(labels.length!==4||labels.some(l=>Number(l)>255||(l.length>1&&l[0]==='0'))))return null;const q=m[2].indexOf('?'),raw=q<0?'':m[2].slice(q+1),query=[];try{if(raw)for(const part of raw.split('&')){const at=part.indexOf('='),key=at<0?part:part.slice(0,at),val=at<0?'':part.slice(at+1);query.push([decodeURIComponent(key.replace(/\\+/g,' ')),decodeURIComponent(val.replace(/\\+/g,' '))]);}}catch{return null;}return {query};}\n\nconst input=normalize(context.input);\nreturn (input=>{\n rows(input.invoices);rows(input.credits);const invoices=new Map(input.invoices.map(i=>{ident(i.currency);nonneg(i.balanceMinor,'balance');return [i.id,{invoiceId:i.id,adjustedMinor:i.balanceMinor,currency:i.currency}];})),quarantinedCreditIds=[];for(const c of input.credits){nonneg(c.amountMinor,'credit');ident(c.invoiceId);ident(c.currency);const invoice=invoices.get(c.invoiceId);if(!invoice||invoice.currency!==c.currency){quarantinedCreditIds.push(c.id);continue;}invoice.adjustedMinor=safe(invoice.adjustedMinor-c.amountMinor);}return {balances:[...invoices.values()].map(({invoiceId,adjustedMinor})=>({invoiceId,adjustedMinor})),quarantinedCreditIds};\n})(input);\n},\n\"agency-invoice-reminder-eligibility\":function(context){\n\nfunction obj(value, keys, required = keys) {\n if (!value || typeof value !== 'object' || Array.isArray(value)) throw new Error('Expected object');\n if (Object.keys(value).some(key => !keys.includes(key))) throw new Error('Unknown input field');\n if (required.some(key => !Object.hasOwn(value, key))) throw new Error('Missing required input field');\n return value;\n}\nfunction text(value, name, max = 200, allowEmpty = false) {\n if (typeof value !== 'string' || value.length > max || (!allowEmpty && !value.trim())) throw new Error('Invalid ' + name);\n return value.trim();\n}\nfunction list(value, name, max = 500) {\n if (!Array.isArray(value) || value.length > max) throw new Error('Invalid ' + name);\n return value;\n}\nfunction int(value, name, min = 0, max = Number.MAX_SAFE_INTEGER) {\n if (!Number.isSafeInteger(value) || value < min || value > max) throw new Error('Invalid ' + name);\n return value;\n}\nfunction amount(value, name) {\n if (!Number.isFinite(value) || value < 0 || value > 1000000000) throw new Error('Invalid ' + name);\n return value;\n}\nfunction email(value) { return /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/.test(value); }\nfunction day(value) {\n if (typeof value !== 'string' || !/^\\d{4}-\\d{2}-\\d{2}$/.test(value)) throw new Error('Invalid calendar date');\n const ms = Date.parse(value + 'T00:00:00Z');\n if (!Number.isFinite(ms) || new Date(ms).toISOString().slice(0, 10) !== value) throw new Error('Invalid calendar date');\n return ms;\n}\nfunction instant(value) {\n if (typeof value !== 'string' || !/^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}(\\.\\d{3})?Z$/.test(value)) throw new Error('Invalid UTC timestamp');\n const ms = Date.parse(value);\n const normalized = value.includes('.') ? value : value.replace('Z', '.000Z');\n if (!Number.isFinite(ms) || new Date(ms).toISOString() !== normalized) throw new Error('Invalid UTC timestamp');\n return ms;\n}\nfunction uniqueIds(items) {\n const ids = items.map(item => text(item.id, 'item ID', 120));\n if (new Set(ids).size !== ids.length) throw new Error('Duplicate item ID');\n return ids;\n}\nfunction ratioBps(numerator, denominator) {\n const n = BigInt(numerator) * 10000n;\n const d = BigInt(denominator);\n const quotient = n / d;\n const floor = n < 0n && n % d !== 0n ? quotient - 1n : quotient;\n const result = Number(floor);\n if (!Number.isSafeInteger(result)) throw new Error('Unsafe calculated ratio');\n return result;\n}\n\n\nconst x = obj(context.input, ['invoiceId','state','dueDate','asOf','outstandingMinor','reminderHold']);\nconst invoiceId = text(x.invoiceId, 'invoice ID', 120);\nif (!['open','draft','paid','void','uncollectible'].includes(x.state)) throw new Error('Invalid invoice state');\nif (typeof x.reminderHold !== 'boolean') throw new Error('Missing reminder hold flag');\nint(x.outstandingMinor, 'outstanding minor units');\nconst due = day(x.dueDate), observed = day(x.asOf);\nconst daysOverdue = Math.max(0, Math.floor((observed - due) / 86400000));\nconst reasons = [];\nif (x.state !== 'open') reasons.push('not_open');\nif (x.outstandingMinor === 0) reasons.push('no_balance');\nif (observed <= due) reasons.push('not_overdue');\nif (x.reminderHold) reasons.push('reminder_hold');\nreturn {invoiceId, eligible:reasons.length === 0, daysOverdue, reasons};\n\n}};\nreturn (function recipeRuntime(context,program,components,inputSchema,outputSchema,identityPolicy){\n const fail=message=>{throw new Error(message);};\n const idName=k=>k==='id'||/Id$|Ids$/.test(k)||['requires','role','requiredRoles','stage','requiredStages','scope','key','requestFingerprint'].includes(k);\n const checkIdentities=(value,key='',at='')=>{\n if(typeof value==='string'&&idName(key)){\n const blank=identityPolicy.emptyAllowedPaths.includes(at)&&value==='';\n if(!blank&&(!value||value.trim()!==value||value.length>identityPolicy.maximumLength||/[\\u0000-\\u001f\\u007f]/.test(value)))fail('invalid exact id');\n }else if(Array.isArray(value)){\n const seen=new Set();\n for(const item of value){if(item&&typeof item==='object'&&!Array.isArray(item)&&Object.hasOwn(item,'id')){if(seen.has(item.id))fail('duplicate id');seen.add(item.id);}checkIdentities(item,key,at+'[]');}\n }else if(value&&typeof value==='object')for(const [k,v]of Object.entries(value))checkIdentities(v,k,at?at+'.'+k:k);\n };\n const shape=(schema,value,at='$',depth=0)=>{\n if(depth>32)fail('input nesting exceeded');\n if(schema.type==='object'){\n if(!value||typeof value!=='object'||Array.isArray(value))fail('invalid object '+at);\n for(const k of Object.keys(value))if(!Object.hasOwn(schema.properties,k))fail('unknown field '+k);\n for(const k of schema.required||[])if(!Object.hasOwn(value,k))fail('missing field '+k);\n for(const [k,v]of Object.entries(value))shape(schema.properties[k],v,at+'.'+k,depth+1);\n }else if(schema.type==='array'){\n if(!Array.isArray(value)||value.length>(schema.maxItems??100)||value.length<(schema.minItems??0))fail('invalid array '+at);\n value.forEach((v,i)=>shape(schema.items,v,at+'['+i+']',depth+1));\n }else if(schema.type==='string'){\n if(typeof value!=='string'||value.length>(schema.maxLength??2000)||value.length<(schema.minLength??0))fail('invalid string '+at);\n if(schema.enum&&!schema.enum.includes(value))fail('invalid enum '+at);\n const key=at.split('.').at(-1);\n if(['asOfDate','startDate','endDate','dueDate'].includes(key)||(key==='asOf'&&value.length===10)){\n if(!/^\\d{4}-\\d{2}-\\d{2}$/.test(value)||!Number.isFinite(Date.parse(value+'T00:00:00Z'))||new Date(value+'T00:00:00Z').toISOString().slice(0,10)!==value)fail('invalid date');\n }\n }else if(schema.type==='boolean'){if(typeof value!=='boolean')fail('invalid boolean '+at);}\n else if(schema.type==='integer'||schema.type==='number'){if(typeof value!=='number'||!Number.isFinite(value)||(schema.type==='integer'&&!Number.isSafeInteger(value))||value<(schema.minimum??-Number.MAX_VALUE)||value>(schema.maximum??Number.MAX_VALUE))fail('invalid number '+at);}\n else fail('unsupported shape type');\n };\n checkIdentities(context.input);shape(inputSchema,context.input);\n const budget={remaining:1000000};\n const intrinsic=(name,args)=>{\n const [a,b]=args;\n switch(name){\n case 'eq':return a===b;case 'ne':return a!==b;case 'gt':return a>b;case 'gte':return a>=b;case 'lt':return a<b;case 'lte':return a<=b;\n case 'not':return !a;case 'and':return args.every(Boolean);case 'or':return args.some(Boolean);\n case 'length':if(!Array.isArray(a)&&typeof a!=='string')fail('length requires collection');return a.length;\n case 'includes':if(!Array.isArray(a))fail('includes requires array');return a.includes(b);\n case 'concat':if(args.some(x=>!Array.isArray(x)))fail('concat requires arrays');return [].concat(...args);\n case 'unique':return [...new Set(a)];case 'flatten':return a.flat();\n case 'trim':return a.trim();case 'lower':return a.toLowerCase();\n case 'max':return Math.max(...args);case 'min':return Math.min(...args);\n case 'stringConcat':return args.join('');\n case 'everyTrue':return a.every(Boolean);case 'someTrue':return a.some(Boolean);\n case 'assert':if(!a)fail(b);return true;\n default:fail('unsupported intrinsic');\n }\n };\n const evaluate=(e,env)=>{\n if(--budget.remaining<0)fail('recipe evaluation budget exceeded');\n if(Object.hasOwn(e,'literal'))return e.literal;\n if(e.get){let value=env;for(const k of e.get){if(value===null||value===undefined||!Object.hasOwn(value,k))fail('missing mapped value '+e.get.join('.'));value=value[k];}return value;}\n if(e.object){const value={};for(const [k,v]of Object.entries(e.object))value[k]=evaluate(v,env);return value;}\n if(e.array)return e.array.map(x=>evaluate(x,env));\n if(Object.hasOwn(e,'if'))return evaluate(e.if,env)?evaluate(e.then,env):evaluate(e.else,env);\n if(e.call)return intrinsic(e.call,e.args.map(x=>evaluate(x,env)));\n if(e.component)return components[e.component]({input:evaluate(e.input,env)});\n if(e.let){const local=Object.assign(Object.create(null),env);for(const b of e.let)local[b.name]=evaluate(b.value,local);return evaluate(e.return,local);}\n for(const kind of ['map','filter','find'])if(Object.hasOwn(e,kind)){\n const rows=evaluate(e[kind],env);if(!Array.isArray(rows)||rows.length>100)fail('mapped collection bounds exceeded');\n const use=row=>{const local=Object.assign(Object.create(null),env);local[e.as]=row;return evaluate(e[kind==='map'?'body':'where'],local);};\n if(kind==='map')return rows.map(use);if(kind==='filter')return rows.filter(use);\n for(const row of rows)if(use(row))return row;return evaluate(e.default,env);\n }\n fail('unknown runtime expression');\n };\n const env=Object.create(null);env.input=context.input;for(const b of program.bindings)env[b.name]=evaluate(b.value,env);\n const result=evaluate(program.output,env);shape(outputSchema,result,'$output');return result;\n})(context,{\"schemaVersion\":\"vora.bounded-recipe-program.v1\",\"bindings\":[{\"name\":\"billingReferencesValid\",\"value\":{\"call\":\"assert\",\"args\":[{\"call\":\"everyTrue\",\"args\":[{\"map\":{\"get\":[\"input\",\"delivery\",\"billed\"]},\"as\":\"b\",\"body\":{\"call\":\"someTrue\",\"args\":[{\"map\":{\"get\":[\"input\",\"invoices\"]},\"as\":\"i\",\"body\":{\"call\":\"eq\",\"args\":[{\"get\":[\"i\",\"id\"]},{\"get\":[\"b\",\"invoiceId\"]}]}}]}}]},{\"literal\":\"unknown invoice reference\"}]}},{\"name\":\"delivery\",\"value\":{\"component\":\"agency-invoice-delivery-reconciliation\",\"input\":{\"get\":[\"input\",\"delivery\"]}}},{\"name\":\"balances\",\"value\":{\"component\":\"agency-credit-adjusted-balance-review\",\"input\":{\"object\":{\"invoices\":{\"map\":{\"get\":[\"input\",\"invoices\"]},\"as\":\"i\",\"body\":{\"object\":{\"id\":{\"get\":[\"i\",\"id\"]},\"currency\":{\"get\":[\"i\",\"currency\"]},\"balanceMinor\":{\"get\":[\"i\",\"balanceMinor\"]}}}},\"credits\":{\"get\":[\"input\",\"credits\"]}}}}},{\"name\":\"review\",\"value\":{\"map\":{\"get\":[\"input\",\"invoices\"]},\"as\":\"i\",\"body\":{\"let\":[{\"name\":\"bills\",\"value\":{\"filter\":{\"get\":[\"input\",\"delivery\",\"billed\"]},\"as\":\"b\",\"where\":{\"call\":\"eq\",\"args\":[{\"get\":[\"b\",\"invoiceId\"]},{\"get\":[\"i\",\"id\"]}]}}},{\"name\":\"unsupported\",\"value\":{\"call\":\"or\",\"args\":[{\"call\":\"eq\",\"args\":[{\"call\":\"length\",\"args\":[{\"get\":[\"bills\"]}]},{\"literal\":0}]},{\"call\":\"someTrue\",\"args\":[{\"map\":{\"get\":[\"delivery\",\"unsupportedBills\"]},\"as\":\"b\",\"body\":{\"call\":\"eq\",\"args\":[{\"get\":[\"b\",\"invoiceId\"]},{\"get\":[\"i\",\"id\"]}]}}]}]}},{\"name\":\"multiply\",\"value\":{\"call\":\"someTrue\",\"args\":[{\"map\":{\"get\":[\"delivery\",\"multiplyBilled\"]},\"as\":\"b\",\"body\":{\"call\":\"includes\",\"args\":[{\"get\":[\"b\",\"invoiceIds\"]},{\"get\":[\"i\",\"id\"]}]}}]}},{\"name\":\"creditConflict\",\"value\":{\"call\":\"someTrue\",\"args\":[{\"map\":{\"get\":[\"input\",\"credits\"]},\"as\":\"c\",\"body\":{\"call\":\"and\",\"args\":[{\"call\":\"eq\",\"args\":[{\"get\":[\"c\",\"invoiceId\"]},{\"get\":[\"i\",\"id\"]}]},{\"call\":\"includes\",\"args\":[{\"get\":[\"balances\",\"quarantinedCreditIds\"]},{\"get\":[\"c\",\"id\"]}]}]}}]}},{\"name\":\"gateReasons\",\"value\":{\"call\":\"concat\",\"args\":[{\"if\":{\"get\":[\"unsupported\"]},\"then\":{\"array\":[{\"literal\":\"unsupported_delivery\"}]},\"else\":{\"literal\":[]}},{\"if\":{\"get\":[\"multiply\"]},\"then\":{\"array\":[{\"literal\":\"multiply_billed\"}]},\"else\":{\"literal\":[]}},{\"if\":{\"get\":[\"creditConflict\"]},\"then\":{\"array\":[{\"literal\":\"credit_conflict\"}]},\"else\":{\"literal\":[]}}]}},{\"name\":\"balance\",\"value\":{\"find\":{\"get\":[\"balances\",\"balances\"]},\"as\":\"b\",\"where\":{\"call\":\"eq\",\"args\":[{\"get\":[\"b\",\"invoiceId\"]},{\"get\":[\"i\",\"id\"]}]},\"default\":{\"literal\":null}}},{\"name\":\"outstanding\",\"value\":{\"call\":\"max\",\"args\":[{\"literal\":0},{\"get\":[\"balance\",\"adjustedMinor\"]}]}},{\"name\":\"reminder\",\"value\":{\"if\":{\"call\":\"eq\",\"args\":[{\"call\":\"length\",\"args\":[{\"get\":[\"gateReasons\"]}]},{\"literal\":0}]},\"then\":{\"component\":\"agency-invoice-reminder-eligibility\",\"input\":{\"object\":{\"invoiceId\":{\"get\":[\"i\",\"id\"]},\"state\":{\"get\":[\"i\",\"state\"]},\"dueDate\":{\"get\":[\"i\",\"dueDate\"]},\"asOf\":{\"get\":[\"input\",\"asOf\"]},\"outstandingMinor\":{\"get\":[\"outstanding\"]},\"reminderHold\":{\"get\":[\"i\",\"reminderHold\"]}}}},\"else\":{\"literal\":{\"eligible\":false,\"reasons\":[],\"daysOverdue\":0}}}}],\"return\":{\"object\":{\"invoiceId\":{\"get\":[\"i\",\"id\"]},\"eligible\":{\"get\":[\"reminder\",\"eligible\"]},\"outstandingMinor\":{\"get\":[\"outstanding\"]},\"daysOverdue\":{\"get\":[\"reminder\",\"daysOverdue\"]},\"reasons\":{\"call\":\"concat\",\"args\":[{\"get\":[\"gateReasons\"]},{\"get\":[\"reminder\",\"reasons\"]}]}}}}}}],\"output\":{\"object\":{\"reminders\":{\"map\":{\"filter\":{\"get\":[\"review\"]},\"as\":\"r\",\"where\":{\"get\":[\"r\",\"eligible\"]}},\"as\":\"r\",\"body\":{\"object\":{\"invoiceId\":{\"get\":[\"r\",\"invoiceId\"]},\"outstandingMinor\":{\"get\":[\"r\",\"outstandingMinor\"]},\"daysOverdue\":{\"get\":[\"r\",\"daysOverdue\"]}}}},\"held\":{\"map\":{\"filter\":{\"get\":[\"review\"]},\"as\":\"r\",\"where\":{\"call\":\"not\",\"args\":[{\"get\":[\"r\",\"eligible\"]}]}},\"as\":\"r\",\"body\":{\"object\":{\"invoiceId\":{\"get\":[\"r\",\"invoiceId\"]},\"reasons\":{\"get\":[\"r\",\"reasons\"]}}}},\"unbilledMilestoneIds\":{\"get\":[\"delivery\",\"unbilledMilestoneIds\"]},\"quarantinedCreditIds\":{\"get\":[\"balances\",\"quarantinedCreditIds\"]}}}},componentFunctions,{\"type\":\"object\",\"properties\":{\"delivery\":{\"type\":\"object\",\"properties\":{\"deliveredMilestoneIds\":{\"type\":\"array\",\"items\":{\"type\":\"string\",\"maxLength\":120},\"maxItems\":100},\"billed\":{\"type\":\"array\",\"items\":{\"type\":\"object\",\"properties\":{\"invoiceId\":{\"type\":\"string\",\"maxLength\":120},\"milestoneId\":{\"type\":\"string\",\"maxLength\":120}},\"required\":[\"invoiceId\",\"milestoneId\"],\"additionalProperties\":false},\"maxItems\":100}},\"required\":[\"deliveredMilestoneIds\",\"billed\"],\"additionalProperties\":false},\"invoices\":{\"type\":\"array\",\"items\":{\"type\":\"object\",\"properties\":{\"id\":{\"type\":\"string\",\"maxLength\":120},\"currency\":{\"type\":\"string\",\"maxLength\":120},\"balanceMinor\":{\"type\":\"integer\",\"minimum\":0,\"maximum\":1000000000},\"state\":{\"type\":\"string\",\"maxLength\":120},\"dueDate\":{\"type\":\"string\",\"maxLength\":120},\"reminderHold\":{\"type\":\"boolean\"}},\"required\":[\"id\",\"currency\",\"balanceMinor\",\"state\",\"dueDate\",\"reminderHold\"],\"additionalProperties\":false},\"maxItems\":100},\"credits\":{\"type\":\"array\",\"items\":{\"type\":\"object\",\"properties\":{\"id\":{\"type\":\"string\",\"maxLength\":120},\"invoiceId\":{\"type\":\"string\",\"maxLength\":120},\"currency\":{\"type\":\"string\",\"maxLength\":2000},\"amountMinor\":{\"type\":\"integer\",\"minimum\":-9007199254740991,\"maximum\":9007199254740991}},\"required\":[\"id\",\"invoiceId\",\"currency\",\"amountMinor\"],\"additionalProperties\":false},\"maxItems\":100},\"asOf\":{\"type\":\"string\",\"maxLength\":120}},\"required\":[\"delivery\",\"invoices\",\"credits\",\"asOf\"],\"additionalProperties\":false},{\"type\":\"object\",\"properties\":{\"reminders\":{\"type\":\"array\",\"items\":{\"type\":\"object\",\"properties\":{\"invoiceId\":{\"type\":\"string\",\"maxLength\":120},\"outstandingMinor\":{\"type\":\"integer\",\"minimum\":0,\"maximum\":1000000000},\"daysOverdue\":{\"type\":\"integer\",\"minimum\":0,\"maximum\":1000000000}},\"required\":[\"invoiceId\",\"outstandingMinor\",\"daysOverdue\"],\"additionalProperties\":false},\"maxItems\":100},\"held\":{\"type\":\"array\",\"items\":{\"type\":\"object\",\"properties\":{\"invoiceId\":{\"type\":\"string\",\"maxLength\":120},\"reasons\":{\"type\":\"array\",\"items\":{\"type\":\"string\",\"maxLength\":120},\"maxItems\":100}},\"required\":[\"invoiceId\",\"reasons\"],\"additionalProperties\":false},\"maxItems\":100},\"unbilledMilestoneIds\":{\"type\":\"array\",\"items\":{\"type\":\"string\",\"maxLength\":120},\"maxItems\":100},\"quarantinedCreditIds\":{\"type\":\"array\",\"items\":{\"type\":\"string\",\"maxLength\":120},\"maxItems\":100}},\"required\":[\"reminders\",\"held\",\"unbilledMilestoneIds\",\"quarantinedCreditIds\"],\"additionalProperties\":false},{\"kind\":\"exact_bounded_source_identity\",\"maximumLength\":120,\"emptyAllowedPaths\":[],\"trimIdentity\":false,\"duplicateObjectIds\":\"reject_within_each_array\"});\n\n})({input:context.input.jobInput});\n",
"outputVar": "jobResult",
"timeout": 3000,
"memoryLimit": 64
}Discord embed review draft · code
{
"label": "Discord embed review draft",
"code": "const jobResult=context.jobResult;\nconst delivery=(function(context){\nreturn ((function(originalResult,metadata,destination){\nfunction stableResult(value,depth=0){\n if(depth>64)throw new Error('Result nesting exceeds 64');\n if(value===null||typeof value==='string'||typeof value==='boolean')return JSON.stringify(value);\n if(typeof value==='number'&&Number.isFinite(value))return JSON.stringify(value);\n if(Array.isArray(value)){\n if(Object.keys(value).length!==value.length||Array.from({length:value.length},(_,i)=>i).some(i=>!Object.hasOwn(value,i)))throw new Error('Result contains sparse data');\n return '['+value.map(item=>stableResult(item,depth+1)).join(',')+']';\n }\n if(value&&typeof value==='object')return '{'+Object.keys(value).sort().map(key=>JSON.stringify(key)+':'+stableResult(value[key],depth+1)).join(',')+'}';\n throw new Error('Result is not JSON data');\n}\nfunction utf8Length(text){\n let bytes=0;\n for(let i=0;i<text.length;i++){\n const code=text.charCodeAt(i);\n if(code<128)bytes++;else if(code<2048)bytes+=2;\n else if(code>=55296&&code<=56319&&i+1<text.length&&text.charCodeAt(i+1)>=56320&&text.charCodeAt(i+1)<=57343){bytes+=4;i++;}\n else bytes+=3;\n }\n return bytes;\n}\nfunction chunkText(text,maximum){\n const chunks=[];\n for(let start=0;start<text.length;){let end=Math.min(start+maximum,text.length);const last=text.charCodeAt(end-1),next=text.charCodeAt(end);if(end<text.length&&last>=55296&&last<=56319&&next>=56320&&next<=57343)end--;chunks.push(text.slice(start,end));start=end;}\n return chunks;\n}\nfunction deliveryState(rendererId,originalResult,metadata,destination,destinationKeys){\n const output={rendererId,status:'HELD',originalResult,drafts:[],holds:[],escapeReport:[]};\n const hold=(code,message)=>{output.holds.push({code,message});return {output,json:''};};\n const object=value=>value&&typeof value==='object'&&!Array.isArray(value);\n const exact=(value,keys)=>object(value)&&Object.keys(value).length===keys.length&&keys.every(key=>Object.hasOwn(value,key));\n const keys=['workflowId','canonicalIntentId','title','reviewUrl'],maxima=[128,200,200,1000];\n if(!exact(metadata,keys)||keys.some((key,i)=>typeof metadata[key]!=='string'||!metadata[key].length||metadata[key].length>maxima[i]||/[\\u0000-\\u001f\\u007f]/.test(metadata[key]))||!/^https?:\\/\\/[^\\s<>\"']+$/.test(metadata.reviewUrl))return hold('INVALID_METADATA','Metadata must provide bounded workflowId, canonicalIntentId, title and an HTTP(S) reviewUrl.');\n if(!exact(destination,destinationKeys)||destinationKeys.some(key=>typeof destination[key]!=='string'||!destination[key].length||destination[key].length>200||destination[key]!==destination[key].trim()||/[\\u0000-\\u001f\\u007f]/.test(destination[key])))return hold('INVALID_DESTINATION','Destination fields must be exactly: '+destinationKeys.join(', ')+'.');\n let json;\n try{if(!object(originalResult))throw new Error('Primary result must be a JSON object');json=stableResult(originalResult);}catch(error){return hold('INVALID_RESULT',error.message);}\n if(json.length>32768||utf8Length(json)>65536)return hold('RESULT_BOUND_EXCEEDED','Original result exceeds this renderer profile; full original result is retained.');\n return {output,json};\n}\nfunction escapeHtml(text){return text.replace(/&/g,'&').replace(/</g,'<').replace(/>/g,'>').replace(/\"/g,'"').replace(/'/g,''');}\nfunction escapeMarkdown(text){return text.replace(/&/g,'&').replace(/[\\\\`*{}\\[\\]()#+\\-.!_|>~<]/g,'\\\\$&');}\nfunction markdownReviewText(metadata,json){\n const runs=json.match(/`+/g)||[],fence='`'.repeat(Math.max(3,...runs.map(run=>run.length+1)));\n return '# '+escapeMarkdown(metadata.title)+'\\n\\nWorkflow: '+escapeMarkdown(metadata.workflowId)+'\\nCanonical job: '+escapeMarkdown(metadata.canonicalIntentId)+'\\nReview: <'+metadata.reviewUrl.replace(/&/g,'&')+'>\\n\\n'+fence+'json\\n'+json+'\\n'+fence+'\\n';\n}\nfunction plainReviewText(metadata,json){return metadata.title+'\\nWorkflow: '+metadata.workflowId+'\\nCanonical job: '+metadata.canonicalIntentId+'\\nReview: '+metadata.reviewUrl+'\\n\\n'+json;}\nfunction finishDraft(state,draft,texts=[],textMaximum=32768,byteMaximum=131072){\n if(texts.some(text=>text.length>textMaximum)||utf8Length(JSON.stringify(draft))>byteMaximum){state.output.holds.push({code:'TARGET_BOUND_EXCEEDED',message:'Draft exceeds the target or Vora profile bound; no draft is emitted and the full original result is retained.'});return state.output;}\n state.output.status='PREPARED';state.output.drafts=[draft];return state.output;\n}\nreturn (function discordEmbedReview(originalResult,metadata,destination){\n const state=deliveryState('discord-embed-review',originalResult,metadata,destination,['channelId']);if(state.output.holds.length)return state.output;\n const description=markdownReviewText(metadata,state.json),title=metadata.title;\n if(title.length>256||title.length+description.length>6000){state.output.holds.push({code:'TARGET_BOUND_EXCEEDED',message:'Discord embed title or aggregate text exceeds the documented limit; no draft is emitted.'});return state.output;}\n return finishDraft(state,{channelId:destination.channelId,body:{embeds:[{title,description}],allowed_mentions:{parse:[]}}},[description],4096);\n})(originalResult,metadata,destination);\n}))(context.input.jobResult,context.input.deliveryMetadata.metadata,context.input.deliveryMetadata.destination);\n\n})({input:{jobResult,deliveryMetadata:context.input.deliveryMetadata}});\nreturn {jobResult,delivery};\n",
"outputVar": "result",
"timeout": 3000,
"memoryLimit": 64
}Input and output contracts
Input
{
"type": "object",
"properties": {
"jobInput": {
"type": "object",
"properties": {
"delivery": {
"type": "object",
"properties": {
"deliveredMilestoneIds": {
"type": "array",
"items": {
"type": "string",
"maxLength": 120
},
"maxItems": 100
},
"billed": {
"type": "array",
"items": {
"type": "object",
"properties": {
"invoiceId": {
"type": "string",
"maxLength": 120
},
"milestoneId": {
"type": "string",
"maxLength": 120
}
},
"required": [
"invoiceId",
"milestoneId"
],
"additionalProperties": false
},
"maxItems": 100
}
},
"required": [
"deliveredMilestoneIds",
"billed"
],
"additionalProperties": false
},
"invoices": {
"type": "array",
"items": {
"type": "object",
"properties": {
"id": {
"type": "string",
"maxLength": 120
},
"currency": {
"type": "string",
"maxLength": 120
},
"balanceMinor": {
"type": "integer",
"minimum": 0,
"maximum": 1000000000
},
"state": {
"type": "string",
"maxLength": 120
},
"dueDate": {
"type": "string",
"maxLength": 120
},
"reminderHold": {
"type": "boolean"
}
},
"required": [
"id",
"currency",
"balanceMinor",
"state",
"dueDate",
"reminderHold"
],
"additionalProperties": false
},
"maxItems": 100
},
"credits": {
"type": "array",
"items": {
"type": "object",
"properties": {
"id": {
"type": "string",
"maxLength": 120
},
"invoiceId": {
"type": "string",
"maxLength": 120
},
"currency": {
"type": "string",
"maxLength": 2000
},
"amountMinor": {
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991
}
},
"required": [
"id",
"invoiceId",
"currency",
"amountMinor"
],
"additionalProperties": false
},
"maxItems": 100
},
"asOf": {
"type": "string",
"maxLength": 120
}
},
"required": [
"delivery",
"invoices",
"credits",
"asOf"
],
"additionalProperties": false
},
"deliveryMetadata": {
"type": "object",
"properties": {
"metadata": {
"type": "object",
"properties": {
"workflowId": {
"type": "string",
"maxLength": 128
},
"canonicalIntentId": {
"type": "string",
"maxLength": 200
},
"title": {
"type": "string",
"maxLength": 200
},
"reviewUrl": {
"type": "string",
"maxLength": 1000
}
},
"required": [
"workflowId",
"canonicalIntentId",
"title",
"reviewUrl"
],
"additionalProperties": false
},
"destination": {
"type": "object",
"properties": {
"channelId": {
"type": "string",
"maxLength": 200
}
},
"required": [
"channelId"
],
"additionalProperties": false
}
},
"required": [
"metadata",
"destination"
],
"additionalProperties": false
}
},
"required": [
"jobInput",
"deliveryMetadata"
],
"additionalProperties": false
}Output
{
"type": "object",
"properties": {
"jobResult": {
"type": "object",
"properties": {
"reminders": {
"type": "array",
"items": {
"type": "object",
"properties": {
"invoiceId": {
"type": "string",
"maxLength": 120
},
"outstandingMinor": {
"type": "integer",
"minimum": 0,
"maximum": 1000000000
},
"daysOverdue": {
"type": "integer",
"minimum": 0,
"maximum": 1000000000
}
},
"required": [
"invoiceId",
"outstandingMinor",
"daysOverdue"
],
"additionalProperties": false
},
"maxItems": 100
},
"held": {
"type": "array",
"items": {
"type": "object",
"properties": {
"invoiceId": {
"type": "string",
"maxLength": 120
},
"reasons": {
"type": "array",
"items": {
"type": "string",
"maxLength": 120
},
"maxItems": 100
}
},
"required": [
"invoiceId",
"reasons"
],
"additionalProperties": false
},
"maxItems": 100
},
"unbilledMilestoneIds": {
"type": "array",
"items": {
"type": "string",
"maxLength": 120
},
"maxItems": 100
},
"quarantinedCreditIds": {
"type": "array",
"items": {
"type": "string",
"maxLength": 120
},
"maxItems": 100
}
},
"required": [
"reminders",
"held",
"unbilledMilestoneIds",
"quarantinedCreditIds"
],
"additionalProperties": false
},
"delivery": {
"type": "object",
"properties": {
"rendererId": {
"type": "string",
"maxLength": 128,
"enum": [
"discord-embed-review"
]
},
"status": {
"type": "string",
"maxLength": 16,
"enum": [
"PREPARED",
"HELD"
]
},
"originalResult": {
"type": "object",
"properties": {
"reminders": {
"type": "array",
"items": {
"type": "object",
"properties": {
"invoiceId": {
"type": "string",
"maxLength": 120
},
"outstandingMinor": {
"type": "integer",
"minimum": 0,
"maximum": 1000000000
},
"daysOverdue": {
"type": "integer",
"minimum": 0,
"maximum": 1000000000
}
},
"required": [
"invoiceId",
"outstandingMinor",
"daysOverdue"
],
"additionalProperties": false
},
"maxItems": 100
},
"held": {
"type": "array",
"items": {
"type": "object",
"properties": {
"invoiceId": {
"type": "string",
"maxLength": 120
},
"reasons": {
"type": "array",
"items": {
"type": "string",
"maxLength": 120
},
"maxItems": 100
}
},
"required": [
"invoiceId",
"reasons"
],
"additionalProperties": false
},
"maxItems": 100
},
"unbilledMilestoneIds": {
"type": "array",
"items": {
"type": "string",
"maxLength": 120
},
"maxItems": 100
},
"quarantinedCreditIds": {
"type": "array",
"items": {
"type": "string",
"maxLength": 120
},
"maxItems": 100
}
},
"required": [
"reminders",
"held",
"unbilledMilestoneIds",
"quarantinedCreditIds"
],
"additionalProperties": false
},
"drafts": {
"type": "array",
"items": {
"type": "object",
"properties": {
"channelId": {
"type": "string",
"maxLength": 200
},
"body": {
"type": "object",
"properties": {
"embeds": {
"type": "array",
"items": {
"type": "object",
"properties": {
"title": {
"type": "string",
"maxLength": 256
},
"description": {
"type": "string",
"maxLength": 4096
}
},
"required": [
"title",
"description"
],
"additionalProperties": false
},
"maxItems": 1,
"minItems": 1
},
"allowed_mentions": {
"type": "object",
"properties": {
"parse": {
"type": "array",
"items": {
"type": "string",
"maxLength": 20,
"enum": [
"roles",
"users",
"everyone"
]
},
"maxItems": 3,
"minItems": 0
}
},
"required": [
"parse"
],
"additionalProperties": false
}
},
"required": [
"embeds",
"allowed_mentions"
],
"additionalProperties": false
}
},
"required": [
"channelId",
"body"
],
"additionalProperties": false
},
"maxItems": 1,
"minItems": 0
},
"holds": {
"type": "array",
"items": {
"type": "object",
"properties": {
"code": {
"type": "string",
"maxLength": 128
},
"message": {
"type": "string",
"maxLength": 2000
}
},
"required": [
"code",
"message"
],
"additionalProperties": false
},
"maxItems": 10,
"minItems": 0
},
"escapeReport": {
"type": "array",
"items": {
"type": "object",
"properties": {
"field": {
"type": "string",
"maxLength": 256
},
"method": {
"type": "string",
"maxLength": 80
},
"originalValue": {
"type": "string",
"maxLength": 32768
},
"escapedValue": {
"type": "string",
"maxLength": 32768
}
},
"required": [
"field",
"method",
"originalValue",
"escapedValue"
],
"additionalProperties": false
},
"maxItems": 1000,
"minItems": 0
}
},
"required": [
"rendererId",
"status",
"originalResult",
"drafts",
"holds",
"escapeReport"
],
"additionalProperties": false
}
},
"required": [
"jobResult",
"delivery"
],
"additionalProperties": false
}Related implementations
Compare implementations for this job · Primary business workflow
Caller supplies channelId; body contains one embed with the title and the complete escaped review Markdown. allowed_mentions.parse is always empty. No mention lookup or send occurs. A description over 4096 characters or aggregate title/description over 6000 holds the entire draft. Original result, including original reasons/holds, is preserved without mutation. Missing/extra destination fields or invalid metadata hold the draft. No truncation: overflow returns HELD with an empty drafts array and full original result.
Supplied input: vora-agency-milestone-credit-reminder-queue · 1. Draft/result: discord-embed-review · Discord API v10 / single review embed profile v1.
Mapping and loss rules
- Caller supplies channelId; body contains one embed with the title and the complete escaped review Markdown.
- allowed_mentions.parse is always empty. No mention lookup or send occurs.
- A description over 4096 characters or aggregate title/description over 6000 holds the entire draft.
- Original result, including original reasons/holds, is preserved without mutation.
- Missing/extra destination fields or invalid metadata hold the draft.
- No truncation: overflow returns HELD with an empty drafts array and full original result.
This binding consumes supplied data. It does not establish an authenticated connector or a provider write.
Example input and result
These examples use synthetic data.
Input
{
"jobInput": {
"delivery": {
"deliveredMilestoneIds": [
"m"
],
"billed": [
{
"invoiceId": "i",
"milestoneId": "m"
}
]
},
"invoices": [
{
"id": "i",
"currency": "USD",
"balanceMinor": 100,
"state": "open",
"dueDate": "2026-10-05",
"reminderHold": false
}
],
"credits": [],
"asOf": "2026-10-08"
},
"deliveryMetadata": {
"metadata": {
"workflowId": "agency-milestone-credit-reminder-queue",
"canonicalIntentId": "finance.prepare-supported-milestone-net-balance-reminders",
"title": "Prepare milestone-backed net-balance reminders",
"reviewUrl": "https://example.test/workflows/milestone-credit-reminder-queue/"
},
"destination": {
"channelId": "123456789012345678"
}
}
}Expected result
{
"jobResult": {
"reminders": [
{
"invoiceId": "i",
"outstandingMinor": 100,
"daysOverdue": 3
}
],
"held": [],
"unbilledMilestoneIds": [],
"quarantinedCreditIds": []
},
"delivery": {
"rendererId": "discord-embed-review",
"status": "PREPARED",
"originalResult": {
"reminders": [
{
"invoiceId": "i",
"outstandingMinor": 100,
"daysOverdue": 3
}
],
"held": [],
"unbilledMilestoneIds": [],
"quarantinedCreditIds": []
},
"drafts": [
{
"channelId": "123456789012345678",
"body": {
"embeds": [
{
"title": "Prepare milestone-backed net-balance reminders",
"description": "# Prepare milestone\\-backed net\\-balance reminders\n\nWorkflow: agency\\-milestone\\-credit\\-reminder\\-queue\nCanonical job: finance\\.prepare\\-supported\\-milestone\\-net\\-balance\\-reminders\nReview: <https://example.test/workflows/milestone-credit-reminder-queue/>\n\n```json\n{\"held\":[],\"quarantinedCreditIds\":[],\"reminders\":[{\"daysOverdue\":3,\"invoiceId\":\"i\",\"outstandingMinor\":100}],\"unbilledMilestoneIds\":[]}\n```\n"
}
],
"allowed_mentions": {
"parse": []
}
}
}
],
"holds": [],
"escapeReport": []
}
}Success means: Prepare reminder review drafts only for supported delivered-milestone invoices after applying compatible supplied credits.
When something goes wrong
- Review original business holds and target holds separately. Correct the relevant supplied input and rerun without discarding the original job result.
Limits and costs
- This prepares a target-specific review draft from the original agency decision. The complete original job result and business holds remain visible. A held target produces no draft. No provider request, send, import, issue creation or publication occurs.
- No paid model calls or metered third-party operations are declared in this pure graph. Vora plan availability, compute and quotas still apply; pricing has not been verified by this batch.