Validation Rules for Accepted Claims with Fresh Contradictory Evidence in Claude-Obsidian

When a claim is marked as "accepted" in Claude-Obsidian, the ledger validator requires non-empty adjudication notes whenever fresh contradictory evidence exists, enforcing this rule in claude_obsidian/ledgers.py lines 1138-1150.

The claude-obsidian repository implements a knowledge-management ledger system that enforces strict validation rules on knowledge claims. According to the source code in claude_obsidian/ledgers.py, accepted claims face additional scrutiny when fresh contradictory evidence is present, requiring explicit documentation to maintain data integrity.

How the Ledger Validator Detects Fresh Contradictory Evidence

The validation engine identifies fresh contradictory evidence by filtering contradictory sources against three specific criteria. This logic determines whether the stricter validation rules apply to an accepted claim.

A contradictory source qualifies as "fresh" only when all of the following conditions are met:

  • The source's review_status field equals "active"
  • The source is not synthetic (authority is not "synthetic" and content_kind is not "synthetic")
  • The source is not stale (the source_is_stale function returns False)

When these conditions identify one or more fresh contradictions, the validator triggers the mandatory notes requirement for any claim with an assessment value of "accepted".

The Mandatory Notes Requirement for Accepted Claims

The core validation rule resides in the error-building function at lines 1138-1150 of claude_obsidian/ledgers.py. This function checks that accepted claims with fresh contradictory evidence provide non-empty scalar string notes.

The validator performs three specific checks on the notes field:

  1. Type validation — The notes must be a string (not a list, dict, or other non-scalar type)
  2. Content validation — notes.strip() must evaluate to truthy (non-empty after whitespace removal)
  3. Presence validation — The field must exist and not be null

If any check fails, the validator raises the specific error message:


accepted claims with fresh contradictory evidence require contested assessment or adjudication notes

This enforcement ensures that practitioners cannot silently ignore contradictory data when marking claims as accepted, forcing explicit documentation of the resolution strategy or monitoring plan.

Practical Implementation Examples

The following Python dictionaries demonstrate compliant and non-compliant claim structures.

Compliant Claim Structure

This example satisfies the validation rule by including explanatory notes alongside accepted status and fresh contradictory evidence:


# ✅ Valid: Accepted claim with fresh contradictory evidence and required notes

claim = {
    "assessment": "accepted",
    "evidence": {
        "supporting": [
            {"review_status": "active", "authority": "peer_reviewed", "content_kind": "study"}
        ],
        "contradicting": [
            {
                "review_status": "active",
                "authority": "external",
                "content_kind": "document",
                # Additional source metadata...

            }
        ],
    },
    "notes": "Contradictory reports from Q2 2024 are being monitored; acceptance contingent on upcoming validation study."
}

Non-Compliant Claim Structure

This example triggers the validation error by omitting required documentation:


# ❌ Invalid: Missing required notes for accepted claim with fresh contradictions

claim = {
    "assessment": "accepted",
    "evidence": {
        "supporting": [
            {"review_status": "active", "authority": "peer_reviewed", "content_kind": "study"}
        ],
        "contradicting": [
            {
                "review_status": "active",
                "authority": "external",
                "content_kind": "document",
            }
        ],
    },
    "notes": ""  # Empty string triggers validation error

}

Running this claim through the ledger validator produces the error: "accepted claims with fresh contradictory evidence require contested assessment or adjudication notes".

Key Source Files and Test Coverage

Three primary files define and enforce the validation rules for accepted claims with contradictory evidence:

  • claude_obsidian/ledgers.py — Lines 1138-1150 contain the core validation logic that checks for fresh contradictory evidence and enforces the notes requirement.

  • claude_obsidian/contracts.py — Defines the claim schema and data structures, including the assessment field and evidence object specifications that the validator consumes.

  • tests/test_ledgers.py — Lines 1415 and 1638 contain unit tests asserting the specific error message for accepted claims lacking adjudication notes when fresh contradictory evidence is present.

Summary

  • Accepted claims in claude-obsidian trigger additional validation when fresh contradictory evidence exists.
  • Fresh contradictory evidence requires review_status: "active", non-synthetic authority/content kind, and non-stale status.
  • The validator mandates non-empty scalar string notes (adjudication or contested assessment) when both conditions above are met.
  • The enforcement logic resides in claude_obsidian/ledgers.py at lines 1138-1150.
  • Violations raise the specific error: "accepted claims with fresh contradictory evidence require contested assessment or adjudication notes".

Frequently Asked Questions

What constitutes "fresh" contradictory evidence in claude-obsidian?

Fresh contradictory evidence refers to active, non-synthetic sources that have not gone stale. Specifically, the source must have review_status set to "active", both authority and content_kind must not equal "synthetic", and the source_is_stale function must return False. Only sources meeting all these criteria trigger the mandatory notes requirement for accepted claims.

Why does the validator reject empty strings for the notes field?

The validator performs a truthiness check on notes.strip() to prevent whitespace-only entries from satisfying the documentation requirement. This ensures that practitioners provide substantive adjudication rationale rather than blank or minimal entries when acknowledging contradictory evidence. The validation occurs at claude_obsidian/ledgers.py lines 1138-1150.

Where can I find the unit tests for this validation rule?

The unit tests asserting this behavior are located in tests/test_ledgers.py at lines 1415 and 1638. These tests verify that the validator raises the specific error message "accepted claims with fresh contradictory evidence require contested assessment or adjudication notes" when accepted claims lack proper documentation despite having fresh contradictory sources.

How does this rule interact with synthetic evidence sources?

Synthetic sources are explicitly excluded from the fresh contradictory evidence check. When a source has authority: "synthetic" or content_kind: "synthetic", the validator ignores it when determining whether to enforce the notes requirement. This distinction ensures that machine-generated or placeholder data does not trigger adjudication requirements for accepted claims.

Have a question about this repo?

These articles cover the highlights, but your codebase questions are specific. Give your agent direct access to the source. Share this with your agent to get started:

Share the following with your agent to get started:
curl -s "https://instagit.com/install.md"

Works with
Claude Codex Cursor VS Code OpenClaw Any MCP Client

Maintain an open-source project? Get it listed too →