Skip to workflow content
Vora
← Workflow library

Content Operations

Trace supplied derivative provenance branches

Review all reachable ancestor branches and exact asset-version references without enumerating every possible path. Supplied facts only; returns a review packet with no external effects.

Experimental native example · local preview · revision 1

WORKFLOW PREVIEW

See how it works

2 nodes · 1 connections

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 facts matching the closed contract.
  • Explicit scope, version, authority and completeness facts reviewed by an operator.
Follow the workflow step by step
  1. Supplied agency data

    Receive the explicitly supplied manual input packet.

  2. Trace supplied derivative provenance branches

    Review all reachable ancestor branches and exact asset-version references without enumerating every possible path. Supplied facts only; returns a review packet with no external effects.

Setup and review

  • Review the contract and evidence bounds.
  • Run a synthetic supplied-data case.
  • Inspect every conflict, omission and unknown before proposing downstream action.

Inspect every node

Expand a node to inspect its complete settings. Review the runtime and adoption evidence before installing it.

Supplied agency data · wfManualTrigger
{
  "label": "Supplied agency data"
}
Trace supplied derivative provenance branches · code
{
  "code": "\nfunction fail(reason){throw new Error('input: '+reason);}\nfunction check(schema,value,where){\n if(value===null){if(schema.type==='null'||Array.isArray(schema.type)&&schema.type.includes('null'))return;fail(where+' wrong_type');}\n const type=Array.isArray(schema.type)?schema.type[0]:schema.type;\n if(type==='object'){\n  if(!value||typeof value!=='object'||Array.isArray(value))fail(where+' wrong_type');\n  for(const name of Object.keys(value))if(!Object.hasOwn(schema.properties,name))fail(where+' unknown_field');\n  for(const name of schema.required)if(!Object.hasOwn(value,name))fail(where+' missing_field');\n  for(const [name,shape]of Object.entries(schema.properties))check(shape,value[name],where+'.'+name);\n }else if(type==='array'){\n  if(!Array.isArray(value)||value.length>schema.maxItems)fail(where+' array_bound');\n  for(const item of value)check(schema.items,item,where+'[]');\n }else if(type==='string'){if(typeof value!=='string'||value.length>schema.maxLength)fail(where+' string_bound');}\n else if(type==='integer'){if(!Number.isSafeInteger(value)||value<schema.minimum||value>schema.maximum)fail(where+' integer_bound');}\n else if(type==='boolean'){if(typeof value!=='boolean')fail(where+' wrong_type');}\n else fail(where+' unsupported_type');\n}\nfunction id(value){if(typeof value!=='string'||!value||value.trim()!==value)fail('noncanonical_identity');return value;}\nfunction unique(values,reason){if(new Set(values).size!==values.length)fail(reason);}\nfunction safeAdd(a,b){if(a>Number.MAX_SAFE_INTEGER-b)fail('unsafe_sum');return a+b;}\nfunction day(value){if(!/^\\d{4}-\\d{2}-\\d{2}$/.test(value))fail('invalid_calendar_day');const ms=Date.parse(value+'T00:00:00Z');if(!Number.isFinite(ms)||new Date(ms).toISOString().slice(0,10)!==value)fail('invalid_calendar_day');return ms;}\nfunction refKey(ref){id(ref.assetId);if(ref.version<1)fail('positive_version_required');return JSON.stringify([ref.assetId,ref.version]);}\nfunction refValue(key){const pair=JSON.parse(key);return {assetId:pair[0],version:pair[1]};}\nfunction sortedRefs(keys){return [...keys].sort().map(refValue);}\n\ncheck({\"type\":\"object\",\"properties\":{\"scopeId\":{\"type\":\"string\",\"maxLength\":128},\"target\":{\"type\":\"object\",\"properties\":{\"assetId\":{\"type\":\"string\",\"maxLength\":128},\"version\":{\"type\":\"integer\",\"minimum\":0,\"maximum\":9007199254740991}},\"required\":[\"assetId\",\"version\"],\"additionalProperties\":false},\"selectionComplete\":{\"type\":[\"boolean\",\"null\"]},\"assets\":{\"type\":\"array\",\"items\":{\"type\":\"object\",\"properties\":{\"assetId\":{\"type\":\"string\",\"maxLength\":128},\"version\":{\"type\":\"integer\",\"minimum\":0,\"maximum\":9007199254740991},\"scopeId\":{\"type\":\"string\",\"maxLength\":128},\"contentIdentity\":{\"type\":\"string\",\"maxLength\":128},\"parents\":{\"type\":\"array\",\"items\":{\"type\":\"object\",\"properties\":{\"assetId\":{\"type\":\"string\",\"maxLength\":128},\"version\":{\"type\":\"integer\",\"minimum\":0,\"maximum\":9007199254740991}},\"required\":[\"assetId\",\"version\"],\"additionalProperties\":false},\"maxItems\":20},\"requiredApprovalRefIds\":{\"type\":\"array\",\"items\":{\"type\":\"string\",\"maxLength\":128},\"maxItems\":20}},\"required\":[\"assetId\",\"version\",\"scopeId\",\"contentIdentity\",\"parents\",\"requiredApprovalRefIds\"],\"additionalProperties\":false},\"maxItems\":100},\"approvals\":{\"type\":\"array\",\"items\":{\"type\":\"object\",\"properties\":{\"referenceId\":{\"type\":\"string\",\"maxLength\":128},\"assetId\":{\"type\":\"string\",\"maxLength\":128},\"version\":{\"type\":\"integer\",\"minimum\":0,\"maximum\":9007199254740991},\"scopeId\":{\"type\":\"string\",\"maxLength\":128},\"approved\":{\"type\":[\"boolean\",\"null\"]}},\"required\":[\"referenceId\",\"assetId\",\"version\",\"scopeId\",\"approved\"],\"additionalProperties\":false},\"maxItems\":100}},\"required\":[\"scopeId\",\"target\",\"selectionComplete\",\"assets\",\"approvals\"],\"additionalProperties\":false},context.input,\"input\");\nconst result=(function derivativeProvenanceGraph(x){\n id(x.scopeId);const target=refKey(x.target),groups=new Map(),approvalMap=new Map();\n let declaredEdges=0,declaredReferences=0;\n for(const row of x.assets){\n  const key=refKey(row);if(id(row.scopeId)!==x.scopeId)fail('scope_mismatch');id(row.contentIdentity);\n  unique(row.parents.map(refKey),'duplicate_parent_reference');\n  unique(row.requiredApprovalRefIds.map(id),'duplicate_required_reference');\n  declaredEdges+=row.parents.length;declaredReferences+=row.requiredApprovalRefIds.length;\n  if(declaredEdges>400)fail('bounded_edge_limit');\n  if(declaredReferences>400)fail('bounded_reference_limit');\n  if(!groups.has(key))groups.set(key,[]);groups.get(key).push(row);\n }\n for(const row of x.approvals){\n  id(row.referenceId);refKey(row);if(id(row.scopeId)!==x.scopeId)fail('scope_mismatch');\n  if(approvalMap.has(row.referenceId))fail('duplicate_approval_reference_id');approvalMap.set(row.referenceId,row);\n }\n const adjacency=new Map(),required=new Map(),allConflicts=new Set();\n for(const [key,records]of groups){\n  const signatures=new Set(records.map(r=>JSON.stringify([r.contentIdentity,r.parents.map(refKey).sort(),[...r.requiredApprovalRefIds].sort()])));\n  if(signatures.size>1)allConflicts.add(key);\n  adjacency.set(key,new Set(records.flatMap(r=>r.parents.map(refKey))));\n  required.set(key,new Set(records.flatMap(r=>r.requiredApprovalRefIds)));\n }\n const present=new Set(),missing=new Set(),queue=[target];\n while(queue.length){\n  const key=queue.pop();if(present.has(key)||missing.has(key))continue;\n  if(!groups.has(key)){missing.add(key);continue;}\n  present.add(key);for(const parent of adjacency.get(key))queue.push(parent);\n }\n const colors=new Map(),cycles=[];\n function visit(key){\n  colors.set(key,1);\n  for(const parent of [...adjacency.get(key)].sort()){\n   if(!present.has(parent))continue;\n   if(colors.get(parent)===1)cycles.push({from:refValue(key),to:refValue(parent)});\n   else if(!colors.get(parent))visit(parent);\n  }\n  colors.set(key,2);\n }\n for(const key of [...present].sort())if(!colors.get(key))visit(key);\n const missingRoots=new Set(),missingApproval=new Set(),rejected=new Set(),unknown=new Set();\n for(const key of present){\n  const refs=required.get(key);\n  if(adjacency.get(key).size===0&&refs.size===0)missingRoots.add(key);\n  for(const referenceId of refs){\n   const approval=approvalMap.get(referenceId);\n   if(!approval){missingApproval.add(referenceId);continue;}\n   if(refKey(approval)!==key||approval.approved===false){rejected.add(referenceId);continue;}\n   if(approval.approved===null)unknown.add(referenceId);\n  }\n }\n const conflicts=new Set([...present].filter(key=>allConflicts.has(key)));\n cycles.sort((a,b)=>{const ka=JSON.stringify([a.from.assetId,a.from.version,a.to.assetId,a.to.version]),kb=JSON.stringify([b.from.assetId,b.from.version,b.to.assetId,b.to.version]);return ka<kb?-1:ka>kb?1:0;});\n const status=conflicts.size?'conflict':cycles.length?'cycle':missing.size||missingRoots.size||missingApproval.size||rejected.size||unknown.size||x.selectionComplete!==true?'incomplete':'traceable';\n return {status,selectionComplete:x.selectionComplete,closure:sortedRefs(present),missingAncestors:sortedRefs(missing),conflictingAssets:sortedRefs(conflicts),cycleEdges:cycles,missingRootApprovalAssets:sortedRefs(missingRoots),missingApprovalRefIds:[...missingApproval].sort(),rejectedApprovalRefIds:[...rejected].sort(),unknownApprovalRefIds:[...unknown].sort()};\n})(context.input);\ncheck({\"type\":\"object\",\"properties\":{\"status\":{\"type\":\"string\",\"maxLength\":128},\"selectionComplete\":{\"type\":[\"boolean\",\"null\"]},\"closure\":{\"type\":\"array\",\"items\":{\"type\":\"object\",\"properties\":{\"assetId\":{\"type\":\"string\",\"maxLength\":128},\"version\":{\"type\":\"integer\",\"minimum\":0,\"maximum\":9007199254740991}},\"required\":[\"assetId\",\"version\"],\"additionalProperties\":false},\"maxItems\":100},\"missingAncestors\":{\"type\":\"array\",\"items\":{\"type\":\"object\",\"properties\":{\"assetId\":{\"type\":\"string\",\"maxLength\":128},\"version\":{\"type\":\"integer\",\"minimum\":0,\"maximum\":9007199254740991}},\"required\":[\"assetId\",\"version\"],\"additionalProperties\":false},\"maxItems\":400},\"conflictingAssets\":{\"type\":\"array\",\"items\":{\"type\":\"object\",\"properties\":{\"assetId\":{\"type\":\"string\",\"maxLength\":128},\"version\":{\"type\":\"integer\",\"minimum\":0,\"maximum\":9007199254740991}},\"required\":[\"assetId\",\"version\"],\"additionalProperties\":false},\"maxItems\":100},\"cycleEdges\":{\"type\":\"array\",\"items\":{\"type\":\"object\",\"properties\":{\"from\":{\"type\":\"object\",\"properties\":{\"assetId\":{\"type\":\"string\",\"maxLength\":128},\"version\":{\"type\":\"integer\",\"minimum\":0,\"maximum\":9007199254740991}},\"required\":[\"assetId\",\"version\"],\"additionalProperties\":false},\"to\":{\"type\":\"object\",\"properties\":{\"assetId\":{\"type\":\"string\",\"maxLength\":128},\"version\":{\"type\":\"integer\",\"minimum\":0,\"maximum\":9007199254740991}},\"required\":[\"assetId\",\"version\"],\"additionalProperties\":false}},\"required\":[\"from\",\"to\"],\"additionalProperties\":false},\"maxItems\":400},\"missingRootApprovalAssets\":{\"type\":\"array\",\"items\":{\"type\":\"object\",\"properties\":{\"assetId\":{\"type\":\"string\",\"maxLength\":128},\"version\":{\"type\":\"integer\",\"minimum\":0,\"maximum\":9007199254740991}},\"required\":[\"assetId\",\"version\"],\"additionalProperties\":false},\"maxItems\":100},\"missingApprovalRefIds\":{\"type\":\"array\",\"items\":{\"type\":\"string\",\"maxLength\":128},\"maxItems\":400},\"rejectedApprovalRefIds\":{\"type\":\"array\",\"items\":{\"type\":\"string\",\"maxLength\":128},\"maxItems\":400},\"unknownApprovalRefIds\":{\"type\":\"array\",\"items\":{\"type\":\"string\",\"maxLength\":128},\"maxItems\":400}},\"required\":[\"status\",\"selectionComplete\",\"closure\",\"missingAncestors\",\"conflictingAssets\",\"cycleEdges\",\"missingRootApprovalAssets\",\"missingApprovalRefIds\",\"rejectedApprovalRefIds\",\"unknownApprovalRefIds\"],\"additionalProperties\":false},result,\"output\");\nreturn result;",
  "label": "Trace supplied derivative provenance branches",
  "memoryLimit": 16,
  "outputVar": "result",
  "timeout": 1000
}
Input and output contracts

Input

{
  "type": "object",
  "properties": {
    "scopeId": {
      "type": "string",
      "maxLength": 128
    },
    "target": {
      "type": "object",
      "properties": {
        "assetId": {
          "type": "string",
          "maxLength": 128
        },
        "version": {
          "type": "integer",
          "minimum": 0,
          "maximum": 9007199254740991
        }
      },
      "required": [
        "assetId",
        "version"
      ],
      "additionalProperties": false
    },
    "selectionComplete": {
      "type": [
        "boolean",
        "null"
      ]
    },
    "assets": {
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "assetId": {
            "type": "string",
            "maxLength": 128
          },
          "version": {
            "type": "integer",
            "minimum": 0,
            "maximum": 9007199254740991
          },
          "scopeId": {
            "type": "string",
            "maxLength": 128
          },
          "contentIdentity": {
            "type": "string",
            "maxLength": 128
          },
          "parents": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "assetId": {
                  "type": "string",
                  "maxLength": 128
                },
                "version": {
                  "type": "integer",
                  "minimum": 0,
                  "maximum": 9007199254740991
                }
              },
              "required": [
                "assetId",
                "version"
              ],
              "additionalProperties": false
            },
            "maxItems": 20
          },
          "requiredApprovalRefIds": {
            "type": "array",
            "items": {
              "type": "string",
              "maxLength": 128
            },
            "maxItems": 20
          }
        },
        "required": [
          "assetId",
          "version",
          "scopeId",
          "contentIdentity",
          "parents",
          "requiredApprovalRefIds"
        ],
        "additionalProperties": false
      },
      "maxItems": 100
    },
    "approvals": {
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "referenceId": {
            "type": "string",
            "maxLength": 128
          },
          "assetId": {
            "type": "string",
            "maxLength": 128
          },
          "version": {
            "type": "integer",
            "minimum": 0,
            "maximum": 9007199254740991
          },
          "scopeId": {
            "type": "string",
            "maxLength": 128
          },
          "approved": {
            "type": [
              "boolean",
              "null"
            ]
          }
        },
        "required": [
          "referenceId",
          "assetId",
          "version",
          "scopeId",
          "approved"
        ],
        "additionalProperties": false
      },
      "maxItems": 100
    }
  },
  "required": [
    "scopeId",
    "target",
    "selectionComplete",
    "assets",
    "approvals"
  ],
  "additionalProperties": false
}

Output

{
  "type": "object",
  "properties": {
    "status": {
      "type": "string",
      "maxLength": 128
    },
    "selectionComplete": {
      "type": [
        "boolean",
        "null"
      ]
    },
    "closure": {
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "assetId": {
            "type": "string",
            "maxLength": 128
          },
          "version": {
            "type": "integer",
            "minimum": 0,
            "maximum": 9007199254740991
          }
        },
        "required": [
          "assetId",
          "version"
        ],
        "additionalProperties": false
      },
      "maxItems": 100
    },
    "missingAncestors": {
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "assetId": {
            "type": "string",
            "maxLength": 128
          },
          "version": {
            "type": "integer",
            "minimum": 0,
            "maximum": 9007199254740991
          }
        },
        "required": [
          "assetId",
          "version"
        ],
        "additionalProperties": false
      },
      "maxItems": 400
    },
    "conflictingAssets": {
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "assetId": {
            "type": "string",
            "maxLength": 128
          },
          "version": {
            "type": "integer",
            "minimum": 0,
            "maximum": 9007199254740991
          }
        },
        "required": [
          "assetId",
          "version"
        ],
        "additionalProperties": false
      },
      "maxItems": 100
    },
    "cycleEdges": {
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "from": {
            "type": "object",
            "properties": {
              "assetId": {
                "type": "string",
                "maxLength": 128
              },
              "version": {
                "type": "integer",
                "minimum": 0,
                "maximum": 9007199254740991
              }
            },
            "required": [
              "assetId",
              "version"
            ],
            "additionalProperties": false
          },
          "to": {
            "type": "object",
            "properties": {
              "assetId": {
                "type": "string",
                "maxLength": 128
              },
              "version": {
                "type": "integer",
                "minimum": 0,
                "maximum": 9007199254740991
              }
            },
            "required": [
              "assetId",
              "version"
            ],
            "additionalProperties": false
          }
        },
        "required": [
          "from",
          "to"
        ],
        "additionalProperties": false
      },
      "maxItems": 400
    },
    "missingRootApprovalAssets": {
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "assetId": {
            "type": "string",
            "maxLength": 128
          },
          "version": {
            "type": "integer",
            "minimum": 0,
            "maximum": 9007199254740991
          }
        },
        "required": [
          "assetId",
          "version"
        ],
        "additionalProperties": false
      },
      "maxItems": 100
    },
    "missingApprovalRefIds": {
      "type": "array",
      "items": {
        "type": "string",
        "maxLength": 128
      },
      "maxItems": 400
    },
    "rejectedApprovalRefIds": {
      "type": "array",
      "items": {
        "type": "string",
        "maxLength": 128
      },
      "maxItems": 400
    },
    "unknownApprovalRefIds": {
      "type": "array",
      "items": {
        "type": "string",
        "maxLength": 128
      },
      "maxItems": 400
    }
  },
  "required": [
    "status",
    "selectionComplete",
    "closure",
    "missingAncestors",
    "conflictingAssets",
    "cycleEdges",
    "missingRootApprovalAssets",
    "missingApprovalRefIds",
    "rejectedApprovalRefIds",
    "unknownApprovalRefIds"
  ],
  "additionalProperties": false
}

Choose an output for this job

This business workflow also has 15 delivery formats. Compare their inputs, output examples and limits.

Compare implementations for this job

Example input and result

These examples use synthetic data.

Input

{
  "scopeId": "client-A",
  "target": {
    "assetId": "D",
    "version": 1
  },
  "selectionComplete": true,
  "assets": [
    {
      "assetId": "D",
      "version": 1,
      "scopeId": "client-A",
      "contentIdentity": "content-D",
      "parents": [
        {
          "assetId": "R1",
          "version": 1
        },
        {
          "assetId": "R2",
          "version": 1
        }
      ],
      "requiredApprovalRefIds": []
    },
    {
      "assetId": "R1",
      "version": 1,
      "scopeId": "client-A",
      "contentIdentity": "content-R1",
      "parents": [],
      "requiredApprovalRefIds": [
        "ap-R1"
      ]
    }
  ],
  "approvals": [
    {
      "referenceId": "ap-R1",
      "assetId": "R1",
      "version": 1,
      "scopeId": "client-A",
      "approved": true
    }
  ]
}

Expected result

{
  "status": "incomplete",
  "selectionComplete": true,
  "closure": [
    {
      "assetId": "D",
      "version": 1
    },
    {
      "assetId": "R1",
      "version": 1
    }
  ],
  "missingAncestors": [
    {
      "assetId": "R2",
      "version": 1
    }
  ],
  "conflictingAssets": [],
  "cycleEdges": [],
  "missingRootApprovalAssets": [],
  "missingApprovalRefIds": [],
  "rejectedApprovalRefIds": [],
  "unknownApprovalRefIds": []
}

Success means: Review all reachable ancestor branches and exact asset-version references without enumerating every possible path. Supplied facts only; returns a review packet with no external effects.

When something goes wrong

  • Correct the rejected shape, identity, scope or numeric bound and repeat with supplied facts. Preserve unknown and conflicting facts rather than invent a resolution.

Limits and costs

  • Identity is exact (assetId,positive integer version), never latest-version fallback. Every supplied scope must match. Identical redundant asset facts collapse; differing parent sets, content identity or required references at one identity conflict. Inspect the union of supplied branches for conflicting identities while blocking traceable status. Root nodes require at least one supplied approved reference; every explicitly required reference must resolve to the exact asset/version and approved=true. Missing/unknown/rejected references block traceability. Reachable ancestor/edge closure only, maximum100 asset records,20 parents per record,400 total declared parent edges and400 required references. Detect bounded cycle edges; never enumerate all paths. Traceable status additionally requires selectionComplete=true and grants no legal permission. Pure supplied-data processing; no independent provider, legal, authentication or customer-acceptance verification.
  • 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.

USE IN VORA

Trace supplied derivative provenance branches

Review this workflow’s steps and required inputs. Get access to Vora before setting it up in your workspace.

Workspace installation is being connected. This page lets you inspect the workflow; it does not create or run one.

Required input fields
{
  "type": "object",
  "properties": {
    "scopeId": {
      "type": "string",
      "maxLength": 128
    },
    "target": {
      "type": "object",
      "properties": {
        "assetId": {
          "type": "string",
          "maxLength": 128
        },
        "version": {
          "type": "integer",
          "minimum": 0,
          "maximum": 9007199254740991
        }
      },
      "required": [
        "assetId",
        "version"
      ],
      "additionalProperties": false
    },
    "selectionComplete": {
      "type": [
        "boolean",
        "null"
      ]
    },
    "assets": {
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "assetId": {
            "type": "string",
            "maxLength": 128
          },
          "version": {
            "type": "integer",
            "minimum": 0,
            "maximum": 9007199254740991
          },
          "scopeId": {
            "type": "string",
            "maxLength": 128
          },
          "contentIdentity": {
            "type": "string",
            "maxLength": 128
          },
          "parents": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "assetId": {
                  "type": "string",
                  "maxLength": 128
                },
                "version": {
                  "type": "integer",
                  "minimum": 0,
                  "maximum": 9007199254740991
                }
              },
              "required": [
                "assetId",
                "version"
              ],
              "additionalProperties": false
            },
            "maxItems": 20
          },
          "requiredApprovalRefIds": {
            "type": "array",
            "items": {
              "type": "string",
              "maxLength": 128
            },
            "maxItems": 20
          }
        },
        "required": [
          "assetId",
          "version",
          "scopeId",
          "contentIdentity",
          "parents",
          "requiredApprovalRefIds"
        ],
        "additionalProperties": false
      },
      "maxItems": 100
    },
    "approvals": {
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "referenceId": {
            "type": "string",
            "maxLength": 128
          },
          "assetId": {
            "type": "string",
            "maxLength": 128
          },
          "version": {
            "type": "integer",
            "minimum": 0,
            "maximum": 9007199254740991
          },
          "scopeId": {
            "type": "string",
            "maxLength": 128
          },
          "approved": {
            "type": [
              "boolean",
              "null"
            ]
          }
        },
        "required": [
          "referenceId",
          "assetId",
          "version",
          "scopeId",
          "approved"
        ],
        "additionalProperties": false
      },
      "maxItems": 100
    }
  },
  "required": [
    "scopeId",
    "target",
    "selectionComplete",
    "assets",
    "approvals"
  ],
  "additionalProperties": false
}