Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
16 commits
Select commit Hold shift + click to select a range
81e8df1
docs(server): design gateway_credentials at-rest encryption + server_…
rigel-mintaka Sep 3, 2026
6a36816
docs(server): address review findings on the encryption addendum (RIG…
rigel-mintaka Sep 4, 2026
f3e8933
docs(server): fix round-2 review findings on the encryption addendum …
rigel-mintaka Sep 4, 2026
096303c
docs(server): fix round-3 review findings on the encryption addendum …
rigel-mintaka Sep 4, 2026
34ccd0d
docs(server): fix round-4 review findings on the encryption addendum …
rigel-mintaka Sep 4, 2026
899aabc
docs(server): fix round-5 review findings on the encryption addendum …
rigel-mintaka Sep 4, 2026
7c2dabb
docs(server): fix round-6 review findings on the encryption addendum …
rigel-mintaka Sep 4, 2026
cb12e1f
docs(server): fix round-7 review findings on the encryption addendum …
rigel-mintaka Sep 4, 2026
1b7528d
docs(server): fix round-8 review findings on the encryption addendum …
rigel-mintaka Sep 5, 2026
b12a781
docs(design): fold #859 R9 review — proto-delta honesty + F1 Tasks me…
rigel-mintaka Sep 5, 2026
7fbc2e2
docs(design): fold #859 R10 review — schedule T0's own doc-comment re…
rigel-mintaka Sep 5, 2026
7462331
docs(design): fold #859 R11 review — fix reconcile/store-door deadloc…
rigel-mintaka Sep 5, 2026
ce49b47
docs(design): fold #859 R12 review — name the WithTx seam the atomic …
rigel-mintaka Sep 5, 2026
456934d
docs(design): fold #859 R13 review — name the WithTx seam at the two …
rigel-mintaka Sep 5, 2026
ef6130d
docs(design): fold #859 R14 review — extend the F1 membership guard t…
rigel-mintaka Sep 5, 2026
cca8771
docs(design): fold #859 R15 review — narrow the reconcile guard claus…
rigel-mintaka Sep 5, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions docs/designs/DECISIONS.md
Original file line number Diff line number Diff line change
Expand Up @@ -112,6 +112,8 @@ check enforces the mechanical half. Full rationale:
| DL-314 | Postgres remains the store of record and the sole durability source of truth for committed comms/routing/session-binding state (restating DL-019's surviving "Postgres is the store of record" clause verbatim): JetStream is an at-least-once delivery TRANSPORT whose consumer state is disposable, never a second truth store; every fabric recovery path terminates in a Postgres cursor or row. Supersedes DL-019's "JetStream is comms-only" clause only — its store-of-record and transcript-blob-seam clauses (DL-093) survive (RIG-2861 OQ-1) | Active (Matt, 2026-08-31) | [multi-tenancy & NATS substrate](infra/runtime/compass-managed-multitenancy/design.md#q3--the-eventing-substrate-one-nats-eventfabric-a-standalone-stack-service-jetstream-as-the-delivery-transport) |
| DL-315 | The cross-tenant background/system loops (delivery-cursor sweep, deliver-ack advance, reattach recovery, lag-resync) run under a narrowly-scoped `BYPASSRLS` system role granted ONLY to those named background workers and NEVER on the request path; every request-path query stays fail-closed under RLS (RIG-2861 OQ-4 = option 1) | Active (Matt, 2026-08-31) | [multi-tenancy & NATS substrate](infra/runtime/compass-managed-multitenancy/design.md#resolved-decisions-freeze--matt-2026-08-31) |
| DL-317 | Under multi-tenancy, user/system handle uniqueness is PER-ORGANIZATION not global (RIG-2921 = option A): `account_handles` gains a `tenant_id` and its partial-unique indexes become org-scoped, and the handle resolvers gain a tenant filter — two organizations may each hold `@matt`. The sole globally-unique identifier is the organization NAME, CASE-FOLDED for that uniqueness check (normalized index form, display casing preserved) — `Acme` and `acme` are the same organization (GitHub model). Refines DL-271's "user/system handles globally unique" clause to per-organization under multi-tenancy (single-tenant OSS stays degenerate: one org, so per-org == global); implemented on the RIG-2880 `account_handles` storage contract | Active (Matt, 2026-08-31) | [multi-tenancy & NATS substrate](infra/runtime/compass-managed-multitenancy/design.md#resolved-decisions-freeze--matt-2026-08-31) |
| DL-325 | The `gateway_credentials` value payload is encrypted at rest application-side (AES-256-GCM envelope; `value_ciphertext`+`value_nonce`+`key_version` columns, no plaintext column ever; AAD binds the stable row identity so ciphertexts are not row-portable), covering api_key and OAuth rows on ONE seal/open path (D7). A 256-bit master key is auto-provisioned zero-human-step into the ONE configured SecretSpec provider under a Postgres advisory lock with every-boot read-back verify (+ a key-fingerprint tripwire). The master key and the existing server secrets (primary + reviewer App PEM, webhook, and the three Linear secrets) live in a NEW physically separate `server_secrets` store (mechanism C1: names-only table, bucket-A infrastructure — no `tenant_id`, RLS off, its own GRANT to `compass_app`/`compass_system`; no delivery/kind columns; a SECOND `SpecResolver` instance over it on the shared profile; an admin-gated `SetServerSecret`/`DeleteServerSecret` RPC) so server secrets are STRUCTURALLY undeliverable to agent containers — the container resolver's manifest never contains their names. C1 splits the DECLARATION registries, not the shared provider keyspace, so TWO guards are MANDATORY on BOTH the admin RPC AND the `authenticatedOpen` user `SetSecret`/`DeleteSecret` path: the reserved-name guard on `GATEWAY_CREDENTIALS_*`, and — because the other six names are arbitrary per-deployment config with no reserved prefix — a SYMMETRIC F1 membership guard rejecting any name present in the other table (in both declaration orders). The table split alone is necessary but not sufficient for the structural claim. No proto ENUM change and no FetchSecrets filter — the admin RPC adds two additive SecretsService methods (supersedes the earlier SERVER_ONLY-delivery-kind fold). The server-secret rows move into `server_secrets` via a boot-time config-driven reconcile (the names are per-deployment config, not migration constants; DB-row move, no provider re-provision), closing the pre-existing inject-all exposure. Managed-plane KMS is a provider-URI deployment config, not a code fork; rotation is deferred (single live key, `key_version` landed at v1, bounded key-loss blast radius — credentials are re-obtainable); per-tenant at-rest isolation + gateway-topology exposure is a tracked follow-up | Active (Matt, 2026-09-02) | [gateway-credentials at-rest encryption](server/compass-gateway-credentials-at-rest-encryption.md#d1--application-layer-aes-256-gcm-envelope-encryption) |
| DL-326 | The DL-315 `BYPASSRLS` system-role allow-list is EXTENDED to admit the boot server-secret reconcile — a cross-tenant, request-path-free boot step that moves the configured server-secret rows from `secrets` (FORCE RLS, tenant-scoped) into `server_secrets`, run under `store.WithSystemRole`; the entrypoint enumeration is restated against the SHIPPED set, which already includes the forge-notification-ack arm (`go/internal/runnerhub/hub.go`, `forgeNotificationAck`, currently :814) that DL-315's four names omit — though `WithSystemRole`'s own doc comment already names it (tenant_tx.go:41-47), so the staleness is in DL-315's ledger prose, not the code's documentation. DL-315's load-bearing NEVER-on-the-request-path clause is unchanged — every request-path query stays fail-closed under RLS. Refines DL-315 (which stays Active) | Active (Matt, 2026-09-04) | [gateway-credentials at-rest encryption](server/compass-gateway-credentials-at-rest-encryption.md#t0--the-server_secrets-store-table-resolver-split-admin-rpc-prerequisite) |

> Note (2026-07-31, RIG-1570 R5): DL-065's retired internal `ResumeContext
> resume = 12` envelope field is NOT silently reintroduced — the collapsed
Expand Down
Loading
Loading