## Step 2: prompts/transcribe_document.md ### Goal Implement the MVP prompt artifact system by creating a curated transcription prompt file: - `prompts/transcribe_document.md` This step primarily satisfies: - **REQ-12**: prompts stored as individual Markdown artifacts - MVP Feature 3: prompt-driven verbatim transcription behavior grounded in `docs/intent.md` --- ## Scope for Step 2 ### In scope 1. Create prompt artifact directory and first prompt file. 2. Encode transcription rules from `docs/intent.md` into a model-facing prompt. 3. Define stable prompt structure so future revisions are easy to diff/review. 4. Add lightweight tests that validate artifact presence and baseline quality constraints. 5. Update docs/README references so Step 3 can consume prompt file directly. ### Out of scope - Provider integration logic (Step 3) - Worker/job orchestration (Step 4) - UI behavior (Step 5) --- ## Proposed Deliverables 1. **`prompts/transcribe_document.md`** - production prompt text for historical document transcription 2. **`prompts/README.md`** (recommended) - conventions for prompt files, revision policy, naming 3. **`tests/test_prompts.py`** (recommended) - artifact existence + structure checks 4. **Small docs update** (README or docs reference) - indicate that prompts are file-based and loaded from `PROMPT_DIR` --- ## Detailed Work Breakdown ### 1) Create prompt artifact folder and canonical file - Add `prompts/` at repo root. - Add `transcribe_document.md` as the first curated artifact. - Keep filename stable; this becomes the default in Step 3 unless overridden. ### 2) Author prompt content using a strict, sectioned format Use section headers so future diffs are clean and policy changes are isolated. Suggested sections: 1. **Purpose** - verbatim scholarly transcription of historical documents 2. **Output requirements** - plain text only - no summaries, no paraphrasing - preserve reading order and meaningful structure 3. **Core fidelity rules** - preserve original wording and punctuation - don’t silently normalize grammar/spelling - no invented content 4. **Issue-handling rules (mapped from Intent table)** - misspellings with `[sic]` - missing words with `[word]` - uncertainty with `[guess?]` - illegible with `[illegible]` / reason tags - crossed-out text as `[deleted: ...]` - inserted text as `[inserted: ...]` - superscripts handling guidance - non-text elements as `[description]` - marginalia format `[written in left margin: ...]` - line-break hyphen rejoin behavior - capitalization policy - hierarchical outline preservation (including unusual numbering) 5. **Confidence/ambiguity policy** - prefer explicit uncertainty markers over hallucination 6. **Final self-checklist for model** - did I preserve structure? - did I mark uncertain text? - did I avoid silent corrections? ### 3) Add prompt-library conventions (`prompts/README.md`) Recommended conventions: - one prompt per file - snake_case names - each file starts with purpose + behavior contract - iterative edits, one prompt per PR where possible - no secrets in prompt files ### 4) Add tests for prompt assets (`tests/test_prompts.py`) Keep tests robust but not brittle. Recommended tests: 1. `test_prompt_file_exists` 2. `test_prompt_file_is_not_empty` 3. `test_prompt_mentions_verbatim_behavior` 4. `test_prompt_includes_uncertainty_and_illegible_markers` 5. `test_prompt_includes_deleted_and_inserted_conventions` Avoid exact full-text matching; verify key semantic anchors only. ### 5) Optional config alignment check Current config already has: - `prompt_dir: Path = Path("./prompts")` In Step 2, ensure docs reflect this and that Step 3 will resolve: - `PROMPT_DIR / "transcribe_document.md"` --- ## Task-by-Task Execution Checklist ## Phase A — Scaffold files - [ ] **A1. Create prompt directory** - Path: `prompts/` - Verify: directory exists at repo root - [ ] **A2. Create canonical prompt file** - Path: `prompts/transcribe_document.md` - Verify: file exists and is non-empty - [ ] **A3. (Recommended) Create prompt library README** - Path: `prompts/README.md` - Verify: includes naming + revision conventions --- ## Phase B — Author prompt content (core work) - [ ] **B1. Add Purpose section** - States verbatim historical transcription objective - Explicitly disallows summarization/paraphrase - [ ] **B2. Add Output Contract section** - Plain text output expectation - Preserve meaningful structure and reading order - No fabricated text - [ ] **B3. Add Rule Set from `docs/intent.md`** - Misspellings/errors: `[sic]` - Missing words: `[word]` - Uncertain readings: `[guess?]` - Illegible regions: `[illegible]` / reason labels - Crossed-out text: `[deleted: ...]` - Squeezed-in text: `[inserted: ...]` - Superscripts/abbrev handling guidance - Non-text visuals: bracketed descriptive labels - Marginalia formatting cue - Rejoin line-break hyphenated words silently - Ambiguous capitalization policy - Hierarchical outline numbering preservation - [ ] **B4. Add Ambiguity and Confidence policy** - “Mark uncertainty instead of guessing” - “Never silently normalize uncertain passages” - [ ] **B5. Add Final Self-Check section** - Checklist for fidelity, uncertainty labeling, and format compliance --- ## Phase C — Add validations (tests) - [ ] **C1. Create prompt tests file** - Path: `tests/test_prompts.py` - [ ] **C2. Add existence/health checks** - Prompt file exists - Prompt file has content (non-whitespace) - [ ] **C3. Add semantic anchor checks** - Mentions verbatim behavior - Mentions uncertainty marker pattern (`?` in brackets conceptually) - Mentions illegible handling - Mentions deleted/inserted conventions - [ ] **C4. Keep tests resilient** - Avoid exact full-file snapshot assertions - Assert required concepts, not precise phrasing --- ## Phase D — Documentation alignment - [ ] **D1. Update top-level docs/README reference** - Mention that prompts live in `prompts/` - Mention Step 3 loads from `PROMPT_DIR` - [ ] **D2. Confirm config compatibility** - `src/transcription/config.py` already uses `prompt_dir = Path("./prompts")` - No code change needed unless naming/path mismatch appears --- ## Phase E — Verification - [ ] **E1. Run targeted test file** - `uv run pytest tests/test_prompts.py -q` - [ ] **E2. Run full suite** - `uv run pytest -q` - [ ] **E3. Confirm no regressions** - All existing tests still green (expected: previous 20 + new prompt tests) --- ## Phase F — Commit plan (recommended granularity) - [ ] **F1. Commit 1: scaffold** - `prompts/transcribe_document.md` (initial structure) - `prompts/README.md` (if included) - [ ] **F2. Commit 2: finalized prompt content** - full rule-complete prompt text - [ ] **F3. Commit 3: tests + docs alignment** - `tests/test_prompts.py` - README/docs mention of prompt artifact pattern --- ## Done Criteria (quick gate) - [ ] Canonical prompt exists and is curated for verbatim transcription. - [ ] Prompt encodes all high-value handling rules from `docs/intent.md`. - [ ] Prompt tests pass. - [ ] Full project tests pass with `uv`. - [ ] Ready for Step 3 provider integration. --- ## Acceptance Criteria (Definition of Done) Step 2 is complete when all are true: 1. `prompts/transcribe_document.md` exists and is committed. 2. Prompt includes all critical handling rules from `docs/intent.md`. 3. Prompt is structured with stable section headings for future curation. 4. Prompt tests pass under `uv run pytest -q`. 5. Existing tests remain green (total suite still passes). 6. Docs indicate prompt artifact location and curation policy. --- ## Risks and Mitigations 1. **Risk: prompt too vague → hallucinated reconstructions** - Mitigation: explicit uncertainty/illegible conventions and “no invention” rule. 2. **Risk: prompt too rigid for mixed document types** - Mitigation: include neutral defaults + clear annotation formats. 3. **Risk: brittle tests block iterative prompt tuning** - Mitigation: test semantic anchors, not exact wording. --- ## Handoff to Step 3 After Step 2, Step 3 can immediately: 1. Load `transcribe_document.md` from `PROMPT_DIR` 2. Inject prompt into OpenRouter request 3. Start validating real transcription behavior with minimal glue code