Rub‑a‑Dub Duck Sign in

Legal

Security

The isolation model, and an account of what this build actually enforces today.

Not legal advice, and not a substitute for a drafted agreement. These pages describe how the software behaves, so a lawyer drafting the real agreement can check it against what is actually built. Legal review comes before the first external customer.

Tenant isolation

Every row carries a tenant identifier, and row-level security is enabled AND FORCED on every tenant-scoped table. Forced matters: enabling alone exempts the table owner, and the application connects as the owner.

The policy covers writes as well as reads. Read-only isolation is the less dangerous half, without a write check a tenant could insert rows belonging to someone else.

A session that does not declare its tenant sees zero rows and can insert nothing. That is default-deny, and the database is what enforces it, and it is verified by attempting a cross-tenant read as a non-superuser role, not by reading the query and agreeing it looks correct.

Worker isolation

Row-level security protects rows and nothing else, not the filesystem, not scratch space, not temporary files, not process memory. Media parsers handling customer-supplied files are a live remote-code-execution surface.

So the design is one job per worker lifetime, on ephemeral disk, with paths keyed by tenant and job, and no egress beyond the connector and the object store. Job-level purge is a separate ledger-driven operation rather than a side effect of an instance terminating, because otherwise the purge guarantee is unprovable.

What this build does not have

No authentication. No authorisation. No access log. No encryption of data at rest beyond whatever the host filesystem provides. No key service, so the purge attestation is unsigned and says so.

This is a local development surface, and listing what is absent is more useful than describing an intended end state as though it were present.