Files
2026-05-08 16:42:19 +09:00

15 KiB

Sprint 8 Contract: Doctor And Setup Documentation

Status: Implemented Last updated: 2026-05-08

Objective

Make local setup failures explicit before users run conversions by adding a mockable pdf2md doctor diagnostic path and setup documentation for Windows PowerShell, Python 3.12, uv, MinerU 3.1.0, local model/cache expectations, NVIDIA GPU/CUDA visibility, and strict-local runtime behavior.

Sprint 8 must establish:

  • A project-owned doctor module for local environment diagnostics.
  • A pdf2md doctor CLI command with deterministic exit codes.
  • Clear reporting for Python, uv, MinerU CLI, MinerU version, GPU/CUDA/PyTorch visibility, and model/cache path detection.
  • Documentation that explains setup steps and local-only runtime constraints without introducing cloud/API fallback paths.
  • Fast tests that mock environment checks and do not require real MinerU, CUDA, GPU, model files, network, samples/, Obsidian, LaTeX tooling, or package/model downloads.

Sprint 8 is a diagnostics and setup-documentation sprint. It must not change conversion output behavior, run real conversions, probe local sample PDFs, or make runtime conversion depend on network access.

Current Precondition

Sprint 7 is complete:

  • src/pdf2md/paths.py owns input discovery and output path planning.
  • src/pdf2md/ir.py owns project records, block types, warning codes, and warning severities.
  • src/pdf2md/metadata.py builds JSON-serializable metadata and summary counts from project-owned records.
  • src/pdf2md/mineru_adapter.py owns the mocked direct local MinerU CLI adapter boundary.
  • src/pdf2md/markdown.py owns Obsidian Markdown normalization.
  • src/pdf2md/quality.py owns local quality checks, including math checker unavailable behavior.
  • src/pdf2md/report.py owns report content rendering and final status calculation.
  • src/pdf2md/conversion.py owns conversion orchestration and output writing.
  • src/pdf2md/cli.py owns pdf2md convert.
  • uv run pytest passed 119 tests.

Sprint 8 may add doctor diagnostics and setup documentation. It must not require a real successful local MinerU/GPU/model setup in the default test loop.

Touched Surfaces

Allowed:

  • src/pdf2md/doctor.py
  • src/pdf2md/cli.py
  • src/pdf2md/mineru_adapter.py only for narrowly required availability/version helper compatibility
  • README.md
  • scripts/install-mineru.ps1 only if implemented as an explicit user-invoked setup helper
  • scripts/install-models.py only if implemented as an explicit user-invoked setup helper
  • tests/test_doctor.py
  • tests/test_cli.py
  • tests/test_mineru_adapter.py only if adapter helper compatibility changes
  • PLAN.md
  • PROGRESS.md
  • docs/V1IMPLEMENTATIONPLAN.md
  • docs/Sprints/SPRINT8CONTRACT.md

Not allowed:

  • Changes to src/pdf2md/conversion.py unless a doctor/CLI regression forces a narrow compatibility fix
  • Changes to Markdown normalization, metadata schema, report rendering, or path planning unrelated to doctor behavior
  • Real PDF conversion in default tests
  • Real MinerU execution in default tests
  • Real CUDA/GPU dependency in default tests
  • Model downloads in default tests
  • Any setup download triggered by pdf2md doctor, pdf2md convert, import time, or tests
  • Runtime engine selection or alternate engine support
  • Cloud OCR, remote LLM/VLM, hosted renderer, remote document parser, remote asset fetching, HTTP client backend, router mode, --api-url, remote APIs, or remote OpenAI-compatible backend support
  • A CLI/API option that disables strict-local policy
  • Committed files under samples/
  • Generated conversion outputs committed to git

Expected Outputs

Sprint 8 should produce:

  1. Doctor result records and API

    • A small project-owned doctor result type containing at least:
      • check name
      • status: pass, warn, or fail
      • human-readable message
      • optional details
    • A doctor report type containing ordered checks and an overall status.
    • Mockable checker dependencies for subprocess calls, executable discovery, Python version, imports, environment variables, and filesystem paths.
    • No public or required field should expose raw subprocess or third-party objects.
  2. Required checks

    • Python version check:
      • Pass on Python 3.12.
      • Fail outside the supported project range.
    • uv check:
      • Detect executable availability.
      • Report version text when available.
      • Fail clearly when missing.
    • MinerU check:
      • Detect direct local mineru CLI availability through the existing adapter boundary where possible.
      • Report MinerU version when available.
      • Fail clearly when the CLI is missing.
      • Warn or fail clearly when version detection fails or the detected version is not MinerU 3.1.0.
    • GPU/CUDA/PyTorch visibility:
      • Report whether an NVIDIA GPU is visible when detectable.
      • Report CUDA/PyTorch visibility without requiring PyTorch in default tests.
      • Warn clearly when GPU/CUDA/PyTorch acceleration is unavailable.
      • Warn clearly when the detected GPU is GTX 1070 Ti or another Pascal/pre-Turing class GPU with likely CUDA/PyTorch compatibility risk.
    • Model/cache paths:
      • Report detectable local model/cache paths from documented environment variables or known local config locations.
      • Warn when model/cache paths cannot be detected.
      • Do not download, install, or validate large model files in default tests.
    • Local-only policy:
      • Report that runtime conversion allows only direct local mineru CLI execution and CLI-internal temporary local mineru-api.
      • Report that --api-url, remote APIs, router mode, HTTP client backends, and remote OpenAI-compatible backends are prohibited.
  3. CLI command

    • pdf2md doctor exists.
    • pdf2md --version remains unchanged.
    • pdf2md convert behavior remains covered and unchanged except for parser integration.
    • Exit code policy:
      • 0 when all checks pass or only warnings exist.
      • Non-zero when any required check fails.
    • CLI output must be concise, deterministic, and testable.
    • CLI output must distinguish warnings from failures.
  4. Setup documentation

    • README or setup section explains:
      • Windows PowerShell workflow.
      • Python 3.12 requirement.
      • uv usage and PATH note for C:\Users\user\.local\bin.
      • MinerU 3.1.0 local CLI expectation.
      • Model/cache setup expectations and where doctor looks.
      • NVIDIA GPU expectations and GTX 1070 Ti 8GB risk.
      • Strict-local runtime policy.
      • Difference between explicit setup downloads and runtime conversion, which must stay local-only.
    • If setup helper scripts are added, they must be explicit user-invoked helpers, not imported by package code, not called by doctor, and not used by default tests.
  5. Tests

    • Unit tests for doctor success with mocked checks.
    • Unit tests for missing Python version support.
    • Unit tests for missing uv.
    • Unit tests for missing MinerU.
    • Unit tests for MinerU version detection failure or non-3.1.0 version.
    • Unit tests for missing GPU/CUDA/PyTorch warning behavior.
    • Unit tests for GTX 1070 Ti/Pascal risk warning behavior.
    • Unit tests for missing model/cache warning behavior.
    • CLI tests for pdf2md doctor success, warning-only success, and hard failure exit code.
    • Regression tests proving pdf2md convert and --version still work.
    • Tests proving default checks do not require real MinerU, GPU, CUDA, PyTorch, model files, network, samples/, Obsidian, or LaTeX tooling.
  6. Handoff

    • PROGRESS.md records changed files, commands run, tests passed or blocked, known failures, residual risks, and next action.

Non-Goals

  • Do not run real MinerU in default tests.
  • Do not install MinerU 3.1.0.
  • Do not download MinerU models.
  • Do not run real model setup during doctor or tests.
  • Do not parse, convert, or inspect sample PDFs.
  • Do not implement local fixture evaluation.
  • Do not change conversion orchestration behavior except for unavoidable CLI parser integration.
  • Do not add runtime engine selection.
  • Do not add alternate engines.
  • Do not add cloud, remote API, router, HTTP client backend, remote OpenAI-compatible backend, hosted renderer, or remote asset-fetching support.
  • Do not add a CLI/API option that disables strict-local policy.
  • Do not require real CUDA, GPU, PyTorch, MinerU, model files, network, Obsidian, LaTeX tooling, or samples/ in default tests.
  • Do not claim that GTX 1070 Ti CUDA/PyTorch acceleration is guaranteed until local validation proves it.
  • Do not claim perfect setup automation.

Work Packages

WP8.1: Doctor Records And Mockable Check Boundaries

Owner:

  • local-setup-agent
  • feature-generator-agent

Actions:

  • Add doctor.py.
  • Define doctor check/result records.
  • Keep all external probes injectable or mockable.
  • Implement deterministic aggregation and exit status policy.

Output:

  • The CLI can report setup health without depending on real local tools in tests.

WP8.2: Environment And MinerU Diagnostics

Owner:

  • local-setup-agent
  • mineru-integration-agent
  • feature-generator-agent

Actions:

  • Add Python, uv, MinerU availability, MinerU version, GPU/CUDA/PyTorch, and model/cache checks.
  • Reuse the direct local MinerU adapter boundary where it fits.
  • Keep MinerU 3.1.0 as the only accepted engine target.

Output:

  • Users get clear local setup failures before conversion.

WP8.3: CLI Doctor Command

Owner:

  • feature-generator-agent
  • requirements-guard-agent

Actions:

  • Add pdf2md doctor without breaking pdf2md convert or --version.
  • Print deterministic pass/warn/fail lines and an overall status.
  • Return non-zero when required checks fail.

Output:

  • The command-line workflow can diagnose setup state.

WP8.4: Setup Documentation And Optional Explicit Helpers

Owner:

  • local-setup-agent
  • license-privacy-agent
  • requirements-guard-agent

Actions:

  • Update README setup docs for Windows PowerShell, Python 3.12, uv, MinerU 3.1.0, model/cache, GPU, and local-only runtime policy.
  • Verify volatile install/setup claims against official docs before editing.
  • If adding scripts, keep them explicit, local setup-only, and never called by doctor, convert, import time, or default tests.

Output:

  • Setup instructions are clear without weakening strict-local runtime policy.

WP8.5: Independent Evaluation

Owner:

  • evaluation-agent

Actions:

  • Review completed doctor behavior and docs against this contract.
  • Verify no default test executes real MinerU, uses GPU/CUDA, downloads models, uses network, or requires samples/.
  • Verify no runtime remote/API path or alternate engine is introduced.
  • Verify samples/ remains untracked and unstaged.

Output:

  • PASS/FAIL notes with any missing acceptance criteria.

Verification Checks

Required:

  • git status --short --untracked-files=all before staging confirms samples/ remains untracked and unstaged.
  • uv --version is run and result is recorded.
  • uv sync passes.
  • uv run pytest tests/test_doctor.py tests/test_cli.py passes.
  • uv run pytest passes.
  • git diff --check passes.
  • Default tests do not require real MinerU, CUDA, GPU, PyTorch, model files, network, Obsidian, LaTeX tooling, or samples/.
  • No model downloads occur.
  • No setup downloads occur from doctor, convert, imports, or tests.
  • No network calls are required in default tests.
  • No candidate engine comparison is reintroduced.
  • No alternate engine or runtime engine selection is added.
  • No CLI/API option disables strict-local policy.
  • No --api-url, router mode, HTTP client backend, remote API, or remote OpenAI-compatible backend support is added.
  • Doctor fails clearly when required dependencies are missing.
  • Doctor does not report the environment as healthy when MinerU is missing.
  • Doctor warnings are clear for GPU/CUDA/PyTorch/model-cache risk.
  • pdf2md convert tests still pass.
  • pdf2md --version still works.

Recommended:

  • Keep doctor checks small, ordered, and deterministic.
  • Keep human-readable output stable enough for unit tests.
  • Use dependency injection rather than monkeypatching global process state where possible.
  • Treat real local GPU/MinerU/model probes as optional manual verification outside the default test suite.
  • Use requirements-guard-agent if setup wording risks weakening strict-local policy.
  • Use research-agent or local-setup-agent with live web verification before changing volatile installation commands or model-cache documentation.

Hard Failure Criteria

Sprint 8 fails and must stop for a user decision if any of these are true:

  • Doctor reports a healthy environment when MinerU is missing.
  • Doctor says cloud/API fallback is supported.
  • Doctor, import time, or default tests install packages, download models, call network services, or run model setup.
  • Default tests require real MinerU, CUDA, GPU, PyTorch, model files, network, Obsidian, LaTeX tooling, or samples/.
  • The implementation adds or permits --api-url, remote APIs, router mode, HTTP client backends, or remote OpenAI-compatible backends.
  • The implementation adds runtime engine selection or alternate engines.
  • pdf2md doctor breaks pdf2md convert or pdf2md --version.
  • The README or scripts imply runtime conversion can upload PDFs, page images, extracted text, or intermediates to remote services.
  • Setup helper scripts are invoked automatically by doctor, convert, import time, or tests.
  • samples/ is staged or committed.

Acceptance Criteria

Sprint 8 is complete when:

  • src/pdf2md/doctor.py exists and owns local setup diagnostics.
  • pdf2md doctor exists.
  • Doctor returns a project-owned report with ordered checks and overall status.
  • Python 3.12, uv, MinerU availability/version, GPU/CUDA/PyTorch visibility, and model/cache path checks are implemented with mocked tests.
  • Missing uv is tested.
  • Missing MinerU is tested and produces a failure.
  • Missing GPU/CUDA/PyTorch is tested and produces clear warning behavior.
  • GTX 1070 Ti/Pascal risk warning behavior is tested.
  • Missing model/cache path warning behavior is tested.
  • pdf2md doctor exit code behavior is tested for success, warning-only success, and failure.
  • pdf2md convert and pdf2md --version regression tests still pass.
  • Setup docs explain local-only runtime behavior and do not imply cloud/API fallback.
  • Default tests do not require real MinerU, GPU, CUDA, PyTorch, model files, network, Obsidian, LaTeX tooling, or samples/.
  • uv sync passes.
  • Targeted doctor/CLI tests pass.
  • uv run pytest passes.
  • PROGRESS.md records checks performed and residual risks.
  • Independent evaluation is complete.
  • The completed change is committed.

Handoff Fields

Use these fields when Sprint 8 completes:

  • Files changed:
  • Commands run:
  • Tests passed:
  • Tests blocked:
  • Known failures:
  • Residual risks:
  • User decisions needed:
  • Go/no-go recommendation for Sprint 9:
  • Next action: