Problem

Editorial review creates work that is easy to lose: a missing source, a section that needs expansion, a question that blocks publication, a contradiction that must be fixed. Comments record those gaps as prose. Doc Doctor gives each gap a durable type, anchor, state, and workflow.

Origin

Doc Doctor grew from recurring problems in documentation, governance, review, and knowledge-management work: unsupported claims, unresolved questions, incomplete explanations, contradictions, and material waiting for review. The project turns those gaps into typed, anchored objects with state and operations shared by the Obsidian interface, developer tools, and agents.

Position

The project separates deterministic editorial state from assisted interpretation. Stub types and document properties can be inspected directly. AI can propose or help resolve work. The gap, state, and workflow remain explicit.

System

AmnesiaBooks · highlights · reading state · source locators
Doc DoctorStubs · document state · AI · grounding · citations · MCP
Implemented federation boundary: each system keeps its own domain while exchanging scoped state and operations.

Implemented · Amnesia → Doc Doctor Books, highlights, reading state, and knowledge-gap annotations can become structured Doc Doctor inputs. Eligible highlights synchronize to typed stubs with deduplication and conflict handling.

Implemented · Doc Doctor → Amnesia Stub resolutions and document-health state can return through the bridge and update the reading-side workflow.

Planned: Make Amnesia’s source-addressed passages first-class retrieval material when Doc Doctor searches for evidence or resolves citation gaps.

Demonstration

A link/citation stub is resolved from the same Obsidian document and sidebar surface.

Doc Doctor — citation resolution1/4 · Citation gap

Obsidian workspace with Doc Doctor open in the right sidebar. An unsupported statement is represented as a link stub, selected for citation resolution, verified, and replaced with a sourced Markdown footnote.

The document text is synthetic. The stub list, controls, anchor treatment, and workflow correspond to the current Doc Doctor implementation.

Decisions

  1. Make editorial gaps first-class typed objects. A missing source, expansion, question, or fix carries a type, anchor, state, and lifecycle that can be queried and changed directly.
  2. Separate stored document properties from calculated state and operational rules. J-Editorial’s layers keep durable facts distinct from context-dependent dimensions and from the rules that act on them.
  3. Keep the Rust domain core independent of infrastructure. The hexagonal core defines entities, calculations, errors, and ports; YAML, filesystem, MCP, WASM, CLI, and other interfaces sit behind adapters.
  4. Keep calculations deterministic and put model assistance outside the domain boundary. Health, usefulness, validation, and state transitions remain testable without an LLM; model providers assist through constrained orchestration surfaces.
  5. Use format-agnostic parser and repository ports. The domain operates on document concepts; Markdown/YAML storage remains an adapter concern.
  6. Expose cross-plugin capabilities through scoped APIs. Document operations, stubs, events, recommendations, and Amnesia integration sit behind explicit capability grants so adjacent plugins can reuse shared domain operations through a stable boundary.
  7. Use Obsidian as the primary human work surface and expose the same operations to tools. The plugin, MCP server, CLI, and WASM adapters enter shared domain operations and rules.
  8. Keep document history and provenance inspectable. Git-backed history and explicit lifecycle records expose how a document changed and which state transitions occurred.

Further inspection