Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion docs/MAP.md
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ Rules live in `.claude/rules/`; depth docs are read-on-demand (`youcoded/docs/`,
| Error states (every user-facing failure message) | `youcoded/desktop/src/renderer/components/ui/states.tsx` (`<ErrorState>`: Retry, Report bug, Diagnose — at least one is required; Retry sits last)<br>`youcoded/desktop/src/renderer/utils/ipc-error.ts` (`plainMessage`: the transport's wording stripped from a failure) | react-renderer | `docs/error-message-standards.md` (never guess a cause; unknown is not none)<br>`docs/active/investigations/2026-09-10-error-inventory/README.md` (the audit; batches 2–7 open) | `youcoded/desktop/tests/error-state.test.tsx` |
| Multi-window session detach | `youcoded/desktop/src/renderer/components/SessionStrip.tsx` (both drag models; the pill menu)<br>`youcoded/desktop/src/renderer/session-drag-model.ts` (which model this platform runs, the drag payload)<br>`youcoded/desktop/src/renderer/components/SessionDropZone.tsx` (the chat area as a drop target, Wayland)<br>`youcoded/desktop/src/main/window-registry.ts` (who owns which session)<br>`youcoded/desktop/src/main/pending-acquire.ts` (handoffs for a window that has not mounted)<br>`youcoded/desktop/src/main/main.ts` → `registerDetachIpc()` (every detach channel, one function) | multi-window-detach | `docs/archive/handoffs/2026-09-04-session-drag-START-HERE.md` · `node scripts/platform-probe.mjs` (re-measure the window APIs on a machine) | `youcoded/desktop/tests/tearoff-handoff.test.ts`<br>`youcoded/desktop/tests/session-drag-model.test.ts` + ast-grep `preload-no-drag-model-decision` (preload reports facts, never a drag model, and never starts a drag)<br>`youcoded/desktop/tests/SessionStrip.test.tsx` (html-drag routing; a peer window's rows: close, drag, status)<br>`youcoded/desktop/tests/window-registry.test.ts`<br>`youcoded/desktop/tests/peer-session-status.test.ts` (which cross-window feed wins)<br>`youcoded/desktop/tests/use-attention-summary.test.ts` |
| UI Workbench (dev-only) | `youcoded/desktop/src/renderer/dev/workbench/`<br>`youcoded/desktop/src/renderer/index.tsx` (boot branch)<br>`scripts/run-workbench.sh` | react-renderer | `docs/archive/specs/2026-07-29-ui-workbench-design.md` | `youcoded/desktop/tests/mock-shim-window.test.ts`<br>`youcoded/desktop/tests/mock-shim.test.ts` |
| Screenshots by name (`shoot`) and click-through (`explore`), dev-only | `scripts/shoot/shoot.mjs` (CLI: names, tags, themes, before/after, `--check`)<br>`scripts/shoot/explore.mjs` + `explore-page.mjs` (step-at-a-time session: numbered controls, layers, `--dev` via run-dev.sh's marker)<br>`scripts/shoot/journeys.mjs` + `driver.mjs` (saved click paths, `youcoded/desktop/tests/journeys/`, run by verify.sh)<br>`scripts/shoot/engine.mjs` (photo-only build, free port, private tabs, ready-waits)<br>`youcoded/desktop/src/renderer/shoot-mode.tsx` (`useScreenOpen`, `ScreenMark`)<br>`youcoded/desktop/src/renderer/shoot-app-screens.ts` (App-owned openers)<br>`youcoded/desktop/src/renderer/dev/workbench/screens/` (the screen list, one file per area) | react-renderer | `scripts/shoot/README.md` · `docs/active/specs/2026-09-24-shoot-and-explore.md` | `youcoded/desktop/tests/shoot-build-guard.test.ts` (no photo-only code in the app or the site)<br>`youcoded/desktop/tests/shoot-screens.test.ts` (list ↔ registrations)<br>`node --test scripts/shoot/tests/*.test.mjs` (engine, explore)<br>`scripts/verify.sh` runs `shoot --check` (incl. one Escape per layered screen) and `journeys.mjs` on renderer changes |
| Screenshots by name (`shoot`) and click-through (`explore`), dev-only | `scripts/shoot/shoot.mjs` (CLI: names, tags, themes, before/after, `--check`)<br>`scripts/shoot/explore.mjs` + `explore-page.mjs` (step-at-a-time session: numbered controls, layers, `--dev` via run-dev.sh's marker)<br>`scripts/shoot/journeys.mjs` + `driver.mjs` (saved click paths, `youcoded/desktop/tests/journeys/`, run by verify.sh)<br>`scripts/shoot/engine.mjs` (photo-only build, free port, private tabs, ready-waits)<br>`youcoded/desktop/src/renderer/shoot-mode.tsx` (`useScreenOpen`, `ScreenMark`)<br>`youcoded/desktop/src/renderer/shoot-app-screens.ts` (App-owned openers)<br>`youcoded/desktop/src/renderer/dev/workbench/screens/` (the screen list, one file per area) | react-renderer | `scripts/shoot/README.md` · `docs/archive/specs/2026-09-24-shoot-and-explore.md` | `youcoded/desktop/tests/shoot-build-guard.test.ts` (no photo-only code in the app or the site)<br>`youcoded/desktop/tests/shoot-screens.test.ts` (list ↔ registrations)<br>`node --test scripts/shoot/tests/*.test.mjs` (engine, explore)<br>`scripts/verify.sh` runs `shoot --check` (incl. one Escape per layered screen) and `journeys.mjs` on renderer changes |
| UI review rig (dev-only) | `scripts/ui-review/shot.mjs` (the old plan driver, kept for the landing gallery; screenshots are `shoot`, row above)<br>`scripts/ui-review/tester-kit.md` `scripts/ui-review/ux-tester.md` `scripts/ui-review/code-reviewer.md` `scripts/ui-review/grader.md` `scripts/ui-review/contract-agent.md` (the feature flow's reviewer briefs)<br>`scripts/ui-review/plans/site-gallery.json` (the landing gallery; the rest archived)<br>`scripts/ui-review/review-cards.py` + `scripts/ui-review/deck/` (the review deck — the one page Destin answers on: `build` / `preview` (pictures of it before he sees it) / `serve` / `wait` / `selfie` (the deck reviewed on a deck) / `contract-check` / `acceptance`)<br>`scripts/ui-review/templates/` (one worked spec per slide kind, `tryit.json` included)<br>`scripts/ui-review/deck/AUTHORING.md` (every field, the page grammar, the refusals, the answers file)<br>`scripts/ui-review/deck/live.py` (live panes: the pane address, served by the deck itself under `/app/`; a pane shows an authored candidate OR a real screen of the app)<br>`scripts/ui-review/design-check/` (design-check warnings matched to the exact element they style, for a before/after deck — `UI_REVIEW_COLLECT` in `shot.mjs` records the elements) | react-renderer · feature-flow · review-deck | `scripts/ui-review/README.md` · `scripts/ui-review/deck/AUTHORING.md` · `docs/active/design/2026-08-25-ui-design-guide.md` | `cd scripts/ui-review/tests && python3 -m unittest test_spec test_tokens test_live test_words test_contract` (also in `workspace-ci.yml`); the rest need `magick`/Chrome — `python3 -m unittest discover -s scripts/ui-review/tests -t scripts/ui-review/tests -p 'test_*.py'` + `node --test scripts/ui-review/tests/deck-render.test.mjs`; `coverage.md` from the last sweep (103/104 on 2026-08-25); `scripts/workbench-boot-check.mjs` guards the switches the plans use |
| Landing page + demo clips (live at youcoded.ai via `youcoded/docs/CNAME`; the old itsdestin.github.io/youcoded address redirects there) | `youcoded/docs/index.html` (the site)<br>`scripts/ui-review/site-assets.sh` (regenerate every loop/still/embed)<br>`scripts/ui-review/record.mjs` + `scripts/ui-review/scenes/` (one JSON per clip)<br>`scripts/ui-review/site-copy-editor.py` (**Destin edits the real page himself** — `serve youcoded/docs/index.html`, every text block editable in place, Submit writes `edits.md` next to the page)<br>`scripts/ui-review/copy-preview.py` (in-place copy + loop review)<br>`youcoded/desktop/src/renderer/dev/workbench/fixtures/replies/` (what the demo "model" says) | landing-page | `scripts/ui-review/README.md` → "Editing copy on the site" · `docs/archive/specs/2026-08-27-landing-page-rebuild-design.md` | `scripts/ui-review/tests/test_site_copy_editor.py` (marking, exact-`a`, nesting, save output — in `workspace-ci.yml`)<br>`workbench-reply-script`, `workbench-fixture-actions`, `workbench-mock-contract` tests; `site-assets.sh` refuses unverified shots |
| Promo video (the Reddit cut shipped 2026-09-04, the second cut 2026-09-09; the tooling stays for the next film, dev-only) | `scripts/promo/README.md` (START HERE: the pipeline, Destin's rules — drafts are his call, iterate on stills — every tool, the change table, the lessons)<br>`scripts/promo/music/song.py` (`promo` target: the track, its beat grid, the SFX)<br>`scripts/ui-review/scenes/promo-flappy.json` and its `promo-*` siblings + `scripts/ui-review/scenes/flappy-pilot.js`<br>`scripts/promo/film.sh` (films them into scripts/promo/public/footage/ — gitignored — with a marks file each)<br>`scripts/promo/src/` (Remotion: `scripts/promo/src/timeline.ts` the beat list in film order, `scripts/promo/src/beats/beat.ts` the presenter rule — `present()` turns a beat's lines, each naming its TARGET, into stands, aimed arms and bubbles, and throws when a line cannot be read in its slot — `scripts/promo/src/beats/Beat1.tsx` and its siblings one per section, `scripts/promo/src/host/engine.ts` the host's actions, `scripts/promo/src/Promo.tsx` the assembly)<br>`scripts/promo/cues.sh` (every bubble, 2 s, no browser) · `still-sheets.sh` (one still per line off one bundle, no draft) · `line-sheets.sh` (the same from a draft) · `script-editor.py` (Destin's editor: frames, word budgets, drag-reorderable sections)<br>`scripts/promo/render.sh` (final H.264 + two-pass loudnorm + silent variant) | landing-page (copy rules) | `docs/archive/handoffs/2026-09-03-promo-video-START-HERE.md` (how the first film was iterated) · `docs/archive/specs/2026-09-03-promo-video-design.md` · `docs/archive/prototypes/promo-2026-09/` (every check-in, study and sheet) · `scripts/ui-review/README.md` → "Recording a loop" | `cd scripts/promo/music && python3 -m unittest test_song` (grid, levels, the silent half-beat); `node --test scripts/ui-review/autopilot.test.mjs`; `cd scripts/promo && npm test` (every beat starts on its downbeat; the bars tile; captions pinned to the spec) |
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
---
date: 2026-09-24
status: active
status: shipped
type: investigation
topic: How to make YouCoded's screenshot and UI-review tools near-instant and easy to aim at any set of screens — measured causes, a working prototype, ranked proposals and the decisions Destin must make
---
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
---
status: active
status: shipped
---
# Explore trial — speed settings + rename (2026-09-26)

Expand Down
Original file line number Diff line number Diff line change
@@ -1,16 +1,16 @@
---
date: 2026-09-24
status: draft
status: shipped
type: spec
topic: Replace the screenshot/UI-review tooling with two simple tools on one engine — `shoot` (open named screens directly and photograph them, no clicking) and `explore` (a live click-through for AI reviewers) — plus a small set of saved journeys
origin: Destin, 2026-09-24 — "the simplest possible version of the system that works as fast as possible, that has the fewest possible error cases, that requires the least thinking … from the model"; keep click paths for AI reviewers as a separate path
revision: 2 — independent review folded in (see "What changed from revision 1")
related: docs/active/investigations/2026-09-24-screenshot-infra-speed.md
related: docs/archive/investigations/2026-09-24-screenshot-infra-speed.md
---

# `shoot` and `explore`: one engine, two jobs

Evidence for every measured number here is in `docs/active/investigations/2026-09-24-screenshot-infra-speed.md`.
Evidence for every measured number here is in `docs/archive/investigations/2026-09-24-screenshot-infra-speed.md`.
Anything marked *estimate* is measured in phase 1 before anyone relies on it.

## The two jobs
Expand Down Expand Up @@ -234,7 +234,7 @@ Replaces: plan-writing in `tester-kit.md`, `ui-probe.mjs`, `drag-probe.mjs`,
## Progress (2026-09-26)

- **Phase 1 done** — engine, `shoot`, photo-only build + guard, Settings; Destin kept all 7
slides of the old-vs-new review (`docs/active/design/2026-09-24-shoot/`).
slides of the old-vs-new review (`docs/archive/design/2026-09-24-shoot/`).
- **Phase 2 done** — deck save status, stable address, merge on 409 and on reload; selfie
review kept (3/3).
- **Phase 3 done** — 162 screens across settings, chat, marketplace, projects, pages, games,
Expand Down Expand Up @@ -277,7 +277,7 @@ Replaces: plan-writing in `tester-kit.md`, `ui-probe.mjs`, `drag-probe.mjs`,
eval by design — removing it would bring back throwaway CDP scripts), and `drag-probe.mjs` /
`drag-fuzz.mjs` stay (per-frame drag numbers `explore` cannot give; now on port 0).
`montage-ab.sh` stays with `record-pair.sh` for clip decks. Selfie review of the deck change:
`docs/active/design/2026-09-24-shoot/selfie-2/`.
`docs/archive/design/2026-09-24-shoot/selfie-2/`.

## Order of work

Expand Down
5 changes: 4 additions & 1 deletion docs/roadmap/dev-workspace.md
Original file line number Diff line number Diff line change
Expand Up @@ -474,7 +474,10 @@ seen-on is always n/a here.
`Emulation.setFocusEmulationEnabled`, without which headless `:focus` never matches and
the first run reported the focused style as absent). The want is `--drag x1,y1,x2,y2`
and focus emulation on by default, beside `--hover`
`n/a` `confirmed` `checked 2026-09-10`
**Half done 2026-09-26:** real input exists now — `scripts/shoot/explore.mjs` hovers,
presses, drags and types through CDP `Input`, and the tester kit uses it. Still missing:
touch and a 1.5× scale in `explore`/`shoot` (a tester still cannot claim to cover either)
`n/a` `confirmed` `checked 2026-09-26`

- [ ] Three copies of "which youcoded checkout do you mean?" exist, and each knows a
different subset of the layouts: `scripts/lib/resolve-checkout.sh` (run-workbench),
Expand Down
2 changes: 1 addition & 1 deletion scripts/shoot/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -111,4 +111,4 @@ then run `journeys.mjs <name>` three times.
`shoot --check` also presses Escape once on every screen with something open and fails unless
exactly the top layer closed.

Spec: `docs/active/specs/2026-09-24-shoot-and-explore.md`. Tests: `node --test scripts/shoot/tests/*.test.mjs`.
Spec: `docs/archive/specs/2026-09-24-shoot-and-explore.md`. Tests: `node --test scripts/shoot/tests/*.test.mjs`.
4 changes: 2 additions & 2 deletions scripts/shoot/engine.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,8 @@
// practice app, serve it on a free port, drive a pool of headless Chrome tabs.
// Nothing here is configured by the caller beyond "which checkout".
//
// Spec: docs/active/specs/2026-09-24-shoot-and-explore.md → "The engine".
// Evidence for every choice below: docs/active/investigations/2026-09-24-screenshot-infra-speed.md.
// Spec: docs/archive/specs/2026-09-24-shoot-and-explore.md → "The engine".
// Evidence for every choice below: docs/archive/investigations/2026-09-24-screenshot-infra-speed.md.
import { spawn, execFileSync } from 'node:child_process';
import { createHash } from 'node:crypto';
import { createServer } from 'node:http';
Expand Down
2 changes: 1 addition & 1 deletion scripts/shoot/explore.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@
//
// One session per workspace worktree; it stops itself after 10 minutes idle, and `start`
// stops any earlier one. Pictures: scratch/explore/<time>/. Spec:
// docs/active/specs/2026-09-24-shoot-and-explore.md → "Tool 2: explore".
// docs/archive/specs/2026-09-24-shoot-and-explore.md → "Tool 2: explore".
//
// --dev attaches to an isolated dev window started by `bash scripts/run-dev.sh` — only one
// that left its marker file (desktop/.dev-instances/). The installed app never writes one,
Expand Down
2 changes: 1 addition & 1 deletion scripts/shoot/journeys.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@
// A failure names the step, what it looked for, and what WAS on screen, with a picture.
// When a button was simply renamed, change that label in the journey's JSON — the journey
// lives in the same repo as the button, so the fix rides in the same commit.
// Spec: docs/active/specs/2026-09-24-shoot-and-explore.md → "Saved journeys".
// Spec: docs/archive/specs/2026-09-24-shoot-and-explore.md → "Saved journeys".
import { existsSync, mkdirSync, readdirSync, readFileSync, writeFileSync } from 'node:fs';
import { dirname, join, resolve } from 'node:path';
import { fileURLToPath } from 'node:url';
Expand Down
2 changes: 1 addition & 1 deletion scripts/shoot/shoot.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
// shoot — photograph named screens of the practice app. No clicking: every screen
// opens directly by name (the screen list lives in the app,
// desktop/src/renderer/dev/workbench/screens/). Spec:
// docs/active/specs/2026-09-24-shoot-and-explore.md.
// docs/archive/specs/2026-09-24-shoot-and-explore.md.
//
// shoot settings/* every Settings screen, the default themes
// shoot settings/sound settings/about --themes all any names, every theme
Expand Down
2 changes: 1 addition & 1 deletion scripts/ui-review/deck/live.py
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@
a server started later cannot disagree about the address — which is what makes
`serve --no-build` safe.

WHY relative addresses (2026-09-26, docs/active/specs/2026-09-24-shoot-and-explore.md → "Review
WHY relative addresses (2026-09-26, docs/archive/specs/2026-09-24-shoot-and-explore.md → "Review
decks"): a live pane used to point at a FIXED port (`run-workbench.sh` on 5173+340), which
collided between sessions and lost its panes whenever the deck itself was restarted. The deck
now serves the practice app itself, under its own address, as `/app/index.html` — so a pane
Expand Down
2 changes: 1 addition & 1 deletion scripts/ui-review/dom-size-sweep.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@
// per-surface stress pins (vitest, in verify.sh) already cover list by list.
//
// HOW IT OPENS SURFACES (rewritten onto the `shoot`/`explore` engine,
// docs/active/specs/2026-09-24-shoot-and-explore.md): it builds and serves its own
// docs/archive/specs/2026-09-24-shoot-and-explore.md): it builds and serves its own
// photo-only copy of the app (scripts/shoot/engine.mjs — a free port, no cdp-ports.sh,
// no run-workbench.sh), reads the app's own screen list
// (desktop/src/renderer/dev/workbench/screens/*.ts via `window.__youcodedScreens.list()`),
Expand Down
2 changes: 1 addition & 1 deletion scripts/ui-review/plans/archive/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
One-off plans from past design rounds: before/after captures, numbered review rounds
(`-r2`…`-r6`), design variants that were decided (`games-board-*`, `games-chess-*`,
`pages-floating`, `pages-layouts`), and plans that duplicated a screen another plan owns.
Archived 2026-09-26 with Destin's approval (docs/active/specs/2026-09-24-shoot-and-explore.md).
Archived 2026-09-26 with Destin's approval (docs/archive/specs/2026-09-24-shoot-and-explore.md).

The rest of the old sweep's plans joined them when that sweep was retired (2026-09-26, spec
phase 6): every screen they photographed is a named screen now (`shoot --list`), and the paths
Expand Down
Loading