Skip to content

Quick Deck: the inspector shows the deck's own states (#507) - #508

Merged
ymote merged 4 commits into
mainfrom
feat/quickdeck-inspector-states
Oct 11, 2026
Merged

ymote merged 4 commits into
mainfrom
feat/quickdeck-inspector-states

Conversation

@ymote

@ymote ymote commented Oct 11, 2026

Copy link
Copy Markdown
Contributor

Why

Quick Deck v2 (#506) showed some inspector controls as off, or marked them by guessing, because the deck service didn't report their state:

  • a box's shrink-to-fit and vertical alignment;
  • a chart's legend, data labels, gridlines and palette;
  • a table's options;
  • the colour set's colours, the deck's colour set and font pair, and its footer.

#507 (merged as eb2fd5d) now reports all of these. This PR makes the controls show them, and keeps them showing the deck's own values after an Undo or a Redo. The maintainer has already approved the look; nothing is redesigned.

What

  • Contract. SERVICE.md: the inspector states (#507) appends the coordinator's section, verbatim, as its own commit.
  • Theme tab.
    • Every colour set shows its colours.
    • The deck's colour set and font pair are marked from deck.open and deck.state. A built-in theme's own font pair is named after the theme, so the pair with the same families is marked (Harbor's fonts are Classic's).
    • The footer controls show the deck's footer. Typing footer text turns the footer on.
    • A deck's own set or pair that isn't in the lists is named in a hint.
    • The Fonts hint now follows a theme change; it used to keep deck.open's missing fonts.
  • Format tab.
    • The Box switches show deck.format_state's anchor and autofit, with hints for resize, justified and distributed.
    • The chart's elements and palette show deck.slide's values. On main, a chart without a legend showed Legend on.
    • The table shows all six options with deck.slide's values (main showed three, at their defaults).
  • Undo, Redo and design changes.
    • After each one, deck.state and deck.slide bring the deck's own values back without reopening.
    • The inspector keeps its scroll (refresh_view), so the control just used stays in view. Before, it jumped to the top.
  • Small additions.
    • A .docx or .xlsx refused as unsupported: is explained in words.
    • Segments, colour sets, font pairs and palettes expose whether they're chosen (View.selected), so the tests can read them.
    • Long font pair names stay on one line.
  • Dev fixture. It answers the new fields as the service does, and keeps an undo history.
  • Model tests. New tests cover the new rules (27 tests in all).
  • Pixel maps. The notes for 02, 03 and 05 follow.
  • READMEs. Updated in both languages.

Tests

  • Model tests, on the Linux build host: cargo test --locked -p octosense-shell --lib quickdeck_model passes 27. With --features app-hub it passes 28.
  • App Hub card-host (macOS, 64 ms budget): fixture and states pass, light and dark, with no overrun in the final run.
    • The fixture journey checks every switch and mark against the stand-in.
    • It then changes a table option and the footer's date, and checks both against what the stand-in reports after each change and its Undo.
  • Real engine, in a hidden shell on Linux's headless weston. The shell was built from this branch on main eb2fd5d.
    • shell passes, light then dark, then restart. There are no script errors and no overruns, only the four harmless script_result dropped warnings seen before.
    • In the light pass, each of five states is read, changed, read back from the engine (by choosing the shape again, or asking deck.state again), undone, and read back once more:
      • Box: the Agenda box goes from top with shrink on, to bottom with shrink off, and back. The engine moves the text.
      • Chart: data labels go on (the engine draws the values) and back off.
      • Table: a new table's total row goes on and back off.
      • Colours: Ember changes to Ocean, and Undo brings back Ember.
      • Footer: slide numbers go on (the number shows on the slide) and back off.
  • Earlier failed rounds are recorded in apps/quickdeck/tests/evidence/inspector-states-20261011/receipt.json.
    • Two card-host rounds had one script time budget exceeded each, right after a PNG decode: an earlier dark fixture session, and one states-full run.
    • One card-host round lost a click while the app drew the covers.
    • The shell rounds found the scroll reset and the stale Fonts hint, both fixed here.

Frames (in apps/quickdeck/tests/evidence/inspector-states-20261011/)

  • Before and after: before-after/02-edit-text.png, 03-chart.png, 05-theme.png, 11-table.png, 12-footer.png, plus the d… dark versions. Main's app is on the left, this branch on the right, both on the same fixture.
  • Designs beside this branch: fixture/02-edit-text.png, 03-chart.png, 05-theme.png and the dark versions. These refresh v2's v2-20261011/fixture/ sheets for the screens that change.
  • Real engine: linux/10-box.png and 10b-box-undone.png, 11-chart and 11b, 12-table and 12b, 13-colours and 13b, 14-footer and 14b. linux/states.json records what the engine first reported.

Not verified

  • An imported deck whose own colour set or fonts aren't among the engine's: no such deck was opened with the real engine, so the hint that names them wasn't seen.
  • Real boxes with justified or distributed anchors, or resize autofit.
  • Opening a .docx or .xlsx from the device: the file dialog can't be driven in a hidden window.
  • A hidden shell on macOS, windows narrower than 1180 points, and phones.

🤖 Generated with Claude Code

ymote and others added 4 commits October 11, 2026 14:34
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The Theme tab marks the deck's colour set and font pair (deck.open and
deck.state's color_scheme and font_scheme; a built-in theme's own pair by
its families) and shows every colour set's colours and the deck's real
footer; the Format tab's Box switches show the box's anchor and autofit
(deck.format_state); a chart's elements and palette and a table's options
(now all six) show deck.slide's values. A change shows at once and the
service's next answer replaces it. After Undo or Redo, and after any design
change, deck.state and deck.slide bring the deck's own values back without
reopening, and the inspector keeps its scroll (refresh_view) so the control
just used stays in view. The Fonts hint follows a theme change, a .docx or
.xlsx refused as unsupported: is explained, and each segment, colour set,
font pair and palette says whether it's chosen (View.selected) for tools.
The pixel maps' notes follow.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The dev fixture answers #507's fields as the service does (colour sets
with their colours, the deck's colour set, font pair and footer, a box's
anchor and autofit, a chart's legend, data labels, gridlines and palette,
a table's options) and keeps an undo history of the deck's data. ui.py's
fixture journey checks the switches and marks against it, adds the table's
and the footer's controls, and checks a change and its Undo; the shell
journey's light pass changes a box's anchor and autofit, a chart's data
labels, a table's total row, the colour set and the footer, reads each back
from the engine and checks each Undo. --bundle and --grabs-only take
another bundle's frames for a before and after. The model tests cover the
new rules.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Both READMEs say what the inspector shows and how the runs check it;
tests/evidence/inspector-states-20261011 holds the designs beside the app
for 02, 03 and 05, main's app beside this branch's for those and the
table's and footer's controls, the real engine's frames of each state
following a change and its undo, and a receipt.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@ymote

ymote commented Oct 11, 2026

Copy link
Copy Markdown
Contributor Author

Local CI passed on 228958c (tools/ci-local.sh --only all --linux-host --offload, 14m30s, Darwin arm64; the ubuntu jobs and the macOS jobs' portable steps (their macOS steps ran here) on the Linux build host, Linux x86_64).

GitHub would run for this PR: desktop.yml, phone.yml, apps.yml. Merged on this local pass (macOS runner queue); GitHub CI runs on the merge commit on main.

Job Step Result Time
ci-local / drift The local mapping fits the workflows PASS -
desktop.yml / desktop Prepare the pinned framework sources PASS 1s
desktop.yml / desktop Compile the desktop with the shared runtime PASS 3m46s
desktop.yml / desktop Desktop tools and scripts PASS 16s
desktop.yml / desktop (linux) Prepare the pinned framework sources PASS 0s
desktop.yml / desktop (linux) One copy of every shell source PASS -
desktop.yml / desktop (linux) In-app updater and installer handoff PASS 1m37s
desktop.yml / desktop (linux) One Makepad, App Hub, octos and Rinx in the locked graph PASS 2s
desktop.yml / desktop (linux) The native apps' generated places match native-apps.json PASS 0s
desktop.yml / native-host-api Prepare the pinned framework sources PASS 0s
desktop.yml / native-host-api Build the native acceptance host and pinned Hub CLI PASS 37s
desktop.yml / native-host-api Signed app tool calls a real OS permission API PASS 3s
phone.yml / home Prepare pinned sources and the reviewed runtime patch PASS 0s
phone.yml / home Validate launcher icons and Apple asset catalogs PASS 3s
phone.yml / home Compile Home and its bundled modules PASS 3m09s
phone.yml / home (linux) Prepare pinned sources and the reviewed runtime patch PASS 0s
phone.yml / home (linux) Verify the single runtime graph PASS 2s
phone.yml / home (linux) The native apps' generated places match native-apps.json PASS 0s
phone.yml / home (linux) The pinned octos revision PASS 0s
phone.yml / home (linux) Build octos (unless cached) PASS -
phone.yml / home (linux) Build Home, App Hub admission and runtime policy tests PASS 3m18s
phone.yml / home (linux) Test Home, App Hub admission and runtime policy PASS 43s
phone.yml / home (linux) Two-lane scenario (real kernel, scripted model) PASS 27s
phone.yml / home (linux) Build opt-in AppCard tests PASS 2m43s
phone.yml / home (linux) Test opt-in AppCard PASS 2s
phone.yml / home (linux) Build craft-engine relay and system-chat tests PASS 2m59s
phone.yml / home (linux) Test craft-engine relay and system chat PASS 4s
phone.yml / home (linux) Build linked Terminal tests PASS 2m31s
phone.yml / home (linux) Test linked Terminal PASS 1s
phone.yml / home (linux) Build Wasm and runtime policy tests PASS 1m16s
phone.yml / home (linux) Test Wasm and runtime policy PASS 11s
apps.yml / services (linux) python3 tools/setup.py PASS 0s
apps.yml / services (linux) Shared system app interface PASS 0s
apps.yml / services (linux) Kernel service PASS 18s
apps.yml / services (linux) OctoSense release updater PASS 6s
apps.yml / services (linux) App peers PASS 28s
apps.yml / services (linux) AI providers config PASS 4s
apps.yml / services (linux) Connected provider protocols and Linux host adapter PASS 46s
apps.yml / services (linux) L0 in-card chat (sys.chat, host side) PASS 10s
apps.yml / services (linux) System toolbox (workflow templates) PASS 1m30s
apps.yml / kernel-security (linux) python3 tools/setup.py PASS 0s
apps.yml / kernel-security (linux) The pinned octos revision PASS 0s
apps.yml / kernel-security (linux) Build octos (unless cached) PASS -
apps.yml / kernel-security (linux) Real-kernel tests PASS 40s
apps.yml / apps (linux) python3 tools/setup.py PASS 0s
apps.yml / apps (linux) Host services (Mail, AI providers, News) PASS 2m06s
apps.yml / apps (linux) Connected accounts and Rinx editor PASS 1m31s
apps.yml / apps (linux) Shell AI services (crates/ai-host) PASS 2m55s
apps.yml / apps (linux) AppCard runtime setup safeguards PASS 0s
apps.yml / apps (linux) AppCard clippy (own crates; shared runtime compiles) PASS 28s
apps.yml / apps (linux) AppCard transport and store PASS 8s
apps.yml / apps (linux) One Makepad, App Hub, octos and Rinx in the locked graph PASS 4s
rom.yml / product (linux) python3 -m unittest discover -s tests -v SKIPPED (!) -
rom.yml / product (linux) Check generated Agent Binder client SKIPPED (!) -
rom.yml / product (linux) bash -n scripts/stage-forks.sh scripts/publish-release.sh scripts/apply-to-tree.sh scripts/build-rom.sh PASS -
rom.yml / web-installer (linux) npm ci --ignore-scripts --no-audit --no-fund SKIPPED (!) -
rom.yml / web-installer (linux) npm test SKIPPED (!) -
rom.yml / web-installer (linux) npx playwright install --with-deps chromium SKIPPED (!) -
rom.yml / web-installer (linux) npm run test:browser SKIPPED (!) -
rom.yml / web-installer (linux) python3 -m unittest discover -s tests -p test_installer_manifest.py -v SKIPPED (!) -
rom.yml / web-installer (linux) bash -n scripts/release.sh SKIPPED (!) -
linux-host / sandbox (linux) python3 tools/setup.py PASS 0s
linux-host / sandbox (linux) Process sandbox on Linux (Landlock, seccomp) PASS 1m48s

Skipped (these did NOT pass; (!) marks a skip that blocks tools/ci-local-merge.sh):

  • rom.yml / product (linux): python3 -m unittest discover -s tests -v: javac -version does not work here: install a JDK (17 or newer) and put its bin/ on PATH or set JAVA_HOME
  • rom.yml / product (linux): Check generated Agent Binder client: needs build-tools/35.0.0/aidl, platforms/android-35/framework.aidl in the Android SDK (no Android SDK found): install the SDK packages 'build-tools;35.0.0' and 'platforms;android-35' (sdkmanager) and set ANDROID_HOME
  • rom.yml / web-installer (linux): npm ci --ignore-scripts --no-audit --no-fund: no node, npm, npx on PATH (the workflow uses node 24); put node on PATH
  • rom.yml / web-installer (linux): npm test: no node, npm, npx on PATH (the workflow uses node 24); put node on PATH
  • rom.yml / web-installer (linux): npx playwright install --with-deps chromium: no node, npm, npx on PATH (the workflow uses node 24); put node on PATH
  • rom.yml / web-installer (linux): npm run test:browser: no node, npm, npx on PATH (the workflow uses node 24); put node on PATH
  • rom.yml / web-installer (linux): python3 -m unittest discover -s tests -p test_installer_manifest.py -v: no node, npm, npx on PATH (the workflow uses node 24); put node on PATH
  • rom.yml / web-installer (linux): bash -n scripts/release.sh: no node, npm, npx on PATH (the workflow uses node 24); put node on PATH

Notes:

  • GitHub runs Python 3.12; this run used Python 3.9.6
  • GitHub runs Python 3.12; the Linux host used Python 3.14.4

@ymote
ymote merged commit c459998 into main Oct 11, 2026
4 of 6 checks passed
@ymote
ymote deleted the feat/quickdeck-inspector-states branch October 11, 2026 22:37
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant