Initializing Operalta...

Operalta

Product guide / Loops

work that continues between sessions

A matrix row your terminal can pick up.

A Loop is a row in one of your matrices that an agent can advance from the terminal or editor you already work in. It carries the objective, the rules, what happened last time, and when to check back.

Loops. Each row is one architecture decision being ground into the codebase — with the condition that stops it agreed before it started. State and progress are missing on purpose: the runtime writes those, not an agent.
LoopDecisionObjectiveAcceptanceStop criteriaTriggerAutonomyMax iterationsMethodOutputSummary
Collapse connector ingestion onto one railADR-0026 — One ingestion railMove all nine third-party connectors off their private ingest paths onto the shared rail.Zero connectors writing outside the rail; contract tests green for all nine.A rail change needed by one connector breaks another connector twice.weeklypropose12runbooks/ingestion/rail-migration.mdConnector MigrationWalks the nine connectors onto the shared rail one at a time, proposing a migration PR per connector and pausing if a rail change breaks a sibling.
Retire the v1 metrics writerADR-0029 — Single metrics writerRemove every call site of the v1 writer, then delete the module.Module deleted; no import of metricsV1 anywhere in the tree.A call site needs behaviour v2 cannot express — reopen the decision, never work around it.eventapply20runbooks/metrics/retire-v1-writer.mdCall SitesGrinds the v2-only decision through the codebase one batch of call sites at a time, stopping the moment a site needs behaviour v2 lacks.
Replace per-tenant schemas with row-level securityADR-0031 — RLS over schema-per-tenantMigrate all 340 tenant schemas to shared tables carrying RLS policies.One schema; every table carries a policy; isolation tests pass on all 340.P95 query latency regresses more than 15% once policy indexes land.manualpropose15runbooks/db/rls-tenant-migration.mdTenant CutoverMigrates tenants in cohorts behind a latency budget, proposing each cohort and holding until the previous one is clean.
Route dashboard reads to the replicaADR-0034 — Reads leave the primaryPoint every dashboard query at the read replica behind a routing helper.The primary sees zero dashboard reads for seven consecutive days.Replica lag exceeds five seconds under peak load on two separate days.dailyapply10runbooks/db/replica-read-routing.mdQuery SitesMoves query sites onto the routing helper and watches replica lag daily, reverting the batch itself if lag breaches the budget.
Consolidate three job runners into oneADR-0037 — One schedulerMove every scheduled job off Sidekiq and cron onto the platform runner.One runner in production; the other two gone from the deploy manifest.The platform runner drops a job in production even once.weeklypropose12runbooks/platform/runner-consolidation.mdJob InventoryPorts jobs in weekly batches, each with a shadow run against the old runner before the old definition is deleted.
Put every telemetry event in a typed envelopeADR-0041 — Typed event envelopeWrap all emitted events in the shared envelope, then reject untyped ones at the edge.The edge rejects untyped events; 30 days with zero rejections in production.Envelope overhead adds more than 2ms to the emit path.eventapply16runbooks/telemetry/typed-envelope.mdEmittersTypes emitters as they are touched by other work, then flips the edge to reject-by-default once the untyped count reaches zero.
Deprecate the legacy CSV importerADR-0044 — One import pathMigrate the remaining accounts off the legacy importer, then delete it.No account has touched the legacy path for 60 days; module deleted.An account cannot migrate without losing its column mappings.monthlypropose8runbooks/import/legacy-csv-sunset.mdAccount MigrationContacts remaining accounts monthly with a mapping-preserving migration, and escalates any account whose mappings the wizard cannot express.
Move caching from the API layer to the query layerADR-0048 — Cache where the cost isRemove API-level response caching and cache at the query planner instead.API cache removed; hit rate at the query layer above 70%.Hit rate stays under 40% after three tuning passes.weeklypropose10runbooks/perf/query-layer-cache.mdCache SitesBlocked behind the replica cutover; tunes planner cache keys once reads have moved, and abandons the decision if hit rate will not clear 40%.
Collapse five auth paths onto the session serviceADR-0052 — One session serviceRetire the SAML, OIDC, magic-link, API-key, and legacy cookie handlers into one service.All five paths served by the session service; the old handlers deleted.Any enterprise SSO tenant fails to authenticate after a cutover.weeklypropose18runbooks/auth/session-service-cutover.mdAuth PathsCuts one auth path over per cycle behind a flag, with a tenant watch window before the next path is touched.
Route every export through the policy checkADR-0055 — No unchecked exportEnsure no export path can bypass the workspace policy check.Every export call passes the checker; the bypass suite is green.The checker adds more than 200ms to a 10k-row export.eventapply6runbooks/exports/policy-gate.mdExport PathsClosed: all six export paths now call the checker, and a bypass test guards each one against regression.
Loops · Each row is one architecture decision being ground into the codebase — with the condition that stops it agreed before it started. State and progress are missing on purpose: the runtime writes those, not an agent.

Execution & collaboration

What it actually is.

01

A matrix, so loops live where the rest of your structured work already lives.

02

Reachable from the Operalta CLI, or from any agent connected through it.

03

Each pass records what changed, so the next one starts from there.

04

You set what finished looks like, and when to stop, up front.

Loops in the real world

We use it to ship our own architecture work.

Our architecture decisions generate a queue of changes the codebase needs. That queue is a Loops matrix, and agents pick items up from the terminal: prioritize what matters this week, do a bounded piece, record what changed, stop at the checkpoint.

Nothing about it is exotic. It is the matrix system plus the tools you already have open — which is why the loops that matter end up in one place instead of in six people’s heads.

What holds up

What it does well, and what it was never meant to do.

Constraints are a design position, not an apology. Everything on the left ships today; everything on the right we decided against.

What you can rely on in Loops

  • Managed in the Loops matrix and stepped from the loop card.
  • Step a loop yourself, or let a connected agent step it for you.
  • Runs on demand, daily, or weekly.

What we chose not to build

  • A Goal Loop is not an objective or an OKR. "Reduce churn below 1.5%" is a target a team owns; a loop is bounded work an agent can pick up, with a stated end and a stated stop.
  • Only a person ends a loop, in either direction.
  • Progress is written by the loop as it runs, never typed in. State, iteration count, and last delta are not fields you fill.
  • A loop works inside Operalta, not across arbitrary external systems.

Outputs & automation

The loop board as CSV, through its matrix · The loop specification as an Artifact · Each pass’s recorded change, readable from the loop card or a connected agent

None of this is trapped in the interface. The same API and CLI that produce these outputs are how you drive Operalta from your own tools — a script, a terminal, or another product entirely.

Lists APIOperalta CLI

Works with

Where Loops hands the work on.

Decisions rarely stop where a product does. These are the guides that pick the work up next.

For your company

See how Operalta fits your company.

Bring one current decision or process. We will map it together.