Skip to content

Roadmap, rest: studio, walkthroughs, the design step held by the instrument, blind pairwise preference, a second ticket - #6

Merged
junixlabs merged 5 commits into
mainfrom
claude/focused-carson-mj2px4
Oct 3, 2026
Merged

junixlabs merged 5 commits into
mainfrom
claude/focused-carson-mj2px4

Conversation

@junixlabs

Copy link
Copy Markdown
Owner

This PR adds the five commits that landed after #5 was merged. Together they finish the roadmap items an agent can carry out alone.

Studio, walkthroughs, schemas, library

  • uxcli studio [--serve] [--shot]: the project as a board, laid out like a design file.
    • Each step's screen appears as drawn, as built (findings pinned), and in each named version.
    • Pan and zoom, an outline, an inspector, and Context and Library tabs.
    • In serve mode a person can pick, ask for a redraw, or leave a note that becomes a redesign proposal.
    • Two versions can be compared on the board.
  • uxcli walkthrough <journey> [--as=<actor>] | check: the four questions of Wharton et al. (1994) at every step. A "yes" that the walk contradicts is refused.
  • Two new topic pools: navigation/IA (10) and motion/feedback (10).
  • Two new templates: content and mobile-app.
  • Trace and experience schemas.
  • context show names the template and the lens for each screen, and whether each screen has been drawn and picked.

The design step, held by the instrument

  • New policy key project.design: off | drawn | picked (default off).
    • A journey walk that finds no fail exits 3 (DESIGN STEP OPEN) while a screen it walked lacks two drawings and a complete lens review. Under picked it also needs a person's pick.
    • The run packet keeps a design block next to its verdicts, not among them. A fail still exits 2.
  • Gate: design-pairs.
  • before-done.md: the measured paragraph is unchanged and still matches its recorded hash. Exit 3 is explained in a new paragraph after it.

Blind pairwise preference

  • uxcli prefer make|serve|tally <study>:
    • Pictures are renamed so no file name reveals its group.
    • Each judge gets their own seeded order and left/right placement.
    • The server records which side each group was on; the page never contains that.
    • Only a person can submit a judgment.
    • tally reports a two-sided sign test.
  • Docs and gate: references/prefer.md; gate prefer-pairs.
  • The study is ready for designers to judge: experiments/understanding-before-design/study/ (skill vs ticket, 390×844, 10 pairs).

The experiment

Sonnet, fresh sessions, scored by the instrument.

Arm n Result
ticket alone / with the skill 10 / 10 first-run pass 0/10 vs 8/10
draw (screens undrawn) 20 0 drew; 20 built anyway
gate (drawn, three wordings) 30 0 drew unasked; 29 said the work was not done (exit 3)
asked (the ticket asks for the design step) 10 10/10 read the workspace lens, drew 2 variants per screen, wrote complete reviews, closed at exit 0
ticket 2: the agent decides the steps, skill / gate 10 / 10 20/20 recorded the outcome on the server; one tap 9.2 s ×18, two taps 11.9 s ×2
  • Library exit criterion: met when the design step is asked for. Agents do not take the design step up unasked. The gate makes skipping it impossible to report as done.
  • Ticket 2: the agent extends the journey with its own steps. Whether the outcome was really recorded is read from the server, not from the run.

Validation

  • uxcli gate passes locally on the final tree.
  • New suites: design, prefer.

Limits and what needs people

  • One model. The n/a share in agent reviews is about 40%.
  • asked rescore: it reads exit 3 with one screen open. The harness had not kept the workspace_ready reviews; it now keeps all of .uxcli/mockups/. The live scores are in the experiment README.
  • Waiting on people:
    • designers judging the pairwise study;
    • a human designer's agreement with walkthroughs.

🤖 Generated with Claude Code

https://claude.ai/code/session_011TUCUpbzmTpBE6ND7eHfzx


Generated by Claude Code

claude added 5 commits October 3, 2026 18:24
…e a person decides

`uxcli studio [dir] [--serve [--port=N]] [--shot=FILE] [--json]` builds
one page, .uxcli/studio/index.html, from what is under .uxcli/ and the
shipped library: each journey a band, its workflows side by side as
lanes, each step a column with the screen as drawn (variants A/B, the
pick), as built (the last walk's screenshot, experience findings pinned
where the browser found the element, a dashed bar when below the fold)
and as each named version left it, steps joined by arrows. Pan by
dragging, zoom by scroll or pinch, fit, an outline of every step with a
dot for findings and open picks, an inspector for the frame in hand
(variants and what the agent says of each, the pick, a redraw asked;
metrics, findings with sources, verdicts; a version's note and
numbers), and Context (actors, unknowns, insights) and Library (lenses,
templates) tabs. The model is inlined, so the page works from disk.

--serve runs it on 127.0.0.1, rebuilds and pushes a refresh when a file
under .uxcli/ changes, serves nothing outside .uxcli/, and takes the two
decisions a person makes there: choose a drawing, written as pick.json
with the drawing's hash, or ask for a redraw, written as revise.json —
each through the parser the file is read with, and neither overwrites.
--shot photographs the fitted board, so an agent working through the CLI
can look at the same thing the person does.

Skill: look at the board with --shot; send the person to --serve when a
pick is theirs. .uxcli/studio/ and .uxcli/experience/ are derived and
ignored.

Gate: studio-pairs (24) — one column per step, the pick and the
drawings on the board; a pick of a missing drawing refused, a valid one
written with its hash, a second refused, an empty redraw refused; the
server answering page and model, refusing a path outside .uxcli/ and an
unparseable pick; in Chrome no page error, drag and zoom move the
canvas, a frame fills the inspector, and the four page probes find no
fail on the board.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_011TUCUpbzmTpBE6ND7eHfzx
… walkthroughs, studio compare and notes

Library. Two topic pools researched from the source repositories of
USWDS, GOV.UK, Primer, Carbon, Polaris and the W3C, every quote checked
verbatim: navigation and information architecture (10) and motion and
feedback (10); the lenses carry 187 viewpoints. Templates `content`
(docs, help centres) and `mobile-app`. `template apply` records the
template in .uxcli/template.json, and `context show` names it, the lens
for each kind of screen, and the lens each screen of the journey was
reviewed against.

Evidence. schemas/trace.schema.json (a step of a walk; a typed value
stored instead of its hash does not fit) and experience.schema.json
(the report), held by the experience pairs.

Walkthrough. `uxcli walkthrough <journey> [--as=<actor>] [--for=…] |
check`: the four questions of Wharton, Rieman, Lewis & Polson (1994) at
every step of a walk, answered from its screenshot, as an actor the
project wrote. check refuses a step left out, an answer without why, a
no without where, a persona nobody wrote, an agent answering for nobody,
and a yes the walk contradicts (noticing a control measured below the
fold; progress where the step did not arrive). "No" and "unsure" are
findings, shown on the studio's inspector. Schema and
references/walkthrough.md.

Studio. Two named versions compare on the board; a note on a built
frame becomes a `redesign` proposal citing the walk; a frame's picture
opens on its own.

Gate: walkthrough-pairs (12), experience-pairs (46), studio-pairs (27),
template-pairs (28), lens-pairs (47).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_011TUCUpbzmTpBE6ND7eHfzx
… experiment scored on the walk

A page that had not changed at all after an action read as settled at
0 ms: a Save that answers after two silent seconds measured as instant.
The observer now marks the action's start, waits up to 2.5 s for the
first change when there has been none, records timing.firstChangeMs
(Nielsen's response, from the page's own clock), and during a wait past
a second whether a progress signal was shown (a progressbar, a busy
region, a visible status text). Live: a Save with a status message
answers in 79 ms; the silent one in 2051 ms with progressSeen false.
`experience` reads response from the first change; a wait with a signal
shown is not a finding until ten seconds. Trace schema and pairs (48).

The experiment scores each session on the walk too (score.mjs: the
happy workflow's estimate, scrolls and findings by metric), and
rescore.mjs scores every session again with one instrument, staging the
fixture with the page the session wrote. Three sessions an arm, Sonnet:
ticket alone 0/3, with the skill 3/3 at both viewports, the ticket
arm's pages leaving the call step unreached. Recorded in the
experiment's README; ROADMAP and VISION say what it shows and does not.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_011TUCUpbzmTpBE6ND7eHfzx
…a screen's journey

Ten fresh Sonnet sessions an arm, scored by `uxcli run` and `uxcli
experience` with one instrument: ticket alone 0/10, with the skill 8/10,
experience findings median 2 against 1 (the ticket arm's pages leave
the call step unreached). The two failing skill sessions ran only page
runs and never read the journey's card; `uxcli run <url>` now says which
journey and state a screen is, and sends the agent to `context show`
(src/core/journey-of.js, held by brief-pairs).

The draw arm removes the lead page's two drawings and records the
workspace template, so the sequence asks for a lens, variants and a
person's pick before building. `context show` now prints, per screen of
the journey, drawn / picked / neither, and BEFORE YOU BUILD for screens
with no drawing. Twenty sessions, ten before and ten after that line (8
of 10 saw it): 0/20 drew or reviewed, 20/20 built the page, 19/20 said
they had skipped the design step. The library's exit is measured and not
met; the README, ROADMAP, VISION and the mockups paragraph's record in
skills/pair.json say so and name the owner's decision it needs.

run.mjs gains the draw arm and records the lenses and template a
session reached for, what it drew and reviewed; summarize.mjs reports
them.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_011TUCUpbzmTpBE6ND7eHfzx
…nd ticket

- policy project.design (off | drawn | picked): a journey walk with no fail exits 3,
  DESIGN STEP OPEN, while a walked screen lacks two drawings and a lens review (or a
  person's pick); the run packet keeps the design block beside its verdicts; a fail
  keeps exit 2. context show says what the policy asks for. Gate: design-pairs.
- uxcli prefer make|serve|tally: blind pairwise preference — pictures renamed so
  nothing names a group, each judge's order and sides by their seed, the side
  recorded by the server, a judgment only a person's, a sign test in the tally.
  references/prefer.md. Gate: prefer-pairs.
- experiment: gate arm (three wordings, 30 sessions: 0 drew unasked, 29 said not
  done), asked arm (10/10 read the workspace lens, drew, reviewed, closed at exit 0),
  ticket 2 where the agent decides the steps (20/20 recorded the outcome on the
  server; one tap 9.2 s x18, two taps 11.9 s x2), and the skill-vs-ticket study for
  designers to judge. The fixture server gains the call-outcome API.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_011TUCUpbzmTpBE6ND7eHfzx
@junixlabs
junixlabs merged commit db06f92 into main Oct 3, 2026
2 checks passed
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.

2 participants