diff options
| author | Christophe Besson <cbesson@gmail.com> | 2026-08-15 00:30:29 +0200 |
|---|---|---|
| committer | Christophe Besson <cbesson@gmail.com> | 2026-08-15 00:30:29 +0200 |
| commit | 4156b5b8c3986278a887d1dce4db265746e9155f (patch) | |
| tree | f98a5198015cbdfbf054549984cccc1a41bf499d /CLAUDE.md | |
| parent | ed2e0640b48148b69eca00ad7dd06789506e12ac (diff) | |
| download | meshbay-4156b5b8c3986278a887d1dce4db265746e9155f.tar.gz | |
docs: account deletion, notifications, and the APIs that no longer exist
Account deletion is the headline, in the user guide and in draft-v5 §6.1,
and the important half is what deletion does *not* do. It releases the
username, clears the email and password hash, drops memberships,
notifications, refresh tokens and node registrations, and refuses any
access token still inside its hour. It does not touch a node: files, the
pinned identity and the keypair bundle stay on machines the hub does not
command, which is the same sovereignty §5.5 relies on — so deleting a hub
account is not an erasure request to the operators hosting you. The IP log
survives too, attributable, for its legal retention period. The claims
table in §2 gets a row saying exactly this, adversary by adversary.
Notifications get a section: one entry per conversation rather than per
message, never one for your own message, invitations that clear when you
join, muting that lives on the hub so it works from any browser.
Then the corrections, which is most of the diff. The guide still described
a node HTTP API — `GET /index`, `GET /file/{id}`, an HLS playlist, and a
`player.js` that does not exist — with curl examples inviting the reader
to expose port 19001. That surface was removed in 0.2.0 as findings C1 and
C6, precisely because it served files outside the handshake that decides
what a peer may see. Sections 6, 7 and the API reference now describe MNP
message pairs, and the quickstart says the same in French. Also corrected:
the JWT table advertised a `pk_user` claim that no longer exists (it was
what let the token issuer decide who could delete a file), `/pubkeys` no
longer returns identity keys, and the GEK-distribution endpoints are gone
entirely rather than merely unused.
draft-v5 §5.2 had uploads landing in `.uploads/{user_id}/`; they land in
`uploads/`, chat attachments included. §6.1 now says the hub learns the
author's user_id from chat_notify — a stable identifier, and a metadata
leak worth naming rather than leaving as "by whom".
CLAUDE.md records why the deployed hub broke this week: create_all()
creates missing tables, never missing columns, so a schema change passes
every test (fresh DB per run) and never reaches production.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Diffstat (limited to 'CLAUDE.md')
| -rw-r--r-- | CLAUDE.md | 7 |
1 files changed, 7 insertions, 0 deletions
@@ -245,6 +245,13 @@ keypair bundle, or anything that looks like a user's public key. the task for good. Symptom is always the same — daemon running, logging nothing, `connected_nodes: 0`, socket in CLOSE-WAIT. Look there first +- **`create_all()` is not a migration.** It creates missing *tables* and never a + missing *column*, so a new column reaches the tests (fresh DB every run) and never + reaches the deployed hub. Symptom: one endpoint answering 500 with an HTML body + while everything else works, and a `psycopg` `UndefinedColumn` in the journal. + `deploy-hub.sh` runs `alembic upgrade head` before restarting the service; a schema + change that skips a migration file will still pass every test you have + **Corrections to remember:** - `punch_nat()` is **not** a NAT traversal stack — one UDP probe, no STUN, no candidate gathering, one ISP validated. **ICE/STUN (WebRTC) is the traversal path**, for native |