Repository navigation
Conversation
ADR 0008, status proposed, records Fredrik's decisions of 12 October 2026: a readable, read-only copy of what a home's owner turns on, served to the iPhone app, its widgets and APNs from ftwcloudd in srcfl/ftw-cloud on AWS eu-north-1. The box signs every message; the service never controls and never chooses actions; the relay, escrow and lane 0 do not change. It states the statistics rules now, because consent comes at first use, orders the work core first (uplink, cache, first screen), and records the turn away from #1323 and ADR 0006's single remote path. docs/protocol-cloud.md is the normative wire format: unpadded lane 1 frames, one signing rule, a handshake bound to the TLS session, a field table per class and scope, cadence, the closed set the service may send the box, roster, extension token, push, freshness with eight vectors described in text, and the new registry names. VISION.md and AGENTS.md gain the matching paragraph and invariants; architecture.md and ADR 0006 point to the ADR. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
An independent review found ways stale data could still show as live. - hb now names the newest live and lp it covers (liveSeq, lpSeq) and carries each source's reading age, so the phone grades a reading by the box's own ladder instead of keeping it live for another S. - The box sends no hb while a changed live or lp waits, nor past the byte budget, so an hb never vouches for values the box has not sent. - The phone keys its table by boot, tracks seq per class, takes the earlier of wallMs and arrival under rule N, adds a drift margin and a 24 h lifetime under rule U, and shows old alerts without buttons. - hello now carries the box's TLS exporter value too, so a proxy that ends TLS cannot hold a socket for the home; the label starts with EXPERIMENTAL as RFC 5705 asks. - Restores, roster expiry, purge receipts, tiles for phones, Live Activity tokens and what Apple sees are now stated; timers agree between the ADR and the protocol. Eight new vectors cover the cases. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This was referenced Oct 12, 2026
Member
Author
|
Included in #1604 (ADR 0008 with what C2 and C3 built), squash-merged to master. |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
What this adds
Documents only. Nothing here has shipped, and no code, CI or contract file changes.
docs/adr/0008-ftw-cloud.md, status proposed, about 2,500 words. FTW Cloud keeps a signed, readable copy of what a home's owner turns on, serves it to the iPhone app, its widgets and APNs, and never controls. It records Fredrik's decisions of 12 October 2026 with their reasons, what FTW Cloud is not, the control boundary, access, the statistics rules, security and retention, cost, the turn away from Local-only operation is the full product: no feature may require the relay or Sourceful services #1323, what changes from ADR 0006, milestones, alternatives and risks. Wire detail lives in the protocol.docs/protocol-cloud.md, normative: connections, unpadded lane 1 frames, the envelope and signing rule, the handshake bound to the TLS session, every message class with a field table per scope,hb, cadence and backpressure, the closed set the service may send the box, the roster, the app session, the extension token, push payloads, freshness with eight test vectors in text, the grant and its routes, revocation, and the new registry names. The byte vectors come with the code. The Go types live ingo/protocol(refactor(protocol): move the wire format into its own Apache-2.0 module #1588).VISION.md: one paragraph after the "authorized cloud agent" paragraph. It says FTW Cloud is proposed, that the iPhone app is the way into it and may become paid, that it never sends control or chooses actions, and that this turns away from the aim that no feature should need a Sourceful service.AGENTS.md: two invariants. "FTW Cloud may hold a readable copy of what the owner enabled. It never sends control and never chooses actions." And the lane 0 rule, with the line that the FTW Cloud uplink is unpadded and so uses lane 1, never lane 0.docs/architecture.md: a short pointer in Remote access boundary.docs/adr/0006-app-uplink.md: a "Revisited by" line.Docs only, so no changeset (the
.mdanddocs/allowlist).Decisions recorded
Fredrik decided 1–5 and 7 on 12 October 2026. The ADR writes them as decided.
ftwclouddin a publicsrcfl/ftw-cloudunder AGPL-3.0-only. The wire format ingo/protocolhere, under Apache-2.0 (refactor(protocol): move the wire format into its own Apache-2.0 module #1588).Milestones: the core first
Following Fredrik's "the core first, with a clear plan for what comes after", the ADR orders the work so the core shows first: C2 uplink (grant, key, signed
live,lp,prices,hb, roster), C3 cache (ftwclouddwith the memory cache and app session), C4 first screen (the app's socket, carriercloud, freshness, relay fallback, the start flow). Alerts, widgets, Live Activity and statistics follow as C5–C8. The statistics switch ships with the start flow in C4, so the box records consent from day one; nothing is sent until C8, and the backfill covers the gap.Where this departs from design revision 2
srcfl/ftw-cloud(decision 1). The import ban on the service side becomes a property of the module boundary.helloandhello_okeach carry the sender's TLS exporter value, so no proxy may end TLS in front offtwcloudd(a plain TCP load balancer is fine). Worth a look before C2.ftw.cloud.v1\0followed by CBOR[home, t, b].helloandrosteruse it too, instead of separate domain tags.purgedjoins the closed set the service may send the box, as the signed purge receipt. Keep-alive is a WebSocket ping, not a message.liveandhb. Anhbnames theliveandlpit covers and carries each source's reading age, so the phone grades a reading by the box's own ladder. Revision 2 let a reading up to twicestaleAfterMsold show as live.statsIdlives as long as the consent, with no rotation. Rows are kept 13 months from the hour they describe, so the backfill reaches back at most that far; revision 2 asked for a 730-day backfill under a 13-month retention. The cell rule is one number, 20 homes; revision 2 also named 10 as a floor without saying when it applied.Review in this session
A separate agent reviewed the first version. It found real holes in the freshness rules, where stale data could still show as live: an
hbthat vouched for a droppedlive, a reboot that kept the old table, clock rules that let data look fresher, oneseqcounter that broke snapshots, and timers that disagreed. The second commit closes them and adds eight vectors (16 in all). It also bindshelloto TLS, states what Apple sees, handles restores and purge receipts, and fixes the lane 1 wording ("without the bulk buckets", since the app protocol pads lane 1 too).Not in this PR
contract/registry.yamlandcontract/push-catalogue.yaml. The protocol lists the new names (ftw.events.read,cloud_scopes,cloud_purposes,cloud.link, carriercloud,cloud.granted,cloud.revoked). A later paired PR adds them in ftw-webapp first.go/protocolextraction: refactor(protocol): move the wire format into its own Apache-2.0 module #1588 (open).AGENTS.md, which is not in a repository.Paired PR
srcfl/ftw-webapp#79 narrows the "Sourceful cannot read your data" claims in ftw-webapp to the relay and escrow, and adds a test that holds them there. Its links point at this ADR on
master, so merge this one first or both together.Open PRs on the same files
VISION.mdparagraph at the same place. Whichever merges second resolves a small text conflict.AGENTS.md. No overlap.Proposed comment for #1323
Not posted. For Fredrik to post, edit or drop:
How to review
Read the rendered Markdown. The protocol's class tables are meant to become the allowlist that a test in C2 checks field by field.
🤖 Generated with Claude Code