Claim and Decide a Validation Assignment
Before you begin
Roles required: Validator, SME, governance lead.
You must hold the validator role for the Horn type being reviewed. Role assignments are managed by your governance lead. You need a candidate_id for a classified candidate whose ClassificationRecord does not have requires_review: true, or you need explicit governance approval to validate a flagged candidate.
Important:
OPEN_ISSUEcandidates cannot be approved. If you claim anOPEN_ISSUEassignment, the only valid decisions are ESCALATED or REJECTED. Do not attempt to approve an open issue — the service will reject the request.
Assumed state: The candidate has a ClassificationRecord. See Classify a Candidate Answer.
Steps
1. Create a validation assignment
Send a POST request to /v1/validation/assignments to create an assignment for the candidate. You can assign it directly to yourself or to a shared queue:
curl -s -X POST http://localhost:8000/v1/validation/assignments \
-H "Content-Type: application/json" \
-d '{
"candidate_id": "cand_01j2k3l4m5n6p7q8r9t1",
"assignee": "validator-jane",
"horn_type": "FACT"
}'
The response includes an assignment_id and the initial status: PENDING.
{
"assignment_id": "val_01j2k3l4m5n6p7q8r9v3",
"candidate_id": "cand_01j2k3l4m5n6p7q8r9t1",
"status": "PENDING",
"horn_type": "FACT",
"assignee": "validator-jane",
"created_at": "2026-06-07T14:40:00Z"
}
Save the assignment_id for the next steps.
2. Claim the assignment
Claiming an assignment moves its status from PENDING to IN_REVIEW and locks it to you. Only one validator can hold a claim on an assignment at a time.
curl -s -X POST http://localhost:8000/v1/validation/assignments/val_01j2k3l4m5n6p7q8r9v3/claim \
-H "Content-Type: application/json" \
-d '{
"validator_id": "validator-jane"
}'
If another validator has already claimed the assignment, the service returns 409 Conflict. Check the assignment status and coordinate with your team before attempting to re-claim.
3. Review the candidate before deciding
Before submitting a decision, review all available information:
- Answer text — from
/v1/candidates/{id}/answers— is it complete, accurate, and free from PII that should not be published? - Horn type — from
/v1/classifications/{candidate_id}— isprimary_horn_typethe correct classification for this content? - Assertion grammar (FACT only) — are
subject,predicate,object_value, andscopeaccurate representations of the claim? - Evidence — what is the source artifact? Is it authoritative for this claim?
- Conflict flags — does the
ClassificationRecordor assignment show aConflictFlag?
Important: If a
ConflictFlagis present on the assignment, a different answer in the registry already makes a claim about the samesubject + predicate + scopebut with a differentobject_value. This means two validated answers are contradicting each other. Review the existing registry answer at/v1/registry/answersbefore making your decision. Do not approve a conflicting answer without understanding which claim is correct. The default behavior is to block the assignment from auto-approval; human judgment is required.
4. Submit your decision
Send a POST request to /v1/validation/assignments/{id}/decide with one of the four valid decisions.
Decision: APPROVED
The answer is correct, complete, and ready for publication. No changes required.
curl -s -X POST http://localhost:8000/v1/validation/assignments/val_01j2k3l4m5n6p7q8r9v3/decide \
-H "Content-Type: application/json" \
-d '{
"decision": "approved",
"rationale": "Answer accurately reflects platform SSO capability per the Zoom call with ACME on 2026-06-01."
}'
Decision: REVISED
The answer has minor inaccuracies or needs wording correction. Provide the corrected text. The revised text triggers re-classification before re-entering the review queue.
curl -s -X POST http://localhost:8000/v1/validation/assignments/val_01j2k3l4m5n6p7q8r9v3/decide \
-H "Content-Type: application/json" \
-d '{
"decision": "revised",
"rationale": "Original answer omitted OIDC. Corrected to include both SAML 2.0 and OIDC.",
"revised_text": "The platform supports SSO via SAML 2.0 and OIDC. Azure AD, Okta, and Ping Identity are supported identity providers."
}'
Decision: REJECTED
The answer is incorrect, out of scope, or should not be published. The candidate is removed from the publish path but is retained for audit.
curl -s -X POST http://localhost:8000/v1/validation/assignments/val_01j2k3l4m5n6p7q8r9v3/decide \
-H "Content-Type: application/json" \
-d '{
"decision": "rejected",
"rationale": "Answer contains outdated information from a pre-GA demo call. Not representative of current product behavior."
}'
Decision: ESCALATED
You cannot make a confident decision. Send the assignment to a specialist queue with a rationale explaining what information is needed.
curl -s -X POST http://localhost:8000/v1/validation/assignments/val_01j2k3l4m5n6p7q8r9v3/decide \
-H "Content-Type: application/json" \
-d '{
"decision": "escalated",
"rationale": "Conflicting claims in registry. Existing answer says SAML only. New answer claims OIDC also supported. Engineering clarification needed before approving either."
}'
Note:
ValidationRecordobjects are immutable once created. A decision cannot be edited or deleted. If a decision was made in error, the correct action is to supersede the published answer (after it reaches the registry) or to create a new validation assignment on a revised candidate. Escalation and rejection decisions persist as permanent audit records.
5. Verify the resulting status
After submitting a decision, check the assignment queue depth to confirm the assignment processed correctly:
curl -s "http://localhost:8000/v1/validation/queue/depth"
This returns the count of assignments in each status bucket. Confirm the IN_REVIEW count decreased by one and the appropriate terminal-state bucket increased.
Validation state transitions
stateDiagram-v2
[*] --> PENDING : assignment created
PENDING --> IN_REVIEW : claim
IN_REVIEW --> APPROVED : decide approved
IN_REVIEW --> REVISED : decide revised
IN_REVIEW --> REJECTED : decide rejected
IN_REVIEW --> ESCALATED : decide escalated
REVISED --> IN_REVIEW : re-classification complete
APPROVED --> SUPERSEDED : supersede in registry
APPROVED --> DISPUTED : dispute in registry
APPROVED --> RETIRED : retire in registry
Result
The candidate has a ValidationRecord with a terminal decision. Approved candidates carry a validation_record_id that is required for publishing to the registry. Revised candidates re-enter classification and then return to the review queue. Rejected and escalated candidates are retained for audit but do not proceed to the registry.
See also: Publish an Approved Answer to the Registry; Classify a Candidate Answer; Horn Information Types