D33 — scenes become first-class and Foundry-pairable (#659, #689) #690

Closed
claude-bot wants to merge 0 commits from docs/d33-scenes into main
Collaborator

Refs #659, #689. Catalogue-only — no code. Lane 4 needs this landed first, because it decides whether scenes are drawn as tags or as objects.

The decision

A scene today is the free-text shelf_cards.scene column — no scene table. It exists exactly as long as some card carries the string, so it cannot be renamed, cannot be empty, and cannot outlive its session.

That was a good simplification in #244, and the effort went where it mattered: filtering hides cards and never moves them, so a swap restores the exact layout (#235's "spatial layout is sacred" guardrail). It shipped as a 244-line frontend change with no migration.

It cannot carry what comes next. Two things a per-session string cannot do:

  1. A scene that exists before it has cards — #235's premise was bundling during prep, and that half was never built.
  2. A scene that outlives its session — the docks are the docks in March and in July.

The deciding argument is Foundry. The owner wants a Quest Board scene paired with a Foundry map in both directions: switch the map and the cards come up; open the scene and the map loads. #16 already anticipates "auto-load scene" and "pull active scene state" as speculative Phase 4 hooks — but with nothing on the Quest Board side to attach to. A tag on a per-session card cannot hold a stable map id; a campaign-level scene row can.

Rows

IS-318 scenes are campaign-scoped, named, reusable; rename and delete become operations
IS-319 a scene can be built before it has cards
IS-320 switching a scene still never moves a card
IS-321 a scene pairs with a Foundry map, both directions

IS-320 is the one nobody asked for, and I think it matters most. The guardrail — filtering hides, positions survive a swap, the stage keeps what it is showing, the number keys walk the visible set — was never written down as a requirement. It existed only as behaviour inside one frontend commit. Replacing the tag with a table is exactly the change that loses it by accident, so it is now a row that has to be satisfied.

Placed on TABLE-1 (where a scene is switched), PREP-1 (where it is built) and CAMP-16 (where the Foundry pairing is configured).

Catalogue rebuilt: 1,590 rows on 102 surfaces.

🤖 Generated with Claude Code

Refs #659, #689. Catalogue-only — no code. Lane 4 needs this landed first, because it decides whether scenes are drawn as tags or as objects. ## The decision A scene today is the free-text `shelf_cards.scene` column — **no scene table**. It exists exactly as long as some card carries the string, so it cannot be renamed, cannot be empty, and cannot outlive its session. That was a good simplification in #244, and the effort went where it mattered: **filtering hides cards and never moves them**, so a swap restores the exact layout (#235's "spatial layout is sacred" guardrail). It shipped as a 244-line frontend change with no migration. It cannot carry what comes next. Two things a per-session string cannot do: 1. **A scene that exists before it has cards** — #235's premise was bundling *during prep*, and that half was never built. 2. **A scene that outlives its session** — the docks are the docks in March and in July. **The deciding argument is Foundry.** The owner wants a Quest Board scene paired with a Foundry map *in both directions*: switch the map and the cards come up; open the scene and the map loads. #16 already anticipates "auto-load scene" and "pull active scene state" as speculative Phase 4 hooks — but with **nothing on the Quest Board side to attach to**. A tag on a per-session card cannot hold a stable map id; a campaign-level scene row can. ## Rows | | | |---|---| | `IS-318` | scenes are campaign-scoped, named, reusable; rename and delete become operations | | `IS-319` | a scene can be built before it has cards | | `IS-320` | switching a scene still never moves a card | | `IS-321` | a scene pairs with a Foundry map, both directions | `IS-320` is the one nobody asked for, and I think it matters most. The guardrail — *filtering hides, positions survive a swap, the stage keeps what it is showing, the number keys walk the visible set* — was never written down as a requirement. It existed only as behaviour inside one frontend commit. **Replacing the tag with a table is exactly the change that loses it by accident**, so it is now a row that has to be satisfied. Placed on `TABLE-1` (where a scene is switched), `PREP-1` (where it is built) and `CAMP-16` (where the Foundry pairing is configured). Catalogue rebuilt: **1,590 rows on 102 surfaces**. 🤖 Generated with [Claude Code](https://claude.com/claude-code)
docs(catalogue): D33 — scenes become first-class and Foundry-pairable (#659, #689)
Some checks failed
CI / Frontend tests, audit, and build (pull_request) Has been cancelled
CI / Backend migration, tests, and audit (pull_request) Has been cancelled
CI / Summarisation accuracy eval harness (stub provider) (pull_request) Has been cancelled
CI / Bot tests and audit (pull_request) Has been cancelled
CI / Backend lint (ruff) (pull_request) Has been cancelled
CI / Feedback site tests (pull_request) Has been cancelled
CI / Bot/backend version sync (pull_request) Has been cancelled
CI / Docker image build (pull_request) Has been cancelled
CI / Synthetic session harness (no GPU, no LLM) (pull_request) Has been cancelled
c51e91e384
Owner decision taken while scoping lane 4. Recorded now so the lane is drawn
with scenes as real objects rather than drawn twice.

Today `shelf_cards.scene` is a nullable Text column and there is no scene
table: a scene exists exactly as long as some card carries the string, so it
cannot be renamed, cannot be empty, and cannot outlive its session. That was
a deliberate simplification in #244 and a good one -- the effort went into
the guardrail that mattered, which is that filtering hides cards and never
moves them.

It cannot carry what comes next. Two things a per-session string cannot do:

- a scene that exists before it has cards, which is what #235's "bundle cards
  into named scenes during prep" actually meant, and the half that was never
  built
- a scene that outlives its session, because the docks are the docks in March
  and in July

The deciding argument is Foundry. The owner wants a Quest Board scene paired
with a Foundry map in both directions -- switch the map and the cards come
up, open the scene and the map loads. #16 already anticipates "auto-load
scene" and "pull active scene state" as speculative Phase 4 hooks, but with
nothing on the Quest Board side to attach to. A free-text tag on a
per-session card cannot hold a stable map id; a campaign-level scene row can.

Four rows for the scope it creates:

  IS-318  scenes are campaign-scoped, named and reusable; rename and delete
          become operations                          TABLE-1 + PREP-1
  IS-319  a scene can be built before it has cards    PREP-1 + TABLE-1
  IS-320  switching a scene still never moves a card -- #235's guardrails,
          written down so a new model cannot quietly lose them   TABLE-1
  IS-321  a scene pairs with a Foundry map, both ways CAMP-16 + TABLE-1

Catalogue rebuilt: 1,590 rows on 102 surfaces.

Refs #659, #689.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
docs(lane3): drop 'provisional' from a D30 source comment (#659)
All checks were successful
CI / Backend lint (ruff) (pull_request) Successful in 46s
CI / Summarisation accuracy eval harness (stub provider) (pull_request) Successful in 1m31s
CI / Feedback site tests (pull_request) Successful in 42s
CI / Bot/backend version sync (pull_request) Successful in 45s
CI / Docker image build (pull_request) Successful in 23s
CI / Frontend tests, audit, and build (pull_request) Successful in 2m56s
CI / Bot tests and audit (pull_request) Successful in 2m39s
CI / Backend migration, tests, and audit (pull_request) Successful in 11m11s
CI / Synthetic session harness (no GPU, no LLM) (pull_request) Successful in 15m10s
4750bb0e0d
The page copy was updated when D30 was settled; this comment in the notes
panel's own source still described it as provisional. Not user-visible, but
it is the comment someone reads when they come to build the thing.

Refs #659.
Author
Collaborator

Merged to main in e718cee. Closing by hand; the API merge returns 422 on this repo.

CATALOGUE.md is a build artifact and both this branch and #687 had rebuilt it independently, so git's auto-merge of the two texts was checked against a fresh build of the merged sources: identical, 1,590 rows on 102 surfaces.

Merged to `main` in e718cee. Closing by hand; the API merge returns 422 on this repo. `CATALOGUE.md` is a build artifact and both this branch and #687 had rebuilt it independently, so git's auto-merge of the two texts was checked against a fresh build of the merged sources: **identical**, 1,590 rows on 102 surfaces.
claude-bot closed this pull request 2026-09-18 02:11:13 +00:00
All checks were successful
CI / Backend lint (ruff) (pull_request) Successful in 46s
Required
Details
CI / Summarisation accuracy eval harness (stub provider) (pull_request) Successful in 1m31s
Required
Details
CI / Feedback site tests (pull_request) Successful in 42s
Required
Details
CI / Bot/backend version sync (pull_request) Successful in 45s
Required
Details
CI / Docker image build (pull_request) Successful in 23s
Required
Details
CI / Frontend tests, audit, and build (pull_request) Successful in 2m56s
Required
Details
CI / Bot tests and audit (pull_request) Successful in 2m39s
Required
Details
CI / Backend migration, tests, and audit (pull_request) Successful in 11m11s
Required
Details
CI / Synthetic session harness (no GPU, no LLM) (pull_request) Successful in 15m10s
Required
Details

Pull request closed

Sign in to join this conversation.
No description provided.