Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
139 commits
Select commit Hold shift + click to select a range
2a80003
feat(web): restore stop-thread action in sidebar and header [L02]
Mjones13 Oct 4, 2026
5c400b9
Merge qualified rebuild foundation and migrations into stop-menu layer
Mjones13 Oct 4, 2026
b7b7f44
fix(web): preserve draft ownership during failed sends [L03]
Mjones13 Oct 4, 2026
1a4297b
Merge commit '5c400b9985438f1357fe85b76c4e4c333cf94a9d' into work/jon…
Mjones13 Oct 4, 2026
450b1a1
feat(web): restore active-thread sidebar filter [L08]
Mjones13 Oct 4, 2026
a6b7f3e
Merge commit '1a4297b95ee7f1c2fc350f05c50e3e18ef6ddfef' into work/jon…
Mjones13 Oct 4, 2026
6f7b7b6
feat: promote next queued message with empty Enter
Mjones13 Oct 4, 2026
89df4f3
Merge active-thread sidebar parent into queued Enter layer
Mjones13 Oct 4, 2026
37eee3b
fix(codex): preserve account-local SQLite maintenance locks [L13]
Mjones13 Oct 4, 2026
1827478
Merge current rebuild staging into L13 home-lock port
Mjones13 Oct 4, 2026
293d399
Prove OpenCode buffered replies survive native stream exit
Mjones13 Oct 4, 2026
f714ade
Merge commit 'e319bef31435f5c9c50a234f4f6b96f4fd8a6400' into work/jon…
Mjones13 Oct 4, 2026
ffe1830
fix(checkpoints): reject capture in primary Git checkouts
Mjones13 Oct 4, 2026
ce26f73
Merge rebuilt staging into checkpoint safety port
Mjones13 Oct 4, 2026
4f14b11
test(checkpoints): verify primary refusal retires local run
Mjones13 Oct 4, 2026
8114b4b
Merge current rebuild staging into Codex home lock fix
Mjones13 Oct 4, 2026
4a31308
feat(mcp): defer caller self-settlement until successful completion […
Mjones13 Oct 4, 2026
3c5f80b
Merge qualified staging parent into self-settlement rebuild
Mjones13 Oct 4, 2026
4ee20fe
Merge pull request #107 from Jones-Systems/work/jones-rebuild/L19-ope…
Mjones13 Oct 5, 2026
ee8539a
feat(mcp): restore persistent peer message blocking [L24]
Mjones13 Oct 5, 2026
5209843
fix(mcp): register deferred settlement presentation
Mjones13 Oct 5, 2026
f3093a0
Merge branch 'work/jones-rebuild/L23-self-settlement' into work/jones…
Mjones13 Oct 5, 2026
0ad04f1
Merge pull request #109 from Jones-Systems/work/jones-rebuild/L23-sel…
Mjones13 Oct 5, 2026
9cb907a
Merge qualified staging into peer-block layer
Mjones13 Oct 5, 2026
a33161e
feat(desktop): support explicit isolated client profiles
Mjones13 Oct 5, 2026
b072ea5
fix(worktrees): accept messages before the default base resolves
Mjones13 Oct 5, 2026
bbc7d90
feat(conversations): add authenticated local conversation library
Mjones13 Oct 5, 2026
3aa46c4
feat(contracts): restore guarded native creation contracts and storage
Mjones13 Oct 5, 2026
38c1442
feat(usage): restore saved token accounting and date details
Mjones13 Oct 5, 2026
e8d8590
Checkpoint desktop runtime identity source for dependent ports
Mjones13 Oct 5, 2026
c1ef5f0
Merge pull request #110 from Jones-Systems/work/jones-rebuild/L24-pee…
Mjones13 Oct 5, 2026
a2702bd
test(checkpoints): give replay fixtures linked worktrees
Mjones13 Oct 5, 2026
4db9324
Merge checkpoint fixture repair into graceful start
Mjones13 Oct 5, 2026
7676f01
feat(desktop): prepare Jones Code branding
Mjones13 Oct 5, 2026
96a34d1
Merge pull request #108 from Jones-Systems/work/jones-rebuild/L21-che…
Mjones13 Oct 5, 2026
093237f
Merge verified staging into graceful start
Mjones13 Oct 5, 2026
ac71fe0
merge: synchronize desktop profile layer with qualified staging
Mjones13 Oct 5, 2026
670d4c8
feat(orchestration): persist observed provider runtime identity
Mjones13 Oct 5, 2026
4d7f907
merge: synchronize desktop identity with profile parent
Mjones13 Oct 5, 2026
cd66f55
merge: synchronize desktop branding with identity parent
Mjones13 Oct 5, 2026
b6f865e
feat(desktop): restore isolated UI evidence harness [L30]
Mjones13 Oct 5, 2026
ba8ed5a
Merge commit '96a34d1191418af7170728c6638df4b51b9e7292' into work/jon…
Mjones13 Oct 5, 2026
6dbec06
Merge commit '89df4f36258d5f12d7bf924bbebe4c182ebbdeb1' into work/jon…
Mjones13 Oct 5, 2026
406ae08
feat(web): restore compact host CPU and available RAM indicators
Mjones13 Oct 5, 2026
99f3391
fix(usage): reconcile accounting port with nightly staging [L28]
Mjones13 Oct 5, 2026
8a0a510
feat(conversations): register library on current nightly staging [L27]
Mjones13 Oct 5, 2026
f060f2a
fix(native-creation): qualify recovered contracts on current staging
Mjones13 Oct 5, 2026
ed3f6e1
Merge pull request #102 from Jones-Systems/work/jones-rebuild/L13-cod…
Mjones13 Oct 5, 2026
9fd8a44
feat(voice): restore held draft review on nightly
Mjones13 Oct 5, 2026
ccf20f5
feat(web): restore bounded image and PDF preview zoom
Mjones13 Oct 5, 2026
dee3adb
Merge pull request #125 from Jones-Systems/work/jones-rebuild/A6-deli…
Mjones13 Oct 5, 2026
baddf37
fix(voice): bind review to current environment supervisor and native …
Mjones13 Oct 5, 2026
0416c3c
feat(queue): deliver queued follow-ups at safe tool boundaries [L25]
Mjones13 Oct 5, 2026
53f56b2
fix(conversations): bind the nightly connection supervisor service [L27]
Mjones13 Oct 5, 2026
c745c61
style(desktop): format isolated evidence harness
Mjones13 Oct 5, 2026
588486c
feat(pr): restore CI queue and runner status [L29]
Mjones13 Oct 5, 2026
c77f685
test(codex): preserve strict legacy replay without goal capability [L16]
Mjones13 Oct 5, 2026
d112232
Merge pull request #112 from Jones-Systems/work/jones-rebuild/L22-gra…
Mjones13 Oct 5, 2026
19de7fd
Merge pull request #120 from Jones-Systems/work/jones-rebuild/A3-deli…
Mjones13 Oct 5, 2026
f471c8c
style(desktop): format preview identity integration tests
Mjones13 Oct 5, 2026
bc288ec
feat(web): restore content-sized expanded markdown tables
Mjones13 Oct 5, 2026
4f7749d
merge: synchronize L29 with qualified L28 usage parent
Mjones13 Oct 5, 2026
0b8c53f
fix(orchestration): qualify runtime identity and strict replay [L18]
Mjones13 Oct 5, 2026
278aac6
fix(conversations): bind HTTP library context and preserve case tables
Mjones13 Oct 5, 2026
6db2397
fix(desktop): reject preview identity payloads and repair metadata fi…
Mjones13 Oct 5, 2026
bc74e93
style(desktop): format isolated profile tests
Mjones13 Oct 5, 2026
a2b2d30
feat(composer): add account and effort shortcuts with current defaults
Mjones13 Oct 5, 2026
f97074e
fix(pr): keep CI presentation private to its component
Mjones13 Oct 5, 2026
4b57555
fix(server): type pending preview status receipt before flipping
Mjones13 Oct 5, 2026
4f8cf49
merge: include exact L09 profile formatting repair
Mjones13 Oct 5, 2026
745c0d8
merge: include exact preview identity formatting repair
Mjones13 Oct 5, 2026
4deba6b
merge: include exact strict payload and metadata fixture repairs
Mjones13 Oct 5, 2026
d3012f2
merge: include exact preview broker receipt typing repair
Mjones13 Oct 5, 2026
ec5266b
Merge pull request #95 from Jones-Systems/work/jones-rebuild/L02-stop…
Mjones13 Oct 5, 2026
4da7063
fix(pr): place CI title spacing on its wrapper
Mjones13 Oct 5, 2026
7fa80b8
Merge pull request #121 from Jones-Systems/work/jones-rebuild/A4-deli…
Mjones13 Oct 5, 2026
d5959b9
Merge pull request #126 from Jones-Systems/work/jones-rebuild/A4-deli…
Mjones13 Oct 5, 2026
519512f
feat(server): prepare durable V2 update continuations
Mjones13 Oct 5, 2026
c36dc81
Merge pull request #124 from Jones-Systems/work/jones-rebuild/A5-deli…
Mjones13 Oct 5, 2026
434c9e6
test(server): bind memory fixture startup dependencies
Mjones13 Oct 5, 2026
f43d477
Merge staging d5959b9 into L28 usage delivery
Mjones13 Oct 5, 2026
1563c02
Merge pull request #134 from Jones-Systems/work/jones-rebuild/A1-deli…
Mjones13 Oct 5, 2026
b3173fb
Merge pull request #138 from Jones-Systems/work/jones-rebuild/A3-deli…
Mjones13 Oct 5, 2026
5237156
fix(orchestration): require explicit queued boundary admission
Mjones13 Oct 5, 2026
c6e190a
Merge commit '0b8c53fb239eb1f4701470c1c76cd12e128aca41' into work/jon…
Mjones13 Oct 5, 2026
028b549
Merge pull request #142 from Jones-Systems/work/jones-rebuild/A3-deli…
Mjones13 Oct 5, 2026
67207ac
merge: sync accepted L18 replay and export repair checkpoint
Mjones13 Oct 5, 2026
6648273
Merge commit 'd5959b9aec30952da3b4c32ea42068b07361632a' into work/jon…
Mjones13 Oct 5, 2026
1746dbe
Merge commit '028b549aca6ab586a716d05102e5acaf07a9b822' into work/jon…
Mjones13 Oct 5, 2026
6394448
Merge commit 'd5959b9aec30952da3b4c32ea42068b07361632a' into work/jon…
Mjones13 Oct 5, 2026
5e09ba7
test(desktop): register branding cases without a test loop
Mjones13 Oct 5, 2026
cae6a6a
Merge pull request #96 from Jones-Systems/work/jones-rebuild/L03-comp…
Mjones13 Oct 5, 2026
5bed9d6
Merge pull request #147 from Jones-Systems/work/jones-rebuild/A3-deli…
Mjones13 Oct 5, 2026
b27fb14
Merge pull request #122 from Jones-Systems/work/jones-rebuild/A5-deli…
Mjones13 Oct 5, 2026
9ee11ce
Merge pull request #130 from Jones-Systems/work/jones-rebuild/A1-deli…
Mjones13 Oct 5, 2026
273edfb
Merge pull request #132 from Jones-Systems/work/jones-rebuild/A4-deli…
Mjones13 Oct 5, 2026
b8c990b
Merge staging 273edf into L29 CI status delivery
Mjones13 Oct 5, 2026
f8c29b2
Merge pull request #133 from Jones-Systems/work/jones-rebuild/A5-deli…
Mjones13 Oct 5, 2026
faeb0cc
Merge pull request #118 from Jones-Systems/work/jones-rebuild/L12-des…
Mjones13 Oct 5, 2026
03c46f4
Merge pull request #103 from Jones-Systems/work/jones-rebuild/L16-goa…
Mjones13 Oct 5, 2026
eefff16
chore: synchronize continuation with L18 parent
Mjones13 Oct 5, 2026
f32c493
Merge pull request #115 from Jones-Systems/work/jones-rebuild/L09-des…
Mjones13 Oct 5, 2026
0c94b09
chore: synchronize queued delivery with current staging
Mjones13 Oct 5, 2026
bfbc8b7
Merge pull request #143 from Jones-Systems/work/jones-rebuild/A1-deli…
Mjones13 Oct 5, 2026
5dc92d3
Merge branch 'work/jones-rebuild/L08-active-pill' of https://github.c…
Mjones13 Oct 5, 2026
975a03e
Merge branch 'work/jones-rebuild/staging' of https://github.com/Jones…
Mjones13 Oct 5, 2026
98360d2
Merge pull request #128 from Jones-Systems/work/jones-rebuild/A1-deli…
Mjones13 Oct 5, 2026
7276143
Merge pull request #117 from Jones-Systems/work/jones-rebuild/L11-des…
Mjones13 Oct 5, 2026
50f6305
Checkpoint V2 queue compatibility receiving contracts
Mjones13 Oct 5, 2026
f3595f4
merge: retain qualified L18 identity and Startup ancestry in L26
Mjones13 Oct 5, 2026
8e5d251
fix(server): journal legacy worktree creation before owner effects
Mjones13 Oct 5, 2026
a6645cb
fix(server): journal legacy bootstrap branch rename before mutation
Mjones13 Oct 5, 2026
d76db90
fix(contracts): preserve library and host status API groups in L08 merge
Mjones13 Oct 5, 2026
785046b
merge: synchronize current staging into guarded voice review
Mjones13 Oct 5, 2026
22c42f1
Merge pull request #155 from Jones-Systems/work/jones-rebuild/A4-deli…
Mjones13 Oct 5, 2026
5e86551
Merge pull request #127 from Jones-Systems/work/jones-rebuild/A6-deli…
Mjones13 Oct 5, 2026
aa52085
fix(orchestration): authenticate legacy preparation failure deletion
Mjones13 Oct 5, 2026
a1e2ef1
test(orchestration): prove legacy failure wire and survivor behavior
Mjones13 Oct 5, 2026
caacfa2
test(orchestration): cover private bootstrap DTOs through actual HTTP…
Mjones13 Oct 5, 2026
2e1cb12
test(orchestration): prepare HTTP codec fixtures inside scoped Effects
Mjones13 Oct 5, 2026
da33d5b
fix(server): preserve legacy bootstrap WebSocket error receipts
Mjones13 Oct 5, 2026
afd96e3
fix(server): qualify recorded wire mapping memory fixtures
Mjones13 Oct 5, 2026
f1b2e02
test(orchestration): qualify authenticated legacy receiving launch
Mjones13 Oct 5, 2026
d0a0537
fix(orchestration): journal setup refusal before PTY entry
Mjones13 Oct 5, 2026
dd9ad2d
test(orchestration): preserve unresolved bootstrap cancellation evidence
Mjones13 Oct 5, 2026
0a731a2
test(orchestration): qualify sync and async worktree setup cards
Mjones13 Oct 5, 2026
abd1ddd
fix(orchestration): settle legacy bootstrap cancellation from durable…
Mjones13 Oct 5, 2026
038281b
test(orchestration): prove worktree setup survives socket disconnect
Mjones13 Oct 5, 2026
815eb6d
test(orchestration): prove required bootstrap preflight failures over…
Mjones13 Oct 5, 2026
9249bfd
merge: preserve library and voice review in L08 staging reconciliation
Mjones13 Oct 5, 2026
eea5550
Merge pull request #165 from Jones-Systems/work/jones-rebuild/A4-deli…
Mjones13 Oct 6, 2026
f871b17
Merge pull request #98 from Jones-Systems/work/jones-rebuild/L08-acti…
Mjones13 Oct 6, 2026
513c0e9
Merge commit 'f871b1764c731217f9508e3c9f80d2275c805ab0' into work/jon…
Mjones13 Oct 6, 2026
f3e11d8
Merge pull request #99 from Jones-Systems/work/jones-rebuild/L06-empt…
Mjones13 Oct 6, 2026
3cf6138
merge(runtime): receive current L18 continuation into L10
Mjones13 Oct 6, 2026
deded67
Merge staging into composer model and effort shortcuts
Mjones13 Oct 6, 2026
09e5220
Merge pull request #139 from Jones-Systems/work/jones-rebuild/A3-deli…
Mjones13 Oct 6, 2026
e7cc46f
merge(server): preserve L26 compatibility with current L18
Mjones13 Oct 6, 2026
23c95c1
Merge pull request #156 from Jones-Systems/work/jones-rebuild/A1-deli…
Mjones13 Oct 6, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
35 changes: 35 additions & 0 deletions .agents/skills/capture-ui-evidence/SKILL.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
---
name: capture-ui-evidence
description: Use the standard Jones Code UI verification and evidence workflow for UI changes and screenshots. Route interactive shared-renderer checks to T3 Browser, native Linux desktop scenarios to the Electron harness after exact-revision qualification, and mobile checks to test-t3-mobile.
---

# Capture Jones Code UI evidence

This is the default workflow for verifying user-visible UI changes and recording evidence. Choose the affected client:

- Shared web/desktop renderer: [test-t3-app](../test-t3-app/SKILL.md) and T3's Browser panel for live inspection, clicks, typing, screenshots and iteration.
- Linux native desktop shell: the Electron runner below for repeatable screenshots and scripted interactions after exact-revision qualification.
- Native mobile: [test-t3-mobile](../test-t3-mobile/SKILL.md).

Exercise the changed flow, assert its observable result, and check backend readback or reload persistence when the change depends on them. Use the same evidence format on every route: full candidate/comparison revisions (plus patch identity for dirty source), build correspondence, client/route, actual viewport/scale/theme, meaningful fixture, action and readback, captures, and coverage limits. The source/build distinction in [runner output and evidence limits](references/runner-output-and-limits.md) applies to Browser evidence too; a dev source OID alone is not an attestation of the served bundle.

T3 Browser remains the shared-renderer route. An unavailable Preview does not authorize switching to a standalone browser or using Electron as a Browser fallback.

The Linux Electron runner is a separate route for behavior that depends on the desktop shell. Require a recorded passing qualification for the exact harness revision; exploratory output alone leaves Electron-specific behavior unverified. This nightly source port does not qualify a host or adopt an installed wrapper. A separately installed host command must remain pinned to its qualified revision, with readback in `~/.local/state/jones-code-ui-evidence/qualification.json`; an older source qualification does not qualify this port.

The runner launches existing built outputs; it does not build the app. On a host with the installed command, first run `jones-code-ui-evidence doctor`, then use `jones-code-ui-evidence run --source /absolute/candidate --build-receipt /absolute/candidate-receipt.json` with a scenario that exercises the changed flow. The default `sidebar-rename` is a qualification/smoke scenario; it does not verify an unrelated UI change. A custom scenario receives a Playwright page and Electron app for inspecting and interacting with the candidate inside the isolated run.

From the Jones Code repository root, use:

```sh
node apps/desktop/scripts/ui-evidence.mjs doctor [--source DIR]
node apps/desktop/scripts/ui-evidence.mjs setup [--source DIR]
node apps/desktop/scripts/ui-evidence.mjs run [--source DIR] [--scenario sidebar-rename|/absolute/path/scenario.mjs] [--size 1280x800] [--scale 1] [--theme system|light|dark] [--comparison OID] [--build-receipt FILE] [--out DIR]
node apps/desktop/scripts/ui-evidence.mjs cleanup --run <run-id>
```

The repository also exposes the CLI and its bounded test group as package scripts `ui:evidence` and `test:ui-evidence`, invoked through the existing `vp run <script>` pattern. The test group does not qualify the live Electron route.

`doctor` is read-only and reports prerequisites or exact missing system package names; it installs nothing. `setup` downloads the lockfile-matched Electron runtime into its owned user cache and checks the official checksum. No command elevates privileges. `run` requires an existing built app, defaults to the harness source and `sidebar-rename`, and writes to `<source>/.t3/ui-evidence/runs/<run-id>/` unless `--out` names a path that does not already exist. A full commit OID may be supplied to `--comparison`; `--build-receipt FILE` records a receipt for the exact source and output hashes. Every command emits JSON with an `outcome` of `complete`, `no_change`, `rejected`, `partial`, or `unknown`. A run returns 0 for a pass, 1 for a scenario failure, 2 for a rejected precondition, or 130/143 for cancellation.

Read [runner output and evidence limits](references/runner-output-and-limits.md) before interpreting captures, comparing revisions, or writing a PR claim. Do not weaken isolation or retry a rejected probe by disabling Chromium's sandbox.
Original file line number Diff line number Diff line change
@@ -0,0 +1,57 @@
# Runner output and evidence limits

## Run lifecycle

The runner uses Xvfb and launches the candidate's built Electron app inside a rootless Bubblewrap sandbox with private namespaces. The sandbox receives the staged app/build inputs and an allowlisted environment, not the real home, `.git`, dotenv files, provider credentials, or host/live network access; its backend uses a private loopback endpoint. It verifies its isolation before app launch and records the probe and resolved backend topology in the manifest. A failed probe rejects the run before launch; report that result and stop. Chromium receives a recorded CDP navigator-online marker so the real renderer attempts its isolated loopback connection; this does not add network interfaces or permit external access.

Runs use separate scratch and artifact directories. The runner registers the exact scratch root before launch, forwards interruption to the owned process, and removes registered scratch on success, failure, or cancellation. Captures and the manifest remain in the artifact directory. Use `cleanup --run <run-id>` only to recover a registered leftover; it rejects unknown IDs, active recorded processes, and paths outside the registered scratch root. Do not remove paths by pattern or clean another run's artifacts.

## Scenarios and captures

A custom scenario is an absolute-path ESM module with a default async function. Its content hash is recorded. Keep it self-contained (Node built-ins are available); only the scenario file is staged, not sibling imports. The context provides the Electron app and Playwright page, `step`, `capture`, `dispatch`, `readSnapshot`, `reload`, `completeOnboarding`, `setTheme`, `setWindowSize`, a disposable workspace, and non-secret logging. Fixture dispatch is limited to `project.create`, `thread.create`, and `thread.metadata.update`. On protocol V2, projects use the authenticated project mutation HTTP endpoint, thread commands use ticket-authenticated WebSocket RPC, and shell readback sends the required protocol header. Tokens and tickets stay inside the private renderer and are not returned as evidence. Create fixture state through the app dispatch or UI; do not write the database directly or send a provider turn.

`setTheme` controls a recorded native-theme and CSS-media fixture and reads the rendered appearance back. It does not prove user theme-preference persistence. Use `ctx.reload()` to restore the recorded navigator-online fixture after navigation.

The built-in `sidebar-rename` scenario completes the normal provider-free first-run UI, then creates a synthetic project and metadata-only thread, captures `before`, renames through the Sidebar, checks the rendered title and backend snapshot, captures `after`, reloads and verifies persistence, then switches to dark theme with readback and captures `after-reload` and `after-reload-dark`.

**Those four capture names describe interaction states in one candidate build. They are not source-code before/after evidence.** The `--comparison OID` option records a declared comparison commit; it does not build or run that revision. To compare a code change, run the same scenario against separately built, exact base and candidate revisions, and retain both run manifests and capture sets.

## Reading the manifest

Each run writes `manifest.json` using schema `jones-code-ui-evidence/v1`. It records the run, harness and source identities, build digests, runtime and window readbacks, fixture and scenario steps, assertions, captures, isolation probe and topology, resource measurements, coverage claims, comparison declaration, status, cleanup outcome, and any error. Capture entries include the PNG hash and actual dimensions, scale, rendered theme, window bounds, and viewport.

Source provenance includes the source HEAD, dirty status, a digest of the tracked diff and untracked-file content, and the declared comparison OID. A dirty-tree capture must be described as that base plus its recorded patch identity, not as a commit-only result. A source OID alone does not prove which code produced existing build outputs: `build.sourceCorrespondence` is `receipt-matched` only when the exact source and build-output receipt match; otherwise describe it as unproved. The unpackaged runtime identity may be `null`.

Use the manifest to state what the run proves and what it leaves open. The built-in scenario covers project/thread metadata and a Sidebar rename with backend readback and reload persistence. It does not cover message content, provider turns, or external services. The Linux harness does not establish behavior for macOS, packaged/fused builds, signing, native dialogs, provider/network flows, or GitHub attachment upload.

## Build receipts

Build the candidate through the repository's desktop build command (`vp run build:desktop`) with development and packaged-executable overrides unset. Keep the source revision and dirty identity unchanged from immediately before the build until the final output digest collection. The harness does not attest an arbitrary receipt's honesty: the operator owns that build sequence.

For automated build orchestration, import `collectProvenance` from `apps/desktop/scripts/ui-evidence/provenance.mjs`. Supply `source`, the pinned `harness`, a new artifact directory, and `buildPaths` with `desktop: <source>/apps/desktop/dist-electron`, `server: <source>/apps/server/dist`, and **`web: <source>/apps/server/dist/client`** (the served client). Collect before and after the build into separate directories, and reject any changed source identity. Write this receipt from the post-build result:

```js
{
schema: "jones-code-ui-evidence-build/v1",
source: {
head: result.source.head,
statusSha256: result.source.statusSha256,
patchSha256: result.source.patch.sha256,
untrackedSha256: result.source.untracked.sha256
},
build: Object.fromEntries(
["desktop", "server", "web", "boot"].map(name => [name, result.build[name].sha256])
),
invocation: "vp run build:desktop (development/packaged overrides unset)",
startedAt: /* ISO timestamp immediately before build */,
finishedAt: /* ISO timestamp after successful build */
}
```

Pass its absolute path through `--build-receipt`. The command rejects changed source or outputs. Without a receipt, exploratory runs remain usable, but source-to-build correspondence is explicitly unproved. An installed command's pin identifies the harness, not an independently supplied candidate source; use `--source` for a different candidate.

## Sharing evidence

The default `.t3/ui-evidence/runs/` output is task-local and untracked. Attach screenshots or video through the repository's authorized GitHub workflow and verify that each attachment can be retrieved and renders in the PR. The runner does not upload evidence or commit generated captures. Keep the manifest with the PR evidence record so reviewers can identify the exact build, fixture, route, and coverage.

For every evidence set, identify the comparison and candidate revisions, build identity when available, route and platform, actual viewport, scale and theme, fixture and scenario, observable action/readback, and coverage limits. A combined preview must name its integration revision and constituent heads. Refresh any exact-current-head claim after the PR head changes.
15 changes: 12 additions & 3 deletions .agents/skills/test-t3-app/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,10 @@ description: Test T3 Code's web and desktop UI through its built-in Browser pane
Use T3's built-in Browser panel for verification. If its tools are absent or
the panel reports unavailable, explain the blocker and stop verification.
Do not install or switch to another automation system. For native mobile
testing, use [test-t3-mobile](../test-t3-mobile/SKILL.md).
testing, use [test-t3-mobile](../test-t3-mobile/SKILL.md). For separately
qualified Linux Electron app-window evidence, see
[capture-ui-evidence](../capture-ui-evidence/SKILL.md); it does not replace the
Browser-panel route for shared-renderer work.

## Start the app

Expand All @@ -31,8 +34,14 @@ for a fresh one. Keep using the same tab.

## Verify and retain

Exercise the affected flow and capture the state that proves it works. Keep
the server, state, and panel available while the user inspects or iterates.
Follow [capture-ui-evidence](../capture-ui-evidence/SKILL.md) for the common
evidence format. Exercise the changed flow with snapshots and focused locators,
assert its visible result, and check backend readback or reload persistence when
relevant. Record the revision, served build/source correspondence, actual
viewport/scale/theme, fixture, and coverage limits. Distinguish interaction
states within one build from two separately built source revisions.

Keep the server, state, and panel available while the user inspects or iterates.
An assistant turn ending is not teardown. Stop only processes you started,
using retained terminal sessions or captured PIDs.

Expand Down
7 changes: 6 additions & 1 deletion .agents/skills/test-t3-mobile/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -63,6 +63,11 @@ through AgentDevice. For a backend on the device host, use
on Android. For a remote backend, use its reachable origin.

Confirm the intended projects appear, exercise the affected flow, and capture
evidence. Retain the app and environment while iterating. At teardown, remove
evidence using the common format in
[capture-ui-evidence](../capture-ui-evidence/SKILL.md). Record the candidate
revision, native-client and served-backend build correspondence, device and
platform, actual viewport/scale/theme, fixture, action/readback, and coverage
limits. Distinguish interaction states in one build from two source builds.
Retain the app and environment while iterating. At teardown, remove
the disposable connection, close the AgentDevice session, call `device_close`,
and stop only your backend and Metro processes.
8 changes: 7 additions & 1 deletion .github/pull_request_template.md
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,12 @@ is insufficient; broad repo-wide checks are not required.

For UI changes, include clear before/after screenshots. Include a short recording
when motion, timing, transitions, or interaction details are needed to demonstrate
the change. Upload evidence to GitHub and embed or link it here. Never commit PR-only assets. -->
the change. Upload evidence to GitHub and embed or link it here. Never commit PR-only assets.
For each evidence set, identify the full comparison and candidate revisions (plus
base and patch identity for dirty source), build correspondence, route/platform,
actual viewport/scale/theme, fixture/scenario, observable action/readback, and
coverage limits. State whether before/after describes one interaction in one
build or two exact source builds. Name the integration revision and constituent
heads for combined previews; refresh exact-head claims after each PR-head change. -->

<!-- If you used an agent, end with the model and harness that did the work. -->
2 changes: 1 addition & 1 deletion apps/desktop/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -40,5 +40,5 @@
"tailwindcss": "^4.0.0",
"vite-plus": "catalog:"
},
"productName": "T3 Code (Alpha)"
"productName": "Jones Code"
}
72 changes: 70 additions & 2 deletions apps/desktop/scripts/main-process-bundle.test.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -114,9 +114,10 @@ it("loads the emitted packaged boot entry and backend cache preload", async () =
const directory = await NodeFSP.mkdtemp(NodePath.join(NodeOS.tmpdir(), "t3-desktop-boot-"));
try {
const entries = ["src/boot.ts", "src/compileCache.ts"];
await NodeFSP.mkdir(NodePath.join(directory, "src"));
const sources = [...entries, "src/app/DesktopUserDataOverride.ts"];
await NodeFSP.mkdir(NodePath.join(directory, "src/app"), { recursive: true });
await Promise.all(
entries.map((entry) =>
sources.map((entry) =>
NodeFSP.copyFile(new URL(`../${entry}`, import.meta.url), NodePath.join(directory, entry)),
),
);
Expand All @@ -135,6 +136,72 @@ it("loads the emitted packaged boot entry and backend cache preload", async () =
});
}
const outputDirectory = NodePath.join(directory, "dist-electron");
const emittedSources = new Map(
await Promise.all(
(await NodeFSP.readdir(outputDirectory))
.filter((name) => name.endsWith(".cjs"))
.map(async (name) => [
name,
await NodeFSP.readFile(NodePath.join(outputDirectory, name), "utf8"),
]),
),
);
const runBoot = (override) => {
const operations = [];
const modules = new Map();
const load = (name) => {
if (modules.has(name)) return modules.get(name).exports;
const module = { exports: {} };
modules.set(name, module);
const source = emittedSources.get(name);
assert.ok(source, `Missing packaged bootstrap dependency: ${name}`);
NodeVM.runInNewContext(source, {
module,
exports: module.exports,
process: { env: { T3CODE_DESKTOP_USER_DATA_DIR: override } },
require: (specifier) => {
if (specifier === "node:path") return NodePath.posix;
if (specifier === "node:fs")
return {
mkdirSync: (path, options) => {
assert.equal(options.recursive, true);
operations.push(`mkdir:${path}`);
},
};
if (specifier === "electron")
return {
app: { setPath: (role, path) => operations.push(`${role}:${path}`) },
};
if (specifier === "./compileCache.cjs") {
operations.push("cache");
return {};
}
if (specifier === "./main.cjs") {
operations.push("startup");
return {};
}
return load(NodePath.posix.basename(specifier));
},
});
return module.exports;
};
return { operations, load: () => load("boot.cjs") };
};
const isolated = runBoot(" /isolated/other/../profile ");
isolated.load();
assert.deepEqual(isolated.operations, [
"mkdir:/isolated/profile",
"userData:/isolated/profile",
"sessionData:/isolated/profile",
"cache",
"startup",
]);
const defaults = runBoot(undefined);
defaults.load();
assert.deepEqual(defaults.operations, ["cache", "startup"]);
const invalid = runBoot("relative/profile");
assert.throws(invalid.load, /must be an absolute path/);
assert.deepEqual(invalid.operations, []);
const fixture = `console.log(require('node:module').getCompileCacheDir() ? 'cached' : 'uncached');`;
await NodeFSP.writeFile(NodePath.join(outputDirectory, "main.cjs"), fixture);
await NodeFSP.writeFile(
Expand All @@ -154,6 +221,7 @@ it("loads the emitted packaged boot entry and backend cache preload", async () =
encoding: "utf8",
env: {
...process.env,
T3CODE_DESKTOP_USER_DATA_DIR: undefined,
APPIMAGE: "",
NODE_COMPILE_CACHE: undefined,
NODE_DISABLE_COMPILE_CACHE: disabled ? "1" : undefined,
Expand Down
Loading