Indra on Cloud
Infrastructure notes from a multi-tenant developer platform on Google Cloud.
Featured
The Test Passed. The Agent Never Called the Tool.
Grading an agent on the artifact it produced tells you nothing about how it got there, which is the one thing a tool-use environment exists to measure.
I Wrote the Tool for a Human. An Agent Called It.
An agent has only your response bytes to reason from, which turns error messages into control flow and makes response size a correctness property.
The Device Went Quiet. Quiet Is Not a Reading.
A thousand devices reporting over MQTT taught me that absent telemetry is ambiguous, and that the ambiguity gets worse the moment the device is allowed to move.
Page 1 Was Fast. Page 400 Timed Out.
Offset pagination has to produce every row it discards, and the fix has three parts that only work together: the sort key, the cursor, and the index.
We Deleted Old Readings Every Night. That Was the Expensive Part.
A telemetry table that only grows forces three decisions: how you remove data, how many resolutions you keep, and what happens when a device reconnects and replays six hours of buffer.
The Webhook Must Reply in Seconds. The Useful Work Takes Longer.
Designing a Go alerting service where every operation worth doing is slower than the budget you have to respond in, and the sender retries if you are late.
Recent Posts
The Sweep Could Not Reach the Project. The Silence Was a Finding.
When monitoring client GCP projects, a broken permission that stops a check is as dangerous as a failing metric. Why our observability platform treats an inability to read data as a critical finding.
The Code Rolled Back. The Schema Could Not.
A rollback restores the code and leaves the database where the migration put it. Why "no rollbacks" depends on schema changes the previous release can still run against.
Scope Every Read: Confidential Docs in a Shared Bucket
Per-matter prefixes, short-lived signed URLs, database-checked reads, and redacted logs for confidential documents in multi-tenant GCP apps.
The Reply Arrived Twice. The Record Updated Once.
Inbound replies and webhooks must link to the right record exactly once, and generated drafts must wait for a human. Two mechanisms from production systems: key on the sender id, hold behind a gate.
The Code Changed. The Description Had to Survive It.
Code changes flow back into the knowledge graph the generator reads: changed files only, merge not replace, both artifacts patched. Freshness as write back, not retrieval ranking.
The OAuth Succeeded. The Reports Still Had to Reconcile.
Hardening QuickBooks OAuth server side and structuring Profit and Loss, Balance Sheet and Cash Flow in Postgres so three reports read at different times still agree.
Stripe Holds the Subscription. Your Database Holds a Copy.
Subscription state, idempotent Stripe webhooks and tenant scoped billing tables drawn from multi-tenant platform and ledger work.
The Policy Was Enabled. One Role Still Read Across Tenants.
Auditing Supabase Row Level Security for a multi-role SaaS pilot, testing tenant isolation role by role with the service key outside the test path.