|
| 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