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

> Discover validation rules for accepted claims in Claude-Obsidian. Learn how the ledger validator enforces non-empty adjudication notes with fresh contradictory evidence.

- Repository: [Agrici.Daniel/claude-obsidian](https://github.com/AgriciDaniel/claude-obsidian)
- Tags: how-to-guide
- Published: 2026-08-26

---

**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`](https://github.com/AgriciDaniel/claude-obsidian/blob/main/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`](https://github.com/AgriciDaniel/claude-obsidian/blob/main/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`](https://github.com/AgriciDaniel/claude-obsidian/blob/main/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:

```python

# ✅ 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:

```python

# ❌ 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`](https://github.com/AgriciDaniel/claude-obsidian/blob/main/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`](https://github.com/AgriciDaniel/claude-obsidian/blob/main/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`](https://github.com/AgriciDaniel/claude-obsidian/blob/main/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`](https://github.com/AgriciDaniel/claude-obsidian/blob/main/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`](https://github.com/AgriciDaniel/claude-obsidian/blob/main/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`](https://github.com/AgriciDaniel/claude-obsidian/blob/main/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.