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