Additive schema plan: scholarly external jobs and snapshots
Operational tables live in the publish_cloud domain (publish_cloud.rs). Migrations should remain additive (new tables/columns/indexes) unless a breaking cutover is explicitly scheduled.
Current artifacts (reference)
| Concern | Table(s) | Notes |
|---|---|---|
| Outbound work queue | external_submission_jobs | Status, lease columns, idempotency key, attempt_count |
| Per-try audit | external_submission_attempts | HTTP status, error_class, retryable, fingerprints |
| Remote truth cache | external_status_snapshots | Adapter + external id keyed snapshots |
| Local receipt | scholarly_submissions | Digest-bound submission rows |
Future additions (when needed)
- Revision mapping — If adapters expose multiple revisions per submission, add
scholarly_revision_map(names indicative) keyed by(publication_id, content_sha3_256, adapter, external_submission_id, revision_id)withcreated_at_ms; keepscholarly_submissionsas the primary “head” receipt. - Dead-letter — Optional
external_submission_jobs_deadorstatus = dead_lettered+dead_lettered_at_mson the job row once replay UX exists. - Idempotency index — Ensure unique index on
(adapter, idempotency_key)remains enforced when adding partial unique variants per environment.
Migration discipline
- Ship DDL in the same PR as store ops + tests (
vox-dbintegration tests undertests/publication_flow_tests.rsor new files). - Document new
error_class/ job status strings inscholarly-digest-approval-invariants.mdorscholarly/error.rsmodule docs.