Skip to main content

Governance Interface

The governance interface is a contract for services that govern records written against the Triodian Metamodel. An application or agent submits records to a governing service. The service validates them, sends changes that need a person to a named reviewer, and returns published records with a provenance trail. The contract defines what a governing service does, not how it does it.

Contract: governance-interface/README.md · HTTP binding: governance-interface/openapi.yaml · Example policy: governance-interface/example-policies
Schemas: submission, change-proposal, submission-result, review-decision, governed-record, provenance-record, dataset-policy
Version: governance interface 1.0.0, against the Metamodel version in VERSION

What each party does​

The Metamodel publishes the record schemas, the message schemas and the HTTP binding. A record that validates here is a record a governing service can accept.

A governing service implements the contract. For each proposal it:

  1. validates the record;
  2. matches it to records already held, so one real-world item is never entered twice;
  3. arbitrates conflicts by the dataset's source and date precedence;
  4. scores confidence;
  5. assigns a treatment under the dataset's autonomy rules;
  6. writes each step to an append-only, hash-chained provenance ledger.

Applications read only governed records. They cite the governed record or provenance ID wherever a record is quoted.

Treatments​

ValueMeaning
publishedUnverifiedPublished automatically and marked unverified
publishedPublished automatically (reverification only)
reviewQueueWaits for a named approver
escalatedAn unresolved conflict, sent to the method owner
convertedToLeadThe evidence cannot set a status or date alone, so it is kept as a lead
rejectedInvalid, stale or a duplicate

The dataset policy decides which changes need a review decision. Every approval names the approver on the governed record.

Example: a regulatory register policy​

The example policy is for a register of regulatory obligations, such as AI governance obligations by jurisdiction.

Source precedence

RankSourceCan set a status or date alone
1officialTextYes
2regulatorPublicationYes (expected, anticipated records)
3standardsBodyPublicationYes (expected records)
4commentaryNo; a lead only
5newsNo; a lead only

Autonomy rules (the first matching rule applies)

RuleChangesTreatmentDescription
autonomy.lead.publishUnverifiedaddLead, addCommentaryLinkpublishedUnverifiedA new lead or commentary link is published automatically and marked unverified.
autonomy.reverify.publishreverifypublishedConfirming a record against an official or regulator source, with nothing else changed, updates its last-verified date automatically.
autonomy.anticipated.reviewQueuecreatereviewQueueA new Anticipated record from a rank 1 or 2 source waits for review.
autonomy.create.reviewQueuecreatereviewQueueAny other new record sets a status, a date and a tier, so it waits for a named approver.
autonomy.statusDateTier.reviewQueuestatusChange, dateChange, tierChangereviewQueueA status change, effective date or tier change waits for review; the approver is named on the record.
autonomy.supersede.reviewQueuesupersede, removereviewQueueRemoval or supersession waits for review; the superseded version is kept.
autonomy.update.reviewQueueupdate, reverifyreviewQueueAny other change to a published record waits for review.

Language rules, checked on every record and every response:

RulePrevents
language.addressedInstructionRecords describe what a source says; they never tell a reader what to do.
language.verdictNo record, screen, export or response states whether anyone is compliant or in breach.
language.requiredReserved'Required' is reserved for counsel's determination; records use source-describing words instead.
language.clientRequirementNothing states what the law requires of a particular client; counsel decides what applies.
language.passageLikelihoodAn Anticipated record shows its trigger date or status, never a likelihood that it will pass or apply.

Change Proposal​

AttributeTypeDescriptionRequired
changeProposalIDStringUnique identifier for the proposal, assigned by the submitter, e.g. CP-2026-10-27-0001✓
changeTypeEnumKind of change proposed. Decides the autonomy rule that applies: create, update, statusChange, dateChange, tierChange, supersede, remove, reverify, addLead, addCommentaryLink✓
targetObjectThe record the proposal creates or changes✓
target.domainTypeEnumDomain of the referenced entity, from the shared domain list (domainType in common.schema.json) (required)
target.entityIDStringUnique identifier of a record within its domain, for example "CAP-001" or "MKT-ENTSW-001" (required)
target.titleStringName of the referenced entity, for readability
recordObjectFor create and update changes: the full proposed record, valid against the schema for target.domainType. For other changes: omitted, or only the fields that change
changedFieldsArray[String]Top-level fields of the record that the proposal changes, for update changes
baseVersionIntegerVersion of the governed record the proposal was made against. The governing service rejects the proposal as stale if the record has moved on
supersededByEntityIDStringFor supersede changes: the record that replaces the target
evidenceArray[Object]Sources relied on for the change✓
evidence[].urlStringAddress of the source (required)
evidence[].titleStringTitle of the source document or page
evidence[].sourceRankIntegerSource precedence: 1 official text (legislation register, gazette, the instrument itself); 2 regulator publication; 3 standards body publication; 4 law firm or industry body commentary; 5 news (required)
evidence[].externalOrgIDStringExternal Organization that published the source
evidence[].publishedDateDateDate the source was published
evidence[].retrievedAtDateTimeWhen the source was read (required)
evidence[].contentHashStringSHA-256 of the retrieved content, hex encoded, so the same content can be recognised later
evidence[].excerptStringThe passage relied on, quoted from the source
evidence[].dataFlowIDStringData flow (monitored source) the evidence came through
rationaleStringWhy the change is proposed, in source-describing language
triggerIDStringTrigger record for the instrument change that prompted the proposal
treatmentEnumSet by the governing service: how the proposal is handled under the autonomy policy: publishedUnverified, published, reviewQueue, escalated, convertedToLead, rejected
matchedEntityIDStringSet by the governing service: an existing record the proposal was matched to, so one instrument is never entered twice
reviewObjectSet by the governing service: the review of a queued or escalated proposal
review.reviewStatusEnumWhere the review stands: pending, approved, rejected, withdrawn (required)
review.reviewDecisionIDStringReview decision record
review.approverNameStringName of the person who decided
review.decidedAtDateTimeWhen the decision was made

Change Type (changeType)​

ValueMeaning
createA new record
updateA change to fields other than status, dates or tier
statusChangeA change of status
dateChangeA change to an effective or key date
tierChangeA change of source tier
supersedeReplace a record with another, keeping the old version
removeWithdraw a record from publication, keeping it in history
reverifyConfirm a record against its source with no other change
addLeadRecord a lead (commentary or news) to an official source
addCommentaryLinkAttach a commentary link to a record
{
"changeProposalID": "CP-2026-10-27-0001",
"changeType": "create",
"target": {
"domainType": "obligation",
"entityID": "OBL-AU-CPS230-48"
},
"record": {
"obligationID": "OBL-AU-CPS230-48",
"title": "Material service providers",
"statement": "CPS 230 provides that an APRA-regulated entity must maintain a register of its material service providers.",
"obligationType": "prudentialStandard",
"source": {
"authority": "APRA",
"instrument": "CPS 230 Operational Risk Management",
"citation": "para 48"
},
"jurisdiction": "AU",
"sourceTier": "binding",
"status": "inForce"
},
"evidence": [
{
"url": "https://handbook.apra.gov.au/standard/cps-230",
"sourceRank": 1,
"retrievedAt": "2026-10-27T01:00:00Z"
}
]
}

Submission​

AttributeTypeDescriptionRequired
submissionIDStringUnique identifier for the submission, assigned by the submitter. Resubmitting the same ID is idempotent✓
interfaceVersionStringVersion of the governance interface the submission follows, e.g. 1.0.0✓
metamodelVersionStringVersion of the Triodian Metamodel the records are written against, from its VERSION file✓
modeEnumvalidate = check only; propose = check, record and route: validate, propose✓
submitterObjectWho or what is acting✓
submitter.actorTypeEnumKind of actor: agent, person, system (required)
submitter.actorIDStringIdentifier of the actor, e.g. update-agent or a person's account ID (required)
submitter.displayNameStringName to show for the actor
datasetStringGoverned dataset the proposals belong to, e.g. example-regulatory-register. The governing service keeps datasets separate
submittedAtDateTimeWhen the submission was sent
proposalsArray[Object]The change proposals✓
proposals[].changeProposalIDStringUnique identifier for the proposal, assigned by the submitter, e.g. CP-2026-10-27-0001 (required)
proposals[].changeTypeEnumKind of change proposed. Decides the autonomy rule that applies: create, update, statusChange, dateChange, tierChange, supersede, remove, reverify, addLead, addCommentaryLink (required)
proposals[].targetObjectThe record the proposal creates or changes (required)
proposals[].recordObjectFor create and update changes: the full proposed record, valid against the schema for target.domainType. For other changes: omitted, or only the fields that change
proposals[].changedFieldsArray[String]Top-level fields of the record that the proposal changes, for update changes
proposals[].baseVersionIntegerVersion of the governed record the proposal was made against. The governing service rejects the proposal as stale if the record has moved on
proposals[].supersededByEntityIDStringFor supersede changes: the record that replaces the target
proposals[].evidenceArray[Object]Sources relied on for the change (required)
proposals[].rationaleStringWhy the change is proposed, in source-describing language
proposals[].triggerIDStringTrigger record for the instrument change that prompted the proposal
proposals[].treatmentEnumSet by the governing service: how the proposal is handled under the autonomy policy: publishedUnverified, published, reviewQueue, escalated, convertedToLead, rejected
proposals[].matchedEntityIDStringSet by the governing service: an existing record the proposal was matched to, so one instrument is never entered twice
proposals[].reviewObjectSet by the governing service: the review of a queued or escalated proposal

Submission Result​

AttributeTypeDescriptionRequired
submissionResultIDStringUnique identifier for the result✓
submissionIDStringThe submission this answers✓
modeEnumMode the submission was processed in: validate, propose✓
receivedAtDateTimeWhen the governing service received the submission✓
interfaceVersionStringVersion of the governance interface the governing service applied
metamodelVersionStringVersion of the Metamodel the governing service validated against
outcomesArray[Object]One outcome per proposal, in submission order✓
outcomes[].changeProposalIDStringThe proposal (required)
outcomes[].validBooleanWhether the proposal and its record are valid against the Metamodel (required)
outcomes[].issuesArray[Object]Validation errors and warnings
outcomes[].matchedEntityIDStringExisting record the proposal was matched to
outcomes[].conflictsArray[Object]Conflicts found between sources or with the current record, and how each was resolved
outcomes[].confidenceObjectConfidence in a record, from the reliability, recency and corroboration of its evidence
outcomes[].treatmentEnumTreatment assigned: publishedUnverified, published, reviewQueue, escalated, convertedToLead, rejected (required)
outcomes[].ruleIDsArray[String]Published rules applied, e.g. autonomy.reviewQueue.statusChange, precedence.officialTextFirst
outcomes[].governedRecordIDStringGoverned record version published, when the proposal was published
outcomes[].provenanceRecordIDsArray[String]Provenance records written for the proposal

The outcome for each proposal:

AttributeTypeDescriptionRequired
changeProposalIDStringThe proposal✓
validBooleanWhether the proposal and its record are valid against the Metamodel✓
issuesArray[Object]Validation errors and warnings
issues[].issueLevelEnumerror blocks the proposal; warning does not: error, warning (required)
issues[].codeStringStable code, e.g. schema.required, reference.unresolved, language.verdict, version.stale, duplicate.existing (required)
issues[].pathStringJSON Pointer to the field concerned
issues[].messageStringHuman-readable explanation (required)
matchedEntityIDStringExisting record the proposal was matched to
conflictsArray[Object]Conflicts found between sources or with the current record, and how each was resolved
conflicts[].fieldStringField in conflict (required)
conflicts[].valuesArray[Object]The competing values, each with its source rank
conflicts[].resolutionEnumresolved = settled by a published rule; unresolved = escalated to the method owner: resolved, unresolved (required)
conflicts[].resolvedValueStringValue adopted, when resolved
conflicts[].ruleIDStringPublished rule that resolved it
confidenceObjectConfidence in a record, from the reliability, recency and corroboration of its evidence
confidence.scoreNumber0 (none) to 1 (highest) (required)
confidence.bandEnumBand the score falls in: low, medium, high (required)
confidence.reliabilityNumberReliability component, 0 to 1
confidence.recencyNumberRecency component, 0 to 1
confidence.corroborationNumberCorroboration component, 0 to 1
confidence.staleBooleanWhether the record is past its freshness threshold
treatmentEnumTreatment assigned: publishedUnverified, published, reviewQueue, escalated, convertedToLead, rejected✓
ruleIDsArray[String]Published rules applied, e.g. autonomy.reviewQueue.statusChange, precedence.officialTextFirst
governedRecordIDStringGoverned record version published, when the proposal was published
provenanceRecordIDsArray[String]Provenance records written for the proposal

Review Decision​

AttributeTypeDescriptionRequired
reviewDecisionIDStringUnique identifier for the decision✓
changeProposalIDStringThe proposal decided✓
decisionEnumapprove = publish the proposal; reject = do not; amendAndApprove = publish with the amended record supplied: approve, reject, amendAndApprove✓
amendedRecordObjectFor amendAndApprove: the record as approved
reviewerObjectThe person deciding✓
reviewer.nameStringFull name (required)
reviewer.roleStringRole, e.g. Analyst, method owner, partner firm reviewer (required)
reviewer.organizationStringOrganization the reviewer acts for
reviewer.actorIDStringReviewer's account ID
decidedAtDateTimeWhen the decision was made✓
noteStringReasons for the decision

Governed Record​

AttributeTypeDescriptionRequired
governedRecordIDStringIdentifier of this version: the entity ID, '@' and the version, e.g. OBL-AU-CPS230-48@2✓
domainTypeEnumDomain of the referenced entity, from the shared domain list (domainType in common.schema.json)✓
entityIDStringIdentifier of the record within its domain✓
versionIntegerVersion number, starting at 1✓
datasetStringGoverned dataset the record belongs to
publicationStatusEnumpublished = approved or reverified; unverified = published automatically and not yet reviewed (leads and commentary); pendingReview = visible to reviewers only; superseded = replaced by a later version; removed = withdrawn from publication: published, unverified, pendingReview, superseded, removed✓
recordObjectThe Metamodel record, valid against the schema for domainType✓
metamodelVersionStringVersion of the Metamodel the record was validated against
publishedAtDateTimeWhen this version was published✓
approvalObjectThe named person who approved this version, when approval was required
approval.approverNameStringName of the approver (required)
approval.approverRoleStringRole of the approver
approval.approvedAtDateTimeWhen it was approved (required)
approval.reviewDecisionIDStringReview decision record (required)
verificationObjectVerification state of this version
verification.lastVerifiedDateDate last checked against the official text (required)
verification.freshnessThresholdStringMaximum age before the record is stale, as an ISO 8601 duration
verification.staleBooleanWhether the record is past its freshness threshold
verification.confidenceObjectConfidence in a record, from the reliability, recency and corroboration of its evidence
supersedesVersionIntegerVersion this one replaces
provenanceRecordIDsArray[String]Provenance entries behind this version, oldest first✓
changeProposalIDsArray[String]Proposals that produced this version

Provenance Record​

Entries are append-only. Each entry carries the previous entry's hash and its own SHA-256 hash, computed over its canonical JSON: keys sorted, no whitespace, and the hash field removed. Anyone holding a run of entries can confirm that none was altered or removed.

AttributeTypeDescriptionRequired
provenanceRecordIDStringUnique identifier for the entry, e.g. PROV-000123✓
sequenceIntegerPosition of the entry in the ledger
recordedAtDateTimeWhen the event was recorded✓
eventTypeEnumWhat happened: submissionReceived, sourceRead, extracted, validated, matched, conflictDetected, conflictResolved, scored, treatmentAssigned, reviewDecided, published, superseded, removed, reverified✓
actorObjectWho or what acted✓
actor.actorTypeEnumKind of actor: agent, person, system, service (required)
actor.actorIDStringIdentifier of the actor (required)
actor.displayNameStringName to show
subjectObjectThe record the event concerns✓
subject.domainTypeEnumDomain of the referenced entity, from the shared domain list (domainType in common.schema.json) (required)
subject.entityIDStringUnique identifier of a record within its domain, for example "CAP-001" or "MKT-ENTSW-001" (required)
subject.titleStringName of the referenced entity, for readability
datasetStringGoverned dataset, e.g. example-regulatory-register
changeProposalIDStringProposal the event belongs to
submissionIDStringSubmission the event belongs to
governedRecordIDStringGoverned record version the event produced or affected
inputProvenanceRecordIDsArray[String]Earlier entries this one follows from
decisionStringHuman-readable account of the event
ruleIDsArray[String]Published rules applied
evidenceURLsArray[String]Sources relied on
confidenceScoreNumberConfidence after the event, 0 to 1
previousHashStringhash of the previous entry in the ledger; empty for the first
hashStringSHA-256, hex encoded, of this entry's canonical JSON (keys sorted, no whitespace) with the hash field removed✓

Dataset Policy​

AttributeTypeDescriptionRequired
datasetPolicyIDStringUnique identifier for the policy, e.g. POLICY-REG-REGISTER-1✓
datasetStringDataset the policy governs✓
versionStringVersion of the policy✓
effectiveFromDateDate the policy version applies from
methodOwnerStringRole that receives escalations
sourcePrecedenceArray[Object]Source ranks and what each can do alone✓
sourcePrecedence[].rankIntegerSource rank (required)
sourcePrecedence[].basisEnumKind of source: officialText, regulatorPublication, standardsBodyPublication, commentary, news (required)
sourcePrecedence[].canSetStatusOrDateBooleanWhether this rank alone can set a status or date (required)
sourcePrecedence[].onlyForTiersArray[Enum]Tiers for which it can set a status or date, when not all: binding, expected, anticipated
autonomyRulesArray[Object]Treatment for each kind of change. The first matching rule applies✓
autonomyRules[].ruleIDStringStable rule ID cited in results and provenance (required)
autonomyRules[].changeTypesArray[Enum]Change types the rule matches: create, update, statusChange, dateChange, tierChange, supersede, remove, reverify, addLead, addCommentaryLink (required)
autonomyRules[].whenTierArray[Enum]Only match records of these tiers: binding, expected, anticipated
autonomyRules[].whenMaxSourceRankIntegerOnly match when the best evidence is at least this rank (a lower number is better)
autonomyRules[].treatmentEnumTreatment assigned: publishedUnverified, published, reviewQueue, escalated, convertedToLead, rejected (required)
autonomyRules[].approverRequiredBooleanWhether publication needs a named approver
autonomyRules[].keepSupersededVersionBooleanWhether the replaced version is kept in history
autonomyRules[].descriptionStringThe rule in plain words
datePrecedenceArray[String]Order in which date evidence is preferred when sources disagree, highest first
freshnessArray[Object]How long a record stays fresh without reverification
freshness[].sourceTierEnumTier of an obligation's source. binding = law or prudential standard in force; expected = regulator expectations, guidance and recognised standards; anticipated = made but not yet in force, under consultation, or a pending bill. A tier says nothing about whether an organization meets the source, or whether it will apply: binding, expected, anticipated (required)
freshness[].thresholdStringISO 8601 duration, e.g. P90D (required)
confidenceBandsObjectScore thresholds for the confidence bands
confidenceBands.mediumNumberLowest score in the medium band (required)
confidenceBands.highNumberLowest score in the high band (required)
languageRulesArray[Object]Wording that records and responses must not contain
languageRules[].ruleIDStringStable rule ID (required)
languageRules[].patternStringCase-insensitive regular expression (ECMAScript syntax) (required)
languageRules[].appliesToArray[Enum]Where the rule is checked: record, response, matterBrief
languageRules[].descriptionStringWhat the rule prevents (required)