Skip to content

Inspect Contradictions and Version History

Before you begin

Audience: Governance lead, support engineer

You need the answer_id of the answer you want to inspect. The answer should be APPROVED and of horn_type: fact — contradiction detection operates on FACT-type approved answers only (see note in Section A).

If an answer was published recently and contradictions appear to be missing, run a graph sync task before proceeding. Contact your platform administrator to confirm the sync schedule or trigger a manual sync.


Section A — Inspect Contradictions

Contradictions indicate that two approved answers assert conflicting information about the same subject and predicate. Identifying and resolving them keeps the registry internally consistent.

1. Retrieve known contradictions

curl -s http://localhost:8000/v1/graph/answers/ans-2a3b4c5d/contradictions

The response returns a list of CONFLICTS_WITH relationships from the Neo4j graph:

{
  "answer_id": "ans-2a3b4c5d",
  "contradictions": [
    {
      "answer_id_a": "ans-2a3b4c5d",
      "answer_id_b": "ans-5e6f7a8b",
      "conflict_type": "object_value_mismatch",
      "description": "Both answers assert 'v3 API webhook delivery has_maximum_payload_size' but with different object values: '5 MB' vs '10 MB'."
    }
  ]
}

If contradictions is an empty array, no conflicts are currently registered for this answer in the graph.

Note: The Neo4j graph is a derived projection from PostgreSQL. Answers published since the last graph sync may not yet appear. If you expect a contradiction that is not showing, trigger a fresh detection pass (step 5) or ask your platform administrator to run the sync job. See also: "Run Workers and Sync Jobs" in the administration guide.

2. Understand what constitutes a contradiction

A contradiction exists when two APPROVED FACT-type answers share the same grammar_subject and grammar_predicate but have different grammar_object values and compatible or overlapping customer_scope.

This means: - Same subject (for example, "v3 API webhook delivery") - Same predicate (for example, "has_maximum_payload_size") - Different object value (for example, "5 MB" vs "10 MB")

Answers with different subjects or predicates are not contradictions, even if they cover related topics.

Note: Contradiction detection operates on APPROVED FACT-type answers only. Answers of other Horn types (concept, procedure, principle, etc.) and answers in non-APPROVED states are not evaluated. If you have a factual discrepancy in a non-FACT answer, resolve it through the standard validation lifecycle.

3. Evaluate each contradiction

For each CONFLICTS_WITH relationship returned, determine:

Question Guidance
Which answer is more recent? Check created_at on each answer via GET /v1/registry/answers/{answer_id}
Which answer has stronger evidence? Compare the evidence links and their source authority
Does one answer apply to a different scope than the other? Scoped answers may not be true contradictions
Has the underlying fact changed, making one answer outdated? If yes, the older answer should be superseded

4. Resolve the contradiction

Choose the appropriate resolution action:

Situation Resolution
One answer is outdated Supersede the older answer by publishing a new version; the superseded status removes it from active contradiction checks
One answer is wrong Dispute the incorrect answer; assign a validator to correct and re-validate it
Both answers are valid but scoped differently Verify customer_scope is set correctly on both; scope isolation prevents cross-scope contradictions
The fact itself is ambiguous Retire both and create a single authoritative replacement

5. Trigger a fresh contradiction detection pass

To queue a new detection run for a specific answer:

curl -s -X POST http://localhost:8000/v1/graph/answers/ans-2a3b4c5d/detect-contradictions

The service queues a Celery task. The detection result will be reflected in the graph after the task completes. Poll GET /v1/graph/answers/{answer_id}/contradictions again after a short interval to see updated results.


Section B — Inspect Version History

Version history shows how an answer has changed over time through supersession. Use this to understand the provenance of the current answer and to find older versions if needed.

1. Retrieve the supersession chain

curl -s http://localhost:8000/v1/graph/answers/ans-2a3b4c5d/supersessions

The response returns the full chain from the original version to the most recent, each entry as an AnswerNode:

{
  "answer_id": "ans-2a3b4c5d",
  "supersession_chain": [
    {
      "answer_id": "ans-0z9y8x7w",
      "version": 1,
      "status": "SUPERSEDED",
      "created_at": "2025-08-10T09:00:00Z"
    },
    {
      "answer_id": "ans-1a2b3c4d",
      "version": 2,
      "status": "SUPERSEDED",
      "created_at": "2026-01-15T14:22:00Z"
    },
    {
      "answer_id": "ans-2a3b4c5d",
      "version": 3,
      "status": "APPROVED",
      "created_at": "2026-05-20T10:14:00Z"
    }
  ]
}

The last entry in the chain is always the current APPROVED version. Earlier entries are SUPERSEDED.

2. Interpret the version chain

The supersession chain tells you: - How many times this answer has been revised - The date each version was created - Which version is currently active

Use the chain to audit when a factual change was made and to retrieve a historical version for reference or comparison. To export a specific historical version, see Export an Answer for Reuse.


Section C — Explore Answers by Concept

Concept browsing lets you find all approved answers related to a subject label. This is useful for comprehensive review of everything the registry knows about a given topic.

1. Find all answers for a concept label

The concept_label corresponds to the grammar_subject value used in the assertion grammar for FACT-type answers:

curl -s "http://localhost:8000/v1/graph/concepts/v3%20API%20webhook%20delivery/answers"

URL-encode spaces and special characters in the concept label.

The response returns a list of AnswerNode objects — all approved answers whose grammar_subject matches the concept label:

{
  "concept_label": "v3 API webhook delivery",
  "answers": [
    {
      "answer_id": "ans-2a3b4c5d",
      "version": 3,
      "status": "APPROVED",
      "created_at": "2026-05-20T10:14:00Z"
    },
    {
      "answer_id": "ans-9b8c7d6e",
      "version": 1,
      "status": "APPROVED",
      "created_at": "2026-03-01T11:05:00Z"
    }
  ]
}

Multiple approved answers for the same concept are normal — they may have different predicates (for example, payload size, retry behavior, authentication method). If you see answers with the same predicate, that may indicate an undetected contradiction; run detect-contradictions on each.


Result

You have a complete picture of contradictions, version history, and conceptual clusters for a given answer or subject. Contradictions are documented with their conflict type and a description of the mismatch. The supersession chain shows how the answer has evolved. Concept browsing reveals the full scope of what the registry asserts about a given subject, enabling targeted governance review.