Story-2570 — Deep Read worker deployment and durable pass nudges

🛰️ Why this exists

A four-pass Deep Read cannot safely live inside one synchronous Lambda call: a timeout would erase which passes completed and either strand the document or repeat paid model work. The worker now treats SQS as a doorbell and PostgreSQL as the job ledger, so every invocation advances at most one persisted pass.

✈️ The durable relay

fixture_start_deep_read
        │ reserve job + persist complete pass plan
        ▼
   SQS nudge {firmId, jobId, runId}
        │
        ▼
 claim one ready pass ──► registrar AgentCore panel ──► persist typed effect
        ▲                                                    │
        └──────────── enqueue the same durable pointer ◄─────┘
                                                             │ last judge pass
                                                             ▼
                                              V-CITE + persist envelope

The nudge carries no page text, candidates, or progress state. A redelivery reloads all of that from ops.deep_read_*. An active lease keeps the nudge retryable, so a crashed worker can be reclaimed after lease expiry.

🔬 Boundaries and ownership

SurfaceOwner and reason
Job/run/pass/envelope statepramaan-functions, transactionally persisted before and after egress.
Generative model calls and model catalogRegistrar AgentCore runtime. The Lambda sends mode=deep_read; it contains no OpenRouter client, key, or model selection.
Queue, Lambda shell, IAM, environment, ESMpramaan-spec#2571 / pramaan-infra Terraform under ADR-031 and ADR-162.
Reviewed zip, immutable versions, canary, live/previous aliasesdeploy-deep-read-worker.yml in functions CI.
PackageThe standard src/ plus otel_wrapper.py archive; the workflow imports and checks the Deep Read handler, orchestration, planner, processor, DTO, contracts, and runtime DB resolver before publication.

Canary and red-first proof

The candidate-version canary exercises the changed dependency path without mutating a document: cold-start DB SecureString resolution, registrar runtime SSM resolution, and nudge-queue GetQueueAttributes. The workflow separately simulates the role's SSM, AgentCore invoke, and SQS grants, then verifies the Terraform-owned ESM targets :live with batch size 1 and partial-batch responses. test_deep_read_deploy_workflow.py includes a planted config writer and proves the ownership gate goes red.

🎯 Recall

SQS rings once, PostgreSQL remembers everything, Lambda moves one pass, and only AgentCore thinks.