# Table Fields for AI Agents

> Table field ids for AI agents: the DiceyTable /table toolbar, menus and Settings, the hand drawer, dice dock, chat and the play-test preview banner.

- Question: Which table menus and settings can an agent set?
- Source: https://diceytable.com/docs/ai-agents/reference/fields/table
- Last verified: 2026-10-09

These are the fields and buttons of a DiceyTable table. They cover the toolbar, the menus and Settings. They also cover the hand drawer, the dice dock, chat, and the banner on a play-test preview.

## Panels in this group

34 panels, with the id prefixes `table`, `preview`. The [field catalogue](https://diceytable.com/docs/ai-agents/reference/fields) lists every group.

| Panel | Label | Tab | Fields | Actions |
|---|---|---|---|---|
| [`table.toolbar`](https://diceytable.com/docs/ai-agents/reference/fields/table#tabletoolbar) | Table toolbar | `table` | 0 | 34 |
| [`table.settings.game`](https://diceytable.com/docs/ai-agents/reference/fields/table#tablesettingsgame) | Settings ▸ Game | `table` | 8 | 2 |
| [`table.settings.players`](https://diceytable.com/docs/ai-agents/reference/fields/table#tablesettingsplayers) | Settings ▸ Players | `table` | 2 | 4 |
| [`table.settings.room`](https://diceytable.com/docs/ai-agents/reference/fields/table#tablesettingsroom) | Settings ▸ Room | `table` | 0 | 7 |
| [`table.settings.camera`](https://diceytable.com/docs/ai-agents/reference/fields/table#tablesettingscamera) | Settings ▸ Camera | `table` | 4 | 1 |
| [`table.settings.touch`](https://diceytable.com/docs/ai-agents/reference/fields/table#tablesettingstouch) | Settings ▸ Touch | `table` | 8 | 0 |
| [`table.settings.sound`](https://diceytable.com/docs/ai-agents/reference/fields/table#tablesettingssound) | Settings ▸ Sound | `table` | 5 | 1 |
| [`table.settings.graphics`](https://diceytable.com/docs/ai-agents/reference/fields/table#tablesettingsgraphics) | Settings ▸ Graphics | `table` | 24 | 6 |
| [`table.settings.vr`](https://diceytable.com/docs/ai-agents/reference/fields/table#tablesettingsvr) | Settings ▸ VR | `table` | 9 | 1 |
| [`table.settings.ar`](https://diceytable.com/docs/ai-agents/reference/fields/table#tablesettingsar) | Settings ▸ AR | `table` | 10 | 1 |
| [`table.save-load`](https://diceytable.com/docs/ai-agents/reference/fields/table#tablesave-load) | Save & Load | `table` | 1 | 8 |
| [`table.activity-log`](https://diceytable.com/docs/ai-agents/reference/fields/table#tableactivity-log) | Activity log | `table` | 2 | 9 |
| [`table.chat`](https://diceytable.com/docs/ai-agents/reference/fields/table#tablechat) | Chat | `table` | 4 | 5 |
| [`table.add-items`](https://diceytable.com/docs/ai-agents/reference/fields/table#tableadd-items) | Add items | `table` | 2 | 11 |
| [`table.player-menu`](https://diceytable.com/docs/ai-agents/reference/fields/table#tableplayer-menu) | Player menu | `table` | 1 | 3 |
| [`table.dice-dock`](https://diceytable.com/docs/ai-agents/reference/fields/table#tabledice-dock) | Dice dock | `table` | 0 | 10 |
| [`table.context-menu`](https://diceytable.com/docs/ai-agents/reference/fields/table#tablecontext-menu) | Entity context menu | `table` | 0 | 5 |
| [`table.deck-search`](https://diceytable.com/docs/ai-agents/reference/fields/table#tabledeck-search) | Deck search | `table` | 1 | 7 |
| [`table.peek`](https://diceytable.com/docs/ai-agents/reference/fields/table#tablepeek) | Peek | `table` | 1 | 3 |
| [`table.draw-tools`](https://diceytable.com/docs/ai-agents/reference/fields/table#tabledraw-tools) | Draw and sticker tools | `table` | 4 | 8 |
| [`table.photo-mode`](https://diceytable.com/docs/ai-agents/reference/fields/table#tablephoto-mode) | Photo mode | `table` | 3 | 7 |
| [`table.hand`](https://diceytable.com/docs/ai-agents/reference/fields/table#tablehand) | Hand drawer | `table` | 3 | 3 |
| [`table.modals`](https://diceytable.com/docs/ai-agents/reference/fields/table#tablemodals) | Rules, exit and reset | `table` | 0 | 9 |
| [`preview.banner`](https://diceytable.com/docs/ai-agents/reference/fields/table#previewbanner) | Preview banner | `preview` | 0 | 2 |
| [`table.notices`](https://diceytable.com/docs/ai-agents/reference/fields/table#tablenotices) | Table notices | `table` | 0 | 11 |
| [`table.capability-details`](https://diceytable.com/docs/ai-agents/reference/fields/table#tablecapability-details) | Mod permissions | `table` | 0 | 1 |
| [`table.password-prompt`](https://diceytable.com/docs/ai-agents/reference/fields/table#tablepassword-prompt) | Table password | `table` | 0 | 2 |
| [`table.hand-sort`](https://diceytable.com/docs/ai-agents/reference/fields/table#tablehand-sort) | Sort my hand | `table` | 0 | 0 |
| [`table.multi-select`](https://diceytable.com/docs/ai-agents/reference/fields/table#tablemulti-select) | Select multiple (touch) | `table` | 0 | 2 |
| [`table.touch-rail`](https://diceytable.com/docs/ai-agents/reference/fields/table#tabletouch-rail) | Quick actions rail (touch) | `table` | 0 | 3 |
| [`table.card-zoom`](https://diceytable.com/docs/ai-agents/reference/fields/table#tablecard-zoom) | Card preview | `table` | 0 | 3 |
| [`table.stamp-library`](https://diceytable.com/docs/ai-agents/reference/fields/table#tablestamp-library) | Stamp library | `table` | 0 | 3 |
| [`table.shortcuts`](https://diceytable.com/docs/ai-agents/reference/fields/table#tableshortcuts) | Keyboard shortcuts | `table` | 0 | 1 |
| [`table.bots`](https://diceytable.com/docs/ai-agents/reference/fields/table#tablebots) | Bots | `table` | 5 | 4 |

## `table.toolbar`

**Table toolbar** · surface `table` · singleton (no target)

How it opens: Always mounted at a table.

**Actions** (34)

| Action id | Label | Class | Target | Description |
|---|---|---|---|---|
| `table.toolbar.add-items` | Add Items | R | — | Open the Add Items dialog (Basic / Mods / Toybox / Decks). |
| `table.toolbar.undo` | Undo | W | — | Undo the last table action this user may undo. |
| `table.toolbar.end-turn` | End Turn | W | — | End the current player's turn. |
| `table.toolbar.rules` | Rules | R | — | Open the game's rules. |
| `table.toolbar.chat` | Chat | R | — | Open the chat panel. |
| `table.toolbar.save` | Save | R | — | Open Save & Load. |
| `table.toolbar.log` | Log | R | — | Open the activity log (events, mod diagnostics, script errors). |
| `table.toolbar.exit` | Exit | H | — | Requires the user's confirmation in the DiceyTable tab. Leave the room. |
| `table.toolbar.photo` | Photo | R | — | Enter photo mode (a view mode; nothing on the table changes). |
| `table.toolbar.settings` | Settings | R | — | Open the Settings modal. |
| `table.toolbar.menu` | Menu | R | — | Touch layouts: open or close the full-screen tile menu (every toolbar item is a tile there; Tools, View and Help open sub-pages). |
| `table.toolbar.controls` | Tools | R | — | Open the pointer-tool menu (grab, flick, ping, draw, stickers). |
| `table.toolbar.mode.grab` | Grab | W | — | Pointer tool: grab (the default). Local to this tab. |
| `table.toolbar.mode.flick` | Flick | W | — | Pointer tool: flick and push entities. Local to this tab. |
| `table.toolbar.mode.ping` | Ping | W | — | Pointer tool: click the table to ping a spot. Local to this tab. |
| `table.toolbar.mode.draw` | Draw | W | — | Pointer tool: draw lines and shapes (host authoring; opens Draw Tools). |
| `table.toolbar.mode.stamp` | Stickers | W | — | Pointer tool: stamp stickers onto surfaces (host authoring; opens the sticker tools). |
| `table.toolbar.camera` | View | R | — | Open the View menu: camera views, saved views and Photo mode. |
| `table.toolbar.camera.save` | Save this view | W | — | Bookmark this user's current camera view (stored on this device). |
| `table.toolbar.camera.player-start` | My seat | W | — | Move this user's camera behind their seat, facing the table. Agents frame screenshots with `screenshot_viewport` presets instead. |
| `table.toolbar.camera.top-down` | Top down | W | — | Move this user's camera to a straight-down table overview. |
| `table.toolbar.help` | Help | R | — | Open the Help menu. |
| `table.toolbar.help.shortcuts` | Keyboard shortcuts | R | — | Show the keyboard shortcuts. |
| `table.toolbar.focus-camera` | Focus camera | W | — | Point this user's camera at the selection. |
| `table.toolbar.grid-snap` | Snap to grid | W | — | Toggle the room's snap-to-grid (shared room state). Its one home: the toolbar's utility buttons on desktop, a tile in the touch menu, the VR menu. |
| `table.match.resign` | Resign | H | — | Requires the user's confirmation in the DiceyTable tab. Resign this player's seat in the ranked match: it counts as a loss, ranked below everyone who did not resign. Cannot be undone. |
| `table.match.offer-draw` | Offer draw | H | — | Requires the user's confirmation in the DiceyTable tab. Offer a draw to the other players in the ranked match (only when the game allows draws). |
| `table.match.accept-draw` | Accept draw | H | — | Requires the user's confirmation in the DiceyTable tab. Accept the open draw offer. When every player accepts, the match ends drawn. |
| `table.match.decline-draw` | Decline draw | H | — | Requires the user's confirmation in the DiceyTable tab. Decline the open draw offer; play goes on. |
| `table.match.ask-takeback` | Ask to take back | W | — | Ask the other players to take back the last move. Nothing changes unless every other player agrees within 60 seconds; an explicit No counts toward this player's limit of 4. |
| `table.match.dismiss-result` | Close | R | — | Close the ranked match result card. |
| `table.match.toggle-controls` | Show match controls | R | — | Show or hide the ranked match's controls (Ask to take back, Offer draw, Resign) under the match chip. They start hidden on a phone and shown elsewhere; an open draw offer always shows them. Open them before invoking a table.match.* action. |
| `table.match.return-to-lobby` | Return to lobby | H | — | Requires the user's confirmation in the DiceyTable tab. In the game-over window of a Fully scripted game: leave the table for the rematch lobby every returning player of this table is sent to. It is owned by whoever was the table's host and held for this table's players for 30 seconds. |
| `table.match.exit` | Exit game | H | — | Requires the user's confirmation in the DiceyTable tab. In the game-over window of a Fully scripted game: leave the table for the play hub (/play). The rematch lobby lists this player as having left. |

## `table.settings.game`

**Settings ▸ Game** · surface `table` · singleton (no target)

How it opens: Toolbar ▸ Settings ▸ Game (seats, turns, what players can do).

**Fields** (8)

| Field id | Label | Kind | Unit | Target | Class | Range / options | Description |
|---|---|---|---|---|---|---|---|
| `table.settings.game.seats` | Seats | `select` | — | — | W | `1`, `2`, `3`, `4`, `5`, `6`, `7`, `8`, `9`, `10` | How many seats the table offers (a − / + stepper in the UI). Host (or offline) only; absent when the loaded table authors its own seats. |
| `table.settings.game.turns` | Take turns | `boolean` | — | — | W | — | Host only: turn order on (players act in seat order) or off. Turning it on starts at the first seated player. |
| `table.settings.game.auto-draw` | Draw a card at the start of each turn | `boolean` | — | — | W | — | Host only: draw a card for the player whose turn starts. |
| `table.settings.game.action-limit` | Actions per turn | `select` | — | — | W | `none`, `1`, `2`, `3`, `4`, `5`, `6`, `7`, `8`, `9`, `10` | Host only: how many actions a player may take per turn — `none` (unlimited) or 1..10 (a − / + stepper in the UI). |
| `table.settings.game.perm.player-can-spawn` | Add new pieces | `boolean` | — | — | W | — | Host only: whether players (not just the host) may spawn entities. |
| `table.settings.game.perm.player-can-use-object-actions` | Move, flip and rotate pieces | `boolean` | — | — | W | — | Host only: whether players may move, flip and rotate entities and use their actions. |
| `table.settings.game.perm.player-can-delete` | Delete pieces | `boolean` | — | — | W | — | Host only: whether players may delete entities. |
| `table.settings.game.perm.spectator-can-interact` | Spectators can touch the table | `boolean` | — | — | W | — | Host only: whether spectators may interact with the table at all. |

**Actions** (2)

| Action id | Label | Class | Target | Description |
|---|---|---|---|---|
| `table.settings.close` | Close settings | D | — | Close Settings. Unsaved graphics edits are discarded (the page asks first). |
| `table.settings.game.turns-next` | Next turn | W | — | Host: skip to the next player's turn (turn order must be on: `table.settings.game.turns`). |

## `table.settings.players`

**Settings ▸ Players** · surface `table` · singleton (no target)

How it opens: Toolbar ▸ Settings ▸ Players (the roster; seats, teams and moderation are the host's).

**Fields** (2)

| Field id | Label | Kind | Unit | Target | Class | Range / options | Description |
|---|---|---|---|---|---|---|---|
| `table.settings.players.peer-seat` | Assign seat | `select` | — | `peer` | W | — | Host only: the seat (colour) a connected peer sits in — `none` or a seat id from the live options. Target: the peer. |
| `table.settings.players.peer-team` | Assign team | `select` | — | `peer` | W | `none`, `A`, `B` | Host only: a connected peer's team. Target: the peer. |

**Actions** (4)

| Action id | Label | Class | Target | Description |
|---|---|---|---|---|
| `table.settings.players.mute` | Mute | H | `peer` | Requires the user's confirmation in the DiceyTable tab. Host: mute this peer's chat. |
| `table.settings.players.ban` | Ban from table | H | `peer` | Requires the user's confirmation in the DiceyTable tab. Host: remove this peer and bar their account from this table. |
| `table.settings.players.kick` | Kick | H | `peer` | Requires the user's confirmation in the DiceyTable tab. Host: remove this peer from the room. |
| `table.settings.players.unban` | Unban | H | `user` | Requires the user's confirmation in the DiceyTable tab. Host: lift this account's ban from the table. Target: the banned user id. |

## `table.settings.room`

**Settings ▸ Room** · surface `table` · singleton (no target)

How it opens: Toolbar ▸ Settings ▸ Room (in a live room: who can join, join password, plugins).

**Actions** (7)

| Action id | Label | Class | Target | Description |
|---|---|---|---|---|
| `table.settings.room.visibility.public` | Public | H | — | Requires the user's confirmation in the DiceyTable tab. Owner: list the table on the Tables page; friends can see its name and join. |
| `table.settings.room.visibility.friends` | Friends only | H | — | Requires the user's confirmation in the DiceyTable tab. Owner: unlist the table; only the owner's friends see its name and can join. Needs a membership (the server refuses otherwise). |
| `table.settings.room.visibility.private` | Private | H | — | Requires the user's confirmation in the DiceyTable tab. Owner: unlist the table; friends see only "Private game" unless invited. Needs a membership (the server refuses otherwise). |
| `table.settings.room.password.save` | Save password | H | — | Requires the user's confirmation in the DiceyTable tab. Owner: save the join password the USER typed (4-128 characters). The password field itself is the user's alone; an agent cannot read or fill it. |
| `table.settings.room.password.remove` | Remove password | H | — | Requires the user's confirmation in the DiceyTable tab. Owner: remove the table's join password, so anyone with the link can join. |
| `table.settings.room.plugin.enable` | Turn plugin on | H | `plugin` | Requires the user's confirmation in the DiceyTable tab. Owner: turn a registered plugin on for this table. Its capabilities join the table's disclosure, which every player is shown again. Target: `{kind: "plugin", id: "<plugin id>"}` (a plugin that is currently off). |
| `table.settings.room.plugin.disable` | Turn plugin off | W | `plugin` | Owner: turn a plugin off for this table (a game that relies on it loses its data source). Target: `{kind: "plugin", id: "<plugin id>"}` (a plugin that is currently on). |

## `table.settings.camera`

**Settings ▸ Camera** · surface `table` · singleton (no target)

How it opens: Toolbar ▸ Settings ▸ Camera (desktop and touch).

**Fields** (4)

| Field id | Label | Kind | Unit | Target | Class | Range / options | Description |
|---|---|---|---|---|---|---|---|
| `table.settings.camera.pan-speed` | Pan Speed | `slider` | — | — | W | ≥ 0.0008, ≤ 0.008, step 0.0002 | Camera pan sensitivity on this device, 0.0008..0.008. |
| `table.settings.camera.orbit-speed` | Orbit Speed | `slider` | — | — | W | ≥ 0.1, ≤ 0.6, step 0.01 | Camera orbit sensitivity on this device, 0.1..0.6. |
| `table.settings.camera.zoom-step` | Zoom Step | `slider` | — | — | W | ≥ 0.15, ≤ 1.2, step 0.05 | Camera zoom step per wheel notch on this device, 0.15..1.2. |
| `table.settings.camera.projection` | View | `select` | — | — | W | `perspective`, `orthographic` | The orbit camera's projection on this device. First-person and VR are always perspective. |

**Actions** (1)

| Action id | Label | Class | Target | Description |
|---|---|---|---|---|
| `table.settings.camera.reset` | Reset camera settings | W | — | Restore the default camera speeds and view on this device. |

## `table.settings.touch`

**Settings ▸ Touch** · surface `table` · singleton (no target)

How it opens: Menu ▸ Settings ▸ Touch (touch layouts only).

**Fields** (8)

| Field id | Label | Kind | Unit | Target | Class | Range / options | Description |
|---|---|---|---|---|---|---|---|
| `table.settings.touch.loupe.enabled` | Show the magnifier | `boolean` | — | — | W | — | Show a magnifier beside your finger while you drag a piece by touch (synced to your account). Never shown for mouse or pen drags. Checked writes the preference's `dragLoupe.mode` as `touch`, unchecked as `off`; the five magnifier settings below are disabled while it is off. |
| `table.settings.touch.loupe.direction` | Position | `select` | — | — | W | `top`, `right`, `bottom`, `left` | Preferred side of the finger for the drag magnifier; it moves round the finger only when that side does not fit on screen. Disabled while the drag magnifier (`table.settings.touch.loupe.enabled`) is off; turn that on first. |
| `table.settings.touch.loupe.distance` | Magnifier distance | `slider` | — | — | W | ≥ 28, ≤ 160, step 4 | Gap between the touch point and the magnifier's nearest edge, in CSS pixels, 28..160. Disabled while the drag magnifier (`table.settings.touch.loupe.enabled`) is off; turn that on first. |
| `table.settings.touch.loupe.size` | Magnifier size | `slider` | — | — | W | ≥ 96, ≤ 200, step 4 | Drag magnifier diameter, in CSS pixels, 96..200. Disabled while the drag magnifier (`table.settings.touch.loupe.enabled`) is off; turn that on first. |
| `table.settings.touch.loupe.zoom` | Magnifier zoom | `slider` | — | — | W | ≥ 0, ≤ 12, step 0.5 | How far the magnifier's camera stands back beyond the tightest framing of the piece and its landing, in inches, 0..12 (0 = closest; default 3.5). Disabled while the drag magnifier (`table.settings.touch.loupe.enabled`) is off; turn that on first. |
| `table.settings.touch.loupe.auto-skip-large` | Hide for large pieces | `boolean` | — | — | W | — | Skip the drag magnifier when the piece is already bigger on screen than a fingertip covers. Disabled while the drag magnifier (`table.settings.touch.loupe.enabled`) is off; turn that on first. |
| `table.settings.touch.twist` | Two-finger twist turns the camera | `boolean` | — | — | W | — | Let a two-finger twist turn the camera (off by default so a pinch never rolls the view). Synced to your account. |
| `table.settings.touch.layout` | Screen layout | `select` | — | — | W | `auto`, `phone`, `tablet`, `desktop` | Force the phone, tablet or desktop table layout instead of detecting it (`auto`). Synced to your account. |

## `table.settings.sound`

**Settings ▸ Sound** · surface `table` · singleton (no target)

How it opens: Toolbar ▸ Settings ▸ Sound.

**Fields** (5)

| Field id | Label | Kind | Unit | Target | Class | Range / options | Description |
|---|---|---|---|---|---|---|---|
| `table.settings.sound.muted` | Mute all sound | `boolean` | — | — | W | — | Mute every table sound on this device. |
| `table.settings.sound.master` | Master Volume | `slider` | `percent` | — | W | ≥ 0, ≤ 1, step 0.05 | Master volume, 0..1 (shown as a percentage). |
| `table.settings.sound.sfx` | Sound Effects Volume | `slider` | `percent` | — | W | ≥ 0, ≤ 1, step 0.05 | Sound-effects volume, 0..1 (shown as a percentage). |
| `table.settings.sound.ambient` | Environment Volume | `slider` | `percent` | — | W | ≥ 0, ≤ 1, step 0.05 | Environment (ambient) volume, 0..1: the room's sound emitters — rain, fire, birds. |
| `table.settings.sound.music` | Music Volume | `slider` | `percent` | — | W | ≥ 0, ≤ 1, step 0.05 | Background-music volume, 0..1. Saved now; no game plays music yet. |

**Actions** (1)

| Action id | Label | Class | Target | Description |
|---|---|---|---|---|
| `table.settings.sound.reset` | Reset sound settings | W | — | Restore the default sound settings on this device. |

## `table.settings.graphics`

**Settings ▸ Graphics** · surface `table` · singleton (no target)

How it opens: Toolbar ▸ Settings ▸ Graphics; the level fields edit the quality level being viewed (`table.settings.graphics.view-tier`).

**Fields** (24)

| Field id | Label | Kind | Unit | Target | Class | Range / options | Description |
|---|---|---|---|---|---|---|---|
| `table.settings.graphics.dof.enabled` | Enable depth of field | `boolean` | — | — | W | — | Depth of field for the viewed quality tier. |
| `table.settings.graphics.dof.focusMode` | Focus mode | `select` | — | — | W | `auto`, `manual` | `auto` tracks the camera-to-table distance; `manual` uses Focus distance. |
| `table.settings.graphics.dof.focusDistance` | Focus distance | `length` | `length` | — | W | ≥ 0.5, ≤ 60, step 0.5 | Manual sharp-plane distance from the camera, in feet. Only shown in manual focus mode. |
| `table.settings.graphics.dof.focusRange` | Focus range | `length` | `length` | — | W | ≥ 0.1, ≤ 30, step 0.1 | Depth band around the focus plane that stays sharp, in feet. |
| `table.settings.graphics.dof.nearBlur` | Blur objects closer than the focus plane | `boolean` | — | — | W | — | Blur the foreground as well as the background. |
| `table.settings.graphics.dof.blurRadius` | Blur radius | `slider` | — | — | W | ≥ 2, ≤ 10, step 0.5 | Bokeh blur radius, 2..10. |
| `table.settings.graphics.dof.highQuality` | High-quality bokeh | `boolean` | — | — | W | — | Better bokeh at a higher GPU cost. |
| `table.settings.graphics.bloom.enabled` | Enable bloom | `boolean` | — | — | W | — | Bloom for the viewed quality tier. |
| `table.settings.graphics.bloom.intensity` | Intensity | `slider` | — | — | W | ≥ 0, ≤ 0.1, step 0.005 | Bloom intensity, 0..0.1 (the engine's range is tiny). |
| `table.settings.graphics.ssao.enabled` | Enable ambient occlusion | `boolean` | — | — | W | — | Screen-space ambient occlusion for the viewed quality tier. |
| `table.settings.graphics.ssao.intensity` | Intensity | `slider` | — | — | W | ≥ 0, ≤ 1, step 0.05 | Occlusion intensity, 0..1. |
| `table.settings.graphics.ssao.radius` | Radius | `length` | `length` | — | W | ≥ 0.05, ≤ 10, step 0.05 | Occlusion sampling radius in feet. |
| `table.settings.graphics.ssao.samples` | Samples | `slider` | — | — | W | ≥ 1, ≤ 64, step 1 | Occlusion samples per pixel, an integer 1..64. |
| `table.settings.graphics.ssao.power` | Power | `slider` | — | — | W | ≥ 0.1, ≤ 10, step 0.1 | Occlusion contrast exponent, 0.1..10. |
| `table.settings.graphics.taa.enabled` | Enable temporal anti-aliasing | `boolean` | — | — | W | — | TAA for the viewed quality tier. |
| `table.settings.graphics.taa.jitter` | Jitter | `slider` | — | — | W | ≥ 0, ≤ 1, step 0.05 | TAA sub-pixel jitter, 0..1. |
| `table.settings.graphics.taa.sharpness` | Sharpness | `slider` | — | — | W | ≥ 0, ≤ 1, step 0.05 | Post sharpen, 0..1. Applies whenever post-processing is on, not only with TAA. |
| `table.settings.graphics.rendering.renderTargetScale` | Render target scale | `slider` | — | — | W | ≥ 0.1, ≤ 1, step 0.05 | Render the scene and post-processing at this fraction of full resolution, 0.1..1. |
| `table.settings.graphics.view-tier` | Editing level | `select` | — | — | W | `low`, `medium`, `high`, `ultra` | Which quality level the panel shows and edits (the table previews it while Settings is open). It does not change the level this device runs — Auto picks that. |
| `table.settings.graphics.sky.animate` | Animate the sky | `boolean` | — | — | W | — | Let a room's authored sky spin animate on this device (a moving sun re-renders shadows). Off pins the sky at its authored orientation. |
| `table.settings.graphics.lighting.shadows` | Shadows | `boolean` | — | — | W | — | Realtime shadows on this device, for the level being edited. Off removes the shadow pass entirely. Disabled on Low, which never draws shadows. |
| `table.settings.graphics.lighting.autoBake` | Bake lighting automatically | `boolean` | — | — | W | — | Let the table bake the room's static lighting by itself after it loads or changes (a heavy one-off GPU spike; slightly cheaper to draw afterwards). Off by default on Medium; disabled on Low. Manual Bake in Edit Mode is unaffected. |
| `table.settings.graphics.show-player-bots` | Show player bots | `boolean` | — | — | W | — | Show other players' bot presences at the table on this device. |
| `table.settings.graphics.hardware-tier` | This device, for AI bots | `text` | — | — | W | — | Read-only: what this device measured as for a model-backed game bot, in plain words ("a fast processor", "a graphics card (WebGPU)", "not tested yet"). It decides whether this user can host a table that seats an AI bot. Re-measure with `table.settings.graphics.hardware-retest`. |

**Actions** (6)

| Action id | Label | Class | Target | Description |
|---|---|---|---|---|
| `table.settings.graphics.hardware-retest` | Re-test my hardware | W | — | Measure again what this device can do for an AI bot. Runs a short benchmark; the first run downloads about 14 MB (more with a graphics card). The result is kept on this device for a week. |
| `table.settings.graphics.first-run.dismiss` | Dismiss | W | — | First-run banner: keep the automatically picked level. |
| `table.settings.graphics.benchmark` | Re-measure | W | — | Re-measure this device (benchmark) and re-pick its quality level. |
| `table.settings.graphics.save` | Save updates | W | — | Save the viewed quality level's edits on this device. |
| `table.settings.graphics.discard` | Discard changes | D | — | Discard the viewed quality level's unsaved edits. |
| `table.settings.graphics.reset-tier` | Reset to defaults | D | — | Reset the viewed quality level to its built-in defaults on this device. |

## `table.settings.vr`

**Settings ▸ VR** · surface `table` · singleton (no target)

How it opens: Toolbar ▸ Settings ▸ VR (only when the device supports VR or AR).

**Fields** (9)

| Field id | Label | Kind | Unit | Target | Class | Range / options | Description |
|---|---|---|---|---|---|---|---|
| `table.settings.vr.main-hand` | Main Hand | `select` | — | — | W | `left`, `right` | Dominant VR hand; the off hand hosts the palm hand and wrist UIs. |
| `table.settings.vr.snap-turn` | Turning | `select` | — | — | W | `0`, `30`, `45` | VR turning: `0` = smooth, `30`/`45` = snap turn by that many degrees. |
| `table.settings.vr.teleport` | Teleport movement | `boolean` | — | — | W | — | VR teleport locomotion (aim by pushing the left stick fully forward). |
| `table.settings.vr.hand-grab-locomotion` | Hand grab movement | `boolean` | — | — | W | — | VR hand tracking: fist both hands and drag to move. |
| `table.settings.vr.hand-selection-ray` | Hand selection ray | `boolean` | — | — | W | — | VR hand tracking: point-and-pinch at a distance. Off = touch only. |
| `table.settings.vr.fist-sensitivity` | Fist Sensitivity | `slider` | — | — | W | ≥ 0, ≤ 1, step 0.05 | VR hand tracking: how easily a fist registers, 0..1 (higher = easier). |
| `table.settings.vr.movement-speed` | Movement Speed | `slider` | — | — | W | ≥ 0.5, ≤ 4, step 0.1 | VR locomotion speed in real-world metres per second, 0.5..4. |
| `table.settings.vr.height-step` | Height Adjust Sensitivity | `slider` | — | — | W | ≥ 0.05, ≤ 0.5, step 0.05 | VR height adjust step in real-world metres, 0.05..0.5. |
| `table.settings.vr.render-scale` | Render Scale | `slider` | — | — | W | ≥ 0.7, ≤ 1.2, step 0.05 | VR render scale, 0.7..1.2; applies at the next VR session start. |

**Actions** (1)

| Action id | Label | Class | Target | Description |
|---|---|---|---|---|
| `table.settings.vr.reset` | Reset VR & AR settings | W | — | Restore every VR and AR setting on this device to its default. |

## `table.settings.ar`

**Settings ▸ AR** · surface `table` · singleton (no target)

How it opens: Toolbar ▸ Settings ▸ AR (only when the device supports passthrough AR).

**Fields** (10)

| Field id | Label | Kind | Unit | Target | Class | Range / options | Description |
|---|---|---|---|---|---|---|---|
| `table.settings.ar.board-scale` | Board size | `slider` | `percent` | — | W | ≥ 0.25, ≤ 2, step 0.05 | AR board size as a fraction of life size, 0.25..2 (1 = every piece at its real size). |
| `table.settings.ar.light-match` | Room light | `boolean` | — | — | W | — | AR: light the pieces like the real room (measured where the headset can, otherwise from the AR light settings). |
| `table.settings.ar.brightness` | Brightness | `slider` | `percent` | — | W | ≥ 0.5, ≤ 2, step 0.05 | AR scene brightness (the light and the ambient fill), 0.5..2. |
| `table.settings.ar.light-intensity` | Light intensity | `slider` | `percent` | — | W | ≥ 0, ≤ 2.5, step 0.05 | AR shadow-casting directional light intensity, 0..2.5. |
| `table.settings.ar.light-azimuth` | Light direction | `angle` | `degrees` | — | W | ≥ 0, ≤ 360, step 5 | AR light direction in degrees, fixed to the real room (not the board). |
| `table.settings.ar.light-elevation` | Light height | `angle` | `degrees` | — | W | ≥ 10, ≤ 90, step 5 | AR light elevation in degrees above the horizon, 10..90 (90 = overhead; lower = longer shadows). |
| `table.settings.ar.light-color` | Light colour | `color` | — | — | W | — | AR key-light colour as [r, g, b] in 0..1 (the Candle/Warm/Neutral… buttons are presets of this field). |
| `table.settings.ar.shadow-intensity` | Shadows | `slider` | `percent` | — | W | ≥ 0, ≤ 1, step 0.05 | AR contact-shadow strength, 0..1. |
| `table.settings.ar.hand-opacity` | Hand opacity | `slider` | `percent` | — | W | ≥ 0, ≤ 1, step 0.05 | AR tracked-hand opacity, 0..1 (0 = hidden). |
| `table.settings.ar.mat-opacity` | Mat visibility while adjusting | `slider` | `percent` | — | W | ≥ 0, ≤ 0.6, step 0.05 | AR placement mat opacity while adjusting, 0..0.6 (always invisible during play). |

**Actions** (1)

| Action id | Label | Class | Target | Description |
|---|---|---|---|---|
| `table.settings.ar.forget-surface` | Forget | W | — | Forget the last measured AR table surface. |

## `table.save-load`

**Save & Load** · surface `table` · singleton (no target)

How it opens: Toolbar ▸ Save (save, load, autosave, offline, start over).

**Fields** (1)

| Field id | Label | Kind | Unit | Target | Class | Range / options | Description |
|---|---|---|---|---|---|---|---|
| `table.save-load.name` | Save name | `text` | — | — | W | — | Name for a named save of the whole table (then `table.save-load.save-named`). |

**Actions** (8)

| Action id | Label | Class | Target | Description |
|---|---|---|---|---|
| `table.save-load.reset` | Reset table | H | — | Requires the user's confirmation in the DiceyTable tab. Save & Load ▸ Start over: reset the table to its initial setup (host only). A live-room reset is H; the peerless preview's reset is the `table_reset` tool's D path. |
| `table.save-load.close` | Close save and load | R | — | Close Save & Load. |
| `table.save-load.save-file` | Save to File | W | — | Download the table state as a JSON file on this device. |
| `table.save-load.save-named` | Save | W | — | Store the table as a named save (shared with the room when connected). |
| `table.save-load.load-named` | Load | H | `save` | Requires the user's confirmation in the DiceyTable tab. Replace the table with this named save (for everyone in a live room). |
| `table.save-load.delete-named` | Delete | D | `save` | Delete this named save. |
| `table.save-load.restore-autosave` | Restore Autosave | H | — | Requires the user's confirmation in the DiceyTable tab. Replace the table with this device's last autosave. |
| `table.save-load.resume-offline` | Resume Offline Session | H | — | Requires the user's confirmation in the DiceyTable tab. Leave the live room and continue this table offline on this device. |

## `table.activity-log`

**Activity log** · surface `table` · singleton (no target)

How it opens: Toolbar ▸ Log.

**Fields** (2)

| Field id | Label | Kind | Unit | Target | Class | Range / options | Description |
|---|---|---|---|---|---|---|---|
| `table.activity-log.mod-filter` | Filter diagnostics by mod | `select` | — | — | W | — | Mod Diagnostics tab: `all`, or one mod's id from the live options (shown as "name (id)"). A view filter only. |
| `table.activity-log.verbose` | Verbose | `boolean` | — | — | W | — | Mod Diagnostics tab: include verbose (info/debug) mod log lines. Stored on this device. |

**Actions** (9)

| Action id | Label | Class | Target | Description |
|---|---|---|---|---|
| `table.activity-log.close` | Close activity log | R | — | Close the Activity Log. |
| `table.activity-log.tab.events` | Events | R | — | Show table events. `table_events` reads them directly. |
| `table.activity-log.tab.mods` | Mod Diagnostics | R | — | Show mod diagnostics. `diagnostics_get` reads them directly. |
| `table.activity-log.tab.scripts` | Script Errors | R | — | Show table-script errors. |
| `table.activity-log.tab.system` | System | R | — | Show network, sync, physics, graphics and asset problems. |
| `table.activity-log.clear-events` | Clear | W | — | Clear this tab's event list (local view; the table is untouched). |
| `table.activity-log.clear-mods` | Clear | W | — | Hide the mod diagnostics seen so far (a view cursor; `diagnostics_get` still has them). |
| `table.activity-log.clear-scripts` | Clear | W | — | Hide the script errors seen so far (a view cursor). |
| `table.activity-log.clear-system` | Clear | W | — | Hide the system problems seen so far (a view cursor). |

## `table.chat`

**Chat** · surface `table` · singleton (no target)

How it opens: Toolbar ▸ Chat, or click the faint chat feed at the bottom-left.

**Fields** (4)

| Field id | Label | Kind | Unit | Target | Class | Range / options | Description |
|---|---|---|---|---|---|---|---|
| `table.chat.message` | Chat message | `text` | — | — | W | — | The chat draft (then `table.chat.send`). `table_chat_send` does both in one call. Other players see the AI badge on it. |
| `table.chat.show-player` | Players | `boolean` | — | — | W | — | Chat settings: show what people at the table type. A view filter on this device only; hidden lines still arrive. Open the settings with `table.chat.settings-toggle`. |
| `table.chat.show-system` | System | `boolean` | — | — | W | — | Chat settings: show the platform's own lines (dice results, refused moves, table notices). A view filter on this device only. |
| `table.chat.show-mod` | Game | `boolean` | — | — | W | — | Chat settings: show lines the game's scripts send (`world.broadcast`). A view filter on this device only. |

**Actions** (5)

| Action id | Label | Class | Target | Description |
|---|---|---|---|---|
| `table.chat.close` | Close chat | R | — | Close the chat panel. |
| `table.chat.send` | Send message | W | — | Send the chat draft (`table.chat.message`) as this user. |
| `table.chat.settings-toggle` | Chat settings | R | — | Switch the chat window between the messages and this user's chat settings (`table.chat.show-*` filters and per-player mutes). |
| `table.chat.mute-toggle` | Mute / unmute | R | `peer` | Chat settings: hide (or show again) this player's chat lines on this device only. They are not told, and it is not the host's room mute. Target: the player's peer id. |
| `table.chat.unmute-all` | Unmute everyone | R | — | Chat settings: clear every mute this user set, including players no longer at the table. Present only when a muted player is absent. |

## `table.add-items`

**Add items** · surface `table` · singleton (no target)

How it opens: Toolbar ▸ Add Items.

**Fields** (2)

| Field id | Label | Kind | Unit | Target | Class | Range / options | Description |
|---|---|---|---|---|---|---|---|
| `table.add-items.holder-seat` | Card holder owner seat | `select` | — | — | W | — | Host only: the seat the next card holder (Add Items ▸ Basic Items ▸ Card holder) belongs to — `none` or a seat id from the live options. |
| `table.add-items.decks.search` | Search your decks | `text` | — | — | W | — | Add Items ▸ Your Decks: filter this user's saved decks for the room's game. |

**Actions** (11)

| Action id | Label | Class | Target | Description |
|---|---|---|---|---|
| `table.add-items.close` | Close Add Items | R | — | Close the Add Items dialog. |
| `table.add-items.tab.basic` | Basic Items | R | — | Show the Basic Items tab. |
| `table.add-items.tab.mods` | Mod Items | R | — | Show the Mod Items tab. |
| `table.add-items.tab.toybox` | Toybox | R | — | Show the Toybox tab. |
| `table.add-items.tab.decks` | Your Decks | R | — | Show the Your Decks tab. |
| `table.add-items.spawn` | Add | W | `asset` | Spawn a basic item on the table. Target: its standard-object preset id. `table_spawn` is the semantic equivalent. |
| `table.add-items.spawn-mod-item` | Add | W | `asset` | Spawn one of a registered mod's items. Target: `<modId>:<item id or index>`. |
| `table.add-items.toybox-toggle` | Save to Toybox | W | `asset` | Add or remove a basic item from this user's Toybox. Target: its preset id. |
| `table.add-items.decks.previous` | Previous | R | — | Your Decks: previous page. |
| `table.add-items.decks.next` | Next | R | — | Your Decks: next page. |
| `table.add-items.spawn-holder` | Add card holder | W | — | Host: spawn a card holder owned by `table.add-items.holder-seat` (Add Items ▸ Basic Items). |

## `table.player-menu`

**Player menu** · surface `table` · singleton (no target)

How it opens: The player pill ▸ menu (seat and role).

**Fields** (1)

| Field id | Label | Kind | Unit | Target | Class | Range / options | Description |
|---|---|---|---|---|---|---|---|
| `table.player-menu.color` | Player Color | `select` | — | — | W | — | Claim a seat (colour): `none` or a free seat id from the live options. `table_seat` is the semantic equivalent. |

**Actions** (3)

| Action id | Label | Class | Target | Description |
|---|---|---|---|---|
| `table.player-menu.toggle` | Player menu | R | — | Open or close the player menu (your seat, play or watch, mod permissions). |
| `table.player-menu.permissions` | Mod permissions | R | — | Show what the loaded mods may do (hidden-information access in red). |
| `table.player-menu.spectator-toggle` | Watch instead | W | — | Switch between playing and watching (spectator) — the one place this lives. `table_seat` is the semantic equivalent. |

## `table.dice-dock`

**Dice dock** · surface `table` · singleton (no target)

How it opens: Toolbar ▸ Dice.

**Actions** (10)

| Action id | Label | Class | Target | Description |
|---|---|---|---|---|
| `table.dice-dock.toggle` | Dice | R | — | Show or hide the dice tray. |
| `table.dice-dock.clear-custody` | Clear | W | — | Remove the dice this user rolled and has not placed (a dice-clear intent, seat scope). |
| `table.dice-dock.roll-queued` | Roll | W | — | Tray closed: roll the queued selection again. |
| `table.dice-dock.target-tray` | Tray | W | — | Roll into the bounded tray in front of this user's seat. |
| `table.dice-dock.target-table` | Table | W | — | Roll onto the open table. |
| `table.dice-dock.tray-outline` | Show the roll tray outline | W | — | Show or hide the roll-tray outline on this device. |
| `table.dice-dock.zero-counts` | Set every count to zero | W | — | Reset the tray's per-die counts. |
| `table.dice-dock.roll` | Roll | W | — | Roll the selected dice (a dice-roll intent). Per-die counts are delegated to `table_intent`. |
| `table.dice-dock.roll-request` | Roll (requested) | W | — | Roll the dice the game's script asked this user's seat to roll (`world.requestRoll`; a `dice-request-roll` intent). Present only while a request for this seat is open — `table_snapshot`'s `diceRequests` lists them. The host rolls the request's own dice, area and auto-clear; the dock's own counts are set aside until it is answered. |
| `table.dice-dock.summary-dismiss` | Dismiss roll summary | R | — | Dismiss the last roll's summary. |

## `table.context-menu`

**Entity context menu** · surface `table` · target `entity`

How it opens: Right-click (or long-press) the entity.

**Actions** (5)

| Action id | Label | Class | Target | Description |
|---|---|---|---|---|
| `table.context-menu.counters` | Counters | R | `entity` | Open the card's counters flyout. |
| `table.context-menu.counters-clear` | Clear | W | `entity` | Remove every counter from the card (a card-overlay-set intent). |
| `table.context-menu.play-to` | Play to | R | `entity` | Card in the user's own hand: open the Play to ▸ submenu listing every play area the user may play into. |
| `table.context-menu.send-to` | Send to | R | `entity` | Entity in a play or discard area: open the Send to ▸ submenu (the other play areas, Back to hand, Discard pile). |
| `table.context-menu.draw-count` | Draw | R | `entity` | Deck: open the Draw ▸ submenu to draw 1, 2, 3, 4, 5, 7 or 10 cards at once. |

## `table.deck-search`

**Deck search** · surface `table` · target `entity`

How it opens: Deck context menu ▸ Search.

**Fields** (1)

| Field id | Label | Kind | Unit | Target | Class | Range / options | Description |
|---|---|---|---|---|---|---|---|
| `table.deck-search.query` | Search | `text` | — | `entity` | W | — | Deck search: narrow the privately browsed pile by name (or card id). A view filter only. Target: the searched container. |

**Actions** (7)

| Action id | Label | Class | Target | Description |
|---|---|---|---|---|
| `table.deck-search.view-carousel` | Carousel | R | — | Deck search: show the pile as a carousel. |
| `table.deck-search.view-grid` | Grid | R | — | Deck search: show the pile as a grid. |
| `table.deck-search.previous` | Previous card | R | — | Deck search carousel: turn to the previous card. |
| `table.deck-search.next` | Next card | R | — | Deck search carousel: turn to the next card. |
| `table.deck-search.clear` | Clear | R | — | Deck search: clear the search text and filters. |
| `table.deck-search.pull-selected` | Take this card | W | `entity` | Take the selected card (or one of the selected pieces) out of the searched container. Target: the container. |
| `table.deck-search.done` | Done | W | `entity` | End the search (the host re-hides the pile). Target: the container. |

## `table.peek`

**Peek** · surface `table` · target `entity`

How it opens: Deck context menu ▸ Peek.

**Fields** (1)

| Field id | Label | Kind | Unit | Target | Class | Range / options | Description |
|---|---|---|---|---|---|---|---|
| `table.peek.count` | Number of top cards to peek | `integer` | — | — | W | ≥ 1, step 1 | How many top cards the peek reveals, 1..pile size (the live max). Then `table.peek.confirm`. |

**Actions** (3)

| Action id | Label | Class | Target | Description |
|---|---|---|---|---|
| `table.peek.confirm` | Peek | W | — | Peek at the top `table.peek.count` cards (a peek object action; only this user sees them). |
| `table.peek.cancel` | Cancel | R | — | Cancel the peek prompt. |
| `table.peek.done` | Done | W | — | Close the revealed cards and end the peek. |

## `table.draw-tools`

**Draw and sticker tools** · surface `table` · singleton (no target)

How it opens: Toolbar ▸ Tools ▸ Draw or Stickers (host only).

**Fields** (4)

| Field id | Label | Kind | Unit | Target | Class | Range / options | Description |
|---|---|---|---|---|---|---|---|
| `table.draw-tools.color` | Color | `color` | — | — | W | — | Colour of the next drawn line or shape, [r, g, b] in 0..1. |
| `table.draw-tools.thickness` | Thickness | `slider` | — | — | W | ≥ 0.05, ≤ 2, step 0.05 | Stroke thickness of the next drawn line or shape, 0.05..2. |
| `table.draw-tools.stamp-scale` | Stamp Size | `slider` | — | — | W | ≥ 0.2, ≤ 4, step 0.1 | Scale multiplier of the next stamp, 0.2..4 (Stamp tool). |
| `table.draw-tools.stamp-rotation` | Rotation | `angle` | `degrees` | — | W | ≥ 0, ≤ 359, step 1 | Rotation of the next stamp in degrees, 0..359 (Stamp tool). |

**Actions** (8)

| Action id | Label | Class | Target | Description |
|---|---|---|---|---|
| `table.draw-tools.close` | Close draw tools | R | — | Hide the Draw Tools panel (the Draw tool stays active). |
| `table.draw-tools.mode.freehand` | Freehand | W | — | Draw tool shape: freehand strokes. |
| `table.draw-tools.mode.line` | Line | W | — | Draw tool shape: straight lines. |
| `table.draw-tools.mode.box` | Box | W | — | Draw tool shape: boxes. |
| `table.draw-tools.mode.circle` | Circle | W | — | Draw tool shape: circles. |
| `table.draw-tools.stamp-close` | Close stamp tools | R | — | Hide the Stamp Tools panel (the Stamp tool stays active). |
| `table.draw-tools.stamp-choose` | Choose stamp | W | `asset` | Use this saved stamp for the next placement. Target: the stamp id. |
| `table.draw-tools.more-stamps` | More Stamps | R | — | Open the stamp library. |

## `table.photo-mode`

**Photo mode** · surface `table` · singleton (no target)

How it opens: Toolbar ▸ View ▸ Photo mode (or Shift+P).

**Fields** (3)

| Field id | Label | Kind | Unit | Target | Class | Range / options | Description |
|---|---|---|---|---|---|---|---|
| `table.photo-mode.preset-name` | New preset name | `text` | — | — | W | — | Name for a photo-mode visibility preset (then `table.photo-mode.preset-save`). Stored on this device. |
| `table.photo-mode.resolution` | Resolution | `select` | — | — | W | `screen`, `1080p`, `1440p`, `4k` | Photo-mode capture resolution. Agents usually prefer `screenshot_viewport`. |
| `table.photo-mode.format` | Format | `select` | — | — | W | `png`, `webp` | Photo-mode capture file format. |

**Actions** (7)

| Action id | Label | Class | Target | Description |
|---|---|---|---|---|
| `table.photo-mode.hide-panel` | Hide panel | R | — | Hide the photo-mode panel (H). |
| `table.photo-mode.reset` | Reset to defaults | W | — | Show every photo-mode category again. |
| `table.photo-mode.preset-save` | Save | W | — | Save the current visibility as a preset named `table.photo-mode.preset-name`. |
| `table.photo-mode.capture` | Capture | W | — | Capture a photo (a download on /table; the editor's screenshots/ folder in a preview). Agents usually use `screenshot_viewport`. |
| `table.photo-mode.exit` | Exit | R | — | Leave photo mode. |
| `table.photo-mode.toast-action` | Download | W | — | The capture toast's action (download the capture again). |
| `table.photo-mode.toast-dismiss` | Dismiss | R | — | Dismiss the capture toast. |

## `table.hand`

**Hand drawer** · surface `table` · singleton (no target)

How it opens: Always mounted while seated with cards in hand.

**Fields** (3)

| Field id | Label | Kind | Unit | Target | Class | Range / options | Description |
|---|---|---|---|---|---|---|---|
| `table.hand.card-size` | Card size | `slider` | — | — | W | ≥ 0.6, ≤ 1.8, step 0.05 | Size of the cards in the on-screen hand drawer, as a multiple of the default (1). A per-user display preference. |
| `table.hand.rest-depth` | Hidden below screen | `slider` | — | — | W | ≥ 0, ≤ 0.9, step 0.02 | Fraction of a resting hand card hidden below the bottom of the screen (0 = fully shown). A per-user display preference; touch layouts keep their own value (default 0 — a tap raises a tucked card), desktop its own (default 0.62 — hover raises it). |
| `table.hand.hover-zoom` | Zoom | `slider` | — | — | W | ≥ 1, ≤ 2.5, step 0.05 | How much a hand card grows when you point at it — hovered with a mouse, tapped (selected) on touch — as a multiple of its resting size (1 = no zoom). A per-user display preference. |

**Actions** (3)

| Action id | Label | Class | Target | Description |
|---|---|---|---|---|
| `table.hand.tray-toggle` | Your hand | R | — | Touch layouts: expand or collapse the hand tray. |
| `table.hand.settings-toggle` | Hand display settings | R | — | Open or close the hand drawer's display settings (card size, how far below the screen cards rest, hover zoom). |
| `table.hand.settings-reset` | Reset | W | — | Put the hand drawer's display settings back to their defaults (a per-user preference). |

## `table.modals`

**Rules, exit and reset** · surface `table` · singleton (no target)

How it opens: Toolbar ▸ Rules / Exit / Reset.

**Actions** (9)

| Action id | Label | Class | Target | Description |
|---|---|---|---|---|
| `table.modals.rules-close` | Close the rules | R | — | Close the rules. |
| `table.modals.exit-cancel` | Cancel | R | — | Leave table? — stay at the table. |
| `table.modals.exit-save-first` | Save first… | R | — | Leave table? — open Save & Load instead of leaving. |
| `table.modals.exit-leave` | Leave game | H | — | Requires the user's confirmation in the DiceyTable tab. Disconnect from the room and go to the play hub (/play). After a Fully scripted game, the rematch lobby lists this player as having left. |
| `table.modals.exit-return-to-lobby` | Return to lobby | H | — | Requires the user's confirmation in the DiceyTable tab. Only after a Fully scripted game has ended: leave the table for the rematch lobby every returning player of this table is sent to (owned by the table's host, held for its players for 30 seconds). |
| `table.modals.reset-cancel` | Cancel | R | — | Reset the table? — keep the table as it is. |
| `table.modals.reset-confirm` | Reset table | H | — | Requires the user's confirmation in the DiceyTable tab. Replace every entity with the game's initial setup for everyone at the table (host only; cannot be undone). |
| `table.modals.rules-open` | Open rules document | R | `project` | Open one of the game's rules documents in the rules reader. Target: the rules document id. |
| `table.modals.rules-back` | All rules | R | — | Go back from an open rules document to the list of the game's rules. |

## `preview.banner`

**Preview banner** · surface `preview` · singleton (no target)

How it opens: Always mounted in a peerless preview.

**Actions** (2)

| Action id | Label | Class | Target | Description |
|---|---|---|---|---|
| `preview.banner.reload` | Reload preview | D | — | Reload the peerless preview from the saved draft. |
| `preview.banner.photo` | Photo mode | R | — | Enter photo mode in the preview. |

## `table.notices`

**Table notices** · surface `table` · singleton (no target)

How it opens: Raised by the table itself (a mod-set notice, a physics or graphics-device fault, an unverifiable join); not openable.

**Actions** (11)

| Action id | Label | Class | Target | Description |
|---|---|---|---|---|
| `table.notices.dont-join` | Don't join | W | — | Mod permissions could not be verified: cancel the join. |
| `table.notices.join-unverified` | Join without checking | H | — | Requires the user's confirmation in the DiceyTable tab. Join although nobody could verify whether this table's mods can read hidden information. |
| `table.notices.retry-verification` | Try again | W | — | Mod permissions could not be verified: check again. |
| `table.notices.session-dismiss` | Dismiss this notice | W | — | Dismiss the mod-set notice on this device. |
| `table.notices.restart-physics` | Restart physics | W | — | Physics halted: rebuild every rigid body and resume. Heavy; blocks the tab briefly. |
| `table.notices.physics-reload` | Reload the table | D | — | Physics halted: reload the page; the table restores from the host's snapshot. |
| `table.notices.gpu-reload` | Reload the table | D | — | Graphics device lost: reload the page; the table restores from the host's snapshot. |
| `table.notices.gpu-dismiss` | Dismiss | W | — | Dismiss the repeated graphics-device-loss notice. |
| `table.notices.graphics-lowered-settings` | Graphics settings | R | — | The table lowered this device's graphics level by itself (after a GPU reset, or sustained GPU-bound slow frames): open Settings ▸ Graphics, where Re-measure can raise it again. |
| `table.notices.graphics-lowered-dismiss` | Dismiss | W | — | Dismiss the "graphics level lowered automatically" notice. The lower level stays in use. |
| `table.notices.bots-paused-dismiss` | Dismiss | W | — | Dismiss the "a bot is paused: the host's device can't run it" notice on this device. The bot stays paused; `table_bots_list` reports it. |

## `table.capability-details`

**Mod permissions** · surface `table` · singleton (no target)

How it opens: Player menu ▸ Mod permissions (or the capability indicator).

**Actions** (1)

| Action id | Label | Class | Target | Description |
|---|---|---|---|---|
| `table.capability-details.close` | Close | R | — | Close the mod permissions summary. |

## `table.password-prompt`

**Table password** · surface `table` · singleton (no target)

How it opens: Opens when joining a table that needs a password; not openable.

**Actions** (2)

| Action id | Label | Class | Target | Description |
|---|---|---|---|---|
| `table.password-prompt.cancel` | Cancel | W | — | Abandon joining the password-protected table. |
| `table.password-prompt.join` | Join | H | — | Requires the user's confirmation in the DiceyTable tab. Join with the password the human typed (the agent never reads or types it). |

## `table.hand-sort`

**Sort my hand** · surface `table` · singleton (no target)

How it opens: Right-click your hand zone (long-press the hand tray on touch).

_No field or action is registered on this panel yet. `panel_open` can still open it, and `describe_panel` / `screenshot_panel` can read it._

## `table.multi-select`

**Select multiple (touch)** · surface `table` · singleton (no target)

How it opens: Touch layouts only: the select-multiple button.

**Actions** (2)

| Action id | Label | Class | Target | Description |
|---|---|---|---|---|
| `table.multi-select.enter` | Select multiple | R | — | Touch layouts: start selecting several entities; their shared actions appear in the bar. |
| `table.multi-select.done` | Done | R | — | Touch layouts: leave multi-select. |

## `table.touch-rail`

**Quick actions rail (touch)** · surface `table` · target `entity`

How it opens: Touch layouts only: select an entity.

**Actions** (3)

| Action id | Label | Class | Target | Description |
|---|---|---|---|---|
| `table.touch-rail.counters` | Counters | R | — | Touch layouts: open or close the selected card's counters. |
| `table.touch-rail.counters-close` | Close counters | R | — | Touch layouts: close the selected card's counters panel. |
| `table.touch-rail.gallery` | All actions | R | — | Touch layouts: open or close the gallery of every action for the selection. |

## `table.card-zoom`

**Card preview** · surface `table` · singleton (no target)

How it opens: Alt + hover (Alt + click pins) a card.

**Actions** (3)

| Action id | Label | Class | Target | Description |
|---|---|---|---|---|
| `table.card-zoom.zoom-out` | Zoom out | R | — | Zoom the pinned card preview out. |
| `table.card-zoom.zoom-in` | Zoom in | R | — | Zoom the pinned card preview in. |
| `table.card-zoom.close` | Close preview | R | — | Close the pinned card preview. |

## `table.stamp-library`

**Stamp library** · surface `table` · singleton (no target)

How it opens: Stamp tools ▸ More Stamps (host).

**Actions** (3)

| Action id | Label | Class | Target | Description |
|---|---|---|---|---|
| `table.stamp-library.close` | Close stamp library | R | — | Close the stamp library. |
| `table.stamp-library.use` | Use | W | `asset` | Use this stamp for the next placement. Target: the stamp id. |
| `table.stamp-library.remove` | Remove | W | `asset` | Remove this stamp from this browser's library (the last one cannot be removed). |

## `table.shortcuts`

**Keyboard shortcuts** · surface `table` · singleton (no target)

How it opens: Toolbar ▸ Help ▸ Keyboard shortcuts (or ?).

**Actions** (1)

| Action id | Label | Class | Target | Description |
|---|---|---|---|---|
| `table.shortcuts.close` | Close keyboard shortcuts | R | — | Close the keyboard shortcuts. |

## `table.bots`

**Bots** · surface `table` · singleton (no target)

How it opens: Settings ▸ Bots. Everyone sees the seated game bots; the add, seat, difficulty, resume and remove controls are the host's.

**Fields** (5)

| Field id | Label | Kind | Unit | Target | Class | Range / options | Description |
|---|---|---|---|---|---|---|---|
| `table.bots.difficulty` | Difficulty | `select` | — | `peer` | W | — | Host only: how strong one seated bot plays, applied from its next turn. Target: the bot's peer id (`bot:<id>`). Shown only for a bot that declares difficulties (`table_bots_set` is the same write). |
| `table.bots.seat` | Seat | `select` | — | `peer` | W | — | Host only: the seat one bot sits in — `none`, or a free seat id from the live options. A bot never takes a seat somebody holds. Target: the bot's peer id (`bot:<id>`). |
| `table.bots.add.bot` | Bot | `select` | — | — | W | — | Host only: which of the game's declared bots to add (a draft until `table.bots.add.confirm`). Each option says whether the bot is scripted or runs an AI model, and what device an AI one needs. |
| `table.bots.add.seat` | Seat | `select` | — | — | W | — | Host only: the seat the new bot takes (a draft until `table.bots.add.confirm`) — `auto` for the first open seat, or a free seat id from the live options. |
| `table.bots.add.difficulty` | Difficulty | `select` | — | — | W | — | Host only: the difficulty the new bot starts at (a draft until `table.bots.add.confirm`); defaults to the bot's own default. Shown only when the chosen bot declares difficulties. |

**Actions** (4)

| Action id | Label | Class | Target | Description |
|---|---|---|---|---|
| `table.bots.add.confirm` | Add bot | W | — | Host: seat the bot chosen in `table.bots.add.bot` at the chosen seat and difficulty. Refused, with the reason, for a bot the game does not declare, one bot too many, a taken seat, no seat left, or an AI bot this device cannot run (`table_bots_set` is the same write). |
| `table.bots.resume` | Resume | W | `peer` | Host: put a paused bot back in play. Refused while this device cannot run its AI model, and for a bot whose AI model crashed (the panel then shows the warning and `table.bots.retry-anyway`). Target: the bot's peer id (`bot:<id>`). |
| `table.bots.retry-anyway` | Retry anyway | W | `peer` | Host: after Resume was refused because the bot's AI model crashed, try the model again anyway and resume the bot. It may crash this tab again; only press it when the user asked to. Shown only after that refusal. Target: the bot's peer id (`bot:<id>`). |
| `table.bots.remove` | Remove | D | `peer` | Host: remove one bot from the table; its seat is freed and its turn slot goes. It can be added again, as a new bot. Target: the bot's peer id (`bot:<id>`). `table_bots_remove` is the semantic equivalent. |
