Understanding the Schema for the Capture Queue in Claude-Obsidian: A Technical Deep Dive
The capture queue in claude-obsidian follows the claude-obsidian.capture-queue.v1 JSON schema defined in claude_obsidian/capture.py, requiring three top-level fields—schema, revision, and entries—where each entry tracks source_path, dest_path, size, SHA-256 hash, mtime, and optional metadata to enable durable, content-addressed file ingestion.
The capture queue serves as the durable, content-addressed inbox that stores raw source files before they are ingested into the vault. In the AgriciDaniel/claude-obsidian repository, this queue is implemented as a validated JSON document that ensures data integrity across capture operations. Understanding the schema for the capture queue in claude-obsidian is essential for developers extending the capture workflow or debugging ingestion failures.
Top-Level Structure of the Capture Queue
The queue is governed by a strict contract enforced through a schema version string and a predictable JSON structure.
The QUEUE_SCHEMA Constant
In claude_obsidian/capture.py, the canonical schema identifier is defined as a module constant:
QUEUE_SCHEMA = "claude-obsidian.capture-queue.v1"
This string acts as a versioned contract. Any on-disk queue file must include this exact value in its schema field; otherwise, the validator raises a QUEUE_INVALID error with the message "capture queue must use claude‑obsidian.capture‑queue.v1".
Required Fields Overview
Every valid capture queue document must contain the following three top-level keys:
- schema: A string fixed to
claude-obsidian.capture-queue.v1. - revision: An integer representing a monotonically increasing version number that helps detect concurrent modifications.
- entries: A list of entry objects representing the ordered backlog of files awaiting ingestion.
Entry Object Schema and Fields
Each item within the entries array is a dictionary that captures the immutable metadata required to reconstruct a source file inside the vault.
Core Metadata Fields
An entry object must provide these five fields:
- source_path: String representing the original file location relative to the vault root.
- dest_path: String indicating the destination path inside the vault where the immutable copy will reside.
- size: Integer specifying the byte size of the captured file.
- hash: String containing the content-addressed SHA-256 hash of the file.
- mtime: Integer representing the Unix timestamp of the source file at the moment of capture.
Optional Provenance Data
Entries may also include an optional metadata field containing a dictionary of additional provenance data. This flexible key-value store allows the capture system to record context such as MIME types, extraction hints, or custom tags without breaking schema validation.
The complete entry structure looks like this in practice:
{
"source_path": "inbox/example.pdf",
"dest_path": ".raw/2024-03-01/example.pdf",
"size": 124578,
"hash": "a3f5c9e8d4b2...",
"mtime": 1712489600,
"metadata": {
"type": "pdf",
"title": "Example Document"
}
}
Validation Rules and Error Handling
According to the AgriciDaniel/claude-obsidian source code in claude_obsidian/capture.py, the queue undergoes rigorous validation on every read and write operation to prevent corruption.
Schema Version Enforcement
Validators first check that q["schema"] matches QUEUE_SCHEMA. A mismatch immediately raises QUEUE_INVALID. The code also verifies that revision is an integer and that entries is a list; failure on either count produces the same QUEUE_INVALID error with the message "capture queue has invalid revision or entries".
Size and Entry Limits
To prevent unbounded growth, the implementation enforces configurable limits:
- Entry count: Validators check against
MAX_QUEUE_ENTRIES. Exceeding this limit raisesQUEUE_INVALIDwith "capture queue exceeds the ${MAX_QUEUE_ENTRIES}-entry limit". - Byte size: The cumulative size of the queue is checked against
MAX_QUEUE_BYTES. Violations triggerQUEUE_INVALIDwith "capture queue exceeds the ${MAX_QUEUE_BYTES}-byte limit".
Practical Implementation Examples
The following patterns demonstrate how to construct and manipulate the queue while respecting the schema.
Creating an Empty Queue
When initializing a new capture plan, the system generates a compliant empty queue:
empty_queue = {
"schema": "claude-obsidian.capture-queue.v1",
"revision": 0,
"entries": []
}
Appending New Entries
To add a captured file to the queue, append a validated entry dictionary and increment the revision counter:
new_entry = {
"source_path": "downloads/report.docx",
"dest_path": ".raw/2024-06-15/report.docx",
"size": 45200,
"hash": "e3b0c44298fc1c149afbf4c8996fb924...",
"mtime": 1718451200,
"metadata": {"project": "Q3-Review"}
}
queue["entries"].append(new_entry)
queue["revision"] += 1
Validating Queue Integrity
Although the library handles validation internally, the logic follows this pattern as implemented in claude_obsidian/capture.py:
def validate_queue(q):
if q.get("schema") != "claude-obsidian.capture-queue.v1":
raise ValueError("QUEUE_INVALID: invalid schema version")
if not isinstance(q.get("revision"), int):
raise ValueError("QUEUE_INVALID: revision must be an integer")
if not isinstance(q.get("entries"), list):
raise ValueError("QUEUE_INVALID: entries must be a list")
# Additional size and byte-limit checks follow...
Summary
- The capture queue schema is versioned under
claude-obsidian.capture-queue.v1and defined inclaude_obsidian/capture.py. - Three top-level fields are mandatory:
schema,revision, andentries. - Each entry must specify
source_path,dest_path,size,hash, andmtime, with an optionalmetadatadictionary. - Validation enforces schema version, data types,
MAX_QUEUE_ENTRIES, andMAX_QUEUE_BYTESlimits, raisingQUEUE_INVALIDerrors on violations. - The CLI commands in
claude_obsidian/cli.pyand unit tests intests/test_capture.pyexercise and enforce these schema rules.
Frequently Asked Questions
What is the exact schema version string for the claude-obsidian capture queue?
The schema version string is "claude-obsidian.capture-queue.v1". This constant is exported as QUEUE_SCHEMA from claude_obsidian/capture.py and serves as the sole valid identifier for the queue’s schema field.
What fields are required for each entry in the capture queue?
Every entry must include five required fields: source_path (original file location), dest_path (vault destination), size (bytes), hash (SHA-256 content hash), and mtime (Unix timestamp). An optional metadata dictionary can be appended to store additional provenance information.
How does claude-obsidian validate the capture queue before processing?
The validator, implemented in claude_obsidian/capture.py, checks that the schema matches QUEUE_SCHEMA, that revision is an integer, and that entries is a list. It also verifies that the queue does not exceed MAX_QUEUE_ENTRIES or MAX_QUEUE_BYTES. Any violation raises a QUEUE_INVALID error with a descriptive message.
What happens if the capture queue exceeds the configured size limits?
If the queue exceeds MAX_QUEUE_ENTRIES or MAX_QUEUE_BYTES, the validation logic raises QUEUE_INVALID with messages indicating which limit was breached. These guards prevent memory exhaustion and ensure the capture workflow remains performant when processing large backlogs.
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:
curl -s "https://instagit.com/install.md" Maintain an open-source project? Get it listed too →