When gRPC lands: correct the dependency claims in README + ARCHITECTURE §1.4 #118

Closed
opened 2026-08-04 23:22:00 +00:00 by Cordy · 1 comment
Owner

Scheduled documentation debt from the peering decision (#100, IMPLEMENTED-PEERING.md §7). Do not action before #102 merges — until google.golang.org/grpc is actually in go.mod, the current claims are true and editing them would describe software that does not exist.

Trigger: the commit that adds the gRPC dependency (#102, peering control plane).

What becomes false at that moment:

  • README.md — "Small trust surface. Four Go dependencies total: x/crypto (argon2id), go-oidc + x/oauth2 (OIDC), go-ldap (LDAP), filippo.io/age (at-rest encryption) — plus exactly one vendored browser asset…"
  • ARCHITECTURE.md §1.4 — the tiny-trust-surface commitment, which peering is a deliberate exception to.

Proposed wording (Nikola to approve, not to be slipped in silently): the core file server keeps its four Go dependencies and one vendored browser asset; peering — opt-in, off unless configured — adds gRPC and protobuf, for control messages only, with the data plane on stdlib HTTP. §1.4 gains a paragraph recording that this was argued (draft recommended against it, option C chosen deliberately) rather than accreted, and noting the mitigations: four RPCs, generated code committed so customers never run protoc, data plane independent and replaceable.

Why this is an issue and not a comment: the "age is not post-quantum" line sat wrong in ARCHITECTURE.md until #28 forced a re-read. Marketing-adjacent claims decay silently; this one gets a tripwire.

Also fold in at the same time: example.config.json + the deployment handbook page gain the peering block, and the handbook gets its peering page (#109 pipeline).

Scheduled documentation debt from the peering decision (#100, `IMPLEMENTED-PEERING.md` §7). **Do not action before #102 merges** — until `google.golang.org/grpc` is actually in `go.mod`, the current claims are true and editing them would describe software that does not exist. **Trigger:** the commit that adds the gRPC dependency (#102, peering control plane). **What becomes false at that moment:** - `README.md` — "**Small trust surface.** Four Go dependencies total: `x/crypto` (argon2id), `go-oidc` + `x/oauth2` (OIDC), `go-ldap` (LDAP), `filippo.io/age` (at-rest encryption) — plus exactly one vendored browser asset…" - `ARCHITECTURE.md` §1.4 — the tiny-trust-surface commitment, which peering is a deliberate exception to. **Proposed wording (Nikola to approve, not to be slipped in silently):** the *core file server* keeps its four Go dependencies and one vendored browser asset; **peering — opt-in, off unless configured — adds gRPC and protobuf**, for control messages only, with the data plane on stdlib HTTP. §1.4 gains a paragraph recording that this was argued (draft recommended against it, option C chosen deliberately) rather than accreted, and noting the mitigations: four RPCs, generated code committed so customers never run `protoc`, data plane independent and replaceable. **Why this is an issue and not a comment:** the "age is not post-quantum" line sat wrong in ARCHITECTURE.md until #28 forced a re-read. Marketing-adjacent claims decay silently; this one gets a tripwire. Also fold in at the same time: `example.config.json` + the deployment handbook page gain the `peering` block, and the handbook gets its peering page (#109 pipeline).
Cordy closed this issue 2026-08-05 17:37:14 +00:00
Author
Owner

Closed — what changed

Actioned in PR #122, the commit that put google.golang.org/grpc and google.golang.org/protobuf into go.mod.

README.md — the claim was already stale before gRPC arrived: it said "Four Go dependencies total" while ARCHITECTURE.md §1.4 said five, and the list itself contained five. Now reads five for the core file server, and names peering's two additions as the one place the discipline was deliberately broken — opt-in, off unless configured, control messages only, data plane on stdlib HTTP.

ARCHITECTURE.md §1.4 — gained a paragraph recording the exception as argued rather than accreted: why option C was chosen (the control surface is multi-method and must stay evolvable across two independently-operated instances, which is where schema discipline earns its cost), what bounds the blast radius (four RPCs, feature off unless configured, generated code committed so no protoc on customer machines, data plane already independent), and — since the point of the exercise was honesty — that a self-hoster enabling peering genuinely does audit a larger surface.

Also corrected Status: v0.3.xv0.4.x while in there.

What did NOT ship here, and why

The final paragraph of this issue also asked for example.config.json and the handbook deployment page to gain the peering block. That was deliberately left out: at the time, beyond peering.statePath those config fields did not exist. Documenting them would have described software that did not exist — the exact failure mode this issue was created to prevent.

They now do exist (stagingDir, transfersPath, plus the runtime settings peeringEnabled / peeringMaxFileBytes / peeringBaseUrl), and the documentation work is carried on #124, which is trigger-based on #106 so the feature gets described once from fact rather than four times from intent.

## Closed — what changed Actioned in PR #122, the commit that put `google.golang.org/grpc` and `google.golang.org/protobuf` into `go.mod`. **`README.md`** — the claim was already stale *before* gRPC arrived: it said "Four Go dependencies total" while `ARCHITECTURE.md` §1.4 said five, and the list itself contained five. Now reads five for the core file server, and names peering's two additions as the one place the discipline was deliberately broken — opt-in, off unless configured, control messages only, data plane on stdlib HTTP. **`ARCHITECTURE.md` §1.4** — gained a paragraph recording the exception as *argued* rather than accreted: why option C was chosen (the control surface is multi-method and must stay evolvable across two independently-operated instances, which is where schema discipline earns its cost), what bounds the blast radius (four RPCs, feature off unless configured, generated code committed so no `protoc` on customer machines, data plane already independent), and — since the point of the exercise was honesty — that a self-hoster enabling peering genuinely does audit a larger surface. Also corrected `Status: v0.3.x` → `v0.4.x` while in there. ## What did NOT ship here, and why The final paragraph of this issue also asked for `example.config.json` and the handbook deployment page to gain the `peering` block. That was deliberately left out: at the time, beyond `peering.statePath` those config fields **did not exist**. Documenting them would have described software that did not exist — the exact failure mode this issue was created to prevent. They now do exist (`stagingDir`, `transfersPath`, plus the runtime settings `peeringEnabled` / `peeringMaxFileBytes` / `peeringBaseUrl`), and the documentation work is carried on **#124**, which is trigger-based on #106 so the feature gets described once from fact rather than four times from intent.
Sign in to join this conversation.
No labels
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference: Cordy/Cairn#118
No description provided.