Skip to content

Commit 49bfa52

Browse files
ChrisPelatariclaude
andcommitted
docs(54): live-probed Fizzy API notes — tag/assignment toggle semantics, listing rules
Key findings: per-column lists exclude untriaged AND closed cards; tag_ids on PUT is rejected (400) so tag push must diff-toggle via POST /taggings; assignments toggle symmetrically; relative .json Location headers; per-column ETags confirmed. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
1 parent f20344c commit 49bfa52

1 file changed

Lines changed: 52 additions & 0 deletions

File tree

docs/fizzy-api-notes.md

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
# Fizzy API — live-probed answers (2026-06-12, fizzy.bluefenix.net, account `1`)
2+
3+
Empirical answers from the mission #28 probe session (sacrificial `[itest]`
4+
cards on the Sandbox board; Playground untouched). These supersede guesses in
5+
older specs.
6+
7+
## Card listing & lifecycle
8+
9+
- `GET /boards/:id/columns/:col/cards` lists **only cards triaged into that
10+
column**. Untriaged (triage-inbox) cards appear in NO column list — they are
11+
only visible via the board-wide `GET /cards?board_ids[]=`. Closed/not-now
12+
cards are also excluded from column lists. ⇒ absence from column lists never
13+
proves deletion (engine confirms via `GET /cards/:n`; 404 = gone).
14+
- The board-wide list shape carries `status` (publish state) + `closed` +
15+
`postponed` but **no `column`** — per-column endpoints are the only list
16+
source of column placement.
17+
- New cards born via `POST /boards/:id/cards` start **untriaged**; triage with
18+
`POST /cards/:n/triage` `{"column_id": …}`.
19+
20+
## Tags
21+
22+
- `POST /cards/:n/taggings` body `{"tag_title": "…"}`**204; toggles** the
23+
tag on/off. Unknown tags are auto-created account-wide; leading `#` stripped.
24+
- `PUT /cards/:n` with `card.tag_ids`**400** on this server build. ⇒ tag
25+
push must be implemented as **exact toggle diffing** (local minus remote →
26+
toggle on; remote minus local → toggle off). Toggles are not idempotent —
27+
diff must be computed against fresh remote state.
28+
29+
## Assignments
30+
31+
- `POST /cards/:n/assignments` body `{"assignee_id": "<user id>"}` → 204;
32+
**toggles** assignment, symmetric with taggings.
33+
- `GET /:account/users` is the directory (sole user on this instance:
34+
Chris Pelatari).
35+
36+
## HTTP details
37+
38+
- `Location` headers on 201 come **relative with a `.json` suffix**
39+
(`/1/cards/262.json`); the client's `URL(string:relativeTo:)` handling
40+
covers it.
41+
- Per-column card lists carry **per-column ETags** (observed on every column;
42+
single-page lists on this board). Multi-page ETag grain remains unverified —
43+
the engine's single-page-only conditional rule stays.
44+
- `Retry-After` format unprobed (no polite way to force a 429 on a live
45+
instance); the client accepts numeric seconds and caps at 30.
46+
47+
## Account/identity quirks
48+
49+
- `/my/identity` slugs carry a leading `/` (`"/1"`); normalize before
50+
interpolating into paths (client already does).
51+
- This is a self-hosted single-account instance: slug `1`, boards
52+
Playground / Sandbox ×2.

0 commit comments

Comments
 (0)