Shape
An Intent ID looks likeitn_Vq3kX9mR2dLpZ0aQ7b. It matches ^[A-Za-z0-9_-]{10,64}$: letters, digits, underscore and hyphen only, between 10 and 64 characters. The shape is deliberately plain so the identifier survives being written into other systems’ client-supplied fields, for example WorkAuthor’s externalId (64 characters), Beeline’s externalId on an intake request, or a custom field on an SAP Fieldglass job posting.
The same pattern is enforced wherever the identifier appears: the IntentRecord, TimelineEvent, WebhookEvent, EnrichmentRequest, ReconciliationReport and PassthroughRequest schemas, and the DefenceFile evidence document.
Minted from the decision
In the Triage-fed chain the Intent ID is a pure function of the assessment response that produced the decision. In the reference code it isitn_ followed by the first 22 characters of the Base64url SHA-256 digest of the WorkAuthor responseId. The same response always yields the same Intent ID, so a replayed completion event re-derives the same intent rather than forking the record.
Combined with find-before-create at the destination, the whole chain is idempotent without any shared state between the trigger and the adapter.
Immutable, versioned
The identifier never changes. What changes isintent_version, an integer that starts at 1 and only increases.
- An amendment to the decision increments
intent_version, which mints a new idempotency key on purpose. - Enrichment, which only fills in fields a destination requires, completes the same version.
POST /enrichment-requestdoes not bumpintent_version.
{intent_id}-{intent_version}-{target_system} therefore stays stable through enrichment and changes only when the decision genuinely changes. Publishing covers the key in detail.
Written into the destination’s own field
The convention is simple: write the Intent ID into the destination’s client-supplied identifier field.POST /plan returns, for each destination, the carrier_field the Intent ID is written to and the mode the adapter uses.
Stamp mode
The Intent ID is written into the destination record
Stamp mode
The Intent ID is written into the destination record
The adapter writes the Intent ID into the destination’s documented carrier field when it creates the record, or onto an existing record when you supply its
external_id to POST /publish. Where that field is filterable on reads, as Beeline’s externalId is, the record can be re-found from either side and a duplicate publish is detected before it happens.Link mode
The linkage is recorded on the composerID side only
Link mode
The linkage is recorded on the composerID side only
Some platforms expose read-centric or pure-transit APIs with no client-supplied identifier to write into. composerID records the
intent_id to external_id linkage on its own side, as an intent.linked event on the timeline, and the destination page says so. POST /reconcile then needs the external_id because composerID linked the record rather than created it.Carrier field names on the destination pages are indicative until they are confirmed against a tenant at onboarding. The pattern the Intent ID must fit is not indicative: it is fixed by the schema.
Two directions, no lookup table
Given an Intent ID, composerID knows every record it published. Given a destination record, its Intent ID leads back to the decision and, through the Manuscript API, to the evidence behind it. Neither direction needs a mapping table, and neither can drift, because the identifier lives inside the record rather than beside it.Next steps
Publishing
How the Intent ID becomes a record, safely under retry.
Events and the timeline
Everything that happens to an intent, in order, under one identifier.
Beeline guide
The Intent ID in
externalId, end to end, against a fake tenant.