Publish an Approved Answer to the Registry
Before you begin
Roles required: Validator, governance lead.
The following must be true before you attempt to publish:
- The candidate has a
ValidationRecordwithdecision: "approved" - You have the
validation_record_idfrom that record - You have at least one
evidence_link— a URI pointing to an authoritative source (Confluence page, Jira issue, or the ingest artifact ID) - You know the
owner_roleresponsible for this answer's ongoing accuracy - You have a
review_duedate set (recommended: 90 days for rapidly evolving product areas; 180 days for stable reference knowledge)
Assumed state: Validation is complete. See Claim and Decide a Validation Assignment.
Steps
1. POST the answer to the registry
Send a POST request to /v1/registry/answers with all required and applicable fields:
curl -s -X POST http://localhost:8000/v1/registry/answers \
-H "Content-Type: application/json" \
-d '{
"candidate_id": "cand_01j2k3l4m5n6p7q8r9t1",
"horn_type": "fact",
"answer_text": "The platform supports SSO via SAML 2.0 and OIDC. Azure AD, Okta, and Ping Identity are supported identity providers.",
"owner_role": "solutions-engineering",
"validation_record_id": "valrec_01j2k3l4m5n6p7q8r9v3",
"evidence_links": [
"https://heretto.atlassian.net/wiki/spaces/PROD/pages/12345",
"artifact://art_01j2k3l4m5n6p7q8r9s0"
],
"review_due": "2026-12-07",
"customer_scope": "acme-corp",
"assertion_grammar": {
"subject": "platform",
"predicate": "supports",
"object_value": "SSO via SAML 2.0 and OIDC",
"scope": "identity and access management"
}
}'
Required fields:
| Field | Description |
|---|---|
candidate_id |
The candidate this answer is derived from |
horn_type |
The Horn type string, lowercase (e.g., "fact", "procedure", "concept") |
answer_text |
The final, validated answer text |
owner_role |
The role responsible for this answer's accuracy going forward |
validation_record_id |
The ID of the APPROVED ValidationRecord |
evidence_links |
Array of one or more source URIs; must not be empty |
review_due |
ISO date string (YYYY-MM-DD) for when this answer should be re-reviewed |
Optional fields:
| Field | Description |
|---|---|
customer_scope |
Restricts this answer to one customer context; omit for organization-wide answers |
assertion_grammar |
Required for horn_type: "fact" — the structured subject/predicate/object_value/scope breakdown |
Important: If
validation_record_idis missing,owner_roleis missing, orevidence_linksis an empty array, the service raises aProvenanceErrorand the write is rejected with HTTP 422. Ensure all three provenance fields are present before submitting.
2. Capture the answer_id from the response
A successful publish returns HTTP 201 with a registry answer record:
{
"answer_id": "ans_01j2k3l4m5n6p7q8r9w4",
"candidate_id": "cand_01j2k3l4m5n6p7q8r9t1",
"horn_type": "fact",
"status": "APPROVED",
"version": 1,
"answer_text": "The platform supports SSO via SAML 2.0 and OIDC. Azure AD, Okta, and Ping Identity are supported identity providers.",
"owner_role": "solutions-engineering",
"validation_record_id": "valrec_01j2k3l4m5n6p7q8r9v3",
"evidence_links": [
"https://heretto.atlassian.net/wiki/spaces/PROD/pages/12345",
"artifact://art_01j2k3l4m5n6p7q8r9s0"
],
"review_due": "2026-12-07",
"customer_scope": "acme-corp",
"created_at": "2026-06-07T14:50:00Z"
}
Save the answer_id. It is the permanent identifier for this answer in the registry.
3. Confirm the published answer
Retrieve the answer to verify all fields were stored correctly:
curl -s "http://localhost:8000/v1/registry/answers/ans_01j2k3l4m5n6p7q8r9w4"
Confirm that status is "APPROVED" and all fields match your intent.
Note: If another APPROVED answer in the registry already has the same
subject + predicate + scopebut a differentobject_value, aRegistryConflictRecordis created automatically. The write succeeds — it is NOT blocked — but the conflict is flagged for governance review. Both answers will appear in readouts with a conflict indicator until resolved. Review any conflict records promptly. See Maintain Answer Lifecycle for how to resolve conflicts by superseding the outdated answer.Note: Once published, the answer text is immutable. Registry answers are versioned records. To change the
answer_text, you must supersede the answer, which creates a new version. Do not attempt to re-publish the samecandidate_idwith different text; use the supersede action instead.
Result
The answer has an answer_id and is in APPROVED status in the registry. It is now eligible for inclusion in customer readouts, registry queries, and downstream graph synchronization. The version is set to 1. The full provenance chain — from source artifact through validation to publication — is recorded and auditable.
See also: Maintain Answer Lifecycle; Generate a Pre-Meeting Readout; Claim and Decide a Validation Assignment