generated from john/python-template
264 lines
16 KiB
Markdown
264 lines
16 KiB
Markdown
# Implementation Plan (Version 4.5)
|
|
|
|
## Goal
|
|
|
|
Normalize metadata-directed image orientation for provider input, improve transcription-medium instructions and deterministic quality warnings, and support user-initiated single-Source retranscription with approved alternate models and explicit candidate promotion.
|
|
|
|
## Planning Status
|
|
|
|
- V4.4 is the completed implementation baseline.
|
|
- The V4.5 scope is frozen and sufficiently detailed to begin implementation.
|
|
- Scope additions require an explicit amendment or a later revision.
|
|
|
|
## Planning Constraints
|
|
|
|
- Original uploaded Source files remain immutable.
|
|
- Provider input must remain traceable to the original Source and any normalized derivative.
|
|
- Normalization is limited to recognized orientation metadata; no enhancement pipeline is introduced.
|
|
- Quality warnings never mutate transcription text or trigger paid requests automatically.
|
|
- Retranscription creates new immutable Job and execution evidence.
|
|
- A retranscription result remains a candidate until explicitly promoted.
|
|
- Human revision remains separate from and takes precedence over machine selection.
|
|
- Provider work occurs outside database transactions.
|
|
- Database, integration, and UI tests use confirmed isolated data and never modify `data/transcription.db`.
|
|
- Potentially destructive tests run only through `tools/run_destructive_tests.py`.
|
|
|
|
## Expected Project Impact
|
|
|
|
| Area | Expected impact |
|
|
| --- | --- |
|
|
| Configuration | Add a validated provider-model allowlist while retaining one default model. |
|
|
| Image processing | Add metadata-directed orientation normalization and model-input artifact creation. |
|
|
| Evidence model | Link each request to the exact model-input artifact and record preferred machine-attempt provenance. |
|
|
| Prompt contract | Add explicit body-medium classification and structured-layout rules. |
|
|
| Quality service | Add deterministic, non-mutating warnings for known output defects. |
|
|
| Job creation | Support a Source-locked retranscription Job and approved model selection. |
|
|
| Worker workflows | Preserve candidates without automatically replacing preferred machine text. |
|
|
| Source Detail | Add Retranscribe Source, candidate summaries, comparison, promotion, and normalization indicators. |
|
|
| Tests and documentation | Add isolated normalization, configuration, warning, retranscription, promotion, and UI coverage. |
|
|
|
|
## Implementation Phases
|
|
|
|
### 1. Align Configuration Contracts
|
|
|
|
- Add `provider_models` as an immutable validated collection in Settings.
|
|
- Parse `PROVIDER_MODELS` using the standard Pydantic-settings JSON representation.
|
|
- Preserve `PROVIDER_MODEL` as the default.
|
|
- If the allowlist is omitted, derive a one-entry list from the default.
|
|
- Normalize whitespace, reject empty values, and deduplicate while preserving the relative order of non-default values.
|
|
- Ensure the default appears exactly once and first in the effective selector order.
|
|
- Validate a submitted model against the allowlist in the service or workflow boundary, not only in the UI.
|
|
- Document `.env.example` behavior without adding real credentials.
|
|
- Add configuration tests for omitted, valid, duplicate, malformed, and empty model lists.
|
|
|
|
### 2. Define Orientation-Normalized Artifacts
|
|
|
|
- Reuse `ProcessingArtifact` for the model-input derivative and transformation metadata.
|
|
- Define a versioned orientation-normalization artifact schema containing:
|
|
- Original Source identity and digest.
|
|
- Original orientation value.
|
|
- Applied rotation.
|
|
- Original and derivative dimensions, media types, byte sizes, and digests.
|
|
- Processor name and version.
|
|
- Add one domain-owned orientation-normalization service or adapter; keep image-library details out of UI and provider modules.
|
|
- Apply recognized metadata orientation physically to raster pixels.
|
|
- Reset or remove orientation metadata on the derivative.
|
|
- Store derivatives under application-managed artifact storage with safe relative references.
|
|
- Avoid creating a derivative when no supported transformation is required.
|
|
- Return a typed provider-input reference that identifies whether the request uses the original or a derivative.
|
|
- Never mutate or delete the original Source as part of normalization.
|
|
|
|
### 3. Integrate Normalization with Provider Input
|
|
|
|
- Resolve the exact model input before constructing the request manifest.
|
|
- Use the normalized derivative when orientation metadata requires it; otherwise use the original Source.
|
|
- Extend the existing `SourceEvidenceReference` or associated artifact reference so the manifest identifies:
|
|
- Original Source.
|
|
- Derivative artifact when present.
|
|
- Transformation schema and digest.
|
|
- Ensure normalization completes and persists before provider network work begins.
|
|
- Bind the immutable model-input artifact reference to the exact ExecutionAttempt that consumed it before terminal attempt persistence completes.
|
|
- If normalized bytes are reused, retain attempt-specific association while preserving one content identity and digest.
|
|
- If normalization fails, do not send a provider request.
|
|
- Preserve safe failure evidence and an actionable error category.
|
|
- Confirm provider payload loading and evidence hashing read the same resolved bytes.
|
|
|
|
### 4. Revise the Transcription Prompt
|
|
|
|
- Align the prompt with the durable medium rules in `docs/invariant/transcription_methodology.md`.
|
|
- Add the four frozen document-body markers.
|
|
- Define operational differences among handwritten, typewritten, typeset, and mixed content.
|
|
- State that mechanical typewriter variation is not handwriting.
|
|
- Require exactly one body marker.
|
|
- Prohibit repeated whole-line handwriting wrappers after a whole-body handwritten marker.
|
|
- Permit localized handwriting markers only for actual annotations, signatures, or mixed-body portions.
|
|
- Add layout instructions for tables of contents, tables, forms, columns, captions, marginalia, page numbers, dotted leaders, and associated references.
|
|
- Require plain-text characters rather than HTML entities.
|
|
- Retain verbatim, uncertainty, damage, deletion, insertion, and line-break-hyphenation rules.
|
|
- Update prompt fixtures and prompt-hash expectations without rewriting historical Job prompt evidence.
|
|
|
|
### 5. Add Deterministic Quality Analysis
|
|
|
|
- Introduce a small typed warning model with stable warning codes and human-readable detail.
|
|
- Analyze successful output without modifying it.
|
|
- Implement warnings for:
|
|
- Unicode replacement characters.
|
|
- Multiple document-body markers.
|
|
- Whole-body handwritten plus repeated line-level handwriting wrappers.
|
|
- Likely unresolved HTML entities.
|
|
- Keep warning rules deterministic and provider-independent.
|
|
- Persist warnings once as an immutable, versioned `ProcessingArtifact` tied to the successful ExecutionAttempt.
|
|
- Source Detail renders stored warnings and never recomputes historical attempts under newer warning rules.
|
|
- Make warning analysis idempotent and versioned so newer rules apply only to newly analyzed attempts unless a separate future reanalysis workflow is introduced.
|
|
- Do not implement confidence scoring or automatic retries.
|
|
|
|
### 6. Model Retranscription and Selection State
|
|
|
|
- Add a durable Job purpose or equivalent discriminator for normal transcription versus Source retranscription.
|
|
- Ensure a retranscription Job contains exactly one JobSource for the locked Source.
|
|
- Add durable preferred-machine-attempt provenance for each Source.
|
|
- Retain `Source.raw_transcription` as the preferred-machine-text projection for compatibility.
|
|
- Define legacy behavior for Sources whose current projection predates ExecutionAttempt provenance.
|
|
- On the first successful result with no preferred machine output, select the successful attempt automatically regardless of Job purpose.
|
|
- Once preferred provenance exists, preserve every later successful result as an unselected candidate regardless of Job purpose.
|
|
- Prevent normal and retranscription workflows from writing `Source.raw_transcription` directly when preferred provenance already exists.
|
|
- Add a promotion command that:
|
|
- Loads the Source and successful ExecutionAttempt.
|
|
- Verifies ownership and successful text.
|
|
- Updates preferred-attempt provenance and `Source.raw_transcription` in one transaction.
|
|
- Leaves `Source.revised_text` and all attempts unchanged.
|
|
- Reject failed, unrelated, missing, or textless candidates deterministically.
|
|
|
|
### 7. Add the Retranscribe Source Workflow
|
|
|
|
- Add a Source Detail **Retranscribe Source** action.
|
|
- Navigate to Create Processing Job with an explicit `source_id` query parameter.
|
|
- Load the Source and derive its Document server-side.
|
|
- Render Source identity and filename as locked context.
|
|
- Render Provider from Settings as read-only.
|
|
- Render Model as a selector using the effective allowlist and default.
|
|
- Reuse the frozen default prompt unless a later scope addition explicitly allows prompt selection.
|
|
- Create a new queued retranscription Job and one pending JobSource atomically.
|
|
- Notify the worker only after the transaction commits.
|
|
- Preserve current preferred machine text and human revision throughout queueing, processing, success, and failure.
|
|
- Return to the new Job Detail after successful creation.
|
|
|
|
### 8. Adapt Worker Success Semantics
|
|
|
|
- Select the first successful result automatically for Sources without preferred machine output, including a successful retranscription after earlier failures.
|
|
- For every later success, persist JobSource and ExecutionAttempt text without replacing the Source projection, regardless of normal or retranscription Job purpose.
|
|
- Run deterministic quality analysis after successful normalization of provider output.
|
|
- Persist candidate warnings with the attempt.
|
|
- Keep all terminal Job status and execution evidence updates atomic according to the existing workflow boundary.
|
|
- Ensure a failed retranscription cannot clear or change preferred machine text.
|
|
|
|
### 9. Build Candidate Review and Promotion UI
|
|
|
|
- Extend Source Detail with concise machine-output sections:
|
|
- Preferred machine transcription.
|
|
- Human revision.
|
|
- Candidate machine transcriptions.
|
|
- List candidates with creation date, provider, model, Job ID, status, and warning indicator.
|
|
- Default to a compact candidate list; do not render every full transcript simultaneously.
|
|
- When no successful machine result exists, render an explicit empty state without comparison controls.
|
|
- When preferred output exists without candidates, render an explicit no-candidates state.
|
|
- Allow one candidate to be opened for comparison with the preferred machine transcription.
|
|
- Label both sides with provider, model, Job ID, and date.
|
|
- Add **Use this transcription** only for a successful unselected candidate.
|
|
- Require explicit confirmation before promotion.
|
|
- After promotion, refresh Source Detail and retain the former preferred result in attempt history.
|
|
- If a human revision exists, explain that promotion changes machine selection but not the human-preferred displayed/printed text.
|
|
- When orientation normalization occurred, show a compact indicator and link to transformation evidence; do not require routine side-by-side image display.
|
|
|
|
### 10. Align API and Service Contracts
|
|
|
|
- Keep arbitrary provider and model identifiers out of public write contracts.
|
|
- If an API is added for retranscription, accept Source UUID and one configured model identifier and validate both server-side.
|
|
- If an API is added for promotion, accept Source UUID and ExecutionAttempt UUID and validate their relationship.
|
|
- Return stable validation, conflict, not-found, provider, and persistence errors through the existing taxonomy.
|
|
- Keep filesystem paths, raw credentials, and unrestricted artifact references out of responses.
|
|
|
|
### 11. Verification
|
|
|
|
- Add pure unit tests for:
|
|
- Orientation metadata interpretation.
|
|
- No-op versus transformed input selection.
|
|
- Derivative metadata and hashing.
|
|
- Model allowlist normalization.
|
|
- Prompt marker rules.
|
|
- Every quality-warning code.
|
|
- Add isolated service and workflow tests for:
|
|
- Original Source immutability.
|
|
- Normalization failure before provider invocation.
|
|
- Request manifests referencing exact provider-input bytes.
|
|
- Single-Source retranscription Job creation.
|
|
- Candidate preservation.
|
|
- Initial automatic selection.
|
|
- Explicit candidate promotion.
|
|
- Atomic rollback on invalid promotion.
|
|
- Human revision preservation.
|
|
- Add UI tests for:
|
|
- Retranscribe Source navigation.
|
|
- Locked Source and Document context.
|
|
- Read-only Provider and allowlisted Model selector.
|
|
- Candidate list, warnings, comparison, confirmation, and promotion.
|
|
- Normalization indicator without mandatory image comparison.
|
|
- Use fixed image fixtures with known EXIF orientation and hashes.
|
|
- Use fake providers only; no focused or regression test sends an external provider request.
|
|
- Confirm all database, integration, and UI targets use isolated databases.
|
|
- Run potentially destructive schema tests only through `tools/run_destructive_tests.py`.
|
|
- Run the broader non-external regression suite after focused coverage passes.
|
|
- Verify that `data/transcription.db` and curated Source files were not changed by test execution.
|
|
|
|
### 12. Align Authoritative Documentation
|
|
|
|
- Update V4 architecture, requirements, and schema for:
|
|
- Original versus model-input artifacts.
|
|
- Preferred machine-attempt provenance.
|
|
- Retranscription Job purpose.
|
|
- Candidate and promotion semantics.
|
|
- Quality-warning evidence.
|
|
- Update Source and Job UI contracts after implementation behavior is accepted.
|
|
- Update the transcription methodology and evidence invariant only where V4.5 establishes a durable cross-version rule.
|
|
- Keep historical prompt and execution evidence immutable.
|
|
|
|
## Delivery Order
|
|
|
|
1. Configuration and model allowlist.
|
|
2. Orientation artifact schema and normalization adapter.
|
|
3. Provider-input and evidence integration.
|
|
4. Prompt revision and deterministic warning analysis.
|
|
5. Retranscription and preferred-attempt persistence.
|
|
6. Worker candidate semantics.
|
|
7. Retranscription creation UI.
|
|
8. Candidate comparison and promotion UI.
|
|
9. Authoritative documentation and regression verification.
|
|
|
|
## Done Criteria
|
|
|
|
- All frozen V4.5 acceptance criteria are implemented and testable.
|
|
- EXIF-oriented images are physically upright for provider processing while originals remain byte-for-byte unchanged.
|
|
- Every provider request identifies its exact original and normalized inputs.
|
|
- The prompt classifies body medium consistently and avoids redundant handwriting wrappers.
|
|
- Quality defects produce deterministic warnings without silent rewriting or automatic cost.
|
|
- Source Detail can create one-Source retranscription Jobs using configured alternate models.
|
|
- Retranscription results remain candidates until explicitly promoted.
|
|
- Promotion updates exact preferred-attempt provenance and the compatibility projection atomically.
|
|
- Human revisions remain unchanged and retain display/print precedence.
|
|
- Previous Jobs and attempts remain immutable and inspectable.
|
|
- No manual image editor, visual orientation inference, confidence percentage, automatic retry, or arbitrary model entry is introduced.
|
|
- Verification uses isolated data, fake providers, and does not modify `data/transcription.db` or curated Source files.
|
|
|
|
## Related Local References
|
|
|
|
- [V4.5 Scope Boundary](scope_boundary_v4_5.md)
|
|
- [V4.4 Scope Boundary](../ver4.4/scope_boundary_v4_4.md)
|
|
- [V4.4 Implementation Plan](../ver4.4/implementation_plan_v4_4.md)
|
|
- [V4.2 Evidence and Provenance Scope](../ver4.2/scope_boundary_v4_2.md)
|
|
- [V4 Architecture](../ver4/architecture_v4.md)
|
|
- [V4 Schema](../ver4/schema_v4.md)
|
|
- [V4 Requirements](../ver4/requirements_v4.md)
|
|
- [V4 Error Handling Policy](../ver4/error_handling_v4.md)
|
|
- [Transcription Methodology](../invariant/transcription_methodology.md)
|
|
- [AI Evidence and Provenance Invariant](../invariant/ai_evidence_and_provenance.md)
|