One deployment and health boundary carries many unrelated reasons to change.
Sutra scales down to zero. The useful boundaries survive.
Move product orchestration back into NestJS and internal extraction. Keep small provider-facing services only where containing a credential or trust boundary earns its existence.
Remove the middle. Keep the locks.
Each remote boundary exists for one provider credential, not to own product behavior.
A small lockbox, not another brain.
A capsule can sign a request, constrain capability and record provider-level telemetry. The application still decides what happens and why.
One trust boundary
One provider or tightly related credential set. Narrow scopes and rotation stay outside application containers.
Typed, narrow operations
Explicit OCR, transcription or artifact operations—not arbitrary upstream URLs and not generic prompt execution.
Stateless by default
No product workflow, conversation ownership, queue backlog or business persistence.
Failure stays local
The application is not globally “unready” because an optional provider capability cannot answer.
No local Cloudflare.
Running Guru locally should mean running the frontend, NestJS and the internal Python services. Hosted capsules provide credentialed capabilities; deterministic fixtures cover provider-free tests.
R2 stays. AWS extraction leaves.
Storage and extraction are separate decisions. R2 remains the canonical artifact store. Textract remains only while its credential capsule provides practical value.
R2 artifact storage
Sources, evidence and results live in the preferred store through a narrow native-binding capsule.
Mistral OCR + internal extraction
Complete the post–Beta 2 migration to provider OCR and deterministic product-owned extraction.
Textract + AWS storage paths
Remove the bridge when the migration completes. Until then it remains a credential container, not a product service.
Compact in hours, not weeks.
Git history is the rollback. Preserve outcome contracts, cut the path, verify the live behavior, then delete the obsolete machinery.
- 1Pin the outcomes
Keep backend contract and integration coverage for ChatMo, voice, documents and retained evidence.
- 2Move orchestration home
NestJS and internal Python call the narrow provider and R2 capsules directly.
- 3Cut and verify
Deploy to a review room; run regression journeys, provider smokes and artifact checks.
- 4Scale Sutra to zero
Remove readiness coupling, routes, queues, workflows, containers, configuration and local runtime.