From 16d27e042c9ddd7bc332d2080ce09c28bdb3e970 Mon Sep 17 00:00:00 2001 From: brsbl <57682038+brsbl@users.noreply.github.com> Date: Mon, 19 Oct 2026 22:00:36 +0000 Subject: [PATCH 01/15] Default to quick figures and publish from Personal thread storage --- plugins/playgrounds/server.test.ts | 138 ++++++++++++++++++ plugins/playgrounds/server.ts | 33 +++-- .../playgrounds/skills/how-it-works/SKILL.md | 97 +++++++++--- .../playgrounds/skills/playgrounds/SKILL.md | 21 ++- 4 files changed, 252 insertions(+), 37 deletions(-) diff --git a/plugins/playgrounds/server.test.ts b/plugins/playgrounds/server.test.ts index 55574495f..6ae846cc5 100644 --- a/plugins/playgrounds/server.test.ts +++ b/plugins/playgrounds/server.test.ts @@ -1,6 +1,7 @@ import { readdirSync } from "node:fs"; import { createFakePluginHost, makePluginAgentConfigurationContext, makeThreadResponse } from "@get-bb/plugin-sdk/testing"; import { expect, it } from "vitest"; +import { MAX_HTML_LENGTH } from "./model.js"; import plugin, { playgroundFromFile } from "./server.js"; import { bill, stepper } from "./examples.js"; @@ -568,3 +569,140 @@ it("reads a playground file as JSON, or as a whole HTML page titled from its playgroundFromFile("/w/huge.html", "

" + "x".repeat(2_000_001))).toThrow("longer than a playground allows"); }); + +function filePublishHost(options: { + workspace?: string; + storageRoot?: string; + readError?: string; + sizeBytes?: number; +} = {}) { + const storageRoot = options.storageRoot ?? "/remote/bb/thread-storage/thr_test"; + const html = "Working figure

Visible card

"; + const host = createFakePluginHost({ + pluginId: "playgrounds", + sdk: { + threads: { + get: () => ({ + ...makeThreadResponse({ id: "thr_test" }), + environment: { hostId: "host_remote", path: options.workspace ?? null }, + }), + storageLocation: () => ({ hostId: "host_remote", storageRootPath: storageRoot }), + }, + files: { + read: ({ path }: { path: string }) => { + if (options.readError) throw new Error(options.readError); + return { path, content: Buffer.from(html).toString("base64"), contentEncoding: "base64", sizeBytes: options.sizeBytes ?? html.length, sha256: "0" }; + }, + }, + }, + }); + plugin(host.bb); + return host; +} + +it.each([ + { file: "/remote/bb/thread-storage/thr_test/figure.html", cwd: "/home/agent" }, + { file: "figure.html", cwd: undefined }, + { file: "figure.html", cwd: "/remote/bb/thread-storage/thr_test" }, +])("publishes a Personal thread's own file without a checkout ($file, $cwd)", async ({ file, cwd }) => { + const host = filePublishHost(); + try { + const result = await host.harness.behavior.runCli(["publish", "--playground-file", file], { threadId: "thr_test", cwd }); + expect(result.exitCode).toBe(0); + const id = /id="([^"]+)"/.exec(result.stdout!)![1]; + expect(await host.harness.behavior.callRpc("get", { id, threadId: "thr_test" })).toMatchObject({ + kind: "html", widget: { title: "Working figure", html: expect.stringContaining("Visible card") }, + }); + expect(host.harness.inspection.sdk.callsTo("threads.storageLocation")).toEqual([[{ threadId: "thr_test" }]]); + expect(host.harness.inspection.sdk.callsTo("files.read")).toEqual([[{ + hostId: "host_remote", path: "/remote/bb/thread-storage/thr_test/figure.html", rootPath: "/remote/bb/thread-storage/thr_test", + }]]); + } finally { + await host.harness.lifecycle.dispose(); + } +}); + +it("preserves workspace-relative publishing on the thread's host", async () => { + const host = filePublishHost({ workspace: "/remote/checkout" }); + try { + const result = await host.harness.behavior.runCli(["publish", "--playground-file", "figure.html"], { threadId: "thr_test", cwd: "/remote/checkout/figures" }); + expect(result.exitCode).toBe(0); + expect(host.harness.inspection.sdk.callsTo("files.read")).toEqual([[{ + hostId: "host_remote", path: "/remote/checkout/figures/figure.html", rootPath: "/remote/checkout", + }]]); + } finally { + await host.harness.lifecycle.dispose(); + } +}); + +it("uses Windows path semantics when thread storage lives on a Windows host", async () => { + const storageRoot = String.raw`C:\bb\thread-storage\thr_test`; + const host = filePublishHost({ storageRoot }); + try { + const result = await host.harness.behavior.runCli(["publish", "--playground-file", "figure.html"], { threadId: "thr_test" }); + expect(result.exitCode).toBe(0); + expect(host.harness.inspection.sdk.callsTo("files.read")).toEqual([[{ + hostId: "host_remote", path: `${storageRoot}\\figure.html`, rootPath: storageRoot, + }]]); + } finally { + await host.harness.lifecycle.dispose(); + } +}); + +it.each([ + "/remote/bb/thread-storage/thr_other/figure.html", + "/remote/bb/thread-storage/thr_test_sibling/figure.html", + "../thr_other/figure.html", + "/remote/checkout/../secret.html", +])("rejects outside paths before reading, even with a target --thread override (%s)", async (file) => { + const host = filePublishHost({ workspace: "/remote/checkout" }); + try { + const result = await host.harness.behavior.runCli(["publish", "--thread", "thr_other", "--playground-file", file], { threadId: "thr_test", cwd: "/remote/bb/thread-storage/thr_test" }); + expect(result.exitCode).toBe(1); + expect(result.stderr).toContain("inside this thread's own storage or workspace"); + expect(host.harness.inspection.sdk.callsTo("threads.storageLocation")).toEqual([[{ threadId: "thr_test" }]]); + expect(host.harness.inspection.sdk.callsTo("files.read")).toEqual([]); + } finally { + await host.harness.lifecycle.dispose(); + } +}); + +it("propagates a host's symlink-escape rejection without an unconfined retry", async () => { + // Realpath enforcement belongs to the host SDK; exercise its failure contract + // rather than reimplementing the daemon's symlink logic in a mock filesystem. + const host = filePublishHost({ readError: "Path escapes read root" }); + try { + const result = await host.harness.behavior.runCli(["publish", "--playground-file", "link.html"], { threadId: "thr_test" }); + expect(result.exitCode).toBe(1); + expect(result.stderr).toContain("escapes read root"); + expect(host.harness.inspection.sdk.callsTo("files.read")).toEqual([[{ + hostId: "host_remote", path: "/remote/bb/thread-storage/thr_test/link.html", rootPath: "/remote/bb/thread-storage/thr_test", + }]]); + } finally { + await host.harness.lifecycle.dispose(); + } +}); + +it("retains the file size limit for Personal threads", async () => { + const host = filePublishHost({ sizeBytes: MAX_HTML_LENGTH * 2 + 1 }); + try { + const result = await host.harness.behavior.runCli(["publish", "--playground-file", "figure.html"], { threadId: "thr_test" }); + expect(result.exitCode).toBe(1); + expect(result.stderr).toContain("too large for a playground"); + } finally { + await host.harness.lifecycle.dispose(); + } +}); + + +it("does not use --thread as a substitute for an invoking thread when reading files", async () => { + const host = filePublishHost(); + try { + const result = await host.harness.behavior.runCli(["publish", "--thread", "thr_test", "--playground-file", "/remote/bb/thread-storage/thr_test/figure.html"]); + expect(result.exitCode).toBe(1); + expect(result.stderr).toContain("Run --playground-file from the bb thread"); + expect(host.harness.inspection.sdk.callsTo("files.read")).toEqual([]); + } finally { + await host.harness.lifecycle.dispose(); + } +}); diff --git a/plugins/playgrounds/server.ts b/plugins/playgrounds/server.ts index 81d389522..b3ded45c5 100644 --- a/plugins/playgrounds/server.ts +++ b/plugins/playgrounds/server.ts @@ -35,17 +35,32 @@ export function playgroundFromFile(name: string, text: string): unknown { return { title, html: text, ...(/class="iso"/.test(text) ? { width: 720 } : {}) }; } -// Reads only from the calling thread's own workspace on its own machine; the host -// daemon refuses files over its size limit before reading them. +// Resolve on the calling thread's host, never the plugin server's filesystem. +// rootPath makes the host daemon enforce the boundary again after resolving +// symlinks; a failed confined read must never retry without that root. async function readThreadFile(bb: BbPluginApi, threadId: string, cwd: string | undefined, file: string) { - const thread = await bb.sdk.threads.get({ threadId, include: "environment" }); + const [thread, storage] = await Promise.all([ + bb.sdk.threads.get({ threadId, include: "environment" }), + bb.sdk.threads.storageLocation({ threadId }), + ]); const environment = "environment" in thread ? thread.environment ?? null : null; - if (!environment?.path) throw new Error("This thread has no workspace to read files from."); - const resolved = path.resolve(cwd ?? environment.path, file); - const result = await bb.sdk.files.read({ hostId: environment.hostId, path: resolved, rootPath: environment.path }); + const paths = path.win32.isAbsolute(storage.storageRootPath) && !path.posix.isAbsolute(storage.storageRootPath) + ? path.win32 : path.posix; + const resolved = paths.resolve(cwd ?? environment?.path ?? storage.storageRootPath, file); + const roots = [ + { hostId: storage.hostId, path: storage.storageRootPath }, + ...(environment?.path ? [{ hostId: environment.hostId, path: environment.path }] : []), + ]; + const root = roots.find((candidate) => { + const relative = paths.relative(candidate.path, resolved); + return relative !== ".." && !relative.startsWith(`..${paths.sep}`) && !paths.isAbsolute(relative); + }); + if (!root) throw new Error("Playground files must be inside this thread's own storage or workspace."); + const result = await bb.sdk.files.read({ hostId: root.hostId, path: resolved, rootPath: root.path }); if ((result.sizeBytes ?? 0) > MAX_HTML_LENGTH * 2) throw new Error(`${file} is too large for a playground.`); return Buffer.from(result.content, result.contentEncoding === "base64" ? "base64" : "utf8").toString("utf8"); } + import { createLive, liveRpc } from "./live.js"; const savedSchema = z @@ -131,7 +146,7 @@ const HTML_GUIDE = [ "Kit classes: .pg-title, .pg-subtitle, .pg-eyebrow, .pg-h, .pg-item-title, .pg-body, .pg-meta, .pg-panel, .pg-stage, .pg-photos, .pg-seg (buttons with aria-pressed), .pg-chip, .pg-btn, .pg-btn-primary, .pg-link, .pg-check (label > input + text + small), .pg-dots (i[aria-current=step]), .pg-reveal (entrance; set --i to stagger).", "Bridge: window.playground.state is the playground's shared state (or null): the last value passed to window.playground.save(value) on any device, or set by the agent. Call save after each meaningful change; bb stores it and every open copy receives it. window.playground.onState(callback) runs when the state changes elsewhere; apply it without saving again. window.playground.theme and window.playground.onTheme(callback) report theme changes. http(s) links open in bb only after a click inside the answer; call window.playground.send from a click too.", "Agent control: window.playground.expose({ name: (...args) => result }) lists actions the agent can run with `bb playgrounds do --args '[...]'`; return a short JSON-serializable result (a Promise is fine) and drive the same code path a click would. window.playground.emit(name, data) records something the user did for `bb playgrounds watch`. window.playground.send(label, data), called from a click, attaches data to the user's next message as a pill, so they choose when you see it: use it for things like a recorded take or a finished attempt. Expose the handful of verbs a person would use (play, select, set), not internals.", - "Anatomy figures: when you build a figure with the how-it-works skill (Anatomy, skills.wheresryan.sh/anatomy), write its standalone page into this thread's workspace (its checkout, not thread storage or /tmp) and publish it with `bb playgrounds publish --playground-file `; the card keeps its styles and theme, and the agent can `read` it and press `key`s on it. Put the model's inputs in playground parameters so `setParams` works, and credit Ryan (@wheresryan22) and Anatomy in your reply.", + "Anatomy figures: when you build a figure with the how-it-works skill (Anatomy, skills.wheresryan.sh/anatomy), write its standalone page into $BB_THREAD_STORAGE (works in Personal threads without a checkout) or this thread's workspace and publish it with `bb playgrounds publish --playground-file `; the card keeps its styles and theme, and the agent can `read` it and press `key`s on it. Put the model's inputs in playground parameters so `setParams` works, and credit Ryan (@wheresryan22) and Anatomy in your reply.", "Network: the frame has no network access. Scripts, styles, and fonts must be inline; bb supplies Inter. Images load only from data: and blob: URLs and https://upload.wikimedia.org (credit photos in your prose); every other request, including remote scripts, fetch, and map tiles, is blocked. Draw maps and 3D views as inline SVG or canvas. The frame has no access to bb, cookies, or the conversation; share what the agent should see through save and emit only. Respect prefers-reduced-motion and keep controls keyboard accessible.", ].join("\n"); function guide() { @@ -553,7 +568,7 @@ export default function plugin(bb: BbPluginApi): void { type: "string", placeholder: "PATH", description: - "HTML playground in a file on this thread's machine: one-line JSON {title, html, width?}, or a whole .html page such as an Anatomy figure", + "HTML playground in this thread's own storage ($BB_THREAD_STORAGE) or workspace: one-line JSON {title, html, width?}, or a whole .html page such as an Anatomy figure", }, saved: { type: "string", @@ -569,7 +584,7 @@ export default function plugin(bb: BbPluginApi): void { const threadId = threadSchema.parse(options.thread ?? ctx.threadId); const file = options["playground-file"]; if (file !== undefined) { - if (!ctx.threadId) throw new Error("Run --playground-file from the bb thread whose workspace has the file."); + if (!ctx.threadId) throw new Error("Run --playground-file from the bb thread whose storage or workspace has the file."); const text = await readThreadFile(bb, ctx.threadId, ctx.cwd, file); return { exitCode: 0, diff --git a/plugins/playgrounds/skills/how-it-works/SKILL.md b/plugins/playgrounds/skills/how-it-works/SKILL.md index ea967a81c..8dbcd2b85 100644 --- a/plugins/playgrounds/skills/how-it-works/SKILL.md +++ b/plugins/playgrounds/skills/how-it-works/SKILL.md @@ -8,33 +8,80 @@ description: "Explain how a system, mechanism, protocol, pipeline or piece of ar Anatomy is by Ryan ([@wheresryan22](https://github.com/wheresryan22)), MIT licensed (see `LICENSE`): [skills.wheresryan.sh/anatomy](https://skills.wheresryan.sh/anatomy). This copy ships with the bb Playgrounds plugin, adapted from upstream commit -`dbf697a527bbf7d358668e1557cb1e35ff725d46`. The only changes are the name and description, this note, the "In bb" -section below and the removal of the prebuilt example pages, which each -example's `build.mjs` writes again. Credit Ryan and Anatomy whenever you show a figure. +`dbf697a527bbf7d358668e1557cb1e35ff725d46`. The bb adaptation changes the name and +description, publication and workspace instructions, and the default workflow +to a quick figure; it retains the fuller Anatomy workflow for deeper requests. +Prebuilt example pages are omitted; each example's `build.mjs` writes them again. +Credit Ryan and Anatomy whenever you show a figure. ## In bb -- **Work on a copy in the thread's workspace.** Builds write their pages next to - the script, so first copy this skill's folder (the one holding this - `SKILL.md`) into the thread's primary workspace, its checkout or working - directory, not thread storage or `/tmp`: `--playground-file` only reads files - inside that workspace. Keep the copy out of commits with a dot-directory that - git ignores locally: - `cp -R .how-it-works && echo .how-it-works/ >> "$(git rev-parse --git-path info/exclude)"`. - Build and edit there, never in the original. +- **Work on a copy in this thread's storage.** Personal threads need no Git + checkout. Copy this skill's folder (the one holding this `SKILL.md`) to a + fresh directory under `$BB_THREAD_STORAGE`; builds write beside their script. + For example, `figure_dir=$(mktemp -d "$BB_THREAD_STORAGE/figure-XXXXXX")` + then `cp -R /. "$figure_dir/"`. Build and edit that copy, + never the installed skill. No Git commands or repository setup are needed. - **Build before you open an example.** The examples ship as sources only. Run `node examples//build.mjs` in your copy to get its page. - **Show the figure as a playground.** Use the framework-free way (a `build.mjs` - that writes one standalone HTML page), then publish it from the workspace: + that writes one standalone HTML page), then publish it from thread storage: `bb playgrounds publish --playground-file /absolute/path/figure.html`. Read the `playgrounds` skill's "Anatomy figures" section for the card's `read` and `key` actions and for binding the model's inputs to playground parameters. +## Quick figure — default + +For an ordinary request to explain how something works, build a **quick figure**. +This is the complete default workflow. Use the full Figure/Hero workflow below +only when the person explicitly asks to go deeper or requests that level of +craft. A complex subject alone does not select full mode. + +- **Start visibly.** Before tools, tell the person in one sentence which + mechanism you are making interactive. Never ask a clarifying question: choose + a useful ordinary case, state a necessary assumption, and proceed. If the + build is still running after a minute, give a short factual progress update. +- **Budget about 3 minutes to a working published page.** Record the start time. + Spend roughly the first 30 seconds choosing the mechanism and starter, the + next two minutes building, and the remaining time checking and publishing. + This is a target, not a claim about elapsed time. If it runs long, report that + honestly and reduce decorative scope; keep the mechanism and controls working. +- **One mechanism, at most 40 parts.** Draw only the parts needed to show cause + and effect, with one model driving movement and readouts. There is no minimum + part count. Use SVG for the drawing, inline CSS and JavaScript for the page, + and no WebGL, canvas or 3D runtime. Give the object volume and purposeful + detail, but do not add screws or ornament to meet a density quota. +- **Reuse the nearest bundled example when it fits.** Choose from the examples + listed below; read and adapt its source in the thread-storage copy. Keep just + the useful mechanism and SVG pieces. The smallest SVG example is the starting + point when its controls and motion fit. If none fits, use the kit's standalone + page helpers directly. Do not build or read every example. +- **Make the explanation true and operable.** Use a simple, explicitly described + model; verify uncertain facts from relevant sources rather than inventing + precise numbers. Give each exposed control a visible effect in the mechanism + or readout, with a visible label, keyboard support and reduced-motion behavior. + Bind model inputs to playground parameters as described in the `playgrounds` + skill so the person and agent can operate the same model. +- **Check the working page once, then publish.** Open it, operate every exposed + control with `scripts/drive.mjs`, and compare before/after screenshots to catch + dead controls. Check the figure and controls fit a 390 px column, and fix any + broken behavior or unreadable content. This mode has **no audit pass**: skip + geometry audits, line checks, 4× detail sweeps and shader/3D checks. Do not + inherit those requirements from the full-mode sections or references below. + Publish the standalone HTML with `--playground-file`, emit its directive, + and give one concise takeaway with Anatomy credit. + +The examples and kit are shared by both modes. The dense-detail requirements, +full workflow, craft verification, WebGL and 3D sections below apply **only to +full mode**. Consult references only for an API or technique you need; a reference +must not expand a quick figure into a full production build. + ## What it makes This skill makes figures like a small instrument on a bench: a heavy base on feet, rails with tick rulers, a carriage on bushings, knurled knobs, coil springs, a dial gauge whose needle moves, screws as tiny dots. The reader understands the idea because they recognise the machine. Every number the figure shows comes from the same model that moves its parts. -Eight complete examples ship with the skill. Open the closest one before you start. Each framework-free example is built with `node examples//build.mjs`, which writes a standalone HTML page next to the script; add `--light` for the light theme. +Eight complete examples ship with the skill. Start from the closest one that fits; +quick figures keep only the SVG parts needed for their one mechanism. Each framework-free example is built with `node examples//build.mjs`, which writes a standalone HTML page next to the script; add `--light` for the light theme. - `examples/dial-indicator/` is the smallest: a dial gauge on a stand, about 300 lines in all. - `examples/desk-computer/` is framework-free SVG: a desk computer with a keyboard you can type on. The typed line appears on a CRT screen drawn in the plane of the case front, and the picture collapses to a line and a dot when you switch it off. It has about 85 solids and 850 paths. @@ -45,9 +92,9 @@ Eight complete examples ship with the skill. Open the closest one before you sta - `examples/spot-plate/` is a second production figure from the same site: six pairs of glass drops on a spot plate, each pair drawn from one distance field, so a pair closer than `merge` runs together into one piece of glass. A fan of feeler blades sets `merge`, one blade per gap. It is the reference for shapes that morph into each other and for one control driving many parts. - `examples/turning-dial/` is the optional 3D mode: a combination dial that turns in true 3D with a small robot hand on it. It has about 90 live parts in metal materials, a second turn group, a hinge, a three-hinge finger that lifts and a pod that breaks off as a free body. A WebGL LED, its light pool and sparks follow the moving parts. `stress.mjs` beside it is a dense hand of about 380 parts in a cluttered workshop, used to measure performance. -The test rig is the quality bar for the drawing itself. The Raptor is the bar for shader work: a WebGL effect has to reach its standard of world-space, no-pop, seamless rendering. +For full mode, the test rig is the quality bar for the drawing itself. The Raptor is the bar for shader work: a WebGL effect has to reach its standard of world-space, no-pop, seamless rendering. -## The one idea that matters +## Full mode: the one idea that matters **The object is the explanation.** Don't draw boxes, arrows and labels. Invent a real, well-made physical thing whose working *is* the concept. Here is how earlier figures mapped: @@ -68,15 +115,18 @@ Two ways this fails, both seen in practice: The fix for both is the same: a recognisable machine, built from many small, precise, purposeful parts. -**Every creation is highly detailed.** This holds for every figure, however small the idea or the request: a quick explainer is still a dense, real machine, never a few slabs. What scales with the size (workflow step 1) is how far you push it: a Figure gets the 4× sweep over its subject and mechanism, a Hero or an Epic over the whole drawing. +**Every full-mode creation is highly detailed.** These density requirements do +not apply to quick figures. What scales with the full-mode size (workflow step 1) +is how far you push it: a Figure gets the 4× sweep over its subject and mechanism, a Hero or an Epic over the whole drawing. - **Read the real thing.** Build it the way the real object is built: every screw, seam, bevel, bushing, label plate, cable with its connector, scale with its ticks, and the parts that hold the parts. - **Two looks.** At 1× it reads as one clear machine. At 4× every region still has something true to find; a bare face or an empty corner is unfinished work, not calm. - **Purposeful, never noise.** Detail comes from parts that belong to the mechanism. Each one sits on another part, ends on an edge, and fades rather than stops. - **Check it last.** Before you finish, zoom to 4× (over the subject and mechanism for a Figure, the whole drawing for a Hero or an Epic) and add the real parts that are missing wherever a region is plain. -## Workflow +## Full-mode workflow -Work in this order. Write the concept and the parts list before any geometry. Most of the quality is decided there. +Use this only for an explicit request to go deeper or for a full Figure, Hero or +Epic. Work in this order. Write the concept and the parts list before any geometry. Most of the quality is decided there. 1. **Size it before you start.** Tell the user which size the request is and roughly how long it will take, before any other work. - **Figure**: one mechanism, 40–80 parts, SVG with at most one WebGL layer. About 30–90 minutes. Build it without asking. @@ -126,7 +176,7 @@ Pick the path that fits the project: - **Standalone HTML, a static SVG, a blog post or any non-React site.** Write a Node build script like `examples/dial-indicator/build.mjs`. It imports `kit/iso-kit.mjs`, assembles strings with `solidSvg`, `lineSvg`, `dotsSvg`, `wireSvg` and `faceTextSvg`, wraps them with `figureSvg` and `plateHtml`, and writes the page with `pageHtml({ script: kitScript() + live })`, or `kitScript() + glScript() + live` when it has a shader. For a lone `.svg` file use `figureSvg({ standalone: "dark" | "light" })`, which embeds the styles. - **React or Next.js.** Copy `kit/` into the project (for example `components/iso/`). Keep geometry in plain `.ts` modules, build the static art in a server component with the `draw.tsx` components, and pass it as element props to one `"use client"` live component that moves things. `references/react.md` explains the split and a trap with large pages. -## Craft rules (short form) +## Full-mode craft rules (short form) These are the rules that separate a crafted figure from a diagram. `references/craft.md` gives the full reasoning and recipes. @@ -144,7 +194,7 @@ These are the rules that separate a crafted figure from a diagram. `references/c - **Volume.** Give things real thickness, make them stand on other things, and put a soft halo under the base and under anything lifted. - **Composition.** Centre the figure and let it fill about 55–65% of the card. Keep a consistent scale across a set of figures, and make sure it still reads at 390 px wide. -## WebGL inside the drawing +## Full mode: WebGL inside the drawing Use a shader only for what lines can't draw: fire and exhaust, water and caustics, real lamp light, glow, steam. The parts stay SVG. The core rules come from the first shader figure, whose colour change between phases looked cut rather than crossfaded: @@ -164,7 +214,7 @@ Use a shader only for what lines can't draw: fire and exhaust, water and caustic Read `references/webgl.md` before writing any shader. -## 3D: figures that turn (beta) +## Full mode: 3D figures that turn (beta) 3D is an option like WebGL. Use it when a part moving in depth is the idea: a dial or turntable that turns, fingers that flex, a piece that breaks off and falls. The rest of the figure stays static kit art. @@ -183,9 +233,10 @@ Read `references/3d.md` first. ## References -Read these as you need them: +Read these as you need them. Their dense-detail and audit requirements are for +full mode; quick figures use only the API or technique needed for the mechanism: -- `references/craft.md`: the look in depth, including the parts vocabulary with code, tone tables, painter's order patterns, round parts, pipes and harnesses, exploded views, screens on faces, and the anti-patterns that got figures rejected. Read it before designing. +- `references/craft.md`: the look in depth, including the parts vocabulary with code, tone tables, painter's order patterns, round parts, pipes and harnesses, exploded views, screens on faces, and the anti-patterns that got figures rejected. Read it before designing a full-mode figure. - `references/kit.md`: the API, with signatures and examples. - `references/motion.md`: live behaviour (loops, springs, tours, pointer, keyboard, accessibility, reduced motion), plus envelopes for one-shot events, exploded views, depth re-sorting and arming, in vanilla JS and React. - `references/react.md`: the React/Next.js server/client split, element props and the large-payload key-warning trap. diff --git a/plugins/playgrounds/skills/playgrounds/SKILL.md b/plugins/playgrounds/skills/playgrounds/SKILL.md index 1a1a933c7..e28aa9871 100644 --- a/plugins/playgrounds/skills/playgrounds/SKILL.md +++ b/plugins/playgrounds/skills/playgrounds/SKILL.md @@ -23,7 +23,7 @@ they never say "playground". Answer in prose only when one sentence would do. | They ask about | Build | | --- | --- | -| How a system, mechanism, protocol or pipeline works ("how does OAuth login work?", "walk my team through our job queue") | An Anatomy figure: load the bundled `how-it-works` skill and build its machine, with the model's inputs as playground parameters (see Anatomy figures) | +| How a system, mechanism, protocol or pipeline works ("how does OAuth login work?", "walk my team through our job queue") | A quick Anatomy figure: load the bundled `how-it-works` skill, use its default quick workflow, and expose the model's inputs as playground parameters (see Anatomy figures) | | Numbers, pricing, "how much / which", a decision | Calculator set | | Funnels, time series, distributions | A chart, with the inputs that drive it | | A screen or flow | A clickable mock-up of it | @@ -31,6 +31,11 @@ they never say "playground". Answer in prose only when one sentence would do. | Motion or feel (springs, easing, drag) | A motion preview they can operate | | A tradeoff that plays out over time (a backlog against worker count, an on-call rotation) | Simulation set | +Start building with useful defaults; never ask a clarifying question before +producing the first card. State any necessary assumption briefly. Show a short +progress sentence before tools and, if the build takes more than a minute, a +factual update while it is still building. + Build these as HTML playgrounds with the component library (see Components). Use a **native document** only for a quick formula answer with a few inputs and no follow-up work: bounded arithmetic, no code, accessible by construction. @@ -429,15 +434,21 @@ shows a setup step, two boards and hidden pieces), and ([@wheresryan22](https://github.com/wheresryan22)), draws a technical idea as a working isometric machine. Playgrounds ships a copy as the `how-it-works` skill. Whenever someone asks how a system, mechanism, protocol or pipeline works, load -the `how-it-works` skill and build the figure the framework-free way (a `build.mjs` -that writes one standalone HTML page), then show that page as a playground: +the `how-it-works` skill and follow its **quick figure** workflow: one mechanism, +at most 40 parts, SVG only, no audit pass, and about 3 minutes to a working card. +Start from the nearest bundled example when it fits. Show progress, choose +reasonable defaults without clarifying questions, and leave the full Figure/Hero +workflow for an explicit request to "go deeper". Build the framework-free way +(a `build.mjs` that writes one standalone HTML page), then publish that page: ```sh bb playgrounds publish --playground-file /absolute/path/figure.html ``` -`--playground-file` reads only from this thread's workspace (its checkout; the -`how-it-works` skill's "In bb" says where to copy it), so a large figure never passes through your context. The card keeps the page's styles and +`--playground-file` can read from this thread's workspace or its +`$BB_THREAD_STORAGE`. Use a fresh copy under thread storage as the `how-it-works` +skill's "In bb" section describes, including in Personal threads without a Git +checkout. A large figure never passes through your context. The card keeps the page's styles and scripts, follows bb's light or dark theme, and fits the page to the card. Credit Ryan and Anatomy in your reply. From 1891cb6bac7ad9c674652d4bd5c372b56736d3fb Mon Sep 17 00:00:00 2001 From: brsbl <57682038+brsbl@users.noreply.github.com> Date: Mon, 19 Oct 2026 22:06:35 +0000 Subject: [PATCH 02/15] Add capped Personal-thread launch eval on both default providers --- plugins/playgrounds/evals/launch/README.md | 96 +++++++ plugins/playgrounds/evals/launch/controls.mjs | 79 ++++++ plugins/playgrounds/evals/launch/metrics.mjs | 18 ++ .../playgrounds/evals/launch/metrics.test.ts | 45 ++++ plugins/playgrounds/evals/launch/pixels.mjs | 32 +++ .../playgrounds/evals/launch/pixels.test.ts | 37 +++ plugins/playgrounds/evals/launch/prompts.json | 22 ++ plugins/playgrounds/evals/launch/run.mjs | 238 ++++++++++++++++++ 8 files changed, 567 insertions(+) create mode 100644 plugins/playgrounds/evals/launch/README.md create mode 100644 plugins/playgrounds/evals/launch/controls.mjs create mode 100644 plugins/playgrounds/evals/launch/metrics.mjs create mode 100644 plugins/playgrounds/evals/launch/metrics.test.ts create mode 100644 plugins/playgrounds/evals/launch/pixels.mjs create mode 100644 plugins/playgrounds/evals/launch/pixels.test.ts create mode 100644 plugins/playgrounds/evals/launch/prompts.json create mode 100644 plugins/playgrounds/evals/launch/run.mjs diff --git a/plugins/playgrounds/evals/launch/README.md b/plugins/playgrounds/evals/launch/README.md new file mode 100644 index 000000000..35250a82c --- /dev/null +++ b/plugins/playgrounds/evals/launch/README.md @@ -0,0 +1,96 @@ +# Launch eval + +Twenty ordinary prompts: twelve everyday objects and eight developer concepts. +Keep this corpus out of the generation skills and references. The CDN wording is +from PR #503. All prompts are sent unchanged; no hidden request to use a tool, +name a skill, avoid questions, or satisfy a timer is appended. + +## Run + +The owner provisions a **fresh isolated dev bb**, installs Playgrounds from the +exact source path being measured, and enables the default Claude Code and Codex +providers. Use a fresh bb data directory inside the worktree, never production +data. Record the bb core revision and plugin installation command alongside the +results. Do not serve this eval from production bb. + +Launch the dev bb and this runner through `bb host-care start`. The runner is +serial and owns all driver/browser descendants; it does not bypass the resource +queue. Release the jobs when finished. `CHROME_PATH` must name an executable +Chrome/Chromium (a local wrapper is supported). Node must support WebSocket or +`--experimental-websocket`; `drive.mjs` handles the latter. `pngjs` is already a +repository development dependency; `LAUNCH_PNGJS` may point to an existing +absolute module path if the worktree has not installed dependencies. + +```sh +node plugins/playgrounds/evals/launch/run.mjs \ + --url http://127.0.0.1:48992 --host \ + --plugin-root /absolute/path/to/plugins/playgrounds \ + --commit --label baseline \ + --out /absolute/worktree/.launch/results/baseline +``` + +For an archived baseline, **always pass `--commit`**: `git -C` inside an archive +could otherwise report the surrounding worktree's revision. Use a different +output directory for the prototype. `--providers claude-code,codex` is the +default. `--only bicycle-pump,cdn` runs a bounded preflight subset; omit `--only` +to resume the remaining full corpus in the same directory. `--cap-minutes 15` +is the default and maximum. Never compare different caps as one baseline. + +Before sending any scored prompt, preflight checks the Personal project, plugin +presence, both providers' model catalogs, Chrome, real input dispatch, PNG diffs, +and the actual dev UI. Infrastructure failures here abort without counting +forty spurious product failures. The tiny preflight fixture is not an eval prompt +and is never given to an agent. + +Each prompt creates a fresh `proj_personal` thread with a new personal environment +and no Git checkout. The request omits `model`; the actual resolved model and +provider, execution options, catalog and thread/environment response are saved. +No model or permission setting is silently forced. If the instance remembers a +non-default model for Personal, reset the **isolated instance** before measuring. + +## Evidence and scoring + +- Time starts immediately before the HTTP prompt send. The real thread page is + opened in Chrome. A loaded iframe or native card must be on screen, with a + nonblank screenshot. A tool return or stored HTML alone never counts. The + observer polls at 150 ms; loading and browser startup stay in the measurement. +- Progress evidence contains assistant text observed in visible message columns + before the card, matched to real timeline rows. Tool logs are not progress. +- Question evidence includes structured `user_question` interactions and assistant + question sentences, excluding fenced code. Unclassified question marks require + review; a rhetorical heading cannot silently be called a clarification or a + zero-question pass. Read `timeline.json`, `interactions.json`, and `result.json`. + Counts are conservative evidence counts, not a semantic classifier's verdict. +- A missing card, interrupted run, or capped run is a failure at the cap time, + including an agent that finishes early without a card. `wallMs` records actual + elapsed time separately. Idle plus an assistant response ends a no-card run + early. A visible card with a dead control retains its measured delivery time + and fails the control criterion. +- The bundled `scripts/drive.mjs` opens the actual served frame URL and uses real + pointer/keyboard input. Range controls are dragged; toggles/buttons clicked; + text/select controls receive key events. HTML is not reconstructed. Native + controls are driven in the real thread UI. Narrow-toggle is tested at 360, + 390, and 480 px. Every exposed control must be proven, including newly exposed, + disabled, and unsupported custom controls: unproven behavior fails with a reason. +- Three no-input and two post-input screenshots are retained per control. The + diff masks control/label regions, ignores pixels already moving before input, + requires persistent output change, and requires changed output to exceed the + measured ambient movement by 4x. A changed checkbox or thumb alone cannot pass. + This is deliberately conservative: purely animated responses and controls whose + only legitimate output is their own appearance require investigation, not an + automatic pass. PNG dimension changes are also unproven, never assumed live. + +`summary.json` and `summary.md` update after each case. Per-provider percentiles +appear only after all twenty cases: median is the middle-pair mean, p90 is +nearest rank. Gate: at least 18/20 cards with all controls live, zero clarifying +questions or outstanding question reviews, median <=3 minutes, p90 <=6 minutes, +and progress on all twenty. A preflight subset is explicitly incomplete. + +Completed cases are never overwritten on resume. Revision, source path, cap, +prompts and provider list must match the manifest. An interrupted in-flight case +is stopped and counted as capped; a fresh measurement needs a separate output +directory. Keep raw evidence and document any human adjudication beside the +summary; do not silently drop failures or edit the prompt corpus between rounds. + +The runner stops only threads it created. Driver PIDs and actions are recorded; +its private Chrome profiles use the result directory's `.tmp` via `TMPDIR`. diff --git a/plugins/playgrounds/evals/launch/controls.mjs b/plugins/playgrounds/evals/launch/controls.mjs new file mode 100644 index 000000000..4fa1ada6b --- /dev/null +++ b/plugins/playgrounds/evals/launch/controls.mjs @@ -0,0 +1,79 @@ +import { join } from 'node:path'; +import { writeFileSync } from 'node:fs'; +import { visualDelta } from './pixels.mjs'; + +// This is run in the card's real rendered frame (not a reconstructed mock). +export function inventory(scope = 'body') { + const root = document.querySelector(scope); + if (!root) return []; + const candidates = [...root.querySelectorAll('button,input:not([type="hidden"]),select,textarea,[role="button"],[role="switch"],[role="slider"],[role="checkbox"],[role="radio"],[role="tab"],[tabindex],canvas,[onclick],[data-drag]')]; + for (const el of root.querySelectorAll('*')) { + if (getComputedStyle(el).cursor === 'pointer' && getComputedStyle(el.parentElement || el).cursor !== 'pointer') candidates.push(el); + } + return [...new Set(candidates)].filter(el => { + const r = el.getBoundingClientRect(); + return r.width > 0 && r.height > 0 && getComputedStyle(el).visibility !== 'hidden' && + !candidates.some(child => child !== el && el.contains(child)); + }).map((el, i) => { + el.dataset.launchControl = String(i); + return { disabled: Boolean(el.disabled || el.getAttribute('aria-disabled') === 'true'), index: i, tag: el.tagName.toLowerCase(), type: el.type || el.getAttribute('role') || '', + label: el.getAttribute('aria-label') || el.textContent?.trim().slice(0, 100) || el.id || `control ${i}`, + selected: el.checked || el.getAttribute('aria-pressed') === 'true' || el.getAttribute('aria-selected') === 'true', + group: el.name || el.closest('[role="tablist"],.pg-seg,.pg-segmented')?.outerHTML.slice(0, 120) || null }; + }); +} +const selector = c => `[data-launch-control="${c.index}"]`; +function action(c) { + const s = selector(c); + if (c.disabled) return null; + if (c.tag === 'canvas' || (c.tag === 'input' && ['file','color','date','time','datetime-local','month','week'].includes(c.type))) return null; + if (c.type === 'range' || c.type === 'slider' || c.type === 'dial') return [['drag', s, 0.2, 0.5, 0.85, 0.5, 20]]; + if (c.tag === 'select') return [['click', s], ['key', 'ArrowDown', s], ['key', 'Enter', s]]; + if (c.tag === 'textarea' || (c.tag === 'input' && ['text','search','email','url','password','tel','number'].includes(c.type))) { + if (c.type === 'number') return [['click', s], ['key', 'ArrowUp', s]]; + return [['click', s], ['key', 'x', s]]; + } + if (c.tag === 'button' || ['button','submit','reset','checkbox','radio','switch','tab'].includes(c.type) || c.tag === 'a') return [['click', s]]; + return null; +} + +export async function checkControls({ target, scope = 'body', width, dir, drive }) { + const listExpression = `(${inventory.toString()})(${JSON.stringify(scope)})`; + const discovered = await drive(target, [['eval', listExpression]], join(dir, 'inventory'), width); + const controls = discovered.evals.find(Array.isArray); + if (!controls?.length) return { pass: false, controls: [], reason: 'No exposed controls discovered' }; + const actions = [['eval', listExpression]]; + const plans = []; + for (const control of controls) { + const steps = action(control); + if (!steps) { plans.push({ ...control, pass: false, reason: control.disabled ? 'Disabled control: precondition not exercised; needs review' : 'Unsupported exposed control; manual proof required' }); continue; } + const s = selector(control); + actions.push(['scroll', s]); + // A selected tab/radio and a reset need a changed starting state to be tested. + const peer = controls.find(c => c.index !== control.index && action(c) && (control.group ? c.group === control.group : action(c) && !/reset/i.test(c.label))); + if (peer && (control.selected || /reset|restart|clear/i.test(control.label))) actions.push(...action(peer)); + if (control.type === 'range' || control.type === 'slider') actions.push(['drag', s, 0.8, 0.5, 0.2, 0.5]); + actions.push(['move', scope, 0.01, 0.01], ['wait', 400]); + const paths = ['before0','before1','before2','after0','after1'].map(name => join(dir, `control-${control.index}-${name}.png`)); + actions.push(['eval', `(()=>{const root=document.querySelector(${JSON.stringify(scope)}),r=root.getBoundingClientRect();return {maskFor:${control.index},rects:[...root.querySelectorAll('[data-launch-control]')].map(e=>{const b=(e.closest('label,.pg-control,[data-pg]')||e).getBoundingClientRect();return {x:b.x-r.x+4,y:b.y-r.y+4,w:b.width,h:b.height}})}})()`]); + for (let n = 0; n < 3; n++) actions.push(['shot', paths[n], scope], ['wait', 450]); + actions.push(...steps, ['move', scope, 0.01, 0.01], ['wait', 450], ['shot', paths[3], scope], ['wait', 450], ['shot', paths[4], scope]); + plans.push({ ...control, paths, steps }); + } + actions.push(['eval', listExpression]); + const exercised = await drive(target, actions, join(dir, 'controls'), width); + const results = plans.map(plan => { + if (!plan.paths) return plan; + const masks = exercised.evals.find(v => v?.maskFor === plan.index)?.rects; + if (!masks) return { ...plan, pass: false, reason: 'Control masks unavailable' }; + try { return { ...plan, ...visualDelta(plan.paths, masks) }; } + catch (error) { return { ...plan, pass: false, reason: String(error) }; } + }); + const last = exercised.evals.filter(Array.isArray).at(-1) || []; + for (const c of last) if (!controls.some(p => p.tag === c.tag && p.type === c.type && p.label === c.label)) + results.push({ ...c, pass: false, reason: 'Interaction exposed another control that was not exercised' }); + const pass = exercised.code === 0 && !exercised.log.includes('exception:') && results.every(c => c.pass); + const report = { pass, controls: results, reason: pass ? 'Every exposed control produced an output change' : 'At least one control is dead, unsupported, or unproven' }; + writeFileSync(join(dir, 'controls.json'), JSON.stringify(report, null, 2)); + return report; +} diff --git a/plugins/playgrounds/evals/launch/metrics.mjs b/plugins/playgrounds/evals/launch/metrics.mjs new file mode 100644 index 000000000..a6df6fee9 --- /dev/null +++ b/plugins/playgrounds/evals/launch/metrics.mjs @@ -0,0 +1,18 @@ +export const failureScore = (visibleMs, capMs) => Number.isFinite(visibleMs) && visibleMs >= 0 && visibleMs <= capMs ? visibleMs : capMs; +export function resumeMismatch(old, next) { + return ['label','url','host','pluginRoot','commit','capMs','prompts','providers'].find(key => JSON.stringify(old[key]) !== JSON.stringify(next[key])); +} +export function providerSummary(provider, all) { + const done = all.filter(Boolean), complete = done.length === 20 && all.length === 20; + const times = done.map(r => r.scoreMs).sort((a,b) => a-b); + const medianMs = complete ? (times[9]+times[10])/2 : null; + const p90Ms = complete ? times[Math.ceil(times.length*0.9)-1] : null; + const liveCards = done.filter(r => r.cardVisible && r.controls?.pass).length; + const questions = done.reduce((sum,r) => sum + (r.questions?.count || 0), 0); + const reviews = done.filter(r => r.questions?.needsReview || r.questions === undefined).length; + const progressShown = done.filter(r => r.progress?.length).length; + return { provider, complete, completed:done.length, total:20, medianMs, p90Ms, liveCards, + clarifyingQuestions:questions, questionReviewsNeeded:reviews, progressShown, failures:done.filter(r => !r.pass).length, + pass:complete && liveCards >= 18 && questions === 0 && reviews === 0 && progressShown === 20 && medianMs <= 180_000 && p90Ms <= 360_000, + results:done.map(r => ({promptId:r.promptId,model:r.model,scoreMs:r.scoreMs,cardVisible:r.cardVisible,pass:r.pass,error:r.error})) }; +} diff --git a/plugins/playgrounds/evals/launch/metrics.test.ts b/plugins/playgrounds/evals/launch/metrics.test.ts new file mode 100644 index 000000000..1ecdab6d5 --- /dev/null +++ b/plugins/playgrounds/evals/launch/metrics.test.ts @@ -0,0 +1,45 @@ +import { describe, expect, it } from 'vitest'; +// Eval helpers are executable Node ESM, intentionally outside the shipped TS bundle. +// @ts-expect-error no declaration needed for eval-only JavaScript +import { failureScore, providerSummary, resumeMismatch } from './metrics.mjs'; +const success = (scoreMs = 120_000) => ({ scoreMs, cardVisible:true, controls:{pass:true}, questions:{count:0,needsReview:false}, progress:[{text:'Building'}], pass:true }); +describe('launch gate accounting', () => { + it('penalizes absent and out-of-cap cards instead of making early failures fast', () => { + expect(failureScore(null,900_000)).toBe(900_000); + expect(failureScore(undefined,900_000)).toBe(900_000); + expect(failureScore(-1,900_000)).toBe(900_000); + expect(failureScore(910_000,900_000)).toBe(900_000); + expect(failureScore(150_000,900_000)).toBe(150_000); + }); + it('uses all twenty including capped failures for median and nearest-rank p90', () => { + const rows = Array.from({length:20},(_,i) => success((i+1)*30_000)); + rows[19] = {...success(900_000),cardVisible:false,controls:{pass:false},pass:false}; + const summary = providerSummary('codex',rows); + expect(summary.medianMs).toBe(315_000); + expect(summary.p90Ms).toBe(540_000); + expect(summary.liveCards).toBe(19); + expect(summary.pass).toBe(false); + }); + it('does not publish launch percentiles from a cherry-picked subset', () => { + const summary = providerSummary('codex',[success(),...Array(19).fill(null)]); + expect(summary.medianMs).toBeNull(); + expect(summary.p90Ms).toBeNull(); + expect(summary.complete).toBe(false); + expect(summary.pass).toBe(false); + }); + it('requires question review and progress as well as live controls', () => { + const rows = Array.from({length:20},() => success()); + expect(providerSummary('codex',rows).pass).toBe(true); + rows[0].questions.needsReview = true; + expect(providerSummary('codex',rows).pass).toBe(false); + rows[0].questions.needsReview = false; + rows[0].progress = []; + expect(providerSummary('codex',rows).pass).toBe(false); + }); + it('prevents resume from mixing revisions, caps, providers, or prompts', () => { + const first = {label:'baseline',url:'http://localhost:4000',host:'h',pluginRoot:'/p',commit:'abc',capMs:900_000,prompts:['one'],providers:['codex']}; + expect(resumeMismatch(first,{...first})).toBeUndefined(); + for (const [key,value] of [['commit','def'],['capMs',60_000],['prompts',['two']],['providers',['claude-code']]]) + expect(resumeMismatch(first,{...first,[String(key)]:value})).toBe(key); + }); +}); diff --git a/plugins/playgrounds/evals/launch/pixels.mjs b/plugins/playgrounds/evals/launch/pixels.mjs new file mode 100644 index 000000000..4e7e16d5b --- /dev/null +++ b/plugins/playgrounds/evals/launch/pixels.mjs @@ -0,0 +1,32 @@ +import { createRequire } from 'node:module'; +import { readFileSync } from 'node:fs'; +const require = createRequire(import.meta.url); +// Optional absolute module path supports an existing bb checkout without adding +// a browser/image stack to the shipped plugin's runtime dependencies. +const { PNG } = require(process.env.LAUNCH_PNGJS || 'pngjs'); +export const readPng = file => PNG.sync.read(readFileSync(file)); +const delta = (a, b, i) => Math.max(...[0, 1, 2].map(c => Math.abs(a.data[i + c] - b.data[i + c]))); +export function visualDelta(files, masks = []) { + const [a, b, c, d, e] = files.map(readPng); + if ([b, c, d, e].some(p => p.width !== a.width || p.height !== a.height)) + return { pass: false, reason: 'screenshot dimensions changed; needs review' }; + let stable = 0, changed = 0, ambient = 0; + for (let y = 0; y < a.height; y++) for (let x = 0; x < a.width; x++) { + if (masks.some(r => x >= r.x - 6 && x <= r.x + r.w + 6 && y >= r.y - 6 && y <= r.y + r.h + 6)) continue; + const i = (y * a.width + x) * 4; + if (delta(a, b, i) > 12 || delta(b, c, i) > 12) { ambient++; continue; } + stable++; + if (delta(c, d, i) > 18 && delta(c, e, i) > 18 && delta(d, e, i) <= 12) changed++; + } + // Moving scenes cannot pass solely because motion crossed previously still + // pixels. Require a large excess over the no-input motion observed before it. + const required = Math.max(24, ambient * 4); + return { pass: changed >= required, changed, required, ambient, stable, + reason: changed >= required ? 'stable output changed outside controls' : 'no proven output change outside controls' }; +} +export function hasInk(file) { + const p = readPng(file); + const colors = new Set(); + for (let i = 0; i < p.data.length; i += 16) colors.add(`${p.data[i] >> 4},${p.data[i+1] >> 4},${p.data[i+2] >> 4}`); + return p.width > 80 && p.height > 40 && colors.size > 8; +} diff --git a/plugins/playgrounds/evals/launch/pixels.test.ts b/plugins/playgrounds/evals/launch/pixels.test.ts new file mode 100644 index 000000000..59e79d44a --- /dev/null +++ b/plugins/playgrounds/evals/launch/pixels.test.ts @@ -0,0 +1,37 @@ +import { afterEach, describe, expect, it } from 'vitest'; +import { createRequire } from 'node:module'; +import { mkdtempSync, rmSync, writeFileSync } from 'node:fs'; +import { tmpdir } from 'node:os'; +import { join } from 'node:path'; +// @ts-expect-error eval-only ESM is not part of the shipped TypeScript bundle +import { visualDelta } from './pixels.mjs'; +const require = createRequire(import.meta.url); +const { PNG } = require('pngjs'); +const directories: string[] = []; +afterEach(() => { for (const dir of directories.splice(0)) rmSync(dir,{recursive:true,force:true}); }); +function shots(paint: (frame: number, x: number, y: number) => number) { + const dir = mkdtempSync(join(tmpdir(),'launch-pixels-')); directories.push(dir); + return Array.from({length:5},(_,frame) => { + const png = new PNG({width:64,height:64}); + for (let y=0;y<64;y++) for (let x=0;x<64;x++) { + const i = (y*64+x)*4, value = paint(frame,x,y); + png.data[i]=png.data[i+1]=png.data[i+2]=value; png.data[i+3]=255; + } + const path=join(dir,`${frame}.png`);writeFileSync(path,PNG.sync.write(png));return path; + }); +} +describe('control screenshot evidence',() => { + it('fails a completely dead control',() => expect(visualDelta(shots(() => 255)).pass).toBe(false)); + it('does not accept a checkbox changing without output',() => { + const files=shots((f,x,y) => f>=3 && x<10 && y<10 ? 0 : 255); + expect(visualDelta(files,[{x:0,y:0,w:12,h:12}]).pass).toBe(false); + }); + it('does not count ongoing ambient animation as a live response',() => { + const files=shots((f,x,y) => x<30 && y<30 ? (f%2 ? 0 : 255) : 255); + expect(visualDelta(files).pass).toBe(false); + }); + it('accepts persistent output change outside the control mask',() => { + const files=shots((f,x,y) => f>=3 && x>30 && y>30 ? 0 : 255); + expect(visualDelta(files,[{x:0,y:0,w:12,h:12}]).pass).toBe(true); + }); +}); diff --git a/plugins/playgrounds/evals/launch/prompts.json b/plugins/playgrounds/evals/launch/prompts.json new file mode 100644 index 000000000..9b62dce21 --- /dev/null +++ b/plugins/playgrounds/evals/launch/prompts.json @@ -0,0 +1,22 @@ +[ + {"id":"washing-machine","group":"everyday","prompt":"How does a washing machine work?"}, + {"id":"bicycle-pump","group":"everyday","prompt":"How does a bicycle pump work?"}, + {"id":"zipper","group":"everyday","prompt":"How does a zipper work?"}, + {"id":"toilet","group":"everyday","prompt":"How does a toilet flush and refill?"}, + {"id":"thermos","group":"everyday","prompt":"How does a thermos keep a drink hot?"}, + {"id":"door-lock","group":"everyday","prompt":"How does a key open a door lock?"}, + {"id":"refrigerator","group":"everyday","prompt":"How does a refrigerator keep food cold?"}, + {"id":"stapler","group":"everyday","prompt":"How does a stapler work?"}, + {"id":"spray-bottle","group":"everyday","prompt":"How does a spray bottle work?"}, + {"id":"seat-belt","group":"everyday","prompt":"How does a seat belt lock when you brake suddenly?"}, + {"id":"toaster","group":"everyday","prompt":"How does a toaster know when to pop up?"}, + {"id":"umbrella","group":"everyday","prompt":"How does an umbrella open and close?"}, + {"id":"cdn","group":"dev","prompt":"Explain to my team how our CDN cache works and why a purge takes a while to show up."}, + {"id":"notification-settings","group":"dev","prompt":"Mock up notification settings with toggles for email, push, and a daily digest so I can try them."}, + {"id":"narrow-toggle","group":"dev","prompt":"Show me a narrow settings sidebar with a dark mode toggle I can switch on and off.","width":360}, + {"id":"dns","group":"dev","prompt":"How does DNS find the right server when I open a website?"}, + {"id":"database-index","group":"dev","prompt":"How does a database index make a query faster?"}, + {"id":"git-merge","group":"dev","prompt":"How does Git merge two branches?"}, + {"id":"websocket","group":"dev","prompt":"How does a WebSocket keep a chat app up to date?"}, + {"id":"load-balancer","group":"dev","prompt":"How does a load balancer spread requests across servers?"} +] diff --git a/plugins/playgrounds/evals/launch/run.mjs b/plugins/playgrounds/evals/launch/run.mjs new file mode 100644 index 000000000..b1850d44c --- /dev/null +++ b/plugins/playgrounds/evals/launch/run.mjs @@ -0,0 +1,238 @@ +#!/usr/bin/env node +import { spawn, execFileSync } from 'node:child_process'; +import { existsSync, mkdirSync, readFileSync, writeFileSync, renameSync } from 'node:fs'; +import { dirname, join, resolve } from 'node:path'; +import { fileURLToPath } from 'node:url'; +import { checkControls } from './controls.mjs'; +import { hasInk } from './pixels.mjs'; +import { failureScore, providerSummary, resumeMismatch } from './metrics.mjs'; + +const here = dirname(fileURLToPath(import.meta.url)); +const prompts = JSON.parse(readFileSync(join(here, 'prompts.json'), 'utf8')); +const args = {}; +for (let i = 2; i < process.argv.length; i++) { + const key = process.argv[i]; + if (!key.startsWith('--') || !process.argv[i+1] || process.argv[i+1].startsWith('--')) throw new Error(`Expected --option value: ${key}`); + args[key.slice(2)] = process.argv[++i]; +} +for (const key of ['url','host','out','label','plugin-root']) if (!args[key]) throw new Error(`Missing --${key}`); +const base = new URL(args.url); +if (!['127.0.0.1','localhost','[::1]'].includes(base.hostname)) throw new Error('Use a loopback isolated dev bb; production URLs are refused.'); +const out = resolve(args.out), pluginRoot = resolve(args['plugin-root']); +const drivePath = join(pluginRoot, 'skills/how-it-works/scripts/drive.mjs'); +if (!existsSync(drivePath)) throw new Error(`No bundled driver: ${drivePath}`); +const capMs = Number(args['cap-minutes'] || 15) * 60_000; +if (!(capMs > 0 && capMs <= 900_000)) throw new Error('Cap must be >0 and <=15 minutes'); +const providers = (args.providers || 'claude-code,codex').split(','); +const selected = prompts.filter(p => !args.only || args.only.split(',').includes(p.id)); +if (!selected.length) throw new Error('No prompt matched --only'); +mkdirSync(out, { recursive: true }); +mkdirSync(join(out, '.tmp'), { recursive: true }); +const manifestPath = join(out, 'manifest.json'); +const commit = args.commit || (() => { try { return execFileSync('git', ['-C', pluginRoot, 'rev-parse', 'HEAD'], {encoding:'utf8'}).trim(); } catch { return 'unverified'; } })(); +const manifest = { label: args.label, url: base.origin, host: args.host, pluginRoot, commit, capMs, + prompts, providers, modelSelection: 'omitted: default for each provider in fresh Personal project', + concurrency: 1, timing: 'HTTP prompt send until loaded card is visible in real thread DOM; polling resolution 150 ms, screenshot corroboration', + createdAt: new Date().toISOString() }; +if (existsSync(manifestPath)) { + const old = JSON.parse(readFileSync(manifestPath, 'utf8')); + const mismatch = resumeMismatch(old, manifest); + if (mismatch) throw new Error(`Cannot resume changed ${mismatch}; use another output directory`); +} else writeFileSync(manifestPath, JSON.stringify(manifest, null, 2)); + +async function api(path, body, method = body === undefined ? 'GET' : 'POST') { + const response = await fetch(new URL(`/api/v1${path}`, base), { + method, headers: { 'content-type':'application/json' }, body: body === undefined ? undefined : JSON.stringify(body), signal: AbortSignal.timeout(30_000), + }); + if (!response.ok) throw new Error(`${method} ${path}: ${response.status} ${(await response.text()).slice(0, 500)}`); + const text = await response.text(); + return text ? JSON.parse(text) : null; +} +function save(path, value) { + writeFileSync(`${path}.tmp`, JSON.stringify(value, null, 2)); + renameSync(`${path}.tmp`, path); +} +function rowsIn(value) { + const rows = value?.rows || []; + return rows.flatMap(row => [row, ...rowsIn({ rows: row.children || row.childRows || [] })]); +} +function questionEvidence(timeline, interactions) { + const assistant = rowsIn(timeline).filter(r => r.role === 'assistant'); + const textQuestions = assistant.flatMap(row => { + const clean = (row.text || '').replace(/```[\s\S]*?```/g, '').replace(/::[^\n]+/g, ''); + return (clean.match(/[^.!\n]*\?/g) || []).map(text => ({ rowId: row.id, text: text.trim(), + likely: /\b(would you|could you|can you|do you|you want|you prefer|should I|which (?:one|version|kind|type|level)|what (?:kind|type|level)|before I|shall I)\b/i.test(text) })); + }); + const list = Array.isArray(interactions) ? interactions : interactions?.interactions || []; + const structured = list.filter(i => /question/i.test(i.payload?.kind || i.kind || i.type || '')); + // Unclassified question marks are kept for explicit human adjudication. They + // cannot silently turn into a zero-question launch pass. + return { structured, textQuestions, count: structured.length + textQuestions.filter(q => q.likely).length, + needsReview: textQuestions.some(q => !q.likely) }; +} +function monitor(threadId) { + const visible = el => { + const r = el.getBoundingClientRect(); + return r.width > 80 && r.height > 40 && r.bottom > 0 && r.top < innerHeight && getComputedStyle(el).visibility !== 'hidden'; + }; + const loaded = new WeakSet(); + window.__launch = { proof: null, progress: [], errors: [], terminal: false }; + document.addEventListener('load', event => { if (event.target?.tagName === 'IFRAME' && event.target.src) loaded.add(event.target); }, true); + setInterval(() => { + if (window.__launch.proof) return; + const frame = document.querySelector('.pg-host .pg-widget iframe'); + const card = frame || document.querySelector('.pg-host .pg-answer:not([role="status"]):not(.pg-error)'); + if (!card) return; + card.scrollIntoView({block:'center'}); + if (!visible(card) || (frame && !loaded.has(frame))) return; + card.dataset.launchCard = 'visible'; + window.__launch.proof = { at: Date.now(), kind: frame ? 'html' : 'document', target: frame?.src || location.href, + width: card.getBoundingClientRect().width, height: card.getBoundingClientRect().height }; + }, 150); + const flatten = rows => rows.flatMap(row => [row, ...flatten(row.children || row.childRows || [])]); + const normalize = text => text.replace(/[*_`#\[\]]/g, '').replace(/\s+/g, ' ').trim(); + setInterval(async () => { + if (window.__launch.proof) return; + try { + const response = await fetch(`/api/v1/threads/${threadId}/timeline`); + if (!response.ok) throw new Error(`timeline ${response.status}`); + const timeline = await response.json(); + for (const row of flatten(timeline.rows || [])) if (row.role === 'assistant' && row.text?.trim()) { + const needle = normalize(row.text).slice(0, 32); + const elements = [...document.querySelectorAll('[data-message-column]')]; + const el = elements.find(el => normalize(el.innerText).includes(needle)); + if (el && el.getBoundingClientRect().height > 0 && el.getBoundingClientRect().bottom > 0 && el.getBoundingClientRect().top < innerHeight && !window.__launch.progress.some(p => p.rowId === row.id)) + window.__launch.progress.push({ rowId: row.id, at: Date.now(), text: row.text }); + } + const thread = await (await fetch(`/api/v1/threads/${threadId}`)).json(); + if (['idle','error'].includes(thread.status) && flatten(timeline.rows || []).some(row => row.role === 'assistant')) window.__launch.terminal = true; + } catch (error) { window.__launch.errors.push(String(error)); } + }, 1500); +} + +async function drive(target, actions, stem, width = 1280, { preload, timeout = 240_000 } = {}) { + writeFileSync(`${stem}.actions.json`, JSON.stringify(actions, null, 2)); + const command = [drivePath, target, '--actions', `${stem}.actions.json`, '--width', String(width), '--height', '1100', '--reduced']; + if (preload) command.push('--preload', preload); + const child = spawn(process.execPath, command, { detached: true, env: { ...process.env, TMPDIR: join(out, '.tmp') }, stdio: ['ignore','pipe','pipe'] }); + writeFileSync(`${stem}.pid`, String(child.pid)); + let log = ''; + child.stdout.on('data', chunk => { log += chunk; }); + child.stderr.on('data', chunk => { log += chunk; }); + const kill = () => { try { process.kill(-child.pid, 'SIGTERM'); } catch {} }; + const timer = setTimeout(kill, timeout); + const onSignal = () => kill(); + process.once('SIGTERM', onSignal); process.once('SIGINT', onSignal); + const code = await new Promise((resolve, reject) => { child.once('error', reject); child.once('exit', code => resolve(code ?? 124)); }); + clearTimeout(timer); process.removeListener('SIGTERM', onSignal); process.removeListener('SIGINT', onSignal); + writeFileSync(`${stem}.log`, log); + const evals = log.split('\n').filter(line => line.startsWith('eval: ')).flatMap(line => { try { return [JSON.parse(line.slice(6))]; } catch { return []; } }); + return { code, evals, log }; +} +function summarize() { + const results = providers.map(provider => { + const all = prompts.map(p => { + const path = join(out, provider, p.id, 'result.json'); + return existsSync(path) ? JSON.parse(readFileSync(path, 'utf8')) : null; + }); + return providerSummary(provider, all); + }); + save(join(out,'summary.json'), { label: args.label, commit, updatedAt: new Date().toISOString(), providers: results }); + writeFileSync(join(out,'summary.md'), `# ${args.label}\n\nSource: ${commit}. Cap: ${capMs/60000} minutes. Fresh Personal threads; default models.\n\n` + + '| Provider | Completed | Median | p90 | All controls live | Clarifying questions | Question reviews | Progress | Gate |\n|---|---:|---:|---:|---:|---:|---:|---:|---|\n' + + results.map(r => `| ${r.provider} | ${r.completed}/20 | ${r.medianMs === null ? 'pending' : (r.medianMs/60000).toFixed(2)+' min'} | ${r.p90Ms === null ? 'pending' : (r.p90Ms/60000).toFixed(2)+' min'} | ${r.liveCards}/20 | ${r.clarifyingQuestions} | ${r.questionReviewsNeeded} | ${r.progressShown}/20 | ${r.pass ? 'PASS' : r.complete ? 'FAIL' : 'INCOMPLETE'} |`).join('\n') + + '\n\nMedian uses the middle pair; p90 uses nearest rank. Every missing card and capped run is scored at the cap, including early failures. A visible card with failed controls retains its measured time and fails control quality. Partial runs do not produce launch percentiles. Review question evidence before declaring zero clarifications.\n'); +} + +// Fail infrastructure preflight before any scored prompt is sent. The fixture +// checks the driver, real input dispatch, masking, image decoding, and output diff. +const defaultModels = new Map(); +const preflightDir = join(out,'preflight'); mkdirSync(preflightDir,{recursive:true}); +await api('/projects/proj_personal'); +const plugins = await api('/plugins'); save(join(preflightDir,'plugins.json'),plugins); +if (!JSON.stringify(plugins).includes('playgrounds')) throw new Error('Preflight: Playgrounds is not installed'); +for (const provider of providers) { + const options = await api(`/system/execution-options?hostId=${encodeURIComponent(args.host)}&projectId=proj_personal&providerId=${encodeURIComponent(provider)}`); + save(join(preflightDir,`${provider}-models.json`),options); + if (options.modelLoadError || !options.models?.some(m => m.isDefault)) throw new Error(`Preflight: no usable default model for ${provider}`); + defaultModels.set(provider,options.models.find(m => m.isDefault).model); +} +const fixture = join(preflightDir,'fixture.html'); +writeFileSync(fixture, '0'); +const fixtureResult = await checkControls({target:fixture,width:480,dir:preflightDir,drive}); +if (!fixtureResult.pass) throw new Error(`Preflight: browser/control driver failed; see ${preflightDir}/controls.json`); +const ui = await drive(base.href,[['until','Boolean(document.querySelector("#root")?.children.length)',20_000],['eval','({ready:Boolean(document.querySelector("#root")?.children.length),text:document.body.innerText.slice(0,300)})'],['shot',join(preflightDir,'bb.png'),'body']],join(preflightDir,'ui'),1280); +if (ui.code || !ui.evals.some(v => v?.ready) || !hasInk(join(preflightDir,'bb.png'))) throw new Error('Preflight: dev bb UI did not render'); + +for (const provider of providers) for (const prompt of selected) { + const dir = join(out,provider,prompt.id), resultPath = join(dir,'result.json'); + mkdirSync(dir,{recursive:true}); + if (existsSync(resultPath)) { summarize(); continue; } + const inflightPath = join(dir,'inflight.json'); + if (existsSync(inflightPath)) { + const interrupted = JSON.parse(readFileSync(inflightPath,'utf8')); + if (interrupted.threadId) await api(`/threads/${interrupted.threadId}/stop`,{}).catch(() => {}); + save(resultPath, { ...interrupted, pass:false, cardVisible:false, scoreMs:capMs, error:'Runner interrupted: counted as capped failure. Use a new output directory for an independent rerun.' }); + summarize(); continue; + } + const result = { provider, promptId:prompt.id, prompt:prompt.prompt, label:args.label, sentAt:Date.now(), pass:false, cardVisible:false, scoreMs:capMs }; + save(inflightPath,result); + console.log(`${new Date().toISOString()} ${provider}/${prompt.id}: sending`); + try { + const thread = await api('/threads', { projectId:'proj_personal', providerId:provider, origin:'app', + input:[{type:'text',text:prompt.prompt}], environment:{type:'host',hostId:args.host,workspace:{type:'personal'}} }); + result.threadId = thread.id; + result.actualProvider = thread.providerId; + result.environmentId = thread.environmentId; + save(inflightPath,result); + const threadInfo = await api(`/threads/${thread.id}?include=environment`); + save(join(dir,'thread.json'),threadInfo); + const defaults = await api(`/threads/${thread.id}/default-execution-options`); + save(join(dir,'execution-options.json'),defaults); + result.model = defaults?.model || null; + result.catalogDefaultModel = defaultModels.get(provider); + if (thread.providerId !== provider || !result.model) throw new Error('Actual provider/model could not be verified'); + if (result.model !== result.catalogDefaultModel) throw new Error('Personal remembered a non-default model; reset the isolated instance before measuring'); + if (threadInfo.projectId !== 'proj_personal') throw new Error('Thread was not created in Personal'); + const preload = join(dir,'monitor.js'); + writeFileSync(preload, `(${monitor.toString()})(${JSON.stringify(thread.id)});`); + const remaining = Math.max(1, capMs - (Date.now()-result.sentAt)); + const visible = await drive(new URL(`/threads/${thread.id}`,base).href, + [['until','window.__launch?.proof || window.__launch?.terminal',remaining], ['eval','window.__launch'], ['shot',join(dir,'visible.png'),'[data-launch-card="visible"]']], + join(dir,'visible'),prompt.width || 1280,{preload,timeout:remaining+20_000}); + const measurement = visible.evals.find(v => v && Object.hasOwn(v,'proof')); + const proof = measurement?.proof; + result.progress = measurement?.progress || []; + result.browserErrors = measurement?.errors || []; + result.proof = proof; + result.wallMs = Date.now()-result.sentAt; + result.cardVisible = Boolean(proof && proof.at <= result.sentAt+capMs && visible.code === 0 && hasInk(join(dir,'visible.png'))); + result.visibleMs = result.cardVisible ? Math.max(0,proof.at-result.sentAt) : null; + result.scoreMs = failureScore(result.visibleMs,capMs); + const timeline = await api(`/threads/${thread.id}/timeline`); + const interactions = await api(`/threads/${thread.id}/interactions`); + save(join(dir,'timeline.json'),timeline); + save(join(dir,'interactions.json'),interactions); + result.questions = questionEvidence(timeline,interactions); + await api(`/threads/${thread.id}/stop`,{}); + if (result.cardVisible) { + const widths = prompt.id === 'narrow-toggle' ? [360,390,480] : [Math.round(proof.width)]; + const views = []; + for (const width of widths) { + const viewDir = join(dir,`width-${width}`); mkdirSync(viewDir,{recursive:true}); + views.push({width,...await checkControls({ target:proof.target, scope:proof.kind === 'html' ? 'body' : '.pg-host .pg-answer',width,dir:viewDir,drive })}); + } + result.controls = {pass:views.every(view => view.pass),views,reason:views.every(view => view.pass) ? 'All controls live at every width' : 'A control failed or needs review'}; + } + else result.error = 'No loaded, visibly rendered card before cap (or browser proof failed)'; + result.pass = Boolean(result.cardVisible && result.controls?.pass && result.questions.count === 0 && !result.questions.needsReview && result.progress.length > 0); + } catch (error) { result.error = String(error); } + finally { + if (result.threadId) await api(`/threads/${result.threadId}/stop`,{}).catch(error => { result.stopError = String(error); }); + result.finishedAt = Date.now(); + result.wallMs ??= result.finishedAt-result.sentAt; + save(resultPath,result); summarize(); + console.log(`${provider}/${prompt.id}: ${result.pass ? 'PASS' : 'FAIL'} ${(result.scoreMs/60000).toFixed(2)} min; ${result.error || result.controls?.reason || ''}`); + } +} +console.log(join(out,'summary.md')); From 6a1de6b52427265009ef693bcfcd80b0d8c79ff4 Mon Sep 17 00:00:00 2001 From: brsbl <57682038+brsbl@users.noreply.github.com> Date: Mon, 19 Oct 2026 22:07:51 +0000 Subject: [PATCH 03/15] Cover custom pointer controls and stop interrupted evals --- plugins/playgrounds/evals/launch/controls.mjs | 9 +++++---- plugins/playgrounds/evals/launch/run.mjs | 7 +++++++ 2 files changed, 12 insertions(+), 4 deletions(-) diff --git a/plugins/playgrounds/evals/launch/controls.mjs b/plugins/playgrounds/evals/launch/controls.mjs index 4fa1ada6b..bc9d1a490 100644 --- a/plugins/playgrounds/evals/launch/controls.mjs +++ b/plugins/playgrounds/evals/launch/controls.mjs @@ -8,7 +8,8 @@ export function inventory(scope = 'body') { if (!root) return []; const candidates = [...root.querySelectorAll('button,input:not([type="hidden"]),select,textarea,[role="button"],[role="switch"],[role="slider"],[role="checkbox"],[role="radio"],[role="tab"],[tabindex],canvas,[onclick],[data-drag]')]; for (const el of root.querySelectorAll('*')) { - if (getComputedStyle(el).cursor === 'pointer' && getComputedStyle(el.parentElement || el).cursor !== 'pointer') candidates.push(el); + const cursor = getComputedStyle(el).cursor; + if (/^(pointer|grab|grabbing|move|.*resize)$/.test(cursor) && getComputedStyle(el.parentElement || el).cursor !== cursor) candidates.push(el); } return [...new Set(candidates)].filter(el => { const r = el.getBoundingClientRect(); @@ -16,7 +17,7 @@ export function inventory(scope = 'body') { !candidates.some(child => child !== el && el.contains(child)); }).map((el, i) => { el.dataset.launchControl = String(i); - return { disabled: Boolean(el.disabled || el.getAttribute('aria-disabled') === 'true'), index: i, tag: el.tagName.toLowerCase(), type: el.type || el.getAttribute('role') || '', + return { cursor: getComputedStyle(el).cursor, disabled: Boolean(el.disabled || el.getAttribute('aria-disabled') === 'true'), index: i, tag: el.tagName.toLowerCase(), type: el.type || el.getAttribute('role') || '', label: el.getAttribute('aria-label') || el.textContent?.trim().slice(0, 100) || el.id || `control ${i}`, selected: el.checked || el.getAttribute('aria-pressed') === 'true' || el.getAttribute('aria-selected') === 'true', group: el.name || el.closest('[role="tablist"],.pg-seg,.pg-segmented')?.outerHTML.slice(0, 120) || null }; @@ -27,13 +28,13 @@ function action(c) { const s = selector(c); if (c.disabled) return null; if (c.tag === 'canvas' || (c.tag === 'input' && ['file','color','date','time','datetime-local','month','week'].includes(c.type))) return null; - if (c.type === 'range' || c.type === 'slider' || c.type === 'dial') return [['drag', s, 0.2, 0.5, 0.85, 0.5, 20]]; + if (c.type === 'range' || c.type === 'slider' || c.type === 'dial' || /grab|move|resize/.test(c.cursor || '')) return [['drag', s, 0.2, 0.5, 0.85, 0.5, 20]]; if (c.tag === 'select') return [['click', s], ['key', 'ArrowDown', s], ['key', 'Enter', s]]; if (c.tag === 'textarea' || (c.tag === 'input' && ['text','search','email','url','password','tel','number'].includes(c.type))) { if (c.type === 'number') return [['click', s], ['key', 'ArrowUp', s]]; return [['click', s], ['key', 'x', s]]; } - if (c.tag === 'button' || ['button','submit','reset','checkbox','radio','switch','tab'].includes(c.type) || c.tag === 'a') return [['click', s]]; + if (c.tag === 'button' || ['button','submit','reset','checkbox','radio','switch','tab'].includes(c.type) || c.tag === 'a' || c.cursor === 'pointer') return [['click', s]]; return null; } diff --git a/plugins/playgrounds/evals/launch/run.mjs b/plugins/playgrounds/evals/launch/run.mjs index b1850d44c..05bb98727 100644 --- a/plugins/playgrounds/evals/launch/run.mjs +++ b/plugins/playgrounds/evals/launch/run.mjs @@ -7,6 +7,9 @@ import { checkControls } from './controls.mjs'; import { hasInk } from './pixels.mjs'; import { failureScore, providerSummary, resumeMismatch } from './metrics.mjs'; +let interrupted = false; +process.on('SIGTERM', () => { interrupted = true; }); +process.on('SIGINT', () => { interrupted = true; }); const here = dirname(fileURLToPath(import.meta.url)); const prompts = JSON.parse(readFileSync(join(here, 'prompts.json'), 'utf8')); const args = {}; @@ -165,6 +168,7 @@ const ui = await drive(base.href,[['until','Boolean(document.querySelector("#roo if (ui.code || !ui.evals.some(v => v?.ready) || !hasInk(join(preflightDir,'bb.png'))) throw new Error('Preflight: dev bb UI did not render'); for (const provider of providers) for (const prompt of selected) { + if (interrupted) throw new Error('Runner interrupted'); const dir = join(out,provider,prompt.id), resultPath = join(dir,'result.json'); mkdirSync(dir,{recursive:true}); if (existsSync(resultPath)) { summarize(); continue; } @@ -194,6 +198,7 @@ for (const provider of providers) for (const prompt of selected) { if (thread.providerId !== provider || !result.model) throw new Error('Actual provider/model could not be verified'); if (result.model !== result.catalogDefaultModel) throw new Error('Personal remembered a non-default model; reset the isolated instance before measuring'); if (threadInfo.projectId !== 'proj_personal') throw new Error('Thread was not created in Personal'); + if (interrupted) throw new Error('Runner interrupted'); const preload = join(dir,'monitor.js'); writeFileSync(preload, `(${monitor.toString()})(${JSON.stringify(thread.id)});`); const remaining = Math.max(1, capMs - (Date.now()-result.sentAt)); @@ -234,5 +239,7 @@ for (const provider of providers) for (const prompt of selected) { save(resultPath,result); summarize(); console.log(`${provider}/${prompt.id}: ${result.pass ? 'PASS' : 'FAIL'} ${(result.scoreMs/60000).toFixed(2)} min; ${result.error || result.controls?.reason || ''}`); } + if (result.stopError) throw new Error(`Could not stop owned thread ${result.threadId}: ${result.stopError}`); + if (interrupted) throw new Error('Runner interrupted'); } console.log(join(out,'summary.md')); From 0fc3eba1c2bdf48e82ae28b825bbef4035015d61 Mon Sep 17 00:00:00 2001 From: brsbl <57682038+brsbl@users.noreply.github.com> Date: Mon, 19 Oct 2026 22:14:24 +0000 Subject: [PATCH 04/15] Keep transient controls and bound logged render grace --- plugins/playgrounds/evals/launch/README.md | 15 ++++- plugins/playgrounds/evals/launch/controls.mjs | 21 ++++-- plugins/playgrounds/evals/launch/metrics.mjs | 4 +- .../playgrounds/evals/launch/metrics.test.ts | 6 +- .../playgrounds/evals/launch/observations.mjs | 27 ++++++++ .../evals/launch/observations.test.ts | 65 +++++++++++++++++++ plugins/playgrounds/evals/launch/run.mjs | 48 +++++++++++--- 7 files changed, 166 insertions(+), 20 deletions(-) create mode 100644 plugins/playgrounds/evals/launch/observations.mjs create mode 100644 plugins/playgrounds/evals/launch/observations.test.ts diff --git a/plugins/playgrounds/evals/launch/README.md b/plugins/playgrounds/evals/launch/README.md index 35250a82c..6693e639a 100644 --- a/plugins/playgrounds/evals/launch/README.md +++ b/plugins/playgrounds/evals/launch/README.md @@ -64,7 +64,14 @@ non-default model for Personal, reset the **isolated instance** before measuring - A missing card, interrupted run, or capped run is a failure at the cap time, including an agent that finishes early without a card. `wallMs` records actual elapsed time separately. Idle plus an assistant response ends a no-card run - early. A visible card with a dead control retains its measured delivery time + early, after a fixed render grace of at most 30 seconds. The grace ends at the + original run cap if that comes first; it never extends or subtracts from + send-to-card latency. `agentCompletedAt`, `terminalObservedAt`, + `renderGraceUsed`, `renderDelayMs`, and `renderGraceRetainedCard` distinguish + agent time from delayed UI rendering. Every affected case appears in the + console log and both summaries. Completion time comes from the timeline turn + when available, otherwise the first observed terminal status is labeled as + the source. A visible card with a dead control retains its measured delivery time and fails the control criterion. - The bundled `scripts/drive.mjs` opens the actual served frame URL and uses real pointer/keyboard input. Range controls are dragged; toggles/buttons clicked; @@ -72,6 +79,10 @@ non-default model for Personal, reset the **isolated instance** before measuring controls are driven in the real thread UI. Narrow-toggle is tested at 360, 390, and 480 px. Every exposed control must be proven, including newly exposed, disabled, and unsupported custom controls: unproven behavior fails with a reason. + Inventory is captured after every click, drag, key, move, scroll and wait. + Stable DOM identities prevent reassignment when controls appear or disappear; + newly exposed controls are retained as unproven failures even if a later tab + hides them. `controls.json` retains these intermediate inventories. - Three no-input and two post-input screenshots are retained per control. The diff masks control/label regions, ignores pixels already moving before input, requires persistent output change, and requires changed output to exceed the @@ -86,7 +97,7 @@ nearest rank. Gate: at least 18/20 cards with all controls live, zero clarifying questions or outstanding question reviews, median <=3 minutes, p90 <=6 minutes, and progress on all twenty. A preflight subset is explicitly incomplete. -Completed cases are never overwritten on resume. Revision, source path, cap, +Completed cases are never overwritten on resume. Revision, source path, cap, render grace, prompts and provider list must match the manifest. An interrupted in-flight case is stopped and counted as capped; a fresh measurement needs a separate output directory. Keep raw evidence and document any human adjudication beside the diff --git a/plugins/playgrounds/evals/launch/controls.mjs b/plugins/playgrounds/evals/launch/controls.mjs index bc9d1a490..9a4b6ed61 100644 --- a/plugins/playgrounds/evals/launch/controls.mjs +++ b/plugins/playgrounds/evals/launch/controls.mjs @@ -1,6 +1,7 @@ import { join } from 'node:path'; import { writeFileSync } from 'node:fs'; import { visualDelta } from './pixels.mjs'; +import { observeInteractions, unexercisedControls } from './observations.mjs'; // This is run in the card's real rendered frame (not a reconstructed mock). export function inventory(scope = 'body') { @@ -11,11 +12,14 @@ export function inventory(scope = 'body') { const cursor = getComputedStyle(el).cursor; if (/^(pointer|grab|grabbing|move|.*resize)$/.test(cursor) && getComputedStyle(el.parentElement || el).cursor !== cursor) candidates.push(el); } + const identities = window.__launchControlIdentities ||= { elements: new WeakMap(), next: 0 }; return [...new Set(candidates)].filter(el => { const r = el.getBoundingClientRect(); return r.width > 0 && r.height > 0 && getComputedStyle(el).visibility !== 'hidden' && !candidates.some(child => child !== el && el.contains(child)); - }).map((el, i) => { + }).map(el => { + if (!identities.elements.has(el)) identities.elements.set(el, identities.next++); + const i = identities.elements.get(el); el.dataset.launchControl = String(i); return { cursor: getComputedStyle(el).cursor, disabled: Boolean(el.disabled || el.getAttribute('aria-disabled') === 'true'), index: i, tag: el.tagName.toLowerCase(), type: el.type || el.getAttribute('role') || '', label: el.getAttribute('aria-label') || el.textContent?.trim().slice(0, 100) || el.id || `control ${i}`, @@ -62,7 +66,7 @@ export async function checkControls({ target, scope = 'body', width, dir, drive plans.push({ ...control, paths, steps }); } actions.push(['eval', listExpression]); - const exercised = await drive(target, actions, join(dir, 'controls'), width); + const exercised = await drive(target, observeInteractions(actions, listExpression), join(dir, 'controls'), width); const results = plans.map(plan => { if (!plan.paths) return plan; const masks = exercised.evals.find(v => v?.maskFor === plan.index)?.rects; @@ -70,11 +74,16 @@ export async function checkControls({ target, scope = 'body', width, dir, drive try { return { ...plan, ...visualDelta(plan.paths, masks) }; } catch (error) { return { ...plan, pass: false, reason: String(error) }; } }); - const last = exercised.evals.filter(Array.isArray).at(-1) || []; - for (const c of last) if (!controls.some(p => p.tag === c.tag && p.type === c.type && p.label === c.label)) - results.push({ ...c, pass: false, reason: 'Interaction exposed another control that was not exercised' }); + const initial = exercised.evals.find(Array.isArray) || controls; + const snapshots = [ + { inventoryAfter: {phase:'start'}, controls: initial }, + ...exercised.evals.filter(value => value?.inventoryAfter), + { inventoryAfter: {phase:'end'}, controls: exercised.evals.filter(Array.isArray).at(-1) || [] }, + ]; + for (const control of unexercisedControls(controls, snapshots)) + results.push({ ...control, pass: false, reason: 'Interaction exposed another control that was not exercised (retained even if later hidden)' }); const pass = exercised.code === 0 && !exercised.log.includes('exception:') && results.every(c => c.pass); - const report = { pass, controls: results, reason: pass ? 'Every exposed control produced an output change' : 'At least one control is dead, unsupported, or unproven' }; + const report = { pass, controls: results, inventories: snapshots, reason: pass ? 'Every exposed control produced an output change' : 'At least one control is dead, unsupported, or unproven' }; writeFileSync(join(dir, 'controls.json'), JSON.stringify(report, null, 2)); return report; } diff --git a/plugins/playgrounds/evals/launch/metrics.mjs b/plugins/playgrounds/evals/launch/metrics.mjs index a6df6fee9..1f64ee721 100644 --- a/plugins/playgrounds/evals/launch/metrics.mjs +++ b/plugins/playgrounds/evals/launch/metrics.mjs @@ -1,6 +1,6 @@ export const failureScore = (visibleMs, capMs) => Number.isFinite(visibleMs) && visibleMs >= 0 && visibleMs <= capMs ? visibleMs : capMs; export function resumeMismatch(old, next) { - return ['label','url','host','pluginRoot','commit','capMs','prompts','providers'].find(key => JSON.stringify(old[key]) !== JSON.stringify(next[key])); + return ['label','url','host','pluginRoot','commit','capMs','renderGraceMs','prompts','providers'].find(key => JSON.stringify(old[key]) !== JSON.stringify(next[key])); } export function providerSummary(provider, all) { const done = all.filter(Boolean), complete = done.length === 20 && all.length === 20; @@ -14,5 +14,5 @@ export function providerSummary(provider, all) { return { provider, complete, completed:done.length, total:20, medianMs, p90Ms, liveCards, clarifyingQuestions:questions, questionReviewsNeeded:reviews, progressShown, failures:done.filter(r => !r.pass).length, pass:complete && liveCards >= 18 && questions === 0 && reviews === 0 && progressShown === 20 && medianMs <= 180_000 && p90Ms <= 360_000, - results:done.map(r => ({promptId:r.promptId,model:r.model,scoreMs:r.scoreMs,cardVisible:r.cardVisible,pass:r.pass,error:r.error})) }; + results:done.map(r => ({promptId:r.promptId,model:r.model,scoreMs:r.scoreMs,cardVisible:r.cardVisible,pass:r.pass,error:r.error,agentCompletedAt:r.agentCompletedAt ?? null,terminalObservedAt:r.terminalObservedAt ?? null,renderGraceUsed:r.renderGraceUsed ?? false,renderDelayMs:r.renderDelayMs ?? null,renderGraceRetainedCard:r.renderGraceRetainedCard ?? false})) }; } diff --git a/plugins/playgrounds/evals/launch/metrics.test.ts b/plugins/playgrounds/evals/launch/metrics.test.ts index 1ecdab6d5..c031c1d4f 100644 --- a/plugins/playgrounds/evals/launch/metrics.test.ts +++ b/plugins/playgrounds/evals/launch/metrics.test.ts @@ -39,7 +39,11 @@ describe('launch gate accounting', () => { it('prevents resume from mixing revisions, caps, providers, or prompts', () => { const first = {label:'baseline',url:'http://localhost:4000',host:'h',pluginRoot:'/p',commit:'abc',capMs:900_000,prompts:['one'],providers:['codex']}; expect(resumeMismatch(first,{...first})).toBeUndefined(); - for (const [key,value] of [['commit','def'],['capMs',60_000],['prompts',['two']],['providers',['claude-code']]]) + for (const [key,value] of [['commit','def'],['capMs',60_000],['renderGraceMs',30_000],['prompts',['two']],['providers',['claude-code']]]) expect(resumeMismatch(first,{...first,[String(key)]:value})).toBe(key); }); + it('preserves every grace-affected run in summary evidence', () => { + const run = {...success(114_000),promptId:'cdn',agentCompletedAt:100_000,terminalObservedAt:101_000,renderGraceUsed:true,renderDelayMs:14_000,renderGraceRetainedCard:true}; + expect(providerSummary('codex',[run]).results[0]).toMatchObject({promptId:'cdn',scoreMs:114_000,agentCompletedAt:100_000,terminalObservedAt:101_000,renderGraceUsed:true,renderDelayMs:14_000,renderGraceRetainedCard:true}); + }); }); diff --git a/plugins/playgrounds/evals/launch/observations.mjs b/plugins/playgrounds/evals/launch/observations.mjs new file mode 100644 index 000000000..2e92b4af8 --- /dev/null +++ b/plugins/playgrounds/evals/launch/observations.mjs @@ -0,0 +1,27 @@ +// A terminal agent may finish before the browser mounts/paints its directive. +// This grace never extends the run cap and never reduces the measured latency. +export function renderWindow({ now, capAt, agentCompletedAt, visibleAt, graceMs = 30_000 }) { + const deadline = agentCompletedAt === null ? capAt : Math.min(capAt, agentCompletedAt + Math.min(30_000, Math.max(0, graceMs))); + return { done: (visibleAt !== null && visibleAt <= deadline) || now >= deadline, deadline, + renderGraceUsed: agentCompletedAt !== null && (visibleAt ?? now) > agentCompletedAt, + renderDelayMs: agentCompletedAt !== null && visibleAt !== null ? Math.max(0, visibleAt - agentCompletedAt) : null }; +} + +// Keep all observations, not just the final screen: a later tab can hide a +// newly exposed dead control. Stable DOM identities also distinguish twins. +export function unexercisedControls(initial, snapshots) { + const tested = new Set(initial.map(control => control.index)); + const found = new Map(); + for (const snapshot of snapshots) for (const control of snapshot.controls || []) { + if (!tested.has(control.index) && !found.has(control.index)) + found.set(control.index, { ...control, exposedAfter: snapshot.inventoryAfter }); + } + return [...found.values()]; +} + +export function observeInteractions(actions, listExpression) { + return actions.flatMap((action, actionIndex) => { + if (!['click','drag','key','move','scroll','wait'].includes(action[0])) return [action]; + return [action, ['eval', `({inventoryAfter:${JSON.stringify({ actionIndex, kind:action[0] })},controls:${listExpression}})`]]; + }); +} diff --git a/plugins/playgrounds/evals/launch/observations.test.ts b/plugins/playgrounds/evals/launch/observations.test.ts new file mode 100644 index 000000000..a6c0dad1a --- /dev/null +++ b/plugins/playgrounds/evals/launch/observations.test.ts @@ -0,0 +1,65 @@ +import { describe, expect, it } from 'vitest'; +// @ts-expect-error executable eval-only ESM +import { observeInteractions, renderWindow, unexercisedControls } from './observations.mjs'; + +const windowAt = (now: number, agentCompletedAt: number | null, visibleAt: number | null = null, capAt = 900_000) => + renderWindow({now,agentCompletedAt,visibleAt,capAt}); + +describe('terminal-to-render grace', () => { + it('waits for a card that paints after the agent finishes without hiding its delay', () => { + expect(windowAt(100_000,100_000).done).toBe(false); + const waiting = windowAt(114_000,100_000); + expect(waiting.done).toBe(false); + expect(waiting.renderGraceUsed).toBe(true); + const painted = windowAt(114_000,100_000,114_000); + expect(painted.done).toBe(true); + expect(painted.renderDelayMs).toBe(14_000); + expect(painted.deadline).toBe(130_000); + }); + it('ends a no-card run at 30 seconds and cannot silently lengthen the grace', () => { + expect(windowAt(129_999,100_000).done).toBe(false); + expect(windowAt(130_000,100_000).done).toBe(true); + expect(renderWindow({now:130_000,agentCompletedAt:100_000,visibleAt:null,capAt:900_000,graceMs:60_000}).deadline).toBe(130_000); + }); + it('clips grace at the original cap, including an agent that finishes near it', () => { + expect(windowAt(895_000,890_000).done).toBe(false); + expect(windowAt(900_000,890_000).done).toBe(true); + expect(windowAt(900_000,890_000).deadline).toBe(900_000); + }); + it('does not apply terminal grace to a still-building agent or an earlier card', () => { + expect(windowAt(500_000,null).done).toBe(false); + expect(windowAt(500_000,null).renderGraceUsed).toBe(false); + expect(windowAt(100_000,100_000,99_000).renderGraceUsed).toBe(false); + expect(windowAt(100_000,100_000,99_000).renderDelayMs).toBe(0); + }); +}); + +describe('controls exposed between screenshots', () => { + const initial = [{index:0,label:'General tab'},{index:1,label:'Advanced tab'}]; + it('fails an untested dead control even when a later tab hides it again', () => { + const dead = {index:2,label:'Send alerts'}; + const snapshots = [ + {inventoryAfter:{actionIndex:0,kind:'click'},controls:[...initial,dead]}, + {inventoryAfter:{actionIndex:1,kind:'click'},controls:initial}, + ]; + expect(unexercisedControls(initial,snapshots)).toEqual([{...dead,exposedAfter:{actionIndex:0,kind:'click'}}]); + }); + it('retains a newly exposed twin and deduplicates repeated observations by identity', () => { + const twin = {index:2,label:'General tab'}; + const snapshots = [0,1,2].map(actionIndex => ({inventoryAfter:{actionIndex,kind:'click'},controls:[...initial,twin]})); + expect(unexercisedControls(initial,snapshots)).toHaveLength(1); + expect(unexercisedControls(initial,snapshots)[0].index).toBe(2); + expect(unexercisedControls(initial,[{controls:initial}])).toEqual([]); + }); + it('inserts an inventory immediately after every interaction and delayed observation', () => { + const actions = [['click','#advanced'],['drag','#slider',0,0,1,0],['key','Enter','#choice'],['wait',450],['click','#general']]; + const expanded = observeInteractions(actions,'readControls()'); + expect(expanded).toHaveLength(10); + actions.forEach((action,index) => { + expect(expanded[index*2]).toEqual(action); + expect(expanded[index*2+1][0]).toBe('eval'); + expect(expanded[index*2+1][1]).toContain(`"actionIndex":${index}`); + expect(expanded[index*2+1][1]).toContain('controls:readControls()'); + }); + }); +}); diff --git a/plugins/playgrounds/evals/launch/run.mjs b/plugins/playgrounds/evals/launch/run.mjs index 05bb98727..a67f8e98a 100644 --- a/plugins/playgrounds/evals/launch/run.mjs +++ b/plugins/playgrounds/evals/launch/run.mjs @@ -6,6 +6,7 @@ import { fileURLToPath } from 'node:url'; import { checkControls } from './controls.mjs'; import { hasInk } from './pixels.mjs'; import { failureScore, providerSummary, resumeMismatch } from './metrics.mjs'; +import { renderWindow } from './observations.mjs'; let interrupted = false; process.on('SIGTERM', () => { interrupted = true; }); @@ -33,7 +34,7 @@ mkdirSync(out, { recursive: true }); mkdirSync(join(out, '.tmp'), { recursive: true }); const manifestPath = join(out, 'manifest.json'); const commit = args.commit || (() => { try { return execFileSync('git', ['-C', pluginRoot, 'rev-parse', 'HEAD'], {encoding:'utf8'}).trim(); } catch { return 'unverified'; } })(); -const manifest = { label: args.label, url: base.origin, host: args.host, pluginRoot, commit, capMs, +const manifest = { label: args.label, url: base.origin, host: args.host, pluginRoot, commit, capMs, renderGraceMs: 30_000, prompts, providers, modelSelection: 'omitted: default for each provider in fresh Personal project', concurrency: 1, timing: 'HTTP prompt send until loaded card is visible in real thread DOM; polling resolution 150 ms, screenshot corroboration', createdAt: new Date().toISOString() }; @@ -73,16 +74,19 @@ function questionEvidence(timeline, interactions) { return { structured, textQuestions, count: structured.length + textQuestions.filter(q => q.likely).length, needsReview: textQuestions.some(q => !q.likely) }; } -function monitor(threadId) { +function monitor(threadId, capAt, renderWindow) { const visible = el => { const r = el.getBoundingClientRect(); return r.width > 80 && r.height > 40 && r.bottom > 0 && r.top < innerHeight && getComputedStyle(el).visibility !== 'hidden'; }; const loaded = new WeakSet(); - window.__launch = { proof: null, progress: [], errors: [], terminal: false }; + window.__launch = { proof: null, progress: [], errors: [], done: false, agentCompletedAt: null, terminalObservedAt: null, completionSource: null }; document.addEventListener('load', event => { if (event.target?.tagName === 'IFRAME' && event.target.src) loaded.add(event.target); }, true); setInterval(() => { - if (window.__launch.proof) return; + const state = window.__launch; + const windowState = renderWindow({now:Date.now(),capAt,agentCompletedAt:state.agentCompletedAt,visibleAt:state.proof?.at ?? null}); + state.done = windowState.done; + if (state.done) return; const frame = document.querySelector('.pg-host .pg-widget iframe'); const card = frame || document.querySelector('.pg-host .pg-answer:not([role="status"]):not(.pg-error)'); if (!card) return; @@ -108,7 +112,12 @@ function monitor(threadId) { window.__launch.progress.push({ rowId: row.id, at: Date.now(), text: row.text }); } const thread = await (await fetch(`/api/v1/threads/${threadId}`)).json(); - if (['idle','error'].includes(thread.status) && flatten(timeline.rows || []).some(row => row.role === 'assistant')) window.__launch.terminal = true; + if (['idle','error'].includes(thread.status) && flatten(timeline.rows || []).some(row => row.role === 'assistant') && window.__launch.agentCompletedAt === null) { + const completed = flatten(timeline.rows || []).filter(row => row.kind === 'turn' && Number.isFinite(row.completedAt)).map(row => row.completedAt); + window.__launch.terminalObservedAt = Date.now(); + window.__launch.agentCompletedAt = completed.length ? Math.max(...completed) : window.__launch.terminalObservedAt; + window.__launch.completionSource = completed.length ? 'turn.completedAt' : 'terminal-observed'; + } } catch (error) { window.__launch.errors.push(String(error)); } }, 1500); } @@ -144,7 +153,10 @@ function summarize() { writeFileSync(join(out,'summary.md'), `# ${args.label}\n\nSource: ${commit}. Cap: ${capMs/60000} minutes. Fresh Personal threads; default models.\n\n` + '| Provider | Completed | Median | p90 | All controls live | Clarifying questions | Question reviews | Progress | Gate |\n|---|---:|---:|---:|---:|---:|---:|---:|---|\n' + results.map(r => `| ${r.provider} | ${r.completed}/20 | ${r.medianMs === null ? 'pending' : (r.medianMs/60000).toFixed(2)+' min'} | ${r.p90Ms === null ? 'pending' : (r.p90Ms/60000).toFixed(2)+' min'} | ${r.liveCards}/20 | ${r.clarifyingQuestions} | ${r.questionReviewsNeeded} | ${r.progressShown}/20 | ${r.pass ? 'PASS' : r.complete ? 'FAIL' : 'INCOMPLETE'} |`).join('\n') + - '\n\nMedian uses the middle pair; p90 uses nearest rank. Every missing card and capped run is scored at the cap, including early failures. A visible card with failed controls retains its measured time and fails control quality. Partial runs do not produce launch percentiles. Review question evidence before declaring zero clarifications.\n'); + '\n\nMedian uses the middle pair; p90 uses nearest rank. Every missing card and capped run is scored at the cap, including early failures. A visible card with failed controls retains its measured time and fails control quality. Partial runs do not produce launch percentiles. Review question evidence before declaring zero clarifications.\n' + + '\nRender grace (fixed 30 s, bounded by run cap):\n' + + (results.flatMap(provider => provider.results.filter(run => run.renderGraceUsed).map(run => + `- ${provider.provider}/${run.promptId}: agentCompletedAt=${run.agentCompletedAt}; terminalObservedAt=${run.terminalObservedAt}; renderDelayMs=${run.renderDelayMs ?? 'no card'}; grace retained card=${run.renderGraceRetainedCard}; scored ${(run.scoreMs/60000).toFixed(2)} min.`)).join('\n') || 'No run used render grace.') + '\n'); } // Fail infrastructure preflight before any scored prompt is sent. The fixture @@ -200,18 +212,26 @@ for (const provider of providers) for (const prompt of selected) { if (threadInfo.projectId !== 'proj_personal') throw new Error('Thread was not created in Personal'); if (interrupted) throw new Error('Runner interrupted'); const preload = join(dir,'monitor.js'); - writeFileSync(preload, `(${monitor.toString()})(${JSON.stringify(thread.id)});`); + writeFileSync(preload, `(${monitor.toString()})(${JSON.stringify(thread.id)},${result.sentAt+capMs},${renderWindow.toString()});`); const remaining = Math.max(1, capMs - (Date.now()-result.sentAt)); const visible = await drive(new URL(`/threads/${thread.id}`,base).href, - [['until','window.__launch?.proof || window.__launch?.terminal',remaining], ['eval','window.__launch'], ['shot',join(dir,'visible.png'),'[data-launch-card="visible"]']], + [['until','window.__launch?.proof || window.__launch?.done',remaining], ['eval','window.__launch'], ['shot',join(dir,'visible.png'),'[data-launch-card="visible"]']], join(dir,'visible'),prompt.width || 1280,{preload,timeout:remaining+20_000}); const measurement = visible.evals.find(v => v && Object.hasOwn(v,'proof')); const proof = measurement?.proof; result.progress = measurement?.progress || []; result.browserErrors = measurement?.errors || []; result.proof = proof; + result.agentCompletedAt = measurement?.agentCompletedAt ?? null; + result.terminalObservedAt = measurement?.terminalObservedAt ?? null; + result.completionSource = measurement?.completionSource ?? null; + const render = renderWindow({now:Date.now(),capAt:result.sentAt+capMs,agentCompletedAt:result.agentCompletedAt,visibleAt:proof?.at ?? null}); + result.renderGraceUsed = render.renderGraceUsed; + result.renderDelayMs = render.renderDelayMs; + result.renderGraceDeadline = render.deadline; result.wallMs = Date.now()-result.sentAt; - result.cardVisible = Boolean(proof && proof.at <= result.sentAt+capMs && visible.code === 0 && hasInk(join(dir,'visible.png'))); + result.cardVisible = Boolean(proof && proof.at <= result.renderGraceDeadline && visible.code === 0 && hasInk(join(dir,'visible.png'))); + result.renderGraceRetainedCard = Boolean(result.renderGraceUsed && result.cardVisible); result.visibleMs = result.cardVisible ? Math.max(0,proof.at-result.sentAt) : null; result.scoreMs = failureScore(result.visibleMs,capMs); const timeline = await api(`/threads/${thread.id}/timeline`); @@ -219,6 +239,15 @@ for (const provider of providers) for (const prompt of selected) { save(join(dir,'timeline.json'),timeline); save(join(dir,'interactions.json'),interactions); result.questions = questionEvidence(timeline,interactions); + // The card may paint before the monitor's next API poll. Keep the actual + // completion time when present without claiming the grace changed this run. + if (result.agentCompletedAt === null) { + const completed = rowsIn(timeline).filter(row => row.kind === 'turn' && Number.isFinite(row.completedAt)).map(row => row.completedAt); + if (completed.length) { + result.agentCompletedAt = Math.max(...completed); result.completionSource = 'turn.completedAt'; + result.renderDelayMs = proof ? Math.max(0,proof.at-result.agentCompletedAt) : null; + } + } await api(`/threads/${thread.id}/stop`,{}); if (result.cardVisible) { const widths = prompt.id === 'narrow-toggle' ? [360,390,480] : [Math.round(proof.width)]; @@ -237,6 +266,7 @@ for (const provider of providers) for (const prompt of selected) { result.finishedAt = Date.now(); result.wallMs ??= result.finishedAt-result.sentAt; save(resultPath,result); summarize(); + if (result.renderGraceUsed) console.log(`${provider}/${prompt.id}: render grace used; agent completed ${result.agentCompletedAt}; render delay ${result.renderDelayMs ?? 'no card'} ms; retained card ${result.renderGraceRetainedCard}`); console.log(`${provider}/${prompt.id}: ${result.pass ? 'PASS' : 'FAIL'} ${(result.scoreMs/60000).toFixed(2)} min; ${result.error || result.controls?.reason || ''}`); } if (result.stopError) throw new Error(`Could not stop owned thread ${result.threadId}: ${result.stopError}`); From 2eddf9031a646c2a24c5c46ae253fdd1e116cd33 Mon Sep 17 00:00:00 2001 From: brsbl <57682038+brsbl@users.noreply.github.com> Date: Mon, 19 Oct 2026 22:40:41 +0000 Subject: [PATCH 05/15] Keep launch browser socket paths short inside worktree storage --- plugins/playgrounds/evals/launch/README.md | 2 ++ plugins/playgrounds/evals/launch/run.mjs | 10 ++++++++-- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/plugins/playgrounds/evals/launch/README.md b/plugins/playgrounds/evals/launch/README.md index 6693e639a..bef6d4972 100644 --- a/plugins/playgrounds/evals/launch/README.md +++ b/plugins/playgrounds/evals/launch/README.md @@ -105,3 +105,5 @@ summary; do not silently drop failures or edit the prompt corpus between rounds. The runner stops only threads it created. Driver PIDs and actions are recorded; its private Chrome profiles use the result directory's `.tmp` via `TMPDIR`. +On Linux a short `/proc//fd/` alias avoids Chrome's +Unix socket path limit; the data remains physically inside that `.tmp` directory. diff --git a/plugins/playgrounds/evals/launch/run.mjs b/plugins/playgrounds/evals/launch/run.mjs index a67f8e98a..ef86a121d 100644 --- a/plugins/playgrounds/evals/launch/run.mjs +++ b/plugins/playgrounds/evals/launch/run.mjs @@ -1,6 +1,6 @@ #!/usr/bin/env node import { spawn, execFileSync } from 'node:child_process'; -import { existsSync, mkdirSync, readFileSync, writeFileSync, renameSync } from 'node:fs'; +import { existsSync, mkdirSync, readFileSync, writeFileSync, renameSync, openSync } from 'node:fs'; import { dirname, join, resolve } from 'node:path'; import { fileURLToPath } from 'node:url'; import { checkControls } from './controls.mjs'; @@ -32,6 +32,12 @@ const selected = prompts.filter(p => !args.only || args.only.split(',').includes if (!selected.length) throw new Error('No prompt matched --only'); mkdirSync(out, { recursive: true }); mkdirSync(join(out, '.tmp'), { recursive: true }); +// Chrome's singleton socket cannot fit long worktree paths. Keep a directory +// descriptor open for the runner lifetime; its short alias still stores every +// profile and socket inside this run's owned directory. +const chromeTempDir = process.platform === 'linux' + ? `/proc/${process.pid}/fd/${openSync(join(out, '.tmp'), 'r')}` + : join(out, '.tmp'); const manifestPath = join(out, 'manifest.json'); const commit = args.commit || (() => { try { return execFileSync('git', ['-C', pluginRoot, 'rev-parse', 'HEAD'], {encoding:'utf8'}).trim(); } catch { return 'unverified'; } })(); const manifest = { label: args.label, url: base.origin, host: args.host, pluginRoot, commit, capMs, renderGraceMs: 30_000, @@ -126,7 +132,7 @@ async function drive(target, actions, stem, width = 1280, { preload, timeout = 2 writeFileSync(`${stem}.actions.json`, JSON.stringify(actions, null, 2)); const command = [drivePath, target, '--actions', `${stem}.actions.json`, '--width', String(width), '--height', '1100', '--reduced']; if (preload) command.push('--preload', preload); - const child = spawn(process.execPath, command, { detached: true, env: { ...process.env, TMPDIR: join(out, '.tmp') }, stdio: ['ignore','pipe','pipe'] }); + const child = spawn(process.execPath, command, { detached: true, env: { ...process.env, TMPDIR: chromeTempDir }, stdio: ['ignore','pipe','pipe'] }); writeFileSync(`${stem}.pid`, String(child.pid)); let log = ''; child.stdout.on('data', chunk => { log += chunk; }); From 6904a1468f5bc1d2908f15442e6b8459bb74512c Mon Sep 17 00:00:00 2001 From: brsbl <57682038+brsbl@users.noreply.github.com> Date: Mon, 19 Oct 2026 22:55:31 +0000 Subject: [PATCH 06/15] Reject launch eval Personal workspaces that inherit an outer checkout --- plugins/playgrounds/evals/launch/README.md | 8 +++++++- plugins/playgrounds/evals/launch/run.mjs | 22 ++++++++++++++++++---- 2 files changed, 25 insertions(+), 5 deletions(-) diff --git a/plugins/playgrounds/evals/launch/README.md b/plugins/playgrounds/evals/launch/README.md index bef6d4972..004779be5 100644 --- a/plugins/playgrounds/evals/launch/README.md +++ b/plugins/playgrounds/evals/launch/README.md @@ -10,7 +10,13 @@ name a skill, avoid questions, or satisfy a timer is appended. The owner provisions a **fresh isolated dev bb**, installs Playgrounds from the exact source path being measured, and enables the default Claude Code and Codex providers. Use a fresh bb data directory inside the worktree, never production -data. Record the bb core revision and plugin installation command alongside the +data. Since the data directory is nested in a worktree, launch the isolated +server and host daemon with `GIT_CEILING_DIRECTORIES` set to its absolute data +directory. This stops Personal workspaces from discovering the outer Git checkout. +The runner verifies `workspaceProvisionType: personal` and `isGitRepo: false` +after provisioning, and aborts an invalid setup without producing a summary. +Preserve invalid setup evidence separately; never mix it with launch results. +Record the bb core revision and plugin installation command alongside the results. Do not serve this eval from production bb. Launch the dev bb and this runner through `bb host-care start`. The runner is diff --git a/plugins/playgrounds/evals/launch/run.mjs b/plugins/playgrounds/evals/launch/run.mjs index ef86a121d..ce102b6e3 100644 --- a/plugins/playgrounds/evals/launch/run.mjs +++ b/plugins/playgrounds/evals/launch/run.mjs @@ -189,7 +189,10 @@ for (const provider of providers) for (const prompt of selected) { if (interrupted) throw new Error('Runner interrupted'); const dir = join(out,provider,prompt.id), resultPath = join(dir,'result.json'); mkdirSync(dir,{recursive:true}); - if (existsSync(resultPath)) { summarize(); continue; } + if (existsSync(resultPath)) { + if (JSON.parse(readFileSync(resultPath,'utf8')).invalidSetup) throw new Error(`Invalid setup in ${dir}; preserve evidence and use a new output directory`); + summarize(); continue; + } const inflightPath = join(dir,'inflight.json'); if (existsSync(inflightPath)) { const interrupted = JSON.parse(readFileSync(inflightPath,'utf8')); @@ -207,7 +210,13 @@ for (const provider of providers) for (const prompt of selected) { result.actualProvider = thread.providerId; result.environmentId = thread.environmentId; save(inflightPath,result); - const threadInfo = await api(`/threads/${thread.id}?include=environment`); + let threadInfo = await api(`/threads/${thread.id}?include=environment`); + const environmentDeadline = Math.min(result.sentAt + capMs, Date.now() + 30_000); + while (!threadInfo.environment && Date.now() < environmentDeadline && !interrupted) { + await new Promise(resolve => setTimeout(resolve, 250)); + threadInfo = await api(`/threads/${thread.id}?include=environment`); + } + result.environmentId = threadInfo.environmentId; save(join(dir,'thread.json'),threadInfo); const defaults = await api(`/threads/${thread.id}/default-execution-options`); save(join(dir,'execution-options.json'),defaults); @@ -215,7 +224,10 @@ for (const provider of providers) for (const prompt of selected) { result.catalogDefaultModel = defaultModels.get(provider); if (thread.providerId !== provider || !result.model) throw new Error('Actual provider/model could not be verified'); if (result.model !== result.catalogDefaultModel) throw new Error('Personal remembered a non-default model; reset the isolated instance before measuring'); - if (threadInfo.projectId !== 'proj_personal') throw new Error('Thread was not created in Personal'); + if (threadInfo.projectId !== 'proj_personal' || threadInfo.environment?.workspaceProvisionType !== 'personal' || threadInfo.environment?.isGitRepo !== false) { + result.invalidSetup = true; + throw new Error('Personal environment is missing or inherits a Git repository. Set GIT_CEILING_DIRECTORIES on the isolated server and host daemon before measuring.'); + } if (interrupted) throw new Error('Runner interrupted'); const preload = join(dir,'monitor.js'); writeFileSync(preload, `(${monitor.toString()})(${JSON.stringify(thread.id)},${result.sentAt+capMs},${renderWindow.toString()});`); @@ -271,7 +283,9 @@ for (const provider of providers) for (const prompt of selected) { if (result.threadId) await api(`/threads/${result.threadId}/stop`,{}).catch(error => { result.stopError = String(error); }); result.finishedAt = Date.now(); result.wallMs ??= result.finishedAt-result.sentAt; - save(resultPath,result); summarize(); + save(resultPath,result); + if (result.invalidSetup) throw new Error(`${result.error} Preserve this setup evidence and use a new output directory.`); + summarize(); if (result.renderGraceUsed) console.log(`${provider}/${prompt.id}: render grace used; agent completed ${result.agentCompletedAt}; render delay ${result.renderDelayMs ?? 'no card'} ms; retained card ${result.renderGraceRetainedCard}`); console.log(`${provider}/${prompt.id}: ${result.pass ? 'PASS' : 'FAIL'} ${(result.scoreMs/60000).toFixed(2)} min; ${result.error || result.controls?.reason || ''}`); } From d2e077fcddc9ef07689d135079c0677af70190ca Mon Sep 17 00:00:00 2001 From: brsbl <57682038+brsbl@users.noreply.github.com> Date: Mon, 19 Oct 2026 22:57:51 +0000 Subject: [PATCH 07/15] Wait for authoritative Personal environment metadata before launch scoring --- plugins/playgrounds/evals/launch/run.mjs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/plugins/playgrounds/evals/launch/run.mjs b/plugins/playgrounds/evals/launch/run.mjs index ce102b6e3..39e8e7460 100644 --- a/plugins/playgrounds/evals/launch/run.mjs +++ b/plugins/playgrounds/evals/launch/run.mjs @@ -212,7 +212,7 @@ for (const provider of providers) for (const prompt of selected) { save(inflightPath,result); let threadInfo = await api(`/threads/${thread.id}?include=environment`); const environmentDeadline = Math.min(result.sentAt + capMs, Date.now() + 30_000); - while (!threadInfo.environment && Date.now() < environmentDeadline && !interrupted) { + while ((threadInfo.environment?.status !== 'ready' || !threadInfo.environment?.path) && Date.now() < environmentDeadline && !interrupted) { await new Promise(resolve => setTimeout(resolve, 250)); threadInfo = await api(`/threads/${thread.id}?include=environment`); } @@ -224,7 +224,7 @@ for (const provider of providers) for (const prompt of selected) { result.catalogDefaultModel = defaultModels.get(provider); if (thread.providerId !== provider || !result.model) throw new Error('Actual provider/model could not be verified'); if (result.model !== result.catalogDefaultModel) throw new Error('Personal remembered a non-default model; reset the isolated instance before measuring'); - if (threadInfo.projectId !== 'proj_personal' || threadInfo.environment?.workspaceProvisionType !== 'personal' || threadInfo.environment?.isGitRepo !== false) { + if (threadInfo.projectId !== 'proj_personal' || threadInfo.environment?.status !== 'ready' || !threadInfo.environment?.path || threadInfo.environment?.workspaceProvisionType !== 'personal' || threadInfo.environment?.isGitRepo !== false) { result.invalidSetup = true; throw new Error('Personal environment is missing or inherits a Git repository. Set GIT_CEILING_DIRECTORIES on the isolated server and host daemon before measuring.'); } From 095d31fb7508e843d4290033cad6cdc2ada5bc4d Mon Sep 17 00:00:00 2001 From: brsbl <57682038+brsbl@users.noreply.github.com> Date: Mon, 19 Oct 2026 23:34:58 +0000 Subject: [PATCH 08/15] fix(playgrounds): retain drag position while scoring controls --- plugins/playgrounds/evals/launch/README.md | 6 +++++- plugins/playgrounds/evals/launch/controls.mjs | 7 +++++-- plugins/playgrounds/evals/launch/run.mjs | 10 ++++++++++ 3 files changed, 20 insertions(+), 3 deletions(-) diff --git a/plugins/playgrounds/evals/launch/README.md b/plugins/playgrounds/evals/launch/README.md index 004779be5..1846e61ce 100644 --- a/plugins/playgrounds/evals/launch/README.md +++ b/plugins/playgrounds/evals/launch/README.md @@ -46,7 +46,8 @@ Before sending any scored prompt, preflight checks the Personal project, plugin presence, both providers' model catalogs, Chrome, real input dispatch, PNG diffs, and the actual dev UI. Infrastructure failures here abort without counting forty spurious product failures. The tiny preflight fixture is not an eval prompt -and is never given to an agent. +and is never given to an agent. Generic drag fixtures also verify that a live +pointer-dependent readout passes while cosmetic hover alone fails. Each prompt creates a fresh `proj_personal` thread with a new personal environment and no Git checkout. The request omits `model`; the actual resolved model and @@ -96,6 +97,9 @@ non-default model for Personal, reset the **isolated instance** before measuring This is deliberately conservative: purely animated responses and controls whose only legitimate output is their own appearance require investigation, not an automatic pass. PNG dimension changes are also unproven, never assumed live. + For drag controls the pointer stays at each endpoint during capture: leaving + the surface can reset a legitimate hover/drag output. Control masks still + exclude cosmetic hover changes from the score. `summary.json` and `summary.md` update after each case. Per-provider percentiles appear only after all twenty cases: median is the middle-pair mean, p90 is diff --git a/plugins/playgrounds/evals/launch/controls.mjs b/plugins/playgrounds/evals/launch/controls.mjs index 9a4b6ed61..778e7f78d 100644 --- a/plugins/playgrounds/evals/launch/controls.mjs +++ b/plugins/playgrounds/evals/launch/controls.mjs @@ -53,16 +53,19 @@ export async function checkControls({ target, scope = 'body', width, dir, drive const steps = action(control); if (!steps) { plans.push({ ...control, pass: false, reason: control.disabled ? 'Disabled control: precondition not exercised; needs review' : 'Unsupported exposed control; manual proof required' }); continue; } const s = selector(control); + // Leaving a drag surface can reset its output. Keep its low/high pointer + // positions through the screenshots; the existing masks exclude cosmetics. + const moveOff = steps.some(step => step[0] === 'drag') ? [] : [['move', scope, 0.01, 0.01]]; actions.push(['scroll', s]); // A selected tab/radio and a reset need a changed starting state to be tested. const peer = controls.find(c => c.index !== control.index && action(c) && (control.group ? c.group === control.group : action(c) && !/reset/i.test(c.label))); if (peer && (control.selected || /reset|restart|clear/i.test(control.label))) actions.push(...action(peer)); if (control.type === 'range' || control.type === 'slider') actions.push(['drag', s, 0.8, 0.5, 0.2, 0.5]); - actions.push(['move', scope, 0.01, 0.01], ['wait', 400]); + actions.push(...moveOff, ['wait', 400]); const paths = ['before0','before1','before2','after0','after1'].map(name => join(dir, `control-${control.index}-${name}.png`)); actions.push(['eval', `(()=>{const root=document.querySelector(${JSON.stringify(scope)}),r=root.getBoundingClientRect();return {maskFor:${control.index},rects:[...root.querySelectorAll('[data-launch-control]')].map(e=>{const b=(e.closest('label,.pg-control,[data-pg]')||e).getBoundingClientRect();return {x:b.x-r.x+4,y:b.y-r.y+4,w:b.width,h:b.height}})}})()`]); for (let n = 0; n < 3; n++) actions.push(['shot', paths[n], scope], ['wait', 450]); - actions.push(...steps, ['move', scope, 0.01, 0.01], ['wait', 450], ['shot', paths[3], scope], ['wait', 450], ['shot', paths[4], scope]); + actions.push(...steps, ...moveOff, ['wait', 450], ['shot', paths[3], scope], ['wait', 450], ['shot', paths[4], scope]); plans.push({ ...control, paths, steps }); } actions.push(['eval', listExpression]); diff --git a/plugins/playgrounds/evals/launch/run.mjs b/plugins/playgrounds/evals/launch/run.mjs index 39e8e7460..ae4849ff1 100644 --- a/plugins/playgrounds/evals/launch/run.mjs +++ b/plugins/playgrounds/evals/launch/run.mjs @@ -182,6 +182,16 @@ const fixture = join(preflightDir,'fixture.html'); writeFileSync(fixture, '0'); const fixtureResult = await checkControls({target:fixture,width:480,dir:preflightDir,drive}); if (!fixtureResult.pass) throw new Error(`Preflight: browser/control driver failed; see ${preflightDir}/controls.json`); +// A live pointer-dependent output must survive measurement; cosmetic hover +// alone must not pass. These generic fixtures never enter an agent prompt. +for (const live of [true, false]) { + const dragDir = join(preflightDir, live ? 'drag-live' : 'drag-inert'); mkdirSync(dragDir, {recursive:true}); + const dragFixture = join(dragDir, 'fixture.html'); + writeFileSync(dragFixture, `
0`); + const checked = await checkControls({target:dragFixture,width:480,dir:dragDir,drive}); + if (checked.pass !== live || checked.controls.length !== 1 || (!live && checked.controls[0].reason !== 'no proven output change outside controls')) + throw new Error(`Preflight: drag ${live ? 'live' : 'inert'} regression failed; see ${dragDir}/controls.json`); +} const ui = await drive(base.href,[['until','Boolean(document.querySelector("#root")?.children.length)',20_000],['eval','({ready:Boolean(document.querySelector("#root")?.children.length),text:document.body.innerText.slice(0,300)})'],['shot',join(preflightDir,'bb.png'),'body']],join(preflightDir,'ui'),1280); if (ui.code || !ui.evals.some(v => v?.ready) || !hasInk(join(preflightDir,'bb.png'))) throw new Error('Preflight: dev bb UI did not render'); From 2759341988aa4143f55cef4121c06332bf435595 Mon Sep 17 00:00:00 2001 From: brsbl <57682038+brsbl@users.noreply.github.com> Date: Tue, 20 Oct 2026 01:53:26 +0000 Subject: [PATCH 09/15] fix(playgrounds): restore drag state after screenshot capture --- plugins/playgrounds/evals/launch/README.md | 6 +++++- plugins/playgrounds/evals/launch/controls.mjs | 14 ++++++++++---- plugins/playgrounds/evals/launch/run.mjs | 2 +- 3 files changed, 16 insertions(+), 6 deletions(-) diff --git a/plugins/playgrounds/evals/launch/README.md b/plugins/playgrounds/evals/launch/README.md index 1846e61ce..274c1de16 100644 --- a/plugins/playgrounds/evals/launch/README.md +++ b/plugins/playgrounds/evals/launch/README.md @@ -48,6 +48,7 @@ and the actual dev UI. Infrastructure failures here abort without counting forty spurious product failures. The tiny preflight fixture is not an eval prompt and is never given to an agent. Generic drag fixtures also verify that a live pointer-dependent readout passes while cosmetic hover alone fails. +Each invocation keeps its preflight evidence in a separate timestamped directory. Each prompt creates a fresh `proj_personal` thread with a new personal environment and no Git checkout. The request omits `model`; the actual resolved model and @@ -99,7 +100,10 @@ non-default model for Personal, reset the **isolated instance** before measuring automatic pass. PNG dimension changes are also unproven, never assumed live. For drag controls the pointer stays at each endpoint during capture: leaving the surface can reset a legitimate hover/drag output. Control masks still - exclude cosmetic hover changes from the score. + exclude cosmetic hover changes from the score. Full-card capture can briefly + emit pointer leave/enter events, so the same pointer position is restored + immediately after each shot before waiting. An immediate capture-induced + reset remains unproven; the scorer does not weaken its visual-diff threshold. `summary.json` and `summary.md` update after each case. Per-provider percentiles appear only after all twenty cases: median is the middle-pair mean, p90 is diff --git a/plugins/playgrounds/evals/launch/controls.mjs b/plugins/playgrounds/evals/launch/controls.mjs index 778e7f78d..d61805d6a 100644 --- a/plugins/playgrounds/evals/launch/controls.mjs +++ b/plugins/playgrounds/evals/launch/controls.mjs @@ -55,17 +55,23 @@ export async function checkControls({ target, scope = 'body', width, dir, drive const s = selector(control); // Leaving a drag surface can reset its output. Keep its low/high pointer // positions through the screenshots; the existing masks exclude cosmetics. - const moveOff = steps.some(step => step[0] === 'drag') ? [] : [['move', scope, 0.01, 0.01]]; + const drag = steps.find(step => step[0] === 'drag'); + const moveOff = drag ? [] : [['move', scope, 0.01, 0.01]]; + // Full-card capture can briefly resize Chrome's viewport and emit leave / + // enter without move. Restore the same real pointer position after capture + // so its delayed leave handler cannot reset the next measured frame. + const restoreBefore = drag ? [['move', s, drag[2], drag[3]]] : []; + const restoreAfter = drag ? [['move', s, drag[4], drag[5]]] : []; actions.push(['scroll', s]); // A selected tab/radio and a reset need a changed starting state to be tested. const peer = controls.find(c => c.index !== control.index && action(c) && (control.group ? c.group === control.group : action(c) && !/reset/i.test(c.label))); if (peer && (control.selected || /reset|restart|clear/i.test(control.label))) actions.push(...action(peer)); - if (control.type === 'range' || control.type === 'slider') actions.push(['drag', s, 0.8, 0.5, 0.2, 0.5]); + if (drag) actions.push(['drag', s, drag[4], drag[5], drag[2], drag[3]]); actions.push(...moveOff, ['wait', 400]); const paths = ['before0','before1','before2','after0','after1'].map(name => join(dir, `control-${control.index}-${name}.png`)); actions.push(['eval', `(()=>{const root=document.querySelector(${JSON.stringify(scope)}),r=root.getBoundingClientRect();return {maskFor:${control.index},rects:[...root.querySelectorAll('[data-launch-control]')].map(e=>{const b=(e.closest('label,.pg-control,[data-pg]')||e).getBoundingClientRect();return {x:b.x-r.x+4,y:b.y-r.y+4,w:b.width,h:b.height}})}})()`]); - for (let n = 0; n < 3; n++) actions.push(['shot', paths[n], scope], ['wait', 450]); - actions.push(...steps, ...moveOff, ['wait', 450], ['shot', paths[3], scope], ['wait', 450], ['shot', paths[4], scope]); + for (let n = 0; n < 3; n++) actions.push(['shot', paths[n], scope], ...restoreBefore, ['wait', 450]); + actions.push(...steps, ...moveOff, ['wait', 450], ['shot', paths[3], scope], ...restoreAfter, ['wait', 450], ['shot', paths[4], scope], ...restoreAfter); plans.push({ ...control, paths, steps }); } actions.push(['eval', listExpression]); diff --git a/plugins/playgrounds/evals/launch/run.mjs b/plugins/playgrounds/evals/launch/run.mjs index ae4849ff1..afe4a3c92 100644 --- a/plugins/playgrounds/evals/launch/run.mjs +++ b/plugins/playgrounds/evals/launch/run.mjs @@ -168,7 +168,7 @@ function summarize() { // Fail infrastructure preflight before any scored prompt is sent. The fixture // checks the driver, real input dispatch, masking, image decoding, and output diff. const defaultModels = new Map(); -const preflightDir = join(out,'preflight'); mkdirSync(preflightDir,{recursive:true}); +const preflightDir = join(out,'preflight',String(Date.now())); mkdirSync(preflightDir,{recursive:true}); await api('/projects/proj_personal'); const plugins = await api('/plugins'); save(join(preflightDir,'plugins.json'),plugins); if (!JSON.stringify(plugins).includes('playgrounds')) throw new Error('Preflight: Playgrounds is not installed'); From 6c919fd4dc337e14ee6ca61e6bd94d2f4f8b4dc8 Mon Sep 17 00:00:00 2001 From: brsbl <57682038+brsbl@users.noreply.github.com> Date: Tue, 20 Oct 2026 02:50:10 +0000 Subject: [PATCH 10/15] fix(playgrounds): preserve separate drawing output in control diffs --- plugins/playgrounds/evals/launch/README.md | 7 +++++-- plugins/playgrounds/evals/launch/controls.mjs | 16 +++++++++++++++- plugins/playgrounds/evals/launch/run.mjs | 11 +++++++++++ 3 files changed, 31 insertions(+), 3 deletions(-) diff --git a/plugins/playgrounds/evals/launch/README.md b/plugins/playgrounds/evals/launch/README.md index 274c1de16..c2c458bab 100644 --- a/plugins/playgrounds/evals/launch/README.md +++ b/plugins/playgrounds/evals/launch/README.md @@ -92,10 +92,13 @@ non-default model for Personal, reset the **isolated instance** before measuring newly exposed controls are retained as unproven failures even if a later tab hides them. `controls.json` retains these intermediate inventories. - Three no-input and two post-input screenshots are retained per control. The - diff masks control/label regions, ignores pixels already moving before input, + diff masks the tested control and ordinary control/label chrome, ignores pixels already moving before input, requires persistent output change, and requires changed output to exceed the measured ambient movement by 4x. A changed checkbox or thumb alone cannot pass. - This is deliberately conservative: purely animated responses and controls whose + When a button changes a separate interactive SVG/canvas drawing, that drawing + remains observable; the active surface itself stays masked when testing it. + Generic regressions require geometry changes to pass and button/peer styling + alone to fail. This is deliberately conservative: purely animated responses and controls whose only legitimate output is their own appearance require investigation, not an automatic pass. PNG dimension changes are also unproven, never assumed live. For drag controls the pointer stays at each endpoint during capture: leaving diff --git a/plugins/playgrounds/evals/launch/controls.mjs b/plugins/playgrounds/evals/launch/controls.mjs index d61805d6a..a21530b48 100644 --- a/plugins/playgrounds/evals/launch/controls.mjs +++ b/plugins/playgrounds/evals/launch/controls.mjs @@ -27,6 +27,20 @@ export function inventory(scope = 'body') { group: el.name || el.closest('[role="tablist"],.pg-seg,.pg-segmented')?.outerHTML.slice(0, 120) || null }; }); } +// A separate interactive drawing is output when another control changes it. +// Keep the tested surface and ordinary control chrome/selection peers masked. +function controlMasks(scope, testedIndex) { + const root = document.querySelector(scope), r = root.getBoundingClientRect(); + const rects = [...root.querySelectorAll('[data-launch-control]')].filter(el => { + const ordinary = el.matches('button,input,select,textarea,[role="button"],[role="switch"],[role="checkbox"],[role="radio"],[role="tab"]'); + const drawing = el.matches('svg,canvas') || el.querySelector('svg,canvas'); + return Number(el.dataset.launchControl) === testedIndex || ordinary || !drawing; + }).map(el => { + const b = (el.closest('label,.pg-control,[data-pg]') || el).getBoundingClientRect(); + return {x:b.x-r.x+4,y:b.y-r.y+4,w:b.width,h:b.height}; + }); + return {maskFor:testedIndex,rects}; +} const selector = c => `[data-launch-control="${c.index}"]`; function action(c) { const s = selector(c); @@ -69,7 +83,7 @@ export async function checkControls({ target, scope = 'body', width, dir, drive if (drag) actions.push(['drag', s, drag[4], drag[5], drag[2], drag[3]]); actions.push(...moveOff, ['wait', 400]); const paths = ['before0','before1','before2','after0','after1'].map(name => join(dir, `control-${control.index}-${name}.png`)); - actions.push(['eval', `(()=>{const root=document.querySelector(${JSON.stringify(scope)}),r=root.getBoundingClientRect();return {maskFor:${control.index},rects:[...root.querySelectorAll('[data-launch-control]')].map(e=>{const b=(e.closest('label,.pg-control,[data-pg]')||e).getBoundingClientRect();return {x:b.x-r.x+4,y:b.y-r.y+4,w:b.width,h:b.height}})}})()`]); + actions.push(['eval', `(${controlMasks.toString()})(${JSON.stringify(scope)},${control.index})`]); for (let n = 0; n < 3; n++) actions.push(['shot', paths[n], scope], ...restoreBefore, ['wait', 450]); actions.push(...steps, ...moveOff, ['wait', 450], ['shot', paths[3], scope], ...restoreAfter, ['wait', 450], ['shot', paths[4], scope], ...restoreAfter); plans.push({ ...control, paths, steps }); diff --git a/plugins/playgrounds/evals/launch/run.mjs b/plugins/playgrounds/evals/launch/run.mjs index afe4a3c92..2c9b76893 100644 --- a/plugins/playgrounds/evals/launch/run.mjs +++ b/plugins/playgrounds/evals/launch/run.mjs @@ -192,6 +192,17 @@ for (const live of [true, false]) { if (checked.pass !== live || checked.controls.length !== 1 || (!live && checked.controls[0].reason !== 'no proven output change outside controls')) throw new Error(`Preflight: drag ${live ? 'live' : 'inert'} regression failed; see ${dragDir}/controls.json`); } +// A button can change geometry inside a separate interactive drawing. Keep +// that output observable, while button/peer styling alone still fails. +for (const live of [true, false]) { + const dir = join(preflightDir, live ? 'surface-button-live' : 'surface-button-inert'); mkdirSync(dir,{recursive:true}); + const fixture = join(dir,'fixture.html'); + writeFileSync(fixture, `
0`); + const checked = await checkControls({target:fixture,width:480,dir,drive}); + const buttons = checked.controls.filter(c=>c.tag==='button'); + if (checked.pass !== live || checked.controls.length !== 3 || buttons.length !== 2 || buttons.some(c=>c.pass !== live)) + throw new Error(`Preflight: separate drawing ${live ? 'live' : 'inert'} regression failed; see ${dir}/controls.json`); +} const ui = await drive(base.href,[['until','Boolean(document.querySelector("#root")?.children.length)',20_000],['eval','({ready:Boolean(document.querySelector("#root")?.children.length),text:document.body.innerText.slice(0,300)})'],['shot',join(preflightDir,'bb.png'),'body']],join(preflightDir,'ui'),1280); if (ui.code || !ui.evals.some(v => v?.ready) || !hasInk(join(preflightDir,'bb.png'))) throw new Error('Preflight: dev bb UI did not render'); From ef8f1195ee0e2920935b88a14c1bab6c22a84642 Mon Sep 17 00:00:00 2001 From: brsbl <57682038+brsbl@users.noreply.github.com> Date: Tue, 20 Oct 2026 03:12:49 +0000 Subject: [PATCH 11/15] fix(playgrounds): exercise horizontal and vertical drag inputs --- plugins/playgrounds/evals/launch/README.md | 2 +- plugins/playgrounds/evals/launch/controls.mjs | 2 +- plugins/playgrounds/evals/launch/run.mjs | 6 +++--- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/plugins/playgrounds/evals/launch/README.md b/plugins/playgrounds/evals/launch/README.md index c2c458bab..a2b6ce804 100644 --- a/plugins/playgrounds/evals/launch/README.md +++ b/plugins/playgrounds/evals/launch/README.md @@ -82,7 +82,7 @@ non-default model for Personal, reset the **isolated instance** before measuring the source. A visible card with a dead control retains its measured delivery time and fails the control criterion. - The bundled `scripts/drive.mjs` opens the actual served frame URL and uses real - pointer/keyboard input. Range controls are dragged; toggles/buttons clicked; + pointer/keyboard input. Range and custom slider controls are dragged diagonally to exercise either horizontal or vertical input; toggles/buttons clicked; text/select controls receive key events. HTML is not reconstructed. Native controls are driven in the real thread UI. Narrow-toggle is tested at 360, 390, and 480 px. Every exposed control must be proven, including newly exposed, diff --git a/plugins/playgrounds/evals/launch/controls.mjs b/plugins/playgrounds/evals/launch/controls.mjs index a21530b48..58c833c59 100644 --- a/plugins/playgrounds/evals/launch/controls.mjs +++ b/plugins/playgrounds/evals/launch/controls.mjs @@ -46,7 +46,7 @@ function action(c) { const s = selector(c); if (c.disabled) return null; if (c.tag === 'canvas' || (c.tag === 'input' && ['file','color','date','time','datetime-local','month','week'].includes(c.type))) return null; - if (c.type === 'range' || c.type === 'slider' || c.type === 'dial' || /grab|move|resize/.test(c.cursor || '')) return [['drag', s, 0.2, 0.5, 0.85, 0.5, 20]]; + if (c.type === 'range' || c.type === 'slider' || c.type === 'dial' || /grab|move|resize/.test(c.cursor || '')) return [['drag', s, 0.2, 0.8, 0.85, 0.15, 20]]; if (c.tag === 'select') return [['click', s], ['key', 'ArrowDown', s], ['key', 'Enter', s]]; if (c.tag === 'textarea' || (c.tag === 'input' && ['text','search','email','url','password','tel','number'].includes(c.type))) { if (c.type === 'number') return [['click', s], ['key', 'ArrowUp', s]]; diff --git a/plugins/playgrounds/evals/launch/run.mjs b/plugins/playgrounds/evals/launch/run.mjs index 2c9b76893..54a14a185 100644 --- a/plugins/playgrounds/evals/launch/run.mjs +++ b/plugins/playgrounds/evals/launch/run.mjs @@ -184,10 +184,10 @@ const fixtureResult = await checkControls({target:fixture,width:480,dir:prefligh if (!fixtureResult.pass) throw new Error(`Preflight: browser/control driver failed; see ${preflightDir}/controls.json`); // A live pointer-dependent output must survive measurement; cosmetic hover // alone must not pass. These generic fixtures never enter an agent prompt. -for (const live of [true, false]) { - const dragDir = join(preflightDir, live ? 'drag-live' : 'drag-inert'); mkdirSync(dragDir, {recursive:true}); +for (const axis of ['x','y']) for (const live of [true, false]) { + const dragDir = join(preflightDir, `drag-${axis}-${live ? 'live' : 'inert'}`); mkdirSync(dragDir, {recursive:true}); const dragFixture = join(dragDir, 'fixture.html'); - writeFileSync(dragFixture, `
0`); + writeFileSync(dragFixture, `
0`); const checked = await checkControls({target:dragFixture,width:480,dir:dragDir,drive}); if (checked.pass !== live || checked.controls.length !== 1 || (!live && checked.controls[0].reason !== 'no proven output change outside controls')) throw new Error(`Preflight: drag ${live ? 'live' : 'inert'} regression failed; see ${dragDir}/controls.json`); From 4192c5521976e9889c5a6d051d2e2eff6cfcad59 Mon Sep 17 00:00:00 2001 From: brsbl <57682038+brsbl@users.noreply.github.com> Date: Tue, 20 Oct 2026 04:04:57 +0000 Subject: [PATCH 12/15] Prove control output across card resizing and input modalities --- plugins/playgrounds/evals/launch/README.md | 84 +++++--- plugins/playgrounds/evals/launch/controls.mjs | 184 ++++++++++++------ .../playgrounds/evals/launch/controls.test.ts | 23 +++ plugins/playgrounds/evals/launch/fixtures.mjs | 12 ++ plugins/playgrounds/evals/launch/pixels.mjs | 65 +++++-- .../playgrounds/evals/launch/pixels.test.ts | 50 ++++- plugins/playgrounds/evals/launch/run.mjs | 12 ++ 7 files changed, 325 insertions(+), 105 deletions(-) create mode 100644 plugins/playgrounds/evals/launch/controls.test.ts create mode 100644 plugins/playgrounds/evals/launch/fixtures.mjs diff --git a/plugins/playgrounds/evals/launch/README.md b/plugins/playgrounds/evals/launch/README.md index a2b6ce804..7c22cb86d 100644 --- a/plugins/playgrounds/evals/launch/README.md +++ b/plugins/playgrounds/evals/launch/README.md @@ -46,8 +46,14 @@ Before sending any scored prompt, preflight checks the Personal project, plugin presence, both providers' model catalogs, Chrome, real input dispatch, PNG diffs, and the actual dev UI. Infrastructure failures here abort without counting forty spurious product failures. The tiny preflight fixture is not an eval prompt -and is never given to an agent. Generic drag fixtures also verify that a live -pointer-dependent readout passes while cosmetic hover alone fails. +and is never given to an agent. Generic fixtures also verify live pointer, +click-only and keyboard-only surfaces, output changes while a page resizes, and +geometry inside the tested drawing. Matching inert fixtures change only +hover/focus/color/padding; they must stay unproven. +Mixed stable/ticking readouts, selected sibling choices, and a runtime exception +with an otherwise working control are covered too. Saved-card replay scripts can +import `proofFixtures` from `fixtures.mjs`; each has `name`, `html`, `expectedPass` +and optional `liveMode`, `controlCount` (default 1), and `expectedStatus`. Each invocation keeps its preflight evidence in a separate timestamped directory. Each prompt creates a fresh `proj_personal` thread with a new personal environment @@ -82,31 +88,55 @@ non-default model for Personal, reset the **isolated instance** before measuring the source. A visible card with a dead control retains its measured delivery time and fails the control criterion. - The bundled `scripts/drive.mjs` opens the actual served frame URL and uses real - pointer/keyboard input. Range and custom slider controls are dragged diagonally to exercise either horizontal or vertical input; toggles/buttons clicked; - text/select controls receive key events. HTML is not reconstructed. Native - controls are driven in the real thread UI. Narrow-toggle is tested at 360, - 390, and 480 px. Every exposed control must be proven, including newly exposed, - disabled, and unsupported custom controls: unproven behavior fails with a reason. - Inventory is captured after every click, drag, key, move, scroll and wait. - Stable DOM identities prevent reassignment when controls appear or disappear; - newly exposed controls are retained as unproven failures even if a later tab - hides them. `controls.json` retains these intermediate inventories. -- Three no-input and two post-input screenshots are retained per control. The - diff masks the tested control and ordinary control/label chrome, ignores pixels already moving before input, - requires persistent output change, and requires changed output to exceed the - measured ambient movement by 4x. A changed checkbox or thumb alone cannot pass. - When a button changes a separate interactive SVG/canvas drawing, that drawing - remains observable; the active surface itself stays masked when testing it. - Generic regressions require geometry changes to pass and button/peer styling - alone to fail. This is deliberately conservative: purely animated responses and controls whose - only legitimate output is their own appearance require investigation, not an - automatic pass. PNG dimension changes are also unproven, never assumed live. - For drag controls the pointer stays at each endpoint during capture: leaving - the surface can reset a legitimate hover/drag output. Control masks still - exclude cosmetic hover changes from the score. Full-card capture can briefly - emit pointer leave/enter events, so the same pointer position is restored - immediately after each shot before waiting. An immediate capture-induced - reset remains unproven; the scorer does not weaken its visual-diff threshold. + pointer/keyboard input. Native ranges are dragged diagonally to exercise either + horizontal or vertical input. Native toggles/buttons are clicked; text/select + controls receive keys. Custom focusable/drawing surfaces receive **separate** + drag, click, Home, End, arrow, Space and Enter attempts. A slider role does not + imply a working drag handler. Every attempt retains five PNGs, actions, output + evidence and its own live/unproven status; success by one route never labels + the other routes live. At least one route must prove the control's output. Button groups prepare a + sibling choice before measuring the target, so selecting an already selected + option does not hide its effect; the preparation itself supplies no proof. +- HTML is not reconstructed. Native controls are driven in the real thread UI. + Narrow-toggle is tested at 360, 390 and 480 px. Disabled, unknown, conditionally + ineffective and newly exposed controls remain **unproven**, never automatically + called dead. Inventory is captured after every click, drag, key, move, scroll + and wait. Stable DOM identities prevent reassignment when controls disappear; + newly exposed controls remain unproven failures even if a later tab hides them. + `controls.json` retains these intermediate inventories. Runtime exceptions still + fail the entire card, even if a separately working control can be demonstrated. +- Each screenshot has matching bounds and content signatures for independent + output regions: SVG figures, readouts, paragraphs, table cells and definition + values. The scorer aligns each region at its own origin and compares its common + extent without stretching pixels. Whole-page height changes and translations + supply no proof; a reflowed explanation or changed figure can still be measured. + Legacy resized screenshots without region metadata require a fresh controlled + replay, not an inferred pass. +- A region needs **both** persistent text-token/SVG geometry changes and persistent + pixel changes. Control values, selected state, colors, borders, focus, hover and + class/style changes alone cannot satisfy the content check. Native control + chrome stays masked in every frame. Actual SVG geometry inside a custom input + surface remains observable, so masking the surface no longer hides its own + mechanism. Content evidence alone never passes invisible or unchanged pixels. +- Three no-input and two post-input screenshots detect baseline motion. Changed + pixels must remain changed in both post-input images, were stable beforehand, + and exceed the region's baseline motion by 4x (at least 24 pixels). A stable + numerical result can prove a response without being drowned out by unrelated + animation in another region. Text tokens are compared separately so a stable + mode label can remain eligible beside a ticking counter; that region must still + meet the same pixel threshold. These thresholds remain deliberately conservative. + Five finite samples cannot rule out a coincident autonomous transition that is + stable in both sampling windows; inspect per-attempt evidence for ambiguous cases. + Unsupported canvas-only effects, continuously changing readouts, preconditions + such as a speed control while playback is idle, replaced output nodes, and + controls whose only response is their own styling remain unproven. The harness + does not invent an initial scenario or claim it has proved those controls dead. +- For drag attempts the pointer stays at each endpoint during capture: leaving + the surface can reset a legitimate hover/drag output. The original pointer + restoration after each screenshot is preserved. An immediate capture-induced + reset still requires investigation; it is not excused by lower thresholds. + Delivery timings, caps, Personal isolation, terminal render grace and original + records are unchanged by these later control replays. `summary.json` and `summary.md` update after each case. Per-provider percentiles appear only after all twenty cases: median is the middle-pair mean, p90 is diff --git a/plugins/playgrounds/evals/launch/controls.mjs b/plugins/playgrounds/evals/launch/controls.mjs index 58c833c59..ce1c6edcd 100644 --- a/plugins/playgrounds/evals/launch/controls.mjs +++ b/plugins/playgrounds/evals/launch/controls.mjs @@ -13,6 +13,7 @@ export function inventory(scope = 'body') { if (/^(pointer|grab|grabbing|move|.*resize)$/.test(cursor) && getComputedStyle(el.parentElement || el).cursor !== cursor) candidates.push(el); } const identities = window.__launchControlIdentities ||= { elements: new WeakMap(), next: 0 }; + const groups = window.__launchControlGroups ||= { elements: new WeakMap(), next: 0 }; return [...new Set(candidates)].filter(el => { const r = el.getBoundingClientRect(); return r.width > 0 && r.height > 0 && getComputedStyle(el).visibility !== 'hidden' && @@ -20,26 +21,67 @@ export function inventory(scope = 'body') { }).map(el => { if (!identities.elements.has(el)) identities.elements.set(el, identities.next++); const i = identities.elements.get(el); + let group = el.closest('[role="tablist"],[role="group"],.pg-seg,.pg-segmented'); + // A selected button can be a no-op until a sibling choice is selected. + // Infer only its nearest button container, not the whole card or stage. + if (!group && el.matches('button,[role="tab"],[role="radio"]')) { + const parent = el.parentElement; + if (parent && parent !== root && [...parent.children].filter(child => child.matches('button,[role="tab"],[role="radio"]')).length > 1) group = parent; + } + if (group && !groups.elements.has(group)) groups.elements.set(group, groups.next++); el.dataset.launchControl = String(i); - return { cursor: getComputedStyle(el).cursor, disabled: Boolean(el.disabled || el.getAttribute('aria-disabled') === 'true'), index: i, tag: el.tagName.toLowerCase(), type: el.type || el.getAttribute('role') || '', + return { focusable: el.tabIndex >= 0, drawing: el.matches('svg,canvas') || Boolean(el.querySelector('svg,canvas')), cursor: getComputedStyle(el).cursor, disabled: Boolean(el.disabled || el.getAttribute('aria-disabled') === 'true'), index: i, tag: el.tagName.toLowerCase(), type: el.type || el.getAttribute('role') || '', label: el.getAttribute('aria-label') || el.textContent?.trim().slice(0, 100) || el.id || `control ${i}`, selected: el.checked || el.getAttribute('aria-pressed') === 'true' || el.getAttribute('aria-selected') === 'true', - group: el.name || el.closest('[role="tablist"],.pg-seg,.pg-segmented')?.outerHTML.slice(0, 120) || null }; + group: el.name ? `name:${el.name}` : group ? `group:${groups.elements.get(group)}` : null }; }); } -// A separate interactive drawing is output when another control changes it. -// Keep the tested surface and ordinary control chrome/selection peers masked. -function controlMasks(scope, testedIndex) { - const root = document.querySelector(scope), r = root.getBoundingClientRect(); - const rects = [...root.querySelectorAll('[data-launch-control]')].filter(el => { - const ordinary = el.matches('button,input,select,textarea,[role="button"],[role="switch"],[role="checkbox"],[role="radio"],[role="tab"]'); - const drawing = el.matches('svg,canvas') || el.querySelector('svg,canvas'); - return Number(el.dataset.launchControl) === testedIndex || ordinary || !drawing; - }).map(el => { - const b = (el.closest('label,.pg-control,[data-pg]') || el).getBoundingClientRect(); - return {x:b.x-r.x+4,y:b.y-r.y+4,w:b.width,h:b.height}; - }); - return {maskFor:testedIndex,rects}; +// Called immediately before each screenshot. All rectangles are in that +// screenshot's coordinates (drive.mjs captures the root with a 4 px border). +export function captureEvidence(scope,probeId,frameIndex) { + const root=document.querySelector(scope),rootRect=root.getBoundingClientRect(); + const ordinary='button,input,select,textarea,label,[role="button"],[role="switch"],[role="checkbox"],[role="radio"],[role="tab"]'; + const candidates=[...root.querySelectorAll('svg,canvas,output,[data-readout],[aria-live],.pg-sentence,.pg-readouts dd,p,dd,td')] + .filter(el => !el.closest(ordinary) && !el.parentElement?.closest('svg,canvas')); + // Prefer the outer named output if nested selectors describe the same text. + const outputs=candidates.filter(el => !candidates.some(parent => parent!==el && parent.contains(el))); + const identities=window.__launchOutputIdentities ||= {elements:new WeakMap(),next:0}; + const rectOf=el => {const r=el.getBoundingClientRect();return {x:r.x-rootRect.x+4,y:r.y-rootRect.y+4,w:r.width,h:r.height};}; + const chrome=[...root.querySelectorAll('[data-launch-control]')]; + const hash=value => {let n=2166136261;for(let i=0;i>>0).toString(16);}; + return {probeId,frameIndex,outputs:outputs.flatMap(el => { + const rect=rectOf(el);if(rect.w<=0 || rect.h<=0) return []; + if(!identities.elements.has(el)) identities.elements.set(el,identities.next++); + const semantics={},kind=el.tagName.toLowerCase(); + if(kind==='svg') { + const geometry=['x','y','x1','x2','y1','y2','cx','cy','r','rx','ry','width','height','d','points','transform','viewBox']; + [el,...el.querySelectorAll('*')].forEach((part,index) => { + const values=geometry.filter(name => part.hasAttribute(name)).map(name => [name,part.getAttribute(name)]); + if(part.tagName.toLowerCase()==='text') values.push(['text',part.textContent]); + if(values.length) { + // Visibility can reveal actual parts; color, outline, hover/focus, + // class, style, and selected/pressed state are deliberately excluded. + const r=part.getBoundingClientRect();values.push(['visible',r.width>0 && r.height>0 && getComputedStyle(part).visibility!=='hidden']); + semantics[index]=hash(JSON.stringify(values)); + } + }); + } else if(kind!=='canvas') { + const copy=el.cloneNode(true);copy.querySelectorAll(ordinary).forEach(control => control.remove()); + // Separate stable words/numbers from an independently ticking counter. + // Positions must stay stable throughout all five samples; inserting or + // reordering content still needs pixel proof in the same output region. + const tokens=(copy.textContent || '').match(/[\p{L}\p{N}_]+|[^\s\p{L}\p{N}_]/gu) || []; + tokens.forEach((token,index) => {semantics[`token:${index}`]=token;}); + } + const masks=chrome.filter(control => { + // Inspect actual geometry/text inside a custom drawing surface. Its + // control chrome cannot count because style-only changes have no semantic + // evidence. Native/button/toggle chrome stays masked even when nested. + if(control.contains(el) && !control.matches(ordinary)) return false; + return control.matches(ordinary) || !(control.matches('svg,canvas') || control.querySelector('svg,canvas')); + }).map(control => rectOf(control.closest('label,.pg-control,[data-pg]') || control)); + return [{id:identities.elements.get(el),kind,rect,semantics,masks}]; + })}; } const selector = c => `[data-launch-control="${c.index}"]`; function action(c) { @@ -56,57 +98,77 @@ function action(c) { return null; } +export function inputProbes(control) { + const primary=action(control); + if(control.disabled || control.tag==='canvas') return []; + const native=['button','input','select','textarea','a'].includes(control.tag); + const custom=!native && (control.focusable || control.drawing || primary || ['slider','button'].includes(control.type)); + if(!custom) return primary ? [{mode:primary.some(step => step[0]==='drag')?'drag':'primary',steps:primary}] : []; + const s=selector(control); + const keys=['Home','End','ArrowRight','ArrowLeft','ArrowUp','ArrowDown',' ','Enter']; + return [ + {mode:'drag',steps:[['drag',s,0.2,0.8,0.85,0.15,20]]}, + {mode:'click',steps:[['click',s]]}, + ...[...keys].map(key => ({mode:`key-${key===' '?'Space':key}`,steps:[['key',key,s]]})), + ]; +} + export async function checkControls({ target, scope = 'body', width, dir, drive }) { const listExpression = `(${inventory.toString()})(${JSON.stringify(scope)})`; const discovered = await drive(target, [['eval', listExpression]], join(dir, 'inventory'), width); const controls = discovered.evals.find(Array.isArray); - if (!controls?.length) return { pass: false, controls: [], reason: 'No exposed controls discovered' }; - const actions = [['eval', listExpression]]; - const plans = []; - for (const control of controls) { - const steps = action(control); - if (!steps) { plans.push({ ...control, pass: false, reason: control.disabled ? 'Disabled control: precondition not exercised; needs review' : 'Unsupported exposed control; manual proof required' }); continue; } - const s = selector(control); - // Leaving a drag surface can reset its output. Keep its low/high pointer - // positions through the screenshots; the existing masks exclude cosmetics. - const drag = steps.find(step => step[0] === 'drag'); - const moveOff = drag ? [] : [['move', scope, 0.01, 0.01]]; - // Full-card capture can briefly resize Chrome's viewport and emit leave / - // enter without move. Restore the same real pointer position after capture - // so its delayed leave handler cannot reset the next measured frame. - const restoreBefore = drag ? [['move', s, drag[2], drag[3]]] : []; - const restoreAfter = drag ? [['move', s, drag[4], drag[5]]] : []; - actions.push(['scroll', s]); - // A selected tab/radio and a reset need a changed starting state to be tested. - const peer = controls.find(c => c.index !== control.index && action(c) && (control.group ? c.group === control.group : action(c) && !/reset/i.test(c.label))); - if (peer && (control.selected || /reset|restart|clear/i.test(control.label))) actions.push(...action(peer)); - if (drag) actions.push(['drag', s, drag[4], drag[5], drag[2], drag[3]]); - actions.push(...moveOff, ['wait', 400]); - const paths = ['before0','before1','before2','after0','after1'].map(name => join(dir, `control-${control.index}-${name}.png`)); - actions.push(['eval', `(${controlMasks.toString()})(${JSON.stringify(scope)},${control.index})`]); - for (let n = 0; n < 3; n++) actions.push(['shot', paths[n], scope], ...restoreBefore, ['wait', 450]); - actions.push(...steps, ...moveOff, ['wait', 450], ['shot', paths[3], scope], ...restoreAfter, ['wait', 450], ['shot', paths[4], scope], ...restoreAfter); - plans.push({ ...control, paths, steps }); + if (!controls?.length) return { pass: false, status:'unproven', controls: [], reason: 'No exposed controls discovered' }; + const actions = [['eval', listExpression]],plans=[]; + for(const control of controls) { + const probes=inputProbes(control),s=selector(control); + if(!probes.length) {plans.push({...control,pass:false,status:'unproven',reason:control.disabled?'Disabled control: precondition not exercised; needs review':'Unsupported exposed control; manual proof required'});continue;} + const trials=[]; + for(const probe of probes) { + const {steps,mode}=probe,probeId=`${control.index}-${mode}`; + // Keep drag endpoints during capture. A legitimate pointer-dependent + // output may reset on leave; preserve the existing capture restoration. + const drag=steps.find(step => step[0]==='drag'); + const moveOff=drag?[]:[['move',scope,0.01,0.01]]; + const restoreBefore=drag?[['move',s,drag[2],drag[3]]]:[]; + const restoreAfter=drag?[['move',s,drag[4],drag[5]]]:[]; + actions.push(['scroll',s]); + const peer=controls.find(c => c.index!==control.index && action(c) && (control.group?c.group===control.group:! /reset/i.test(c.label))); + if(peer && (control.group || control.selected || /reset|restart|clear/i.test(control.label))) actions.push(...action(peer)); + if(drag) actions.push(['drag',s,drag[4],drag[5],drag[2],drag[3]]); + actions.push(...moveOff,['wait',400]); + const paths=['before0','before1','before2','after0','after1'].map(name => join(dir,`control-${probeId}-${name}.png`)); + const shot=index => [ + ['eval',`(${captureEvidence.toString()})(${JSON.stringify(scope)},${JSON.stringify(probeId)},${index})`], + ['shot',paths[index],scope], + ]; + for(let n=0;n<3;n++) actions.push(...shot(n),...restoreBefore,['wait',450]); + actions.push(...steps,...moveOff,['wait',450],...shot(3),...restoreAfter,['wait',450],...shot(4),...restoreAfter); + trials.push({...probe,probeId,paths}); + } + plans.push({...control,probes:trials}); } - actions.push(['eval', listExpression]); - const exercised = await drive(target, observeInteractions(actions, listExpression), join(dir, 'controls'), width); - const results = plans.map(plan => { - if (!plan.paths) return plan; - const masks = exercised.evals.find(v => v?.maskFor === plan.index)?.rects; - if (!masks) return { ...plan, pass: false, reason: 'Control masks unavailable' }; - try { return { ...plan, ...visualDelta(plan.paths, masks) }; } - catch (error) { return { ...plan, pass: false, reason: String(error) }; } + actions.push(['eval',listExpression]); + // Multiple modalities can take longer than the original single gesture. This + // is bounded control QA after delivery timing, never added to visibleMs. + const exercised=await drive(target,observeInteractions(actions,listExpression),join(dir,'controls'),width,{timeout:Math.min(900_000,Math.max(240_000,plans.reduce((n,p)=>n+(p.probes?.length || 0),0)*7000))}); + const results=plans.map(plan => { + if(!plan.probes) return plan; + const probes=plan.probes.map(probe => { + const frames=Array.from({length:5},(_,index) => exercised.evals.find(value => value?.probeId===probe.probeId && value.frameIndex===index)); + try {return {...probe,...visualDelta(probe.paths,[],frames)};} + catch(error) {return {...probe,pass:false,status:'unproven',reason:String(error)};} + }); + const best=probes.find(probe => probe.pass) || probes[0]; + return {...plan,...best,probes,pass:probes.some(probe => probe.pass),status:probes.some(probe => probe.pass)?'live':'unproven', + coverage:{drag:probes.filter(p=>p.mode==='drag').map(p=>({status:p.status,reason:p.reason})),click:probes.filter(p=>p.mode==='click').map(p=>({status:p.status,reason:p.reason})),keyboard:probes.filter(p=>p.mode.startsWith('key-')).map(p=>({mode:p.mode,status:p.status,reason:p.reason}))}}; }); - const initial = exercised.evals.find(Array.isArray) || controls; - const snapshots = [ - { inventoryAfter: {phase:'start'}, controls: initial }, - ...exercised.evals.filter(value => value?.inventoryAfter), - { inventoryAfter: {phase:'end'}, controls: exercised.evals.filter(Array.isArray).at(-1) || [] }, - ]; - for (const control of unexercisedControls(controls, snapshots)) - results.push({ ...control, pass: false, reason: 'Interaction exposed another control that was not exercised (retained even if later hidden)' }); - const pass = exercised.code === 0 && !exercised.log.includes('exception:') && results.every(c => c.pass); - const report = { pass, controls: results, inventories: snapshots, reason: pass ? 'Every exposed control produced an output change' : 'At least one control is dead, unsupported, or unproven' }; - writeFileSync(join(dir, 'controls.json'), JSON.stringify(report, null, 2)); + const initial=exercised.evals.find(Array.isArray) || controls; + const snapshots=[{inventoryAfter:{phase:'start'},controls:initial},...exercised.evals.filter(value=>value?.inventoryAfter),{inventoryAfter:{phase:'end'},controls:exercised.evals.filter(Array.isArray).at(-1) || []}]; + for(const control of unexercisedControls(controls,snapshots)) results.push({...control,pass:false,status:'unproven',reason:'Interaction exposed another control that was not exercised (retained even if later hidden)'}); + const runtimeErrors=exercised.log.split('\n').filter(line=>line.includes('exception:')); + const pass=exercised.code===0 && runtimeErrors.length===0 && results.every(control=>control.pass); + const report={pass,status:pass?'live':runtimeErrors.length?'runtime-error':'unproven',algorithm:'aligned-output-regions-v1',controls:results,inventories:snapshots,runtimeErrors, + reason:pass?'Every exposed control produced a proven output change':runtimeErrors.length?'Runtime exception prevents card proof':'At least one control remains unproven; this is not proof that it is dead'}; + writeFileSync(join(dir,'controls.json'),JSON.stringify(report,null,2)); return report; } diff --git a/plugins/playgrounds/evals/launch/controls.test.ts b/plugins/playgrounds/evals/launch/controls.test.ts new file mode 100644 index 000000000..65e5f5861 --- /dev/null +++ b/plugins/playgrounds/evals/launch/controls.test.ts @@ -0,0 +1,23 @@ +import { describe, expect, it } from 'vitest'; +// @ts-expect-error eval-only ESM +import { inputProbes } from './controls.mjs'; + +describe('custom surface input coverage',()=>{ + it('tests drag, click and keyboard independently despite slider semantics',()=>{ + const probes=inputProbes({index:0,tag:'div',type:'slider',focusable:true,label:'Position'}); + expect(probes.map((probe:{mode:string})=>probe.mode)).toEqual(expect.arrayContaining(['drag','click','key-Home','key-End','key-ArrowRight','key-ArrowLeft','key-ArrowUp','key-ArrowDown','key-Space','key-Enter'])); + expect(probes.find((probe:{mode:string})=>probe.mode==='key-End').steps).toEqual([['key','End','[data-launch-control="0"]']]); + }); + it('also probes a focusable drawing without an ARIA role',()=>{ + expect(inputProbes({index:1,tag:'div',type:'',focusable:true,drawing:true,label:'Drawing'}).map((probe:{mode:string})=>probe.mode)).toContain('key-Enter'); + }); + it('does not pretend disabled, unknown or file controls were exercised',()=>{ + expect(inputProbes({index:0,tag:'div',type:'slider',disabled:true})).toEqual([]); + expect(inputProbes({index:0,tag:'span',type:''})).toEqual([]); + expect(inputProbes({index:0,tag:'input',type:'file'})).toEqual([]); + }); + it('keeps native toggle interaction focused on its actual click',()=>{ + const probes=inputProbes({index:0,tag:'input',type:'checkbox'}); + expect(probes).toEqual([{mode:'primary',steps:[['click','[data-launch-control="0"]']]}]); + }); +}); diff --git a/plugins/playgrounds/evals/launch/fixtures.mjs b/plugins/playgrounds/evals/launch/fixtures.mjs new file mode 100644 index 000000000..f2c4e1fd4 --- /dev/null +++ b/plugins/playgrounds/evals/launch/fixtures.mjs @@ -0,0 +1,12 @@ +// Generic harness checks, never supplied to an agent or copied into a skill. +export const proofFixtures = [ + {name:'runtime-error-with-working-control',expectedPass:false,expectedStatus:'runtime-error',html:`Initial result`}, + {name:'mixed-static-and-ticking-readout',expectedPass:true,html:`Mode Alpha; clock 000`}, + {name:'ticking-readout-only',expectedPass:false,html:`Mode Alpha; clock 000`}, + {name:'selected-button-sibling',expectedPass:true,html:`
Mode Alpha`,controlCount:2}, + {name:'resize-output',expectedPass:true,html:`

Initial result.

`}, + {name:'resize-chrome-only',expectedPass:false,html:`

Unchanged result.

`}, + {name:'custom-keyboard-only',expectedPass:true,liveMode:'key-',html:`
`}, + {name:'custom-click-only',expectedPass:true,liveMode:'click',html:`
Activate
0`}, + {name:'custom-cosmetic-only',expectedPass:false,html:`
42`}, +]; diff --git a/plugins/playgrounds/evals/launch/pixels.mjs b/plugins/playgrounds/evals/launch/pixels.mjs index 4e7e16d5b..7e32c3ab7 100644 --- a/plugins/playgrounds/evals/launch/pixels.mjs +++ b/plugins/playgrounds/evals/launch/pixels.mjs @@ -5,24 +5,57 @@ const require = createRequire(import.meta.url); // a browser/image stack to the shipped plugin's runtime dependencies. const { PNG } = require(process.env.LAUNCH_PNGJS || 'pngjs'); export const readPng = file => PNG.sync.read(readFileSync(file)); -const delta = (a, b, i) => Math.max(...[0, 1, 2].map(c => Math.abs(a.data[i + c] - b.data[i + c]))); -export function visualDelta(files, masks = []) { - const [a, b, c, d, e] = files.map(readPng); - if ([b, c, d, e].some(p => p.width !== a.width || p.height !== a.height)) - return { pass: false, reason: 'screenshot dimensions changed; needs review' }; - let stable = 0, changed = 0, ambient = 0; - for (let y = 0; y < a.height; y++) for (let x = 0; x < a.width; x++) { - if (masks.some(r => x >= r.x - 6 && x <= r.x + r.w + 6 && y >= r.y - 6 && y <= r.y + r.h + 6)) continue; - const i = (y * a.width + x) * 4; - if (delta(a, b, i) > 12 || delta(b, c, i) > 12) { ambient++; continue; } +const distance = (a, b, ai, bi) => Math.max(...[0, 1, 2].map(channel => Math.abs(a.data[ai + channel] - b.data[bi + channel]))); +const masked = (x,y,masks) => masks.some(r => x >= r.x - 6 && x <= r.x+r.w+6 && y >= r.y-6 && y <= r.y+r.h+6); +function compareRegion(images, rects, masks) { + // Align each output at its own origin. Page growth and translations are not + // evidence. Compare only the shared extent; do not stretch/reflow screenshots. + const starts = rects.map(r => ({x:Math.max(0,Math.round(r.x)),y:Math.max(0,Math.round(r.y))})); + const width = Math.max(0,Math.floor(Math.min(...rects.map((r,i) => Math.min(r.w,images[i].width-starts[i].x))))); + const height = Math.max(0,Math.floor(Math.min(...rects.map((r,i) => Math.min(r.h,images[i].height-starts[i].y))))); + let stable=0,changed=0,ambient=0; + for(let y=0;y masked(start.x+x,start.y+y,masks[i]))) continue; + const indices=starts.map((start,i) => ((start.y+y)*images[i].width+start.x+x)*4); + const delta=(a,b) => distance(images[a],images[b],indices[a],indices[b]); + if(delta(0,1)>12 || delta(1,2)>12) {ambient++;continue;} stable++; - if (delta(c, d, i) > 18 && delta(c, e, i) > 18 && delta(d, e, i) <= 12) changed++; + if(delta(2,3)>18 && delta(2,4)>18 && delta(3,4)<=12) changed++; } - // Moving scenes cannot pass solely because motion crossed previously still - // pixels. Require a large excess over the no-input motion observed before it. - const required = Math.max(24, ambient * 4); - return { pass: changed >= required, changed, required, ambient, stable, - reason: changed >= required ? 'stable output changed outside controls' : 'no proven output change outside controls' }; + const required=Math.max(24,ambient*4),pass=changed>=required; + return {pass,status:pass?'live':'unproven',changed,required,ambient,stable,comparedWidth:width,comparedHeight:height, + reason:pass?'stable output changed outside controls':'no proven output change outside controls'}; +} +export function stableSemanticChanges(signatures) { + const keys=new Set(signatures.flatMap(signature => Object.keys(signature))); + return [...keys].filter(key => signatures[0][key]===signatures[1][key] && signatures[1][key]===signatures[2][key] && + signatures[3][key]===signatures[4][key] && signatures[2][key]!==signatures[3][key]); +} +export function visualDelta(files,masks=[],frames) { + const images=files.map(readPng); + if(images.length!==5) throw new Error('Need three baseline and two post-input screenshots'); + if(frames) { + if(frames.length!==5 || frames.some(frame => !frame?.outputs)) return {pass:false,status:'unproven',reason:'Output-region evidence missing'}; + const regions=frames[0].outputs.map(output => { + const samples=frames.map(frame => frame.outputs.find(candidate => candidate.id===output.id)); + if(samples.some(sample => !sample)) return {id:output.id,pass:false,status:'unproven',reason:'Output region disappeared or was replaced'}; + const semanticChanges=stableSemanticChanges(samples.map(sample => sample.semantics)); + if(!semanticChanges.length) return {id:output.id,pass:false,status:'unproven',reason:'No persistent text or SVG geometry change; layout/style alone is not proof'}; + const comparison=compareRegion(images,samples.map(sample => sample.rect),samples.map(sample => sample.masks)); + return {id:output.id,kind:output.kind,...comparison,semanticChanges}; + }); + // A stable readout need not overcome unrelated animation elsewhere in the + // figure. It still needs its own semantic AND persistent pixel evidence. + const best=regions.find(region => region.pass) || regions.find(region => region.changed!==undefined); + return {...(best || {pass:false,status:'unproven',reason:'No proven output change outside controls'}),regions, + dimensions:images.map(image => ({width:image.width,height:image.height})),comparison:'aligned-output-regions'}; + } + // Legacy evidence with no region metadata is safe only on a fixed canvas. + // New measurements always supply metadata; differing page dimensions alone + // neither pass nor fail a control. + if(images.some(image => image.width!==images[0].width || image.height!==images[0].height)) + return {pass:false,status:'unproven',reason:'Output-region evidence needed to align legacy resized screenshots'}; + return compareRegion(images,images.map(image => ({x:0,y:0,w:image.width,h:image.height})),images.map(() => masks)); } export function hasInk(file) { const p = readPng(file); diff --git a/plugins/playgrounds/evals/launch/pixels.test.ts b/plugins/playgrounds/evals/launch/pixels.test.ts index 59e79d44a..1bca2fcb5 100644 --- a/plugins/playgrounds/evals/launch/pixels.test.ts +++ b/plugins/playgrounds/evals/launch/pixels.test.ts @@ -4,7 +4,7 @@ import { mkdtempSync, rmSync, writeFileSync } from 'node:fs'; import { tmpdir } from 'node:os'; import { join } from 'node:path'; // @ts-expect-error eval-only ESM is not part of the shipped TypeScript bundle -import { visualDelta } from './pixels.mjs'; +import { visualDelta, stableSemanticChanges } from './pixels.mjs'; const require = createRequire(import.meta.url); const { PNG } = require('pngjs'); const directories: string[] = []; @@ -35,3 +35,51 @@ describe('control screenshot evidence',() => { expect(visualDelta(files,[{x:0,y:0,w:12,h:12}]).pass).toBe(true); }); }); + + +// Metadata follows output elements through page growth and translation; the +// image itself is never scaled to make changed dimensions look like a response. +function regionShots(change: boolean, resize: boolean, translate = false) { + const dir=mkdtempSync(join(tmpdir(),'launch-region-'));directories.push(dir); + const frames: any[]=[]; + const files=Array.from({length:5},(_,frame)=>{ + const after=frame>=3,height=resize && after?96:64,y=translate && after?24:8; + const png=new PNG({width:64,height});png.data.fill(255); + const extent=change && after?24:10; + for(let dy=0;dy<20;dy++) for(let x=8;x<8+extent;x++) { + const i=((y+dy)*64+x)*4;png.data[i]=png.data[i+1]=png.data[i+2]=0; + } + frames.push({outputs:[{id:0,kind:'svg',rect:{x:8,y,w:32,h:24},masks:[],semantics:{geometry:String(extent)}}]}); + const path=join(dir,`${frame}.png`);writeFileSync(path,PNG.sync.write(png));return path; + }); + return {files,frames}; +} +describe('aligned output-region proof',()=>{ + it('accepts actual output change despite different body heights',()=>{ + const {files,frames}=regionShots(true,true); + expect(visualDelta(files,[],frames).pass).toBe(true); + }); + it('aligns moved output locally instead of counting page reflow as change',()=>{ + const {files,frames}=regionShots(false,true,true); + expect(visualDelta(files,[],frames).pass).toBe(false); + // Even if another semantic attribute changes, mere translation supplies no pixels. + frames[3].outputs[0].semantics.extra='x';frames[4].outputs[0].semantics.extra='x'; + expect(visualDelta(files,[],frames).changed).toBe(0); + }); + it('requires both content evidence and pixels, never style alone or a semantic-only pass',()=>{ + const {files,frames}=regionShots(true,true); + frames.forEach(frame=>frame.outputs[0].semantics={geometry:'unchanged'}); + expect(visualDelta(files,[],frames).pass).toBe(false); + const unchanged=regionShots(false,false); + unchanged.frames[3].outputs[0].semantics.geometry='different';unchanged.frames[4].outputs[0].semantics.geometry='different'; + expect(visualDelta(unchanged.files,[],unchanged.frames).pass).toBe(false); + }); + it('does not call missing or replaced output evidence dead',()=>{ + const {files,frames}=regionShots(true,true);frames[4].outputs=[]; + expect(visualDelta(files,[],frames)).toMatchObject({pass:false,status:'unproven'}); + }); + it('excludes continuously changing semantics while retaining stable changes',()=>{ + const signatures=[0,1,2,3,4].map((n)=>({clock:String(n),result:n<3?'old':'new',style:'unchanged'})); + expect(stableSemanticChanges(signatures)).toEqual(['result']); + }); +}); diff --git a/plugins/playgrounds/evals/launch/run.mjs b/plugins/playgrounds/evals/launch/run.mjs index 54a14a185..a7496cb81 100644 --- a/plugins/playgrounds/evals/launch/run.mjs +++ b/plugins/playgrounds/evals/launch/run.mjs @@ -7,6 +7,7 @@ import { checkControls } from './controls.mjs'; import { hasInk } from './pixels.mjs'; import { failureScore, providerSummary, resumeMismatch } from './metrics.mjs'; import { renderWindow } from './observations.mjs'; +import { proofFixtures } from './fixtures.mjs'; let interrupted = false; process.on('SIGTERM', () => { interrupted = true; }); @@ -203,6 +204,17 @@ for (const live of [true, false]) { if (checked.pass !== live || checked.controls.length !== 3 || buttons.length !== 2 || buttons.some(c=>c.pass !== live)) throw new Error(`Preflight: separate drawing ${live ? 'live' : 'inert'} regression failed; see ${dir}/controls.json`); } +// Region alignment and custom-surface modalities must prove real output, while +// resize/focus/hover/color-only changes remain unproven. No topic-specific hooks. +for (const fixture of proofFixtures) { + const dir=join(preflightDir,fixture.name);mkdirSync(dir,{recursive:true}); + const path=join(dir,'fixture.html');writeFileSync(path,fixture.html); + const checked=await checkControls({target:path,width:480,dir,drive}); + if(checked.pass!==fixture.expectedPass || checked.controls.length!==(fixture.controlCount || 1) || + (fixture.expectedStatus && checked.status!==fixture.expectedStatus) || + (fixture.liveMode && !checked.controls[0].probes?.some(probe=>probe.mode.startsWith(fixture.liveMode) && probe.pass))) + throw new Error(`Preflight: ${fixture.name} regression failed; see ${dir}/controls.json`); +} const ui = await drive(base.href,[['until','Boolean(document.querySelector("#root")?.children.length)',20_000],['eval','({ready:Boolean(document.querySelector("#root")?.children.length),text:document.body.innerText.slice(0,300)})'],['shot',join(preflightDir,'bb.png'),'body']],join(preflightDir,'ui'),1280); if (ui.code || !ui.evals.some(v => v?.ready) || !hasInk(join(preflightDir,'bb.png'))) throw new Error('Preflight: dev bb UI did not render'); From f009de5838f80b90e861e5727f0ad11cba8814f8 Mon Sep 17 00:00:00 2001 From: brsbl <57682038+brsbl@users.noreply.github.com> Date: Tue, 20 Oct 2026 04:09:30 +0000 Subject: [PATCH 13/15] Reject caught render errors in control proof --- plugins/playgrounds/evals/launch/controls.mjs | 4 +++- plugins/playgrounds/evals/launch/fixtures.mjs | 1 + 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/plugins/playgrounds/evals/launch/controls.mjs b/plugins/playgrounds/evals/launch/controls.mjs index ce1c6edcd..da9e186b6 100644 --- a/plugins/playgrounds/evals/launch/controls.mjs +++ b/plugins/playgrounds/evals/launch/controls.mjs @@ -165,7 +165,9 @@ export async function checkControls({ target, scope = 'body', width, dir, drive const initial=exercised.evals.find(Array.isArray) || controls; const snapshots=[{inventoryAfter:{phase:'start'},controls:initial},...exercised.evals.filter(value=>value?.inventoryAfter),{inventoryAfter:{phase:'end'},controls:exercised.evals.filter(Array.isArray).at(-1) || []}]; for(const control of unexercisedControls(controls,snapshots)) results.push({...control,pass:false,status:'unproven',reason:'Interaction exposed another control that was not exercised (retained even if later hidden)'}); - const runtimeErrors=exercised.log.split('\n').filter(line=>line.includes('exception:')); + // The parameter bridge catches subscriber failures and reports console.error; + // a partially updated readout must not turn that failed render into a pass. + const runtimeErrors=exercised.log.split('\n').filter(line=>/^(?:exception|console\.error):/.test(line)); const pass=exercised.code===0 && runtimeErrors.length===0 && results.every(control=>control.pass); const report={pass,status:pass?'live':runtimeErrors.length?'runtime-error':'unproven',algorithm:'aligned-output-regions-v1',controls:results,inventories:snapshots,runtimeErrors, reason:pass?'Every exposed control produced a proven output change':runtimeErrors.length?'Runtime exception prevents card proof':'At least one control remains unproven; this is not proof that it is dead'}; diff --git a/plugins/playgrounds/evals/launch/fixtures.mjs b/plugins/playgrounds/evals/launch/fixtures.mjs index f2c4e1fd4..6a94792a2 100644 --- a/plugins/playgrounds/evals/launch/fixtures.mjs +++ b/plugins/playgrounds/evals/launch/fixtures.mjs @@ -1,5 +1,6 @@ // Generic harness checks, never supplied to an agent or copied into a skill. export const proofFixtures = [ + {name:'caught-error-after-output',expectedPass:false,expectedStatus:'runtime-error',html:`Initial result`}, {name:'runtime-error-with-working-control',expectedPass:false,expectedStatus:'runtime-error',html:`Initial result`}, {name:'mixed-static-and-ticking-readout',expectedPass:true,html:`Mode Alpha; clock 000`}, {name:'ticking-readout-only',expectedPass:false,html:`Mode Alpha; clock 000`}, From 60df7ee208c3057884387e1638169e8108198431 Mon Sep 17 00:00:00 2001 From: brsbl <57682038+brsbl@users.noreply.github.com> Date: Tue, 20 Oct 2026 06:59:47 +0000 Subject: [PATCH 14/15] Discover native disclosures in launch control checks --- plugins/playgrounds/evals/launch/README.md | 3 ++- plugins/playgrounds/evals/launch/controls.mjs | 6 +++--- plugins/playgrounds/evals/launch/controls.test.ts | 3 +++ plugins/playgrounds/evals/launch/fixtures.mjs | 1 + 4 files changed, 9 insertions(+), 4 deletions(-) diff --git a/plugins/playgrounds/evals/launch/README.md b/plugins/playgrounds/evals/launch/README.md index 7c22cb86d..cd817a717 100644 --- a/plugins/playgrounds/evals/launch/README.md +++ b/plugins/playgrounds/evals/launch/README.md @@ -89,7 +89,8 @@ non-default model for Personal, reset the **isolated instance** before measuring and fails the control criterion. - The bundled `scripts/drive.mjs` opens the actual served frame URL and uses real pointer/keyboard input. Native ranges are dragged diagonally to exercise either - horizontal or vertical input. Native toggles/buttons are clicked; text/select + horizontal or vertical input. Native toggles, buttons and disclosure summaries + are clicked (summary discovery does not depend on cursor styling); text/select controls receive keys. Custom focusable/drawing surfaces receive **separate** drag, click, Home, End, arrow, Space and Enter attempts. A slider role does not imply a working drag handler. Every attempt retains five PNGs, actions, output diff --git a/plugins/playgrounds/evals/launch/controls.mjs b/plugins/playgrounds/evals/launch/controls.mjs index da9e186b6..1b0994231 100644 --- a/plugins/playgrounds/evals/launch/controls.mjs +++ b/plugins/playgrounds/evals/launch/controls.mjs @@ -7,7 +7,7 @@ import { observeInteractions, unexercisedControls } from './observations.mjs'; export function inventory(scope = 'body') { const root = document.querySelector(scope); if (!root) return []; - const candidates = [...root.querySelectorAll('button,input:not([type="hidden"]),select,textarea,[role="button"],[role="switch"],[role="slider"],[role="checkbox"],[role="radio"],[role="tab"],[tabindex],canvas,[onclick],[data-drag]')]; + const candidates = [...root.querySelectorAll('button,summary,input:not([type="hidden"]),select,textarea,[role="button"],[role="switch"],[role="slider"],[role="checkbox"],[role="radio"],[role="tab"],[tabindex],canvas,[onclick],[data-drag]')]; for (const el of root.querySelectorAll('*')) { const cursor = getComputedStyle(el).cursor; if (/^(pointer|grab|grabbing|move|.*resize)$/.test(cursor) && getComputedStyle(el.parentElement || el).cursor !== cursor) candidates.push(el); @@ -94,14 +94,14 @@ function action(c) { if (c.type === 'number') return [['click', s], ['key', 'ArrowUp', s]]; return [['click', s], ['key', 'x', s]]; } - if (c.tag === 'button' || ['button','submit','reset','checkbox','radio','switch','tab'].includes(c.type) || c.tag === 'a' || c.cursor === 'pointer') return [['click', s]]; + if (c.tag === 'button' || c.tag === 'summary' || ['button','submit','reset','checkbox','radio','switch','tab'].includes(c.type) || c.tag === 'a' || c.cursor === 'pointer') return [['click', s]]; return null; } export function inputProbes(control) { const primary=action(control); if(control.disabled || control.tag==='canvas') return []; - const native=['button','input','select','textarea','a'].includes(control.tag); + const native=['button','summary','input','select','textarea','a'].includes(control.tag); const custom=!native && (control.focusable || control.drawing || primary || ['slider','button'].includes(control.type)); if(!custom) return primary ? [{mode:primary.some(step => step[0]==='drag')?'drag':'primary',steps:primary}] : []; const s=selector(control); diff --git a/plugins/playgrounds/evals/launch/controls.test.ts b/plugins/playgrounds/evals/launch/controls.test.ts index 65e5f5861..f38cd12f0 100644 --- a/plugins/playgrounds/evals/launch/controls.test.ts +++ b/plugins/playgrounds/evals/launch/controls.test.ts @@ -20,4 +20,7 @@ describe('custom surface input coverage',()=>{ const probes=inputProbes({index:0,tag:'input',type:'checkbox'}); expect(probes).toEqual([{mode:'primary',steps:[['click','[data-launch-control="0"]']]}]); }); + it('clicks a native disclosure without relying on a custom cursor or role',()=>{ + expect(inputProbes({index:4,tag:'summary',type:'',cursor:'auto',focusable:true})).toEqual([{mode:'primary',steps:[['click','[data-launch-control="4"]']]}]); + }); }); diff --git a/plugins/playgrounds/evals/launch/fixtures.mjs b/plugins/playgrounds/evals/launch/fixtures.mjs index 6a94792a2..2166a4fdc 100644 --- a/plugins/playgrounds/evals/launch/fixtures.mjs +++ b/plugins/playgrounds/evals/launch/fixtures.mjs @@ -1,5 +1,6 @@ // Generic harness checks, never supplied to an agent or copied into a skill. export const proofFixtures = [ + {name:'native-disclosure',expectedPass:true,html:`
Show explanation

Additional explanation.

Explanation hidden`}, {name:'caught-error-after-output',expectedPass:false,expectedStatus:'runtime-error',html:`Initial result`}, {name:'runtime-error-with-working-control',expectedPass:false,expectedStatus:'runtime-error',html:`Initial result`}, {name:'mixed-static-and-ticking-readout',expectedPass:true,html:`Mode Alpha; clock 000`}, From 0e9b5cb8a979ac9396ab46d410f79527e1e9ba1a Mon Sep 17 00:00:00 2001 From: brsbl <57682038+brsbl@users.noreply.github.com> Date: Tue, 20 Oct 2026 07:09:15 +0000 Subject: [PATCH 15/15] Record corrected gate evidence and verify isolated eval server identity --- plugins/playgrounds/evals/launch/README.md | 7 + .../playgrounds/evals/launch/isolation.mjs | 14 + .../evals/launch/isolation.test.ts | 14 + .../gate-1/claude-full-prototype-timing.json | 3889 ++++++++++ .../gate-1/claude-full-prototype-timing.md | 105 + .../gate-1/claude-timing-analysis.json | 1972 +++++ .../reports/gate-1/claude-timing-analysis.md | 88 + .../reports/gate-1/gate-1-control-audit.json | 1642 +++++ .../launch/reports/gate-1/gate-1-summary.json | 148 + .../launch/reports/gate-1/gate-1-summary.md | 255 + .../gate-1/manual-control-adjudications.json | 5480 ++++++++++++++ .../launch/reports/gate-1/provenance.json | 70 + ...-visual-review-claude-prototype-extra.json | 2408 ++++++ ...ay-visual-review-claude-prototype-extra.md | 32 + ...y-visual-review-codex-baseline-manual.json | 181 + ...lay-visual-review-codex-baseline-manual.md | 14 + .../replay-visual-review-codex-baseline.json | 3807 ++++++++++ .../replay-visual-review-codex-baseline.md | 76 + .../replay-visual-review-codex-prototype.json | 6426 +++++++++++++++++ .../replay-visual-review-codex-prototype.md | 80 + .../reports/gate-1/replay-visual-review.json | 344 + .../evals/launch/reports/gate-1/runs.json | 5556 ++++++++++++++ .../supplemental-control-adjudications.json | 219 + plugins/playgrounds/evals/launch/run.mjs | 7 +- 24 files changed, 32832 insertions(+), 2 deletions(-) create mode 100644 plugins/playgrounds/evals/launch/isolation.mjs create mode 100644 plugins/playgrounds/evals/launch/isolation.test.ts create mode 100644 plugins/playgrounds/evals/launch/reports/gate-1/claude-full-prototype-timing.json create mode 100644 plugins/playgrounds/evals/launch/reports/gate-1/claude-full-prototype-timing.md create mode 100644 plugins/playgrounds/evals/launch/reports/gate-1/claude-timing-analysis.json create mode 100644 plugins/playgrounds/evals/launch/reports/gate-1/claude-timing-analysis.md create mode 100644 plugins/playgrounds/evals/launch/reports/gate-1/gate-1-control-audit.json create mode 100644 plugins/playgrounds/evals/launch/reports/gate-1/gate-1-summary.json create mode 100644 plugins/playgrounds/evals/launch/reports/gate-1/gate-1-summary.md create mode 100644 plugins/playgrounds/evals/launch/reports/gate-1/manual-control-adjudications.json create mode 100644 plugins/playgrounds/evals/launch/reports/gate-1/provenance.json create mode 100644 plugins/playgrounds/evals/launch/reports/gate-1/replay-visual-review-claude-prototype-extra.json create mode 100644 plugins/playgrounds/evals/launch/reports/gate-1/replay-visual-review-claude-prototype-extra.md create mode 100644 plugins/playgrounds/evals/launch/reports/gate-1/replay-visual-review-codex-baseline-manual.json create mode 100644 plugins/playgrounds/evals/launch/reports/gate-1/replay-visual-review-codex-baseline-manual.md create mode 100644 plugins/playgrounds/evals/launch/reports/gate-1/replay-visual-review-codex-baseline.json create mode 100644 plugins/playgrounds/evals/launch/reports/gate-1/replay-visual-review-codex-baseline.md create mode 100644 plugins/playgrounds/evals/launch/reports/gate-1/replay-visual-review-codex-prototype.json create mode 100644 plugins/playgrounds/evals/launch/reports/gate-1/replay-visual-review-codex-prototype.md create mode 100644 plugins/playgrounds/evals/launch/reports/gate-1/replay-visual-review.json create mode 100644 plugins/playgrounds/evals/launch/reports/gate-1/runs.json create mode 100644 plugins/playgrounds/evals/launch/reports/gate-1/supplemental-control-adjudications.json diff --git a/plugins/playgrounds/evals/launch/README.md b/plugins/playgrounds/evals/launch/README.md index cd817a717..c8ed61214 100644 --- a/plugins/playgrounds/evals/launch/README.md +++ b/plugins/playgrounds/evals/launch/README.md @@ -19,6 +19,12 @@ Preserve invalid setup evidence separately; never mix it with launch results. Record the bb core revision and plugin installation command alongside the results. Do not serve this eval from production bb. +Every setup/QA CLI command must explicitly set `BB_SERVER_URL` to the isolated +origin; bare `bb` inside an agent thread targets production. Before each write, +check `/api/v1/system/config` against the expected isolated data directory and +host ID. The runner requires `--data-dir`, records this identity in preflight, +rechecks it before every HTTP write, and refuses redirects. + Launch the dev bb and this runner through `bb host-care start`. The runner is serial and owns all driver/browser descendants; it does not bypass the resource queue. Release the jobs when finished. `CHROME_PATH` must name an executable @@ -30,6 +36,7 @@ absolute module path if the worktree has not installed dependencies. ```sh node plugins/playgrounds/evals/launch/run.mjs \ --url http://127.0.0.1:48992 --host \ + --data-dir /absolute/worktree/.launch/data \ --plugin-root /absolute/path/to/plugins/playgrounds \ --commit --label baseline \ --out /absolute/worktree/.launch/results/baseline diff --git a/plugins/playgrounds/evals/launch/isolation.mjs b/plugins/playgrounds/evals/launch/isolation.mjs new file mode 100644 index 000000000..e6ebfa5d2 --- /dev/null +++ b/plugins/playgrounds/evals/launch/isolation.mjs @@ -0,0 +1,14 @@ +import { realpathSync } from 'node:fs'; + +// A loopback URL alone can still address production. Read the server's own +// identity before writes, and never follow a redirect to another server. +export async function verifyIsolation(base, dataDir, hostId, fetchImpl = fetch) { + const response = await fetchImpl(new URL('/api/v1/system/config', base), { + redirect: 'error', signal: AbortSignal.timeout(10_000), + }); + if (!response.ok) throw new Error(`Isolated server identity: HTTP ${response.status}`); + const config = await response.json(); + if (typeof config.dataDir !== 'string' || realpathSync(config.dataDir) !== realpathSync(dataDir) || config.primaryHostId !== hostId) + throw new Error('Isolated server identity mismatch: refusing writes'); + return { url: new URL(base).origin, dataDir: config.dataDir, hostId: config.primaryHostId, checkedAt: Date.now() }; +} diff --git a/plugins/playgrounds/evals/launch/isolation.test.ts b/plugins/playgrounds/evals/launch/isolation.test.ts new file mode 100644 index 000000000..a53730be9 --- /dev/null +++ b/plugins/playgrounds/evals/launch/isolation.test.ts @@ -0,0 +1,14 @@ +import { expect, it, vi } from 'vitest'; +import { realpathSync } from 'node:fs'; +// @ts-expect-error eval-only Node ESM +import { verifyIsolation } from './isolation.mjs'; + +it('requires the server-reported data directory and host, with no redirect fallback', async () => { + const dataDir = realpathSync(process.cwd()); + const fetchIdentity = vi.fn(async () => ({ ok: true, json: async () => ({ dataDir, primaryHostId: 'isolated' }) })); + await expect(verifyIsolation('http://127.0.0.1:48992', dataDir, 'isolated', fetchIdentity)).resolves.toMatchObject({ dataDir, hostId: 'isolated' }); + expect(fetchIdentity).toHaveBeenCalledWith(new URL('http://127.0.0.1:48992/api/v1/system/config'), expect.objectContaining({ redirect: 'error' })); + await expect(verifyIsolation('http://127.0.0.1:48992', '/', 'isolated', fetchIdentity)).rejects.toThrow('identity mismatch'); + await expect(verifyIsolation('http://127.0.0.1:48992', dataDir, 'production', fetchIdentity)).rejects.toThrow('identity mismatch'); + await expect(verifyIsolation('http://127.0.0.1:48992', dataDir, 'isolated', async () => ({ ok: false, status: 302 }))).rejects.toThrow('HTTP 302'); +}); diff --git a/plugins/playgrounds/evals/launch/reports/gate-1/claude-full-prototype-timing.json b/plugins/playgrounds/evals/launch/reports/gate-1/claude-full-prototype-timing.json new file mode 100644 index 000000000..48e60c80b --- /dev/null +++ b/plugins/playgrounds/evals/launch/reports/gate-1/claude-full-prototype-timing.json @@ -0,0 +1,3889 @@ +{ + "generatedAt": "2026-10-20T05:08:55.502206+00:00", + "summary": { + "prototype": { + "n": 20, + "medianSeconds": 236.05149999999998, + "p90NearestRankSeconds": 331.297, + "meanSeconds": 228.37385 + }, + "baselineOfficialScores": { + "n": 20, + "medianSeconds": 595.881, + "p90NearestRankSeconds": 900.0, + "meanSeconds": 639.50015 + }, + "baselineMatchedVisible": { + "n": 15, + "medianSeconds": 547.618, + "p90NearestRankSeconds": 691.058, + "meanSeconds": 552.6668666666667 + }, + "prototypeMatchedVisible": { + "n": 15, + "medianSeconds": 237.968, + "p90NearestRankSeconds": 369.464, + "meanSeconds": 248.05866666666668 + }, + "matchedMeanSavingsSeconds": 304.6082, + "matchedMedianSavingsSeconds": 303.59200000000004, + "prototypeCompletePhaseSubset": { + "n": 17, + "prompts": [ + "bicycle-pump", + "cdn", + "database-index", + "dns", + "door-lock", + "git-merge", + "load-balancer", + "refrigerator", + "seat-belt", + "spray-bottle", + "stapler", + "toaster", + "toilet", + "umbrella", + "washing-machine", + "websocket", + "zipper" + ], + "meanPhasesSeconds": { + "send_to_first_tool": 9.015235294117646, + "first_tool_to_first_source_write": 159.98635294117648, + "first_source_write_to_first_browser_check": 10.941529411764705, + "first_browser_check_to_publish_attempt": 64.24970588235294, + "publish_attempt_to_visible": 11.794294117647059 + }, + "meanVisibleSeconds": 255.98711764705882 + }, + "matchedCompletePhasesBaseline": { + "n": 14, + "prompts": [ + "bicycle-pump", + "cdn", + "door-lock", + "git-merge", + "load-balancer", + "refrigerator", + "spray-bottle", + "stapler", + "toaster", + "toilet", + "umbrella", + "washing-machine", + "websocket", + "zipper" + ], + "meanPhasesSeconds": { + "send_to_first_tool": 10.04807142857143, + "first_tool_to_first_source_write": 334.7612857142857, + "first_source_write_to_first_browser_check": 62.085142857142856, + "first_browser_check_to_publish_attempt": 133.34821428571428, + "publish_attempt_to_visible": 12.9975 + }, + "meanVisibleSeconds": 553.2402142857143 + }, + "matchedCompletePhasesPrototype": { + "n": 14, + "prompts": [ + "bicycle-pump", + "cdn", + "door-lock", + "git-merge", + "load-balancer", + "refrigerator", + "spray-bottle", + "stapler", + "toaster", + "toilet", + "umbrella", + "washing-machine", + "websocket", + "zipper" + ], + "meanPhasesSeconds": { + "send_to_first_tool": 9.42142857142857, + "first_tool_to_first_source_write": 162.26835714285716, + "first_source_write_to_first_browser_check": 10.232571428571429, + "first_browser_check_to_publish_attempt": 64.02057142857143, + "publish_attempt_to_visible": 11.354214285714285 + }, + "meanVisibleSeconds": 257.29714285714283 + }, + "prototypeUnattributedFraction": 0.8471762419383831, + "prototypeReadSetupMedianCalls": 9.5, + "prototypeReadSetupMedianUnionSeconds": 4.288, + "prototypeProgressObserved": 19, + "prototypeClarifyingQuestions": 0, + "prototypeQuestionReviewNeeded": 0 + }, + "method": { + "endpoint": "Per-result cardVisible=true and proof.at; assert proof.at-sentAt equals visibleMs. No topic-name classification. All 20 prototype attempts are visible, including seat-belt.", + "phaseDefinitions": { + "send_to_first_tool": "Runner sentAt to first work-row start, includes provisioning/dispatch/provider response.", + "first_tool_to_first_source_write": "First work start to first source write start, includes reads/design/code argument generation and unknown gaps.", + "first_source_write_to_first_browser_check": "First source write start to first actual capture/drive/lines invocation with a target; whole compound-command start when combined.", + "first_browser_check_to_publish_attempt": "First browser invocation start to first publish attempt start, includes revisions, later reads and unknown gaps.", + "publish_attempt_to_visible": "First publish-containing command or bb:playground action=publish start to visible proof; not API-only latency." + }, + "missing": "Null phases are unavailable/not comparable, never zero. Narrow toggle publishes HTML directly via bb:playground; no separate source-write/browser marker. Notification settings writes through $f in reviewed row i9, then publishes within same shell command; no browser marker. Thermos has source write and publication but no browser marker; CLI state/setParams and node --check remain observed checks without browser timing. No native-document card appears among these 20 (all proof.kind=html).", + "refinements": "Exclude publish --help and browser no-target/help invocations from markers. DNS first actual browser check is 122.1s, not 118.4s no-target usage invocation. Baseline matched cases recomputed with same detection; original report preserved. Combined write/check commands can have equal start markers, creating zero envelope duration without proving zero build time.", + "durations": "Observed work-row envelopes unioned and clipped to send\u2192visible. Recover missing row completion from read-only events.item/completed by callId, retain event sequence/time. Category sums may overlap and must not be added. Missing completion intervals remain unattributed.", + "unknown": "Gaps are not CPU, model thinking, provider generation, network or host-attributed. Tool spans may hide subcommands/background descendants. Source/code generation before tool emission falls outside the write envelope.", + "excluded": "External eval preflight fixtures happen before sentAt; external control driving/replays happen after first visible proof or separately and are excluded. Only originating agent thread work before visible is considered; agent self-checks before visible remain included. No reruns, browser/server/provider calls.", + "causality": "Default model/host/plugin conditions differ across time. Matched comparisons are descriptive; selection excludes four infrastructure baseline failures plus one capped baseline delivery. No causal speedup attribution to prompt wording alone.", + "markerDetection": { + "browserRegex": "\\bnode\\s+[^\\s;]*(?:capture|drive|lines)\\.mjs\\s+([^\\n]+)", + "browserExcludedFirstArgumentPrefixes": [ + "2>", + "--help", + "|", + ";", + "&" + ], + "publishCommandRegex": "\\bbb\\s+playgrounds\\s+publish\\s+(?!--help\\b)", + "publishTool": { + "toolName": "bb:playground", + "toolArgs.action": "publish" + }, + "sourceWrite": "file-change workKind or cat > filename.mjs/html/js; notification-settings row da2de47d84-i9 manually recognized as cat > $f where f=notif.html. Model/spec source edits count as first write, consistent with earlier analysis.", + "compoundLimit": "The first invocation start is the start of its containing work row, including any earlier writes/commands. Markers do not establish successful browser rendering." + } + }, + "prototypeRuns": [ + { + "label": "prototype", + "prompt": "bicycle-pump", + "threadId": "thr_abm3wsbdua", + "model": "claude-opus-5-5", + "classification": "visible_card", + "sentAt": 1792467241502, + "visibleAt": 1792467479470, + "visibleSeconds": 237.968, + "scoreSeconds": 237.968, + "proofKind": "html", + "progressObserved": true, + "questions": { + "structured": [], + "textQuestions": [], + "count": 0, + "needsReview": false + }, + "markers": { + "firstTool": { + "id": "thr_abm3wsbdua:tool:dad523d551-i2", + "startMs": 1792467249959, + "endMs": 1792467249959, + "startSeconds": 8.457, + "category": "read_setup" + }, + "firstSourceWrite": { + "id": "thr_abm3wsbdua:command:dad523d551-i17", + "startMs": 1792467399275, + "endMs": 1792467399680, + "startSeconds": 157.773, + "category": "build" + }, + "firstBrowserCheck": { + "id": "thr_abm3wsbdua:command:dad523d551-i18", + "startMs": 1792467404319, + "endMs": 1792467419145, + "startSeconds": 162.817, + "category": "verify" + }, + "firstPublishAttempt": { + "id": "thr_abm3wsbdua:command:dad523d551-i30", + "startMs": 1792467460429, + "endMs": 1792467472392, + "startSeconds": 218.927, + "category": "publish_mixed" + } + }, + "phasesSeconds": { + "send_to_first_tool": 8.457, + "first_tool_to_first_source_write": 149.316, + "first_source_write_to_first_browser_check": 5.044, + "first_browser_check_to_publish_attempt": 56.11, + "publish_attempt_to_visible": 19.041 + }, + "completeComparablePhases": true, + "missingMarkers": [], + "toolCount": 15, + "observedToolUnionSeconds": 40.244, + "unattributedSeconds": 197.724, + "categories": { + "build": { + "calls": 1, + "unionObservedSeconds": 0.405 + }, + "inspect_screenshot": { + "calls": 3, + "unionObservedSeconds": 0.19 + }, + "publish_mixed": { + "calls": 1, + "unionObservedSeconds": 11.963 + }, + "read_setup": { + "calls": 8, + "unionObservedSeconds": 3.135 + }, + "verify": { + "calls": 1, + "unionObservedSeconds": 14.826 + }, + "verify_mixed": { + "calls": 1, + "unionObservedSeconds": 9.725 + } + }, + "toolRowsMissingCompletion": [], + "postVisibleAgentWorkRowsExcluded": 0, + "sources": [ + { + "path": ".launch/results/prototype/claude-code/bicycle-pump/result.json", + "sha256": "bf1e0f41c72510e459940b15e0c828c415fc91ad711e27440e56d73288e08f0b" + }, + { + "path": ".launch/results/prototype/claude-code/bicycle-pump/timeline.json", + "sha256": "cb0e2969db032235e3fdc6299456bf763e28446995408e10ac277b396658759a" + } + ] + }, + { + "label": "prototype", + "prompt": "cdn", + "threadId": "thr_79h5kedc99", + "model": "claude-opus-5-5", + "classification": "visible_card", + "sentAt": 1792467499812, + "visibleAt": 1792467743294, + "visibleSeconds": 243.482, + "scoreSeconds": 243.482, + "proofKind": "html", + "progressObserved": true, + "questions": { + "structured": [], + "textQuestions": [], + "count": 0, + "needsReview": false + }, + "markers": { + "firstTool": { + "id": "thr_79h5kedc99:tool:da42b9c023-i2", + "startMs": 1792467530246, + "endMs": 1792467530246, + "startSeconds": 30.434, + "category": "read_setup" + }, + "firstSourceWrite": { + "id": "thr_79h5kedc99:file-edit:da42b9c023-i24:/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/data/thread-storage/thr_79h5kedc99/figure-TCPZhW/examples/cdn-purge/build.mjs:file-change:0", + "startMs": 1792467695469, + "endMs": 1792467695509, + "startSeconds": 195.657, + "category": "build" + }, + "firstBrowserCheck": { + "id": "thr_79h5kedc99:command:da42b9c023-i27", + "startMs": 1792467700765, + "endMs": 1792467709331, + "startSeconds": 200.953, + "category": "verify" + }, + "firstPublishAttempt": { + "id": "thr_79h5kedc99:command:da42b9c023-i32", + "startMs": 1792467718593, + "endMs": 1792467719305, + "startSeconds": 218.781, + "category": "publish" + } + }, + "phasesSeconds": { + "send_to_first_tool": 30.434, + "first_tool_to_first_source_write": 165.223, + "first_source_write_to_first_browser_check": 5.296, + "first_browser_check_to_publish_attempt": 17.828, + "publish_attempt_to_visible": 24.701 + }, + "completeComparablePhases": true, + "missingMarkers": [], + "toolCount": 20, + "observedToolUnionSeconds": 21.841, + "unattributedSeconds": 221.641, + "categories": { + "build": { + "calls": 2, + "unionObservedSeconds": 0.449 + }, + "inspect_screenshot": { + "calls": 1, + "unionObservedSeconds": 0.029 + }, + "publish": { + "calls": 1, + "unionObservedSeconds": 0.712 + }, + "read_setup": { + "calls": 14, + "unionObservedSeconds": 8.738 + }, + "verify": { + "calls": 2, + "unionObservedSeconds": 11.913 + } + }, + "toolRowsMissingCompletion": [], + "postVisibleAgentWorkRowsExcluded": 0, + "sources": [ + { + "path": ".launch/results/prototype/claude-code/cdn/result.json", + "sha256": "5e6f73e25e371cfa6dc1bf8030c531a8b6936799709a2eb47c440eae49300fa7" + }, + { + "path": ".launch/results/prototype/claude-code/cdn/timeline.json", + "sha256": "23c701162883d01076b277fdeb880a6333691a4bf4e13fdd837e95cb65dc1448" + } + ] + }, + { + "label": "prototype", + "prompt": "database-index", + "threadId": "thr_wr3f293jim", + "model": "claude-opus-5-5", + "classification": "visible_card", + "sentAt": 1792471628121, + "visibleAt": 1792471876247, + "visibleSeconds": 248.126, + "scoreSeconds": 248.126, + "proofKind": "html", + "progressObserved": true, + "questions": { + "structured": [], + "textQuestions": [], + "count": 0, + "needsReview": false + }, + "markers": { + "firstTool": { + "id": "thr_wr3f293jim:tool:da4b38176f-i2", + "startMs": 1792471635250, + "endMs": 1792471635250, + "startSeconds": 7.129, + "category": "read_setup" + }, + "firstSourceWrite": { + "id": "thr_wr3f293jim:file-edit:da4b38176f-i22:/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/data/thread-storage/thr_wr3f293jim/figure-xaycZs/examples/btree-index/build.mjs:file-change:0", + "startMs": 1792471793303, + "endMs": 1792471793340, + "startSeconds": 165.182, + "category": "build" + }, + "firstBrowserCheck": { + "id": "thr_wr3f293jim:command:da4b38176f-i27", + "startMs": 1792471807878, + "endMs": 1792471819852, + "startSeconds": 179.757, + "category": "verify" + }, + "firstPublishAttempt": { + "id": "thr_wr3f293jim:command:da4b38176f-i42", + "startMs": 1792471864856, + "endMs": 1792471865593, + "startSeconds": 236.735, + "category": "publish" + } + }, + "phasesSeconds": { + "send_to_first_tool": 7.129, + "first_tool_to_first_source_write": 158.053, + "first_source_write_to_first_browser_check": 14.575, + "first_browser_check_to_publish_attempt": 56.978, + "publish_attempt_to_visible": 11.391 + }, + "completeComparablePhases": true, + "missingMarkers": [], + "toolCount": 24, + "observedToolUnionSeconds": 39.684, + "unattributedSeconds": 208.442, + "categories": { + "build": { + "calls": 2, + "unionObservedSeconds": 0.388 + }, + "inspect_screenshot": { + "calls": 5, + "unionObservedSeconds": 0.137 + }, + "publish": { + "calls": 1, + "unionObservedSeconds": 0.737 + }, + "read_setup": { + "calls": 13, + "unionObservedSeconds": 8.989 + }, + "verify": { + "calls": 1, + "unionObservedSeconds": 11.974 + }, + "verify_mixed": { + "calls": 2, + "unionObservedSeconds": 17.459 + } + }, + "toolRowsMissingCompletion": [], + "postVisibleAgentWorkRowsExcluded": 0, + "sources": [ + { + "path": ".launch/results/prototype/claude-code/database-index/result.json", + "sha256": "98265fa8cd45c97bac34bae9784dd7baf72290b9595b0ddeeaaf81b4fe36101b" + }, + { + "path": ".launch/results/prototype/claude-code/database-index/timeline.json", + "sha256": "fa52a8b6a13607e8ad95418ede6da3df88397987af680f9881cce5031d789d15" + } + ] + }, + { + "label": "prototype", + "prompt": "dns", + "threadId": "thr_9a7s8n6vfb", + "model": "claude-opus-5-5", + "classification": "visible_card", + "sentAt": 1792471428642, + "visibleAt": 1792471613402, + "visibleSeconds": 184.76, + "scoreSeconds": 184.76, + "proofKind": "html", + "progressObserved": true, + "questions": { + "structured": [], + "textQuestions": [], + "count": 0, + "needsReview": false + }, + "markers": { + "firstTool": { + "id": "thr_9a7s8n6vfb:tool:dabe8e1072-i2", + "startMs": 1792471436064, + "endMs": 1792471436064, + "startSeconds": 7.422, + "category": "read_setup" + }, + "firstSourceWrite": { + "id": "thr_9a7s8n6vfb:command:dabe8e1072-i15", + "startMs": 1792471543400, + "endMs": 1792471544003, + "startSeconds": 114.758, + "category": "build" + }, + "firstBrowserCheck": { + "id": "thr_9a7s8n6vfb:command:dabe8e1072-i17", + "startMs": 1792471550706, + "endMs": 1792471560274, + "startSeconds": 122.064, + "category": "verify" + }, + "firstPublishAttempt": { + "id": "thr_9a7s8n6vfb:command:dabe8e1072-i30", + "startMs": 1792471601419, + "endMs": 1792471602188, + "startSeconds": 172.777, + "category": "publish" + } + }, + "phasesSeconds": { + "send_to_first_tool": 7.422, + "first_tool_to_first_source_write": 107.336, + "first_source_write_to_first_browser_check": 7.306, + "first_browser_check_to_publish_attempt": 50.713, + "publish_attempt_to_visible": 11.983 + }, + "completeComparablePhases": true, + "missingMarkers": [], + "toolCount": 18, + "observedToolUnionSeconds": 28.119, + "unattributedSeconds": 156.641, + "categories": { + "build": { + "calls": 1, + "unionObservedSeconds": 0.603 + }, + "inspect_screenshot": { + "calls": 4, + "unionObservedSeconds": 0.11 + }, + "publish": { + "calls": 1, + "unionObservedSeconds": 0.769 + }, + "read_setup": { + "calls": 10, + "unionObservedSeconds": 4.366 + }, + "verify": { + "calls": 1, + "unionObservedSeconds": 9.568 + }, + "verify_mixed": { + "calls": 1, + "unionObservedSeconds": 12.703 + } + }, + "toolRowsMissingCompletion": [], + "postVisibleAgentWorkRowsExcluded": 0, + "sources": [ + { + "path": ".launch/results/prototype/claude-code/dns/result.json", + "sha256": "fbaaea317ec423b8a7711fb471a8e636f47868546bfb925175e1e341e4f258b0" + }, + { + "path": ".launch/results/prototype/claude-code/dns/timeline.json", + "sha256": "fcf8348fb5f3d987e2dadca5d50860ec33c6b222416afa142a3c1340aa3661b4" + } + ] + }, + { + "label": "prototype", + "prompt": "door-lock", + "threadId": "thr_fpzkw62bp4", + "model": "claude-opus-5-5", + "classification": "visible_card", + "sentAt": 1792469140993, + "visibleAt": 1792469396011, + "visibleSeconds": 255.018, + "scoreSeconds": 255.018, + "proofKind": "html", + "progressObserved": true, + "questions": { + "structured": [], + "textQuestions": [], + "count": 0, + "needsReview": false + }, + "markers": { + "firstTool": { + "id": "thr_fpzkw62bp4:tool:da2ececd3c-i2", + "startMs": 1792469156971, + "endMs": 1792469156971, + "startSeconds": 15.978, + "category": "read_setup" + }, + "firstSourceWrite": { + "id": "thr_fpzkw62bp4:file-edit:da2ececd3c-i27:/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/data/thread-storage/thr_fpzkw62bp4/figure-zJI4CK/examples/pin-lock/build.mjs:file-change:0", + "startMs": 1792469336106, + "endMs": 1792469336141, + "startSeconds": 195.113, + "category": "build" + }, + "firstBrowserCheck": { + "id": "thr_fpzkw62bp4:command:da2ececd3c-i31", + "startMs": 1792469353350, + "endMs": 1792469362630, + "startSeconds": 212.357, + "category": "verify" + }, + "firstPublishAttempt": { + "id": "thr_fpzkw62bp4:command:da2ececd3c-i41", + "startMs": 1792469385227, + "endMs": 1792469385834, + "startSeconds": 244.234, + "category": "publish" + } + }, + "phasesSeconds": { + "send_to_first_tool": 15.978, + "first_tool_to_first_source_write": 179.135, + "first_source_write_to_first_browser_check": 17.244, + "first_browser_check_to_publish_attempt": 31.877, + "publish_attempt_to_visible": 10.784 + }, + "completeComparablePhases": true, + "missingMarkers": [], + "toolCount": 26, + "observedToolUnionSeconds": 23.134, + "unattributedSeconds": 231.88400000000001, + "categories": { + "build": { + "calls": 2, + "unionObservedSeconds": 0.362 + }, + "inspect_screenshot": { + "calls": 4, + "unionObservedSeconds": 0.115 + }, + "publish": { + "calls": 1, + "unionObservedSeconds": 0.607 + }, + "read_setup": { + "calls": 17, + "unionObservedSeconds": 7.15 + }, + "verify": { + "calls": 2, + "unionObservedSeconds": 14.9 + } + }, + "toolRowsMissingCompletion": [], + "postVisibleAgentWorkRowsExcluded": 0, + "sources": [ + { + "path": ".launch/results/prototype/claude-code/door-lock/result.json", + "sha256": "76b572e32ec48e74a6bc176999d70295bb729459633d7bd591ec935db6fbcb79" + }, + { + "path": ".launch/results/prototype/claude-code/door-lock/timeline.json", + "sha256": "013951d8fa008929293916d84b52f96373947321611f348cfa3ee48266744b59" + } + ] + }, + { + "label": "prototype", + "prompt": "git-merge", + "threadId": "thr_4hippn3cyv", + "model": "claude-opus-5-5", + "classification": "visible_card", + "sentAt": 1792471903105, + "visibleAt": 1792472064429, + "visibleSeconds": 161.324, + "scoreSeconds": 161.324, + "proofKind": "html", + "progressObserved": true, + "questions": { + "structured": [], + "textQuestions": [], + "count": 0, + "needsReview": false + }, + "markers": { + "firstTool": { + "id": "thr_4hippn3cyv:tool:da646a5da0-i2", + "startMs": 1792471909342, + "endMs": 1792471909342, + "startSeconds": 6.237, + "category": "read_setup" + }, + "firstSourceWrite": { + "id": "thr_4hippn3cyv:command:da646a5da0-i16", + "startMs": 1792472017190, + "endMs": 1792472022173, + "startSeconds": 114.085, + "category": "verify_mixed" + }, + "firstBrowserCheck": { + "id": "thr_4hippn3cyv:command:da646a5da0-i16", + "startMs": 1792472017190, + "endMs": 1792472022173, + "startSeconds": 114.085, + "category": "verify_mixed" + }, + "firstPublishAttempt": { + "id": "thr_4hippn3cyv:command:da646a5da0-i30", + "startMs": 1792472054752, + "endMs": 1792472055710, + "startSeconds": 151.647, + "category": "publish" + } + }, + "phasesSeconds": { + "send_to_first_tool": 6.237, + "first_tool_to_first_source_write": 107.848, + "first_source_write_to_first_browser_check": 0.0, + "first_browser_check_to_publish_attempt": 37.562, + "publish_attempt_to_visible": 9.677 + }, + "completeComparablePhases": true, + "missingMarkers": [], + "toolCount": 18, + "observedToolUnionSeconds": 21.475, + "unattributedSeconds": 139.84900000000002, + "categories": { + "inspect_screenshot": { + "calls": 3, + "unionObservedSeconds": 3.008 + }, + "publish": { + "calls": 1, + "unionObservedSeconds": 0.958 + }, + "read_setup": { + "calls": 11, + "unionObservedSeconds": 4.45 + }, + "verify_mixed": { + "calls": 3, + "unionObservedSeconds": 15.982 + } + }, + "toolRowsMissingCompletion": [], + "postVisibleAgentWorkRowsExcluded": 0, + "sources": [ + { + "path": ".launch/results/prototype/claude-code/git-merge/result.json", + "sha256": "a3d14e7dad8d19f0ccdb877b206cd429f547caa0ecfb316adce140b9d120b6ce" + }, + { + "path": ".launch/results/prototype/claude-code/git-merge/timeline.json", + "sha256": "0697014f585a6ee8b7000f1096b0d765b42c6ab1ff8bf58b5f99601bbad38ec7" + } + ] + }, + { + "label": "prototype", + "prompt": "load-balancer", + "threadId": "thr_fnfb8zf4ye", + "model": "claude-opus-5-5", + "classification": "visible_card", + "sentAt": 1792472323198, + "visibleAt": 1792472636377, + "visibleSeconds": 313.179, + "scoreSeconds": 313.179, + "proofKind": "html", + "progressObserved": true, + "questions": { + "structured": [], + "textQuestions": [], + "count": 0, + "needsReview": false + }, + "markers": { + "firstTool": { + "id": "thr_fnfb8zf4ye:tool:da86402693-i2", + "startMs": 1792472330383, + "endMs": 1792472330383, + "startSeconds": 7.185, + "category": "read_setup" + }, + "firstSourceWrite": { + "id": "thr_fnfb8zf4ye:command:da86402693-i18", + "startMs": 1792472454398, + "endMs": 1792472454738, + "startSeconds": 131.2, + "category": "build" + }, + "firstBrowserCheck": { + "id": "thr_fnfb8zf4ye:command:da86402693-i23", + "startMs": 1792472489559, + "endMs": 1792472497240, + "startSeconds": 166.361, + "category": "verify" + }, + "firstPublishAttempt": { + "id": "thr_fnfb8zf4ye:command:da86402693-i37", + "startMs": 1792472622736, + "endMs": 1792472623518, + "startSeconds": 299.538, + "category": "publish" + } + }, + "phasesSeconds": { + "send_to_first_tool": 7.185, + "first_tool_to_first_source_write": 124.015, + "first_source_write_to_first_browser_check": 35.161, + "first_browser_check_to_publish_attempt": 133.177, + "publish_attempt_to_visible": 13.641 + }, + "completeComparablePhases": true, + "missingMarkers": [], + "toolCount": 18, + "observedToolUnionSeconds": 108.942, + "unattributedSeconds": 204.23699999999997, + "categories": { + "build": { + "calls": 2, + "unionObservedSeconds": 1.039 + }, + "inspect_screenshot": { + "calls": 2, + "unionObservedSeconds": 0.08 + }, + "publish": { + "calls": 1, + "unionObservedSeconds": 0.782 + }, + "read_setup": { + "calls": 10, + "unionObservedSeconds": 4.808 + }, + "verify": { + "calls": 1, + "unionObservedSeconds": 7.681 + }, + "verify_mixed": { + "calls": 2, + "unionObservedSeconds": 94.552 + } + }, + "toolRowsMissingCompletion": [], + "postVisibleAgentWorkRowsExcluded": 0, + "sources": [ + { + "path": ".launch/results/prototype/claude-code/load-balancer/result.json", + "sha256": "62bb8fdd212236d1dbe8dd00341e63b72b4fdd85d4a087bbab9c5006eb163971" + }, + { + "path": ".launch/results/prototype/claude-code/load-balancer/timeline.json", + "sha256": "a83f3c0d365b71e8dacae3bec7b652e74440cef2615e4ee0e9b92dd6efb3bb78" + } + ] + }, + { + "label": "prototype", + "prompt": "narrow-toggle", + "threadId": "thr_up83rqyv5x", + "model": "claude-opus-5-5", + "classification": "visible_card", + "sentAt": 1792471357865, + "visibleAt": 1792471408297, + "visibleSeconds": 50.432, + "scoreSeconds": 50.432, + "proofKind": "html", + "progressObserved": false, + "questions": { + "structured": [], + "textQuestions": [], + "count": 0, + "needsReview": false + }, + "markers": { + "firstTool": { + "id": "thr_up83rqyv5x:tool:da91bcff5e-i2", + "startMs": 1792471364342, + "endMs": 1792471364342, + "startSeconds": 6.477, + "category": "read_setup" + }, + "firstSourceWrite": null, + "firstBrowserCheck": null, + "firstPublishAttempt": { + "id": "thr_up83rqyv5x:tool:da91bcff5e-i8", + "startMs": 1792471399529, + "endMs": 1792471399554, + "startSeconds": 41.664, + "category": "publish" + } + }, + "phasesSeconds": { + "send_to_first_tool": 6.477, + "first_tool_to_first_source_write": null, + "first_source_write_to_first_browser_check": null, + "first_browser_check_to_publish_attempt": null, + "publish_attempt_to_visible": 8.768 + }, + "completeComparablePhases": false, + "missingMarkers": [ + "firstSourceWrite", + "firstBrowserCheck" + ], + "toolCount": 4, + "observedToolUnionSeconds": 2.245, + "unattributedSeconds": 48.187000000000005, + "categories": { + "other": { + "calls": 1, + "unionObservedSeconds": 0.037 + }, + "publish": { + "calls": 1, + "unionObservedSeconds": 0.025 + }, + "read_setup": { + "calls": 2, + "unionObservedSeconds": 2.183 + } + }, + "toolRowsMissingCompletion": [], + "postVisibleAgentWorkRowsExcluded": 0, + "sources": [ + { + "path": ".launch/results/prototype/claude-code/narrow-toggle/result.json", + "sha256": "0ae3296784cca3b049f5561182504179c6d947a4d26c716deb27cbbb3ff05d50" + }, + { + "path": ".launch/results/prototype/claude-code/narrow-toggle/timeline.json", + "sha256": "e5bdce811742391fba97db292a443fda73f3642614100341f81cecd9eb96d509" + } + ] + }, + { + "label": "prototype", + "prompt": "notification-settings", + "threadId": "thr_vxp4akg6jb", + "model": "claude-opus-5-5", + "classification": "visible_card", + "sentAt": 1792471294037, + "visibleAt": 1792471340581, + "visibleSeconds": 46.544, + "scoreSeconds": 46.544, + "proofKind": "html", + "progressObserved": true, + "questions": { + "structured": [], + "textQuestions": [], + "count": 0, + "needsReview": false + }, + "markers": { + "firstTool": { + "id": "thr_vxp4akg6jb:tool:da2de47d84-i2", + "startMs": 1792471301080, + "endMs": 1792471301080, + "startSeconds": 7.043, + "category": "read_setup" + }, + "firstSourceWrite": { + "id": "thr_vxp4akg6jb:command:da2de47d84-i9", + "startMs": 1792471328720, + "endMs": 1792471329485, + "startSeconds": 34.683, + "category": "publish_mixed" + }, + "firstBrowserCheck": null, + "firstPublishAttempt": { + "id": "thr_vxp4akg6jb:command:da2de47d84-i9", + "startMs": 1792471328720, + "endMs": 1792471329485, + "startSeconds": 34.683, + "category": "publish_mixed" + } + }, + "phasesSeconds": { + "send_to_first_tool": 7.043, + "first_tool_to_first_source_write": 27.64, + "first_source_write_to_first_browser_check": null, + "first_browser_check_to_publish_attempt": null, + "publish_attempt_to_visible": 11.861 + }, + "completeComparablePhases": false, + "missingMarkers": [ + "firstBrowserCheck" + ], + "toolCount": 7, + "observedToolUnionSeconds": 4.452, + "unattributedSeconds": 42.092, + "categories": { + "publish": { + "calls": 1, + "unionObservedSeconds": 0.908 + }, + "publish_mixed": { + "calls": 1, + "unionObservedSeconds": 0.765 + }, + "read_setup": { + "calls": 5, + "unionObservedSeconds": 2.779 + } + }, + "toolRowsMissingCompletion": [], + "postVisibleAgentWorkRowsExcluded": 0, + "sources": [ + { + "path": ".launch/results/prototype/claude-code/notification-settings/result.json", + "sha256": "8ee212f64859dae950bad71de6d490cb29a6e1939f66805de771494a23ba562e" + }, + { + "path": ".launch/results/prototype/claude-code/notification-settings/timeline.json", + "sha256": "ebfbc3d1801115cdf060b02c295c9762e188ec8a83ee928ede9a72b9385243db" + } + ] + }, + { + "label": "prototype", + "prompt": "refrigerator", + "threadId": "thr_dmpuie2xi2", + "model": "claude-opus-5-5", + "classification": "visible_card", + "sentAt": 1792469446107, + "visibleAt": 1792469815571, + "visibleSeconds": 369.464, + "scoreSeconds": 369.464, + "proofKind": "html", + "progressObserved": true, + "questions": { + "structured": [], + "textQuestions": [], + "count": 0, + "needsReview": false + }, + "markers": { + "firstTool": { + "id": "thr_dmpuie2xi2:tool:da7f062afa-i2", + "startMs": 1792469452566, + "endMs": 1792469452566, + "startSeconds": 6.459, + "category": "read_setup" + }, + "firstSourceWrite": { + "id": "thr_dmpuie2xi2:command:da7f062afa-i15", + "startMs": 1792469626381, + "endMs": 1792469634086, + "startSeconds": 180.274, + "category": "verify_mixed" + }, + "firstBrowserCheck": { + "id": "thr_dmpuie2xi2:command:da7f062afa-i15", + "startMs": 1792469626381, + "endMs": 1792469634086, + "startSeconds": 180.274, + "category": "verify_mixed" + }, + "firstPublishAttempt": { + "id": "thr_dmpuie2xi2:command:da7f062afa-i32", + "startMs": 1792469806149, + "endMs": 1792469807207, + "startSeconds": 360.042, + "category": "publish" + } + }, + "phasesSeconds": { + "send_to_first_tool": 6.459, + "first_tool_to_first_source_write": 173.815, + "first_source_write_to_first_browser_check": 0.0, + "first_browser_check_to_publish_attempt": 179.768, + "publish_attempt_to_visible": 9.422 + }, + "completeComparablePhases": true, + "missingMarkers": [], + "toolCount": 17, + "observedToolUnionSeconds": 142.039, + "unattributedSeconds": 227.425, + "categories": { + "build": { + "calls": 1, + "unionObservedSeconds": 0.363 + }, + "inspect_screenshot": { + "calls": 3, + "unionObservedSeconds": 0.126 + }, + "other": { + "calls": 1, + "unionObservedSeconds": 0.018 + }, + "publish": { + "calls": 1, + "unionObservedSeconds": 1.058 + }, + "read_setup": { + "calls": 8, + "unionObservedSeconds": 3.29 + }, + "verify": { + "calls": 2, + "unionObservedSeconds": 129.479 + }, + "verify_mixed": { + "calls": 1, + "unionObservedSeconds": 7.705 + } + }, + "toolRowsMissingCompletion": [], + "postVisibleAgentWorkRowsExcluded": 0, + "sources": [ + { + "path": ".launch/results/prototype/claude-code/refrigerator/result.json", + "sha256": "d1ea2f4c8d61271f82327d2bea1d8fc0967729ed9148cc432bde263aa08abdc3" + }, + { + "path": ".launch/results/prototype/claude-code/refrigerator/timeline.json", + "sha256": "7dea342b31fc472a02e756f8eb408fff8a20c6475aa739431c1dd467d1882cbc" + } + ] + }, + { + "label": "prototype", + "prompt": "seat-belt", + "threadId": "thr_wvethpw6uz", + "model": "claude-opus-5-5", + "classification": "visible_card", + "sentAt": 1792470508349, + "visibleAt": 1792470825084, + "visibleSeconds": 316.735, + "scoreSeconds": 316.735, + "proofKind": "html", + "progressObserved": true, + "questions": { + "structured": [], + "textQuestions": [], + "count": 0, + "needsReview": false + }, + "markers": { + "firstTool": { + "id": "thr_wvethpw6uz:tool:da465a2788-i2", + "startMs": 1792470515157, + "endMs": 1792470515157, + "startSeconds": 6.808, + "category": "read_setup" + }, + "firstSourceWrite": { + "id": "thr_wvethpw6uz:command:da465a2788-i17", + "startMs": 1792470697779, + "endMs": 1792470698266, + "startSeconds": 189.43, + "category": "build" + }, + "firstBrowserCheck": { + "id": "thr_wvethpw6uz:command:da465a2788-i22", + "startMs": 1792470718648, + "endMs": 1792470722238, + "startSeconds": 210.299, + "category": "verify_mixed" + }, + "firstPublishAttempt": { + "id": "thr_wvethpw6uz:command:da465a2788-i48", + "startMs": 1792470806914, + "endMs": 1792470807773, + "startSeconds": 298.565, + "category": "publish" + } + }, + "phasesSeconds": { + "send_to_first_tool": 6.808, + "first_tool_to_first_source_write": 182.622, + "first_source_write_to_first_browser_check": 20.869, + "first_browser_check_to_publish_attempt": 88.266, + "publish_attempt_to_visible": 18.17 + }, + "completeComparablePhases": true, + "missingMarkers": [], + "toolCount": 26, + "observedToolUnionSeconds": 49.611, + "unattributedSeconds": 267.124, + "categories": { + "build": { + "calls": 1, + "unionObservedSeconds": 0.487 + }, + "inspect_screenshot": { + "calls": 4, + "unionObservedSeconds": 0.135 + }, + "other": { + "calls": 1, + "unionObservedSeconds": 0.879 + }, + "publish": { + "calls": 2, + "unionObservedSeconds": 1.704 + }, + "read_setup": { + "calls": 10, + "unionObservedSeconds": 3.414 + }, + "verify": { + "calls": 2, + "unionObservedSeconds": 8.524 + }, + "verify_mixed": { + "calls": 5, + "unionObservedSeconds": 24.546 + }, + "web_research": { + "calls": 1, + "unionObservedSeconds": 10.246 + } + }, + "toolRowsMissingCompletion": [], + "postVisibleAgentWorkRowsExcluded": 0, + "sources": [ + { + "path": ".launch/results/prototype/claude-code/seat-belt/result.json", + "sha256": "966cf98dc575658b6d892d8f977964d98ff71293e670d0996d68be4a9d09db00" + }, + { + "path": ".launch/results/prototype/claude-code/seat-belt/timeline.json", + "sha256": "d11ffa9692f798de4402e7ef28577a7a227345f6958d0e751063e2933bc2f035" + } + ] + }, + { + "label": "prototype", + "prompt": "spray-bottle", + "threadId": "thr_mhzkra2kge", + "model": "claude-opus-5-5", + "classification": "visible_card", + "sentAt": 1792470233921, + "visibleAt": 1792470477947, + "visibleSeconds": 244.026, + "scoreSeconds": 244.026, + "proofKind": "html", + "progressObserved": true, + "questions": { + "structured": [], + "textQuestions": [], + "count": 0, + "needsReview": false + }, + "markers": { + "firstTool": { + "id": "thr_mhzkra2kge:tool:dab37f8fab-i2", + "startMs": 1792470240867, + "endMs": 1792470240867, + "startSeconds": 6.946, + "category": "read_setup" + }, + "firstSourceWrite": { + "id": "thr_mhzkra2kge:file-edit:dab37f8fab-i16:/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/data/thread-storage/thr_mhzkra2kge/figure-FcfvPZ/examples/spray-bottle/build.mjs:file-change:0", + "startMs": 1792470404943, + "endMs": 1792470404985, + "startSeconds": 171.022, + "category": "build" + }, + "firstBrowserCheck": { + "id": "thr_mhzkra2kge:command:dab37f8fab-i19", + "startMs": 1792470418063, + "endMs": 1792470426203, + "startSeconds": 184.142, + "category": "verify" + }, + "firstPublishAttempt": { + "id": "thr_mhzkra2kge:command:dab37f8fab-i32", + "startMs": 1792470470806, + "endMs": 1792470471780, + "startSeconds": 236.885, + "category": "publish" + } + }, + "phasesSeconds": { + "send_to_first_tool": 6.946, + "first_tool_to_first_source_write": 164.076, + "first_source_write_to_first_browser_check": 13.12, + "first_browser_check_to_publish_attempt": 52.743, + "publish_attempt_to_visible": 7.141 + }, + "completeComparablePhases": true, + "missingMarkers": [], + "toolCount": 18, + "observedToolUnionSeconds": 24.319, + "unattributedSeconds": 219.70700000000002, + "categories": { + "build": { + "calls": 2, + "unionObservedSeconds": 0.882 + }, + "inspect_screenshot": { + "calls": 5, + "unionObservedSeconds": 0.133 + }, + "publish": { + "calls": 1, + "unionObservedSeconds": 0.974 + }, + "read_setup": { + "calls": 8, + "unionObservedSeconds": 5.312 + }, + "verify": { + "calls": 1, + "unionObservedSeconds": 8.14 + }, + "verify_mixed": { + "calls": 1, + "unionObservedSeconds": 8.878 + } + }, + "toolRowsMissingCompletion": [], + "postVisibleAgentWorkRowsExcluded": 0, + "sources": [ + { + "path": ".launch/results/prototype/claude-code/spray-bottle/result.json", + "sha256": "d172558bbf06255037c4f85e5afff56b6bcc3bcd7f7d4b5de2d7a836895b5e80" + }, + { + "path": ".launch/results/prototype/claude-code/spray-bottle/timeline.json", + "sha256": "a8cbee70d5506677ef220b9c7db981a0b21859daa52eb2128097d745c02ff142" + } + ] + }, + { + "label": "prototype", + "prompt": "stapler", + "threadId": "thr_tgxyrgj5vv", + "model": "claude-opus-5-5", + "classification": "visible_card", + "sentAt": 1792469833935, + "visibleAt": 1792470214829, + "visibleSeconds": 380.894, + "scoreSeconds": 380.894, + "proofKind": "html", + "progressObserved": true, + "questions": { + "structured": [], + "textQuestions": [], + "count": 0, + "needsReview": false + }, + "markers": { + "firstTool": { + "id": "thr_tgxyrgj5vv:tool:dabab98e5a-i2", + "startMs": 1792469841156, + "endMs": 1792469841156, + "startSeconds": 7.221, + "category": "read_setup" + }, + "firstSourceWrite": { + "id": "thr_tgxyrgj5vv:command:dabab98e5a-i17", + "startMs": 1792470102525, + "endMs": 1792470102928, + "startSeconds": 268.59, + "category": "build" + }, + "firstBrowserCheck": { + "id": "thr_tgxyrgj5vv:command:dabab98e5a-i20", + "startMs": 1792470112461, + "endMs": 1792470119154, + "startSeconds": 278.526, + "category": "verify" + }, + "firstPublishAttempt": { + "id": "thr_tgxyrgj5vv:command:dabab98e5a-i36", + "startMs": 1792470203871, + "endMs": 1792470204637, + "startSeconds": 369.936, + "category": "publish" + } + }, + "phasesSeconds": { + "send_to_first_tool": 7.221, + "first_tool_to_first_source_write": 261.369, + "first_source_write_to_first_browser_check": 9.936, + "first_browser_check_to_publish_attempt": 91.41, + "publish_attempt_to_visible": 10.958 + }, + "completeComparablePhases": true, + "missingMarkers": [], + "toolCount": 20, + "observedToolUnionSeconds": 22.433, + "unattributedSeconds": 358.461, + "categories": { + "build": { + "calls": 2, + "unionObservedSeconds": 0.804 + }, + "inspect_screenshot": { + "calls": 5, + "unionObservedSeconds": 0.14 + }, + "publish": { + "calls": 1, + "unionObservedSeconds": 0.766 + }, + "read_setup": { + "calls": 9, + "unionObservedSeconds": 4.049 + }, + "verify": { + "calls": 1, + "unionObservedSeconds": 6.693 + }, + "verify_mixed": { + "calls": 2, + "unionObservedSeconds": 9.981 + } + }, + "toolRowsMissingCompletion": [], + "postVisibleAgentWorkRowsExcluded": 0, + "sources": [ + { + "path": ".launch/results/prototype/claude-code/stapler/result.json", + "sha256": "b80750b848ef2e8f5f9ec7f9391890fca6690e2ff1e21ec272f79523e027177f" + }, + { + "path": ".launch/results/prototype/claude-code/stapler/timeline.json", + "sha256": "7a62d5d0345b1471fd58a09e70e83a5de4af91e689ba44a847ad0a0d744baea9" + } + ] + }, + { + "label": "prototype", + "prompt": "thermos", + "threadId": "thr_piza4hxknp", + "model": "claude-opus-5-5", + "classification": "visible_card", + "sentAt": 1792468999238, + "visibleAt": 1792469117958, + "visibleSeconds": 118.72, + "scoreSeconds": 118.72, + "proofKind": "html", + "progressObserved": true, + "questions": { + "structured": [], + "textQuestions": [], + "count": 0, + "needsReview": false + }, + "markers": { + "firstTool": { + "id": "thr_piza4hxknp:tool:da29be7f58-i2", + "startMs": 1792469007923, + "endMs": 1792469007923, + "startSeconds": 8.685, + "category": "read_setup" + }, + "firstSourceWrite": { + "id": "thr_piza4hxknp:command:da29be7f58-i9", + "startMs": 1792469091524, + "endMs": 1792469092314, + "startSeconds": 92.286, + "category": "publish_mixed" + }, + "firstBrowserCheck": null, + "firstPublishAttempt": { + "id": "thr_piza4hxknp:command:da29be7f58-i11", + "startMs": 1792469097687, + "endMs": 1792469098263, + "startSeconds": 98.449, + "category": "publish" + } + }, + "phasesSeconds": { + "send_to_first_tool": 8.685, + "first_tool_to_first_source_write": 83.601, + "first_source_write_to_first_browser_check": null, + "first_browser_check_to_publish_attempt": null, + "publish_attempt_to_visible": 20.271 + }, + "completeComparablePhases": false, + "missingMarkers": [ + "firstBrowserCheck" + ], + "toolCount": 8, + "observedToolUnionSeconds": 4.44, + "unattributedSeconds": 114.28, + "categories": { + "publish": { + "calls": 1, + "unionObservedSeconds": 0.576 + }, + "read_setup": { + "calls": 6, + "unionObservedSeconds": 3.074 + }, + "build": { + "calls": 1, + "unionObservedSeconds": 0.79 + } + }, + "toolRowsMissingCompletion": [], + "postVisibleAgentWorkRowsExcluded": 0, + "sources": [ + { + "path": ".launch/results/prototype/claude-code/thermos/result.json", + "sha256": "f22fda3816d0192085ed9379e8e0f3be62cb73c13ea4dbaa79e59b44480440a0" + }, + { + "path": ".launch/results/prototype/claude-code/thermos/timeline.json", + "sha256": "1c9d602bb1f0dbccfe5671b50029fd8a21dac895e7c2b6fe6dc79c76c0551fad" + } + ] + }, + { + "label": "prototype", + "prompt": "toaster", + "threadId": "thr_xd3n2g7bfv", + "model": "claude-opus-5-5", + "classification": "visible_card", + "sentAt": 1792470846578, + "visibleAt": 1792471070711, + "visibleSeconds": 224.133, + "scoreSeconds": 224.133, + "proofKind": "html", + "progressObserved": true, + "questions": { + "structured": [], + "textQuestions": [], + "count": 0, + "needsReview": false + }, + "markers": { + "firstTool": { + "id": "thr_xd3n2g7bfv:tool:dafb306e96-i2", + "startMs": 1792470854770, + "endMs": 1792470854770, + "startSeconds": 8.192, + "category": "read_setup" + }, + "firstSourceWrite": { + "id": "thr_xd3n2g7bfv:command:dafb306e96-i16", + "startMs": 1792470985001, + "endMs": 1792470985407, + "startSeconds": 138.423, + "category": "build" + }, + "firstBrowserCheck": { + "id": "thr_xd3n2g7bfv:command:dafb306e96-i19", + "startMs": 1792470996185, + "endMs": 1792471004855, + "startSeconds": 149.607, + "category": "verify_mixed" + }, + "firstPublishAttempt": { + "id": "thr_xd3n2g7bfv:command:dafb306e96-i35", + "startMs": 1792471064325, + "endMs": 1792471065005, + "startSeconds": 217.747, + "category": "publish" + } + }, + "phasesSeconds": { + "send_to_first_tool": 8.192, + "first_tool_to_first_source_write": 130.231, + "first_source_write_to_first_browser_check": 11.184, + "first_browser_check_to_publish_attempt": 68.14, + "publish_attempt_to_visible": 6.386 + }, + "completeComparablePhases": true, + "missingMarkers": [], + "toolCount": 18, + "observedToolUnionSeconds": 31.618, + "unattributedSeconds": 192.51500000000001, + "categories": { + "build": { + "calls": 2, + "unionObservedSeconds": 0.776 + }, + "inspect_screenshot": { + "calls": 5, + "unionObservedSeconds": 0.164 + }, + "publish": { + "calls": 1, + "unionObservedSeconds": 0.68 + }, + "read_setup": { + "calls": 7, + "unionObservedSeconds": 2.789 + }, + "verify_mixed": { + "calls": 3, + "unionObservedSeconds": 27.209 + } + }, + "toolRowsMissingCompletion": [], + "postVisibleAgentWorkRowsExcluded": 0, + "sources": [ + { + "path": ".launch/results/prototype/claude-code/toaster/result.json", + "sha256": "60d78421d502a33d6e4c60ac792a2dce029bb5be17160d75aa1d3dc420158512" + }, + { + "path": ".launch/results/prototype/claude-code/toaster/timeline.json", + "sha256": "34a07aa8d36ea7b47b2de181984b671d71fff4e5f11d2e9b410a699b936384dc" + } + ] + }, + { + "label": "prototype", + "prompt": "toilet", + "threadId": "thr_8n2fiqn2je", + "model": "claude-opus-5-5", + "classification": "visible_card", + "sentAt": 1792468636488, + "visibleAt": 1792468967785, + "visibleSeconds": 331.297, + "scoreSeconds": 331.297, + "proofKind": "html", + "progressObserved": true, + "questions": { + "structured": [], + "textQuestions": [], + "count": 0, + "needsReview": false + }, + "markers": { + "firstTool": { + "id": "thr_8n2fiqn2je:tool:da01e87f48-i2", + "startMs": 1792468642403, + "endMs": 1792468642403, + "startSeconds": 5.915, + "category": "read_setup" + }, + "firstSourceWrite": { + "id": "thr_8n2fiqn2je:command:da01e87f48-i17", + "startMs": 1792468864278, + "endMs": 1792468864738, + "startSeconds": 227.79, + "category": "build" + }, + "firstBrowserCheck": { + "id": "thr_8n2fiqn2je:command:da01e87f48-i19", + "startMs": 1792468870252, + "endMs": 1792468893907, + "startSeconds": 233.764, + "category": "verify" + }, + "firstPublishAttempt": { + "id": "thr_8n2fiqn2je:command:da01e87f48-i33", + "startMs": 1792468958308, + "endMs": 1792468958987, + "startSeconds": 321.82, + "category": "publish" + } + }, + "phasesSeconds": { + "send_to_first_tool": 5.915, + "first_tool_to_first_source_write": 221.875, + "first_source_write_to_first_browser_check": 5.974, + "first_browser_check_to_publish_attempt": 88.056, + "publish_attempt_to_visible": 9.477 + }, + "completeComparablePhases": true, + "missingMarkers": [], + "toolCount": 17, + "observedToolUnionSeconds": 54.723, + "unattributedSeconds": 276.574, + "categories": { + "build": { + "calls": 1, + "unionObservedSeconds": 0.46 + }, + "inspect_screenshot": { + "calls": 4, + "unionObservedSeconds": 0.047 + }, + "publish": { + "calls": 1, + "unionObservedSeconds": 0.679 + }, + "read_setup": { + "calls": 8, + "unionObservedSeconds": 3.135 + }, + "verify": { + "calls": 1, + "unionObservedSeconds": 23.655 + }, + "verify_mixed": { + "calls": 2, + "unionObservedSeconds": 26.747 + } + }, + "toolRowsMissingCompletion": [], + "postVisibleAgentWorkRowsExcluded": 0, + "sources": [ + { + "path": ".launch/results/prototype/claude-code/toilet/result.json", + "sha256": "040aa963cd76995a2f192704b8bdfc65da6cc4e8b1037839435eaef2342a5744" + }, + { + "path": ".launch/results/prototype/claude-code/toilet/timeline.json", + "sha256": "8d82916b33140fbc1cfa8498f5e7f5f576ab1e05bca9f904157687b334a30553" + } + ] + }, + { + "label": "prototype", + "prompt": "umbrella", + "threadId": "thr_bjfrwcnsve", + "model": "claude-opus-5-5", + "classification": "visible_card", + "sentAt": 1792471093070, + "visibleAt": 1792471271821, + "visibleSeconds": 178.751, + "scoreSeconds": 178.751, + "proofKind": "html", + "progressObserved": true, + "questions": { + "structured": [], + "textQuestions": [], + "count": 0, + "needsReview": false + }, + "markers": { + "firstTool": { + "id": "thr_bjfrwcnsve:tool:da4db76273-i2", + "startMs": 1792471099936, + "endMs": 1792471099936, + "startSeconds": 6.866, + "category": "read_setup" + }, + "firstSourceWrite": { + "id": "thr_bjfrwcnsve:command:da4db76273-i16", + "startMs": 1792471216870, + "endMs": 1792471217276, + "startSeconds": 123.8, + "category": "build" + }, + "firstBrowserCheck": { + "id": "thr_bjfrwcnsve:command:da4db76273-i19", + "startMs": 1792471228720, + "endMs": 1792471238321, + "startSeconds": 135.65, + "category": "verify" + }, + "firstPublishAttempt": { + "id": "thr_bjfrwcnsve:command:da4db76273-i29", + "startMs": 1792471260544, + "endMs": 1792471261254, + "startSeconds": 167.474, + "category": "publish" + } + }, + "phasesSeconds": { + "send_to_first_tool": 6.866, + "first_tool_to_first_source_write": 116.934, + "first_source_write_to_first_browser_check": 11.85, + "first_browser_check_to_publish_attempt": 31.824, + "publish_attempt_to_visible": 11.277 + }, + "completeComparablePhases": true, + "missingMarkers": [], + "toolCount": 18, + "observedToolUnionSeconds": 19.287, + "unattributedSeconds": 159.464, + "categories": { + "build": { + "calls": 2, + "unionObservedSeconds": 0.84 + }, + "inspect_screenshot": { + "calls": 4, + "unionObservedSeconds": 0.06 + }, + "publish": { + "calls": 1, + "unionObservedSeconds": 0.71 + }, + "read_setup": { + "calls": 9, + "unionObservedSeconds": 4.815 + }, + "verify": { + "calls": 1, + "unionObservedSeconds": 9.601 + }, + "verify_mixed": { + "calls": 1, + "unionObservedSeconds": 3.261 + } + }, + "toolRowsMissingCompletion": [], + "postVisibleAgentWorkRowsExcluded": 0, + "sources": [ + { + "path": ".launch/results/prototype/claude-code/umbrella/result.json", + "sha256": "ad130c968a97efde5a5995b576fb9d675c9617bee80992c9bd72c0bcfe6f57e1" + }, + { + "path": ".launch/results/prototype/claude-code/umbrella/timeline.json", + "sha256": "5f4110ca03d0b7a23b8f1537fc8d986757da0710d4698a5d6bb6efa73ec06b57" + } + ] + }, + { + "label": "prototype", + "prompt": "washing-machine", + "threadId": "thr_icvnstch4p", + "model": "claude-opus-5-5", + "classification": "visible_card", + "sentAt": 1792468125920, + "visibleAt": 1792468344912, + "visibleSeconds": 218.992, + "scoreSeconds": 218.992, + "proofKind": "html", + "progressObserved": true, + "questions": { + "structured": [], + "textQuestions": [], + "count": 0, + "needsReview": false + }, + "markers": { + "firstTool": { + "id": "thr_icvnstch4p:tool:da741b4352-i2", + "startMs": 1792468132876, + "endMs": 1792468132876, + "startSeconds": 6.956, + "category": "read_setup" + }, + "firstSourceWrite": { + "id": "thr_icvnstch4p:command:da741b4352-i17", + "startMs": 1792468284287, + "endMs": 1792468284711, + "startSeconds": 158.367, + "category": "build" + }, + "firstBrowserCheck": { + "id": "thr_icvnstch4p:command:da741b4352-i21", + "startMs": 1792468301725, + "endMs": 1792468311561, + "startSeconds": 175.805, + "category": "verify" + }, + "firstPublishAttempt": { + "id": "thr_icvnstch4p:command:da741b4352-i33", + "startMs": 1792468334296, + "endMs": 1792468335068, + "startSeconds": 208.376, + "category": "publish" + } + }, + "phasesSeconds": { + "send_to_first_tool": 6.956, + "first_tool_to_first_source_write": 151.411, + "first_source_write_to_first_browser_check": 17.438, + "first_browser_check_to_publish_attempt": 32.571, + "publish_attempt_to_visible": 10.616 + }, + "completeComparablePhases": true, + "missingMarkers": [], + "toolCount": 19, + "observedToolUnionSeconds": 19.35, + "unattributedSeconds": 199.642, + "categories": { + "build": { + "calls": 2, + "unionObservedSeconds": 0.909 + }, + "inspect_screenshot": { + "calls": 4, + "unionObservedSeconds": 0.128 + }, + "publish": { + "calls": 1, + "unionObservedSeconds": 0.772 + }, + "read_setup": { + "calls": 10, + "unionObservedSeconds": 4.21 + }, + "verify": { + "calls": 1, + "unionObservedSeconds": 9.836 + }, + "verify_mixed": { + "calls": 1, + "unionObservedSeconds": 3.495 + } + }, + "toolRowsMissingCompletion": [], + "postVisibleAgentWorkRowsExcluded": 0, + "sources": [ + { + "path": ".launch/results/prototype/claude-code/washing-machine/result.json", + "sha256": "be2f8d463136b284dc1b748981c39bf93c73eb4aaaf3a2ccb8fa47aaf7cf6c80" + }, + { + "path": ".launch/results/prototype/claude-code/washing-machine/timeline.json", + "sha256": "2125abc3a3486ce7b93000395fa427150d25d2fced20de2d86308673d65e2f54" + } + ] + }, + { + "label": "prototype", + "prompt": "websocket", + "threadId": "thr_gnuingcpxx", + "model": "claude-opus-5-5", + "classification": "visible_card", + "sentAt": 1792472087394, + "visibleAt": 1792472296891, + "visibleSeconds": 209.497, + "scoreSeconds": 209.497, + "proofKind": "html", + "progressObserved": true, + "questions": { + "structured": [], + "textQuestions": [], + "count": 0, + "needsReview": false + }, + "markers": { + "firstTool": { + "id": "thr_gnuingcpxx:tool:da233af8b4-i2", + "startMs": 1792472094189, + "endMs": 1792472094189, + "startSeconds": 6.795, + "category": "read_setup" + }, + "firstSourceWrite": { + "id": "thr_gnuingcpxx:file-edit:da233af8b4-i20:/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/data/thread-storage/thr_gnuingcpxx/figure-5ViVD9/examples/websocket-chat/build.mjs:file-change:0", + "startMs": 1792472235157, + "endMs": 1792472235199, + "startSeconds": 147.763, + "category": "build" + }, + "firstBrowserCheck": { + "id": "thr_gnuingcpxx:command:da233af8b4-i23", + "startMs": 1792472246166, + "endMs": 1792472259389, + "startSeconds": 158.772, + "category": "verify_mixed" + }, + "firstPublishAttempt": { + "id": "thr_gnuingcpxx:command:da233af8b4-i36", + "startMs": 1792472289012, + "endMs": 1792472289765, + "startSeconds": 201.618, + "category": "publish" + } + }, + "phasesSeconds": { + "send_to_first_tool": 6.795, + "first_tool_to_first_source_write": 140.968, + "first_source_write_to_first_browser_check": 11.009, + "first_browser_check_to_publish_attempt": 42.846, + "publish_attempt_to_visible": 7.879 + }, + "completeComparablePhases": true, + "missingMarkers": [], + "toolCount": 19, + "observedToolUnionSeconds": 25.89, + "unattributedSeconds": 183.60700000000003, + "categories": { + "build": { + "calls": 2, + "unionObservedSeconds": 0.637 + }, + "inspect_screenshot": { + "calls": 3, + "unionObservedSeconds": 0.059 + }, + "publish": { + "calls": 1, + "unionObservedSeconds": 0.753 + }, + "read_setup": { + "calls": 11, + "unionObservedSeconds": 6.07 + }, + "verify_mixed": { + "calls": 2, + "unionObservedSeconds": 18.371 + } + }, + "toolRowsMissingCompletion": [], + "postVisibleAgentWorkRowsExcluded": 0, + "sources": [ + { + "path": ".launch/results/prototype/claude-code/websocket/result.json", + "sha256": "a1710127b7fdf740090195c6c82f0013c0b6a8a9e830f7e96b5e735605eb1951" + }, + { + "path": ".launch/results/prototype/claude-code/websocket/timeline.json", + "sha256": "3d03f5e63332a3843163746da30922a737b99efbd6b926f9460b55c96e8c029b" + } + ] + }, + { + "label": "prototype", + "prompt": "zipper", + "threadId": "thr_jreubavbmd", + "model": "claude-opus-5-5", + "classification": "visible_card", + "sentAt": 1792468379033, + "visibleAt": 1792468613168, + "visibleSeconds": 234.135, + "scoreSeconds": 234.135, + "proofKind": "html", + "progressObserved": true, + "questions": { + "structured": [], + "textQuestions": [], + "count": 0, + "needsReview": false + }, + "markers": { + "firstTool": { + "id": "thr_jreubavbmd:tool:da0512974d-i2", + "startMs": 1792468387292, + "endMs": 1792468387292, + "startSeconds": 8.259, + "category": "read_setup" + }, + "firstSourceWrite": { + "id": "thr_jreubavbmd:command:da0512974d-i20", + "startMs": 1792468572833, + "endMs": 1792468575261, + "startSeconds": 193.8, + "category": "verify_mixed" + }, + "firstBrowserCheck": { + "id": "thr_jreubavbmd:command:da0512974d-i20", + "startMs": 1792468572833, + "endMs": 1792468575261, + "startSeconds": 193.8, + "category": "verify_mixed" + }, + "firstPublishAttempt": { + "id": "thr_jreubavbmd:command:da0512974d-i30", + "startMs": 1792468605209, + "endMs": 1792468605979, + "startSeconds": 226.176, + "category": "publish" + } + }, + "phasesSeconds": { + "send_to_first_tool": 8.259, + "first_tool_to_first_source_write": 185.541, + "first_source_write_to_first_browser_check": 0.0, + "first_browser_check_to_publish_attempt": 32.376, + "publish_attempt_to_visible": 7.959 + }, + "completeComparablePhases": true, + "missingMarkers": [], + "toolCount": 16, + "observedToolUnionSeconds": 14.173, + "unattributedSeconds": 219.962, + "categories": { + "inspect_screenshot": { + "calls": 3, + "unionObservedSeconds": 0.103 + }, + "publish": { + "calls": 1, + "unionObservedSeconds": 0.77 + }, + "read_setup": { + "calls": 10, + "unionObservedSeconds": 4.918 + }, + "verify_mixed": { + "calls": 2, + "unionObservedSeconds": 8.382 + } + }, + "toolRowsMissingCompletion": [], + "postVisibleAgentWorkRowsExcluded": 0, + "sources": [ + { + "path": ".launch/results/prototype/claude-code/zipper/result.json", + "sha256": "33923301876a95c8cac72f89983f65d9a0307b745878c20a15d5fd0fd890ae75" + }, + { + "path": ".launch/results/prototype/claude-code/zipper/timeline.json", + "sha256": "ddd62aa0934628821dc2d4ceec525dc125d825e2c49061ba1c46e662fcd101d2" + } + ] + } + ], + "matchedBaselineRuns": [ + { + "label": "baseline", + "prompt": "bicycle-pump", + "threadId": "thr_56zs5u74me", + "model": "claude-opus-5-5", + "classification": "visible_card", + "sentAt": 1792450604852, + "visibleAt": 1792451126399, + "visibleSeconds": 521.547, + "scoreSeconds": 521.547, + "proofKind": "html", + "progressObserved": true, + "questions": { + "structured": [], + "textQuestions": [], + "count": 0, + "needsReview": false + }, + "markers": { + "firstTool": { + "id": "thr_56zs5u74me:tool:da042aafe5-i2", + "startMs": 1792450610987, + "endMs": 1792450610987, + "startSeconds": 6.135, + "category": "read_setup" + }, + "firstSourceWrite": { + "id": "thr_56zs5u74me:command:da042aafe5-i30", + "startMs": 1792450747358, + "endMs": 1792450747986, + "startSeconds": 142.506, + "category": "build" + }, + "firstBrowserCheck": { + "id": "thr_56zs5u74me:command:da042aafe5-i39", + "startMs": 1792450998959, + "endMs": 1792451003672, + "startSeconds": 394.107, + "category": "verify" + }, + "firstPublishAttempt": { + "id": "thr_56zs5u74me:command:da042aafe5-i66", + "startMs": 1792451110539, + "endMs": 1792451111433, + "startSeconds": 505.687, + "category": "publish" + } + }, + "phasesSeconds": { + "send_to_first_tool": 6.135, + "first_tool_to_first_source_write": 136.371, + "first_source_write_to_first_browser_check": 251.601, + "first_browser_check_to_publish_attempt": 111.58, + "publish_attempt_to_visible": 15.86 + }, + "completeComparablePhases": true, + "missingMarkers": [], + "toolCount": 33, + "observedToolUnionSeconds": 54.315, + "unattributedSeconds": 467.232, + "categories": { + "build": { + "calls": 3, + "unionObservedSeconds": 1.726 + }, + "inspect_screenshot": { + "calls": 4, + "unionObservedSeconds": 0.269 + }, + "publish": { + "calls": 1, + "unionObservedSeconds": 0.894 + }, + "read_setup": { + "calls": 19, + "unionObservedSeconds": 15.362 + }, + "verify": { + "calls": 3, + "unionObservedSeconds": 18.234 + }, + "verify_mixed": { + "calls": 3, + "unionObservedSeconds": 17.83 + } + }, + "toolRowsMissingCompletion": [], + "postVisibleAgentWorkRowsExcluded": 0, + "sources": [ + { + "path": ".launch/results/baseline/claude-code/bicycle-pump/result.json", + "sha256": "8dde69ce92b51c5f0891112587e55939c26b86ea6685035f6b4074ac7487ba2e" + }, + { + "path": ".launch/results/baseline/claude-code/bicycle-pump/timeline.json", + "sha256": "98fc4e5f02579466b2478165fee371c055f1adbaaa7d4ee1bcef77671d7faec0" + } + ] + }, + { + "label": "baseline", + "prompt": "cdn", + "threadId": "thr_txgewajj25", + "model": "claude-opus-5-5", + "classification": "visible_card", + "sentAt": 1792451135190, + "visibleAt": 1792451582225, + "visibleSeconds": 447.035, + "scoreSeconds": 447.035, + "proofKind": "html", + "progressObserved": true, + "questions": { + "structured": [], + "textQuestions": [], + "count": 0, + "needsReview": false + }, + "markers": { + "firstTool": { + "id": "thr_txgewajj25:tool:da610a9727-i2", + "startMs": 1792451145409, + "endMs": 1792451145427, + "startSeconds": 10.219, + "category": "read_setup" + }, + "firstSourceWrite": { + "id": "thr_txgewajj25:file-edit:da610a9727-i44:/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/data/plugins/environment-personal-workspace/host-data/workspaces/thr_txgewajj25/.how-it-works/examples/cdn-purge/build.mjs:file-change:0", + "startMs": 1792451491027, + "endMs": 1792451491117, + "startSeconds": 355.837, + "category": "build" + }, + "firstBrowserCheck": { + "id": "thr_txgewajj25:command:da610a9727-i47", + "startMs": 1792451502014, + "endMs": 1792451513733, + "startSeconds": 366.824, + "category": "verify" + }, + "firstPublishAttempt": { + "id": "thr_txgewajj25:command:da610a9727-i62", + "startMs": 1792451567220, + "endMs": 1792451567976, + "startSeconds": 432.03, + "category": "publish" + } + }, + "phasesSeconds": { + "send_to_first_tool": 10.219, + "first_tool_to_first_source_write": 345.618, + "first_source_write_to_first_browser_check": 10.987, + "first_browser_check_to_publish_attempt": 65.206, + "publish_attempt_to_visible": 15.005 + }, + "completeComparablePhases": true, + "missingMarkers": [], + "toolCount": 35, + "observedToolUnionSeconds": 72.721, + "unattributedSeconds": 374.314, + "categories": { + "build": { + "calls": 2, + "unionObservedSeconds": 0.616 + }, + "inspect_screenshot": { + "calls": 3, + "unionObservedSeconds": 0.164 + }, + "publish": { + "calls": 1, + "unionObservedSeconds": 0.756 + }, + "read_setup": { + "calls": 18, + "unionObservedSeconds": 22.926 + }, + "verify": { + "calls": 1, + "unionObservedSeconds": 11.719 + }, + "verify_mixed": { + "calls": 2, + "unionObservedSeconds": 14.382 + }, + "web_research": { + "calls": 8, + "unionObservedSeconds": 22.158 + } + }, + "toolRowsMissingCompletion": [], + "postVisibleAgentWorkRowsExcluded": 0, + "sources": [ + { + "path": ".launch/results/baseline/claude-code/cdn/result.json", + "sha256": "40dd621119d10e6e8dbac152c84ca17c1bfbb83caf550072796fd9970a79b265" + }, + { + "path": ".launch/results/baseline/claude-code/cdn/timeline.json", + "sha256": "1253a77c4d52fc2bb840f278d6e4125bfd30291b5eb8bcd9e45bc99fcde2af04" + } + ] + }, + { + "label": "baseline", + "prompt": "door-lock", + "threadId": "thr_v9jwghm8md", + "model": "claude-opus-5-5", + "classification": "visible_card", + "sentAt": 1792454299840, + "visibleAt": 1792454967760, + "visibleSeconds": 667.92, + "scoreSeconds": 667.92, + "proofKind": "html", + "progressObserved": true, + "questions": { + "structured": [], + "textQuestions": [], + "count": 0, + "needsReview": false + }, + "markers": { + "firstTool": { + "id": "thr_v9jwghm8md:tool:da414c783b-i2", + "startMs": 1792454309056, + "endMs": 1792454309056, + "startSeconds": 9.216, + "category": "read_setup" + }, + "firstSourceWrite": { + "id": "thr_v9jwghm8md:file-edit:da414c783b-i28:/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/data/plugins/environment-personal-workspace/host-data/workspaces/thr_v9jwghm8md/.how-it-works/examples/pin-tumbler/build.mjs:file-change:0", + "startMs": 1792454721159, + "endMs": 1792454721280, + "startSeconds": 421.319, + "category": "build" + }, + "firstBrowserCheck": { + "id": "thr_v9jwghm8md:command:da414c783b-i33", + "startMs": 1792454738370, + "endMs": 1792454755492, + "startSeconds": 438.53, + "category": "verify" + }, + "firstPublishAttempt": { + "id": "thr_v9jwghm8md:command:da414c783b-i69", + "startMs": 1792454957938, + "endMs": 1792454958629, + "startSeconds": 658.098, + "category": "publish" + } + }, + "phasesSeconds": { + "send_to_first_tool": 9.216, + "first_tool_to_first_source_write": 412.103, + "first_source_write_to_first_browser_check": 17.211, + "first_browser_check_to_publish_attempt": 219.568, + "publish_attempt_to_visible": 9.822 + }, + "completeComparablePhases": true, + "missingMarkers": [], + "toolCount": 33, + "observedToolUnionSeconds": 118.145, + "unattributedSeconds": 549.775, + "categories": { + "build": { + "calls": 4, + "unionObservedSeconds": 2.027 + }, + "inspect_screenshot": { + "calls": 7, + "unionObservedSeconds": 0.569 + }, + "publish": { + "calls": 1, + "unionObservedSeconds": 0.691 + }, + "read_setup": { + "calls": 14, + "unionObservedSeconds": 4.998 + }, + "verify": { + "calls": 4, + "unionObservedSeconds": 43.1 + }, + "verify_mixed": { + "calls": 3, + "unionObservedSeconds": 66.76 + } + }, + "toolRowsMissingCompletion": [], + "postVisibleAgentWorkRowsExcluded": 0, + "sources": [ + { + "path": ".launch/results/baseline/claude-code/door-lock/result.json", + "sha256": "8bb083098e0b5b37622f33beed644aa182cb3cf3a4b8194cc333caeceb8bd773" + }, + { + "path": ".launch/results/baseline/claude-code/door-lock/timeline.json", + "sha256": "c485252a4e7828a27c2d9c28014f7a1e73a4e16d05e103430ea8b111f534efab" + } + ] + }, + { + "label": "baseline", + "prompt": "git-merge", + "threadId": "thr_2vpryj2idq", + "model": "claude-opus-5-5", + "classification": "visible_card", + "sentAt": 1792462039040, + "visibleAt": 1792462509712, + "visibleSeconds": 470.672, + "scoreSeconds": 470.672, + "proofKind": "html", + "progressObserved": true, + "questions": { + "structured": [], + "textQuestions": [], + "count": 0, + "needsReview": false + }, + "markers": { + "firstTool": { + "id": "thr_2vpryj2idq:tool:dae24f5918-i2", + "startMs": 1792462047922, + "endMs": 1792462047922, + "startSeconds": 8.882, + "category": "read_setup" + }, + "firstSourceWrite": { + "id": "thr_2vpryj2idq:file-edit:dae24f5918-i28:/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/data/plugins/environment-personal-workspace/host-data/workspaces/thr_2vpryj2idq/.how-it-works/examples/git-merge/build.mjs:file-change:0", + "startMs": 1792462359877, + "endMs": 1792462359913, + "startSeconds": 320.837, + "category": "build" + }, + "firstBrowserCheck": { + "id": "thr_2vpryj2idq:command:dae24f5918-i32", + "startMs": 1792462374889, + "endMs": 1792462384808, + "startSeconds": 335.849, + "category": "verify" + }, + "firstPublishAttempt": { + "id": "thr_2vpryj2idq:command:dae24f5918-i54", + "startMs": 1792462500817, + "endMs": 1792462501478, + "startSeconds": 461.777, + "category": "publish" + } + }, + "phasesSeconds": { + "send_to_first_tool": 8.882, + "first_tool_to_first_source_write": 311.955, + "first_source_write_to_first_browser_check": 15.012, + "first_browser_check_to_publish_attempt": 125.928, + "publish_attempt_to_visible": 8.895 + }, + "completeComparablePhases": true, + "missingMarkers": [], + "toolCount": 28, + "observedToolUnionSeconds": 52.925, + "unattributedSeconds": 417.747, + "categories": { + "build": { + "calls": 2, + "unionObservedSeconds": 0.856 + }, + "inspect_screenshot": { + "calls": 5, + "unionObservedSeconds": 0.312 + }, + "publish": { + "calls": 1, + "unionObservedSeconds": 0.661 + }, + "read_setup": { + "calls": 16, + "unionObservedSeconds": 5.59 + }, + "verify": { + "calls": 2, + "unionObservedSeconds": 23.058 + }, + "verify_mixed": { + "calls": 2, + "unionObservedSeconds": 22.448 + } + }, + "toolRowsMissingCompletion": [], + "postVisibleAgentWorkRowsExcluded": 0, + "sources": [ + { + "path": ".launch/results/baseline/claude-code/git-merge/result.json", + "sha256": "8851bb178c13d80d2a4f53176a50795ff65a55fab87ad631d8b5cc66a6fb3233" + }, + { + "path": ".launch/results/baseline/claude-code/git-merge/timeline.json", + "sha256": "bd6229cbc425da82aa0f7fce8e7d23d0b00d7d23ce61fec35a3495289863a572" + } + ] + }, + { + "label": "baseline", + "prompt": "load-balancer", + "threadId": "thr_u4yhkzb5a8", + "model": "claude-opus-5-5", + "classification": "visible_card", + "sentAt": 1792463131962, + "visibleAt": 1792463472753, + "visibleSeconds": 340.791, + "scoreSeconds": 340.791, + "proofKind": "html", + "progressObserved": true, + "questions": { + "structured": [], + "textQuestions": [], + "count": 0, + "needsReview": false + }, + "markers": { + "firstTool": { + "id": "thr_u4yhkzb5a8:tool:daf301985c-i2", + "startMs": 1792463138422, + "endMs": 1792463138422, + "startSeconds": 6.46, + "category": "read_setup" + }, + "firstSourceWrite": { + "id": "thr_u4yhkzb5a8:file-edit:daf301985c-i32:/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/data/plugins/environment-personal-workspace/host-data/workspaces/thr_u4yhkzb5a8/.how-it-works/examples/load-balancer/build.mjs:file-change:0", + "startMs": 1792463381050, + "endMs": 1792463381098, + "startSeconds": 249.088, + "category": "build" + }, + "firstBrowserCheck": { + "id": "thr_u4yhkzb5a8:command:daf301985c-i35", + "startMs": 1792463388050, + "endMs": 1792463396885, + "startSeconds": 256.088, + "category": "verify" + }, + "firstPublishAttempt": { + "id": "thr_u4yhkzb5a8:command:daf301985c-i48", + "startMs": 1792463462116, + "endMs": 1792463462775, + "startSeconds": 330.154, + "category": "publish" + } + }, + "phasesSeconds": { + "send_to_first_tool": 6.46, + "first_tool_to_first_source_write": 242.628, + "first_source_write_to_first_browser_check": 7.0, + "first_browser_check_to_publish_attempt": 74.066, + "publish_attempt_to_visible": 10.637 + }, + "completeComparablePhases": true, + "missingMarkers": [], + "toolCount": 27, + "observedToolUnionSeconds": 55.65, + "unattributedSeconds": 285.141, + "categories": { + "build": { + "calls": 2, + "unionObservedSeconds": 0.565 + }, + "inspect_screenshot": { + "calls": 3, + "unionObservedSeconds": 0.118 + }, + "publish": { + "calls": 1, + "unionObservedSeconds": 0.659 + }, + "read_setup": { + "calls": 18, + "unionObservedSeconds": 7.117 + }, + "verify": { + "calls": 2, + "unionObservedSeconds": 27.478 + }, + "verify_mixed": { + "calls": 1, + "unionObservedSeconds": 19.713 + } + }, + "toolRowsMissingCompletion": [], + "postVisibleAgentWorkRowsExcluded": 0, + "sources": [ + { + "path": ".launch/results/baseline/claude-code/load-balancer/result.json", + "sha256": "29f43ace05c0dd9a66fd2d1dd7aa332bf5b2109b4414b4b6ce333690e2be1198" + }, + { + "path": ".launch/results/baseline/claude-code/load-balancer/timeline.json", + "sha256": "82dc2fa8ae2ae1f9ec7122293a7b57d3b8c2d0d9285c1da0aacc3f3d6dfafc47" + } + ] + }, + { + "label": "baseline", + "prompt": "refrigerator", + "threadId": "thr_mczrxpv37u", + "model": "claude-opus-5-5", + "classification": "visible_card", + "sentAt": 1792454976372, + "visibleAt": 1792455667430, + "visibleSeconds": 691.058, + "scoreSeconds": 691.058, + "proofKind": "html", + "progressObserved": true, + "questions": { + "structured": [], + "textQuestions": [], + "count": 0, + "needsReview": false + }, + "markers": { + "firstTool": { + "id": "thr_mczrxpv37u:tool:da3afdfe18-i2", + "startMs": 1792454985440, + "endMs": 1792454985440, + "startSeconds": 9.068, + "category": "read_setup" + }, + "firstSourceWrite": { + "id": "thr_mczrxpv37u:command:da3afdfe18-i25", + "startMs": 1792455362657, + "endMs": 1792455362967, + "startSeconds": 386.285, + "category": "build" + }, + "firstBrowserCheck": { + "id": "thr_mczrxpv37u:command:da3afdfe18-i30", + "startMs": 1792455512396, + "endMs": 1792455515956, + "startSeconds": 536.024, + "category": "verify" + }, + "firstPublishAttempt": { + "id": "thr_mczrxpv37u:command:da3afdfe18-i51", + "startMs": 1792455642787, + "endMs": 1792455650232, + "startSeconds": 666.415, + "category": "publish_mixed" + } + }, + "phasesSeconds": { + "send_to_first_tool": 9.068, + "first_tool_to_first_source_write": 377.217, + "first_source_write_to_first_browser_check": 149.739, + "first_browser_check_to_publish_attempt": 130.391, + "publish_attempt_to_visible": 24.643 + }, + "completeComparablePhases": true, + "missingMarkers": [], + "toolCount": 27, + "observedToolUnionSeconds": 46.652, + "unattributedSeconds": 644.406, + "categories": { + "build": { + "calls": 3, + "unionObservedSeconds": 0.9 + }, + "inspect_screenshot": { + "calls": 5, + "unionObservedSeconds": 0.162 + }, + "publish_mixed": { + "calls": 1, + "unionObservedSeconds": 7.445 + }, + "read_setup": { + "calls": 14, + "unionObservedSeconds": 16.605 + }, + "verify": { + "calls": 2, + "unionObservedSeconds": 7.235 + }, + "verify_mixed": { + "calls": 2, + "unionObservedSeconds": 14.305 + } + }, + "toolRowsMissingCompletion": [], + "postVisibleAgentWorkRowsExcluded": 0, + "sources": [ + { + "path": ".launch/results/baseline/claude-code/refrigerator/result.json", + "sha256": "be90ba53e0e4f879efc1cfcc779118e01d3486a11c72797cd6416a9f8aafece1" + }, + { + "path": ".launch/results/baseline/claude-code/refrigerator/timeline.json", + "sha256": "b6c30f00676f71823278da07700be4856d17887b3a5fc9144306a1380c0bd8f0" + } + ] + }, + { + "label": "baseline", + "prompt": "spray-bottle", + "threadId": "thr_saaff7fgjy", + "model": "claude-opus-5-5", + "classification": "visible_card", + "sentAt": 1792456335080, + "visibleAt": 1792456882698, + "visibleSeconds": 547.618, + "scoreSeconds": 547.618, + "proofKind": "html", + "progressObserved": true, + "questions": { + "structured": [], + "textQuestions": [], + "count": 0, + "needsReview": false + }, + "markers": { + "firstTool": { + "id": "thr_saaff7fgjy:tool:da948817ab-i2", + "startMs": 1792456345287, + "endMs": 1792456345287, + "startSeconds": 10.207, + "category": "read_setup" + }, + "firstSourceWrite": { + "id": "thr_saaff7fgjy:file-edit:da948817ab-i30:/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/data/plugins/environment-personal-workspace/host-data/workspaces/thr_saaff7fgjy/.how-it-works/examples/spray-bottle/build.mjs:file-change:0", + "startMs": 1792456723214, + "endMs": 1792456723303, + "startSeconds": 388.134, + "category": "build" + }, + "firstBrowserCheck": { + "id": "thr_saaff7fgjy:command:da948817ab-i37", + "startMs": 1792456739504, + "endMs": 1792456741499, + "startSeconds": 404.424, + "category": "verify" + }, + "firstPublishAttempt": { + "id": "thr_saaff7fgjy:command:da948817ab-i72", + "startMs": 1792456869918, + "endMs": 1792456870906, + "startSeconds": 534.838, + "category": "publish" + } + }, + "phasesSeconds": { + "send_to_first_tool": 10.207, + "first_tool_to_first_source_write": 377.927, + "first_source_write_to_first_browser_check": 16.29, + "first_browser_check_to_publish_attempt": 130.414, + "publish_attempt_to_visible": 12.78 + }, + "completeComparablePhases": true, + "missingMarkers": [], + "toolCount": 38, + "observedToolUnionSeconds": 66.197, + "unattributedSeconds": 481.42100000000005, + "categories": { + "build": { + "calls": 3, + "unionObservedSeconds": 1.508 + }, + "inspect_screenshot": { + "calls": 7, + "unionObservedSeconds": 0.19 + }, + "publish": { + "calls": 1, + "unionObservedSeconds": 0.988 + }, + "read_setup": { + "calls": 18, + "unionObservedSeconds": 21.118 + }, + "verify": { + "calls": 4, + "unionObservedSeconds": 25.542 + }, + "verify_mixed": { + "calls": 3, + "unionObservedSeconds": 14.359 + }, + "web_research": { + "calls": 2, + "unionObservedSeconds": 12.572 + } + }, + "toolRowsMissingCompletion": [], + "postVisibleAgentWorkRowsExcluded": 0, + "sources": [ + { + "path": ".launch/results/baseline/claude-code/spray-bottle/result.json", + "sha256": "05ccab52159a1bfa2a00f3a53646a595f268f81771e5e2fe3a1cc28f195cae82" + }, + { + "path": ".launch/results/baseline/claude-code/spray-bottle/timeline.json", + "sha256": "345437909086f108c81206eb8389f18ef399213355a1ab1234b26e3bd6a49f7f" + } + ] + }, + { + "label": "baseline", + "prompt": "stapler", + "threadId": "thr_km5bs3fghd", + "model": "claude-opus-5-5", + "classification": "visible_card", + "sentAt": 1792455691073, + "visibleAt": 1792456308898, + "visibleSeconds": 617.825, + "scoreSeconds": 617.825, + "proofKind": "html", + "progressObserved": true, + "questions": { + "structured": [], + "textQuestions": [], + "count": 0, + "needsReview": false + }, + "markers": { + "firstTool": { + "id": "thr_km5bs3fghd:tool:da9e1326b8-i2", + "startMs": 1792455700041, + "endMs": 1792455700041, + "startSeconds": 8.968, + "category": "read_setup" + }, + "firstSourceWrite": { + "id": "thr_km5bs3fghd:file-edit:da9e1326b8-i27:/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/data/plugins/environment-personal-workspace/host-data/workspaces/thr_km5bs3fghd/.how-it-works/examples/stapler/scene.mjs:file-change:0", + "startMs": 1792456046947, + "endMs": 1792456046993, + "startSeconds": 355.874, + "category": "build" + }, + "firstBrowserCheck": { + "id": "thr_km5bs3fghd:command:da9e1326b8-i32", + "startMs": 1792456104621, + "endMs": 1792456110773, + "startSeconds": 413.548, + "category": "verify" + }, + "firstPublishAttempt": { + "id": "thr_km5bs3fghd:command:da9e1326b8-i74", + "startMs": 1792456294249, + "endMs": 1792456295121, + "startSeconds": 603.176, + "category": "publish" + } + }, + "phasesSeconds": { + "send_to_first_tool": 8.968, + "first_tool_to_first_source_write": 346.906, + "first_source_write_to_first_browser_check": 57.674, + "first_browser_check_to_publish_attempt": 189.628, + "publish_attempt_to_visible": 14.649 + }, + "completeComparablePhases": true, + "missingMarkers": [], + "toolCount": 37, + "observedToolUnionSeconds": 60.202, + "unattributedSeconds": 557.623, + "categories": { + "build": { + "calls": 3, + "unionObservedSeconds": 0.56 + }, + "inspect_screenshot": { + "calls": 9, + "unionObservedSeconds": 0.355 + }, + "publish": { + "calls": 1, + "unionObservedSeconds": 0.872 + }, + "read_setup": { + "calls": 15, + "unionObservedSeconds": 6.279 + }, + "verify": { + "calls": 2, + "unionObservedSeconds": 12.667 + }, + "verify_mixed": { + "calls": 7, + "unionObservedSeconds": 39.469 + } + }, + "toolRowsMissingCompletion": [], + "postVisibleAgentWorkRowsExcluded": 0, + "sources": [ + { + "path": ".launch/results/baseline/claude-code/stapler/result.json", + "sha256": "5291a2719eaacc232488431dff8fea8448e27c733ab233c5832ab3e4a78933e3" + }, + { + "path": ".launch/results/baseline/claude-code/stapler/timeline.json", + "sha256": "cb44f1049f6698a1b69381993df6514eb101910a783c91d0621ea574c2ec6189" + } + ] + }, + { + "label": "baseline", + "prompt": "thermos", + "threadId": "thr_25rwzfxbne", + "model": "claude-opus-5-5", + "classification": "visible_card", + "sentAt": 1792453731642, + "visibleAt": 1792454276282, + "visibleSeconds": 544.64, + "scoreSeconds": 544.64, + "proofKind": "html", + "progressObserved": true, + "questions": { + "structured": [], + "textQuestions": [], + "count": 0, + "needsReview": false + }, + "markers": { + "firstTool": { + "id": "thr_25rwzfxbne:tool:dab1b69b3d-i2", + "startMs": 1792453740214, + "endMs": 1792453740214, + "startSeconds": 8.572, + "category": "read_setup" + }, + "firstSourceWrite": { + "id": "thr_25rwzfxbne:file-edit:dab1b69b3d-i29:/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/data/plugins/environment-personal-workspace/host-data/workspaces/thr_25rwzfxbne/.how-it-works/examples/thermos/model.mjs:file-change:0", + "startMs": 1792454064564, + "endMs": 1792454066831, + "startSeconds": 332.922, + "category": "build" + }, + "firstBrowserCheck": { + "id": "thr_25rwzfxbne:command:dab1b69b3d-i36", + "startMs": 1792454205000, + "endMs": 1792454208749, + "startSeconds": 473.358, + "category": "verify" + }, + "firstPublishAttempt": { + "id": "thr_25rwzfxbne:command:dab1b69b3d-i53", + "startMs": 1792454263575, + "endMs": 1792454264361, + "startSeconds": 531.933, + "category": "publish" + } + }, + "phasesSeconds": { + "send_to_first_tool": 8.572, + "first_tool_to_first_source_write": 324.35, + "first_source_write_to_first_browser_check": 140.436, + "first_browser_check_to_publish_attempt": 58.575, + "publish_attempt_to_visible": 12.707 + }, + "completeComparablePhases": true, + "missingMarkers": [], + "toolCount": 27, + "observedToolUnionSeconds": 33.471, + "unattributedSeconds": 511.169, + "categories": { + "build": { + "calls": 3, + "unionObservedSeconds": 2.797 + }, + "inspect_screenshot": { + "calls": 5, + "unionObservedSeconds": 0.227 + }, + "other": { + "calls": 1, + "unionObservedSeconds": 0.526 + }, + "publish": { + "calls": 1, + "unionObservedSeconds": 0.786 + }, + "read_setup": { + "calls": 13, + "unionObservedSeconds": 4.382 + }, + "verify": { + "calls": 2, + "unionObservedSeconds": 8.817 + }, + "verify_mixed": { + "calls": 1, + "unionObservedSeconds": 8.803 + }, + "web_research": { + "calls": 1, + "unionObservedSeconds": 7.586 + } + }, + "toolRowsMissingCompletion": [], + "postVisibleAgentWorkRowsExcluded": 0, + "sources": [ + { + "path": ".launch/results/baseline/claude-code/thermos/result.json", + "sha256": "94c9bf59e4a47f91aead169d231ca8129cc90093c5715c17f1df2a213b18f709" + }, + { + "path": ".launch/results/baseline/claude-code/thermos/timeline.json", + "sha256": "a4fdd9bc189d6f05dc9562e6354c45a7f08297186f181929c17b353b775643cc" + } + ] + }, + { + "label": "baseline", + "prompt": "toaster", + "threadId": "thr_tpv3gzb7zb", + "model": "claude-opus-5-5", + "classification": "visible_card", + "sentAt": 1792457811775, + "visibleAt": 1792458260851, + "visibleSeconds": 449.076, + "scoreSeconds": 449.076, + "proofKind": "html", + "progressObserved": true, + "questions": { + "structured": [], + "textQuestions": [], + "count": 0, + "needsReview": false + }, + "markers": { + "firstTool": { + "id": "thr_tpv3gzb7zb:tool:da9eb85223-i2", + "startMs": 1792457822679, + "endMs": 1792457822679, + "startSeconds": 10.904, + "category": "read_setup" + }, + "firstSourceWrite": { + "id": "thr_tpv3gzb7zb:file-edit:da9eb85223-i30:/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/data/plugins/environment-personal-workspace/host-data/workspaces/thr_tpv3gzb7zb/.how-it-works/examples/toaster/build.mjs:file-change:0", + "startMs": 1792458165024, + "endMs": 1792458165059, + "startSeconds": 353.249, + "category": "build" + }, + "firstBrowserCheck": { + "id": "thr_tpv3gzb7zb:command:da9eb85223-i33", + "startMs": 1792458175452, + "endMs": 1792458179273, + "startSeconds": 363.677, + "category": "verify" + }, + "firstPublishAttempt": { + "id": "thr_tpv3gzb7zb:command:da9eb85223-i48", + "startMs": 1792458248050, + "endMs": 1792458248865, + "startSeconds": 436.275, + "category": "publish" + } + }, + "phasesSeconds": { + "send_to_first_tool": 10.904, + "first_tool_to_first_source_write": 342.345, + "first_source_write_to_first_browser_check": 10.428, + "first_browser_check_to_publish_attempt": 72.598, + "publish_attempt_to_visible": 12.801 + }, + "completeComparablePhases": true, + "missingMarkers": [], + "toolCount": 25, + "observedToolUnionSeconds": 43.794, + "unattributedSeconds": 405.28200000000004, + "categories": { + "build": { + "calls": 2, + "unionObservedSeconds": 0.663 + }, + "inspect_screenshot": { + "calls": 4, + "unionObservedSeconds": 0.131 + }, + "publish": { + "calls": 1, + "unionObservedSeconds": 0.815 + }, + "read_setup": { + "calls": 14, + "unionObservedSeconds": 6.484 + }, + "verify": { + "calls": 1, + "unionObservedSeconds": 3.821 + }, + "verify_mixed": { + "calls": 2, + "unionObservedSeconds": 25.016 + }, + "web_research": { + "calls": 1, + "unionObservedSeconds": 6.864 + } + }, + "toolRowsMissingCompletion": [], + "postVisibleAgentWorkRowsExcluded": 0, + "sources": [ + { + "path": ".launch/results/baseline/claude-code/toaster/result.json", + "sha256": "1c9d8eef5cc88ab2ab6defe223c4c106f90a89dd87950250ef9f1ddbe57e29e0" + }, + { + "path": ".launch/results/baseline/claude-code/toaster/timeline.json", + "sha256": "3e978aa96fa31e3c994043f74895796c382a59eab9b71e8b3333cfc0817f26bd" + } + ] + }, + { + "label": "baseline", + "prompt": "toilet", + "threadId": "thr_qybj3im32q", + "model": "claude-opus-5-5", + "classification": "visible_card", + "sentAt": 1792453111696, + "visibleAt": 1792453693624, + "visibleSeconds": 581.928, + "scoreSeconds": 581.928, + "proofKind": "html", + "progressObserved": true, + "questions": { + "structured": [], + "textQuestions": [], + "count": 0, + "needsReview": false + }, + "markers": { + "firstTool": { + "id": "thr_qybj3im32q:tool:da0ff571db-i2", + "startMs": 1792453119277, + "endMs": 1792453119277, + "startSeconds": 7.581, + "category": "read_setup" + }, + "firstSourceWrite": { + "id": "thr_qybj3im32q:command:da0ff571db-i18", + "startMs": 1792453291354, + "endMs": 1792453291716, + "startSeconds": 179.658, + "category": "build" + }, + "firstBrowserCheck": { + "id": "thr_qybj3im32q:command:da0ff571db-i30", + "startMs": 1792453579799, + "endMs": 1792453588200, + "startSeconds": 468.103, + "category": "verify" + }, + "firstPublishAttempt": { + "id": "thr_qybj3im32q:command:da0ff571db-i56", + "startMs": 1792453685250, + "endMs": 1792453685972, + "startSeconds": 573.554, + "category": "publish" + } + }, + "phasesSeconds": { + "send_to_first_tool": 7.581, + "first_tool_to_first_source_write": 172.077, + "first_source_write_to_first_browser_check": 288.445, + "first_browser_check_to_publish_attempt": 105.451, + "publish_attempt_to_visible": 8.374 + }, + "completeComparablePhases": true, + "missingMarkers": [], + "toolCount": 26, + "observedToolUnionSeconds": 70.148, + "unattributedSeconds": 511.78, + "categories": { + "build": { + "calls": 6, + "unionObservedSeconds": 2.256 + }, + "inspect_screenshot": { + "calls": 4, + "unionObservedSeconds": 23.677 + }, + "publish": { + "calls": 1, + "unionObservedSeconds": 0.722 + }, + "read_setup": { + "calls": 8, + "unionObservedSeconds": 13.33 + }, + "verify": { + "calls": 4, + "unionObservedSeconds": 34.686 + }, + "verify_mixed": { + "calls": 3, + "unionObservedSeconds": 18.892 + } + }, + "toolRowsMissingCompletion": [], + "postVisibleAgentWorkRowsExcluded": 0, + "sources": [ + { + "path": ".launch/results/baseline/claude-code/toilet/result.json", + "sha256": "bcd6de86fbb82a0995be8b670c844905856ae606e9022afacf1560b987740d90" + }, + { + "path": ".launch/results/baseline/claude-code/toilet/timeline.json", + "sha256": "64f330054ecbd9d5d3e015b67e4ea914b4c2d4295f1207b96015591dbd55bb23" + } + ] + }, + { + "label": "baseline", + "prompt": "umbrella", + "threadId": "thr_kdgr63qmx4", + "model": "claude-opus-5-5", + "classification": "visible_card", + "sentAt": 1792458269840, + "visibleAt": 1792458879674, + "visibleSeconds": 609.834, + "scoreSeconds": 609.834, + "proofKind": "html", + "progressObserved": true, + "questions": { + "structured": [], + "textQuestions": [], + "count": 0, + "needsReview": false + }, + "markers": { + "firstTool": { + "id": "thr_kdgr63qmx4:tool:daeeb801fd-i2", + "startMs": 1792458300723, + "endMs": 1792458300723, + "startSeconds": 30.883, + "category": "read_setup" + }, + "firstSourceWrite": { + "id": "thr_kdgr63qmx4:file-edit:daeeb801fd-i25:/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/data/plugins/environment-personal-workspace/host-data/workspaces/thr_kdgr63qmx4/.how-it-works/examples/umbrella/build.mjs:file-change:0", + "startMs": 1792458686074, + "endMs": 1792458686117, + "startSeconds": 416.234, + "category": "build" + }, + "firstBrowserCheck": { + "id": "thr_kdgr63qmx4:command:daeeb801fd-i31", + "startMs": 1792458703390, + "endMs": 1792458712148, + "startSeconds": 433.55, + "category": "verify" + }, + "firstPublishAttempt": { + "id": "thr_kdgr63qmx4:command:daeeb801fd-i64", + "startMs": 1792458863955, + "endMs": 1792458864661, + "startSeconds": 594.115, + "category": "publish" + } + }, + "phasesSeconds": { + "send_to_first_tool": 30.883, + "first_tool_to_first_source_write": 385.351, + "first_source_write_to_first_browser_check": 17.316, + "first_browser_check_to_publish_attempt": 160.565, + "publish_attempt_to_visible": 15.719 + }, + "completeComparablePhases": true, + "missingMarkers": [], + "toolCount": 32, + "observedToolUnionSeconds": 84.934, + "unattributedSeconds": 524.9, + "categories": { + "build": { + "calls": 2, + "unionObservedSeconds": 0.595 + }, + "inspect_screenshot": { + "calls": 5, + "unionObservedSeconds": 0.177 + }, + "publish": { + "calls": 1, + "unionObservedSeconds": 0.706 + }, + "read_setup": { + "calls": 17, + "unionObservedSeconds": 29.074 + }, + "verify": { + "calls": 3, + "unionObservedSeconds": 18.727 + }, + "verify_mixed": { + "calls": 4, + "unionObservedSeconds": 35.655 + } + }, + "toolRowsMissingCompletion": [], + "postVisibleAgentWorkRowsExcluded": 0, + "sources": [ + { + "path": ".launch/results/baseline/claude-code/umbrella/result.json", + "sha256": "bf6b4c0cd3502008c51f7b98d34b01887cc3918c9706103a8abb1a9a26b51da0" + }, + { + "path": ".launch/results/baseline/claude-code/umbrella/timeline.json", + "sha256": "8c72f27a2f2fe4f0c829d66e5d2776e02b593e002e96bd2394cd881a8b0d46e1" + } + ] + }, + { + "label": "baseline", + "prompt": "washing-machine", + "threadId": "thr_27nd984gw9", + "model": "claude-opus-5-5", + "classification": "visible_card", + "sentAt": 1792451867802, + "visibleAt": 1792452685022, + "visibleSeconds": 817.22, + "scoreSeconds": 817.22, + "proofKind": "html", + "progressObserved": true, + "questions": { + "structured": [], + "textQuestions": [], + "count": 0, + "needsReview": false + }, + "markers": { + "firstTool": { + "id": "thr_27nd984gw9:tool:daf16c17af-i2", + "startMs": 1792451873231, + "endMs": 1792451873231, + "startSeconds": 5.429, + "category": "read_setup" + }, + "firstSourceWrite": { + "id": "thr_27nd984gw9:file-edit:daf16c17af-i44:/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/data/plugins/environment-personal-workspace/host-data/workspaces/thr_27nd984gw9/.how-it-works/examples/washing-machine/build.mjs:file-change:0", + "startMs": 1792452474364, + "endMs": 1792452477052, + "startSeconds": 606.562, + "category": "build" + }, + "firstBrowserCheck": { + "id": "thr_27nd984gw9:command:daf16c17af-i46", + "startMs": 1792452483479, + "endMs": 1792452487534, + "startSeconds": 615.677, + "category": "verify_mixed" + }, + "firstPublishAttempt": { + "id": "thr_27nd984gw9:command:daf16c17af-i78", + "startMs": 1792452671976, + "endMs": 1792452672703, + "startSeconds": 804.174, + "category": "publish" + } + }, + "phasesSeconds": { + "send_to_first_tool": 5.429, + "first_tool_to_first_source_write": 601.133, + "first_source_write_to_first_browser_check": 9.115, + "first_browser_check_to_publish_attempt": 188.497, + "publish_attempt_to_visible": 13.046 + }, + "completeComparablePhases": true, + "missingMarkers": [], + "toolCount": 40, + "observedToolUnionSeconds": 127.586, + "unattributedSeconds": 689.634, + "categories": { + "build": { + "calls": 1, + "unionObservedSeconds": 2.688 + }, + "inspect_screenshot": { + "calls": 5, + "unionObservedSeconds": 0.28 + }, + "publish": { + "calls": 1, + "unionObservedSeconds": 0.727 + }, + "read_setup": { + "calls": 23, + "unionObservedSeconds": 10.948 + }, + "verify": { + "calls": 4, + "unionObservedSeconds": 47.443 + }, + "verify_mixed": { + "calls": 4, + "unionObservedSeconds": 57.463 + }, + "web_research": { + "calls": 2, + "unionObservedSeconds": 8.037 + } + }, + "toolRowsMissingCompletion": [], + "postVisibleAgentWorkRowsExcluded": 0, + "sources": [ + { + "path": ".launch/results/baseline/claude-code/washing-machine/result.json", + "sha256": "55aac494a1b176374df4a13ec7b30378094debab60a0d4b858b18d203f35c4c2" + }, + { + "path": ".launch/results/baseline/claude-code/washing-machine/timeline.json", + "sha256": "db6308b66985b21ce9baa198bc012fe3401d26c030754375f408b19bff60ef05" + } + ] + }, + { + "label": "baseline", + "prompt": "websocket", + "threadId": "thr_pztn9rwqje", + "model": "claude-opus-5-5", + "classification": "visible_card", + "sentAt": 1792462526288, + "visibleAt": 1792463101363, + "visibleSeconds": 575.075, + "scoreSeconds": 575.075, + "proofKind": "html", + "progressObserved": true, + "questions": { + "structured": [], + "textQuestions": [ + { + "rowId": "thr_pztn9rwqje:assistant:kind:assistant|turn:daa2127865-t1|parent:root|item:daa2127865-i68", + "text": "Compare polling: each client asks \"anything new?", + "likely": false + } + ], + "count": 0, + "needsReview": true + }, + "markers": { + "firstTool": { + "id": "thr_pztn9rwqje:tool:daa2127865-i2", + "startMs": 1792462534438, + "endMs": 1792462534438, + "startSeconds": 8.15, + "category": "read_setup" + }, + "firstSourceWrite": { + "id": "thr_pztn9rwqje:file-edit:daa2127865-i27:/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/data/plugins/environment-personal-workspace/host-data/workspaces/thr_pztn9rwqje/.how-it-works/figures/websocket/build.mjs:file-change:0", + "startMs": 1792462898080, + "endMs": 1792462898133, + "startSeconds": 371.792, + "category": "build" + }, + "firstBrowserCheck": { + "id": "thr_pztn9rwqje:command:daa2127865-i29", + "startMs": 1792462906381, + "endMs": 1792462909963, + "startSeconds": 380.093, + "category": "verify_mixed" + }, + "firstPublishAttempt": { + "id": "thr_pztn9rwqje:command:daa2127865-i65", + "startMs": 1792463089095, + "endMs": 1792463089971, + "startSeconds": 562.807, + "category": "publish" + } + }, + "phasesSeconds": { + "send_to_first_tool": 8.15, + "first_tool_to_first_source_write": 363.642, + "first_source_write_to_first_browser_check": 8.301, + "first_browser_check_to_publish_attempt": 182.714, + "publish_attempt_to_visible": 12.268 + }, + "completeComparablePhases": true, + "missingMarkers": [], + "toolCount": 33, + "observedToolUnionSeconds": 79.607, + "unattributedSeconds": 495.4680000000001, + "categories": { + "build": { + "calls": 2, + "unionObservedSeconds": 1.41 + }, + "inspect_screenshot": { + "calls": 7, + "unionObservedSeconds": 0.558 + }, + "publish": { + "calls": 1, + "unionObservedSeconds": 0.876 + }, + "read_setup": { + "calls": 14, + "unionObservedSeconds": 7.662 + }, + "verify": { + "calls": 3, + "unionObservedSeconds": 40.497 + }, + "verify_mixed": { + "calls": 6, + "unionObservedSeconds": 28.78 + } + }, + "toolRowsMissingCompletion": [], + "postVisibleAgentWorkRowsExcluded": 0, + "sources": [ + { + "path": ".launch/results/baseline/claude-code/websocket/result.json", + "sha256": "7edf8cad8249cb01800d9573265a1c5950bdad36beee6c455d5a6eade94a8171" + }, + { + "path": ".launch/results/baseline/claude-code/websocket/timeline.json", + "sha256": "fd9ab2cba0c2b41a0848905a80c8b2894496dd66ead752ca098b3a1d108b9669" + } + ] + }, + { + "label": "baseline", + "prompt": "zipper", + "threadId": "thr_f6yyf5fxa4", + "model": "claude-opus-5-5", + "classification": "visible_card", + "sentAt": 1792452695421, + "visibleAt": 1792453103185, + "visibleSeconds": 407.764, + "scoreSeconds": 407.764, + "proofKind": "html", + "progressObserved": true, + "questions": { + "structured": [], + "textQuestions": [], + "count": 0, + "needsReview": false + }, + "markers": { + "firstTool": { + "id": "thr_f6yyf5fxa4:tool:da2fb7df2b-i2", + "startMs": 1792452703992, + "endMs": 1792452703992, + "startSeconds": 8.571, + "category": "read_setup" + }, + "firstSourceWrite": { + "id": "thr_f6yyf5fxa4:file-edit:da2fb7df2b-i29:/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/data/plugins/environment-personal-workspace/host-data/workspaces/thr_f6yyf5fxa4/.how-it-works/examples/zipper/build.mjs:file-change:0", + "startMs": 1792452975377, + "endMs": 1792452975487, + "startSeconds": 279.956, + "category": "build" + }, + "firstBrowserCheck": { + "id": "thr_f6yyf5fxa4:command:da2fb7df2b-i31", + "startMs": 1792452985450, + "endMs": 1792452989477, + "startSeconds": 290.029, + "category": "verify_mixed" + }, + "firstPublishAttempt": { + "id": "thr_f6yyf5fxa4:command:da2fb7df2b-i57", + "startMs": 1792453095719, + "endMs": 1792453096480, + "startSeconds": 400.298, + "category": "publish" + } + }, + "phasesSeconds": { + "send_to_first_tool": 8.571, + "first_tool_to_first_source_write": 271.385, + "first_source_write_to_first_browser_check": 10.073, + "first_browser_check_to_publish_attempt": 110.269, + "publish_attempt_to_visible": 7.466 + }, + "completeComparablePhases": true, + "missingMarkers": [], + "toolCount": 29, + "observedToolUnionSeconds": 61.468, + "unattributedSeconds": 346.296, + "categories": { + "build": { + "calls": 1, + "unionObservedSeconds": 0.11 + }, + "inspect_screenshot": { + "calls": 5, + "unionObservedSeconds": 0.223 + }, + "publish": { + "calls": 1, + "unionObservedSeconds": 0.761 + }, + "read_setup": { + "calls": 16, + "unionObservedSeconds": 6.137 + }, + "verify": { + "calls": 2, + "unionObservedSeconds": 20.748 + }, + "verify_mixed": { + "calls": 4, + "unionObservedSeconds": 33.489 + } + }, + "toolRowsMissingCompletion": [], + "postVisibleAgentWorkRowsExcluded": 0, + "sources": [ + { + "path": ".launch/results/baseline/claude-code/zipper/result.json", + "sha256": "492efa5021fcc0f23233e0a8547bec413e9889a858d9a4f6a4fff00e87c3dd0d" + }, + { + "path": ".launch/results/baseline/claude-code/zipper/timeline.json", + "sha256": "e9fd7279c91bf476e3d64e193596ab58cc1833d007c2454116b9658c8dc81426" + } + ] + } + ], + "matchedComparison": [ + { + "prompt": "bicycle-pump", + "baselineSeconds": 521.547, + "prototypeSeconds": 237.968, + "savingsSeconds": 283.57900000000006, + "completePhaseComparison": true + }, + { + "prompt": "cdn", + "baselineSeconds": 447.035, + "prototypeSeconds": 243.482, + "savingsSeconds": 203.55300000000003, + "completePhaseComparison": true + }, + { + "prompt": "door-lock", + "baselineSeconds": 667.92, + "prototypeSeconds": 255.018, + "savingsSeconds": 412.90199999999993, + "completePhaseComparison": true + }, + { + "prompt": "git-merge", + "baselineSeconds": 470.672, + "prototypeSeconds": 161.324, + "savingsSeconds": 309.348, + "completePhaseComparison": true + }, + { + "prompt": "load-balancer", + "baselineSeconds": 340.791, + "prototypeSeconds": 313.179, + "savingsSeconds": 27.612000000000023, + "completePhaseComparison": true + }, + { + "prompt": "refrigerator", + "baselineSeconds": 691.058, + "prototypeSeconds": 369.464, + "savingsSeconds": 321.594, + "completePhaseComparison": true + }, + { + "prompt": "spray-bottle", + "baselineSeconds": 547.618, + "prototypeSeconds": 244.026, + "savingsSeconds": 303.59200000000004, + "completePhaseComparison": true + }, + { + "prompt": "stapler", + "baselineSeconds": 617.825, + "prototypeSeconds": 380.894, + "savingsSeconds": 236.93100000000004, + "completePhaseComparison": true + }, + { + "prompt": "thermos", + "baselineSeconds": 544.64, + "prototypeSeconds": 118.72, + "savingsSeconds": 425.91999999999996, + "completePhaseComparison": false + }, + { + "prompt": "toaster", + "baselineSeconds": 449.076, + "prototypeSeconds": 224.133, + "savingsSeconds": 224.943, + "completePhaseComparison": true + }, + { + "prompt": "toilet", + "baselineSeconds": 581.928, + "prototypeSeconds": 331.297, + "savingsSeconds": 250.63099999999997, + "completePhaseComparison": true + }, + { + "prompt": "umbrella", + "baselineSeconds": 609.834, + "prototypeSeconds": 178.751, + "savingsSeconds": 431.08299999999997, + "completePhaseComparison": true + }, + { + "prompt": "washing-machine", + "baselineSeconds": 817.22, + "prototypeSeconds": 218.992, + "savingsSeconds": 598.2280000000001, + "completePhaseComparison": true + }, + { + "prompt": "websocket", + "baselineSeconds": 575.075, + "prototypeSeconds": 209.497, + "savingsSeconds": 365.57800000000003, + "completePhaseComparison": true + }, + { + "prompt": "zipper", + "baselineSeconds": 407.764, + "prototypeSeconds": 234.135, + "savingsSeconds": 173.62900000000002, + "completePhaseComparison": true + } + ], + "baselineNonvisibleExcludedFromMatched": [ + { + "prompt": "database-index", + "cardVisible": false, + "scoreSeconds": 900.0, + "wallSeconds": 118.804, + "error": "TimeoutError: The operation was aborted due to timeout", + "source": { + "path": ".launch/results/baseline/claude-code/database-index/result.json", + "sha256": "04d1704b5e861105862532da14422ee47fdf8ec2101e5ad5fcd951f78bf64c80" + }, + "priorClassification": "infrastructure_failure" + }, + { + "prompt": "dns", + "cardVisible": false, + "scoreSeconds": 900.0, + "wallSeconds": 40.824, + "error": "TimeoutError: The operation was aborted due to timeout", + "source": { + "path": ".launch/results/baseline/claude-code/dns/result.json", + "sha256": "691aa0196720c4b34fdc74edc848cf28507ef337f5b0b81ef0b3f11dcd4df110" + }, + "priorClassification": "infrastructure_failure" + }, + { + "prompt": "narrow-toggle", + "cardVisible": false, + "scoreSeconds": 900.0, + "wallSeconds": 28.036, + "error": "TypeError: fetch failed", + "source": { + "path": ".launch/results/baseline/claude-code/narrow-toggle/result.json", + "sha256": "806911068e27f93dbf734c77250787a1b3c566db75c1f9f8f2484c740b9de1a7" + }, + "priorClassification": "infrastructure_failure" + }, + { + "prompt": "notification-settings", + "cardVisible": false, + "scoreSeconds": 900.0, + "wallSeconds": 25.049, + "error": "Error: POST /threads: 502 {\"code\":\"dispatch_hook_failed\",\"message\":\"The \\\"concurrency-limit\\\" plugin's message.dispatch hook failed: did not decide within 10000ms\",\"details\":{\"pluginId\":\"concurrency-limit\"}}", + "source": { + "path": ".launch/results/baseline/claude-code/notification-settings/result.json", + "sha256": "098c6bc150c37f5c669e1df5ca6d2c9c2a4c2bb90d632fc87ae702e92f2d3df1" + }, + "priorClassification": "infrastructure_failure" + }, + { + "prompt": "seat-belt", + "cardVisible": false, + "scoreSeconds": 900.0, + "wallSeconds": 920.125, + "error": "No loaded, visibly rendered card before cap (or browser proof failed)", + "source": { + "path": ".launch/results/baseline/claude-code/seat-belt/result.json", + "sha256": "06f8107d0dbdc071df8e1f7b618ba1301b0486374d3239fb5042d316b075ee3b" + }, + "priorClassification": "capped_no_visible_card" + } + ], + "preservedOriginalAnalysis": { + "json": { + "path": ".launch/results/claude-timing-analysis.json", + "sha256": "11acb26b65c013ece7e11666c181222ef91f5b8d67bf493f42759e15a836dc20" + }, + "markdown": { + "path": ".launch/results/claude-timing-analysis.md", + "sha256": "6358216ef77a39a153491cf7129e7af5a94c7325b54823f4e3fb9369f3bf39f8" + } + }, + "sources": [ + { + "path": ".launch/results/prototype/manifest.json", + "sha256": "560b2b89dffb1de982be4c05f72173e729a9e1728dff892ffa4a68bfbb3d59d8" + }, + { + "path": ".launch/results/baseline/manifest.json", + "sha256": "619746bd8e270f58af5d0625e26223648d33a37aabf59c1a159c282353952360" + }, + { + "path": ".launch/results/prototype/summary.json", + "sha256": "0f00e2ada32028caede09023ae618f2e0c3b8f32527defce4fac26277bd3d08c" + } + ], + "notableToolOutputs": [ + { + "prompt": "refrigerator", + "rowId": "thr_dmpuie2xi2:command:da7f062afa-i21", + "output": "Command did not complete within its 120s timeout and was moved to the background (ID: bhv17lj0o). Output is being written to: /home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/agent-tmp/claude-1001/-home-bersabel--bb-plugins-environment-git-worktree-host-data-worktrees-thr-vv8zgxmczt-1-bb-plugins--launch-data-plugins-environment-personal-workspace-host-data-workspaces-thr-dmpuie2xi2/350e35c7-4abd-4bcd-9cef-62521e6957ef/tasks/bhv17lj0o.output. You will be notified when it completes. If it is still running after 30m in the background, it will be stopped and you will be notified. To check interim output, use Read on that file path." + } + ], + "exampleReadEvidence": [ + { + "prompt": "bicycle-pump", + "rowId": "thr_abm3wsbdua:command:dad523d551-i6", + "startMs": 1792467262217, + "commandSha256": "05b2c514cd85d68ced1f9b9d166d4a50ab1f056ff61ce42d9f222dcc529872a5" + }, + { + "prompt": "cdn", + "rowId": "thr_79h5kedc99:command:da42b9c023-i8", + "startMs": 1792467560064, + "commandSha256": "ae842c3388a7461814e79cff324a018c7dbdda5ebb98a2292ed95e2128212ced" + }, + { + "prompt": "database-index", + "rowId": "thr_wr3f293jim:command:da4b38176f-i7", + "startMs": 1792471647242, + "commandSha256": "e3eccada49aebb32f39f615a31af01407b3a9173f638a2d7506ba0b9fde51864" + }, + { + "prompt": "dns", + "rowId": "thr_9a7s8n6vfb:command:dabe8e1072-i6", + "startMs": 1792471448259, + "commandSha256": "3631711c10777215a695a047fff94b3327e1dcb52071e60917a381d48b7f7b08" + }, + { + "prompt": "door-lock", + "rowId": "thr_fpzkw62bp4:command:da2ececd3c-i7", + "startMs": 1792469168009, + "commandSha256": "299d0139971f9307e6265fbb975382963dc01f3a6ee884d2df5941a3ceaf2d91" + }, + { + "prompt": "git-merge", + "rowId": "thr_4hippn3cyv:command:da646a5da0-i8", + "startMs": 1792471924539, + "commandSha256": "4f502d4561ee6efb15171eeffeee613af151a51b3e56fe667ee063b7f76099e2" + }, + { + "prompt": "load-balancer", + "rowId": "thr_fnfb8zf4ye:command:da86402693-i6", + "startMs": 1792472349724, + "commandSha256": "2251860522f7229b3c9794d53cd726314d19ab5ad3171fa9d7b0297101c69bff" + }, + { + "prompt": "refrigerator", + "rowId": "thr_dmpuie2xi2:command:da7f062afa-i6", + "startMs": 1792469460323, + "commandSha256": "95689549d29c7bce232d2b6f8a97cbb29cc6a25e222807ded852d1b7af4ccef3" + }, + { + "prompt": "seat-belt", + "rowId": "thr_wvethpw6uz:command:da465a2788-i8", + "startMs": 1792470530356, + "commandSha256": "f55d776521113c13b7541637f01e947efed8c4fdd0815491874d2524a69c4347" + }, + { + "prompt": "spray-bottle", + "rowId": "thr_mhzkra2kge:command:dab37f8fab-i7", + "startMs": 1792470252411, + "commandSha256": "59d150b8a8884be38f8ad8673363a7348b74426b58dade8cae16a06b6f814414" + }, + { + "prompt": "stapler", + "rowId": "thr_tgxyrgj5vv:command:dabab98e5a-i6", + "startMs": 1792469848910, + "commandSha256": "1bf3cd8ce0237615f361cfd7b7c7b7efe1766f9e1d82e12219db1b144ca2f4cb" + }, + { + "prompt": "toaster", + "rowId": "thr_xd3n2g7bfv:command:dafb306e96-i6", + "startMs": 1792470868834, + "commandSha256": "e898a63a45b152dc219b7c22a90a7b5e240187cfbc7bdc50764e2e0b3a0b48d0" + }, + { + "prompt": "toilet", + "rowId": "thr_8n2fiqn2je:command:da01e87f48-i8", + "startMs": 1792468655819, + "commandSha256": "e85d840d03504ef1b4c539624de32f8aba3ae720bdba8375326f430b33fb41dc" + }, + { + "prompt": "umbrella", + "rowId": "thr_bjfrwcnsve:command:da4db76273-i7", + "startMs": 1792471110130, + "commandSha256": "5eabbeac6b9519bb033b24c5ae1bc20ddaa9d6e64ab1317cfb32161ddacd7782" + }, + { + "prompt": "washing-machine", + "rowId": "thr_icvnstch4p:command:da741b4352-i6", + "startMs": 1792468146973, + "commandSha256": "350fe94d37c02a4fed5351ac6ddc4f561832b9114e81a94b40c20332d40c8d5c" + }, + { + "prompt": "websocket", + "rowId": "thr_gnuingcpxx:command:da233af8b4-i7", + "startMs": 1792472103778, + "commandSha256": "1b0ace7af566865e64c39df5577b1db84add2de3a62751e46d8144c501edf3d3" + }, + { + "prompt": "zipper", + "rowId": "thr_jreubavbmd:command:da0512974d-i6", + "startMs": 1792468396546, + "commandSha256": "d81afb78e0a833b74fb0ae2c1baaec6e2b883b360a8f27a57a728b3aecb7c84e" + } + ], + "exportNote": { + "detail": "Compact phase export; complete work rows and gaps remain in the original linked evidence.", + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/claude-full-prototype-timing.json", + "sha256": "9e44adddb7714e3a93534b11b31ff02c0eb8a1bd0ca6d9cc306620b73d3c5e4e" + } +} diff --git a/plugins/playgrounds/evals/launch/reports/gate-1/claude-full-prototype-timing.md b/plugins/playgrounds/evals/launch/reports/gate-1/claude-full-prototype-timing.md new file mode 100644 index 000000000..4935e4f11 --- /dev/null +++ b/plugins/playgrounds/evals/launch/reports/gate-1/claude-full-prototype-timing.md @@ -0,0 +1,105 @@ +# Claude full-prototype latency breakdown + +Retained traces only; generated 2026-10-20T05:08:55.502206+00:00. This supplements [the baseline and two-case pilot analysis](claude-timing-analysis.md), which is unchanged. No browser, server, provider turn or saved-card replay was started for this analysis. + +**All 20 prototype attempts produced a visible card: median 3.93 minutes, p90 5.52 minutes.** Exact values are 236,051.5 ms and 331,297 ms. Recorded clarifying questions: 0; visible progress: 19/20, with none observed for narrow-toggle. Five cards arrived within three minutes. The median target remains missed; delivery alone does not prove live controls. These are the original send-to-visible measurements from [the raw summary](/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype/summary.json), not the later control rescore. + +For the **17 figures with all five ordered markers**, mean elapsed time is 9s to first tool + 160s from first tool to first source write + 11s from source write to first browser-check command + 64s checking/revising before publication + 12s from publish attempt to visible card = 256s. Reading/design/generation/building before the first browser check still accounts for 171s after startup. This subset excludes the two settings mockups and thermos; it is not an additive breakdown of the all-20 median. + +## Definitions and limits + +All table entries are **seconds**, rounded to one decimal. Full timestamps, row IDs, command excerpts and hashes, source hashes, database completion-event references, phase coverage and every unattributed interval are in [the JSON](/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/claude-full-prototype-timing.json). Each case links to its retained agent timeline; sibling `result.json` provides its visibility proof. + +- **Send → tool:** runner `sentAt` to the first work row. Includes provisioning, dispatch and initial provider response; it is not pure startup service time. +- **Tool → source write:** first work row to first generated source/model write. Includes skill/example reading, API lookup, design, code/tool-argument generation and unknown waits. Generated text exists before a write tool begins; this is not measured disk-read time. +- **Write → browser check:** first source write to the containing command's first actual `capture.mjs`, `drive.mjs` or `lines.mjs` invocation with a target. Help/no-target invocations are excluded. A combined write/build/check command shares one start timestamp, so a 0.0s envelope does **not** mean zero building time. Invoking a browser command is not proof that its first attempt succeeded. +- **Check/revise → publish:** first browser-check command to the first real publish attempt. Includes revisions, reads, checks and gaps. These are the agent's own checks, not the evaluator's control tests. +- **Publish → visible:** first publish-containing command or `bb:playground` tool with `action=publish` to on-screen proof. Help is excluded. Compound commands, unsuccessful attempts/retries, later state checks and directive emission can be inside this envelope; it is not publish API latency. +- **Missing is not zero:** a dash denotes a missing boundary and a phase that is unavailable/not comparable. Only the same complete set of rows enters each five-phase mean; available-only columns are not averaged into a fictional full breakdown. +- **Observed spans and gaps:** union work-row start/completion envelopes, clipped to send→visible; missing normalized completions are recovered from read-only `bb.db` `item/completed` events by call ID. All included work rows have completion evidence. 84.7% of all-20 elapsed time is outside those spans. That remainder is explicitly unattributed: the trace cannot split model generation, reasoning, scheduling, host stalls, background descendants or UI time. Tool envelopes themselves are not CPU measurements. +- **External test time is excluded:** fixture preflights are before `sentAt`; eval control-driving and later saved-card replays occur after first visibility or in separate processes. None contributes to these durations. Agent self-checks before visibility do contribute. Work after visibility is excluded even when retained in the timeline. + +The extraction corrects two marker ambiguities without changing the old report: DNS's first actual browser target begins at 122.1s; the 118.4s invocation only requests driver usage. Thermos's 92.3s command writes HTML and runs `publish --help`; its real publish attempt begins at 98.4s. Classification always comes from `cardVisible` and `proof.at`, never a prompt name. **Prototype seat belt is visible at 316.735s; only baseline seat belt is capped.** + +## All 20 prototype attempts + +| Case | Send → tool | Tool → source write | Write → browser check | Check/revise → publish | Publish → visible | Total visible | +|---|---:|---:|---:|---:|---:|---:| +| [bicycle-pump](/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype/claude-code/bicycle-pump/timeline.json) | 8.5 | 149.3 | 5.0 | 56.1 | 19.0 | 238.0 | +| [cdn](/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype/claude-code/cdn/timeline.json) | 30.4 | 165.2 | 5.3 | 17.8 | 24.7 | 243.5 | +| [database-index](/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype/claude-code/database-index/timeline.json) | 7.1 | 158.1 | 14.6 | 57.0 | 11.4 | 248.1 | +| [dns](/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype/claude-code/dns/timeline.json) | 7.4 | 107.3 | 7.3 | 50.7 | 12.0 | 184.8 | +| [door-lock](/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype/claude-code/door-lock/timeline.json) | 16.0 | 179.1 | 17.2 | 31.9 | 10.8 | 255.0 | +| [git-merge](/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype/claude-code/git-merge/timeline.json) | 6.2 | 107.8 | 0.0 | 37.6 | 9.7 | 161.3 | +| [load-balancer](/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype/claude-code/load-balancer/timeline.json) | 7.2 | 124.0 | 35.2 | 133.2 | 13.6 | 313.2 | +| [narrow-toggle](/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype/claude-code/narrow-toggle/timeline.json) | 6.5 | — | — | — | 8.8 | 50.4 | +| [notification-settings](/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype/claude-code/notification-settings/timeline.json) | 7.0 | 27.6 | — | — | 11.9 | 46.5 | +| [refrigerator](/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype/claude-code/refrigerator/timeline.json) | 6.5 | 173.8 | 0.0 | 179.8 | 9.4 | 369.5 | +| [seat-belt](/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype/claude-code/seat-belt/timeline.json) | 6.8 | 182.6 | 20.9 | 88.3 | 18.2 | 316.7 | +| [spray-bottle](/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype/claude-code/spray-bottle/timeline.json) | 6.9 | 164.1 | 13.1 | 52.7 | 7.1 | 244.0 | +| [stapler](/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype/claude-code/stapler/timeline.json) | 7.2 | 261.4 | 9.9 | 91.4 | 11.0 | 380.9 | +| [thermos](/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype/claude-code/thermos/timeline.json) | 8.7 | 83.6 | — | — | 20.3 | 118.7 | +| [toaster](/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype/claude-code/toaster/timeline.json) | 8.2 | 130.2 | 11.2 | 68.1 | 6.4 | 224.1 | +| [toilet](/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype/claude-code/toilet/timeline.json) | 5.9 | 221.9 | 6.0 | 88.1 | 9.5 | 331.3 | +| [umbrella](/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype/claude-code/umbrella/timeline.json) | 6.9 | 116.9 | 11.8 | 31.8 | 11.3 | 178.8 | +| [washing-machine](/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype/claude-code/washing-machine/timeline.json) | 7.0 | 151.4 | 17.4 | 32.6 | 10.6 | 219.0 | +| [websocket](/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype/claude-code/websocket/timeline.json) | 6.8 | 141.0 | 11.0 | 42.8 | 7.9 | 209.5 | +| [zipper](/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype/claude-code/zipper/timeline.json) | 8.3 | 185.5 | 0.0 | 32.4 | 8.0 | 234.1 | + + +The source-write and first-browser starts coincide for Git merge, refrigerator and zipper because one shell command contains both. Their intervening work is folded into the following envelope. + +The three incomplete phase traces are preserved explicitly: + +- **Narrow toggle:** loads the Playgrounds skill, calls the guide at 24.8s, directly publishes HTML through `bb:playground` at 41.7s and becomes visible at 50.4s. No separate source-write or browser-check marker exists. The 35.2s from first tool to publish is an unsplit reading/generation interval, not a substitute write phase. No progress text was observed before visibility. +- **Notification settings:** first tool at 7.0s; at 34.7s one shell command writes HTML through `$f` (visibly assigned `notif.html`) and attempts publication; another publish command follows at 38.0s. Visible at 46.5s. No browser-check marker exists, so its write/check/revise phases cannot be compared with the figures. +- **Thermos:** first source write at 92.3s, real publish at 98.4s, visible at 118.7s. It performs CLI state/parameter checks and `node --check`, but no retained browser-check invocation. Its 6.2s write-to-publish envelope is measurable; browser verification duration is not. All 20 observations have `proof.kind=html`; the mockups are not misreported as native-document cards. + +## Matched visible-baseline comparison + +The baseline had 15 visible attempts, four infrastructure failures and one capped delivery. Compare those **same 15 visible topics** with the prototype: mean 9.21 → 4.13 minutes (55.1% lower), median 9.13 → 3.97 minutes. Median per-case reduction is 303.6s; every matched case is faster. These conditional diagnostics do not replace the original all-20 gate baseline of 9.93-minute median / 15.00-minute p90. + +| Case | Baseline visible | Prototype visible | Reduction | +|---|---:|---:|---:| +| [bicycle-pump](/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline/claude-code/bicycle-pump/result.json) | 521.5 | 238.0 | 283.6 | +| [cdn](/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline/claude-code/cdn/result.json) | 447.0 | 243.5 | 203.6 | +| [door-lock](/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline/claude-code/door-lock/result.json) | 667.9 | 255.0 | 412.9 | +| [git-merge](/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline/claude-code/git-merge/result.json) | 470.7 | 161.3 | 309.3 | +| [load-balancer](/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline/claude-code/load-balancer/result.json) | 340.8 | 313.2 | 27.6 | +| [refrigerator](/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline/claude-code/refrigerator/result.json) | 691.1 | 369.5 | 321.6 | +| [spray-bottle](/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline/claude-code/spray-bottle/result.json) | 547.6 | 244.0 | 303.6 | +| [stapler](/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline/claude-code/stapler/result.json) | 617.8 | 380.9 | 236.9 | +| [thermos](/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline/claude-code/thermos/result.json) | 544.6 | 118.7 | 425.9 | +| [toaster](/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline/claude-code/toaster/result.json) | 449.1 | 224.1 | 224.9 | +| [toilet](/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline/claude-code/toilet/result.json) | 581.9 | 331.3 | 250.6 | +| [umbrella](/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline/claude-code/umbrella/result.json) | 609.8 | 178.8 | 431.1 | +| [washing-machine](/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline/claude-code/washing-machine/result.json) | 817.2 | 219.0 | 598.2 | +| [websocket](/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline/claude-code/websocket/result.json) | 575.1 | 209.5 | 365.6 | +| [zipper](/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline/claude-code/zipper/result.json) | 407.8 | 234.1 | 173.6 | + + +Thermos lacks the prototype browser boundary, so it remains in the 15-case **total** comparison but is excluded from the **14-case phase** comparison below. Both columns use exactly the same 14 topics and recomputed marker rules. + +| Same 14 cases | Send → tool | Tool → write | Write → check | Check/revise → publish | Publish → visible | Total mean | +|---|---:|---:|---:|---:|---:|---:| +| Baseline | 10.0 | 334.8 | 62.1 | 133.3 | 13.0 | 553.2 | +| Prototype | 9.4 | 162.3 | 10.2 | 64.0 | 11.4 | 257.3 | + + +For those 14, first-tool-to-browser work falls from 396.8s to 172.5s; checking/revising falls from 133.3s to 64.0s. Publish-to-visible remains roughly 11–13s. Most of the observed improvement precedes publication. These are descriptive paired observations on a shared host, not a controlled causal estimate of wording alone. + +The four baseline infrastructure cases—notification settings, narrow toggle, DNS and database index—have no comparable agent-generation trace. Their 900s scores remain in the baseline gate, but are not treated as 900s of Claude work. Baseline seat belt has publication evidence but no visible-card proof and a 900s cap; it is also excluded from the matched-visible set. All five now have visible prototype results and remain in the full-20 table. Original classifications and source hashes are retained in JSON. + +## Reading and self-verification evidence + +The 17 complete-phase figures all read the bundled dial-indicator source; exact read rows are indexed in JSON. The other three do not show that example read. Across all 20 runs, the broad read/setup category has a median 9.5 calls and 4.3s of union observed tool envelopes. This category includes skill loading, lists, copies, reference/API reads and read-only CLI calls. Interpretation and generation between tools are outside those envelopes; these figures do not mean Claude spent only four seconds reading. + +Concrete remaining costs, linked to the retained timelines: + +- [Door lock](/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype/claude-code/door-lock/timeline.json) makes 17 read/setup calls, repeatedly searches the parameter API, and reads installed `controls.ts` at 76s; its first source write is at 195s. The 111s largest gap has no causal attribution. [Washing machine](/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype/claude-code/washing-machine/timeline.json) now writes at 158s versus 607s in baseline and is visible at 219s versus 817s. +- [Refrigerator](/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype/claude-code/refrigerator/timeline.json) has a 180s check/revise envelope. Its command at 216.1s occupies a 120.4s tool envelope; the output explicitly says it hit the 120s timeout and moved to the background. A repeat at 344.3s finishes in 9.1s. The compound command contains a bare `cat > /tmp/fr-actions.json` before its actions heredoc, but the retained trace does not prove which subcommand blocked. This is a concrete tool/wait anomaly, not an inferred 120s model-thinking delay. +- [Load balancer](/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype/claude-code/load-balancer/timeline.json) spends 133s checking/revising. Two compound browser-check envelopes last 48.9s and 45.6s; their action scripts explicitly wait 20s and 40s to observe simulation behavior. The latter runs multiple checks in parallel inside the originating command; the report uses wall-clock union, not summed browser durations. +- [Stapler](/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype/claude-code/stapler/timeline.json) first writes at 269s and starts checking at 278s, then revises detail geometry and labels before publishing at 370s; visible at 381s. [Seat belt](/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype/claude-code/seat-belt/timeline.json) invokes browser checks in seven work rows and revises geometry/viewpoint before publication; visible at 317s. These are repeated pre-delivery craft/check loops still present in quick mode. +- The [CDN](/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype/claude-code/cdn/timeline.json) result remains the original first pilot observation: 30s before first tool, write at 196s, check at 201s, publish at 219s, visible at 243s. CLI parameter changes and another browser check occur inside that final envelope. Pump/CDN are included once in the full set, not rerun or counted twice. + +The evidence still points to reducing the pre-publication design/generation surface, repeated API discovery and self-check loops. It does not justify assigning the unattributed gaps to CPU saturation, model reasoning or network/CDN delay. Plugin source and execution conditions remain those in [baseline manifest](/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline/manifest.json), [prototype manifest](/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype/manifest.json) and [conditions](/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/conditions.json); the prototype also includes R2 control changes. This timing report makes no new live-control claim and does not alter baseline, pilot or saved-replay evidence. diff --git a/plugins/playgrounds/evals/launch/reports/gate-1/claude-timing-analysis.json b/plugins/playgrounds/evals/launch/reports/gate-1/claude-timing-analysis.json new file mode 100644 index 000000000..c02015446 --- /dev/null +++ b/plugins/playgrounds/evals/launch/reports/gate-1/claude-timing-analysis.json @@ -0,0 +1,1972 @@ +{ + "generatedAt": "2026-10-20T03:57:15.197549+00:00", + "baselineVisible": { + "n": 15, + "median": { + "visibleSeconds": 547.618, + "observedToolSpanUnionSeconds": 61.468, + "unattributedSeconds": 495.4680000000001, + "toolCount": 32 + }, + "meanPhasesSeconds": { + "dispatch_to_first_tool": 9.949666666666667, + "read_design_generation_before_first_write": 334.0672, + "write_build_to_first_browser_check": 67.30853333333333, + "self_verify_revise_to_publish": 128.36333333333334, + "publish_command_to_visible_or_cap": 12.978133333333334 + }, + "medianPhasesSeconds": { + "dispatch_to_first_tool": 8.882, + "read_design_generation_before_first_write": 345.618, + "write_build_to_first_browser_check": 16.29, + "self_verify_revise_to_publish": 125.928, + "publish_command_to_visible_or_cap": 12.78 + } + }, + "pilot": { + "n": 2, + "median": { + "visibleSeconds": 240.725, + "observedToolSpanUnionSeconds": 31.0425, + "unattributedSeconds": 209.6825, + "toolCount": 17.5 + }, + "meanPhasesSeconds": { + "dispatch_to_first_tool": 19.445500000000003, + "read_design_generation_before_first_write": 157.2695, + "write_build_to_first_browser_check": 5.17, + "self_verify_revise_to_publish": 36.969, + "publish_command_to_visible_or_cap": 21.871000000000002 + }, + "medianPhasesSeconds": { + "dispatch_to_first_tool": 19.445500000000003, + "read_design_generation_before_first_write": 157.2695, + "write_build_to_first_browser_check": 5.17, + "self_verify_revise_to_publish": 36.969, + "publish_command_to_visible_or_cap": 21.871000000000002 + } + }, + "runs": [ + { + "label": "baseline", + "prompt": "bicycle-pump", + "threadId": "thr_56zs5u74me", + "model": "claude-opus-5-5", + "classification": "visible_card", + "sentAt": 1792450604852, + "endpointMs": 1792451126399, + "observedSeconds": 521.547, + "scoreSeconds": 521.547, + "visibleSeconds": 521.547, + "actualWallSeconds": 521.802, + "error": null, + "markers": { + "firstTool": { + "id": "thr_56zs5u74me:tool:da042aafe5-i2", + "startMs": 1792450610987, + "endMs": 1792450610987, + "startSeconds": 6.135, + "category": "read_setup" + }, + "firstArtifactWrite": { + "id": "thr_56zs5u74me:command:da042aafe5-i30", + "startMs": 1792450747358, + "endMs": 1792450747986, + "startSeconds": 142.506, + "category": "build" + }, + "firstBrowserVerification": { + "id": "thr_56zs5u74me:command:da042aafe5-i39", + "startMs": 1792450998959, + "endMs": 1792451003672, + "startSeconds": 394.107, + "category": "verify" + }, + "firstPublishCommand": { + "id": "thr_56zs5u74me:command:da042aafe5-i66", + "startMs": 1792451110539, + "endMs": 1792451111433, + "startSeconds": 505.687, + "category": "publish" + } + }, + "phasesSeconds": { + "dispatch_to_first_tool": 6.135, + "read_design_generation_before_first_write": 136.371, + "write_build_to_first_browser_check": 251.601, + "self_verify_revise_to_publish": 111.58, + "publish_command_to_visible_or_cap": 15.86 + }, + "toolCount": 33, + "observedToolSpanUnionSeconds": 54.315, + "unattributedSeconds": 467.232, + "categories": { + "build": { + "calls": 3, + "observedSpanSeconds": 1.726 + }, + "inspect_screenshot": { + "calls": 4, + "observedSpanSeconds": 0.269 + }, + "publish": { + "calls": 1, + "observedSpanSeconds": 0.894 + }, + "read_setup": { + "calls": 19, + "observedSpanSeconds": 15.362 + }, + "verify": { + "calls": 3, + "observedSpanSeconds": 18.234 + }, + "verify_mixed": { + "calls": 3, + "observedSpanSeconds": 17.83 + } + }, + "infrastructureEvents": [ + { + "sequence": 973, + "type": "system/thread/interrupted", + "createdAt": 1792451126733, + "data": { + "reason": "manual-stop" + } + } + ], + "firstPublishOutputExcerpt": "::playground{id=\"1c38e956-390d-4f42-a4de-1d2908641649\"}", + "sources": [ + { + "path": ".launch/results/baseline/claude-code/bicycle-pump/result.json", + "sha256": "8dde69ce92b51c5f0891112587e55939c26b86ea6685035f6b4074ac7487ba2e" + }, + { + "path": ".launch/results/baseline/claude-code/bicycle-pump/timeline.json", + "sha256": "98fc4e5f02579466b2478165fee371c055f1adbaaa7d4ee1bcef77671d7faec0" + } + ] + }, + { + "label": "baseline", + "prompt": "cdn", + "threadId": "thr_txgewajj25", + "model": "claude-opus-5-5", + "classification": "visible_card", + "sentAt": 1792451135190, + "endpointMs": 1792451582225, + "observedSeconds": 447.035, + "scoreSeconds": 447.035, + "visibleSeconds": 447.035, + "actualWallSeconds": 447.199, + "error": null, + "markers": { + "firstTool": { + "id": "thr_txgewajj25:tool:da610a9727-i2", + "startMs": 1792451145409, + "endMs": 1792451145427, + "startSeconds": 10.219, + "category": "read_setup" + }, + "firstArtifactWrite": { + "id": "thr_txgewajj25:file-edit:da610a9727-i44:/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/data/plugins/environment-personal-workspace/host-data/workspaces/thr_txgewajj25/.how-it-works/examples/cdn-purge/build.mjs:file-change:0", + "startMs": 1792451491027, + "endMs": 1792451491117, + "startSeconds": 355.837, + "category": "build" + }, + "firstBrowserVerification": { + "id": "thr_txgewajj25:command:da610a9727-i47", + "startMs": 1792451502014, + "endMs": 1792451513733, + "startSeconds": 366.824, + "category": "verify" + }, + "firstPublishCommand": { + "id": "thr_txgewajj25:command:da610a9727-i62", + "startMs": 1792451567220, + "endMs": 1792451567976, + "startSeconds": 432.03, + "category": "publish" + } + }, + "phasesSeconds": { + "dispatch_to_first_tool": 10.219, + "read_design_generation_before_first_write": 345.618, + "write_build_to_first_browser_check": 10.987, + "self_verify_revise_to_publish": 65.206, + "publish_command_to_visible_or_cap": 15.005 + }, + "toolCount": 35, + "observedToolSpanUnionSeconds": 72.721, + "unattributedSeconds": 374.314, + "categories": { + "build": { + "calls": 2, + "observedSpanSeconds": 0.616 + }, + "inspect_screenshot": { + "calls": 3, + "observedSpanSeconds": 0.164 + }, + "publish": { + "calls": 1, + "observedSpanSeconds": 0.756 + }, + "read_setup": { + "calls": 18, + "observedSpanSeconds": 22.926 + }, + "verify": { + "calls": 1, + "observedSpanSeconds": 11.719 + }, + "verify_mixed": { + "calls": 2, + "observedSpanSeconds": 14.382 + }, + "web_research": { + "calls": 8, + "observedSpanSeconds": 22.158 + } + }, + "infrastructureEvents": [ + { + "sequence": 634, + "type": "system/thread/interrupted", + "createdAt": 1792451582453, + "data": { + "reason": "manual-stop" + } + } + ], + "firstPublishOutputExcerpt": "::playground{id=\"2eb15439-66ef-466e-b65a-53c7699e6048\"}", + "sources": [ + { + "path": ".launch/results/baseline/claude-code/cdn/result.json", + "sha256": "40dd621119d10e6e8dbac152c84ca17c1bfbb83caf550072796fd9970a79b265" + }, + { + "path": ".launch/results/baseline/claude-code/cdn/timeline.json", + "sha256": "1253a77c4d52fc2bb840f278d6e4125bfd30291b5eb8bcd9e45bc99fcde2af04" + } + ] + }, + { + "label": "baseline", + "prompt": "database-index", + "threadId": "thr_mnfizd4zef", + "model": null, + "classification": "infrastructure_failure", + "sentAt": 1792459223008, + "endpointMs": 1792459341812, + "observedSeconds": 118.804, + "scoreSeconds": 900.0, + "visibleSeconds": null, + "actualWallSeconds": 118.804, + "error": "TimeoutError: The operation was aborted due to timeout", + "markers": { + "firstTool": null, + "firstArtifactWrite": null, + "firstBrowserVerification": null, + "firstPublishCommand": null + }, + "phasesSeconds": {}, + "toolCount": 0, + "observedToolSpanUnionSeconds": 0.0, + "unattributedSeconds": 118.804, + "categories": {}, + "infrastructureEvents": [ + { + "sequence": 9, + "type": "system/error", + "createdAt": 1792459342031, + "data": { + "code": "thread_provisioning_failed", + "message": "Provisioning thread failed", + "detail": "Timed out waiting for command result" + } + } + ], + "firstPublishOutputExcerpt": "", + "sources": [ + { + "path": ".launch/results/baseline/claude-code/database-index/result.json", + "sha256": "04d1704b5e861105862532da14422ee47fdf8ec2101e5ad5fcd951f78bf64c80" + } + ] + }, + { + "label": "baseline", + "prompt": "dns", + "threadId": "thr_vt6h3d6kty", + "model": null, + "classification": "infrastructure_failure", + "sentAt": 1792459182127, + "endpointMs": 1792459222951, + "observedSeconds": 40.824, + "scoreSeconds": 900.0, + "visibleSeconds": null, + "actualWallSeconds": 40.824, + "error": "TimeoutError: The operation was aborted due to timeout", + "markers": { + "firstTool": null, + "firstArtifactWrite": null, + "firstBrowserVerification": null, + "firstPublishCommand": null + }, + "phasesSeconds": {}, + "toolCount": 0, + "observedToolSpanUnionSeconds": 0.0, + "unattributedSeconds": 40.824, + "categories": {}, + "infrastructureEvents": [ + { + "sequence": 12, + "type": "system/error", + "createdAt": 1792459222761, + "data": { + "code": "thread_command_failed", + "message": "Command thread.start failed", + "detail": "Host is not connected" + } + } + ], + "firstPublishOutputExcerpt": "", + "sources": [ + { + "path": ".launch/results/baseline/claude-code/dns/result.json", + "sha256": "691aa0196720c4b34fdc74edc848cf28507ef337f5b0b81ef0b3f11dcd4df110" + } + ] + }, + { + "label": "baseline", + "prompt": "door-lock", + "threadId": "thr_v9jwghm8md", + "model": "claude-opus-5-5", + "classification": "visible_card", + "sentAt": 1792454299840, + "endpointMs": 1792454967760, + "observedSeconds": 667.92, + "scoreSeconds": 667.92, + "visibleSeconds": 667.92, + "actualWallSeconds": 668.09, + "error": null, + "markers": { + "firstTool": { + "id": "thr_v9jwghm8md:tool:da414c783b-i2", + "startMs": 1792454309056, + "endMs": 1792454309056, + "startSeconds": 9.216, + "category": "read_setup" + }, + "firstArtifactWrite": { + "id": "thr_v9jwghm8md:file-edit:da414c783b-i28:/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/data/plugins/environment-personal-workspace/host-data/workspaces/thr_v9jwghm8md/.how-it-works/examples/pin-tumbler/build.mjs:file-change:0", + "startMs": 1792454721159, + "endMs": 1792454721280, + "startSeconds": 421.319, + "category": "build" + }, + "firstBrowserVerification": { + "id": "thr_v9jwghm8md:command:da414c783b-i33", + "startMs": 1792454738370, + "endMs": 1792454755492, + "startSeconds": 438.53, + "category": "verify" + }, + "firstPublishCommand": { + "id": "thr_v9jwghm8md:command:da414c783b-i69", + "startMs": 1792454957938, + "endMs": 1792454958629, + "startSeconds": 658.098, + "category": "publish" + } + }, + "phasesSeconds": { + "dispatch_to_first_tool": 9.216, + "read_design_generation_before_first_write": 412.103, + "write_build_to_first_browser_check": 17.211, + "self_verify_revise_to_publish": 219.568, + "publish_command_to_visible_or_cap": 9.822 + }, + "toolCount": 33, + "observedToolSpanUnionSeconds": 118.145, + "unattributedSeconds": 549.775, + "categories": { + "build": { + "calls": 4, + "observedSpanSeconds": 2.027 + }, + "inspect_screenshot": { + "calls": 7, + "observedSpanSeconds": 0.569 + }, + "publish": { + "calls": 1, + "observedSpanSeconds": 0.691 + }, + "read_setup": { + "calls": 14, + "observedSpanSeconds": 4.998 + }, + "verify": { + "calls": 4, + "observedSpanSeconds": 43.1 + }, + "verify_mixed": { + "calls": 3, + "observedSpanSeconds": 66.76 + } + }, + "infrastructureEvents": [], + "firstPublishOutputExcerpt": "::playground{id=\"5c5a31e0-29a7-4e04-b8dd-6ec081070ff4\"}", + "sources": [ + { + "path": ".launch/results/baseline/claude-code/door-lock/result.json", + "sha256": "8bb083098e0b5b37622f33beed644aa182cb3cf3a4b8194cc333caeceb8bd773" + }, + { + "path": ".launch/results/baseline/claude-code/door-lock/timeline.json", + "sha256": "c485252a4e7828a27c2d9c28014f7a1e73a4e16d05e103430ea8b111f534efab" + } + ] + }, + { + "label": "baseline", + "prompt": "git-merge", + "threadId": "thr_2vpryj2idq", + "model": "claude-opus-5-5", + "classification": "visible_card", + "sentAt": 1792462039040, + "endpointMs": 1792462509712, + "observedSeconds": 470.672, + "scoreSeconds": 470.672, + "visibleSeconds": 470.672, + "actualWallSeconds": 470.847, + "error": null, + "markers": { + "firstTool": { + "id": "thr_2vpryj2idq:tool:dae24f5918-i2", + "startMs": 1792462047922, + "endMs": 1792462047922, + "startSeconds": 8.882, + "category": "read_setup" + }, + "firstArtifactWrite": { + "id": "thr_2vpryj2idq:file-edit:dae24f5918-i28:/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/data/plugins/environment-personal-workspace/host-data/workspaces/thr_2vpryj2idq/.how-it-works/examples/git-merge/build.mjs:file-change:0", + "startMs": 1792462359877, + "endMs": 1792462359913, + "startSeconds": 320.837, + "category": "build" + }, + "firstBrowserVerification": { + "id": "thr_2vpryj2idq:command:dae24f5918-i32", + "startMs": 1792462374889, + "endMs": 1792462384808, + "startSeconds": 335.849, + "category": "verify" + }, + "firstPublishCommand": { + "id": "thr_2vpryj2idq:command:dae24f5918-i54", + "startMs": 1792462500817, + "endMs": 1792462501478, + "startSeconds": 461.777, + "category": "publish" + } + }, + "phasesSeconds": { + "dispatch_to_first_tool": 8.882, + "read_design_generation_before_first_write": 311.955, + "write_build_to_first_browser_check": 15.012, + "self_verify_revise_to_publish": 125.928, + "publish_command_to_visible_or_cap": 8.895 + }, + "toolCount": 28, + "observedToolSpanUnionSeconds": 52.925, + "unattributedSeconds": 417.747, + "categories": { + "build": { + "calls": 2, + "observedSpanSeconds": 0.856 + }, + "inspect_screenshot": { + "calls": 5, + "observedSpanSeconds": 0.312 + }, + "publish": { + "calls": 1, + "observedSpanSeconds": 0.661 + }, + "read_setup": { + "calls": 16, + "observedSpanSeconds": 5.59 + }, + "verify": { + "calls": 2, + "observedSpanSeconds": 23.058 + }, + "verify_mixed": { + "calls": 2, + "observedSpanSeconds": 22.448 + } + }, + "infrastructureEvents": [], + "firstPublishOutputExcerpt": "::playground{id=\"88f2b93e-41e9-464a-b8b4-071b55250342\"}", + "sources": [ + { + "path": ".launch/results/baseline/claude-code/git-merge/result.json", + "sha256": "8851bb178c13d80d2a4f53176a50795ff65a55fab87ad631d8b5cc66a6fb3233" + }, + { + "path": ".launch/results/baseline/claude-code/git-merge/timeline.json", + "sha256": "bd6229cbc425da82aa0f7fce8e7d23d0b00d7d23ce61fec35a3495289863a572" + } + ] + }, + { + "label": "baseline", + "prompt": "load-balancer", + "threadId": "thr_u4yhkzb5a8", + "model": "claude-opus-5-5", + "classification": "visible_card", + "sentAt": 1792463131962, + "endpointMs": 1792463472753, + "observedSeconds": 340.791, + "scoreSeconds": 340.791, + "visibleSeconds": 340.791, + "actualWallSeconds": 340.976, + "error": null, + "markers": { + "firstTool": { + "id": "thr_u4yhkzb5a8:tool:daf301985c-i2", + "startMs": 1792463138422, + "endMs": 1792463138422, + "startSeconds": 6.46, + "category": "read_setup" + }, + "firstArtifactWrite": { + "id": "thr_u4yhkzb5a8:file-edit:daf301985c-i32:/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/data/plugins/environment-personal-workspace/host-data/workspaces/thr_u4yhkzb5a8/.how-it-works/examples/load-balancer/build.mjs:file-change:0", + "startMs": 1792463381050, + "endMs": 1792463381098, + "startSeconds": 249.088, + "category": "build" + }, + "firstBrowserVerification": { + "id": "thr_u4yhkzb5a8:command:daf301985c-i35", + "startMs": 1792463388050, + "endMs": 1792463396885, + "startSeconds": 256.088, + "category": "verify" + }, + "firstPublishCommand": { + "id": "thr_u4yhkzb5a8:command:daf301985c-i48", + "startMs": 1792463462116, + "endMs": 1792463462775, + "startSeconds": 330.154, + "category": "publish" + } + }, + "phasesSeconds": { + "dispatch_to_first_tool": 6.46, + "read_design_generation_before_first_write": 242.628, + "write_build_to_first_browser_check": 7.0, + "self_verify_revise_to_publish": 74.066, + "publish_command_to_visible_or_cap": 10.637 + }, + "toolCount": 27, + "observedToolSpanUnionSeconds": 55.65, + "unattributedSeconds": 285.141, + "categories": { + "build": { + "calls": 2, + "observedSpanSeconds": 0.565 + }, + "inspect_screenshot": { + "calls": 3, + "observedSpanSeconds": 0.118 + }, + "publish": { + "calls": 1, + "observedSpanSeconds": 0.659 + }, + "read_setup": { + "calls": 18, + "observedSpanSeconds": 7.117 + }, + "verify": { + "calls": 2, + "observedSpanSeconds": 27.478 + }, + "verify_mixed": { + "calls": 1, + "observedSpanSeconds": 19.713 + } + }, + "infrastructureEvents": [ + { + "sequence": 410, + "type": "system/thread/interrupted", + "createdAt": 1792463472994, + "data": { + "reason": "manual-stop" + } + } + ], + "firstPublishOutputExcerpt": "::playground{id=\"1146c6b1-132f-4beb-9334-c92095e6b774\"}", + "sources": [ + { + "path": ".launch/results/baseline/claude-code/load-balancer/result.json", + "sha256": "29f43ace05c0dd9a66fd2d1dd7aa332bf5b2109b4414b4b6ce333690e2be1198" + }, + { + "path": ".launch/results/baseline/claude-code/load-balancer/timeline.json", + "sha256": "82dc2fa8ae2ae1f9ec7122293a7b57d3b8c2d0d9285c1da0aacc3f3d6dfafc47" + } + ] + }, + { + "label": "baseline", + "prompt": "narrow-toggle", + "threadId": "thr_3dwahvkmkp", + "model": null, + "classification": "infrastructure_failure", + "sentAt": 1792459153882, + "endpointMs": 1792459181918, + "observedSeconds": 28.036, + "scoreSeconds": 900.0, + "visibleSeconds": null, + "actualWallSeconds": 28.036, + "error": "TypeError: fetch failed", + "markers": { + "firstTool": null, + "firstArtifactWrite": null, + "firstBrowserVerification": null, + "firstPublishCommand": null + }, + "phasesSeconds": {}, + "toolCount": 0, + "observedToolSpanUnionSeconds": 0.0, + "unattributedSeconds": 28.036, + "categories": {}, + "infrastructureEvents": [ + { + "sequence": 8, + "type": "system/thread/interrupted", + "createdAt": 1792459181876, + "data": { + "reason": "manual-stop" + } + } + ], + "firstPublishOutputExcerpt": "", + "sources": [ + { + "path": ".launch/results/baseline/claude-code/narrow-toggle/result.json", + "sha256": "806911068e27f93dbf734c77250787a1b3c566db75c1f9f8f2484c740b9de1a7" + } + ] + }, + { + "label": "baseline", + "prompt": "notification-settings", + "threadId": null, + "model": null, + "classification": "infrastructure_failure", + "sentAt": 1792459128522, + "endpointMs": 1792459153571, + "observedSeconds": 25.049, + "scoreSeconds": 900.0, + "visibleSeconds": null, + "actualWallSeconds": 25.049, + "error": "Error: POST /threads: 502 {\"code\":\"dispatch_hook_failed\",\"message\":\"The \\\"concurrency-limit\\\" plugin's message.dispatch hook failed: did not decide within 10000ms\",\"details\":{\"pluginId\":\"concurrency-limit\"}}", + "markers": { + "firstTool": null, + "firstArtifactWrite": null, + "firstBrowserVerification": null, + "firstPublishCommand": null + }, + "phasesSeconds": {}, + "toolCount": 0, + "observedToolSpanUnionSeconds": 0.0, + "unattributedSeconds": 25.049, + "categories": {}, + "infrastructureEvents": [], + "firstPublishOutputExcerpt": "", + "sources": [ + { + "path": ".launch/results/baseline/claude-code/notification-settings/result.json", + "sha256": "098c6bc150c37f5c669e1df5ca6d2c9c2a4c2bb90d632fc87ae702e92f2d3df1" + } + ] + }, + { + "label": "baseline", + "prompt": "refrigerator", + "threadId": "thr_mczrxpv37u", + "model": "claude-opus-5-5", + "classification": "visible_card", + "sentAt": 1792454976372, + "endpointMs": 1792455667430, + "observedSeconds": 691.058, + "scoreSeconds": 691.058, + "visibleSeconds": 691.058, + "actualWallSeconds": 691.25, + "error": null, + "markers": { + "firstTool": { + "id": "thr_mczrxpv37u:tool:da3afdfe18-i2", + "startMs": 1792454985440, + "endMs": 1792454985440, + "startSeconds": 9.068, + "category": "read_setup" + }, + "firstArtifactWrite": { + "id": "thr_mczrxpv37u:command:da3afdfe18-i25", + "startMs": 1792455362657, + "endMs": 1792455362967, + "startSeconds": 386.285, + "category": "build" + }, + "firstBrowserVerification": { + "id": "thr_mczrxpv37u:command:da3afdfe18-i30", + "startMs": 1792455512396, + "endMs": 1792455515956, + "startSeconds": 536.024, + "category": "verify" + }, + "firstPublishCommand": { + "id": "thr_mczrxpv37u:command:da3afdfe18-i51", + "startMs": 1792455642787, + "endMs": 1792455650232, + "startSeconds": 666.415, + "category": "publish_mixed" + } + }, + "phasesSeconds": { + "dispatch_to_first_tool": 9.068, + "read_design_generation_before_first_write": 377.217, + "write_build_to_first_browser_check": 149.739, + "self_verify_revise_to_publish": 130.391, + "publish_command_to_visible_or_cap": 24.643 + }, + "toolCount": 27, + "observedToolSpanUnionSeconds": 46.652, + "unattributedSeconds": 644.406, + "categories": { + "build": { + "calls": 3, + "observedSpanSeconds": 0.9 + }, + "inspect_screenshot": { + "calls": 5, + "observedSpanSeconds": 0.162 + }, + "publish_mixed": { + "calls": 1, + "observedSpanSeconds": 7.445 + }, + "read_setup": { + "calls": 14, + "observedSpanSeconds": 16.605 + }, + "verify": { + "calls": 2, + "observedSpanSeconds": 7.235 + }, + "verify_mixed": { + "calls": 2, + "observedSpanSeconds": 14.305 + } + }, + "infrastructureEvents": [ + { + "sequence": 1294, + "type": "system/thread/interrupted", + "createdAt": 1792455667698, + "data": { + "reason": "manual-stop" + } + } + ], + "firstPublishOutputExcerpt": "wrote fridge.html\nwrote fridge-light.html\nline ends: 0 of 472 ends on 77 lines float\nconsole: clean\nclip 16,64 358x474 \u00b7 readout \"3.6 \u00b0C inside \u00b7 compressor on\" \u00b7 scrolls sideways: no\nconsole: clean\n::playground{id=\"cb08a4d7-55ab-4bc2-939c-6ddc963af5c3\"}", + "sources": [ + { + "path": ".launch/results/baseline/claude-code/refrigerator/result.json", + "sha256": "be90ba53e0e4f879efc1cfcc779118e01d3486a11c72797cd6416a9f8aafece1" + }, + { + "path": ".launch/results/baseline/claude-code/refrigerator/timeline.json", + "sha256": "b6c30f00676f71823278da07700be4856d17887b3a5fc9144306a1380c0bd8f0" + } + ] + }, + { + "label": "baseline", + "prompt": "seat-belt", + "threadId": "thr_mrexqzb2vm", + "model": "claude-opus-5-5", + "classification": "capped_no_visible_card", + "sentAt": 1792456891142, + "endpointMs": 1792457791142, + "observedSeconds": 900.0, + "scoreSeconds": 900.0, + "visibleSeconds": null, + "actualWallSeconds": 920.125, + "error": "No loaded, visibly rendered card before cap (or browser proof failed)", + "markers": { + "firstTool": { + "id": "thr_mrexqzb2vm:tool:dac22f0203-i2", + "startMs": 1792456899322, + "endMs": 1792456899322, + "startSeconds": 8.18, + "category": "read_setup" + }, + "firstArtifactWrite": { + "id": "thr_mrexqzb2vm:command:dac22f0203-i43", + "startMs": 1792457348181, + "endMs": 1792457348719, + "startSeconds": 457.039, + "category": "build" + }, + "firstBrowserVerification": { + "id": "thr_mrexqzb2vm:command:dac22f0203-i47", + "startMs": 1792457481946, + "endMs": 1792457485527, + "startSeconds": 590.804, + "category": "verify_mixed" + }, + "firstPublishCommand": { + "id": "thr_mrexqzb2vm:command:dac22f0203-i85", + "startMs": 1792457681244, + "endMs": 1792457685183, + "startSeconds": 790.102, + "category": "publish_mixed" + } + }, + "phasesSeconds": { + "dispatch_to_first_tool": 8.18, + "read_design_generation_before_first_write": 448.859, + "write_build_to_first_browser_check": 133.765, + "self_verify_revise_to_publish": 199.298, + "publish_command_to_visible_or_cap": 109.898 + }, + "toolCount": 44, + "observedToolSpanUnionSeconds": 137.868, + "unattributedSeconds": 762.1320000000001, + "categories": { + "build": { + "calls": 2, + "observedSpanSeconds": 0.858 + }, + "inspect_screenshot": { + "calls": 7, + "observedSpanSeconds": 0.377 + }, + "publish_mixed": { + "calls": 1, + "observedSpanSeconds": 3.939 + }, + "read_setup": { + "calls": 24, + "observedSpanSeconds": 24.634 + }, + "verify": { + "calls": 4, + "observedSpanSeconds": 50.63 + }, + "verify_mixed": { + "calls": 5, + "observedSpanSeconds": 41.109 + }, + "web_research": { + "calls": 1, + "observedSpanSeconds": 16.321 + } + }, + "infrastructureEvents": [], + "firstPublishOutputExcerpt": "wrote seat-belt.html\nline ends: 0 of 189 ends on 25 lines float\nconsole: clean\n::playground{id=\"f859a59c-b76c-4f15-9241-0b14a2e00ef0\"}", + "sources": [ + { + "path": ".launch/results/baseline/claude-code/seat-belt/result.json", + "sha256": "06f8107d0dbdc071df8e1f7b618ba1301b0486374d3239fb5042d316b075ee3b" + }, + { + "path": ".launch/results/baseline/claude-code/seat-belt/timeline.json", + "sha256": "c13ff82fdf981475ab1727de0a74ef0ae5434add26b2c415f996f109c071a7c5" + } + ] + }, + { + "label": "baseline", + "prompt": "spray-bottle", + "threadId": "thr_saaff7fgjy", + "model": "claude-opus-5-5", + "classification": "visible_card", + "sentAt": 1792456335080, + "endpointMs": 1792456882698, + "observedSeconds": 547.618, + "scoreSeconds": 547.618, + "visibleSeconds": 547.618, + "actualWallSeconds": 547.803, + "error": null, + "markers": { + "firstTool": { + "id": "thr_saaff7fgjy:tool:da948817ab-i2", + "startMs": 1792456345287, + "endMs": 1792456345287, + "startSeconds": 10.207, + "category": "read_setup" + }, + "firstArtifactWrite": { + "id": "thr_saaff7fgjy:file-edit:da948817ab-i30:/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/data/plugins/environment-personal-workspace/host-data/workspaces/thr_saaff7fgjy/.how-it-works/examples/spray-bottle/build.mjs:file-change:0", + "startMs": 1792456723214, + "endMs": 1792456723303, + "startSeconds": 388.134, + "category": "build" + }, + "firstBrowserVerification": { + "id": "thr_saaff7fgjy:command:da948817ab-i37", + "startMs": 1792456739504, + "endMs": 1792456741499, + "startSeconds": 404.424, + "category": "verify" + }, + "firstPublishCommand": { + "id": "thr_saaff7fgjy:command:da948817ab-i72", + "startMs": 1792456869918, + "endMs": 1792456870906, + "startSeconds": 534.838, + "category": "publish" + } + }, + "phasesSeconds": { + "dispatch_to_first_tool": 10.207, + "read_design_generation_before_first_write": 377.927, + "write_build_to_first_browser_check": 16.29, + "self_verify_revise_to_publish": 130.414, + "publish_command_to_visible_or_cap": 12.78 + }, + "toolCount": 38, + "observedToolSpanUnionSeconds": 66.197, + "unattributedSeconds": 481.42100000000005, + "categories": { + "build": { + "calls": 3, + "observedSpanSeconds": 1.508 + }, + "inspect_screenshot": { + "calls": 7, + "observedSpanSeconds": 0.19 + }, + "publish": { + "calls": 1, + "observedSpanSeconds": 0.988 + }, + "read_setup": { + "calls": 18, + "observedSpanSeconds": 21.118 + }, + "verify": { + "calls": 4, + "observedSpanSeconds": 25.542 + }, + "verify_mixed": { + "calls": 3, + "observedSpanSeconds": 14.359 + }, + "web_research": { + "calls": 2, + "observedSpanSeconds": 12.572 + } + }, + "infrastructureEvents": [ + { + "sequence": 1048, + "type": "system/thread/interrupted", + "createdAt": 1792456882940, + "data": { + "reason": "manual-stop" + } + } + ], + "firstPublishOutputExcerpt": "::playground{id=\"8db28966-2d1c-43ed-a852-ec3ab2314034\"}", + "sources": [ + { + "path": ".launch/results/baseline/claude-code/spray-bottle/result.json", + "sha256": "05ccab52159a1bfa2a00f3a53646a595f268f81771e5e2fe3a1cc28f195cae82" + }, + { + "path": ".launch/results/baseline/claude-code/spray-bottle/timeline.json", + "sha256": "345437909086f108c81206eb8389f18ef399213355a1ab1234b26e3bd6a49f7f" + } + ] + }, + { + "label": "baseline", + "prompt": "stapler", + "threadId": "thr_km5bs3fghd", + "model": "claude-opus-5-5", + "classification": "visible_card", + "sentAt": 1792455691073, + "endpointMs": 1792456308898, + "observedSeconds": 617.825, + "scoreSeconds": 617.825, + "visibleSeconds": 617.825, + "actualWallSeconds": 617.986, + "error": null, + "markers": { + "firstTool": { + "id": "thr_km5bs3fghd:tool:da9e1326b8-i2", + "startMs": 1792455700041, + "endMs": 1792455700041, + "startSeconds": 8.968, + "category": "read_setup" + }, + "firstArtifactWrite": { + "id": "thr_km5bs3fghd:file-edit:da9e1326b8-i27:/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/data/plugins/environment-personal-workspace/host-data/workspaces/thr_km5bs3fghd/.how-it-works/examples/stapler/scene.mjs:file-change:0", + "startMs": 1792456046947, + "endMs": 1792456046993, + "startSeconds": 355.874, + "category": "build" + }, + "firstBrowserVerification": { + "id": "thr_km5bs3fghd:command:da9e1326b8-i32", + "startMs": 1792456104621, + "endMs": 1792456110773, + "startSeconds": 413.548, + "category": "verify" + }, + "firstPublishCommand": { + "id": "thr_km5bs3fghd:command:da9e1326b8-i74", + "startMs": 1792456294249, + "endMs": 1792456295121, + "startSeconds": 603.176, + "category": "publish" + } + }, + "phasesSeconds": { + "dispatch_to_first_tool": 8.968, + "read_design_generation_before_first_write": 346.906, + "write_build_to_first_browser_check": 57.674, + "self_verify_revise_to_publish": 189.628, + "publish_command_to_visible_or_cap": 14.649 + }, + "toolCount": 37, + "observedToolSpanUnionSeconds": 60.202, + "unattributedSeconds": 557.623, + "categories": { + "build": { + "calls": 3, + "observedSpanSeconds": 0.56 + }, + "inspect_screenshot": { + "calls": 9, + "observedSpanSeconds": 0.355 + }, + "publish": { + "calls": 1, + "observedSpanSeconds": 0.872 + }, + "read_setup": { + "calls": 15, + "observedSpanSeconds": 6.279 + }, + "verify": { + "calls": 2, + "observedSpanSeconds": 12.667 + }, + "verify_mixed": { + "calls": 7, + "observedSpanSeconds": 39.469 + } + }, + "infrastructureEvents": [], + "firstPublishOutputExcerpt": "::playground{id=\"4ac5e136-c69b-4026-bbf0-3cc50cbcdbfb\"}", + "sources": [ + { + "path": ".launch/results/baseline/claude-code/stapler/result.json", + "sha256": "5291a2719eaacc232488431dff8fea8448e27c733ab233c5832ab3e4a78933e3" + }, + { + "path": ".launch/results/baseline/claude-code/stapler/timeline.json", + "sha256": "cb44f1049f6698a1b69381993df6514eb101910a783c91d0621ea574c2ec6189" + } + ] + }, + { + "label": "baseline", + "prompt": "thermos", + "threadId": "thr_25rwzfxbne", + "model": "claude-opus-5-5", + "classification": "visible_card", + "sentAt": 1792453731642, + "endpointMs": 1792454276282, + "observedSeconds": 544.64, + "scoreSeconds": 544.64, + "visibleSeconds": 544.64, + "actualWallSeconds": 544.867, + "error": null, + "markers": { + "firstTool": { + "id": "thr_25rwzfxbne:tool:dab1b69b3d-i2", + "startMs": 1792453740214, + "endMs": 1792453740214, + "startSeconds": 8.572, + "category": "read_setup" + }, + "firstArtifactWrite": { + "id": "thr_25rwzfxbne:file-edit:dab1b69b3d-i29:/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/data/plugins/environment-personal-workspace/host-data/workspaces/thr_25rwzfxbne/.how-it-works/examples/thermos/model.mjs:file-change:0", + "startMs": 1792454064564, + "endMs": 1792454066831, + "startSeconds": 332.922, + "category": "build" + }, + "firstBrowserVerification": { + "id": "thr_25rwzfxbne:command:dab1b69b3d-i36", + "startMs": 1792454205000, + "endMs": 1792454208749, + "startSeconds": 473.358, + "category": "verify" + }, + "firstPublishCommand": { + "id": "thr_25rwzfxbne:command:dab1b69b3d-i53", + "startMs": 1792454263575, + "endMs": 1792454264361, + "startSeconds": 531.933, + "category": "publish" + } + }, + "phasesSeconds": { + "dispatch_to_first_tool": 8.572, + "read_design_generation_before_first_write": 324.35, + "write_build_to_first_browser_check": 140.436, + "self_verify_revise_to_publish": 58.575, + "publish_command_to_visible_or_cap": 12.707 + }, + "toolCount": 27, + "observedToolSpanUnionSeconds": 33.471, + "unattributedSeconds": 511.169, + "categories": { + "build": { + "calls": 3, + "observedSpanSeconds": 2.797 + }, + "inspect_screenshot": { + "calls": 5, + "observedSpanSeconds": 0.227 + }, + "other": { + "calls": 1, + "observedSpanSeconds": 0.526 + }, + "publish": { + "calls": 1, + "observedSpanSeconds": 0.786 + }, + "read_setup": { + "calls": 13, + "observedSpanSeconds": 4.382 + }, + "verify": { + "calls": 2, + "observedSpanSeconds": 8.817 + }, + "verify_mixed": { + "calls": 1, + "observedSpanSeconds": 8.803 + }, + "web_research": { + "calls": 1, + "observedSpanSeconds": 7.586 + } + }, + "infrastructureEvents": [ + { + "sequence": 937, + "type": "system/thread/interrupted", + "createdAt": 1792454276577, + "data": { + "reason": "manual-stop" + } + } + ], + "firstPublishOutputExcerpt": "::playground{id=\"0393ed27-1822-49f2-a4cd-efdc381bc223\"}", + "sources": [ + { + "path": ".launch/results/baseline/claude-code/thermos/result.json", + "sha256": "94c9bf59e4a47f91aead169d231ca8129cc90093c5715c17f1df2a213b18f709" + }, + { + "path": ".launch/results/baseline/claude-code/thermos/timeline.json", + "sha256": "a4fdd9bc189d6f05dc9562e6354c45a7f08297186f181929c17b353b775643cc" + } + ] + }, + { + "label": "baseline", + "prompt": "toaster", + "threadId": "thr_tpv3gzb7zb", + "model": "claude-opus-5-5", + "classification": "visible_card", + "sentAt": 1792457811775, + "endpointMs": 1792458260851, + "observedSeconds": 449.076, + "scoreSeconds": 449.076, + "visibleSeconds": 449.076, + "actualWallSeconds": 449.228, + "error": null, + "markers": { + "firstTool": { + "id": "thr_tpv3gzb7zb:tool:da9eb85223-i2", + "startMs": 1792457822679, + "endMs": 1792457822679, + "startSeconds": 10.904, + "category": "read_setup" + }, + "firstArtifactWrite": { + "id": "thr_tpv3gzb7zb:file-edit:da9eb85223-i30:/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/data/plugins/environment-personal-workspace/host-data/workspaces/thr_tpv3gzb7zb/.how-it-works/examples/toaster/build.mjs:file-change:0", + "startMs": 1792458165024, + "endMs": 1792458165059, + "startSeconds": 353.249, + "category": "build" + }, + "firstBrowserVerification": { + "id": "thr_tpv3gzb7zb:command:da9eb85223-i33", + "startMs": 1792458175452, + "endMs": 1792458179273, + "startSeconds": 363.677, + "category": "verify" + }, + "firstPublishCommand": { + "id": "thr_tpv3gzb7zb:command:da9eb85223-i48", + "startMs": 1792458248050, + "endMs": 1792458248865, + "startSeconds": 436.275, + "category": "publish" + } + }, + "phasesSeconds": { + "dispatch_to_first_tool": 10.904, + "read_design_generation_before_first_write": 342.345, + "write_build_to_first_browser_check": 10.428, + "self_verify_revise_to_publish": 72.598, + "publish_command_to_visible_or_cap": 12.801 + }, + "toolCount": 25, + "observedToolSpanUnionSeconds": 43.794, + "unattributedSeconds": 405.28200000000004, + "categories": { + "build": { + "calls": 2, + "observedSpanSeconds": 0.663 + }, + "inspect_screenshot": { + "calls": 4, + "observedSpanSeconds": 0.131 + }, + "publish": { + "calls": 1, + "observedSpanSeconds": 0.815 + }, + "read_setup": { + "calls": 14, + "observedSpanSeconds": 6.484 + }, + "verify": { + "calls": 1, + "observedSpanSeconds": 3.821 + }, + "verify_mixed": { + "calls": 2, + "observedSpanSeconds": 25.016 + }, + "web_research": { + "calls": 1, + "observedSpanSeconds": 6.864 + } + }, + "infrastructureEvents": [], + "firstPublishOutputExcerpt": "::playground{id=\"289dc5ae-e757-45e6-9db0-545a13a42fa9\"}", + "sources": [ + { + "path": ".launch/results/baseline/claude-code/toaster/result.json", + "sha256": "1c9d8eef5cc88ab2ab6defe223c4c106f90a89dd87950250ef9f1ddbe57e29e0" + }, + { + "path": ".launch/results/baseline/claude-code/toaster/timeline.json", + "sha256": "3e978aa96fa31e3c994043f74895796c382a59eab9b71e8b3333cfc0817f26bd" + } + ] + }, + { + "label": "baseline", + "prompt": "toilet", + "threadId": "thr_qybj3im32q", + "model": "claude-opus-5-5", + "classification": "visible_card", + "sentAt": 1792453111696, + "endpointMs": 1792453693624, + "observedSeconds": 581.928, + "scoreSeconds": 581.928, + "visibleSeconds": 581.928, + "actualWallSeconds": 582.081, + "error": null, + "markers": { + "firstTool": { + "id": "thr_qybj3im32q:tool:da0ff571db-i2", + "startMs": 1792453119277, + "endMs": 1792453119277, + "startSeconds": 7.581, + "category": "read_setup" + }, + "firstArtifactWrite": { + "id": "thr_qybj3im32q:command:da0ff571db-i18", + "startMs": 1792453291354, + "endMs": 1792453291716, + "startSeconds": 179.658, + "category": "build" + }, + "firstBrowserVerification": { + "id": "thr_qybj3im32q:command:da0ff571db-i30", + "startMs": 1792453579799, + "endMs": 1792453588200, + "startSeconds": 468.103, + "category": "verify" + }, + "firstPublishCommand": { + "id": "thr_qybj3im32q:command:da0ff571db-i56", + "startMs": 1792453685250, + "endMs": 1792453685972, + "startSeconds": 573.554, + "category": "publish_mixed" + } + }, + "phasesSeconds": { + "dispatch_to_first_tool": 7.581, + "read_design_generation_before_first_write": 172.077, + "write_build_to_first_browser_check": 288.445, + "self_verify_revise_to_publish": 105.451, + "publish_command_to_visible_or_cap": 8.374 + }, + "toolCount": 26, + "observedToolSpanUnionSeconds": 70.148, + "unattributedSeconds": 511.78, + "categories": { + "build": { + "calls": 6, + "observedSpanSeconds": 2.256 + }, + "inspect_screenshot": { + "calls": 4, + "observedSpanSeconds": 23.677 + }, + "publish_mixed": { + "calls": 1, + "observedSpanSeconds": 0.722 + }, + "read_setup": { + "calls": 8, + "observedSpanSeconds": 13.33 + }, + "verify": { + "calls": 4, + "observedSpanSeconds": 34.686 + }, + "verify_mixed": { + "calls": 3, + "observedSpanSeconds": 18.892 + } + }, + "infrastructureEvents": [], + "firstPublishOutputExcerpt": "Mon Oct 19 11:48:05 PM UTC 2026\n::playground{id=\"25762c88-b5b4-417a-b690-cbc64df8ea50\"}", + "sources": [ + { + "path": ".launch/results/baseline/claude-code/toilet/result.json", + "sha256": "bcd6de86fbb82a0995be8b670c844905856ae606e9022afacf1560b987740d90" + }, + { + "path": ".launch/results/baseline/claude-code/toilet/timeline.json", + "sha256": "64f330054ecbd9d5d3e015b67e4ea914b4c2d4295f1207b96015591dbd55bb23" + } + ] + }, + { + "label": "baseline", + "prompt": "umbrella", + "threadId": "thr_kdgr63qmx4", + "model": "claude-opus-5-5", + "classification": "visible_card", + "sentAt": 1792458269840, + "endpointMs": 1792458879674, + "observedSeconds": 609.834, + "scoreSeconds": 609.834, + "visibleSeconds": 609.834, + "actualWallSeconds": 610.232, + "error": null, + "markers": { + "firstTool": { + "id": "thr_kdgr63qmx4:tool:daeeb801fd-i2", + "startMs": 1792458300723, + "endMs": 1792458300723, + "startSeconds": 30.883, + "category": "read_setup" + }, + "firstArtifactWrite": { + "id": "thr_kdgr63qmx4:file-edit:daeeb801fd-i25:/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/data/plugins/environment-personal-workspace/host-data/workspaces/thr_kdgr63qmx4/.how-it-works/examples/umbrella/build.mjs:file-change:0", + "startMs": 1792458686074, + "endMs": 1792458686117, + "startSeconds": 416.234, + "category": "build" + }, + "firstBrowserVerification": { + "id": "thr_kdgr63qmx4:command:daeeb801fd-i31", + "startMs": 1792458703390, + "endMs": 1792458712148, + "startSeconds": 433.55, + "category": "verify" + }, + "firstPublishCommand": { + "id": "thr_kdgr63qmx4:command:daeeb801fd-i64", + "startMs": 1792458863955, + "endMs": 1792458864661, + "startSeconds": 594.115, + "category": "publish" + } + }, + "phasesSeconds": { + "dispatch_to_first_tool": 30.883, + "read_design_generation_before_first_write": 385.351, + "write_build_to_first_browser_check": 17.316, + "self_verify_revise_to_publish": 160.565, + "publish_command_to_visible_or_cap": 15.719 + }, + "toolCount": 32, + "observedToolSpanUnionSeconds": 84.934, + "unattributedSeconds": 524.9, + "categories": { + "build": { + "calls": 2, + "observedSpanSeconds": 0.595 + }, + "inspect_screenshot": { + "calls": 5, + "observedSpanSeconds": 0.177 + }, + "publish": { + "calls": 1, + "observedSpanSeconds": 0.706 + }, + "read_setup": { + "calls": 17, + "observedSpanSeconds": 29.074 + }, + "verify": { + "calls": 3, + "observedSpanSeconds": 18.727 + }, + "verify_mixed": { + "calls": 4, + "observedSpanSeconds": 35.655 + } + }, + "infrastructureEvents": [], + "firstPublishOutputExcerpt": "::playground{id=\"f1ed8eb9-9ae5-4b1a-8baf-49534862b98f\"}", + "sources": [ + { + "path": ".launch/results/baseline/claude-code/umbrella/result.json", + "sha256": "bf6b4c0cd3502008c51f7b98d34b01887cc3918c9706103a8abb1a9a26b51da0" + }, + { + "path": ".launch/results/baseline/claude-code/umbrella/timeline.json", + "sha256": "8c72f27a2f2fe4f0c829d66e5d2776e02b593e002e96bd2394cd881a8b0d46e1" + } + ] + }, + { + "label": "baseline", + "prompt": "washing-machine", + "threadId": "thr_27nd984gw9", + "model": "claude-opus-5-5", + "classification": "visible_card", + "sentAt": 1792451867802, + "endpointMs": 1792452685022, + "observedSeconds": 817.22, + "scoreSeconds": 817.22, + "visibleSeconds": 817.22, + "actualWallSeconds": 817.447, + "error": null, + "markers": { + "firstTool": { + "id": "thr_27nd984gw9:tool:daf16c17af-i2", + "startMs": 1792451873231, + "endMs": 1792451873231, + "startSeconds": 5.429, + "category": "read_setup" + }, + "firstArtifactWrite": { + "id": "thr_27nd984gw9:file-edit:daf16c17af-i44:/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/data/plugins/environment-personal-workspace/host-data/workspaces/thr_27nd984gw9/.how-it-works/examples/washing-machine/build.mjs:file-change:0", + "startMs": 1792452474364, + "endMs": 1792452477052, + "startSeconds": 606.562, + "category": "build" + }, + "firstBrowserVerification": { + "id": "thr_27nd984gw9:command:daf16c17af-i46", + "startMs": 1792452483479, + "endMs": 1792452487534, + "startSeconds": 615.677, + "category": "verify_mixed" + }, + "firstPublishCommand": { + "id": "thr_27nd984gw9:command:daf16c17af-i78", + "startMs": 1792452671976, + "endMs": 1792452672703, + "startSeconds": 804.174, + "category": "publish" + } + }, + "phasesSeconds": { + "dispatch_to_first_tool": 5.429, + "read_design_generation_before_first_write": 601.133, + "write_build_to_first_browser_check": 9.115, + "self_verify_revise_to_publish": 188.497, + "publish_command_to_visible_or_cap": 13.046 + }, + "toolCount": 40, + "observedToolSpanUnionSeconds": 127.586, + "unattributedSeconds": 689.634, + "categories": { + "build": { + "calls": 1, + "observedSpanSeconds": 2.688 + }, + "inspect_screenshot": { + "calls": 5, + "observedSpanSeconds": 0.28 + }, + "publish": { + "calls": 1, + "observedSpanSeconds": 0.727 + }, + "read_setup": { + "calls": 23, + "observedSpanSeconds": 10.948 + }, + "verify": { + "calls": 4, + "observedSpanSeconds": 47.443 + }, + "verify_mixed": { + "calls": 4, + "observedSpanSeconds": 57.463 + }, + "web_research": { + "calls": 2, + "observedSpanSeconds": 8.037 + } + }, + "infrastructureEvents": [ + { + "sequence": 1895, + "type": "system/thread/interrupted", + "createdAt": 1792452685412, + "data": { + "reason": "manual-stop" + } + } + ], + "firstPublishOutputExcerpt": "::playground{id=\"de7574fc-2dd0-430f-bf80-9e10e08567f5\"}", + "sources": [ + { + "path": ".launch/results/baseline/claude-code/washing-machine/result.json", + "sha256": "55aac494a1b176374df4a13ec7b30378094debab60a0d4b858b18d203f35c4c2" + }, + { + "path": ".launch/results/baseline/claude-code/washing-machine/timeline.json", + "sha256": "db6308b66985b21ce9baa198bc012fe3401d26c030754375f408b19bff60ef05" + } + ] + }, + { + "label": "baseline", + "prompt": "websocket", + "threadId": "thr_pztn9rwqje", + "model": "claude-opus-5-5", + "classification": "visible_card", + "sentAt": 1792462526288, + "endpointMs": 1792463101363, + "observedSeconds": 575.075, + "scoreSeconds": 575.075, + "visibleSeconds": 575.075, + "actualWallSeconds": 575.272, + "error": null, + "markers": { + "firstTool": { + "id": "thr_pztn9rwqje:tool:daa2127865-i2", + "startMs": 1792462534438, + "endMs": 1792462534438, + "startSeconds": 8.15, + "category": "read_setup" + }, + "firstArtifactWrite": { + "id": "thr_pztn9rwqje:file-edit:daa2127865-i27:/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/data/plugins/environment-personal-workspace/host-data/workspaces/thr_pztn9rwqje/.how-it-works/figures/websocket/build.mjs:file-change:0", + "startMs": 1792462898080, + "endMs": 1792462898133, + "startSeconds": 371.792, + "category": "build" + }, + "firstBrowserVerification": { + "id": "thr_pztn9rwqje:command:daa2127865-i29", + "startMs": 1792462906381, + "endMs": 1792462909963, + "startSeconds": 380.093, + "category": "verify_mixed" + }, + "firstPublishCommand": { + "id": "thr_pztn9rwqje:command:daa2127865-i65", + "startMs": 1792463089095, + "endMs": 1792463089971, + "startSeconds": 562.807, + "category": "publish" + } + }, + "phasesSeconds": { + "dispatch_to_first_tool": 8.15, + "read_design_generation_before_first_write": 363.642, + "write_build_to_first_browser_check": 8.301, + "self_verify_revise_to_publish": 182.714, + "publish_command_to_visible_or_cap": 12.268 + }, + "toolCount": 33, + "observedToolSpanUnionSeconds": 79.607, + "unattributedSeconds": 495.4680000000001, + "categories": { + "build": { + "calls": 2, + "observedSpanSeconds": 1.41 + }, + "inspect_screenshot": { + "calls": 7, + "observedSpanSeconds": 0.558 + }, + "publish": { + "calls": 1, + "observedSpanSeconds": 0.876 + }, + "read_setup": { + "calls": 14, + "observedSpanSeconds": 7.662 + }, + "verify": { + "calls": 3, + "observedSpanSeconds": 40.497 + }, + "verify_mixed": { + "calls": 6, + "observedSpanSeconds": 28.78 + } + }, + "infrastructureEvents": [ + { + "sequence": 1137, + "type": "system/thread/interrupted", + "createdAt": 1792463101639, + "data": { + "reason": "manual-stop" + } + } + ], + "firstPublishOutputExcerpt": "::playground{id=\"a9718d52-8bb8-481f-bab9-15f56c29ce15\"}", + "sources": [ + { + "path": ".launch/results/baseline/claude-code/websocket/result.json", + "sha256": "7edf8cad8249cb01800d9573265a1c5950bdad36beee6c455d5a6eade94a8171" + }, + { + "path": ".launch/results/baseline/claude-code/websocket/timeline.json", + "sha256": "fd9ab2cba0c2b41a0848905a80c8b2894496dd66ead752ca098b3a1d108b9669" + } + ] + }, + { + "label": "baseline", + "prompt": "zipper", + "threadId": "thr_f6yyf5fxa4", + "model": "claude-opus-5-5", + "classification": "visible_card", + "sentAt": 1792452695421, + "endpointMs": 1792453103185, + "observedSeconds": 407.764, + "scoreSeconds": 407.764, + "visibleSeconds": 407.764, + "actualWallSeconds": 407.945, + "error": null, + "markers": { + "firstTool": { + "id": "thr_f6yyf5fxa4:tool:da2fb7df2b-i2", + "startMs": 1792452703992, + "endMs": 1792452703992, + "startSeconds": 8.571, + "category": "read_setup" + }, + "firstArtifactWrite": { + "id": "thr_f6yyf5fxa4:file-edit:da2fb7df2b-i29:/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/data/plugins/environment-personal-workspace/host-data/workspaces/thr_f6yyf5fxa4/.how-it-works/examples/zipper/build.mjs:file-change:0", + "startMs": 1792452975377, + "endMs": 1792452975487, + "startSeconds": 279.956, + "category": "build" + }, + "firstBrowserVerification": { + "id": "thr_f6yyf5fxa4:command:da2fb7df2b-i31", + "startMs": 1792452985450, + "endMs": 1792452989477, + "startSeconds": 290.029, + "category": "verify_mixed" + }, + "firstPublishCommand": { + "id": "thr_f6yyf5fxa4:command:da2fb7df2b-i57", + "startMs": 1792453095719, + "endMs": 1792453096480, + "startSeconds": 400.298, + "category": "publish" + } + }, + "phasesSeconds": { + "dispatch_to_first_tool": 8.571, + "read_design_generation_before_first_write": 271.385, + "write_build_to_first_browser_check": 10.073, + "self_verify_revise_to_publish": 110.269, + "publish_command_to_visible_or_cap": 7.466 + }, + "toolCount": 29, + "observedToolSpanUnionSeconds": 61.468, + "unattributedSeconds": 346.296, + "categories": { + "build": { + "calls": 1, + "observedSpanSeconds": 0.11 + }, + "inspect_screenshot": { + "calls": 5, + "observedSpanSeconds": 0.223 + }, + "publish": { + "calls": 1, + "observedSpanSeconds": 0.761 + }, + "read_setup": { + "calls": 16, + "observedSpanSeconds": 6.137 + }, + "verify": { + "calls": 2, + "observedSpanSeconds": 20.748 + }, + "verify_mixed": { + "calls": 4, + "observedSpanSeconds": 33.489 + } + }, + "infrastructureEvents": [], + "firstPublishOutputExcerpt": "::playground{id=\"f7c5e581-23a6-437b-8c85-05e3958f2bdc\"}", + "sources": [ + { + "path": ".launch/results/baseline/claude-code/zipper/result.json", + "sha256": "492efa5021fcc0f23233e0a8547bec413e9889a858d9a4f6a4fff00e87c3dd0d" + }, + { + "path": ".launch/results/baseline/claude-code/zipper/timeline.json", + "sha256": "e9fd7279c91bf476e3d64e193596ab58cc1833d007c2454116b9658c8dc81426" + } + ] + }, + { + "label": "prototype", + "prompt": "bicycle-pump", + "threadId": "thr_abm3wsbdua", + "model": "claude-opus-5-5", + "classification": "visible_card", + "sentAt": 1792467241502, + "endpointMs": 1792467479470, + "observedSeconds": 237.968, + "scoreSeconds": 237.968, + "visibleSeconds": 237.968, + "actualWallSeconds": 238.209, + "error": null, + "markers": { + "firstTool": { + "id": "thr_abm3wsbdua:tool:dad523d551-i2", + "startMs": 1792467249959, + "endMs": 1792467249959, + "startSeconds": 8.457, + "category": "read_setup" + }, + "firstArtifactWrite": { + "id": "thr_abm3wsbdua:command:dad523d551-i17", + "startMs": 1792467399275, + "endMs": 1792467399680, + "startSeconds": 157.773, + "category": "build" + }, + "firstBrowserVerification": { + "id": "thr_abm3wsbdua:command:dad523d551-i18", + "startMs": 1792467404319, + "endMs": 1792467419145, + "startSeconds": 162.817, + "category": "verify" + }, + "firstPublishCommand": { + "id": "thr_abm3wsbdua:command:dad523d551-i30", + "startMs": 1792467460429, + "endMs": 1792467472392, + "startSeconds": 218.927, + "category": "publish_mixed" + } + }, + "phasesSeconds": { + "dispatch_to_first_tool": 8.457, + "read_design_generation_before_first_write": 149.316, + "write_build_to_first_browser_check": 5.044, + "self_verify_revise_to_publish": 56.11, + "publish_command_to_visible_or_cap": 19.041 + }, + "toolCount": 15, + "observedToolSpanUnionSeconds": 40.244, + "unattributedSeconds": 197.724, + "categories": { + "build": { + "calls": 1, + "observedSpanSeconds": 0.405 + }, + "inspect_screenshot": { + "calls": 3, + "observedSpanSeconds": 0.19 + }, + "publish_mixed": { + "calls": 1, + "observedSpanSeconds": 11.963 + }, + "read_setup": { + "calls": 8, + "observedSpanSeconds": 3.135 + }, + "verify": { + "calls": 1, + "observedSpanSeconds": 14.826 + }, + "verify_mixed": { + "calls": 1, + "observedSpanSeconds": 9.725 + } + }, + "infrastructureEvents": [], + "firstPublishOutputExcerpt": "wrote floor-pump.html\nshot shots/g.png \u00b7 readout \"barrel 0 psi \u00b7 tire 14.7 psi \u00b7 valve shut\"\nconsole: clean\n::playground{id=\"200cab6e-dda1-4e07-9472-7d396e6062cd\"}", + "sources": [ + { + "path": ".launch/results/prototype/claude-code/bicycle-pump/result.json", + "sha256": "bf1e0f41c72510e459940b15e0c828c415fc91ad711e27440e56d73288e08f0b" + }, + { + "path": ".launch/results/prototype/claude-code/bicycle-pump/timeline.json", + "sha256": "cb0e2969db032235e3fdc6299456bf763e28446995408e10ac277b396658759a" + } + ] + }, + { + "label": "prototype", + "prompt": "cdn", + "threadId": "thr_79h5kedc99", + "model": "claude-opus-5-5", + "classification": "visible_card", + "sentAt": 1792467499812, + "endpointMs": 1792467743294, + "observedSeconds": 243.482, + "scoreSeconds": 243.482, + "visibleSeconds": 243.482, + "actualWallSeconds": 243.833, + "error": null, + "markers": { + "firstTool": { + "id": "thr_79h5kedc99:tool:da42b9c023-i2", + "startMs": 1792467530246, + "endMs": 1792467530246, + "startSeconds": 30.434, + "category": "read_setup" + }, + "firstArtifactWrite": { + "id": "thr_79h5kedc99:file-edit:da42b9c023-i24:/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/data/thread-storage/thr_79h5kedc99/figure-TCPZhW/examples/cdn-purge/build.mjs:file-change:0", + "startMs": 1792467695469, + "endMs": 1792467695509, + "startSeconds": 195.657, + "category": "build" + }, + "firstBrowserVerification": { + "id": "thr_79h5kedc99:command:da42b9c023-i27", + "startMs": 1792467700765, + "endMs": 1792467709331, + "startSeconds": 200.953, + "category": "verify" + }, + "firstPublishCommand": { + "id": "thr_79h5kedc99:command:da42b9c023-i32", + "startMs": 1792467718593, + "endMs": 1792467719305, + "startSeconds": 218.781, + "category": "publish" + } + }, + "phasesSeconds": { + "dispatch_to_first_tool": 30.434, + "read_design_generation_before_first_write": 165.223, + "write_build_to_first_browser_check": 5.296, + "self_verify_revise_to_publish": 17.828, + "publish_command_to_visible_or_cap": 24.701 + }, + "toolCount": 20, + "observedToolSpanUnionSeconds": 21.841, + "unattributedSeconds": 221.641, + "categories": { + "build": { + "calls": 2, + "observedSpanSeconds": 0.449 + }, + "inspect_screenshot": { + "calls": 1, + "observedSpanSeconds": 0.029 + }, + "publish": { + "calls": 1, + "observedSpanSeconds": 0.712 + }, + "read_setup": { + "calls": 14, + "observedSpanSeconds": 8.738 + }, + "verify": { + "calls": 2, + "observedSpanSeconds": 11.913 + } + }, + "infrastructureEvents": [], + "firstPublishOutputExcerpt": "::playground{id=\"0f5a6e5e-3d20-4158-8e1a-a04da922a0d9\"}", + "sources": [ + { + "path": ".launch/results/prototype/claude-code/cdn/result.json", + "sha256": "5e6f73e25e371cfa6dc1bf8030c531a8b6936799709a2eb47c440eae49300fa7" + }, + { + "path": ".launch/results/prototype/claude-code/cdn/timeline.json", + "sha256": "23c701162883d01076b277fdeb880a6333691a4bf4e13fdd837e95cb65dc1448" + } + ] + } + ], + "method": "Work-row start/completion event timestamps are observed envelopes, not CPU timings. File-change completion recovered from read-only events when normalized row omits completedAt. Before-first-write includes reading, design, argument/code generation and unsplit waits. No provider-token-stream clock exists in retained events to disaggregate these. Combined shell commands cannot isolate subcommands. Gaps are not attributed to model thinking or host stalls. End is visible proof, cap for seat-belt, finishedAt for infrastructure failures. Post-visible evaluator control-driving is excluded.", + "exportNote": { + "detail": "Compact phase export; complete work rows and gaps remain in the original linked evidence.", + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/claude-timing-analysis.json", + "sha256": "11acb26b65c013ece7e11666c181222ef91f5b8d67bf493f42759e15a836dc20" + } +} diff --git a/plugins/playgrounds/evals/launch/reports/gate-1/claude-timing-analysis.md b/plugins/playgrounds/evals/launch/reports/gate-1/claude-timing-analysis.md new file mode 100644 index 000000000..0d68162c1 --- /dev/null +++ b/plugins/playgrounds/evals/launch/reports/gate-1/claude-timing-analysis.md @@ -0,0 +1,88 @@ +# Claude launch latency phases + +Retained evidence only; generated 2026-10-20T03:57:15.197549+00:00. All 20 Claude baseline attempts and the first two Claude prototype attempts are included. No reruns, browser sessions or running-pipeline mutations were performed. + +**The ten-minute baseline is mainly pre-publication work.** The official 20-case median remains 9.93 min and p90 15.00 min; four infrastructure failures and one no-visible-card cap contribute five 15-minute scores. Among the 15 attempts with a proven visible card, the median is 9.13 min. These conditional diagnostics do not replace the gate numbers. + +For those 15 visible cards, the **mean** additive breakdown is: 10s to first tool, 401s reading/designing/generating/building before the first browser check, 128s checking/revising, and 13s from the first publish-containing command to the visible card. That is 9.21 min total, with 73% before the first browser check and 23% in checking/revision. Means are used here so the components add; per-phase medians must not be added. + +The two-prompt pilot reduced the matched pump/CDN mean from 8.07 to 4.01 min. Its mean additive breakdown is 19s startup, 162s before the first browser check, 37s checking/revision, and 22s publish-command-to-visible. Both still exceed three minutes. This is a two-topic pilot on a pressured shared host, not a representative percentile or a controlled causal estimate. + +## What the timestamps can prove + +All table durations below are **seconds**, rounded to whole seconds. Original millisecond timestamps, source hashes, every retained work row, raw database completion timestamps and every unattributed interval are in [the JSON analysis](/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/claude-timing-analysis.json). Source links point to immutable per-case results; their sibling `timeline.json` is the event evidence. The script is [`.launch/analyze-claude-timing.py`](/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/analyze-claude-timing.py). + +- **Send → first tool:** runner `sentAt` to the first work-row `startedAt`, including thread provisioning, provider startup and response latency. Median 9s for the 15 visible baseline cards. It is not a pure dispatch-service measurement. +- **Read/design/generation → first write:** first tool to first generated source/model write event. It includes example/skill reads, source/API lookups, research, design, code/tool-argument generation and unknown waits. A file-change event starts after its arguments have been generated, so the preceding minutes cannot honestly be called filesystem read time. All compound commands retain their own start/completion bounds. +- **Write/build → first browser check:** first source write to the first command that actually invokes `capture.mjs`, `drive.mjs` or `lines.mjs` (excluding help). It can contain more generated files, compilation and later reads. A combined write/check command has only one start boundary. +- **Check/revise → publish command:** first browser check to the first command containing `bb playgrounds publish`. Includes screenshot inspection, layout/geometry corrections, further builds and checks, and unattributed gaps. This is agent self-verification, not the external eval's post-visible control tests. +- **Publish command → visible/cap:** start of that command to the real visible-card proof (or cap for seat-belt). A compound command may first rebuild/check; state checks and prose/directive generation may follow publication. This is an envelope, not publish API latency. See each marker's command and end timestamp in JSON. +- **Observed tool spans:** union of work-row start/completion intervals, clipped to the endpoint, with file-change completion recovered from `events` (`item/completed`) where needed. They are wall-clock tool envelopes, not CPU time. Overlapping calls are merged. Commands that hand work into the background can finish before their descendants, so this is not a complete measure of active execution. +- **Unattributed intervals:** everything outside those observed work intervals, including startup, provider generation, reasoning, scheduling, background execution, UI time and host stalls. Across the 15 visible baseline runs, 87.6% of elapsed time is outside observed work spans. The retained events do not distinguish those causes; there is no defensible exact “thinking vs host stall” split. + +## All baseline phase envelopes + +| Case | Send → first tool | Read/design/generation → first write | Write/build → first browser check | Check/revise → publish command | Publish command → visible/cap | Visible / scored | +|---|---:|---:|---:|---:|---:|---:| +| [bicycle-pump](/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline/claude-code/bicycle-pump/result.json) | 6 | 136 | 252 | 112 | 16 | 522 / 522 | +| [cdn](/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline/claude-code/cdn/result.json) | 10 | 346 | 11 | 65 | 15 | 447 / 447 | +| [database-index](/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline/claude-code/database-index/result.json) | — | — | — | — | — | — / 900 | +| [dns](/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline/claude-code/dns/result.json) | — | — | — | — | — | — / 900 | +| [door-lock](/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline/claude-code/door-lock/result.json) | 9 | 412 | 17 | 220 | 10 | 668 / 668 | +| [git-merge](/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline/claude-code/git-merge/result.json) | 9 | 312 | 15 | 126 | 9 | 471 / 471 | +| [load-balancer](/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline/claude-code/load-balancer/result.json) | 6 | 243 | 7 | 74 | 11 | 341 / 341 | +| [narrow-toggle](/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline/claude-code/narrow-toggle/result.json) | — | — | — | — | — | — / 900 | +| [notification-settings](/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline/claude-code/notification-settings/result.json) | — | — | — | — | — | — / 900 | +| [refrigerator](/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline/claude-code/refrigerator/result.json) | 9 | 377 | 150 | 130 | 25 | 691 / 691 | +| [seat-belt](/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline/claude-code/seat-belt/result.json) | 8 | 449 | 134 | 199 | 110 | — / 900 | +| [spray-bottle](/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline/claude-code/spray-bottle/result.json) | 10 | 378 | 16 | 130 | 13 | 548 / 548 | +| [stapler](/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline/claude-code/stapler/result.json) | 9 | 347 | 58 | 190 | 15 | 618 / 618 | +| [thermos](/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline/claude-code/thermos/result.json) | 9 | 324 | 140 | 59 | 13 | 545 / 545 | +| [toaster](/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline/claude-code/toaster/result.json) | 11 | 342 | 10 | 73 | 13 | 449 / 449 | +| [toilet](/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline/claude-code/toilet/result.json) | 8 | 172 | 288 | 105 | 8 | 582 / 582 | +| [umbrella](/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline/claude-code/umbrella/result.json) | 31 | 385 | 17 | 161 | 16 | 610 / 610 | +| [washing-machine](/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline/claude-code/washing-machine/result.json) | 5 | 601 | 9 | 188 | 13 | 817 / 817 | +| [websocket](/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline/claude-code/websocket/result.json) | 8 | 364 | 8 | 183 | 12 | 575 / 575 | +| [zipper](/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline/claude-code/zipper/result.json) | 9 | 271 | 10 | 110 | 7 | 408 / 408 | + + +A dash means unavailable, not zero. The four infrastructure cases have no tool phase trace and are separated below. The seat-belt row ends at the 900s scoring cap; its actual runner wall duration is 920s. + +## First prototype pilot + +| Case | Send → first tool | Read/design/generation → first write | Write/build → first browser check | Check/revise → publish command | Publish command → visible/cap | Visible / scored | +|---|---:|---:|---:|---:|---:|---:| +| [bicycle-pump](/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype/claude-code/bicycle-pump/result.json) | 8 | 149 | 5 | 56 | 19 | 238 / 238 | +| [cdn](/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype/claude-code/cdn/result.json) | 30 | 165 | 5 | 18 | 25 | 243 / 243 | + + +Pump's first publish command also rebuilds and runs a 12-second browser check; its 19-second final envelope cannot be labeled publish overhead. CDN publishes at 219s, then exercises `setParams`/read and another browser check before the card is visible at 243s. Its initial first-tool delay is 30s versus 10s in the baseline. Both pilot traces still perform repeated parameter-API searches before writing. + +## Skill/example reading and repeated verification + +The 15 visible baseline cards have a median 16 read/setup calls; their observed read/setup spans have a median 7.7s. This category includes skill loading, copies, lists, source/reference reads and shell lookups; it excludes web research. It does **not** mean Claude spent only that long reading: interpreting their output occurs in the unattributed gaps. Both pilot runs read the bundled dial-indicator example; the pilot pump has 8 read/setup calls and CDN 14. + +Concrete evidence: + +- Baseline washing machine: first tool 5s, generated 811-line `build.mjs` write starts 607s, first build/check command 616s, publish 804s, visible 817s. At 432s it was still reading kit lighting definitions, followed by a roughly 174s gap before the write. No execution timestamp explains that gap as disk, network, model generation or scheduling alone. The long path predates screenshot checks. +- Baseline pump: a model file is written at 142s, a large figure file at 385s, first capture at 394s, then repeated captures/drive/line checks and repairs until publish at 506s. Pilot pump writes its figure in a shell command at 158s and starts its first check at 163s; it still revises width/framing before a combined check/publish at 219s. +- Baseline CDN: eight web fetch/search rows have 22s of union observed spans. Parameter-API investigation spans commands around 156–198s, including searching installed plugin code. Its source write starts at 356s, first capture 367s, publish 432s, visible 447s. Pilot CDN has no recorded web tools, writes at 196s and checks at 201s. Differences include both less research and less build/check work; quick-mode wording alone is not isolated. +- Baseline door lock spends 220s between first capture and publish, with multiple view/layout fixes, zoom captures and line-end checking. Baseline stapler spends 190s in that envelope, including several line-check repairs. These are observable repeated craft passes, not CDN/network waits. + +## Infrastructure failures and capped case + +| Case | Actual runner wall | Scored | Retained evidence | +|---|---:|---:|---| +| Notification settings | 25s | 900s | POST `/threads` returned 502: concurrency-limit dispatch hook did not decide within 10000ms; no thread ID returned. No provider-tool timing exists. | +| Narrow toggle | 28s | 900s | `fetch failed`; database has provisioning events and manual stop, no provider/tool events. | +| DNS | 41s | 900s | Runner timeout; database `system/error`: `thread_command_failed`, “Host is not connected”; no provider/tool events. | +| Database index | 119s | 900s | Runner timeout; database `system/error`: `thread_provisioning_failed`, “Timed out waiting for command result”; no provider/tool events. | +| Seat belt | 920s | 900s | First publish-containing command starts 790s and returns a directive; assistant includes that directive around 805s, but the observer proves no visible card. Publication/build completion is not visible-card proof. The exact render/observer failure remains unknown. | + +These four infrastructure failures must stay in the official score, but they are not evidence that Claude spent 15 minutes generating each answer. Seat belt is separately a capped delivery failure despite retained publication evidence. + +## Interpretation and limits + +Prioritize shortening the generation/design surface and the repeated craft loop. The evidence supports retaining a compact worked starter and removing default zoom/line-audit passes; repeated parameter-API discovery is another concrete target. It does not support blaming `--playground-file` transport or CDN fetching for the whole delay: publish-to-visible envelopes are generally seconds, and most topics use no web tools. + +The baseline source is `a632572aa58adc9b6ddf947c9e527587d09f22ca`; pilot source is `9de99949792c2c59b70693c1dcda6aa8cf36b428` and also includes R2 control changes. Models are default Claude Opus 5.5. Shared-host pressure and provider/bridge timing are confounders ([conditions](/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/conditions.json), [pilot host snapshot](/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/host-status-prototype-pilot.json), [gate report](/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/gate-1-first.md)). No phase breakdown here claims a clean model-speed benchmark or extrapolates the two-prompt pilot to the full corpus. Raw baseline result hashes and timeline hashes are preserved in the JSON; official scorer corrections do not alter this source evidence. diff --git a/plugins/playgrounds/evals/launch/reports/gate-1/gate-1-control-audit.json b/plugins/playgrounds/evals/launch/reports/gate-1/gate-1-control-audit.json new file mode 100644 index 000000000..8a0b96b11 --- /dev/null +++ b/plugins/playgrounds/evals/launch/reports/gate-1/gate-1-control-audit.json @@ -0,0 +1,1642 @@ +{ + "updatedAt": "2026-10-20T07:03:45.379102+00:00", + "rows": [ + { + "provider": "Claude", + "group": "baseline", + "prompt": "git-merge", + "width": 710, + "index": 2, + "label": "Conflict", + "classification": "harness error", + "reason": "Conflict changes the middle-row card geometry in v2; original scorer masked the separate interactive drawing. Visually confirmed corrected before/after PNGs; v2 changed=521.", + "evidence": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/claude-contact-sheets/0.png", + "originalAuditIds": [ + "claude-0" + ], + "finalVerdict": "live", + "finalReason": "stable output changed outside controls", + "finalResult": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-final/claude-code/git-merge/result.json", + "cardRuntimeErrors": [] + }, + { + "provider": "Claude", + "group": "baseline", + "prompt": "load-balancer", + "width": 710, + "index": 0, + "label": "Load balancer: left and right arrows change the algorithm, up and down change traffic", + "classification": "harness error", + "reason": "Keyboard-only stage was still tested with drag; unchanged drawing is not evidence of dead arrow-key controls.", + "evidence": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/claude-contact-sheets/28.png", + "originalAuditIds": [ + "claude-1", + "claude-29" + ], + "finalVerdict": "live", + "finalReason": "Supported ArrowRight changes model algorithm from round robin to least connections; output algorithm words change and queues reset, beyond selected-button styling.", + "finalResult": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-final/claude-code/load-balancer/result.json", + "cardRuntimeErrors": [] + }, + { + "provider": "Claude", + "group": "baseline", + "prompt": "load-balancer", + "width": 710, + "index": 1, + "label": "Round robin", + "classification": "harness error", + "reason": "Round robin remains selected before/after: the chosen precondition dragged a keyboard-only stage and did not switch algorithms.", + "evidence": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/claude-contact-sheets/28.png", + "originalAuditIds": [ + "claude-2", + "claude-30" + ], + "finalVerdict": "live", + "finalReason": "After preparing least connections, Round robin changes the output algorithm words to round robin and resets queues.", + "finalResult": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-final/claude-code/load-balancer/result.json", + "cardRuntimeErrors": [] + }, + { + "provider": "Claude", + "group": "baseline", + "prompt": "load-balancer", + "width": 710, + "index": 2, + "label": "Least connections", + "classification": "harness error", + "reason": "Readout visibly changes from round robin to least connections; animated queue suffix prevents stable pixel proof.", + "evidence": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/claude-contact-sheets/28.png", + "originalAuditIds": [ + "claude-3", + "claude-31" + ], + "finalVerdict": "live", + "finalReason": "Least connections changes the output algorithm words from round robin to least connections.", + "finalResult": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-final/claude-code/load-balancer/result.json", + "cardRuntimeErrors": [] + }, + { + "provider": "Claude", + "group": "baseline", + "prompt": "load-balancer", + "width": 710, + "index": 4, + "label": "Fewer requests", + "classification": "live but unproven", + "reason": "Traffic 3.0\u21922.5 req/s; label changes, but asynchronous queue differences do not isolate throughput effect.", + "evidence": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/claude-contact-sheets/32.png", + "originalAuditIds": [ + "claude-4", + "claude-33" + ], + "finalVerdict": "live", + "finalReason": "Repeated actual Fewer requests clicks lower traffic to 0.5 req/s; after a fixed 12-second observation the former 8/8/7/8 backlog has drained to empty. Both the independent mechanism and queue readout change, beyond the rate label.", + "finalResult": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-final/claude-code/load-balancer/result.json", + "cardRuntimeErrors": [] + }, + { + "provider": "Claude", + "group": "baseline", + "prompt": "load-balancer", + "width": 710, + "index": 5, + "label": "More requests", + "classification": "live but unproven", + "reason": "Traffic 2.5\u21923.0 req/s; output needs a sustained rate comparison.", + "evidence": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/claude-contact-sheets/32.png", + "originalAuditIds": [ + "claude-5", + "claude-34" + ], + "finalVerdict": "live", + "finalReason": "Repeated actual More requests clicks raise traffic from 0.5 to 5.5 req/s; at the same 12-second observation the visible queues grow from 0/1/0/0 to 8/8/7/8 with dropped requests. This proves traffic generation beyond the rate label.", + "finalResult": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-final/claude-code/load-balancer/result.json", + "cardRuntimeErrors": [] + }, + { + "provider": "Claude", + "group": "baseline", + "prompt": "load-balancer", + "width": 710, + "index": 6, + "label": "None", + "classification": "harness error", + "reason": "Slow None remains selected before/after; incorrect selected-button precondition leaves state unchanged.", + "evidence": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/claude-contact-sheets/32.png", + "originalAuditIds": [ + "claude-6", + "claude-35" + ], + "finalVerdict": "live", + "finalReason": "Equal eight-second observation after reset at the same traffic/algorithm: changing slow-server selection moves the visible 4\u20135-request backlog to the selected server; None removes it. Before/after mechanism geometry and queue readouts agree, beyond selection styling.", + "finalResult": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-final/claude-code/load-balancer/result.json", + "cardRuntimeErrors": [] + }, + { + "provider": "Claude", + "group": "baseline", + "prompt": "load-balancer", + "width": 710, + "index": 7, + "label": "1", + "classification": "live but unproven", + "reason": "Slow-server None\u21921; retained animated snapshots cannot isolate service-time effect.", + "evidence": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/claude-contact-sheets/36.png", + "originalAuditIds": [ + "claude-7", + "claude-36" + ], + "finalVerdict": "live", + "finalReason": "Equal eight-second observation after reset at the same traffic/algorithm: changing slow-server selection moves the visible 4\u20135-request backlog to the selected server; None removes it. Before/after mechanism geometry and queue readouts agree, beyond selection styling.", + "finalResult": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-final/claude-code/load-balancer/result.json", + "cardRuntimeErrors": [] + }, + { + "provider": "Claude", + "group": "baseline", + "prompt": "load-balancer", + "width": 710, + "index": 8, + "label": "2", + "classification": "live but unproven", + "reason": "Slow-server 1\u21922; retained animated snapshots cannot isolate service-time effect.", + "evidence": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/claude-contact-sheets/36.png", + "originalAuditIds": [ + "claude-8", + "claude-37" + ], + "finalVerdict": "live", + "finalReason": "Equal eight-second observation after reset at the same traffic/algorithm: changing slow-server selection moves the visible 4\u20135-request backlog to the selected server; None removes it. Before/after mechanism geometry and queue readouts agree, beyond selection styling.", + "finalResult": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-final/claude-code/load-balancer/result.json", + "cardRuntimeErrors": [] + }, + { + "provider": "Claude", + "group": "baseline", + "prompt": "load-balancer", + "width": 710, + "index": 9, + "label": "3", + "classification": "live but unproven", + "reason": "Slow-server 2\u21923; retained animated snapshots cannot isolate service-time effect.", + "evidence": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/claude-contact-sheets/36.png", + "originalAuditIds": [ + "claude-9", + "claude-38" + ], + "finalVerdict": "live", + "finalReason": "Equal eight-second observation after reset at the same traffic/algorithm: changing slow-server selection moves the visible 4\u20135-request backlog to the selected server; None removes it. Before/after mechanism geometry and queue readouts agree, beyond selection styling.", + "finalResult": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-final/claude-code/load-balancer/result.json", + "cardRuntimeErrors": [] + }, + { + "provider": "Claude", + "group": "baseline", + "prompt": "load-balancer", + "width": 710, + "index": 10, + "label": "4", + "classification": "live but unproven", + "reason": "Slow-server 3\u21924; retained animated snapshots cannot isolate service-time effect.", + "evidence": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/claude-contact-sheets/36.png", + "originalAuditIds": [ + "claude-10", + "claude-39" + ], + "finalVerdict": "live", + "finalReason": "Equal eight-second observation after reset at the same traffic/algorithm: changing slow-server selection moves the visible 4\u20135-request backlog to the selected server; None removes it. Before/after mechanism geometry and queue readouts agree, beyond selection styling.", + "finalResult": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-final/claude-code/load-balancer/result.json", + "cardRuntimeErrors": [] + }, + { + "provider": "Claude", + "group": "baseline", + "prompt": "load-balancer", + "width": 710, + "index": 11, + "label": "None", + "classification": "harness error", + "reason": "Failed-health-check None remains selected before/after; unrelated peer precondition does not create a failed server.", + "evidence": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/claude-contact-sheets/40.png", + "originalAuditIds": [ + "claude-11", + "claude-40" + ], + "finalVerdict": "live", + "finalReason": "Selecting no failed server removes the unavailable x marker from the first server queue in the model readout.", + "finalResult": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-final/claude-code/load-balancer/result.json", + "cardRuntimeErrors": [] + }, + { + "provider": "Claude", + "group": "baseline", + "prompt": "load-balancer", + "width": 710, + "index": 13, + "label": "2", + "classification": "live but unproven", + "reason": "Health-check selection 1\u21922; output queues are animated and stable attributable output remains unproven.", + "evidence": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/claude-contact-sheets/40.png", + "originalAuditIds": [ + "claude-12", + "claude-42" + ], + "finalVerdict": "live", + "finalReason": "Actual click marks server 2 unavailable: its mechanism output changes and external queue position becomes \u00d7 while routing continues to other servers.", + "finalResult": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-final/claude-code/load-balancer/result.json", + "cardRuntimeErrors": [] + }, + { + "provider": "Claude", + "group": "baseline", + "prompt": "load-balancer", + "width": 710, + "index": 14, + "label": "3", + "classification": "live but unproven", + "reason": "Health-check selection 2\u21923; output queues are animated and stable attributable output remains unproven.", + "evidence": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/claude-contact-sheets/40.png", + "originalAuditIds": [ + "claude-13", + "claude-43" + ], + "finalVerdict": "live", + "finalReason": "Marking server3 failed changes the third queue to an unavailable x, beyond the selected-button state.", + "finalResult": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-final/claude-code/load-balancer/result.json", + "cardRuntimeErrors": [] + }, + { + "provider": "Claude", + "group": "baseline", + "prompt": "load-balancer", + "width": 710, + "index": 15, + "label": "4", + "classification": "live but unproven", + "reason": "Health-check selection 3\u21924; output queues are animated and stable attributable output remains unproven.", + "evidence": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/claude-contact-sheets/44.png", + "originalAuditIds": [ + "claude-14", + "claude-44" + ], + "finalVerdict": "live", + "finalReason": "Actual click marks server 4 unavailable: its mechanism output changes and external queue position becomes \u00d7 while routing continues to other servers.", + "finalResult": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-final/claude-code/load-balancer/result.json", + "cardRuntimeErrors": [] + }, + { + "provider": "Claude", + "group": "baseline", + "prompt": "refrigerator", + "width": 710, + "index": 0, + "label": "Fridge thermostat: arrow keys change the set temperature", + "classification": "harness error", + "reason": "Keyboard-only thermostat stage received a drag. Autonomous compressor cycling resized the card, not a proven gesture effect.", + "evidence": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/claude-contact-sheets/44.png", + "originalAuditIds": [ + "claude-15", + "claude-45" + ], + "finalVerdict": "live", + "finalReason": "Reject the coincidental drag/unsupported-key proofs. Actual ArrowRight changes the thermostat threshold readout from on5.0/off3.0 to on5.5/off3.5, with knob geometry and duty24%->23%; saved source nudge updates local model before the initialization exception. This proves the stage keyboard route only; card remains runtime-error.", + "finalResult": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-final/claude-code/refrigerator/result.json", + "cardRuntimeErrors": [ + "exception: Error: Parameter names are letters, digits, - and _: [object Object]" + ] + }, + { + "provider": "Claude", + "group": "baseline", + "prompt": "refrigerator", + "width": 710, + "index": 2, + "label": "Room", + "classification": "dead", + "reason": "Native-size images: room changes17\u219235\u00b0C but model stays24% duty/28W leak. Invalid define(object) aborts subscription; console exception retained.", + "evidence": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/claude-contact-sheets/44.png", + "originalAuditIds": [ + "claude-16", + "claude-47" + ], + "finalVerdict": "dead", + "finalReason": "Native parameter changes never reach the model: initialization throws on params.define(object) before readParams/subscription. The manually reviewed pair and source show unchanged thresholds/duty under changed settings. Autonomous thermal drift is not input response.", + "finalResult": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-final/claude-code/refrigerator/result.json", + "cardRuntimeErrors": [ + "exception: Error: Parameter names are letters, digits, - and _: [object Object]" + ] + }, + { + "provider": "Claude", + "group": "baseline", + "prompt": "spray-bottle", + "width": 710, + "index": 0, + "label": "Spray bottle: hold Space or press to squeeze the trigger, N turns the nozzle", + "classification": "live but unproven", + "reason": "Both snapshots at rest; source requires held input or pulse. Existing drag/capture sequence fails to observe the transient response.", + "evidence": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/claude-contact-sheets/48.png", + "originalAuditIds": [ + "claude-17", + "claude-49" + ], + "finalVerdict": "live", + "finalReason": "Advertised keyboard squeeze pulse increases the settled sprayed total1.0->2.0mL and reduces bottle259->258mL. Reduced-motion source disables idle touring; this is input-caused cumulative output, not hover styling.", + "finalResult": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-final/claude-code/spray-bottle/result.json", + "cardRuntimeErrors": [] + }, + { + "provider": "Claude", + "group": "baseline", + "prompt": "stapler", + "width": 710, + "index": 0, + "label": "Stapler: arrow keys press and release the handle", + "classification": "live but unproven", + "reason": "Both v2 snapshots show the same clinched state despite UI handle0%. clientY handler exists, but compound-surface coordinates/masking and settled timing make this probe inconclusive.", + "evidence": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/claude-contact-sheets/48.png", + "originalAuditIds": [ + "claude-18", + "claude-50" + ], + "finalVerdict": "live", + "finalReason": "Supported End key closes the handle and drives/folds the staple: visible open gap9.0mm becomes clinched legs folded5.0mm, with clear mechanism geometry change. Prefer this supported route over the first click probe.", + "finalResult": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-final/claude-code/stapler/result.json", + "cardRuntimeErrors": [] + }, + { + "provider": "Claude", + "group": "baseline", + "prompt": "toilet", + "width": 710, + "index": 0, + "label": "Toilet tank: press Space or Enter to flush; value is litres in the tank", + "classification": "harness error", + "reason": "Role=slider is actually click/Space/Enter-to-flush. Drag does not dispatch its handler; autonomous refill changes are not gesture proof.", + "evidence": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/claude-contact-sheets/48.png", + "originalAuditIds": [ + "claude-19", + "claude-51" + ], + "finalVerdict": "live", + "finalReason": "Supported Space input changes a settled Full tank to Flushing, visibly opens the flapper and lowers water. The earlier unsupported ArrowLeft automatic settling proof is superseded.", + "finalResult": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-final/claude-code/toilet/result.json", + "cardRuntimeErrors": [] + }, + { + "provider": "Claude", + "group": "baseline", + "prompt": "toilet", + "width": 710, + "index": 1, + "label": "Water line", + "classification": "harness error", + "reason": "Waterline14.5\u219219cm visibly raises marker/water and litres; ambient stability criterion discards live simulated output.", + "evidence": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/claude-contact-sheets/52.png", + "originalAuditIds": [ + "claude-20", + "claude-52" + ], + "finalVerdict": "live", + "finalReason": "Real low/high range drag raises the mechanism water line and tank water, changing Full 12.9 L to Refilling 13.4 L; visible output is independent of native thumb/value.", + "finalResult": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-final/claude-code/toilet/result.json", + "cardRuntimeErrors": [] + }, + { + "provider": "Claude", + "group": "baseline", + "prompt": "toilet", + "width": 710, + "index": 2, + "label": "Supply flow", + "classification": "harness error", + "reason": "Supply5.1\u219211.9L/min visibly changes refill readout and water volume; rejected because simulation remains in motion.", + "evidence": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/claude-contact-sheets/52.png", + "originalAuditIds": [ + "claude-21", + "claude-53" + ], + "finalVerdict": "live", + "finalReason": "During actual refill, low/high supply drag changes external inlet flow from 3.4 to 12.8 L/min. The prior full-tank state could not expose this effect.", + "finalResult": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-final/claude-code/toilet/result.json", + "cardRuntimeErrors": [] + }, + { + "provider": "Claude", + "group": "baseline", + "prompt": "toilet", + "width": 710, + "index": 4, + "label": "4\u00d7", + "classification": "live but unproven", + "reason": "4\u00d7 selected at full idle tank; no visible output should change until another flush/refill.", + "evidence": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/claude-contact-sheets/52.png", + "originalAuditIds": [ + "claude-22", + "claude-55" + ], + "finalVerdict": "live", + "finalReason": "Fresh-page equal-window refill comparison after actual flush: selected 1x, 4x and 10x produce visibly different water rises (about 0.6, 2.1 and 5.1 L over 4.2 seconds). This proves simulation speed beyond selected-button styling; all three inputs and supported flush paths are recorded.", + "finalResult": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-final/claude-code/toilet/result.json", + "cardRuntimeErrors": [] + }, + { + "provider": "Claude", + "group": "baseline", + "prompt": "toilet", + "width": 710, + "index": 5, + "label": "10\u00d7", + "classification": "live but unproven", + "reason": "10\u00d7 selected at full idle tank; needs active refill precondition.", + "evidence": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/claude-contact-sheets/56.png", + "originalAuditIds": [ + "claude-23", + "claude-56" + ], + "finalVerdict": "live", + "finalReason": "Fresh-page equal-window refill comparison after actual flush: selected 1x, 4x and 10x produce visibly different water rises (about 0.6, 2.1 and 5.1 L over 4.2 seconds). This proves simulation speed beyond selected-button styling; all three inputs and supported flush paths are recorded.", + "finalResult": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-final/claude-code/toilet/result.json", + "cardRuntimeErrors": [] + }, + { + "provider": "Claude", + "group": "baseline", + "prompt": "umbrella", + "width": 710, + "index": 0, + "label": "Umbrella: up and down arrows slide the runner, space snaps it open or shut", + "classification": "harness error", + "reason": "Original after PNG is absent (ENOENT), so no visual verdict exists. Corrected v2 pair visibly opens the umbrella from 17cm to 122cm; changed=1056.", + "evidence": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/claude-contact-sheets/24.png", + "originalAuditIds": [ + "claude-24" + ], + "finalVerdict": "live", + "finalReason": "stable output changed outside controls", + "finalResult": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-final/claude-code/umbrella/result.json", + "cardRuntimeErrors": [] + }, + { + "provider": "Claude", + "group": "baseline", + "prompt": "washing-machine", + "width": 710, + "index": 0, + "label": "Washing machine: arrow keys step through fill, heat, wash, drain and spin; Home runs the whole cycle", + "classification": "harness error", + "reason": "Original captures reset hover state. Corrected v2 pair visibly changes 16rpm/0.07g to 1292rpm/447.84g; changed=1119.", + "evidence": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/claude-contact-sheets/24.png", + "originalAuditIds": [ + "claude-25" + ], + "finalVerdict": "live", + "finalReason": "stable output changed outside controls", + "finalResult": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-final/claude-code/washing-machine/result.json", + "cardRuntimeErrors": [] + }, + { + "provider": "Claude", + "group": "baseline", + "prompt": "websocket", + "width": 710, + "index": 0, + "label": "Chat delivery time in milliseconds. Keys 1, 2 and 3 send from the left, front and right desks; M switches between WebSocket and polling; arrow keys change latency and the poll interval", + "classification": "harness error", + "reason": "Stage has click/keyboard send actions and no drag handler; the harness uses unsupported drag modality.", + "evidence": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/claude-contact-sheets/56.png", + "originalAuditIds": [ + "claude-26", + "claude-57" + ], + "finalVerdict": "live", + "finalReason": "Supported key-1 input changes a settled open connection to a delivered message (121 ms), with visible desk/message geometry and readout change. This replaces ambiguous earlier click/settling evidence.", + "finalResult": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-final/claude-code/websocket/result.json", + "cardRuntimeErrors": [] + }, + { + "provider": "Claude", + "group": "baseline", + "prompt": "websocket", + "width": 710, + "index": 2, + "label": "Polling", + "classification": "harness error", + "reason": "Readout changes WebSocket to Polling; stable parameter effect is mixed with animated clock/polling traffic.", + "evidence": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/claude-contact-sheets/56.png", + "originalAuditIds": [ + "claude-27", + "claude-59" + ], + "finalVerdict": "live", + "finalReason": "After preparing WebSocket, clicking Polling changes the readout from3 open connections to Polling every1s and changes connection/gate state.", + "finalResult": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-final/claude-code/websocket/result.json", + "cardRuntimeErrors": [] + }, + { + "provider": "Claude", + "group": "baseline", + "prompt": "websocket", + "width": 710, + "index": 3, + "label": "Network latency, one way", + "classification": "live but unproven", + "reason": "Latency50\u2192180ms label wraps and resizes card. Need an actual sent message to prove delivery latency; geometry alignment alone cannot prove it.", + "evidence": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/claude-contact-sheets/60.png", + "originalAuditIds": [ + "claude-28", + "claude-60" + ], + "finalVerdict": "live", + "finalReason": "After actual supported key-1 message sends and enough delivery time, low/high latency drag changes external delivery time from 42 to 404 ms. This resolves the inactive-message precondition.", + "finalResult": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-final/claude-code/websocket/result.json", + "cardRuntimeErrors": [] + }, + { + "provider": "Claude", + "group": "baseline", + "prompt": "load-balancer", + "width": 710, + "index": 3, + "label": "Random", + "classification": "harness error", + "reason": "Readout visibly changes from least connections to random; animated queue suffix prevents stable pixel proof.", + "evidence": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/claude-contact-sheets/32.png", + "originalAuditIds": [ + "claude-32" + ], + "finalVerdict": "live", + "finalReason": "Random changes the output algorithm words from round robin to random.", + "finalResult": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-final/claude-code/load-balancer/result.json", + "cardRuntimeErrors": [] + }, + { + "provider": "Claude", + "group": "baseline", + "prompt": "load-balancer", + "width": 710, + "index": 12, + "label": "1", + "classification": "live but unproven", + "reason": "Health-check selection None\u21921; output queues are animated and the fixed-size whole-card comparison is inconclusive.", + "evidence": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/claude-contact-sheets/40.png", + "originalAuditIds": [ + "claude-41" + ], + "finalVerdict": "live", + "finalReason": "Actual click marks server 1 unavailable: its mechanism output changes and external queue position becomes \u00d7 while routing continues to other servers.", + "finalResult": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-final/claude-code/load-balancer/result.json", + "cardRuntimeErrors": [] + }, + { + "provider": "Claude", + "group": "baseline", + "prompt": "refrigerator", + "width": 710, + "index": 1, + "label": "Thermostat", + "classification": "dead", + "reason": "Thermostat UI rises to 6\u00b0C but model still reports switch-on 5.0/off 3.0 (default4\u00b0C). params.define(object) throws before subscription, leaving UI disconnected from model.", + "evidence": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/claude-contact-sheets/44.png", + "originalAuditIds": [ + "claude-46" + ], + "finalVerdict": "dead", + "finalReason": "Native parameter changes never reach the model: initialization throws on params.define(object) before readParams/subscription. The manually reviewed pair and source show unchanged thresholds/duty under changed settings. Autonomous thermal drift is not input response.", + "finalResult": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-final/claude-code/refrigerator/result.json", + "cardRuntimeErrors": [ + "exception: Error: Parameter names are letters, digits, - and _: [object Object]" + ] + }, + { + "provider": "Claude", + "group": "baseline", + "prompt": "refrigerator", + "width": 710, + "index": 3, + "label": "Door open", + "classification": "dead", + "reason": "Door button changes styling, while compressor cycles autonomously. Invalid define(object) aborts readParams/subscription; model never consumes door toggle. Resize alone would be a false positive.", + "evidence": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/claude-contact-sheets/48.png", + "originalAuditIds": [ + "claude-48" + ], + "finalVerdict": "dead", + "finalReason": "Drag pair changes door selected chrome but running share stays24%, heat-leak note still says through walls and gasket. Minor thermal drift and page reflow are not door response. Source initialization failure prevents subscription; original dead classification retained.", + "finalResult": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-final/claude-code/refrigerator/result.json", + "cardRuntimeErrors": [ + "exception: Error: Parameter names are letters, digits, - and _: [object Object]" + ] + }, + { + "provider": "Claude", + "group": "baseline", + "prompt": "toilet", + "width": 710, + "index": 3, + "label": "1\u00d7", + "classification": "live but unproven", + "reason": "1\u00d7 is selected near end of refill; tank becomes full. Cannot separate rate change from passage of time without matched refill windows.", + "evidence": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/claude-contact-sheets/52.png", + "originalAuditIds": [ + "claude-54" + ], + "finalVerdict": "live", + "finalReason": "Fresh-page equal-window refill comparison after actual flush: selected 1x, 4x and 10x produce visibly different water rises (about 0.6, 2.1 and 5.1 L over 4.2 seconds). This proves simulation speed beyond selected-button styling; all three inputs and supported flush paths are recorded.", + "finalResult": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-final/claude-code/toilet/result.json", + "cardRuntimeErrors": [] + }, + { + "provider": "Claude", + "group": "baseline", + "prompt": "websocket", + "width": 710, + "index": 1, + "label": "WebSocket", + "classification": "harness error", + "reason": "Readout changes Polling to WebSocket handshake/connection; active animation makes whole-output stability too conservative.", + "evidence": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/claude-contact-sheets/56.png", + "originalAuditIds": [ + "claude-58" + ], + "finalVerdict": "live", + "finalReason": "After preparing Polling, clicking WebSocket changes the explanatory readout from Polling every1s to WebSocket handshake and changes gate geometry; selection styling is not the sole evidence.", + "finalResult": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-final/claude-code/websocket/result.json", + "cardRuntimeErrors": [] + }, + { + "provider": "Claude", + "group": "baseline", + "prompt": "websocket", + "width": 710, + "index": 4, + "label": "Poll interval", + "classification": "live but unproven", + "reason": "Poll interval1000\u21924250ms; selected parameter updates but one snapshot pair cannot establish the longer interval.", + "evidence": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/claude-contact-sheets/60.png", + "originalAuditIds": [ + "claude-61" + ], + "finalVerdict": "live", + "finalReason": "Real slider drag changes the stable output interval from Polling every1s to every4.5s. The unrelated empty-poll counter is not used as proof.", + "finalResult": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-final/claude-code/websocket/result.json", + "cardRuntimeErrors": [] + }, + { + "provider": "Claude", + "group": "pilot", + "prompt": "bicycle-pump", + "width": 710, + "index": 0, + "label": "Pump handle: drag down or use arrow keys; space pumps one stroke", + "classification": "live but unproven", + "reason": "Both pilot pump captures show33psi barrel/32.8psi tire and same handle pose. Drag and key handlers exist, but current pointer capture/preconditioning did not create distinct sampled states. Needs independent keyboard probe.", + "evidence": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/claude-contact-sheets/60.png", + "originalAuditIds": [ + "claude-62" + ], + "finalVerdict": "live", + "finalReason": "The inspected supported pointer input lowers the piston and changes external barrel pressure 0\u219235 psi, tire 32.8\u219235.0 psi and needle/valve geometry. Source pointer handler steers the simulation.", + "finalResult": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-final/claude-code/bicycle-pump/result.json", + "cardRuntimeErrors": [] + }, + { + "provider": "Claude", + "group": "pilot", + "prompt": "cdn", + "width": 710, + "index": 0, + "label": "CDN purge timeline: arrow keys move through time, space plays or pauses", + "classification": "harness error", + "reason": "Pilot CDN timeline moves time (readout), but broad stage mask removes diagram/output and only14 stable changed pixels remain. Source supports pointer scrubbing and keys; recheck with output regions/key endpoints.", + "evidence": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/claude-contact-sheets/60.png", + "originalAuditIds": [ + "claude-63" + ], + "finalVerdict": "live", + "finalReason": "With pointer held outside the stage, Home\u2192End changes all ten drawn edge/browser copies v1\u2192v2 and the readout 0s/0 fresh\u21922m8s/5 fresh. This removes the prior pointer-leave/settling ambiguity.", + "finalResult": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-final/claude-code/cdn/result.json", + "cardRuntimeErrors": [] + }, + { + "provider": "Claude", + "group": "pilot", + "prompt": "cdn", + "width": 710, + "index": 2, + "label": "No purge, wait for TTL", + "classification": "harness error", + "reason": "No-purge button visibly rewrites explanatory result from purge completion to TTL expiry. Screenshot height changes; whole-image dimensions rejection discards the response.", + "evidence": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/claude-contact-sheets/64.png", + "originalAuditIds": [ + "claude-64" + ], + "finalVerdict": "live", + "finalReason": "No purge switches the independent explanation from 5 s edge purge arrival to 9 min 30 s TTL expiry, beyond button styling.", + "finalResult": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-final/claude-code/cdn/result.json", + "cardRuntimeErrors": [] + }, + { + "provider": "Claude", + "group": "pilot", + "prompt": "cdn", + "width": 710, + "index": 3, + "label": "control 3", + "classification": "live but unproven", + "reason": "Purge-propagation slider22s\u21921m44s is tested with No purge selected. Propagation is correctly irrelevant in that mode; needs purge-enabled precondition.", + "evidence": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/claude-contact-sheets/64.png", + "originalAuditIds": [ + "claude-65" + ], + "finalVerdict": "live", + "finalReason": "In Purge mode with browser max-age zero, real propagation Home\u2192End changes independent last-edge prediction 0s\u21922min and the visible edge/browser freshness. The earlier No-purge state made this control ineffective.", + "finalResult": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-final/claude-code/cdn/result.json", + "cardRuntimeErrors": [] + }, + { + "provider": "Claude", + "group": "pilot", + "prompt": "cdn", + "width": 710, + "index": 5, + "label": "control 5", + "classification": "live but unproven", + "reason": "Browser max-age5m30\u219226m is still below the49m24 edge expiry that dominates this no-purge scenario. Result legitimately unchanged; needs a non-dominating TTL or longer browser expiry.", + "evidence": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/claude-contact-sheets/64.png", + "originalAuditIds": [ + "claude-66" + ], + "finalVerdict": "live", + "finalReason": "With purge propagation zero, real browser max-age Home\u2192End changes the independent last-user freshness prediction from immediate to 28m30s, while edges remain fresh. Prior TTL expiry dominated this effect.", + "finalResult": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-final/claude-code/cdn/result.json", + "cardRuntimeErrors": [] + }, + { + "provider": "Codex", + "group": "baseline", + "prompt": "cdn", + "width": 710, + "index": 0, + "label": "Seconds since purge; use left and right arrow keys", + "classification": "harness error", + "reason": "The retained low/high drag frames stay at 0 seconds. The stage advertises and registers keyboard input, not a pointer handler. The separate time parameter also has a bounds defect; this drag cannot adjudicate keyboard behavior. A keyboard check is absent, so no whole-control liveness claim follows from this drag failure.", + "evidence": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/control-audit-codex-sheets/baseline-cdn-0.png", + "finalVerdict": "unproven", + "finalReason": "Partially functional, not a clean control pass: the default passing End pair visibly advances only 0 to 1 second although its supported End handler requests 90. An additionally inspected supported ArrowRight pair does advance 1 to 2 seconds and changes cache rows to v2. The omitted numeric bounds clamp stored time to 0..1 while local redraw can temporarily advance farther; one working arrow step does not establish the full exposed time control. The separate dead native slider also blocks a card pass.", + "finalResult": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-final/codex/cdn/result.json", + "cardRuntimeErrors": [] + }, + { + "provider": "Codex", + "group": "baseline", + "prompt": "cdn", + "width": 710, + "index": 1, + "label": "time", + "classification": "dead", + "reason": "The range thumb moves but both snapshots remain at 1 s with the same table/drawing. The generated definition supplies value but no min/max/default; the captured bridge defaults numeric bounds to 0..1, so the intended 0..90 range saturates at 1 and does not render its requested values.", + "evidence": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/control-audit-codex-sheets/baseline-cdn-1.png", + "finalVerdict": "dead", + "finalReason": "The inspected low/high drag pair moves the native thumb across its track while both external time readouts stay at 1 second and cache rows/mechanism remain unchanged. Saved parameter definitions omit min/max, so native time changes clamp to 0..1. The keyboard stage's local redraw cannot repair this separate control.", + "finalResult": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-final/codex/cdn/result.json", + "cardRuntimeErrors": [] + }, + { + "provider": "Codex", + "group": "baseline", + "prompt": "cdn", + "width": 710, + "index": 3, + "label": "local", + "classification": "harness error", + "reason": "Checking local/browser cache changes the status table to browser-served v1 and the explanatory paragraph; the card becomes shorter. The scorer rejected unequal screenshot dimensions instead of evaluating the visible output change.", + "evidence": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/control-audit-codex-sheets/baseline-cdn-3.png", + "finalVerdict": "live", + "finalReason": "The inspected checkbox click changes the explanatory paragraph to the browser serving its fresh v1 copy and changes all three User receives cells to v1 (browser). The saved input handler updates the local boolean and redraws through the parameter subscription; this is meaningful output, not checkbox styling.", + "finalResult": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-final/codex/cdn/result.json", + "cardRuntimeErrors": [] + }, + { + "provider": "Codex", + "group": "baseline", + "prompt": "cdn", + "width": 710, + "index": 4, + "label": "late", + "classification": "live but unproven", + "reason": "The late checkbox changes selection but not the diagram/table. At the retained 1-second state the late-origin distinction has not reached a refill, and local/browser cache is enabled. The source wires the flag into the refill version calculation, but these frames never demonstrate that branch. The broken time bounds also limit access via the range. No claim that the checkbox is dead or visually proven.", + "evidence": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/control-audit-codex-sheets/baseline-cdn-4.png", + "finalVerdict": "unproven", + "finalReason": "No proven output change outside controls", + "finalResult": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-final/codex/cdn/result.json", + "cardRuntimeErrors": [] + }, + { + "provider": "Codex", + "group": "baseline", + "prompt": "database-index", + "width": 710, + "index": 0, + "label": "Lookup comparison; arrow keys step through", + "classification": "dead", + "reason": "The retained card is static; this unsupported surface has no per-control interaction screenshots. The exact card calls params.define with an object instead of (name, spec). The retained controls.log records \u201cParameter names are letters, digits, - and _: [object Object]\u201d. That exception aborts initialization before the change subscription; database-index also never registers its keyboard listener. Native slider thumbs alone can still move. This is a generated-code defect, independently of any unsupported/wrong-modality harness failure.", + "evidence": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/control-audit-codex-sheets/baseline-database-index-0.png", + "finalVerdict": "dead", + "finalReason": "The inspected ArrowRight pair leaves the lookup diagram and blank explanation unchanged. Source object-form params.define throws before render subscription and keyboard registration; v3 records the same initialization exception. Native control chrome is not working lookup output.", + "finalResult": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-final/codex/database-index/result.json", + "cardRuntimeErrors": [ + "exception: Error: Parameter names are letters, digits, - and _: [object Object]" + ] + }, + { + "provider": "Codex", + "group": "baseline", + "prompt": "database-index", + "width": 710, + "index": 1, + "label": "Find key", + "classification": "dead", + "reason": "The attempted control leaves the mechanism/readout unchanged in both raw and v2 images. The exact card calls params.define with an object instead of (name, spec). The retained controls.log records \u201cParameter names are letters, digits, - and _: [object Object]\u201d. That exception aborts initialization before the change subscription; database-index also never registers its keyboard listener. Native slider thumbs alone can still move. This is a generated-code defect, independently of any unsupported/wrong-modality harness failure.", + "evidence": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/control-audit-codex-sheets/baseline-database-index-1.png", + "finalVerdict": "dead", + "finalReason": "The inspected low/high drag pair moves the native thumb and its own numeric value, but leaves the lookup diagram and blank explanation unchanged. Source object-form params.define throws before render subscription and keyboard registration; v3 records the same initialization exception. Native control chrome is not working lookup output.", + "finalResult": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-final/codex/database-index/result.json", + "cardRuntimeErrors": [ + "exception: Error: Parameter names are letters, digits, - and _: [object Object]" + ] + }, + { + "provider": "Codex", + "group": "baseline", + "prompt": "database-index", + "width": 710, + "index": 2, + "label": "Lookup step", + "classification": "dead", + "reason": "The attempted control leaves the mechanism/readout unchanged in both raw and v2 images. The exact card calls params.define with an object instead of (name, spec). The retained controls.log records \u201cParameter names are letters, digits, - and _: [object Object]\u201d. That exception aborts initialization before the change subscription; database-index also never registers its keyboard listener. Native slider thumbs alone can still move. This is a generated-code defect, independently of any unsupported/wrong-modality harness failure.", + "evidence": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/control-audit-codex-sheets/baseline-database-index-2.png", + "finalVerdict": "dead", + "finalReason": "The inspected low/high drag pair moves the native thumb and its own numeric value, but leaves the lookup diagram and blank explanation unchanged. Source object-form params.define throws before render subscription and keyboard registration; v3 records the same initialization exception. Native control chrome is not working lookup output.", + "finalResult": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-final/codex/database-index/result.json", + "cardRuntimeErrors": [ + "exception: Error: Parameter names are letters, digits, - and _: [object Object]" + ] + }, + { + "provider": "Codex", + "group": "baseline", + "prompt": "dns", + "width": 710, + "index": 0, + "label": "DNS lookup step", + "classification": "harness error", + "reason": "The low/high drag frames stay on the same lookup step. The stage registers arrow/Home/End keys, not dragging. A keyboard check is absent, so no whole-control liveness claim follows from this drag failure.", + "evidence": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/control-audit-codex-sheets/baseline-dns-0.png", + "finalVerdict": "live", + "finalReason": "The inspected Home pair changes the initial incomplete stage into the device-cache step, with an explanatory paragraph and matching readout. The saved keyboard handler explicitly handles Home and calls draw; its drawer animation is output of that input. The recorded initialization exception still rejects the card.", + "finalResult": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-final/codex/dns/result.json", + "cardRuntimeErrors": [ + "exception: Error: Parameter names are letters, digits, - and _: [object Object]" + ] + }, + { + "provider": "Codex", + "group": "baseline", + "prompt": "dns", + "width": 710, + "index": 2, + "label": "Back", + "classification": "harness error", + "reason": "Back changes the resolver-cache step to the device-cache step and adds the opening explanation. The scorer rejected unequal screenshot dimensions instead of evaluating the visible output change.", + "evidence": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/control-audit-codex-sheets/baseline-dns-2.png", + "finalVerdict": "live", + "finalReason": "The inspected Back click changes Your browser connects to Use the resolver's cached answer, updates the paragraph and query/drawer positions, and re-enables Next. The source go(-1) handler changes the step synchronously; this is a valid enabled-state Back transition. Initialization still throws, so this does not pass the card.", + "finalResult": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-final/codex/dns/result.json", + "cardRuntimeErrors": [ + "exception: Error: Parameter names are letters, digits, - and _: [object Object]" + ] + }, + { + "provider": "Codex", + "group": "baseline", + "prompt": "door-lock", + "width": 710, + "index": 0, + "label": "Lock cutaway. Arrow keys choose a key; Enter attempts to turn it.", + "classification": "harness error", + "reason": "The inventory detects a focusable keyboard surface but produces Unsupported exposed control instead of exercising its registered keys. I inspected the retained static card image and source; there are no per-control before/after images for this surface. Other controls working does not prove this surface works.", + "evidence": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/control-audit-codex-sheets/baseline-door-lock-0.png", + "finalVerdict": "live", + "finalReason": "The inspected ArrowRight pair changes the lock from its incomplete initial drawing to No key: springs and pins become visible, with blocked readout and matching explanation. The saved source explicitly handles ArrowRight by changing key and calling draw; no autonomous transition is involved. This proves this input route only: the captured initialization runtime error still rejects the whole card.", + "finalResult": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-final/codex/door-lock/result.json", + "cardRuntimeErrors": [ + "exception: Error: Parameter names are letters, digits, - and _: [object Object]" + ] + }, + { + "provider": "Codex", + "group": "baseline", + "prompt": "door-lock", + "width": 710, + "index": 2, + "label": "Wrong key", + "classification": "harness error", + "reason": "Wrong key inserts a visible black key, moves the pins, and changes the explanatory paragraph. The scorer rejected unequal screenshot dimensions instead of evaluating the visible output change.", + "evidence": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/control-audit-codex-sheets/baseline-door-lock-2.png", + "finalVerdict": "live", + "finalReason": "The inspected click pair visibly inserts the wrong key, changes pin heights and changes the explanation to a pin bridging the shell and plug. The saved onclick calls set/draw synchronously. The existing initialization runtime error remains a whole-card failure.", + "finalResult": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-final/codex/door-lock/result.json", + "cardRuntimeErrors": [ + "exception: Error: Parameter names are letters, digits, - and _: [object Object]" + ] + }, + { + "provider": "Codex", + "group": "baseline", + "prompt": "git-merge", + "width": 710, + "index": 0, + "label": "Document comparison machine. Use left and right arrow keys to switch scenarios.", + "classification": "dead", + "reason": "No per-control interaction screenshots exist; only the static card was captured. The advertised keyboard handler calls the baseline params.set({ ... }) form. The captured baseline bridge only supports set(name, value), looks up specs[name], and silently returns for this object; therefore the intended keyboard interaction cannot update its parameter. The unsupported/drag failure alone was not used to infer death.", + "evidence": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/control-audit-codex-sheets/baseline-git-merge-0.png", + "finalVerdict": "dead", + "finalReason": "The inspected ArrowRight pair leaves the clean scenario, diagram text, branch history and explanation unchanged. The saved handler calls unsupported object-form params.set, confirming the original silent no-op. Working scenario buttons do not repair the exposed keyboard surface.", + "finalResult": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-final/codex/git-merge/result.json", + "cardRuntimeErrors": [] + }, + { + "provider": "Codex", + "group": "baseline", + "prompt": "git-merge", + "width": 710, + "index": 1, + "label": "Clean merge", + "classification": "harness error", + "reason": "Clean merge replaces the conflict explanation and ASCII history with the merge explanation/history. The scorer rejected unequal screenshot dimensions instead of evaluating the visible output change.", + "evidence": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/control-audit-codex-sheets/baseline-git-merge-1.png", + "finalVerdict": "live", + "finalReason": "The inspected Clean merge click replaces the conflict explanation and paused history with the clean merge explanation and a new merge commit M. Changed text and history are independent of selected-button styling.", + "finalResult": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-final/codex/git-merge/result.json", + "cardRuntimeErrors": [] + }, + { + "provider": "Codex", + "group": "baseline", + "prompt": "git-merge", + "width": 710, + "index": 2, + "label": "Conflict", + "classification": "harness error", + "reason": "Conflict replaces the clean-merge explanation and history with a paused merge. The scorer rejected unequal screenshot dimensions instead of evaluating the visible output change.", + "evidence": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/control-audit-codex-sheets/baseline-git-merge-2.png", + "finalVerdict": "live", + "finalReason": "The inspected Conflict click changes the diagram's compared/result text and replaces the external paragraph/history with conflicting title edits and a paused merge, matching the scenario subscription.", + "finalResult": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-final/codex/git-merge/result.json", + "cardRuntimeErrors": [] + }, + { + "provider": "Codex", + "group": "baseline", + "prompt": "git-merge", + "width": 710, + "index": 3, + "label": "Fast-forward", + "classification": "harness error", + "reason": "Fast-forward replaces the explanation and ASCII branch history. The scorer rejected unequal screenshot dimensions instead of evaluating the visible output change.", + "evidence": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/control-audit-codex-sheets/baseline-git-merge-3.png", + "finalVerdict": "live", + "finalReason": "The inspected Fast-forward click changes the external explanation and branch history to moving main to C without a merge commit. The visible scenario output proves this button, while the keyboard control remains dead.", + "finalResult": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-final/codex/git-merge/result.json", + "cardRuntimeErrors": [] + }, + { + "provider": "Codex", + "group": "baseline", + "prompt": "git-merge", + "width": 710, + "index": 4, + "label": "What is being compared?", + "classification": "harness error", + "reason": "The details disclosure expands a paragraph explaining the comparison. The scorer rejected unequal screenshot dimensions instead of evaluating the visible output change.", + "evidence": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/control-audit-codex-sheets/baseline-git-merge-4.png", + "finalVerdict": "live", + "finalReason": "The actual before image has the disclosure closed; the after image visibly reveals the full explanatory paragraph about three-way merges, additions/deletions/renames and ancestry. This is revealed content, not merely a chevron or layout change. The observation-only eval confirms open=true and the same paragraph, and the log is console-clean. This proves expansion; collapse was not exercised. The independent keyboard surface remains dead.", + "finalResult": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-final/codex/git-merge/result.json", + "cardRuntimeErrors": [] + }, + { + "provider": "Codex", + "group": "baseline", + "prompt": "load-balancer", + "width": 710, + "index": 0, + "label": "Load balancer: right arrow sends a request; left arrow steps back", + "classification": "dead", + "reason": "No per-control interaction screenshots exist; only the static card was captured. The advertised keyboard handler calls the baseline params.set({ ... }) form. The captured baseline bridge only supports set(name, value), looks up specs[name], and silently returns for this object; therefore the intended keyboard interaction cannot update its parameter. The unsupported/drag failure alone was not used to infer death.", + "evidence": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/control-audit-codex-sheets/baseline-load-balancer-0.png", + "finalVerdict": "dead", + "finalReason": "The inspected ArrowRight pair leaves request count 6, per-server active/assigned totals, carriage and latest-server readout unchanged. The saved keyboard handler calls unsupported object-form params.set, retaining the original silent no-op. Working dropdowns and increment buttons do not repair the separate exposed keyboard surface.", + "finalResult": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-final/codex/load-balancer/result.json", + "cardRuntimeErrors": [] + }, + { + "provider": "Codex", + "group": "baseline", + "prompt": "notification-settings", + "width": 558, + "index": 2, + "label": "Daily digest", + "classification": "harness error", + "reason": "Turning Daily digest off hides the delivery-time selector and removes the digest from the preview. The scorer rejected unequal screenshot dimensions instead of evaluating the visible output change.", + "evidence": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/control-audit-codex-sheets/baseline-notification-settings-2.png", + "finalVerdict": "live", + "finalReason": "The inspected Daily digest click reveals the delivery-time selector and adds Daily digest at 8 AM UTC to the independent notification preview. This is meaningful output despite the card resizing.", + "finalResult": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-final/codex/notification-settings/result.json", + "cardRuntimeErrors": [] + }, + { + "provider": "Codex", + "group": "baseline", + "prompt": "notification-settings", + "width": 558, + "index": 3, + "label": "Delivery time \u00b7 UTC", + "classification": "harness error", + "reason": "Daily digest was turned off by the preceding test, hiding this selector. Both frames show it absent and the same preview. The runner retains the initial inventory and attempts the now-hidden control without restoring its precondition. No interaction in the visible/enabled state is retained.", + "evidence": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/control-audit-codex-sheets/baseline-notification-settings-3.png", + "finalVerdict": "live", + "finalReason": "Both actual images show digest enabled. The native selector changes Morning (8 AM) to Evening (6 PM), and the independent notification preview changes from 8 AM UTC to 6 PM UTC. The retained observation-only eval agrees (08 to 18); the log is console-clean. This proves the native-key route without a driver change. Reset defaults remains independently dead.", + "finalResult": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-final/codex/notification-settings/result.json", + "cardRuntimeErrors": [] + }, + { + "provider": "Codex", + "group": "baseline", + "prompt": "notification-settings", + "width": 558, + "index": 4, + "label": "Reset defaults", + "classification": "dead", + "reason": "Both frames show all notifications off after Reset defaults. Its onclick passes an object to P.set; the baseline bridge only accepts (name, value) and silently ignores the unknown object key, so it cannot restore defaults.", + "evidence": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/control-audit-codex-sheets/baseline-notification-settings-4.png", + "finalVerdict": "dead", + "finalReason": "The inspected Reset defaults click starts from a genuinely nondefault state (email off, digest at 12 PM) and leaves all controls and the independent preview unchanged. Saved onclick uses unsupported object-form P.set, confirming the original silent no-op; a working digest or selector cannot make this card pass.", + "finalResult": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-final/codex/notification-settings/result.json", + "cardRuntimeErrors": [] + }, + { + "provider": "Codex", + "group": "baseline", + "prompt": "refrigerator", + "width": 710, + "index": 0, + "label": "Refrigeration cycle. Use left and right arrow keys to change stage.", + "classification": "dead", + "reason": "The retained card is static; this unsupported surface has no per-control interaction screenshots. The exact card calls params.define with an object instead of (name, spec). The retained controls.log records \u201cParameter names are letters, digits, - and _: [object Object]\u201d. That exception aborts initialization before the change subscription; database-index also never registers its keyboard listener. Native slider thumbs alone can still move. This is a generated-code defect, independently of any unsupported/wrong-modality harness failure.", + "evidence": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/control-audit-codex-sheets/baseline-refrigerator-0.png", + "finalVerdict": "dead", + "finalReason": "The inspected supported-input before/after frames keep the same uninitialized refrigerator, blank stage explanation and unchanged output. The retained source object-form params.define throws before registering the render subscription; v3 records that initialization exception. Thus the original dead-control finding remains, not a merely small visual delta.", + "finalResult": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-final/codex/refrigerator/result.json", + "cardRuntimeErrors": [ + "exception: Error: Parameter names are letters, digits, - and _: [object Object]" + ] + }, + { + "provider": "Codex", + "group": "baseline", + "prompt": "refrigerator", + "width": 710, + "index": 1, + "label": "1. Absorb", + "classification": "dead", + "reason": "The attempted control leaves the mechanism/readout unchanged in both raw and v2 images. The exact card calls params.define with an object instead of (name, spec). The retained controls.log records \u201cParameter names are letters, digits, - and _: [object Object]\u201d. That exception aborts initialization before the change subscription; database-index also never registers its keyboard listener. Native slider thumbs alone can still move. This is a generated-code defect, independently of any unsupported/wrong-modality harness failure.", + "evidence": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/control-audit-codex-sheets/baseline-refrigerator-1.png", + "finalVerdict": "dead", + "finalReason": "The inspected supported-input before/after frames keep the same uninitialized refrigerator, blank stage explanation and unchanged output. The retained source object-form params.define throws before registering the render subscription; v3 records that initialization exception. Thus the original dead-control finding remains, not a merely small visual delta.", + "finalResult": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-final/codex/refrigerator/result.json", + "cardRuntimeErrors": [ + "exception: Error: Parameter names are letters, digits, - and _: [object Object]" + ] + }, + { + "provider": "Codex", + "group": "baseline", + "prompt": "refrigerator", + "width": 710, + "index": 2, + "label": "2. Compress", + "classification": "dead", + "reason": "The attempted control leaves the mechanism/readout unchanged in both raw and v2 images. The exact card calls params.define with an object instead of (name, spec). The retained controls.log records \u201cParameter names are letters, digits, - and _: [object Object]\u201d. That exception aborts initialization before the change subscription; database-index also never registers its keyboard listener. Native slider thumbs alone can still move. This is a generated-code defect, independently of any unsupported/wrong-modality harness failure.", + "evidence": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/control-audit-codex-sheets/baseline-refrigerator-2.png", + "finalVerdict": "dead", + "finalReason": "The inspected supported-input before/after frames keep the same uninitialized refrigerator, blank stage explanation and unchanged output. The retained source object-form params.define throws before registering the render subscription; v3 records that initialization exception. Thus the original dead-control finding remains, not a merely small visual delta.", + "finalResult": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-final/codex/refrigerator/result.json", + "cardRuntimeErrors": [ + "exception: Error: Parameter names are letters, digits, - and _: [object Object]" + ] + }, + { + "provider": "Codex", + "group": "baseline", + "prompt": "refrigerator", + "width": 710, + "index": 3, + "label": "3. Release", + "classification": "dead", + "reason": "The attempted control leaves the mechanism/readout unchanged in both raw and v2 images. The exact card calls params.define with an object instead of (name, spec). The retained controls.log records \u201cParameter names are letters, digits, - and _: [object Object]\u201d. That exception aborts initialization before the change subscription; database-index also never registers its keyboard listener. Native slider thumbs alone can still move. This is a generated-code defect, independently of any unsupported/wrong-modality harness failure.", + "evidence": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/control-audit-codex-sheets/baseline-refrigerator-3.png", + "finalVerdict": "dead", + "finalReason": "The inspected supported-input before/after frames keep the same uninitialized refrigerator, blank stage explanation and unchanged output. The retained source object-form params.define throws before registering the render subscription; v3 records that initialization exception. Thus the original dead-control finding remains, not a merely small visual delta.", + "finalResult": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-final/codex/refrigerator/result.json", + "cardRuntimeErrors": [ + "exception: Error: Parameter names are letters, digits, - and _: [object Object]" + ] + }, + { + "provider": "Codex", + "group": "baseline", + "prompt": "refrigerator", + "width": 710, + "index": 4, + "label": "4. Expand", + "classification": "dead", + "reason": "The attempted control leaves the mechanism/readout unchanged in both raw and v2 images. The exact card calls params.define with an object instead of (name, spec). The retained controls.log records \u201cParameter names are letters, digits, - and _: [object Object]\u201d. That exception aborts initialization before the change subscription; database-index also never registers its keyboard listener. Native slider thumbs alone can still move. This is a generated-code defect, independently of any unsupported/wrong-modality harness failure.", + "evidence": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/control-audit-codex-sheets/baseline-refrigerator-4.png", + "finalVerdict": "dead", + "finalReason": "The inspected supported-input before/after frames keep the same uninitialized refrigerator, blank stage explanation and unchanged output. The retained source object-form params.define throws before registering the render subscription; v3 records that initialization exception. Thus the original dead-control finding remains, not a merely small visual delta.", + "finalResult": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-final/codex/refrigerator/result.json", + "cardRuntimeErrors": [ + "exception: Error: Parameter names are letters, digits, - and _: [object Object]" + ] + }, + { + "provider": "Codex", + "group": "baseline", + "prompt": "seat-belt", + "width": 710, + "index": 0, + "label": "Braking condition; use arrow keys", + "classification": "dead", + "reason": "The attempted control leaves the mechanism/readout unchanged in both raw and v2 images. The exact card calls params.define with an object instead of (name, spec). The retained controls.log records \u201cParameter names are letters, digits, - and _: [object Object]\u201d. That exception aborts initialization before the change subscription; database-index also never registers its keyboard listener. Native slider thumbs alone can still move. This is a generated-code defect, independently of any unsupported/wrong-modality harness failure.", + "evidence": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/control-audit-codex-sheets/baseline-seat-belt-0.png", + "finalVerdict": "dead", + "finalReason": "The inspected supported-input pair retains the same reel/latch and Free to unwind output with no mode explanation. Source initialization throws on object-form params.define before render subscription and animation registration; v3 captures the same exception. The original dead-control finding remains.", + "finalResult": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-final/codex/seat-belt/result.json", + "cardRuntimeErrors": [ + "exception: Error: Parameter names are letters, digits, - and _: [object Object]" + ] + }, + { + "provider": "Codex", + "group": "baseline", + "prompt": "seat-belt", + "width": 710, + "index": 1, + "label": "Normal movement", + "classification": "dead", + "reason": "The attempted control leaves the mechanism/readout unchanged in both raw and v2 images. The exact card calls params.define with an object instead of (name, spec). The retained controls.log records \u201cParameter names are letters, digits, - and _: [object Object]\u201d. That exception aborts initialization before the change subscription; database-index also never registers its keyboard listener. Native slider thumbs alone can still move. This is a generated-code defect, independently of any unsupported/wrong-modality harness failure.", + "evidence": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/control-audit-codex-sheets/baseline-seat-belt-1.png", + "finalVerdict": "dead", + "finalReason": "The inspected supported-input pair retains the same reel/latch and Free to unwind output with no mode explanation. Source initialization throws on object-form params.define before render subscription and animation registration; v3 captures the same exception. The original dead-control finding remains.", + "finalResult": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-final/codex/seat-belt/result.json", + "cardRuntimeErrors": [ + "exception: Error: Parameter names are letters, digits, - and _: [object Object]" + ] + }, + { + "provider": "Codex", + "group": "baseline", + "prompt": "seat-belt", + "width": 710, + "index": 2, + "label": "Sudden braking", + "classification": "dead", + "reason": "The attempted control leaves the mechanism/readout unchanged in both raw and v2 images. The exact card calls params.define with an object instead of (name, spec). The retained controls.log records \u201cParameter names are letters, digits, - and _: [object Object]\u201d. That exception aborts initialization before the change subscription; database-index also never registers its keyboard listener. Native slider thumbs alone can still move. This is a generated-code defect, independently of any unsupported/wrong-modality harness failure.", + "evidence": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/control-audit-codex-sheets/baseline-seat-belt-2.png", + "finalVerdict": "dead", + "finalReason": "The inspected supported-input pair retains the same reel/latch and Free to unwind output with no mode explanation. Source initialization throws on object-form params.define before render subscription and animation registration; v3 captures the same exception. The original dead-control finding remains.", + "finalResult": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-final/codex/seat-belt/result.json", + "cardRuntimeErrors": [ + "exception: Error: Parameter names are letters, digits, - and _: [object Object]" + ] + }, + { + "provider": "Codex", + "group": "baseline", + "prompt": "spray-bottle", + "width": 710, + "index": 0, + "label": "Pump stroke", + "classification": "harness error", + "reason": "The drag frames stay at Release. The script changes phase on arrow/space keys; there is no stage drag handler. A keyboard check is absent, so no whole-control liveness claim follows from this drag failure.", + "evidence": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/control-audit-codex-sheets/baseline-spray-bottle-0.png", + "finalVerdict": "live", + "finalReason": "The inspected ArrowRight pair changes Release to Squeeze: mist appears, piston/spring geometry changes and the explanation and external readout update. The saved global keyboard handler explicitly supports ArrowRight and switches the phase before animation, so this is an input-caused transition. The captured initialization runtime error still rejects the card.", + "finalResult": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-final/codex/spray-bottle/result.json", + "cardRuntimeErrors": [ + "exception: Error: Parameter names are letters, digits, - and _: [object Object]" + ] + }, + { + "provider": "Codex", + "group": "baseline", + "prompt": "stapler", + "width": 710, + "index": 0, + "label": "Stapler cycle", + "classification": "harness error", + "reason": "The stage drag frames stay at Ready. Arrow/Home/End handlers change the cycle; the separate range is the pointer control. A keyboard check is absent, so no whole-control liveness claim follows from this drag failure.", + "evidence": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/control-audit-codex-sheets/baseline-stapler-0.png", + "finalVerdict": "live", + "finalReason": "The inspected End pair changes Ready to Release and replaces the explanatory paragraph with the return-spring/feed-spring stage. The saved source explicitly handles End and sets cycle 100; there is no autonomous cycle timer.", + "finalResult": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-final/codex/stapler/result.json", + "cardRuntimeErrors": [] + }, + { + "provider": "Codex", + "group": "baseline", + "prompt": "stapler", + "width": 710, + "index": 2, + "label": "Next stage \u2192", + "classification": "harness error", + "reason": "Next stage changes Release to Ready, resets the cycle from 86 to 0, and changes the paragraph. The scorer rejected unequal screenshot dimensions instead of evaluating the visible output change.", + "evidence": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/control-audit-codex-sheets/baseline-stapler-2.png", + "finalVerdict": "live", + "finalReason": "The inspected Next-stage click resets Release to Ready, changes the mechanism geometry and explanatory paragraph, matching the saved synchronous next-stage handler.", + "finalResult": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-final/codex/stapler/result.json", + "cardRuntimeErrors": [] + }, + { + "provider": "Codex", + "group": "baseline", + "prompt": "toilet", + "width": 710, + "index": 0, + "label": "Flush cycle; use left and right arrow keys", + "classification": "harness error", + "reason": "The drag frames stay at Ready. The stage advertises the selector or arrow keys and implements keyboard input; it does not implement dragging. A keyboard check is absent, so no whole-control liveness claim follows from this drag failure.", + "evidence": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/control-audit-codex-sheets/baseline-toilet-0.png", + "finalVerdict": "live", + "finalReason": "The inspected End pair changes Ready to Shut off and the external readout and paragraph to Float raised / refill shuts off. The saved source explicitly handles End, stops the timer first and selects phase 4, so this is a supported input route rather than autonomous cycle settling.", + "finalResult": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-final/codex/toilet/result.json", + "cardRuntimeErrors": [] + }, + { + "provider": "Codex", + "group": "baseline", + "prompt": "umbrella", + "width": 710, + "index": 0, + "label": "Cutaway umbrella showing a sliding runner, hinged stretchers, ribs and fabric", + "classification": "harness error", + "reason": "The inventory detects a focusable keyboard surface but produces Unsupported exposed control instead of exercising its registered keys. I inspected the retained static card image and source; there are no per-control before/after images for this surface. Other controls working does not prove this surface works.", + "evidence": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/control-audit-codex-sheets/baseline-umbrella-0.png", + "finalVerdict": "live", + "finalReason": "The inspected Home pair draws a closed umbrella and closed-state explanation from the initially blank stage. The saved handler explicitly supports Home and changes the target opening before rendering. This proves the input route, while the initialization exception still rejects the whole card.", + "finalResult": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-final/codex/umbrella/result.json", + "cardRuntimeErrors": [ + "exception: Error: Parameter names are letters, digits, - and _: [object Object]" + ] + }, + { + "provider": "Codex", + "group": "baseline", + "prompt": "umbrella", + "width": 710, + "index": 1, + "label": "Open", + "classification": "harness error", + "reason": "Open creates the extended umbrella drawing and inserts its explanatory text. The scorer rejected unequal screenshot dimensions instead of evaluating the visible output change.", + "evidence": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/control-audit-codex-sheets/baseline-umbrella-1.png", + "finalVerdict": "live", + "finalReason": "The inspected Open click unfolds the canopy and ribs, raises the runner and changes the explanatory text to the open state. Its saved handler sets opening 100; the visible change is not merely control styling. The card initialization runtime error remains disqualifying.", + "finalResult": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-final/codex/umbrella/result.json", + "cardRuntimeErrors": [ + "exception: Error: Parameter names are letters, digits, - and _: [object Object]" + ] + }, + { + "provider": "Codex", + "group": "baseline", + "prompt": "umbrella", + "width": 710, + "index": 3, + "label": "Opening position", + "classification": "harness error", + "reason": "Moving the range changes the umbrella from partly closed to spread. Visible in both raw and v2 pairs; raw masking lost the drawing output, and v2 now passes this control.", + "evidence": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/control-audit-codex-sheets/baseline-umbrella-3.png", + "finalVerdict": "live", + "finalReason": "stable output changed outside controls", + "finalResult": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-final/codex/umbrella/result.json", + "cardRuntimeErrors": [ + "exception: Error: Parameter names are letters, digits, - and _: [object Object]" + ] + }, + { + "provider": "Codex", + "group": "baseline", + "prompt": "umbrella", + "width": 710, + "index": 4, + "label": "cutaway", + "classification": "harness error", + "reason": "Toggling Cutaway changes the visible fabric over the ribs. Visible in both raw and v2 pairs; raw masking lost the drawing output, and v2 now passes this control.", + "evidence": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/control-audit-codex-sheets/baseline-umbrella-4.png", + "finalVerdict": "live", + "finalReason": "stable output changed outside controls", + "finalResult": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-final/codex/umbrella/result.json", + "cardRuntimeErrors": [ + "exception: Error: Parameter names are letters, digits, - and _: [object Object]" + ] + }, + { + "provider": "Codex", + "group": "baseline", + "prompt": "washing-machine", + "width": 710, + "index": 0, + "label": "control 0", + "classification": "harness error", + "reason": "The inventory detects a focusable keyboard surface but produces Unsupported exposed control instead of exercising its registered keys. I inspected the retained static card image and source; there are no per-control before/after images for this surface. Other controls working does not prove this surface works.", + "evidence": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/control-audit-codex-sheets/baseline-washing-machine-0.png", + "finalVerdict": "live", + "finalReason": "Supported ArrowRight changes Fill to Wash, including the explanatory paragraph and readout. No autonomous stage advance exists in the saved handler.", + "finalResult": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-final/codex/washing-machine/result.json", + "cardRuntimeErrors": [] + }, + { + "provider": "Codex", + "group": "baseline", + "prompt": "washing-machine", + "width": 710, + "index": 1, + "label": "Fill", + "classification": "harness error", + "reason": "Fill changes the selected stage and paragraph from Wash to Fill. The scorer rejected unequal screenshot dimensions instead of evaluating the visible output change.", + "evidence": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/control-audit-codex-sheets/baseline-washing-machine-1.png", + "finalVerdict": "live", + "finalReason": "Click Fill changes Wash to Fill and replaces the mechanism explanation/readout.", + "finalResult": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-final/codex/washing-machine/result.json", + "cardRuntimeErrors": [] + }, + { + "provider": "Codex", + "group": "baseline", + "prompt": "washing-machine", + "width": 710, + "index": 2, + "label": "Wash", + "classification": "harness error", + "reason": "Wash changes the stage paragraph from Fill to Wash. The scorer rejected unequal screenshot dimensions instead of evaluating the visible output change.", + "evidence": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/control-audit-codex-sheets/baseline-washing-machine-2.png", + "finalVerdict": "live", + "finalReason": "Click Wash changes Fill to Wash and replaces the mechanism explanation/readout.", + "finalResult": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-final/codex/washing-machine/result.json", + "cardRuntimeErrors": [] + }, + { + "provider": "Codex", + "group": "baseline", + "prompt": "washing-machine", + "width": 710, + "index": 3, + "label": "Drain", + "classification": "harness error", + "reason": "Drain removes the water and changes the drain/hose appearance and paragraph. The scorer rejected unequal screenshot dimensions instead of evaluating the visible output change.", + "evidence": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/control-audit-codex-sheets/baseline-washing-machine-3.png", + "finalVerdict": "live", + "finalReason": "Click Drain visibly removes tank water, lights the drain route and changes the explanation/readout.", + "finalResult": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-final/codex/washing-machine/result.json", + "cardRuntimeErrors": [] + }, + { + "provider": "Codex", + "group": "baseline", + "prompt": "washing-machine", + "width": 710, + "index": 5, + "label": "Spin", + "classification": "harness error", + "reason": "Spin removes the rinse water and changes the stage paragraph and mechanism appearance. The scorer rejected unequal screenshot dimensions instead of evaluating the visible output change.", + "evidence": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/control-audit-codex-sheets/baseline-washing-machine-5.png", + "finalVerdict": "live", + "finalReason": "Click Spin visibly removes tank water, changes drum appearance and explains spinning/draining instead of filling.", + "finalResult": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-final/codex/washing-machine/result.json", + "cardRuntimeErrors": [] + }, + { + "provider": "Codex", + "group": "baseline", + "prompt": "websocket", + "width": 710, + "index": 0, + "label": "Chat message delivery steps", + "classification": "harness error", + "reason": "The inventory detects a focusable keyboard surface but produces Unsupported exposed control instead of exercising its registered keys. I inspected the retained static card image and source; there are no per-control before/after images for this surface. Other controls working does not prove this surface works.", + "evidence": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/control-audit-codex-sheets/baseline-websocket-0.png", + "finalVerdict": "live", + "finalReason": "The inspected End key changes Connections open to Chat view updated, adds sender/server/recipient content and changes the paragraph to recipient push delivery. The saved keyboard handler explicitly supports End and sets step 3; no autonomous animation is used.", + "finalResult": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-final/codex/websocket/result.json", + "cardRuntimeErrors": [] + }, + { + "provider": "Codex", + "group": "baseline", + "prompt": "websocket", + "width": 710, + "index": 1, + "label": "Connect", + "classification": "harness error", + "reason": "Connect changes Message sent to Connections open and changes the paragraph. The scorer rejected unequal screenshot dimensions instead of evaluating the visible output change.", + "evidence": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/control-audit-codex-sheets/baseline-websocket-1.png", + "finalVerdict": "live", + "finalReason": "The inspected Connect click changes Message sent to Connections open, removes the message from the mechanism and replaces the external explanation with establishing connections.", + "finalResult": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-final/codex/websocket/result.json", + "cardRuntimeErrors": [] + }, + { + "provider": "Codex", + "group": "baseline", + "prompt": "websocket", + "width": 710, + "index": 2, + "label": "Send", + "classification": "harness error", + "reason": "Send changes Connections open to Message sent and changes the paragraph. The scorer rejected unequal screenshot dimensions instead of evaluating the visible output change.", + "evidence": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/control-audit-codex-sheets/baseline-websocket-2.png", + "finalVerdict": "live", + "finalReason": "The inspected Send click adds a sender message/envelope and changes the independent readout and explanation from Connections open to Message sent.", + "finalResult": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-final/codex/websocket/result.json", + "cardRuntimeErrors": [] + }, + { + "provider": "Codex", + "group": "baseline", + "prompt": "websocket", + "width": 710, + "index": 3, + "label": "Server", + "classification": "harness error", + "reason": "Server moves the message to the middle server and changes the readout to Stored on server. The scorer rejected unequal screenshot dimensions instead of evaluating the visible output change.", + "evidence": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/control-audit-codex-sheets/baseline-websocket-3.png", + "finalVerdict": "live", + "finalReason": "The inspected Server click adds message history and server output to the diagram and changes the external readout and paragraph to server validation/storage.", + "finalResult": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-final/codex/websocket/result.json", + "cardRuntimeErrors": [] + }, + { + "provider": "Codex", + "group": "baseline", + "prompt": "websocket", + "width": 710, + "index": 5, + "label": "Connected", + "classification": "harness error", + "reason": "Connected closes the connection latch, shows the receiving message, and replaces the disconnected explanation with catch-up text. The scorer rejected unequal screenshot dimensions instead of evaluating the visible output change.", + "evidence": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/control-audit-codex-sheets/baseline-websocket-5.png", + "finalVerdict": "live", + "finalReason": "From Disconnected at Receive, the inspected Connected click restores recipient message output, closes the latch and changes the readout/paragraph to successful catch-up. This is visible application behavior, not selection styling.", + "finalResult": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-final/codex/websocket/result.json", + "cardRuntimeErrors": [] + }, + { + "provider": "Codex", + "group": "baseline", + "prompt": "websocket", + "width": 710, + "index": 6, + "label": "Disconnected", + "classification": "harness error", + "reason": "Disconnected opens the latch, removes the received message, and explains why it was not received. The scorer rejected unequal screenshot dimensions instead of evaluating the visible output change.", + "evidence": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/control-audit-codex-sheets/baseline-websocket-6.png", + "finalVerdict": "live", + "finalReason": "The inspected Disconnected click removes the recipient's received-message output, opens the latch and changes the readout/explanation to undelivered push and stored history. The saved subscription updates this state synchronously.", + "finalResult": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-final/codex/websocket/result.json", + "cardRuntimeErrors": [] + }, + { + "provider": "Codex", + "group": "baseline", + "prompt": "zipper", + "width": 710, + "index": 0, + "label": "Zipper position", + "classification": "dead", + "reason": "The attempted drag frames are identical; the stage actually advertises keyboard input. The advertised keyboard handler calls the baseline params.set({ ... }) form. The captured baseline bridge only supports set(name, value), looks up specs[name], and silently returns for this object; therefore the intended keyboard interaction cannot update its parameter. The unsupported/drag failure alone was not used to infer death.", + "evidence": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/control-audit-codex-sheets/baseline-zipper-0.png", + "finalVerdict": "dead", + "finalReason": "The supported ArrowRight route leaves slider position at 50 and the mechanism unchanged in the inspected pair. The exact saved keyboard handler calls object-form params.set, which the frozen baseline silently ignores; the separate native range working does not repair this stage.", + "finalResult": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-final/codex/zipper/result.json", + "cardRuntimeErrors": [] + }, + { + "provider": "Codex", + "group": "baseline", + "prompt": "zipper", + "width": 710, + "index": 1, + "label": "Slider position \u00b7 right closes", + "classification": "harness error", + "reason": "Moving the range shifts the zipper slider and changes the length of meshed teeth. Visible in both raw and v2 pairs; raw masking lost the drawing output, and v2 now passes this control.", + "evidence": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/control-audit-codex-sheets/baseline-zipper-1.png", + "finalVerdict": "live", + "finalReason": "stable output changed outside controls", + "finalResult": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-final/codex/zipper/result.json", + "cardRuntimeErrors": [] + }, + { + "provider": "Codex", + "group": "pilot", + "prompt": "bicycle-pump", + "width": 710, + "index": 0, + "label": "Pump stroke phase", + "classification": "harness error", + "reason": "Both drag frames remain Pull up: fill. The stage is keyboard-operated and has no drag handler. The source implements arrow keys and the neighboring Next button has retained successful output; those facts do not visually prove the untested stage keys.", + "evidence": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/control-audit-codex-sheets/pilot-bicycle-pump-0.png", + "finalVerdict": "live", + "finalReason": "Actual ArrowRight frames show piston moving down, compressed air chamber, inlet closure and a new compression paragraph/readout. Saved handler explicitly supports ArrowRight and selects phase 1 without autonomous settling.", + "finalResult": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-final/codex/bicycle-pump/result.json", + "cardRuntimeErrors": [] + }, + { + "provider": "Codex", + "group": "pilot", + "prompt": "bicycle-pump", + "width": 710, + "index": 1, + "label": "\u2190 Previous", + "classification": "harness error", + "reason": "Previous is correctly disabled at phase 0. The runner records it as unexercised, then Next advances the card and enables Previous (retained controls.log inventories), but it does not return to test Previous. There are no per-control before/after images; static card and adjacent stage images were inspected. The source has a previous-phase handler; its liveness remains unproven.", + "evidence": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/control-audit-codex-sheets/pilot-bicycle-pump-1.png", + "finalVerdict": "live", + "finalReason": "Precondition Next enables Previous; click returns compression to fill, raises piston, opens inlet and replaces explanation.", + "finalResult": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-final/codex/bicycle-pump/result.json", + "cardRuntimeErrors": [] + }, + { + "provider": "Codex", + "group": "pilot", + "prompt": "cdn", + "width": 710, + "index": 0, + "label": "Fig 1 \u00b7 Distributed copiesBefore purge\n\n\nv1Edge Av1 cachedv1Edge Bv1 cachedv1Edge Cv1 cached\nv1Origi", + "classification": "harness error", + "reason": "Focusable plate is marked unsupported, so the only retained visual is a static card. Source supplies arrow-key input and the prototype bridge supports object-form set. No keys were exercised; the separate phase-bounds defect also restricts the intended stages. Do not call this surface dead from the unsupported inventory result.", + "evidence": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/control-audit-codex-sheets/pilot-cdn-0.png", + "finalVerdict": "unproven", + "finalReason": "Only partial behavior is proved: ArrowRight advances Before purge to Purge accepted (0 to 1), but the saved phase definition omits numeric bounds and the frozen bridge defaults to 0..1. The full advertised 0..4 journey cannot be inferred from that single visible transition. Planned repeated-key/manual bounds evidence is needed; this must not become a whole-card pass.", + "finalResult": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-final/codex/cdn/result.json", + "cardRuntimeErrors": [] + }, + { + "provider": "Codex", + "group": "pilot", + "prompt": "cdn", + "width": 710, + "index": 1, + "label": "phase", + "classification": "dead", + "reason": "The thumb moves from roughly quarter to three-quarter, but both frames remain Purge accepted with identical racks and explanation. Generated phase is defined as a numeric parameter with value but no min/max/default, so the prototype bridge clamps it to 0..1 rather than the input\u2019s 0..4. The full sequence is unreachable through this range.", + "evidence": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/control-audit-codex-sheets/pilot-cdn-1.png", + "finalVerdict": "dead", + "finalReason": "Actual subsequent range drag reaches DOM value4 while diagram and explanation remain phase1/Purge accepted. The input thumb moves but bridge phase clamps to1; visible later stages do not work.", + "finalResult": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-final/codex/cdn/result.json", + "cardRuntimeErrors": [] + }, + { + "provider": "Codex", + "group": "pilot", + "prompt": "cdn", + "width": 710, + "index": 3, + "label": "browser", + "classification": "harness error", + "reason": "Checking browser cache changes the readout to Local browser HIT and adds the explanation of the retained browser copy. The scorer rejected unequal screenshot dimensions instead of evaluating the visible output change.", + "evidence": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/control-audit-codex-sheets/pilot-cdn-3.png", + "finalVerdict": "live", + "finalReason": "The actual browser-cache checkbox changes the readout from Edge HIT to Local browser HIT and replaces the viewer explanation with the browser retaining its fresh v1 copy. This is independent visible output beyond checkbox styling.", + "finalResult": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-final/codex/cdn/result.json", + "cardRuntimeErrors": [] + }, + { + "provider": "Codex", + "group": "pilot", + "prompt": "cdn", + "width": 710, + "index": 5, + "label": "Next stage \u2192", + "classification": "dead", + "reason": "Both frames remain Purge accepted. Next requests phase 2, but the generated phase definition omitted max:4; the parameter is already at the bridge\u2019s default maximum 1, so the update is a no-op. Unlike the raw baseline bridge, the prototype does support the object-form set used here.", + "evidence": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/control-audit-codex-sheets/pilot-cdn-5.png", + "finalVerdict": "dead", + "finalReason": "Next advances initial0 to1, then further real Next remains phase1/Purge accepted. Three advertised later phases are inaccessible because bridge default max1 clamps phase.", + "finalResult": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-final/codex/cdn/result.json", + "cardRuntimeErrors": [] + } + ] +} diff --git a/plugins/playgrounds/evals/launch/reports/gate-1/gate-1-summary.json b/plugins/playgrounds/evals/launch/reports/gate-1/gate-1-summary.json new file mode 100644 index 000000000..0595424ec --- /dev/null +++ b/plugins/playgrounds/evals/launch/reports/gate-1/gate-1-summary.json @@ -0,0 +1,148 @@ +{ + "updatedAt": "2026-10-20T07:03:44.744885+00:00", + "measurements": [ + { + "revision": "baseline", + "scorerCommit": "f009de5838f80b90e861e5727f0ad11cba8814f8", + "controlReplay": true, + "controlAdjudicated": true, + "provider": "claude-code", + "complete": true, + "completed": 20, + "total": 20, + "medianMs": 595881, + "p90Ms": 900000, + "liveCards": 14, + "clarifyingQuestions": 0, + "questionReviewsNeeded": 0, + "progressShown": 15, + "failures": 6, + "pass": false + }, + { + "revision": "baseline", + "scorerCommit": "f009de5838f80b90e861e5727f0ad11cba8814f8", + "controlReplay": true, + "controlAdjudicated": true, + "provider": "codex", + "complete": true, + "completed": 20, + "total": 20, + "medianMs": 114722, + "p90Ms": 164764, + "liveCards": 6, + "clarifyingQuestions": 0, + "questionReviewsNeeded": 0, + "progressShown": 20, + "failures": 14, + "pass": false + }, + { + "revision": "prototype", + "scorerCommit": "f009de5838f80b90e861e5727f0ad11cba8814f8", + "controlReplay": true, + "controlAdjudicated": true, + "provider": "claude-code", + "complete": true, + "completed": 20, + "total": 20, + "medianMs": 236051.5, + "p90Ms": 331297, + "liveCards": 19, + "clarifyingQuestions": 0, + "questionReviewsNeeded": 0, + "progressShown": 19, + "failures": 2, + "pass": false + }, + { + "revision": "prototype", + "scorerCommit": "f009de5838f80b90e861e5727f0ad11cba8814f8", + "controlReplay": true, + "controlAdjudicated": true, + "provider": "codex", + "complete": true, + "completed": 20, + "total": 20, + "medianMs": 87631, + "p90Ms": 102093, + "liveCards": 15, + "clarifyingQuestions": 0, + "questionReviewsNeeded": 0, + "progressShown": 20, + "failures": 5, + "pass": false + } + ], + "auditedControls": 96, + "audit": "gate-1-control-audit.json", + "timing": "claude-timing-analysis.json", + "renderGraceAffectedAttempts": [ + { + "revision": "baseline", + "provider": "claude-code", + "promptId": "toilet", + "completionSource": "terminal-observed", + "agentCompletedAt": 1792453693316, + "terminalObservedAt": 1792453693316, + "renderDelayMs": 308, + "renderGraceRetainedCard": true, + "scoreMs": 581928 + }, + { + "revision": "baseline", + "provider": "codex", + "promptId": "thermos", + "completionSource": "turn.completedAt", + "agentCompletedAt": 1792464032172, + "terminalObservedAt": 1792464033116, + "renderDelayMs": null, + "renderGraceRetainedCard": false, + "scoreMs": 900000 + }, + { + "revision": "baseline", + "provider": "codex", + "promptId": "toaster", + "completionSource": "turn.completedAt", + "agentCompletedAt": 1792464796174, + "terminalObservedAt": 1792464796292, + "renderDelayMs": null, + "renderGraceRetainedCard": false, + "scoreMs": 900000 + }, + { + "revision": "prototype", + "provider": "claude-code", + "promptId": "database-index", + "completionSource": "terminal-observed", + "agentCompletedAt": 1792471876167, + "terminalObservedAt": 1792471876167, + "renderDelayMs": 80, + "renderGraceRetainedCard": true, + "scoreMs": 248126 + }, + { + "revision": "prototype", + "provider": "claude-code", + "promptId": "umbrella", + "completionSource": "terminal-observed", + "agentCompletedAt": 1792471271704, + "terminalObservedAt": 1792471271704, + "renderDelayMs": 117, + "renderGraceRetainedCard": true, + "scoreMs": 178751 + }, + { + "revision": "prototype", + "provider": "claude-code", + "promptId": "websocket", + "completionSource": "terminal-observed", + "agentCompletedAt": 1792472296787, + "terminalObservedAt": 1792472296787, + "renderDelayMs": 104, + "renderGraceRetainedCard": true, + "scoreMs": 209497 + } + ] +} diff --git a/plugins/playgrounds/evals/launch/reports/gate-1/gate-1-summary.md b/plugins/playgrounds/evals/launch/reports/gate-1/gate-1-summary.md new file mode 100644 index 000000000..2dc5491b3 --- /dev/null +++ b/plugins/playgrounds/evals/launch/reports/gate-1/gate-1-summary.md @@ -0,0 +1,255 @@ +# Playgrounds launch — gate 1 + +Updated 2026-10-20T07:03:44.744885+00:00. All 80 attempts and saved-card replays are complete. Control counts include visual review and real-input adjudication; original agent runs and delivery times are unchanged. + +**Gate decision:** NOT MET for the full prototype. The table separates delivery speed from verified-live cards; an excluded card is not automatically a dead-control finding. + + +| Revision / provider | Scored attempts | Median min | p90 min | Every control proven live | Questions | Progress | +|---|---:|---:|---:|---:|---:|---:| +| baseline — claude-code (final reviewed controls) | 20/20 | 9.93 | 15.00 | 14/20 | 0 | 15/20 | +| baseline — codex (final reviewed controls) | 20/20 | 1.91 | 2.75 | 6/20 | 0 | 20/20 | +| prototype — claude-code (final reviewed controls) | 20/20 | 3.93 | 5.52 | 19/20 | 0 | 19/20 | +| prototype — codex (final reviewed controls) | 20/20 | 1.46 | 1.70 | 15/20 | 0 | 20/20 | + +Gate requires ≥18/20 cards with every exposed control proven live, 0 clarifying questions, median ≤3 min, and p90 ≤6 min. Missing cards retain 15-minute cap scores. Median is the mean of sorted positions 10 and 11; p90 is nearest rank (position 18 of 20), so two capped attempts can coexist with a p90 below the cap. The fixed 30-second render grace stays bounded by the cap, and every affected attempt remains logged. These are delivery times on a shared host. Resolved defaults were Claude Code `claude-opus-5-5` and Codex `gpt-6.1-sol`; four baseline Claude infrastructure failures ended before a model was resolved. + +Baseline plugin `a632572aa58adc9b6ddf947c9e527587d09f22ca`; prototype `9de99949792c2c59b70693c1dcda6aa8cf36b428` (also includes R2 #510). Scorer revisions are recorded separately in each replay manifest. Raw baseline, prior v1/v2 replays, and first pilot remain unchanged. + +## Claude time breakdown + +**The ten-minute baseline is mainly pre-publication work.** The official 20-case median remains 9.93 min and p90 15.00 min; four infrastructure failures and one no-visible-card cap contribute five 15-minute scores. Among the 15 attempts with a proven visible card, the median is 9.13 min. These conditional diagnostics do not replace the gate numbers. + +For those 15 visible cards, the **mean** additive breakdown is: 10s to first tool, 401s reading/designing/generating/building before the first browser check, 128s checking/revising, and 13s from the first publish-containing command to the visible card. That is 9.21 min total, with 73% before the first browser check and 23% in checking/revision. Means are used here so the components add; per-phase medians must not be added. + +The two-prompt pilot reduced the matched pump/CDN mean from 8.07 to 4.01 min. Its mean additive breakdown is 19s startup, 162s before the first browser check, 37s checking/revision, and 22s publish-command-to-visible. Both still exceed three minutes. This is a two-topic pilot on a pressured shared host, not a representative percentile or a controlled causal estimate. + +**Full prototype:** all 20 Claude attempts produced visible cards; median 3.93 minutes, p90 5.52 minutes, 0 questions and observed progress in 19/20. The 17 figures with complete phase markers average 9s to first tool, 171s before the first browser check, 64s checking/revising and 12s from publication attempt to visibility. These components are means for that subset, not a decomposition of the all-20 median. + +Across the same 15 topics with visible baseline cards, mean delivery falls from 9.21 to 4.13 minutes; all 15 improve. The same 14 cases with complete phase markers show first-tool-to-browser work falling from 397s to 173s and checking/revision from 133s to 64s. Publication remains about 11–13s. Repeated craft checks and parameter-API discovery remain visible costs; timing gaps are not attributed to a particular cause. + +[Full prototype: all 20 phase rows, matched comparison, missing markers and concrete remaining waits](claude-full-prototype-timing.md). + +Reading a tool result, deciding geometry, generating code, and host/provider waits cannot be separated exactly from the retained timestamps. “Read/design/generation” is an elapsed envelope; observed read/setup calls themselves have a 7.7-second median union span. The timing analysis records all unattributed intervals without attributing them to model or host time. + +## All baseline phase envelopes + +| Case | Send → first tool | Read/design/generation → first write | Write/build → first browser check | Check/revise → publish command | Publish command → visible/cap | Visible / scored | +|---|---:|---:|---:|---:|---:|---:| +| [bicycle-pump](/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline/claude-code/bicycle-pump/result.json) | 6 | 136 | 252 | 112 | 16 | 522 / 522 | +| [cdn](/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline/claude-code/cdn/result.json) | 10 | 346 | 11 | 65 | 15 | 447 / 447 | +| [database-index](/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline/claude-code/database-index/result.json) | — | — | — | — | — | — / 900 | +| [dns](/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline/claude-code/dns/result.json) | — | — | — | — | — | — / 900 | +| [door-lock](/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline/claude-code/door-lock/result.json) | 9 | 412 | 17 | 220 | 10 | 668 / 668 | +| [git-merge](/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline/claude-code/git-merge/result.json) | 9 | 312 | 15 | 126 | 9 | 471 / 471 | +| [load-balancer](/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline/claude-code/load-balancer/result.json) | 6 | 243 | 7 | 74 | 11 | 341 / 341 | +| [narrow-toggle](/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline/claude-code/narrow-toggle/result.json) | — | — | — | — | — | — / 900 | +| [notification-settings](/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline/claude-code/notification-settings/result.json) | — | — | — | — | — | — / 900 | +| [refrigerator](/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline/claude-code/refrigerator/result.json) | 9 | 377 | 150 | 130 | 25 | 691 / 691 | +| [seat-belt](/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline/claude-code/seat-belt/result.json) | 8 | 449 | 134 | 199 | 110 | — / 900 | +| [spray-bottle](/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline/claude-code/spray-bottle/result.json) | 10 | 378 | 16 | 130 | 13 | 548 / 548 | +| [stapler](/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline/claude-code/stapler/result.json) | 9 | 347 | 58 | 190 | 15 | 618 / 618 | +| [thermos](/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline/claude-code/thermos/result.json) | 9 | 324 | 140 | 59 | 13 | 545 / 545 | +| [toaster](/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline/claude-code/toaster/result.json) | 11 | 342 | 10 | 73 | 13 | 449 / 449 | +| [toilet](/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline/claude-code/toilet/result.json) | 8 | 172 | 288 | 105 | 8 | 582 / 582 | +| [umbrella](/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline/claude-code/umbrella/result.json) | 31 | 385 | 17 | 161 | 16 | 610 / 610 | +| [washing-machine](/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline/claude-code/washing-machine/result.json) | 5 | 601 | 9 | 188 | 13 | 817 / 817 | +| [websocket](/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline/claude-code/websocket/result.json) | 8 | 364 | 8 | 183 | 12 | 575 / 575 | +| [zipper](/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline/claude-code/zipper/result.json) | 9 | 271 | 10 | 110 | 7 | 408 / 408 | + + +A dash means unavailable, not zero. The four infrastructure cases have no tool phase trace and are separated below. The seat-belt row ends at the 900s scoring cap; its actual runner wall duration is 920s. + +## First prototype pilot + +| Case | Send → first tool | Read/design/generation → first write | Write/build → first browser check | Check/revise → publish command | Publish command → visible/cap | Visible / scored | +|---|---:|---:|---:|---:|---:|---:| +| [bicycle-pump](/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype/claude-code/bicycle-pump/result.json) | 8 | 149 | 5 | 56 | 19 | 238 / 238 | +| [cdn](/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype/claude-code/cdn/result.json) | 30 | 165 | 5 | 18 | 25 | 243 / 243 | + + +Pump's first publish command also rebuilds and runs a 12-second browser check; its 19-second final envelope cannot be labeled publish overhead. CDN publishes at 219s, then exercises `setParams`/read and another browser check before the card is visible at 243s. Its initial first-tool delay is 30s versus 10s in the baseline. Both pilot traces still perform repeated parameter-API searches before writing. + +[Full phase definitions, tool provenance and infrastructure evidence](claude-timing-analysis.md). Four baseline infrastructure failures had no agent tool trace; seat belt reached publication but had no proven visible card. These still count at 15 minutes in the official score. + +## Manual audit of every failing baseline and first-pilot control + +Each row is a distinct provider/revision/prompt/width/control. The Claude source audit retains 67 failed observations across raw/v2/pilot; duplicates are combined below into 41 controls. Codex has 55 controls. Every available before/after PNG pair was visually reviewed. Ten Codex controls have only static captures, and the original Claude umbrella after capture is missing (its corrected pair was reviewed). Missing interaction proof is explicit. + +“Dead” requires a source/runtime defect corroborating the static or attempted visual evidence. “Harness error” identifies wrong modality, missing evidence/preconditions, invalid comparison, or a visibly responsive output rejected by scoring; it does not automatically grant a live card. “Live but unproven” retains conditional/animated effects whose promised behavior is not established by the saved pair. + +| Provider / revision | Dead | Live but unproven | Harness error | +|---|---:|---:|---:| +| Claude / baseline | 3 | 17 | 16 | +| Claude / pilot | 0 | 3 | 2 | +| Codex / baseline | 16 | 1 | 32 | +| Codex / pilot | 2 | 0 | 4 | + +A verified-live card count is a lower bound: an unproven control keeps its card out of that count. It is not evidence that every excluded card contains a dead control. The audit above establishes defects only for the controls explicitly classified dead. + +Confirmed dead controls occur in 1 Claude baseline card, 8 Codex baseline cards, 1 Codex pilot card. Separately, the baseline has five Claude and two Codex attempts with no proven visible card. These are distinct from the remaining control-proof failures. + +These are control counts within the previously failing subset, not card pass counts. The baseline refrigerator API error produces autonomous animation while its controls are disconnected; neither resize nor changing pixels alone is accepted as proof. + +| Provider / revision / prompt | Control (width) | Original failure classification | Final reviewed verdict | Finding and PNG evidence | +|---|---|---|---|---| +| Claude / baseline / git-merge | 2: Conflict (710px) | harness error | [live](/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-final/claude-code/git-merge/result.json) | Conflict changes the middle-row card geometry in v2; original scorer masked the separate interactive drawing. Visually confirmed corrected before/after PNGs; v2 changed=521. [PNGs](/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/claude-contact-sheets/0.png) | +| Claude / baseline / load-balancer | 0: Load balancer: left and right arrows change the algorithm, up and down change traffic (710px) | harness error | [live](/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-final/claude-code/load-balancer/result.json) | Keyboard-only stage was still tested with drag; unchanged drawing is not evidence of dead arrow-key controls. [PNGs](/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/claude-contact-sheets/28.png) | +| Claude / baseline / load-balancer | 1: Round robin (710px) | harness error | [live](/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-final/claude-code/load-balancer/result.json) | Round robin remains selected before/after: the chosen precondition dragged a keyboard-only stage and did not switch algorithms. [PNGs](/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/claude-contact-sheets/28.png) | +| Claude / baseline / load-balancer | 2: Least connections (710px) | harness error | [live](/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-final/claude-code/load-balancer/result.json) | Readout visibly changes from round robin to least connections; animated queue suffix prevents stable pixel proof. [PNGs](/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/claude-contact-sheets/28.png) | +| Claude / baseline / load-balancer | 4: Fewer requests (710px) | live but unproven | [live](/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-final/claude-code/load-balancer/result.json) | Traffic 3.0→2.5 req/s; label changes, but asynchronous queue differences do not isolate throughput effect. [PNGs](/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/claude-contact-sheets/32.png) | +| Claude / baseline / load-balancer | 5: More requests (710px) | live but unproven | [live](/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-final/claude-code/load-balancer/result.json) | Traffic 2.5→3.0 req/s; output needs a sustained rate comparison. [PNGs](/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/claude-contact-sheets/32.png) | +| Claude / baseline / load-balancer | 6: None (710px) | harness error | [live](/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-final/claude-code/load-balancer/result.json) | Slow None remains selected before/after; incorrect selected-button precondition leaves state unchanged. [PNGs](/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/claude-contact-sheets/32.png) | +| Claude / baseline / load-balancer | 7: 1 (710px) | live but unproven | [live](/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-final/claude-code/load-balancer/result.json) | Slow-server None→1; retained animated snapshots cannot isolate service-time effect. [PNGs](/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/claude-contact-sheets/36.png) | +| Claude / baseline / load-balancer | 8: 2 (710px) | live but unproven | [live](/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-final/claude-code/load-balancer/result.json) | Slow-server 1→2; retained animated snapshots cannot isolate service-time effect. [PNGs](/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/claude-contact-sheets/36.png) | +| Claude / baseline / load-balancer | 9: 3 (710px) | live but unproven | [live](/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-final/claude-code/load-balancer/result.json) | Slow-server 2→3; retained animated snapshots cannot isolate service-time effect. [PNGs](/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/claude-contact-sheets/36.png) | +| Claude / baseline / load-balancer | 10: 4 (710px) | live but unproven | [live](/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-final/claude-code/load-balancer/result.json) | Slow-server 3→4; retained animated snapshots cannot isolate service-time effect. [PNGs](/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/claude-contact-sheets/36.png) | +| Claude / baseline / load-balancer | 11: None (710px) | harness error | [live](/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-final/claude-code/load-balancer/result.json) | Failed-health-check None remains selected before/after; unrelated peer precondition does not create a failed server. [PNGs](/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/claude-contact-sheets/40.png) | +| Claude / baseline / load-balancer | 13: 2 (710px) | live but unproven | [live](/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-final/claude-code/load-balancer/result.json) | Health-check selection 1→2; output queues are animated and stable attributable output remains unproven. [PNGs](/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/claude-contact-sheets/40.png) | +| Claude / baseline / load-balancer | 14: 3 (710px) | live but unproven | [live](/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-final/claude-code/load-balancer/result.json) | Health-check selection 2→3; output queues are animated and stable attributable output remains unproven. [PNGs](/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/claude-contact-sheets/40.png) | +| Claude / baseline / load-balancer | 15: 4 (710px) | live but unproven | [live](/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-final/claude-code/load-balancer/result.json) | Health-check selection 3→4; output queues are animated and stable attributable output remains unproven. [PNGs](/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/claude-contact-sheets/44.png) | +| Claude / baseline / refrigerator | 0: Fridge thermostat: arrow keys change the set temperature (710px) | harness error | [live](/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-final/claude-code/refrigerator/result.json) (card runtime error) | Keyboard-only thermostat stage received a drag. Autonomous compressor cycling resized the card, not a proven gesture effect. [PNGs](/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/claude-contact-sheets/44.png) | +| Claude / baseline / refrigerator | 2: Room (710px) | dead | [dead](/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-final/claude-code/refrigerator/result.json) (card runtime error) | Native-size images: room changes17→35°C but model stays24% duty/28W leak. Invalid define(object) aborts subscription; console exception retained. [PNGs](/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/claude-contact-sheets/44.png) | +| Claude / baseline / spray-bottle | 0: Spray bottle: hold Space or press to squeeze the trigger, N turns the nozzle (710px) | live but unproven | [live](/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-final/claude-code/spray-bottle/result.json) | Both snapshots at rest; source requires held input or pulse. Existing drag/capture sequence fails to observe the transient response. [PNGs](/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/claude-contact-sheets/48.png) | +| Claude / baseline / stapler | 0: Stapler: arrow keys press and release the handle (710px) | live but unproven | [live](/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-final/claude-code/stapler/result.json) | Both v2 snapshots show the same clinched state despite UI handle0%. clientY handler exists, but compound-surface coordinates/masking and settled timing make this probe inconclusive. [PNGs](/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/claude-contact-sheets/48.png) | +| Claude / baseline / toilet | 0: Toilet tank: press Space or Enter to flush; value is litres in the tank (710px) | harness error | [live](/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-final/claude-code/toilet/result.json) | Role=slider is actually click/Space/Enter-to-flush. Drag does not dispatch its handler; autonomous refill changes are not gesture proof. [PNGs](/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/claude-contact-sheets/48.png) | +| Claude / baseline / toilet | 1: Water line (710px) | harness error | [live](/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-final/claude-code/toilet/result.json) | Waterline14.5→19cm visibly raises marker/water and litres; ambient stability criterion discards live simulated output. [PNGs](/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/claude-contact-sheets/52.png) | +| Claude / baseline / toilet | 2: Supply flow (710px) | harness error | [live](/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-final/claude-code/toilet/result.json) | Supply5.1→11.9L/min visibly changes refill readout and water volume; rejected because simulation remains in motion. [PNGs](/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/claude-contact-sheets/52.png) | +| Claude / baseline / toilet | 4: 4× (710px) | live but unproven | [live](/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-final/claude-code/toilet/result.json) | 4× selected at full idle tank; no visible output should change until another flush/refill. [PNGs](/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/claude-contact-sheets/52.png) | +| Claude / baseline / toilet | 5: 10× (710px) | live but unproven | [live](/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-final/claude-code/toilet/result.json) | 10× selected at full idle tank; needs active refill precondition. [PNGs](/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/claude-contact-sheets/56.png) | +| Claude / baseline / umbrella | 0: Umbrella: up and down arrows slide the runner, space snaps it open or shut (710px) | harness error | [live](/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-final/claude-code/umbrella/result.json) | Original after PNG is absent (ENOENT), so no visual verdict exists. Corrected v2 pair visibly opens the umbrella from 17cm to 122cm; changed=1056. [PNGs](/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/claude-contact-sheets/24.png) | +| Claude / baseline / washing-machine | 0: Washing machine: arrow keys step through fill, heat, wash, drain and spin; Home runs the whole cycle (710px) | harness error | [live](/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-final/claude-code/washing-machine/result.json) | Original captures reset hover state. Corrected v2 pair visibly changes 16rpm/0.07g to 1292rpm/447.84g; changed=1119. [PNGs](/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/claude-contact-sheets/24.png) | +| Claude / baseline / websocket | 0: Chat delivery time in milliseconds. Keys 1, 2 and 3 send from the left, front and right desks; M switches between WebSocket and polling; arrow keys change latency and the poll interval (710px) | harness error | [live](/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-final/claude-code/websocket/result.json) | Stage has click/keyboard send actions and no drag handler; the harness uses unsupported drag modality. [PNGs](/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/claude-contact-sheets/56.png) | +| Claude / baseline / websocket | 2: Polling (710px) | harness error | [live](/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-final/claude-code/websocket/result.json) | Readout changes WebSocket to Polling; stable parameter effect is mixed with animated clock/polling traffic. [PNGs](/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/claude-contact-sheets/56.png) | +| Claude / baseline / websocket | 3: Network latency, one way (710px) | live but unproven | [live](/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-final/claude-code/websocket/result.json) | Latency50→180ms label wraps and resizes card. Need an actual sent message to prove delivery latency; geometry alignment alone cannot prove it. [PNGs](/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/claude-contact-sheets/60.png) | +| Claude / baseline / load-balancer | 3: Random (710px) | harness error | [live](/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-final/claude-code/load-balancer/result.json) | Readout visibly changes from least connections to random; animated queue suffix prevents stable pixel proof. [PNGs](/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/claude-contact-sheets/32.png) | +| Claude / baseline / load-balancer | 12: 1 (710px) | live but unproven | [live](/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-final/claude-code/load-balancer/result.json) | Health-check selection None→1; output queues are animated and the fixed-size whole-card comparison is inconclusive. [PNGs](/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/claude-contact-sheets/40.png) | +| Claude / baseline / refrigerator | 1: Thermostat (710px) | dead | [dead](/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-final/claude-code/refrigerator/result.json) (card runtime error) | Thermostat UI rises to 6°C but model still reports switch-on 5.0/off 3.0 (default4°C). params.define(object) throws before subscription, leaving UI disconnected from model. [PNGs](/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/claude-contact-sheets/44.png) | +| Claude / baseline / refrigerator | 3: Door open (710px) | dead | [dead](/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-final/claude-code/refrigerator/result.json) (card runtime error) | Door button changes styling, while compressor cycles autonomously. Invalid define(object) aborts readParams/subscription; model never consumes door toggle. Resize alone would be a false positive. [PNGs](/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/claude-contact-sheets/48.png) | +| Claude / baseline / toilet | 3: 1× (710px) | live but unproven | [live](/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-final/claude-code/toilet/result.json) | 1× is selected near end of refill; tank becomes full. Cannot separate rate change from passage of time without matched refill windows. [PNGs](/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/claude-contact-sheets/52.png) | +| Claude / baseline / websocket | 1: WebSocket (710px) | harness error | [live](/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-final/claude-code/websocket/result.json) | Readout changes Polling to WebSocket handshake/connection; active animation makes whole-output stability too conservative. [PNGs](/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/claude-contact-sheets/56.png) | +| Claude / baseline / websocket | 4: Poll interval (710px) | live but unproven | [live](/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-final/claude-code/websocket/result.json) | Poll interval1000→4250ms; selected parameter updates but one snapshot pair cannot establish the longer interval. [PNGs](/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/claude-contact-sheets/60.png) | +| Claude / pilot / bicycle-pump | 0: Pump handle: drag down or use arrow keys; space pumps one stroke (710px) | live but unproven | [live](/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-final/claude-code/bicycle-pump/result.json) | Both pilot pump captures show33psi barrel/32.8psi tire and same handle pose. Drag and key handlers exist, but current pointer capture/preconditioning did not create distinct sampled states. Needs independent keyboard probe. [PNGs](/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/claude-contact-sheets/60.png) | +| Claude / pilot / cdn | 0: CDN purge timeline: arrow keys move through time, space plays or pauses (710px) | harness error | [live](/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-final/claude-code/cdn/result.json) | Pilot CDN timeline moves time (readout), but broad stage mask removes diagram/output and only14 stable changed pixels remain. Source supports pointer scrubbing and keys; recheck with output regions/key endpoints. [PNGs](/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/claude-contact-sheets/60.png) | +| Claude / pilot / cdn | 2: No purge, wait for TTL (710px) | harness error | [live](/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-final/claude-code/cdn/result.json) | No-purge button visibly rewrites explanatory result from purge completion to TTL expiry. Screenshot height changes; whole-image dimensions rejection discards the response. [PNGs](/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/claude-contact-sheets/64.png) | +| Claude / pilot / cdn | 3: control 3 (710px) | live but unproven | [live](/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-final/claude-code/cdn/result.json) | Purge-propagation slider22s→1m44s is tested with No purge selected. Propagation is correctly irrelevant in that mode; needs purge-enabled precondition. [PNGs](/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/claude-contact-sheets/64.png) | +| Claude / pilot / cdn | 5: control 5 (710px) | live but unproven | [live](/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-final/claude-code/cdn/result.json) | Browser max-age5m30→26m is still below the49m24 edge expiry that dominates this no-purge scenario. Result legitimately unchanged; needs a non-dominating TTL or longer browser expiry. [PNGs](/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/claude-contact-sheets/64.png) | +| Codex / baseline / cdn | 0: Seconds since purge; use left and right arrow keys (710px) | harness error | [unproven](/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-final/codex/cdn/result.json) | The retained low/high drag frames stay at 0 seconds. The stage advertises and registers keyboard input, not a pointer handler. The separate time parameter also has a bounds defect; this drag cannot adjudicate keyboard behavior. A keyboard check is absent, so no whole-control liveness claim follows from this drag failure. [PNGs](/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/control-audit-codex-sheets/baseline-cdn-0.png) | +| Codex / baseline / cdn | 1: time (710px) | dead | [dead](/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-final/codex/cdn/result.json) | The range thumb moves but both snapshots remain at 1 s with the same table/drawing. The generated definition supplies value but no min/max/default; the captured bridge defaults numeric bounds to 0..1, so the intended 0..90 range saturates at 1 and does not render its requested values. [PNGs](/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/control-audit-codex-sheets/baseline-cdn-1.png) | +| Codex / baseline / cdn | 3: local (710px) | harness error | [live](/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-final/codex/cdn/result.json) | Checking local/browser cache changes the status table to browser-served v1 and the explanatory paragraph; the card becomes shorter. The scorer rejected unequal screenshot dimensions instead of evaluating the visible output change. [PNGs](/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/control-audit-codex-sheets/baseline-cdn-3.png) | +| Codex / baseline / cdn | 4: late (710px) | live but unproven | [unproven](/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-final/codex/cdn/result.json) | The late checkbox changes selection but not the diagram/table. At the retained 1-second state the late-origin distinction has not reached a refill, and local/browser cache is enabled. The source wires the flag into the refill version calculation, but these frames never demonstrate that branch. The broken time bounds also limit access via the range. No claim that the checkbox is dead or visually proven. [PNGs](/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/control-audit-codex-sheets/baseline-cdn-4.png) | +| Codex / baseline / database-index | 0: Lookup comparison; arrow keys step through (710px) | dead | [dead](/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-final/codex/database-index/result.json) (card runtime error) | The retained card is static; this unsupported surface has no per-control interaction screenshots. The exact card calls params.define with an object instead of (name, spec). The retained controls.log records “Parameter names are letters, digits, - and _: [object Object]”. That exception aborts initialization before the change subscription; database-index also never registers its keyboard listener. Native slider thumbs alone can still move. This is a generated-code defect, independently of any unsupported/wrong-modality harness failure. [PNGs](/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/control-audit-codex-sheets/baseline-database-index-0.png) | +| Codex / baseline / database-index | 1: Find key (710px) | dead | [dead](/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-final/codex/database-index/result.json) (card runtime error) | The attempted control leaves the mechanism/readout unchanged in both raw and v2 images. The exact card calls params.define with an object instead of (name, spec). The retained controls.log records “Parameter names are letters, digits, - and _: [object Object]”. That exception aborts initialization before the change subscription; database-index also never registers its keyboard listener. Native slider thumbs alone can still move. This is a generated-code defect, independently of any unsupported/wrong-modality harness failure. [PNGs](/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/control-audit-codex-sheets/baseline-database-index-1.png) | +| Codex / baseline / database-index | 2: Lookup step (710px) | dead | [dead](/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-final/codex/database-index/result.json) (card runtime error) | The attempted control leaves the mechanism/readout unchanged in both raw and v2 images. The exact card calls params.define with an object instead of (name, spec). The retained controls.log records “Parameter names are letters, digits, - and _: [object Object]”. That exception aborts initialization before the change subscription; database-index also never registers its keyboard listener. Native slider thumbs alone can still move. This is a generated-code defect, independently of any unsupported/wrong-modality harness failure. [PNGs](/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/control-audit-codex-sheets/baseline-database-index-2.png) | +| Codex / baseline / dns | 0: DNS lookup step (710px) | harness error | [live](/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-final/codex/dns/result.json) (card runtime error) | The low/high drag frames stay on the same lookup step. The stage registers arrow/Home/End keys, not dragging. A keyboard check is absent, so no whole-control liveness claim follows from this drag failure. [PNGs](/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/control-audit-codex-sheets/baseline-dns-0.png) | +| Codex / baseline / dns | 2: Back (710px) | harness error | [live](/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-final/codex/dns/result.json) (card runtime error) | Back changes the resolver-cache step to the device-cache step and adds the opening explanation. The scorer rejected unequal screenshot dimensions instead of evaluating the visible output change. [PNGs](/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/control-audit-codex-sheets/baseline-dns-2.png) | +| Codex / baseline / door-lock | 0: Lock cutaway. Arrow keys choose a key; Enter attempts to turn it. (710px) | harness error | [live](/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-final/codex/door-lock/result.json) (card runtime error) | The inventory detects a focusable keyboard surface but produces Unsupported exposed control instead of exercising its registered keys. I inspected the retained static card image and source; there are no per-control before/after images for this surface. Other controls working does not prove this surface works. [PNGs](/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/control-audit-codex-sheets/baseline-door-lock-0.png) | +| Codex / baseline / door-lock | 2: Wrong key (710px) | harness error | [live](/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-final/codex/door-lock/result.json) (card runtime error) | Wrong key inserts a visible black key, moves the pins, and changes the explanatory paragraph. The scorer rejected unequal screenshot dimensions instead of evaluating the visible output change. [PNGs](/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/control-audit-codex-sheets/baseline-door-lock-2.png) | +| Codex / baseline / git-merge | 0: Document comparison machine. Use left and right arrow keys to switch scenarios. (710px) | dead | [dead](/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-final/codex/git-merge/result.json) | No per-control interaction screenshots exist; only the static card was captured. The advertised keyboard handler calls the baseline params.set({ ... }) form. The captured baseline bridge only supports set(name, value), looks up specs[name], and silently returns for this object; therefore the intended keyboard interaction cannot update its parameter. The unsupported/drag failure alone was not used to infer death. [PNGs](/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/control-audit-codex-sheets/baseline-git-merge-0.png) | +| Codex / baseline / git-merge | 1: Clean merge (710px) | harness error | [live](/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-final/codex/git-merge/result.json) | Clean merge replaces the conflict explanation and ASCII history with the merge explanation/history. The scorer rejected unequal screenshot dimensions instead of evaluating the visible output change. [PNGs](/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/control-audit-codex-sheets/baseline-git-merge-1.png) | +| Codex / baseline / git-merge | 2: Conflict (710px) | harness error | [live](/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-final/codex/git-merge/result.json) | Conflict replaces the clean-merge explanation and history with a paused merge. The scorer rejected unequal screenshot dimensions instead of evaluating the visible output change. [PNGs](/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/control-audit-codex-sheets/baseline-git-merge-2.png) | +| Codex / baseline / git-merge | 3: Fast-forward (710px) | harness error | [live](/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-final/codex/git-merge/result.json) | Fast-forward replaces the explanation and ASCII branch history. The scorer rejected unequal screenshot dimensions instead of evaluating the visible output change. [PNGs](/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/control-audit-codex-sheets/baseline-git-merge-3.png) | +| Codex / baseline / git-merge | 4: What is being compared? (710px) | harness error | [live](/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-final/codex/git-merge/result.json) | The details disclosure expands a paragraph explaining the comparison. The scorer rejected unequal screenshot dimensions instead of evaluating the visible output change. [PNGs](/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/control-audit-codex-sheets/baseline-git-merge-4.png) | +| Codex / baseline / load-balancer | 0: Load balancer: right arrow sends a request; left arrow steps back (710px) | dead | [dead](/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-final/codex/load-balancer/result.json) | No per-control interaction screenshots exist; only the static card was captured. The advertised keyboard handler calls the baseline params.set({ ... }) form. The captured baseline bridge only supports set(name, value), looks up specs[name], and silently returns for this object; therefore the intended keyboard interaction cannot update its parameter. The unsupported/drag failure alone was not used to infer death. [PNGs](/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/control-audit-codex-sheets/baseline-load-balancer-0.png) | +| Codex / baseline / notification-settings | 2: Daily digest (558px) | harness error | [live](/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-final/codex/notification-settings/result.json) | Turning Daily digest off hides the delivery-time selector and removes the digest from the preview. The scorer rejected unequal screenshot dimensions instead of evaluating the visible output change. [PNGs](/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/control-audit-codex-sheets/baseline-notification-settings-2.png) | +| Codex / baseline / notification-settings | 3: Delivery time · UTC (558px) | harness error | [live](/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-final/codex/notification-settings/result.json) | Daily digest was turned off by the preceding test, hiding this selector. Both frames show it absent and the same preview. The runner retains the initial inventory and attempts the now-hidden control without restoring its precondition. No interaction in the visible/enabled state is retained. [PNGs](/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/control-audit-codex-sheets/baseline-notification-settings-3.png) | +| Codex / baseline / notification-settings | 4: Reset defaults (558px) | dead | [dead](/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-final/codex/notification-settings/result.json) | Both frames show all notifications off after Reset defaults. Its onclick passes an object to P.set; the baseline bridge only accepts (name, value) and silently ignores the unknown object key, so it cannot restore defaults. [PNGs](/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/control-audit-codex-sheets/baseline-notification-settings-4.png) | +| Codex / baseline / refrigerator | 0: Refrigeration cycle. Use left and right arrow keys to change stage. (710px) | dead | [dead](/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-final/codex/refrigerator/result.json) (card runtime error) | The retained card is static; this unsupported surface has no per-control interaction screenshots. The exact card calls params.define with an object instead of (name, spec). The retained controls.log records “Parameter names are letters, digits, - and _: [object Object]”. That exception aborts initialization before the change subscription; database-index also never registers its keyboard listener. Native slider thumbs alone can still move. This is a generated-code defect, independently of any unsupported/wrong-modality harness failure. [PNGs](/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/control-audit-codex-sheets/baseline-refrigerator-0.png) | +| Codex / baseline / refrigerator | 1: 1. Absorb (710px) | dead | [dead](/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-final/codex/refrigerator/result.json) (card runtime error) | The attempted control leaves the mechanism/readout unchanged in both raw and v2 images. The exact card calls params.define with an object instead of (name, spec). The retained controls.log records “Parameter names are letters, digits, - and _: [object Object]”. That exception aborts initialization before the change subscription; database-index also never registers its keyboard listener. Native slider thumbs alone can still move. This is a generated-code defect, independently of any unsupported/wrong-modality harness failure. [PNGs](/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/control-audit-codex-sheets/baseline-refrigerator-1.png) | +| Codex / baseline / refrigerator | 2: 2. Compress (710px) | dead | [dead](/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-final/codex/refrigerator/result.json) (card runtime error) | The attempted control leaves the mechanism/readout unchanged in both raw and v2 images. The exact card calls params.define with an object instead of (name, spec). The retained controls.log records “Parameter names are letters, digits, - and _: [object Object]”. That exception aborts initialization before the change subscription; database-index also never registers its keyboard listener. Native slider thumbs alone can still move. This is a generated-code defect, independently of any unsupported/wrong-modality harness failure. [PNGs](/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/control-audit-codex-sheets/baseline-refrigerator-2.png) | +| Codex / baseline / refrigerator | 3: 3. Release (710px) | dead | [dead](/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-final/codex/refrigerator/result.json) (card runtime error) | The attempted control leaves the mechanism/readout unchanged in both raw and v2 images. The exact card calls params.define with an object instead of (name, spec). The retained controls.log records “Parameter names are letters, digits, - and _: [object Object]”. That exception aborts initialization before the change subscription; database-index also never registers its keyboard listener. Native slider thumbs alone can still move. This is a generated-code defect, independently of any unsupported/wrong-modality harness failure. [PNGs](/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/control-audit-codex-sheets/baseline-refrigerator-3.png) | +| Codex / baseline / refrigerator | 4: 4. Expand (710px) | dead | [dead](/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-final/codex/refrigerator/result.json) (card runtime error) | The attempted control leaves the mechanism/readout unchanged in both raw and v2 images. The exact card calls params.define with an object instead of (name, spec). The retained controls.log records “Parameter names are letters, digits, - and _: [object Object]”. That exception aborts initialization before the change subscription; database-index also never registers its keyboard listener. Native slider thumbs alone can still move. This is a generated-code defect, independently of any unsupported/wrong-modality harness failure. [PNGs](/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/control-audit-codex-sheets/baseline-refrigerator-4.png) | +| Codex / baseline / seat-belt | 0: Braking condition; use arrow keys (710px) | dead | [dead](/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-final/codex/seat-belt/result.json) (card runtime error) | The attempted control leaves the mechanism/readout unchanged in both raw and v2 images. The exact card calls params.define with an object instead of (name, spec). The retained controls.log records “Parameter names are letters, digits, - and _: [object Object]”. That exception aborts initialization before the change subscription; database-index also never registers its keyboard listener. Native slider thumbs alone can still move. This is a generated-code defect, independently of any unsupported/wrong-modality harness failure. [PNGs](/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/control-audit-codex-sheets/baseline-seat-belt-0.png) | +| Codex / baseline / seat-belt | 1: Normal movement (710px) | dead | [dead](/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-final/codex/seat-belt/result.json) (card runtime error) | The attempted control leaves the mechanism/readout unchanged in both raw and v2 images. The exact card calls params.define with an object instead of (name, spec). The retained controls.log records “Parameter names are letters, digits, - and _: [object Object]”. That exception aborts initialization before the change subscription; database-index also never registers its keyboard listener. Native slider thumbs alone can still move. This is a generated-code defect, independently of any unsupported/wrong-modality harness failure. [PNGs](/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/control-audit-codex-sheets/baseline-seat-belt-1.png) | +| Codex / baseline / seat-belt | 2: Sudden braking (710px) | dead | [dead](/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-final/codex/seat-belt/result.json) (card runtime error) | The attempted control leaves the mechanism/readout unchanged in both raw and v2 images. The exact card calls params.define with an object instead of (name, spec). The retained controls.log records “Parameter names are letters, digits, - and _: [object Object]”. That exception aborts initialization before the change subscription; database-index also never registers its keyboard listener. Native slider thumbs alone can still move. This is a generated-code defect, independently of any unsupported/wrong-modality harness failure. [PNGs](/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/control-audit-codex-sheets/baseline-seat-belt-2.png) | +| Codex / baseline / spray-bottle | 0: Pump stroke (710px) | harness error | [live](/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-final/codex/spray-bottle/result.json) (card runtime error) | The drag frames stay at Release. The script changes phase on arrow/space keys; there is no stage drag handler. A keyboard check is absent, so no whole-control liveness claim follows from this drag failure. [PNGs](/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/control-audit-codex-sheets/baseline-spray-bottle-0.png) | +| Codex / baseline / stapler | 0: Stapler cycle (710px) | harness error | [live](/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-final/codex/stapler/result.json) | The stage drag frames stay at Ready. Arrow/Home/End handlers change the cycle; the separate range is the pointer control. A keyboard check is absent, so no whole-control liveness claim follows from this drag failure. [PNGs](/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/control-audit-codex-sheets/baseline-stapler-0.png) | +| Codex / baseline / stapler | 2: Next stage → (710px) | harness error | [live](/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-final/codex/stapler/result.json) | Next stage changes Release to Ready, resets the cycle from 86 to 0, and changes the paragraph. The scorer rejected unequal screenshot dimensions instead of evaluating the visible output change. [PNGs](/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/control-audit-codex-sheets/baseline-stapler-2.png) | +| Codex / baseline / toilet | 0: Flush cycle; use left and right arrow keys (710px) | harness error | [live](/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-final/codex/toilet/result.json) | The drag frames stay at Ready. The stage advertises the selector or arrow keys and implements keyboard input; it does not implement dragging. A keyboard check is absent, so no whole-control liveness claim follows from this drag failure. [PNGs](/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/control-audit-codex-sheets/baseline-toilet-0.png) | +| Codex / baseline / umbrella | 0: Cutaway umbrella showing a sliding runner, hinged stretchers, ribs and fabric (710px) | harness error | [live](/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-final/codex/umbrella/result.json) (card runtime error) | The inventory detects a focusable keyboard surface but produces Unsupported exposed control instead of exercising its registered keys. I inspected the retained static card image and source; there are no per-control before/after images for this surface. Other controls working does not prove this surface works. [PNGs](/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/control-audit-codex-sheets/baseline-umbrella-0.png) | +| Codex / baseline / umbrella | 1: Open (710px) | harness error | [live](/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-final/codex/umbrella/result.json) (card runtime error) | Open creates the extended umbrella drawing and inserts its explanatory text. The scorer rejected unequal screenshot dimensions instead of evaluating the visible output change. [PNGs](/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/control-audit-codex-sheets/baseline-umbrella-1.png) | +| Codex / baseline / umbrella | 3: Opening position (710px) | harness error | [live](/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-final/codex/umbrella/result.json) (card runtime error) | Moving the range changes the umbrella from partly closed to spread. Visible in both raw and v2 pairs; raw masking lost the drawing output, and v2 now passes this control. [PNGs](/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/control-audit-codex-sheets/baseline-umbrella-3.png) | +| Codex / baseline / umbrella | 4: cutaway (710px) | harness error | [live](/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-final/codex/umbrella/result.json) (card runtime error) | Toggling Cutaway changes the visible fabric over the ribs. Visible in both raw and v2 pairs; raw masking lost the drawing output, and v2 now passes this control. [PNGs](/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/control-audit-codex-sheets/baseline-umbrella-4.png) | +| Codex / baseline / washing-machine | 0: control 0 (710px) | harness error | [live](/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-final/codex/washing-machine/result.json) | The inventory detects a focusable keyboard surface but produces Unsupported exposed control instead of exercising its registered keys. I inspected the retained static card image and source; there are no per-control before/after images for this surface. Other controls working does not prove this surface works. [PNGs](/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/control-audit-codex-sheets/baseline-washing-machine-0.png) | +| Codex / baseline / washing-machine | 1: Fill (710px) | harness error | [live](/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-final/codex/washing-machine/result.json) | Fill changes the selected stage and paragraph from Wash to Fill. The scorer rejected unequal screenshot dimensions instead of evaluating the visible output change. [PNGs](/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/control-audit-codex-sheets/baseline-washing-machine-1.png) | +| Codex / baseline / washing-machine | 2: Wash (710px) | harness error | [live](/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-final/codex/washing-machine/result.json) | Wash changes the stage paragraph from Fill to Wash. The scorer rejected unequal screenshot dimensions instead of evaluating the visible output change. [PNGs](/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/control-audit-codex-sheets/baseline-washing-machine-2.png) | +| Codex / baseline / washing-machine | 3: Drain (710px) | harness error | [live](/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-final/codex/washing-machine/result.json) | Drain removes the water and changes the drain/hose appearance and paragraph. The scorer rejected unequal screenshot dimensions instead of evaluating the visible output change. [PNGs](/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/control-audit-codex-sheets/baseline-washing-machine-3.png) | +| Codex / baseline / washing-machine | 5: Spin (710px) | harness error | [live](/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-final/codex/washing-machine/result.json) | Spin removes the rinse water and changes the stage paragraph and mechanism appearance. The scorer rejected unequal screenshot dimensions instead of evaluating the visible output change. [PNGs](/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/control-audit-codex-sheets/baseline-washing-machine-5.png) | +| Codex / baseline / websocket | 0: Chat message delivery steps (710px) | harness error | [live](/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-final/codex/websocket/result.json) | The inventory detects a focusable keyboard surface but produces Unsupported exposed control instead of exercising its registered keys. I inspected the retained static card image and source; there are no per-control before/after images for this surface. Other controls working does not prove this surface works. [PNGs](/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/control-audit-codex-sheets/baseline-websocket-0.png) | +| Codex / baseline / websocket | 1: Connect (710px) | harness error | [live](/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-final/codex/websocket/result.json) | Connect changes Message sent to Connections open and changes the paragraph. The scorer rejected unequal screenshot dimensions instead of evaluating the visible output change. [PNGs](/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/control-audit-codex-sheets/baseline-websocket-1.png) | +| Codex / baseline / websocket | 2: Send (710px) | harness error | [live](/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-final/codex/websocket/result.json) | Send changes Connections open to Message sent and changes the paragraph. The scorer rejected unequal screenshot dimensions instead of evaluating the visible output change. [PNGs](/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/control-audit-codex-sheets/baseline-websocket-2.png) | +| Codex / baseline / websocket | 3: Server (710px) | harness error | [live](/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-final/codex/websocket/result.json) | Server moves the message to the middle server and changes the readout to Stored on server. The scorer rejected unequal screenshot dimensions instead of evaluating the visible output change. [PNGs](/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/control-audit-codex-sheets/baseline-websocket-3.png) | +| Codex / baseline / websocket | 5: Connected (710px) | harness error | [live](/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-final/codex/websocket/result.json) | Connected closes the connection latch, shows the receiving message, and replaces the disconnected explanation with catch-up text. The scorer rejected unequal screenshot dimensions instead of evaluating the visible output change. [PNGs](/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/control-audit-codex-sheets/baseline-websocket-5.png) | +| Codex / baseline / websocket | 6: Disconnected (710px) | harness error | [live](/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-final/codex/websocket/result.json) | Disconnected opens the latch, removes the received message, and explains why it was not received. The scorer rejected unequal screenshot dimensions instead of evaluating the visible output change. [PNGs](/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/control-audit-codex-sheets/baseline-websocket-6.png) | +| Codex / baseline / zipper | 0: Zipper position (710px) | dead | [dead](/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-final/codex/zipper/result.json) | The attempted drag frames are identical; the stage actually advertises keyboard input. The advertised keyboard handler calls the baseline params.set({ ... }) form. The captured baseline bridge only supports set(name, value), looks up specs[name], and silently returns for this object; therefore the intended keyboard interaction cannot update its parameter. The unsupported/drag failure alone was not used to infer death. [PNGs](/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/control-audit-codex-sheets/baseline-zipper-0.png) | +| Codex / baseline / zipper | 1: Slider position · right closes (710px) | harness error | [live](/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-final/codex/zipper/result.json) | Moving the range shifts the zipper slider and changes the length of meshed teeth. Visible in both raw and v2 pairs; raw masking lost the drawing output, and v2 now passes this control. [PNGs](/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/control-audit-codex-sheets/baseline-zipper-1.png) | +| Codex / pilot / bicycle-pump | 0: Pump stroke phase (710px) | harness error | [live](/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-final/codex/bicycle-pump/result.json) | Both drag frames remain Pull up: fill. The stage is keyboard-operated and has no drag handler. The source implements arrow keys and the neighboring Next button has retained successful output; those facts do not visually prove the untested stage keys. [PNGs](/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/control-audit-codex-sheets/pilot-bicycle-pump-0.png) | +| Codex / pilot / bicycle-pump | 1: ← Previous (710px) | harness error | [live](/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-final/codex/bicycle-pump/result.json) | Previous is correctly disabled at phase 0. The runner records it as unexercised, then Next advances the card and enables Previous (retained controls.log inventories), but it does not return to test Previous. There are no per-control before/after images; static card and adjacent stage images were inspected. The source has a previous-phase handler; its liveness remains unproven. [PNGs](/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/control-audit-codex-sheets/pilot-bicycle-pump-1.png) | +| Codex / pilot / cdn | 0: Fig 1 · Distributed copiesBefore purge + + +v1Edge Av1 cachedv1Edge Bv1 cachedv1Edge Cv1 cached +v1Origi (710px) | harness error | [unproven](/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-final/codex/cdn/result.json) | Focusable plate is marked unsupported, so the only retained visual is a static card. Source supplies arrow-key input and the prototype bridge supports object-form set. No keys were exercised; the separate phase-bounds defect also restricts the intended stages. Do not call this surface dead from the unsupported inventory result. [PNGs](/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/control-audit-codex-sheets/pilot-cdn-0.png) | +| Codex / pilot / cdn | 1: phase (710px) | dead | [dead](/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-final/codex/cdn/result.json) | The thumb moves from roughly quarter to three-quarter, but both frames remain Purge accepted with identical racks and explanation. Generated phase is defined as a numeric parameter with value but no min/max/default, so the prototype bridge clamps it to 0..1 rather than the input’s 0..4. The full sequence is unreachable through this range. [PNGs](/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/control-audit-codex-sheets/pilot-cdn-1.png) | +| Codex / pilot / cdn | 3: browser (710px) | harness error | [live](/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-final/codex/cdn/result.json) | Checking browser cache changes the readout to Local browser HIT and adds the explanation of the retained browser copy. The scorer rejected unequal screenshot dimensions instead of evaluating the visible output change. [PNGs](/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/control-audit-codex-sheets/pilot-cdn-3.png) | +| Codex / pilot / cdn | 5: Next stage → (710px) | dead | [dead](/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-final/codex/cdn/result.json) | Both frames remain Purge accepted. Next requests phase 2, but the generated phase definition omitted max:4; the parameter is already at the bridge’s default maximum 1, so the update is a no-op. Unlike the raw baseline bridge, the prototype does support the object-form set used here. [PNGs](/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/control-audit-codex-sheets/pilot-cdn-5.png) | + +The full-prototype inventory audit also found native disclosures omitted when they had no custom cursor styling. All 33 visible baseline HTML sources and all 40 prototype HTML sources were inspected for this gap. Missing disclosures are driven separately and appended only in the final layer, with `index: null` and explicit selectors; no index is invented in the immutable v3 results. [Supplemental disclosure decisions](/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/supplemental-control-adjudications.json) retain the evidence. + +Original detailed audits: [Claude](/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/control-audit-claude.md), [Codex](/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/control-audit-codex.md). Machine-readable rows preserve every original path, score reason and source/runtime evidence. + +## Scorer corrections and limits + +The revised harness aligns each output region locally across reflow; a stable visible text/geometry change and persistent pixel difference are both required. It independently tries drag, click, Home/End, arrows, Space and Enter on custom surfaces, prepares sibling choices, and rejects runtime exceptions. Generic live/inert fixtures include resized output, cosmetic reflow, keyboard-only and click-only controls, mixed ticking readouts, selected siblings, and runtime errors. + +Saved-card replays preserve send/visible timestamps and use the matching frozen plugin, with source-result hashes and scorer hashes recorded. Unsupported canvas effects, unmet state preconditions, replaced output nodes and coincident autonomous changes can still require manual proof. Earlier automatic pass counts are superseded only when the final reviewed layer is present. Final rows use a separate immutable reviewed layer: known dead controls and rejected coincidental animation proofs cannot inherit an automatic pass. [Manual decisions](/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/manual-control-adjudications.json) and [initial Claude image review](/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/replay-visual-review.json), [independent Codex baseline review](/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/replay-visual-review-codex-baseline.md), [Codex baseline manual checks](/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/replay-visual-review-codex-baseline-manual.md), [Codex prototype review](/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/replay-visual-review-codex-prototype.md), and [additional Claude prototype review](/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/replay-visual-review-claude-prototype-extra.md) retain exact evidence hashes. Root-reviewed prototype controls are recorded in the manual decisions with their PNG and source hashes. + +## Remaining excluded cards after review + +| Revision / provider / prompt | Why excluded from live-card count | +|---|---| +| baseline / claude-code / [database-index](/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-final/claude-code/database-index/result.json) | No proven visible card; 15-minute cap retained | +| baseline / claude-code / [dns](/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-final/claude-code/dns/result.json) | No proven visible card; 15-minute cap retained | +| baseline / claude-code / [narrow-toggle](/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-final/claude-code/narrow-toggle/result.json) | No proven visible card; 15-minute cap retained | +| baseline / claude-code / [notification-settings](/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-final/claude-code/notification-settings/result.json) | No proven visible card; 15-minute cap retained | +| baseline / claude-code / [refrigerator](/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-final/claude-code/refrigerator/result.json) | Runtime error: exception: Error: Parameter names are letters, digits, - and _: [object Object]; 710px control 1 (Thermostat): dead — Native parameter changes never reach the model: initialization throws on params.define(object) before readParams/subscription. The manually reviewed pair and source show unchanged thresholds/duty under changed settings. Autonomous thermal drift is not input response.; 710px control 2 (Room): dead — Native parameter changes never reach the model: initialization throws on params.define(object) before readParams/subscription. The manually reviewed pair and source show unchanged thresholds/duty under changed settings. Autonomous thermal drift is not input response.; 710px control 3 (Door open): dead — Drag pair changes door selected chrome but running share stays24%, heat-leak note still says through walls and gasket. Minor thermal drift and page reflow are not door response. Source initialization failure prevents subscription; original dead classification retained. | +| baseline / claude-code / [seat-belt](/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-final/claude-code/seat-belt/result.json) | No proven visible card; 15-minute cap retained | +| baseline / codex / [cdn](/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-final/codex/cdn/result.json) | 710px control 0 (Seconds since purge; use left and right arrow keys): unproven — Partially functional, not a clean control pass: the default passing End pair visibly advances only 0 to 1 second although its supported End handler requests 90. An additionally inspected supported ArrowRight pair does advance 1 to 2 seconds and changes cache rows to v2. The omitted numeric bounds clamp stored time to 0..1 while local redraw can temporarily advance farther; one working arrow step does not establish the full exposed time control. The separate dead native slider also blocks a card pass.; 710px control 1 (time): dead — The inspected low/high drag pair moves the native thumb across its track while both external time readouts stay at 1 second and cache rows/mechanism remain unchanged. Saved parameter definitions omit min/max, so native time changes clamp to 0..1. The keyboard stage's local redraw cannot repair this separate control.; 710px control 2 (6 seconds30 seconds60 seconds): unproven — No proven output change outside controls; 710px control 4 (late): unproven — No proven output change outside controls | +| baseline / codex / [database-index](/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-final/codex/database-index/result.json) | Runtime error: exception: Error: Parameter names are letters, digits, - and _: [object Object]; 710px control 0 (Lookup comparison; arrow keys step through): dead — The inspected ArrowRight pair leaves the lookup diagram and blank explanation unchanged. Source object-form params.define throws before render subscription and keyboard registration; v3 records the same initialization exception. Native control chrome is not working lookup output.; 710px control 1 (Find key): dead — The inspected low/high drag pair moves the native thumb and its own numeric value, but leaves the lookup diagram and blank explanation unchanged. Source object-form params.define throws before render subscription and keyboard registration; v3 records the same initialization exception. Native control chrome is not working lookup output.; 710px control 2 (Lookup step): dead — The inspected low/high drag pair moves the native thumb and its own numeric value, but leaves the lookup diagram and blank explanation unchanged. Source object-form params.define throws before render subscription and keyboard registration; v3 records the same initialization exception. Native control chrome is not working lookup output. | +| baseline / codex / [dns](/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-final/codex/dns/result.json) | Runtime error: exception: Error: Parameter names are letters, digits, - and _: [object Object]; 710px control 1 (Answer already cached?): unproven — No proven output change outside controls | +| baseline / codex / [door-lock](/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-final/codex/door-lock/result.json) | Runtime error: exception: Error: Parameter names are letters, digits, - and _: [object Object]; 710px control 4 (Turn key ↻): unproven — No proven output change outside controls | +| baseline / codex / [git-merge](/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-final/codex/git-merge/result.json) | 710px control 0 (Document comparison machine. Use left and right arrow keys to switch scenarios.): dead — The inspected ArrowRight pair leaves the clean scenario, diagram text, branch history and explanation unchanged. The saved handler calls unsupported object-form params.set, confirming the original silent no-op. Working scenario buttons do not repair the exposed keyboard surface. | +| baseline / codex / [load-balancer](/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-final/codex/load-balancer/result.json) | 710px control 0 (Load balancer: right arrow sends a request; left arrow steps back): dead — The inspected ArrowRight pair leaves request count 6, per-server active/assigned totals, carriage and latest-server readout unchanged. The saved keyboard handler calls unsupported object-form params.set, retaining the original silent no-op. Working dropdowns and increment buttons do not repair the separate exposed keyboard surface. | +| baseline / codex / [notification-settings](/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-final/codex/notification-settings/result.json) | 558px control 4 (Reset defaults): dead — The inspected Reset defaults click starts from a genuinely nondefault state (email off, digest at 12 PM) and leaves all controls and the independent preview unchanged. Saved onclick uses unsupported object-form P.set, confirming the original silent no-op; a working digest or selector cannot make this card pass. | +| baseline / codex / [refrigerator](/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-final/codex/refrigerator/result.json) | Runtime error: exception: Error: Parameter names are letters, digits, - and _: [object Object]; 710px control 0 (Refrigeration cycle. Use left and right arrow keys to change stage.): dead — The inspected supported-input before/after frames keep the same uninitialized refrigerator, blank stage explanation and unchanged output. The retained source object-form params.define throws before registering the render subscription; v3 records that initialization exception. Thus the original dead-control finding remains, not a merely small visual delta.; 710px control 1 (1. Absorb): dead — The inspected supported-input before/after frames keep the same uninitialized refrigerator, blank stage explanation and unchanged output. The retained source object-form params.define throws before registering the render subscription; v3 records that initialization exception. Thus the original dead-control finding remains, not a merely small visual delta.; 710px control 2 (2. Compress): dead — The inspected supported-input before/after frames keep the same uninitialized refrigerator, blank stage explanation and unchanged output. The retained source object-form params.define throws before registering the render subscription; v3 records that initialization exception. Thus the original dead-control finding remains, not a merely small visual delta.; 710px control 3 (3. Release): dead — The inspected supported-input before/after frames keep the same uninitialized refrigerator, blank stage explanation and unchanged output. The retained source object-form params.define throws before registering the render subscription; v3 records that initialization exception. Thus the original dead-control finding remains, not a merely small visual delta.; 710px control 4 (4. Expand): dead — The inspected supported-input before/after frames keep the same uninitialized refrigerator, blank stage explanation and unchanged output. The retained source object-form params.define throws before registering the render subscription; v3 records that initialization exception. Thus the original dead-control finding remains, not a merely small visual delta. | +| baseline / codex / [seat-belt](/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-final/codex/seat-belt/result.json) | Runtime error: exception: Error: Parameter names are letters, digits, - and _: [object Object]; 710px control 0 (Braking condition; use arrow keys): dead — The inspected supported-input pair retains the same reel/latch and Free to unwind output with no mode explanation. Source initialization throws on object-form params.define before render subscription and animation registration; v3 captures the same exception. The original dead-control finding remains.; 710px control 1 (Normal movement): dead — The inspected supported-input pair retains the same reel/latch and Free to unwind output with no mode explanation. Source initialization throws on object-form params.define before render subscription and animation registration; v3 captures the same exception. The original dead-control finding remains.; 710px control 2 (Sudden braking): dead — The inspected supported-input pair retains the same reel/latch and Free to unwind output with no mode explanation. Source initialization throws on object-form params.define before render subscription and animation registration; v3 captures the same exception. The original dead-control finding remains. | +| baseline / codex / [spray-bottle](/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-final/codex/spray-bottle/result.json) | Runtime error: exception: Error: Parameter names are letters, digits, - and _: [object Object] | +| baseline / codex / [thermos](/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-final/codex/thermos/result.json) | No proven visible card; 15-minute cap retained | +| baseline / codex / [toaster](/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-final/codex/toaster/result.json) | No proven visible card; 15-minute cap retained | +| baseline / codex / [umbrella](/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-final/codex/umbrella/result.json) | Runtime error: exception: Error: Parameter names are letters, digits, - and _: [object Object] | +| baseline / codex / [zipper](/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-final/codex/zipper/result.json) | 710px control 0 (Zipper position): dead — The supported ArrowRight route leaves slider position at 50 and the mechanism unchanged in the inspected pair. The exact saved keyboard handler calls object-form params.set, which the frozen baseline silently ignores; the separate native range working does not repair this stage. | +| prototype / claude-code / [cdn](/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-final/claude-code/cdn/result.json) | 710px control 6 (Replay): dead — With reduced motion explicitly true, a real Replay click at the completed state leaves both retained post-input frames and readout unchanged at 2m8s/all fresh. Its handler resets t but never draws; run() refuses animation under reduced motion. The earlier automatic pass was a pointer/settling artifact. | +| prototype / codex / [cdn](/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-final/codex/cdn/result.json) | 710px control 0 (Fig 1 · Distributed copiesBefore purge v1Edge Av1 cachedv1Edge Bv1 cachedv1Edge Cv1 cached v1Origi): unproven — Only partial behavior is proved: ArrowRight advances Before purge to Purge accepted (0 to 1), but the saved phase definition omits numeric bounds and the frozen bridge defaults to 0..1. The full advertised 0..4 journey cannot be inferred from that single visible transition. Planned repeated-key/manual bounds evidence is needed; this must not become a whole-card pass.; 710px control 1 (phase): dead — Actual subsequent range drag reaches DOM value4 while diagram and explanation remain phase1/Purge accepted. The input thumb moves but bridge phase clamps to1; visible later stages do not work.; 710px control 2 (Edge AEdge BEdge C): dead — Partial control: real native Home/Enter then End/Enter should select last option Edge C but settles at Edge B, confirmed in actual PNG and params.region1. Missing valid string schema/bounds clamps intended region2 to1. A→B response is real, but advertised Edge C never works.; 710px control 5 (Next stage →): dead — Next advances initial0 to1, then further real Next remains phase1/Purge accepted. Three advertised later phases are inaccessible because bridge default max1 clamps phase. | +| prototype / codex / [dns](/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-final/codex/dns/result.json) | 710px control 1 (No cacheAt the resolverOn your device): dead — Native Home/Enter to End/Enter shows No cache then On your device, while dns.state.cache stays numeric0 and max stays3. Next twice clears selection and visits resolver/cache instead of device-cached route. Actual images confirm wrong route. Earlier automatic proof merely reset lookup step and did not prove cache selection. | +| prototype / codex / [git-merge](/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-final/codex/git-merge/result.json) | 710px control 0 (Different edits → clean mergeCompeting edits → conflictMain has no new commits → fast-forward): dead — Real select changes Clean merge to Fast-forward, but actual diagram, merge explanation and history remain Clean merge; params stays {}. String-array options do not match frozen option.value contract. | +| prototype / codex / [spray-bottle](/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-final/codex/spray-bottle/result.json) | 710px control 0 (Spray bottle pump. Right arrow squeezes; left arrow releases.): dead — Actual supported-input frames retain the release state, open inlet, closed outlet and unchanged explanation. The generated source defines stroke as type string with value squeeze; the frozen bridge only handles text/toggle specially and otherwise numeric-normalizes with default 0. Both squeeze/release strings therefore stay 0 and cannot trigger the intended state change. This is a parameter-contract defect, not a missing visual threshold.; 710px control 1 (Squeeze trigger): dead — Actual supported-input frames retain the release state, open inlet, closed outlet and unchanged explanation. The generated source defines stroke as type string with value squeeze; the frozen bridge only handles text/toggle specially and otherwise numeric-normalizes with default 0. Both squeeze/release strings therefore stay 0 and cannot trigger the intended state change. This is a parameter-contract defect, not a missing visual threshold.; 710px control 2 (Release trigger): dead — Actual supported-input frames retain the release state, open inlet, closed outlet and unchanged explanation. The generated source defines stroke as type string with value squeeze; the frozen bridge only handles text/toggle specially and otherwise numeric-normalizes with default 0. Both squeeze/release strings therefore stay 0 and cannot trigger the intended state change. This is a parameter-contract defect, not a missing visual threshold. | +| prototype / codex / [thermos](/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-final/codex/thermos/result.json) | 710px control 0 (ClosedOpen): dead — Real native Home/Enter to End/Enter changes displayed selection, but actual diagram and explanation remain unchanged. Read-only thermosState.params remains {}. Source supplies string-array options; frozen bridge expects option.value and rejects every intended choice.; 710px control 1 (VacuumAir filled): dead — Real native Home/Enter to End/Enter changes displayed selection, but actual diagram and explanation remain unchanged. Read-only thermosState.params remains {}. Source supplies string-array options; frozen bridge expects option.value and rejects every intended choice.; 710px control 2 (ReflectiveNonreflective): dead — Real native Home/Enter to End/Enter changes displayed selection, but actual diagram and explanation remain unchanged. Read-only thermosState.params remains {}. Source supplies string-array options; frozen bridge expects option.value and rejects every intended choice. | + +The residual inventory includes new full-prototype cases beyond the original baseline/pilot audit. “Unproven” remains a proof limitation unless a concrete defect is documented. + +## Fixed render grace: every affected attempt + +| Revision / provider / prompt | Completion clock | Render delay ms | Card retained | Scored min | +|---|---|---:|---|---:| +| baseline / claude-code / [toilet](/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline/claude-code/toilet/result.json) | terminal-observed | 308 | True | 9.70 | +| baseline / codex / [thermos](/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline/codex/thermos/result.json) | turn.completedAt | no visible card | False | 15.00 | +| baseline / codex / [toaster](/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline/codex/toaster/result.json) | turn.completedAt | no visible card | False | 15.00 | +| prototype / claude-code / [database-index](/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype/claude-code/database-index/result.json) | terminal-observed | 80 | True | 4.14 | +| prototype / claude-code / [umbrella](/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype/claude-code/umbrella/result.json) | terminal-observed | 117 | True | 2.98 | +| prototype / claude-code / [websocket](/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype/claude-code/websocket/result.json) | terminal-observed | 104 | True | 3.49 | + +Grace lasts at most 30 seconds after completion and never extends the 15-minute send-time cap. “Terminal-observed” identifies an observation time rather than a recovered agent-completion timestamp. Render delays remain included in scored delivery time. + +## Host and delivery conditions + +[Baseline interruption evidence](/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/interruption-evidence.json); [first report](/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/gate-1-first.md); [prototype pilot host pressure](/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/host-status-prototype-pilot.json); [baseline lower-pressure snapshot](/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/host-status-0222.json). Shared host pressure varied; no inference attributes all Claude delay to memory pressure. All long-lived processes remain under the owned host-care job and are released when done. diff --git a/plugins/playgrounds/evals/launch/reports/gate-1/manual-control-adjudications.json b/plugins/playgrounds/evals/launch/reports/gate-1/manual-control-adjudications.json new file mode 100644 index 000000000..d8b82cdf6 --- /dev/null +++ b/plugins/playgrounds/evals/launch/reports/gate-1/manual-control-adjudications.json @@ -0,0 +1,5480 @@ +{ + "rows": [ + { + "revision": "baseline", + "provider": "claude-code", + "prompt": "refrigerator", + "width": 710, + "index": 0, + "label": "Fridge thermostat: arrow keys change the set temperature", + "verdict": "live", + "reason": "Reject the coincidental drag/unsupported-key proofs. Actual ArrowRight changes the thermostat threshold readout from on5.0/off3.0 to on5.5/off3.5, with knob geometry and duty24%->23%; saved source nudge updates local model before the initialization exception. This proves the stage keyboard route only; card remains runtime-error.", + "sourceReplaySha256": "d9130f077778372b7d011de6961d5780d0d422eb10a664b682b45eb8054fba44", + "evidence": [ + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/claude-code/refrigerator/width-710/control-0-key-ArrowRight-before2.png", + "sha256": "145ef8199e3fb857df3fce2125304ac68b93752eb99c5bf3b608affd5173263c" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/claude-code/refrigerator/width-710/control-0-key-ArrowRight-after0.png", + "sha256": "1642993e954af2c6686d017013ca8f0cce65cd4c8b49011f5c08cf90e44db7a6" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/claude-code/refrigerator/result.json", + "sha256": "d9130f077778372b7d011de6961d5780d0d422eb10a664b682b45eb8054fba44" + } + ], + "reviewedAt": "2026-10-20T05:44:57.584558+00:00" + }, + { + "revision": "baseline", + "provider": "claude-code", + "prompt": "refrigerator", + "width": 710, + "index": 3, + "label": "Door open", + "verdict": "dead", + "reason": "Drag pair changes door selected chrome but running share stays24%, heat-leak note still says through walls and gasket. Minor thermal drift and page reflow are not door response. Source initialization failure prevents subscription; original dead classification retained.", + "sourceReplaySha256": "d9130f077778372b7d011de6961d5780d0d422eb10a664b682b45eb8054fba44", + "evidence": [ + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/replay-pairs/baseline/claude-code/refrigerator-710-3.png", + "sha256": "54e040992d2f40d93f6af23b79f38b375cde4d781535b200a4af4eb9f601d1e8" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/claude-code/refrigerator/result.json", + "sha256": "d9130f077778372b7d011de6961d5780d0d422eb10a664b682b45eb8054fba44" + } + ], + "reviewedAt": "2026-10-20T05:44:57.587726+00:00" + }, + { + "revision": "baseline", + "provider": "claude-code", + "prompt": "refrigerator", + "width": 710, + "index": 1, + "label": "Thermostat", + "verdict": "dead", + "reason": "Native parameter changes never reach the model: initialization throws on params.define(object) before readParams/subscription. The manually reviewed pair and source show unchanged thresholds/duty under changed settings. Autonomous thermal drift is not input response.", + "sourceReplaySha256": "d9130f077778372b7d011de6961d5780d0d422eb10a664b682b45eb8054fba44", + "evidence": [ + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/control-audit-claude.json", + "sha256": "17ed9309990a1f529dc8b23a64a9eb78cb43d5fdff82a06c81d521e5b48af173" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline/claude-code/refrigerator/published.html", + "sha256": "a4dcd292183008656544f2dbc14d40ebb29032785bcbb226dd5a750dcf1eca4e" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/claude-code/refrigerator/width-710/controls.log", + "sha256": "6b4e5b724c41c42e2c36034a5a121b988db22b463799d40d8d4f115127c7e54c" + } + ], + "reviewedAt": "2026-10-20T05:44:57.593351+00:00" + }, + { + "revision": "baseline", + "provider": "claude-code", + "prompt": "refrigerator", + "width": 710, + "index": 2, + "label": "Room", + "verdict": "dead", + "reason": "Native parameter changes never reach the model: initialization throws on params.define(object) before readParams/subscription. The manually reviewed pair and source show unchanged thresholds/duty under changed settings. Autonomous thermal drift is not input response.", + "sourceReplaySha256": "d9130f077778372b7d011de6961d5780d0d422eb10a664b682b45eb8054fba44", + "evidence": [ + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/control-audit-claude.json", + "sha256": "17ed9309990a1f529dc8b23a64a9eb78cb43d5fdff82a06c81d521e5b48af173" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline/claude-code/refrigerator/published.html", + "sha256": "a4dcd292183008656544f2dbc14d40ebb29032785bcbb226dd5a750dcf1eca4e" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/claude-code/refrigerator/width-710/controls.log", + "sha256": "6b4e5b724c41c42e2c36034a5a121b988db22b463799d40d8d4f115127c7e54c" + } + ], + "reviewedAt": "2026-10-20T05:44:57.598582+00:00" + }, + { + "revision": "baseline", + "provider": "claude-code", + "prompt": "spray-bottle", + "width": 710, + "index": 0, + "label": "Spray bottle: hold Space or press to squeeze the trigger, N turns the nozzle", + "verdict": "live", + "reason": "Advertised keyboard squeeze pulse increases the settled sprayed total1.0->2.0mL and reduces bottle259->258mL. Reduced-motion source disables idle touring; this is input-caused cumulative output, not hover styling.", + "sourceReplaySha256": "625032b41756f0ac6a63e9a86314cc70533efa5d76bb0a55f9135afb0d7dccc6", + "evidence": [ + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/claude-code/spray-bottle/width-710/control-0-key-ArrowRight-before2.png", + "sha256": "e0c84af8007869ae0f4d1e1bc092c10030a41a021ad43107925222754f4a8a43" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/claude-code/spray-bottle/width-710/control-0-key-ArrowRight-after0.png", + "sha256": "becb6085738e369f173464e1ffc37ff417cca29fed1adefe329ad7008252b866" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline/claude-code/spray-bottle/published.html", + "sha256": "99feaea769771d35e13945cabb1acae6b35c539293ab5a63d5d7de5ae97722c8" + } + ], + "reviewedAt": "2026-10-20T05:46:43.315035+00:00" + }, + { + "revision": "baseline", + "provider": "claude-code", + "prompt": "stapler", + "width": 710, + "index": 0, + "label": "Stapler: arrow keys press and release the handle", + "verdict": "live", + "reason": "Supported End key closes the handle and drives/folds the staple: visible open gap9.0mm becomes clinched legs folded5.0mm, with clear mechanism geometry change. Prefer this supported route over the first click probe.", + "sourceReplaySha256": "4e2f4de23dd705a275b86e3c87cf3d5932963e20356c4abdff524dd84a878e2a", + "evidence": [ + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/claude-code/stapler/width-710/control-0-key-End-before2.png", + "sha256": "6acd05e9bd9b52595ac7dd5eb424ba92f9ffe5dd43400174bfe165d7fb7d523b" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/claude-code/stapler/width-710/control-0-key-End-after0.png", + "sha256": "75f908ba476edf55a98ca3090fe15c1f81916272ba7ed7b40ba4f7f7141a4382" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline/claude-code/stapler/published.html", + "sha256": "af887c2514e6adedd7e2888e843a20f0dda2b562d96d502902c58d5bd3872b44" + } + ], + "reviewedAt": "2026-10-20T05:46:43.322256+00:00" + }, + { + "revision": "baseline", + "provider": "claude-code", + "prompt": "websocket", + "width": 710, + "index": 1, + "label": "WebSocket", + "verdict": "live", + "reason": "After preparing Polling, clicking WebSocket changes the explanatory readout from Polling every1s to WebSocket handshake and changes gate geometry; selection styling is not the sole evidence.", + "sourceReplaySha256": "d9c5bc363e800a411c8966b155db934d24ad51ec27521ece1b81e5f186971719", + "evidence": [ + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/replay-pairs/baseline/claude-code/websocket-710-1.png", + "sha256": "b0f34b00d7e1f5269d2ff72871046ed5a316dfd7d489a764497cbcf850bddbbd" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/replay-pairs/baseline/claude-code/websocket-710-1.json", + "sha256": "8d720b7c6d86e163fc48d7515387296439ca87fe7689fe67758fc0b08075f5a4" + } + ], + "reviewedAt": "2026-10-20T05:50:00.025004+00:00" + }, + { + "revision": "baseline", + "provider": "claude-code", + "prompt": "websocket", + "width": 710, + "index": 2, + "label": "Polling", + "verdict": "live", + "reason": "After preparing WebSocket, clicking Polling changes the readout from3 open connections to Polling every1s and changes connection/gate state.", + "sourceReplaySha256": "d9c5bc363e800a411c8966b155db934d24ad51ec27521ece1b81e5f186971719", + "evidence": [ + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/replay-pairs/baseline/claude-code/websocket-710-2.png", + "sha256": "491caaed53f6088136e3a2d60d2884b0c4ebc2c68d69258584798b3b76b83623" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/replay-pairs/baseline/claude-code/websocket-710-2.json", + "sha256": "8bed8275562848d39378b184a29ca6f3db58d0b8207b5397b465694f1668a88d" + } + ], + "reviewedAt": "2026-10-20T05:50:00.028134+00:00" + }, + { + "revision": "baseline", + "provider": "claude-code", + "prompt": "websocket", + "width": 710, + "index": 4, + "label": "Poll interval", + "verdict": "live", + "reason": "Real slider drag changes the stable output interval from Polling every1s to every4.5s. The unrelated empty-poll counter is not used as proof.", + "sourceReplaySha256": "d9c5bc363e800a411c8966b155db934d24ad51ec27521ece1b81e5f186971719", + "evidence": [ + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/replay-pairs/baseline/claude-code/websocket-710-4.png", + "sha256": "43352e31e5a7fc421aff2cef60ffb6a7bc79db4bba3587d5523efb697e97ab5a" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/replay-pairs/baseline/claude-code/websocket-710-4.json", + "sha256": "464760c2b09cb4809aadeff0aca2641d35582908958bb27ba165e3ed5aaab07e" + } + ], + "reviewedAt": "2026-10-20T05:50:00.031107+00:00" + }, + { + "revision": "baseline", + "provider": "claude-code", + "prompt": "load-balancer", + "width": 710, + "index": 0, + "label": "Load balancer: left and right arrows change the algorithm, up and down change traffic", + "verdict": "live", + "reason": "Supported ArrowRight changes model algorithm from round robin to least connections; output algorithm words change and queues reset, beyond selected-button styling.", + "sourceReplaySha256": "a3eb72fe847999ed55d11616826a96a8c27134811e0bf9bd1fda02d25300302f", + "evidence": [ + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/replay-pairs/baseline/claude-code/load-balancer-710-0.png", + "sha256": "e31c058f74866592342ac546784eda085376f270482cce208b3b470e658721e3" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/replay-pairs/baseline/claude-code/load-balancer-710-0.json", + "sha256": "2f44dfd563dd295fdf104fc4258e5b3c543dfe8aeee557e540eba6122ea035e5" + } + ], + "reviewedAt": "2026-10-20T05:52:26.606493+00:00" + }, + { + "revision": "baseline", + "provider": "claude-code", + "prompt": "load-balancer", + "width": 710, + "index": 1, + "label": "Round robin", + "verdict": "live", + "reason": "After preparing least connections, Round robin changes the output algorithm words to round robin and resets queues.", + "sourceReplaySha256": "a3eb72fe847999ed55d11616826a96a8c27134811e0bf9bd1fda02d25300302f", + "evidence": [ + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/replay-pairs/baseline/claude-code/load-balancer-710-1.png", + "sha256": "7f8b690f40fc0b1968a7e2d8228d2e30cb63d1141cd48e9998c0d1a9dbd02cef" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/replay-pairs/baseline/claude-code/load-balancer-710-1.json", + "sha256": "92c3693b400c4f2517f14255325a9de212a169570de2f7e071e2ddb0c9622ee8" + } + ], + "reviewedAt": "2026-10-20T05:52:26.625223+00:00" + }, + { + "revision": "baseline", + "provider": "claude-code", + "prompt": "load-balancer", + "width": 710, + "index": 2, + "label": "Least connections", + "verdict": "live", + "reason": "Least connections changes the output algorithm words from round robin to least connections.", + "sourceReplaySha256": "a3eb72fe847999ed55d11616826a96a8c27134811e0bf9bd1fda02d25300302f", + "evidence": [ + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/replay-pairs/baseline/claude-code/load-balancer-710-2.png", + "sha256": "32fc4cc93949fda55484fa1295888127d82c552a04281585f33f6284be0ff982" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/replay-pairs/baseline/claude-code/load-balancer-710-2.json", + "sha256": "2e3c2c6c85d34ce3ac7d8d639d3108909bd8c7217ebeccee6f48d3fb86fceb61" + } + ], + "reviewedAt": "2026-10-20T05:52:26.642331+00:00" + }, + { + "revision": "baseline", + "provider": "claude-code", + "prompt": "load-balancer", + "width": 710, + "index": 3, + "label": "Random", + "verdict": "live", + "reason": "Random changes the output algorithm words from round robin to random.", + "sourceReplaySha256": "a3eb72fe847999ed55d11616826a96a8c27134811e0bf9bd1fda02d25300302f", + "evidence": [ + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/replay-pairs/baseline/claude-code/load-balancer-710-3.png", + "sha256": "97503bcf1e676fa74b3d80b3e040abef647578db32ef693a0ca4134ebc9f9630" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/replay-pairs/baseline/claude-code/load-balancer-710-3.json", + "sha256": "fa2f73d970d2672175d92aac127a852dfad446b871cb9f73a3092c6fa382dc99" + } + ], + "reviewedAt": "2026-10-20T05:52:26.659408+00:00" + }, + { + "revision": "baseline", + "provider": "claude-code", + "prompt": "load-balancer", + "width": 710, + "index": 11, + "label": "None", + "verdict": "live", + "reason": "Selecting no failed server removes the unavailable x marker from the first server queue in the model readout.", + "sourceReplaySha256": "a3eb72fe847999ed55d11616826a96a8c27134811e0bf9bd1fda02d25300302f", + "evidence": [ + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/replay-pairs/baseline/claude-code/load-balancer-710-11.png", + "sha256": "649bc0287d6643233e0e5bbe1e87483b4a26a033ef1536269fcd271c6a870dcf" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/replay-pairs/baseline/claude-code/load-balancer-710-11.json", + "sha256": "96a4ed00ca9fea88a2cb3a0fe0b36d0107eb8388c4f285c4a5f5842548d3e97f" + } + ], + "reviewedAt": "2026-10-20T05:52:26.676412+00:00" + }, + { + "revision": "baseline", + "provider": "claude-code", + "prompt": "load-balancer", + "width": 710, + "index": 14, + "label": "3", + "verdict": "live", + "reason": "Marking server3 failed changes the third queue to an unavailable x, beyond the selected-button state.", + "sourceReplaySha256": "a3eb72fe847999ed55d11616826a96a8c27134811e0bf9bd1fda02d25300302f", + "evidence": [ + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/replay-pairs/baseline/claude-code/load-balancer-710-14.png", + "sha256": "2244ac4c3b0f3e6a9883e6a47e52292afdc4d69f88de49ef6cef45626f57f4e9" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/replay-pairs/baseline/claude-code/load-balancer-710-14.json", + "sha256": "03e1a506b542dde7ce532f680685561755d7bb0a01ea1d8e91914bbd52034d1e" + } + ], + "reviewedAt": "2026-10-20T05:52:26.694309+00:00" + }, + { + "revision": "baseline", + "provider": "codex", + "prompt": "cdn", + "width": 710, + "index": 0, + "label": "Seconds since purge; use left and right arrow keys", + "verdict": "unproven", + "reason": "Partially functional, not a clean control pass: the default passing End pair visibly advances only 0 to 1 second although its supported End handler requests 90. An additionally inspected supported ArrowRight pair does advance 1 to 2 seconds and changes cache rows to v2. The omitted numeric bounds clamp stored time to 0..1 while local redraw can temporarily advance farther; one working arrow step does not establish the full exposed time control. The separate dead native slider also blocks a card pass.", + "sourceReplaySha256": "54c70dd4aac8a0f71a69f3a1f00e5928b37786cbe1760b09c93734407a9686a5", + "evidence": [ + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/cdn/width-710/control-0-key-End-before2.png", + "sha256": "9b11986bea3e6d3ad11f6d73725eb643dec7626ff4fd99d1aea1d9a84f710753" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/cdn/width-710/control-0-key-End-after0.png", + "sha256": "9426610c09ca06f6bf0056d0d48fb37ff280c743326096f06ab40c25f2389107" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/replay-pairs/baseline/codex/cdn-710-0.png", + "sha256": "e5ef9b6b07dd650313927afdbf07b434f8ccd96dd6806135276ea27d97aa8930" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/cdn/width-710/control-0-key-ArrowRight-before2.png", + "sha256": "9426610c09ca06f6bf0056d0d48fb37ff280c743326096f06ab40c25f2389107" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/cdn/width-710/control-0-key-ArrowRight-after0.png", + "sha256": "c2847075758e3176aaf5267fd448062592b42a426b15507916126ac1a99b15ab" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/replay-visual-review-codex-baseline.json", + "sha256": "cd060b6469f414432b932d3c469ac7e7af83e70281c25bc46a18d43a2babce23" + } + ], + "reviewedAt": "2026-10-20T06:14:21.854053+00:00" + }, + { + "revision": "baseline", + "provider": "codex", + "prompt": "cdn", + "width": 710, + "index": 1, + "label": "time", + "verdict": "dead", + "reason": "The inspected low/high drag pair moves the native thumb across its track while both external time readouts stay at 1 second and cache rows/mechanism remain unchanged. Saved parameter definitions omit min/max, so native time changes clamp to 0..1. The keyboard stage's local redraw cannot repair this separate control.", + "sourceReplaySha256": "54c70dd4aac8a0f71a69f3a1f00e5928b37786cbe1760b09c93734407a9686a5", + "evidence": [ + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/cdn/width-710/control-1-drag-before2.png", + "sha256": "3ce06332faaf354ed67654171e0fe73e69c9578db855ea488bc1387aefdbb147" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/cdn/width-710/control-1-drag-after0.png", + "sha256": "e3aa83ca1bd61c71c911785e9c12f77684ac2bfe47c00782b279a892af329902" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/replay-visual-review-codex-baseline.json", + "sha256": "cd060b6469f414432b932d3c469ac7e7af83e70281c25bc46a18d43a2babce23" + } + ], + "reviewedAt": "2026-10-20T06:14:21.858037+00:00" + }, + { + "revision": "baseline", + "provider": "codex", + "prompt": "cdn", + "width": 710, + "index": 3, + "label": "local", + "verdict": "live", + "reason": "The inspected checkbox click changes the explanatory paragraph to the browser serving its fresh v1 copy and changes all three User receives cells to v1 (browser). The saved input handler updates the local boolean and redraws through the parameter subscription; this is meaningful output, not checkbox styling.", + "sourceReplaySha256": "54c70dd4aac8a0f71a69f3a1f00e5928b37786cbe1760b09c93734407a9686a5", + "evidence": [ + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/cdn/width-710/control-3-primary-before2.png", + "sha256": "72381eca88d6c3670525af4e1156d956ee57cd92b6f90c746cb48ffdc3afe779" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/cdn/width-710/control-3-primary-after0.png", + "sha256": "c1f436f77217affdeee173e9bdc5781c0a7b384767c3b236aa146856fac43ad5" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/replay-pairs/baseline/codex/cdn-710-3.png", + "sha256": "1ce4e6223a8e0c4c8db7eacb56e04afabe39bd1ce16e959e377533ac74ab372a" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/replay-visual-review-codex-baseline.json", + "sha256": "cd060b6469f414432b932d3c469ac7e7af83e70281c25bc46a18d43a2babce23" + } + ], + "reviewedAt": "2026-10-20T06:14:21.861996+00:00" + }, + { + "revision": "baseline", + "provider": "codex", + "prompt": "database-index", + "width": 710, + "index": 0, + "label": "Lookup comparison; arrow keys step through", + "verdict": "dead", + "reason": "The inspected ArrowRight pair leaves the lookup diagram and blank explanation unchanged. Source object-form params.define throws before render subscription and keyboard registration; v3 records the same initialization exception. Native control chrome is not working lookup output.", + "sourceReplaySha256": "8e69cb83806db4ef0f2a74f0978bca80b60b7f99e2786a2ddf23637897c3cbdf", + "evidence": [ + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/database-index/width-710/control-0-key-ArrowRight-before2.png", + "sha256": "6b5bd77301b68e38afee06380664bb600c64dd325e9396666b6bdc1247041405" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/database-index/width-710/control-0-key-ArrowRight-after0.png", + "sha256": "6b5bd77301b68e38afee06380664bb600c64dd325e9396666b6bdc1247041405" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/replay-visual-review-codex-baseline.json", + "sha256": "cd060b6469f414432b932d3c469ac7e7af83e70281c25bc46a18d43a2babce23" + } + ], + "reviewedAt": "2026-10-20T06:14:21.864294+00:00" + }, + { + "revision": "baseline", + "provider": "codex", + "prompt": "database-index", + "width": 710, + "index": 1, + "label": "Find key", + "verdict": "dead", + "reason": "The inspected low/high drag pair moves the native thumb and its own numeric value, but leaves the lookup diagram and blank explanation unchanged. Source object-form params.define throws before render subscription and keyboard registration; v3 records the same initialization exception. Native control chrome is not working lookup output.", + "sourceReplaySha256": "8e69cb83806db4ef0f2a74f0978bca80b60b7f99e2786a2ddf23637897c3cbdf", + "evidence": [ + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/database-index/width-710/control-1-drag-before2.png", + "sha256": "e2e04f316b98dce1c4abf829625e6e9807f977f285882431ba3accfe3dcc0d6d" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/database-index/width-710/control-1-drag-after0.png", + "sha256": "c10ea05a7e51210599964362ab63a8c5869a3c32f5fac70306dcba08cee1c8e7" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/replay-visual-review-codex-baseline.json", + "sha256": "cd060b6469f414432b932d3c469ac7e7af83e70281c25bc46a18d43a2babce23" + } + ], + "reviewedAt": "2026-10-20T06:14:21.866560+00:00" + }, + { + "revision": "baseline", + "provider": "codex", + "prompt": "database-index", + "width": 710, + "index": 2, + "label": "Lookup step", + "verdict": "dead", + "reason": "The inspected low/high drag pair moves the native thumb and its own numeric value, but leaves the lookup diagram and blank explanation unchanged. Source object-form params.define throws before render subscription and keyboard registration; v3 records the same initialization exception. Native control chrome is not working lookup output.", + "sourceReplaySha256": "8e69cb83806db4ef0f2a74f0978bca80b60b7f99e2786a2ddf23637897c3cbdf", + "evidence": [ + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/database-index/width-710/control-2-drag-before2.png", + "sha256": "923da5d8ff407a92823f52d30bb62ebbd293acc183f12af96ee3c8aafe8ba845" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/database-index/width-710/control-2-drag-after0.png", + "sha256": "4abd98092ab1bd8ac961013b0dcf820e0002c3bbfd8de2044a04f3c3c601c3bd" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/replay-visual-review-codex-baseline.json", + "sha256": "cd060b6469f414432b932d3c469ac7e7af83e70281c25bc46a18d43a2babce23" + } + ], + "reviewedAt": "2026-10-20T06:14:21.868813+00:00" + }, + { + "revision": "baseline", + "provider": "codex", + "prompt": "dns", + "width": 710, + "index": 0, + "label": "DNS lookup step", + "verdict": "live", + "reason": "The inspected Home pair changes the initial incomplete stage into the device-cache step, with an explanatory paragraph and matching readout. The saved keyboard handler explicitly handles Home and calls draw; its drawer animation is output of that input. The recorded initialization exception still rejects the card.", + "sourceReplaySha256": "e46768e0376b893a5491a38bc6f44f9325251dc0a3e0fbee42a9c0f5e735ec67", + "evidence": [ + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/dns/width-710/control-0-key-Home-before2.png", + "sha256": "dad01a8e6794d76ef2a633e6b2247a83bb14c51d311e61c24b7d422f00e69acf" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/dns/width-710/control-0-key-Home-after0.png", + "sha256": "18a26e5c184d4960c9b9c2383c74ddd44ef360d2571315ef367ada1d4be0876c" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/replay-pairs/baseline/codex/dns-710-0.png", + "sha256": "cb9e57a6c6d85cbe2d277961bfaf8980dca16442d7cff8af48a9ac39a5b63e41" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/replay-visual-review-codex-baseline.json", + "sha256": "cd060b6469f414432b932d3c469ac7e7af83e70281c25bc46a18d43a2babce23" + } + ], + "reviewedAt": "2026-10-20T06:14:21.871694+00:00" + }, + { + "revision": "baseline", + "provider": "codex", + "prompt": "dns", + "width": 710, + "index": 2, + "label": "Back", + "verdict": "live", + "reason": "The inspected Back click changes Your browser connects to Use the resolver's cached answer, updates the paragraph and query/drawer positions, and re-enables Next. The source go(-1) handler changes the step synchronously; this is a valid enabled-state Back transition. Initialization still throws, so this does not pass the card.", + "sourceReplaySha256": "e46768e0376b893a5491a38bc6f44f9325251dc0a3e0fbee42a9c0f5e735ec67", + "evidence": [ + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/dns/width-710/control-2-primary-before2.png", + "sha256": "c23665d5ce12686807550c7145d6745dee4d94979efacc9ec4130beefd4cf1e9" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/dns/width-710/control-2-primary-after0.png", + "sha256": "8c54401ee28e8a00142c5d941b6a0dd5671ef338d069b23a17a4d6f10c288729" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/replay-pairs/baseline/codex/dns-710-2.png", + "sha256": "b58cf88114cb0bf1c4ed9bbf6771e28f0024adbbfc030874422a1f978f4e14c8" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/replay-visual-review-codex-baseline.json", + "sha256": "cd060b6469f414432b932d3c469ac7e7af83e70281c25bc46a18d43a2babce23" + } + ], + "reviewedAt": "2026-10-20T06:14:21.874420+00:00" + }, + { + "revision": "baseline", + "provider": "codex", + "prompt": "door-lock", + "width": 710, + "index": 0, + "label": "Lock cutaway. Arrow keys choose a key; Enter attempts to turn it.", + "verdict": "live", + "reason": "The inspected ArrowRight pair changes the lock from its incomplete initial drawing to No key: springs and pins become visible, with blocked readout and matching explanation. The saved source explicitly handles ArrowRight by changing key and calling draw; no autonomous transition is involved. This proves this input route only: the captured initialization runtime error still rejects the whole card.", + "sourceReplaySha256": "dd68e571ddec4af2e34b5f72be0dba02c3059ae6ef7c56a7567123ea9a0bb4a1", + "evidence": [ + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/door-lock/width-710/control-0-key-ArrowRight-before2.png", + "sha256": "d4901357edceabb6821bc3540ad6c5f03f60fe2b03228b0ffb159fda967343fa" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/door-lock/width-710/control-0-key-ArrowRight-after0.png", + "sha256": "4700b44a07b50b60404f99af153aa9f94450e6f3f69650051e92e6806352d2b1" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/replay-pairs/baseline/codex/door-lock-710-0.png", + "sha256": "dad32926abd2ed33502004e00daa99c605ba0b7377cb184a4f723c182a3f24fc" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/replay-visual-review-codex-baseline.json", + "sha256": "cd060b6469f414432b932d3c469ac7e7af83e70281c25bc46a18d43a2babce23" + } + ], + "reviewedAt": "2026-10-20T06:14:21.878027+00:00" + }, + { + "revision": "baseline", + "provider": "codex", + "prompt": "door-lock", + "width": 710, + "index": 2, + "label": "Wrong key", + "verdict": "live", + "reason": "The inspected click pair visibly inserts the wrong key, changes pin heights and changes the explanation to a pin bridging the shell and plug. The saved onclick calls set/draw synchronously. The existing initialization runtime error remains a whole-card failure.", + "sourceReplaySha256": "dd68e571ddec4af2e34b5f72be0dba02c3059ae6ef7c56a7567123ea9a0bb4a1", + "evidence": [ + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/door-lock/width-710/control-2-primary-before2.png", + "sha256": "e098417aa220db09a541f0d4251fa9a3c945bf68681d28ae202f2bf9ea4a4a24" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/door-lock/width-710/control-2-primary-after0.png", + "sha256": "6ac8d0a46dbebf9b6dd6557400a3d962f39c1e15de5cc0dc7d658e4b44879e7f" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/replay-pairs/baseline/codex/door-lock-710-2.png", + "sha256": "6ae4965fb7c75160aab9cb045398f09bd575006f3247f76fb43b734e942c1fd7" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/replay-visual-review-codex-baseline.json", + "sha256": "cd060b6469f414432b932d3c469ac7e7af83e70281c25bc46a18d43a2babce23" + } + ], + "reviewedAt": "2026-10-20T06:14:21.881867+00:00" + }, + { + "revision": "baseline", + "provider": "codex", + "prompt": "git-merge", + "width": 710, + "index": 0, + "label": "Document comparison machine. Use left and right arrow keys to switch scenarios.", + "verdict": "dead", + "reason": "The inspected ArrowRight pair leaves the clean scenario, diagram text, branch history and explanation unchanged. The saved handler calls unsupported object-form params.set, confirming the original silent no-op. Working scenario buttons do not repair the exposed keyboard surface.", + "sourceReplaySha256": "2356bce996be14eabc9cb4bb2d6768f829c1837596c41e9be98d49a316c64bbc", + "evidence": [ + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/git-merge/width-710/control-0-key-ArrowRight-before2.png", + "sha256": "d19839450923f3fd327cfa5ca02fd5f5b492dc864c66c7f5c673c9310647df14" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/git-merge/width-710/control-0-key-ArrowRight-after0.png", + "sha256": "d19839450923f3fd327cfa5ca02fd5f5b492dc864c66c7f5c673c9310647df14" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/replay-visual-review-codex-baseline.json", + "sha256": "cd060b6469f414432b932d3c469ac7e7af83e70281c25bc46a18d43a2babce23" + } + ], + "reviewedAt": "2026-10-20T06:14:21.887756+00:00" + }, + { + "revision": "baseline", + "provider": "codex", + "prompt": "git-merge", + "width": 710, + "index": 1, + "label": "Clean merge", + "verdict": "live", + "reason": "The inspected Clean merge click replaces the conflict explanation and paused history with the clean merge explanation and a new merge commit M. Changed text and history are independent of selected-button styling.", + "sourceReplaySha256": "2356bce996be14eabc9cb4bb2d6768f829c1837596c41e9be98d49a316c64bbc", + "evidence": [ + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/git-merge/width-710/control-1-primary-before2.png", + "sha256": "96768be3f94c5479a3b4b5206c6b84461cd8f7b0aa1bca30c6fbbaabc747d3c4" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/git-merge/width-710/control-1-primary-after0.png", + "sha256": "da8f9258c73128066a301d8b38fcd3d5bddd090409ed1b7890738976a1da9e21" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/replay-pairs/baseline/codex/git-merge-710-1.png", + "sha256": "23acd270803c817423267ad1ee573aa3188607537fdd5eda8f982d5f971c78cb" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/replay-visual-review-codex-baseline.json", + "sha256": "cd060b6469f414432b932d3c469ac7e7af83e70281c25bc46a18d43a2babce23" + } + ], + "reviewedAt": "2026-10-20T06:14:21.892757+00:00" + }, + { + "revision": "baseline", + "provider": "codex", + "prompt": "git-merge", + "width": 710, + "index": 2, + "label": "Conflict", + "verdict": "live", + "reason": "The inspected Conflict click changes the diagram's compared/result text and replaces the external paragraph/history with conflicting title edits and a paused merge, matching the scenario subscription.", + "sourceReplaySha256": "2356bce996be14eabc9cb4bb2d6768f829c1837596c41e9be98d49a316c64bbc", + "evidence": [ + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/git-merge/width-710/control-2-primary-before2.png", + "sha256": "da8f9258c73128066a301d8b38fcd3d5bddd090409ed1b7890738976a1da9e21" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/git-merge/width-710/control-2-primary-after0.png", + "sha256": "96768be3f94c5479a3b4b5206c6b84461cd8f7b0aa1bca30c6fbbaabc747d3c4" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/replay-pairs/baseline/codex/git-merge-710-2.png", + "sha256": "9b91527498b8e9585f79a520f995b1b5291c41dbc6267dc05fc11acd5ef2862c" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/replay-visual-review-codex-baseline.json", + "sha256": "cd060b6469f414432b932d3c469ac7e7af83e70281c25bc46a18d43a2babce23" + } + ], + "reviewedAt": "2026-10-20T06:14:21.897916+00:00" + }, + { + "revision": "baseline", + "provider": "codex", + "prompt": "git-merge", + "width": 710, + "index": 3, + "label": "Fast-forward", + "verdict": "live", + "reason": "The inspected Fast-forward click changes the external explanation and branch history to moving main to C without a merge commit. The visible scenario output proves this button, while the keyboard control remains dead.", + "sourceReplaySha256": "2356bce996be14eabc9cb4bb2d6768f829c1837596c41e9be98d49a316c64bbc", + "evidence": [ + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/git-merge/width-710/control-3-primary-before2.png", + "sha256": "da8f9258c73128066a301d8b38fcd3d5bddd090409ed1b7890738976a1da9e21" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/git-merge/width-710/control-3-primary-after0.png", + "sha256": "b5ad7d1a80a3d3fbcb0483de4e4e7e4aada3cb19403163e29023161ba3554dd7" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/replay-pairs/baseline/codex/git-merge-710-3.png", + "sha256": "450d8abf19dd58554a01206e4170e41bb96161ca12c0c0f7f707c5d5324b689b" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/replay-visual-review-codex-baseline.json", + "sha256": "cd060b6469f414432b932d3c469ac7e7af83e70281c25bc46a18d43a2babce23" + } + ], + "reviewedAt": "2026-10-20T06:14:21.903220+00:00" + }, + { + "revision": "baseline", + "provider": "codex", + "prompt": "load-balancer", + "width": 710, + "index": 0, + "label": "Load balancer: right arrow sends a request; left arrow steps back", + "verdict": "dead", + "reason": "The inspected ArrowRight pair leaves request count 6, per-server active/assigned totals, carriage and latest-server readout unchanged. The saved keyboard handler calls unsupported object-form params.set, retaining the original silent no-op. Working dropdowns and increment buttons do not repair the separate exposed keyboard surface.", + "sourceReplaySha256": "35a0fa18f0455115d7ef7b193c71c0cda48d5058947a030ecbc689fc6194eb9b", + "evidence": [ + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/load-balancer/width-710/control-0-key-ArrowRight-before2.png", + "sha256": "33e04a79fd29a5b5457a37bf9e913f9d06dc761188e0768bddf782e9f22ca3c1" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/load-balancer/width-710/control-0-key-ArrowRight-after0.png", + "sha256": "33e04a79fd29a5b5457a37bf9e913f9d06dc761188e0768bddf782e9f22ca3c1" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/replay-visual-review-codex-baseline.json", + "sha256": "cd060b6469f414432b932d3c469ac7e7af83e70281c25bc46a18d43a2babce23" + } + ], + "reviewedAt": "2026-10-20T06:14:21.906667+00:00" + }, + { + "revision": "baseline", + "provider": "codex", + "prompt": "notification-settings", + "width": 558, + "index": 2, + "label": "Daily digest", + "verdict": "live", + "reason": "The inspected Daily digest click reveals the delivery-time selector and adds Daily digest at 8 AM UTC to the independent notification preview. This is meaningful output despite the card resizing.", + "sourceReplaySha256": "c9e1df7a66812f0637c3c549af67dca46182859f97beec8504e1cb4efcc967d5", + "evidence": [ + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/notification-settings/width-558/control-2-click-before2.png", + "sha256": "74736d11bd2a15fdf58574f5bd34e59e0e48413787e21648b321b7e83a5cb4ef" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/notification-settings/width-558/control-2-click-after0.png", + "sha256": "eea07dce797c6b6d7ed2c20012791c02c350c33fe773d5139918741538617f57" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/replay-pairs/baseline/codex/notification-settings-558-2.png", + "sha256": "62f04836dd410453697f920869d3d22f910b51f44ee1c3c29ad51d6c640660f7" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/replay-visual-review-codex-baseline.json", + "sha256": "cd060b6469f414432b932d3c469ac7e7af83e70281c25bc46a18d43a2babce23" + } + ], + "reviewedAt": "2026-10-20T06:14:21.913224+00:00" + }, + { + "revision": "baseline", + "provider": "codex", + "prompt": "notification-settings", + "width": 558, + "index": 4, + "label": "Reset defaults", + "verdict": "dead", + "reason": "The inspected Reset defaults click starts from a genuinely nondefault state (email off, digest at 12 PM) and leaves all controls and the independent preview unchanged. Saved onclick uses unsupported object-form P.set, confirming the original silent no-op; a working digest or selector cannot make this card pass.", + "sourceReplaySha256": "c9e1df7a66812f0637c3c549af67dca46182859f97beec8504e1cb4efcc967d5", + "evidence": [ + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/notification-settings/width-558/control-4-primary-before2.png", + "sha256": "1e8c98a7db815b513a5319dc929e8ff71b7e75339fc4a08694d8a899a60c3bc4" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/notification-settings/width-558/control-4-primary-after0.png", + "sha256": "1e8c98a7db815b513a5319dc929e8ff71b7e75339fc4a08694d8a899a60c3bc4" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/replay-visual-review-codex-baseline.json", + "sha256": "cd060b6469f414432b932d3c469ac7e7af83e70281c25bc46a18d43a2babce23" + } + ], + "reviewedAt": "2026-10-20T06:14:21.928932+00:00" + }, + { + "revision": "baseline", + "provider": "codex", + "prompt": "refrigerator", + "width": 710, + "index": 0, + "label": "Refrigeration cycle. Use left and right arrow keys to change stage.", + "verdict": "dead", + "reason": "The inspected supported-input before/after frames keep the same uninitialized refrigerator, blank stage explanation and unchanged output. The retained source object-form params.define throws before registering the render subscription; v3 records that initialization exception. Thus the original dead-control finding remains, not a merely small visual delta.", + "sourceReplaySha256": "56c4ae83a7d210d4030bc6680820b3e9ad655402e89976df0998a643f92edb13", + "evidence": [ + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/refrigerator/width-710/control-0-key-ArrowRight-before2.png", + "sha256": "999d92c964e042265692a2c2dfc84d410fd56aa1bc3d9f00f79944888498c882" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/refrigerator/width-710/control-0-key-ArrowRight-after0.png", + "sha256": "999d92c964e042265692a2c2dfc84d410fd56aa1bc3d9f00f79944888498c882" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/replay-visual-review-codex-baseline.json", + "sha256": "cd060b6469f414432b932d3c469ac7e7af83e70281c25bc46a18d43a2babce23" + } + ], + "reviewedAt": "2026-10-20T06:14:21.932584+00:00" + }, + { + "revision": "baseline", + "provider": "codex", + "prompt": "refrigerator", + "width": 710, + "index": 1, + "label": "1. Absorb", + "verdict": "dead", + "reason": "The inspected supported-input before/after frames keep the same uninitialized refrigerator, blank stage explanation and unchanged output. The retained source object-form params.define throws before registering the render subscription; v3 records that initialization exception. Thus the original dead-control finding remains, not a merely small visual delta.", + "sourceReplaySha256": "56c4ae83a7d210d4030bc6680820b3e9ad655402e89976df0998a643f92edb13", + "evidence": [ + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/refrigerator/width-710/control-1-primary-before2.png", + "sha256": "36bb1ab53798927e167d665e9e2984b7a46615f9f6cedc3c99338b4b2ea0ec07" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/refrigerator/width-710/control-1-primary-after0.png", + "sha256": "36bb1ab53798927e167d665e9e2984b7a46615f9f6cedc3c99338b4b2ea0ec07" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/replay-visual-review-codex-baseline.json", + "sha256": "cd060b6469f414432b932d3c469ac7e7af83e70281c25bc46a18d43a2babce23" + } + ], + "reviewedAt": "2026-10-20T06:14:21.935777+00:00" + }, + { + "revision": "baseline", + "provider": "codex", + "prompt": "refrigerator", + "width": 710, + "index": 2, + "label": "2. Compress", + "verdict": "dead", + "reason": "The inspected supported-input before/after frames keep the same uninitialized refrigerator, blank stage explanation and unchanged output. The retained source object-form params.define throws before registering the render subscription; v3 records that initialization exception. Thus the original dead-control finding remains, not a merely small visual delta.", + "sourceReplaySha256": "56c4ae83a7d210d4030bc6680820b3e9ad655402e89976df0998a643f92edb13", + "evidence": [ + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/refrigerator/width-710/control-2-primary-before2.png", + "sha256": "36bb1ab53798927e167d665e9e2984b7a46615f9f6cedc3c99338b4b2ea0ec07" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/refrigerator/width-710/control-2-primary-after0.png", + "sha256": "36bb1ab53798927e167d665e9e2984b7a46615f9f6cedc3c99338b4b2ea0ec07" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/replay-visual-review-codex-baseline.json", + "sha256": "cd060b6469f414432b932d3c469ac7e7af83e70281c25bc46a18d43a2babce23" + } + ], + "reviewedAt": "2026-10-20T06:14:21.938677+00:00" + }, + { + "revision": "baseline", + "provider": "codex", + "prompt": "refrigerator", + "width": 710, + "index": 3, + "label": "3. Release", + "verdict": "dead", + "reason": "The inspected supported-input before/after frames keep the same uninitialized refrigerator, blank stage explanation and unchanged output. The retained source object-form params.define throws before registering the render subscription; v3 records that initialization exception. Thus the original dead-control finding remains, not a merely small visual delta.", + "sourceReplaySha256": "56c4ae83a7d210d4030bc6680820b3e9ad655402e89976df0998a643f92edb13", + "evidence": [ + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/refrigerator/width-710/control-3-primary-before2.png", + "sha256": "36bb1ab53798927e167d665e9e2984b7a46615f9f6cedc3c99338b4b2ea0ec07" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/refrigerator/width-710/control-3-primary-after0.png", + "sha256": "36bb1ab53798927e167d665e9e2984b7a46615f9f6cedc3c99338b4b2ea0ec07" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/replay-visual-review-codex-baseline.json", + "sha256": "cd060b6469f414432b932d3c469ac7e7af83e70281c25bc46a18d43a2babce23" + } + ], + "reviewedAt": "2026-10-20T06:14:21.941483+00:00" + }, + { + "revision": "baseline", + "provider": "codex", + "prompt": "refrigerator", + "width": 710, + "index": 4, + "label": "4. Expand", + "verdict": "dead", + "reason": "The inspected supported-input before/after frames keep the same uninitialized refrigerator, blank stage explanation and unchanged output. The retained source object-form params.define throws before registering the render subscription; v3 records that initialization exception. Thus the original dead-control finding remains, not a merely small visual delta.", + "sourceReplaySha256": "56c4ae83a7d210d4030bc6680820b3e9ad655402e89976df0998a643f92edb13", + "evidence": [ + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/refrigerator/width-710/control-4-primary-before2.png", + "sha256": "36bb1ab53798927e167d665e9e2984b7a46615f9f6cedc3c99338b4b2ea0ec07" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/refrigerator/width-710/control-4-primary-after0.png", + "sha256": "36bb1ab53798927e167d665e9e2984b7a46615f9f6cedc3c99338b4b2ea0ec07" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/replay-visual-review-codex-baseline.json", + "sha256": "cd060b6469f414432b932d3c469ac7e7af83e70281c25bc46a18d43a2babce23" + } + ], + "reviewedAt": "2026-10-20T06:14:21.944272+00:00" + }, + { + "revision": "baseline", + "provider": "codex", + "prompt": "seat-belt", + "width": 710, + "index": 0, + "label": "Braking condition; use arrow keys", + "verdict": "dead", + "reason": "The inspected supported-input pair retains the same reel/latch and Free to unwind output with no mode explanation. Source initialization throws on object-form params.define before render subscription and animation registration; v3 captures the same exception. The original dead-control finding remains.", + "sourceReplaySha256": "8433ef2cd777da67e843809339aa49dcffb115cd4e76f06a0e079963b08732c9", + "evidence": [ + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/seat-belt/width-710/control-0-key-ArrowRight-before2.png", + "sha256": "1b0b96fb6c110196f5f405d8d2eaf59dcafe7dfafa54f27b6dd40b2ffc177b3a" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/seat-belt/width-710/control-0-key-ArrowRight-after0.png", + "sha256": "1b0b96fb6c110196f5f405d8d2eaf59dcafe7dfafa54f27b6dd40b2ffc177b3a" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/replay-visual-review-codex-baseline.json", + "sha256": "cd060b6469f414432b932d3c469ac7e7af83e70281c25bc46a18d43a2babce23" + } + ], + "reviewedAt": "2026-10-20T06:14:21.946456+00:00" + }, + { + "revision": "baseline", + "provider": "codex", + "prompt": "seat-belt", + "width": 710, + "index": 1, + "label": "Normal movement", + "verdict": "dead", + "reason": "The inspected supported-input pair retains the same reel/latch and Free to unwind output with no mode explanation. Source initialization throws on object-form params.define before render subscription and animation registration; v3 captures the same exception. The original dead-control finding remains.", + "sourceReplaySha256": "8433ef2cd777da67e843809339aa49dcffb115cd4e76f06a0e079963b08732c9", + "evidence": [ + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/seat-belt/width-710/control-1-primary-before2.png", + "sha256": "4ca35262649cb3f317012e9d285a54a11bda59222294072d9a6651651bd7cde3" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/seat-belt/width-710/control-1-primary-after0.png", + "sha256": "4ca35262649cb3f317012e9d285a54a11bda59222294072d9a6651651bd7cde3" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/replay-visual-review-codex-baseline.json", + "sha256": "cd060b6469f414432b932d3c469ac7e7af83e70281c25bc46a18d43a2babce23" + } + ], + "reviewedAt": "2026-10-20T06:14:21.948691+00:00" + }, + { + "revision": "baseline", + "provider": "codex", + "prompt": "seat-belt", + "width": 710, + "index": 2, + "label": "Sudden braking", + "verdict": "dead", + "reason": "The inspected supported-input pair retains the same reel/latch and Free to unwind output with no mode explanation. Source initialization throws on object-form params.define before render subscription and animation registration; v3 captures the same exception. The original dead-control finding remains.", + "sourceReplaySha256": "8433ef2cd777da67e843809339aa49dcffb115cd4e76f06a0e079963b08732c9", + "evidence": [ + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/seat-belt/width-710/control-2-primary-before2.png", + "sha256": "4ca35262649cb3f317012e9d285a54a11bda59222294072d9a6651651bd7cde3" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/seat-belt/width-710/control-2-primary-after0.png", + "sha256": "4ca35262649cb3f317012e9d285a54a11bda59222294072d9a6651651bd7cde3" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/replay-visual-review-codex-baseline.json", + "sha256": "cd060b6469f414432b932d3c469ac7e7af83e70281c25bc46a18d43a2babce23" + } + ], + "reviewedAt": "2026-10-20T06:14:21.950850+00:00" + }, + { + "revision": "baseline", + "provider": "codex", + "prompt": "spray-bottle", + "width": 710, + "index": 0, + "label": "Pump stroke", + "verdict": "live", + "reason": "The inspected ArrowRight pair changes Release to Squeeze: mist appears, piston/spring geometry changes and the explanation and external readout update. The saved global keyboard handler explicitly supports ArrowRight and switches the phase before animation, so this is an input-caused transition. The captured initialization runtime error still rejects the card.", + "sourceReplaySha256": "5f3f2d0801a433b856a1fb33177b05defe162c1b7e09780493c327de77550f07", + "evidence": [ + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/spray-bottle/width-710/control-0-key-ArrowRight-before2.png", + "sha256": "2355f7d3356e4b6b918886701bca138030093b3938f24ebbd3732f88772ade48" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/spray-bottle/width-710/control-0-key-ArrowRight-after0.png", + "sha256": "8b273319fe3686be6c4237603d13c986b927310320b79df4117fa288a0a90089" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/replay-pairs/baseline/codex/spray-bottle-710-0.png", + "sha256": "4999f782ebe6f455251299d0a51efca9c48fd2d0a24a817ba82e954eec8c51ab" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/replay-visual-review-codex-baseline.json", + "sha256": "cd060b6469f414432b932d3c469ac7e7af83e70281c25bc46a18d43a2babce23" + } + ], + "reviewedAt": "2026-10-20T06:14:21.953228+00:00" + }, + { + "revision": "baseline", + "provider": "codex", + "prompt": "stapler", + "width": 710, + "index": 0, + "label": "Stapler cycle", + "verdict": "live", + "reason": "The inspected End pair changes Ready to Release and replaces the explanatory paragraph with the return-spring/feed-spring stage. The saved source explicitly handles End and sets cycle 100; there is no autonomous cycle timer.", + "sourceReplaySha256": "38fba8bbf0d9d5d185f4ba38ec7c34341a997efbaed9ad6dbe9add352a26d5fd", + "evidence": [ + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/stapler/width-710/control-0-key-End-before2.png", + "sha256": "09eb5d2ca067411db041ba7e0f65c50e2ecad70f7cd0afe04b13574aa8230c53" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/stapler/width-710/control-0-key-End-after0.png", + "sha256": "a3d60468d966bf6b892826fef3ba6e1e18605c007eddd5df8070fdd2d50faf1b" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/replay-pairs/baseline/codex/stapler-710-0.png", + "sha256": "eab4ac84dcdc6db85265665b4772c288513880b4ac414f47d06be2cc1b9c4c19" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/replay-visual-review-codex-baseline.json", + "sha256": "cd060b6469f414432b932d3c469ac7e7af83e70281c25bc46a18d43a2babce23" + } + ], + "reviewedAt": "2026-10-20T06:14:21.955632+00:00" + }, + { + "revision": "baseline", + "provider": "codex", + "prompt": "stapler", + "width": 710, + "index": 2, + "label": "Next stage \u2192", + "verdict": "live", + "reason": "The inspected Next-stage click resets Release to Ready, changes the mechanism geometry and explanatory paragraph, matching the saved synchronous next-stage handler.", + "sourceReplaySha256": "38fba8bbf0d9d5d185f4ba38ec7c34341a997efbaed9ad6dbe9add352a26d5fd", + "evidence": [ + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/stapler/width-710/control-2-primary-before2.png", + "sha256": "8d2146d8385f0dd7fd5ff2df0ef8290a9f91fb164f10597d74fce552f3ca8bc5" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/stapler/width-710/control-2-primary-after0.png", + "sha256": "c7bf01b93fc3b20b43c49bd7f0bf16e99611bfbf1dd94d7ecba17fa883b9b963" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/replay-pairs/baseline/codex/stapler-710-2.png", + "sha256": "96769d4086d48886b2f7786281cc16674078eb9b4365570ef25cf3ec522b240f" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/replay-visual-review-codex-baseline.json", + "sha256": "cd060b6469f414432b932d3c469ac7e7af83e70281c25bc46a18d43a2babce23" + } + ], + "reviewedAt": "2026-10-20T06:14:21.958006+00:00" + }, + { + "revision": "baseline", + "provider": "codex", + "prompt": "toilet", + "width": 710, + "index": 0, + "label": "Flush cycle; use left and right arrow keys", + "verdict": "live", + "reason": "The inspected End pair changes Ready to Shut off and the external readout and paragraph to Float raised / refill shuts off. The saved source explicitly handles End, stops the timer first and selects phase 4, so this is a supported input route rather than autonomous cycle settling.", + "sourceReplaySha256": "c0639791d117e9a5b9c489afc1c6c9448f93d6b2408630564da620ed456fc8e6", + "evidence": [ + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/toilet/width-710/control-0-key-End-before2.png", + "sha256": "8eee889d8f17f94bfae25eff08badb329ba871b513390d80115c505cb459be49" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/toilet/width-710/control-0-key-End-after0.png", + "sha256": "152f5d1b36883685ab8581e26ddb5392f6435ed12f2a6064d28e14b1c626e7f0" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/replay-pairs/baseline/codex/toilet-710-0.png", + "sha256": "b18f8f6f6b3574ea39c8c88f77462fb66f6757b7a1761322b35016d6c00fa448" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/replay-visual-review-codex-baseline.json", + "sha256": "cd060b6469f414432b932d3c469ac7e7af83e70281c25bc46a18d43a2babce23" + } + ], + "reviewedAt": "2026-10-20T06:14:21.960883+00:00" + }, + { + "revision": "baseline", + "provider": "codex", + "prompt": "umbrella", + "width": 710, + "index": 0, + "label": "Cutaway umbrella showing a sliding runner, hinged stretchers, ribs and fabric", + "verdict": "live", + "reason": "The inspected Home pair draws a closed umbrella and closed-state explanation from the initially blank stage. The saved handler explicitly supports Home and changes the target opening before rendering. This proves the input route, while the initialization exception still rejects the whole card.", + "sourceReplaySha256": "f5aaf770a526f7638f534ee4fe0e212eddb39e38bcb79d5c39c3e2a662f52371", + "evidence": [ + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/umbrella/width-710/control-0-key-Home-before2.png", + "sha256": "721bd293a28fb176fd12adc52a5ff2296b3362121f5205a9d4d4e3375c67c5f1" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/umbrella/width-710/control-0-key-Home-after0.png", + "sha256": "ffa3ce1891b43ef62f3b51d6dc60d543d9d4f9845b1f3109cffe321eaf73bd48" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/replay-pairs/baseline/codex/umbrella-710-0.png", + "sha256": "4c6b4f596068c004825fe83694a4287221447c7355671dc1db4ad2aee1c0551e" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/replay-visual-review-codex-baseline.json", + "sha256": "cd060b6469f414432b932d3c469ac7e7af83e70281c25bc46a18d43a2babce23" + } + ], + "reviewedAt": "2026-10-20T06:14:21.964497+00:00" + }, + { + "revision": "baseline", + "provider": "codex", + "prompt": "umbrella", + "width": 710, + "index": 1, + "label": "Open", + "verdict": "live", + "reason": "The inspected Open click unfolds the canopy and ribs, raises the runner and changes the explanatory text to the open state. Its saved handler sets opening 100; the visible change is not merely control styling. The card initialization runtime error remains disqualifying.", + "sourceReplaySha256": "f5aaf770a526f7638f534ee4fe0e212eddb39e38bcb79d5c39c3e2a662f52371", + "evidence": [ + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/umbrella/width-710/control-1-primary-before2.png", + "sha256": "12b61760fd7d82a7a5d421067e7f5393aff1faf38c1d797372742d9ce97c5b44" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/umbrella/width-710/control-1-primary-after0.png", + "sha256": "ed55c601fee92e2983632e48ab0931df14c77af135e600f08886dc19f239027c" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/replay-pairs/baseline/codex/umbrella-710-1.png", + "sha256": "0817f9258d0808b5c4d5a5bdbf21740fcebc224a49833de7620a6abdd33d334f" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/replay-visual-review-codex-baseline.json", + "sha256": "cd060b6469f414432b932d3c469ac7e7af83e70281c25bc46a18d43a2babce23" + } + ], + "reviewedAt": "2026-10-20T06:14:21.968166+00:00" + }, + { + "revision": "baseline", + "provider": "codex", + "prompt": "washing-machine", + "width": 710, + "index": 0, + "label": "control 0", + "verdict": "live", + "reason": "Supported ArrowRight changes Fill to Wash, including the explanatory paragraph and readout. No autonomous stage advance exists in the saved handler.", + "sourceReplaySha256": "ec59840357e983941f82d58f3c47282a5b3461e1065695f13940e1f37ca20cd2", + "evidence": [ + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/washing-machine/width-710/control-0-key-ArrowRight-before2.png", + "sha256": "7360b5794012577180e4017b3d3b11601614438b135ef9c43859254fb34889de" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/washing-machine/width-710/control-0-key-ArrowRight-after0.png", + "sha256": "fbf5d57db51b978a1dda31baa76d0e8d0f93845deee260d04ffa8aba933e3a54" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/replay-pairs/baseline/codex/washing-machine-710-0.png", + "sha256": "4d4b915f9dd9623c9e767d371e835aa9e33320017f8ffb0f63cbbb60cd06b23a" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/replay-visual-review-codex-baseline.json", + "sha256": "cd060b6469f414432b932d3c469ac7e7af83e70281c25bc46a18d43a2babce23" + } + ], + "reviewedAt": "2026-10-20T06:14:21.972188+00:00" + }, + { + "revision": "baseline", + "provider": "codex", + "prompt": "washing-machine", + "width": 710, + "index": 1, + "label": "Fill", + "verdict": "live", + "reason": "Click Fill changes Wash to Fill and replaces the mechanism explanation/readout.", + "sourceReplaySha256": "ec59840357e983941f82d58f3c47282a5b3461e1065695f13940e1f37ca20cd2", + "evidence": [ + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/washing-machine/width-710/control-1-primary-before2.png", + "sha256": "98a6a4d096dd60de323ce83bf0747fee5184990f5e1caf093e423266088669be" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/washing-machine/width-710/control-1-primary-after0.png", + "sha256": "fcd73db4601b3d70b2e64b70a8f89167b09f7664cde99b6e8297b26bd4fcaabd" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/replay-pairs/baseline/codex/washing-machine-710-1.png", + "sha256": "f35080c8425c78216cfb145844ae989cc31c51daa361a2dcbb161a650c19595a" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/replay-visual-review-codex-baseline.json", + "sha256": "cd060b6469f414432b932d3c469ac7e7af83e70281c25bc46a18d43a2babce23" + } + ], + "reviewedAt": "2026-10-20T06:14:21.976055+00:00" + }, + { + "revision": "baseline", + "provider": "codex", + "prompt": "washing-machine", + "width": 710, + "index": 2, + "label": "Wash", + "verdict": "live", + "reason": "Click Wash changes Fill to Wash and replaces the mechanism explanation/readout.", + "sourceReplaySha256": "ec59840357e983941f82d58f3c47282a5b3461e1065695f13940e1f37ca20cd2", + "evidence": [ + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/washing-machine/width-710/control-2-primary-before2.png", + "sha256": "352d54ac62f9cee113113c994c2e76ccc766d73a7a6b494ecf230c5795ab48db" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/washing-machine/width-710/control-2-primary-after0.png", + "sha256": "7d39659841cd5276eeb0efeac22b8faae679bbbfe269dc6a259ce99b62c947dc" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/replay-pairs/baseline/codex/washing-machine-710-2.png", + "sha256": "9f9fe1ffce5a6aa2ef1f74063f11a8584309cad68a73a3cd7748de17226b85ed" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/replay-visual-review-codex-baseline.json", + "sha256": "cd060b6469f414432b932d3c469ac7e7af83e70281c25bc46a18d43a2babce23" + } + ], + "reviewedAt": "2026-10-20T06:14:21.979895+00:00" + }, + { + "revision": "baseline", + "provider": "codex", + "prompt": "washing-machine", + "width": 710, + "index": 3, + "label": "Drain", + "verdict": "live", + "reason": "Click Drain visibly removes tank water, lights the drain route and changes the explanation/readout.", + "sourceReplaySha256": "ec59840357e983941f82d58f3c47282a5b3461e1065695f13940e1f37ca20cd2", + "evidence": [ + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/washing-machine/width-710/control-3-primary-before2.png", + "sha256": "352d54ac62f9cee113113c994c2e76ccc766d73a7a6b494ecf230c5795ab48db" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/washing-machine/width-710/control-3-primary-after0.png", + "sha256": "f025a087c59463060def596908cf6aebdbaac3b2da600a05ad4619f8661cd71f" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/replay-pairs/baseline/codex/washing-machine-710-3.png", + "sha256": "414bd2ffb951042aa9e29a4dcb3ba99f2885bc4cdd9b2b4de8646ab40b0a59d2" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/replay-visual-review-codex-baseline.json", + "sha256": "cd060b6469f414432b932d3c469ac7e7af83e70281c25bc46a18d43a2babce23" + } + ], + "reviewedAt": "2026-10-20T06:14:21.985541+00:00" + }, + { + "revision": "baseline", + "provider": "codex", + "prompt": "washing-machine", + "width": 710, + "index": 5, + "label": "Spin", + "verdict": "live", + "reason": "Click Spin visibly removes tank water, changes drum appearance and explains spinning/draining instead of filling.", + "sourceReplaySha256": "ec59840357e983941f82d58f3c47282a5b3461e1065695f13940e1f37ca20cd2", + "evidence": [ + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/washing-machine/width-710/control-5-primary-before2.png", + "sha256": "352d54ac62f9cee113113c994c2e76ccc766d73a7a6b494ecf230c5795ab48db" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/washing-machine/width-710/control-5-primary-after0.png", + "sha256": "aabaccc5e495c2ffaf20ba852c7754473dc1d4ca8c883fb6e700032ffc4f901e" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/replay-pairs/baseline/codex/washing-machine-710-5.png", + "sha256": "10771b0e6c999deba7c9ca26c9c2ec4f597724ab9bfede4677783996068f6313" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/replay-visual-review-codex-baseline.json", + "sha256": "cd060b6469f414432b932d3c469ac7e7af83e70281c25bc46a18d43a2babce23" + } + ], + "reviewedAt": "2026-10-20T06:14:21.991398+00:00" + }, + { + "revision": "baseline", + "provider": "codex", + "prompt": "websocket", + "width": 710, + "index": 0, + "label": "Chat message delivery steps", + "verdict": "live", + "reason": "The inspected End key changes Connections open to Chat view updated, adds sender/server/recipient content and changes the paragraph to recipient push delivery. The saved keyboard handler explicitly supports End and sets step 3; no autonomous animation is used.", + "sourceReplaySha256": "d7c779c3095c1a7de8e0ce132b29541514d8b5b86a376a2c56beabb94773ffbf", + "evidence": [ + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/websocket/width-710/control-0-key-End-before2.png", + "sha256": "d5942e84f5c669fcaa9c2be126d818f68a1acb1a1fe51bb5b3dbd3a8b8b0920e" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/websocket/width-710/control-0-key-End-after0.png", + "sha256": "c5da7159c882ef0478437868e29a60fabcd3e01d4383d8bcd94b66251d686b5f" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/replay-pairs/baseline/codex/websocket-710-0.png", + "sha256": "f4029844967ea2bb45998128ef86402e8247d503a065a80ed6170d9c959a4eb4" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/replay-visual-review-codex-baseline.json", + "sha256": "cd060b6469f414432b932d3c469ac7e7af83e70281c25bc46a18d43a2babce23" + } + ], + "reviewedAt": "2026-10-20T06:14:21.996687+00:00" + }, + { + "revision": "baseline", + "provider": "codex", + "prompt": "websocket", + "width": 710, + "index": 1, + "label": "Connect", + "verdict": "live", + "reason": "The inspected Connect click changes Message sent to Connections open, removes the message from the mechanism and replaces the external explanation with establishing connections.", + "sourceReplaySha256": "d7c779c3095c1a7de8e0ce132b29541514d8b5b86a376a2c56beabb94773ffbf", + "evidence": [ + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/websocket/width-710/control-1-primary-before2.png", + "sha256": "87371cf62a5a25f8a94a52a2e1770126ab86ecb3e763139cbcdfabb1d89ec388" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/websocket/width-710/control-1-primary-after0.png", + "sha256": "2dc2cad48ee38c0a256612b8798c5f284d30c466c09e8fecc580c18df81be9b4" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/replay-pairs/baseline/codex/websocket-710-1.png", + "sha256": "ce873134012a014b1872d9273e460e91a2eadf6ee2b1ad49597cebb51530e0b3" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/replay-visual-review-codex-baseline.json", + "sha256": "cd060b6469f414432b932d3c469ac7e7af83e70281c25bc46a18d43a2babce23" + } + ], + "reviewedAt": "2026-10-20T06:14:22.002305+00:00" + }, + { + "revision": "baseline", + "provider": "codex", + "prompt": "websocket", + "width": 710, + "index": 2, + "label": "Send", + "verdict": "live", + "reason": "The inspected Send click adds a sender message/envelope and changes the independent readout and explanation from Connections open to Message sent.", + "sourceReplaySha256": "d7c779c3095c1a7de8e0ce132b29541514d8b5b86a376a2c56beabb94773ffbf", + "evidence": [ + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/websocket/width-710/control-2-primary-before2.png", + "sha256": "2dc2cad48ee38c0a256612b8798c5f284d30c466c09e8fecc580c18df81be9b4" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/websocket/width-710/control-2-primary-after0.png", + "sha256": "87371cf62a5a25f8a94a52a2e1770126ab86ecb3e763139cbcdfabb1d89ec388" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/replay-pairs/baseline/codex/websocket-710-2.png", + "sha256": "fcda45cd8cc8061080b0a9611a93cc44fe333dd4180a56283d36ddd7976abf7d" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/replay-visual-review-codex-baseline.json", + "sha256": "cd060b6469f414432b932d3c469ac7e7af83e70281c25bc46a18d43a2babce23" + } + ], + "reviewedAt": "2026-10-20T06:14:22.007309+00:00" + }, + { + "revision": "baseline", + "provider": "codex", + "prompt": "websocket", + "width": 710, + "index": 3, + "label": "Server", + "verdict": "live", + "reason": "The inspected Server click adds message history and server output to the diagram and changes the external readout and paragraph to server validation/storage.", + "sourceReplaySha256": "d7c779c3095c1a7de8e0ce132b29541514d8b5b86a376a2c56beabb94773ffbf", + "evidence": [ + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/websocket/width-710/control-3-primary-before2.png", + "sha256": "2dc2cad48ee38c0a256612b8798c5f284d30c466c09e8fecc580c18df81be9b4" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/websocket/width-710/control-3-primary-after0.png", + "sha256": "a4c6905de583009d2d7613fda6a1919e7735b87275eb585fa63e8e38f8fa8ec3" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/replay-pairs/baseline/codex/websocket-710-3.png", + "sha256": "345068c6141a5f4198fe3835a5680095fd6827c34753aa5fbfcaa2633e647896" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/replay-visual-review-codex-baseline.json", + "sha256": "cd060b6469f414432b932d3c469ac7e7af83e70281c25bc46a18d43a2babce23" + } + ], + "reviewedAt": "2026-10-20T06:14:22.011985+00:00" + }, + { + "revision": "baseline", + "provider": "codex", + "prompt": "websocket", + "width": 710, + "index": 5, + "label": "Connected", + "verdict": "live", + "reason": "From Disconnected at Receive, the inspected Connected click restores recipient message output, closes the latch and changes the readout/paragraph to successful catch-up. This is visible application behavior, not selection styling.", + "sourceReplaySha256": "d7c779c3095c1a7de8e0ce132b29541514d8b5b86a376a2c56beabb94773ffbf", + "evidence": [ + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/websocket/width-710/control-5-primary-before2.png", + "sha256": "bffd1f96cf87c819754b29d760a71080f808c49dde9d5347d8bdcac2b5de3367" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/websocket/width-710/control-5-primary-after0.png", + "sha256": "cb92cb4a06398c59a395a4d8d059460226e78d2034d1ea6be10f38d073db2c76" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/replay-pairs/baseline/codex/websocket-710-5.png", + "sha256": "990891e5601a58d37f0bfa28505e231a5db96a42da18faab7f135d85ad2795db" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/replay-visual-review-codex-baseline.json", + "sha256": "cd060b6469f414432b932d3c469ac7e7af83e70281c25bc46a18d43a2babce23" + } + ], + "reviewedAt": "2026-10-20T06:14:22.016780+00:00" + }, + { + "revision": "baseline", + "provider": "codex", + "prompt": "websocket", + "width": 710, + "index": 6, + "label": "Disconnected", + "verdict": "live", + "reason": "The inspected Disconnected click removes the recipient's received-message output, opens the latch and changes the readout/explanation to undelivered push and stored history. The saved subscription updates this state synchronously.", + "sourceReplaySha256": "d7c779c3095c1a7de8e0ce132b29541514d8b5b86a376a2c56beabb94773ffbf", + "evidence": [ + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/websocket/width-710/control-6-primary-before2.png", + "sha256": "cb92cb4a06398c59a395a4d8d059460226e78d2034d1ea6be10f38d073db2c76" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/websocket/width-710/control-6-primary-after0.png", + "sha256": "bffd1f96cf87c819754b29d760a71080f808c49dde9d5347d8bdcac2b5de3367" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/replay-pairs/baseline/codex/websocket-710-6.png", + "sha256": "b32a2c4751b2f44a78bc7f3afe9f70ff6247159155cc008b98af3f4851519e30" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/replay-visual-review-codex-baseline.json", + "sha256": "cd060b6469f414432b932d3c469ac7e7af83e70281c25bc46a18d43a2babce23" + } + ], + "reviewedAt": "2026-10-20T06:14:22.022139+00:00" + }, + { + "revision": "baseline", + "provider": "codex", + "prompt": "zipper", + "width": 710, + "index": 0, + "label": "Zipper position", + "verdict": "dead", + "reason": "The supported ArrowRight route leaves slider position at 50 and the mechanism unchanged in the inspected pair. The exact saved keyboard handler calls object-form params.set, which the frozen baseline silently ignores; the separate native range working does not repair this stage.", + "sourceReplaySha256": "a7e02b7de93e0d1e5e8f95cf22b95fa5391a1811f9254ee29a5ba5143fa9f725", + "evidence": [ + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/zipper/width-710/control-0-key-ArrowRight-before2.png", + "sha256": "cab6cc9fbf7d6cf323082716a969a4869b3c6ef17088f8282e835044fb298f6d" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/zipper/width-710/control-0-key-ArrowRight-after0.png", + "sha256": "cab6cc9fbf7d6cf323082716a969a4869b3c6ef17088f8282e835044fb298f6d" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/replay-visual-review-codex-baseline.json", + "sha256": "cd060b6469f414432b932d3c469ac7e7af83e70281c25bc46a18d43a2babce23" + } + ], + "reviewedAt": "2026-10-20T06:14:22.025633+00:00" + }, + { + "revision": "baseline", + "provider": "codex", + "prompt": "notification-settings", + "width": 558, + "index": 3, + "label": "Delivery time \u00b7 UTC", + "verdict": "live", + "reason": "Both actual images show digest enabled. The native selector changes Morning (8 AM) to Evening (6 PM), and the independent notification preview changes from 8 AM UTC to 6 PM UTC. The retained observation-only eval agrees (08 to 18); the log is console-clean. This proves the native-key route without a driver change. Reset defaults remains independently dead.", + "sourceReplaySha256": "c9e1df7a66812f0637c3c549af67dca46182859f97beec8504e1cb4efcc967d5", + "evidence": [ + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-manual-review/05-codex-delivery-time-before2.png", + "sha256": "eca5e99d734df824a181f700240bc8895293cf2fff5526a19d64a2219ee6174a" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-manual-review/05-codex-delivery-time-after0.png", + "sha256": "2ed90fc8c636b2f909f937837b5cea2877a2387631df318369954e8822a6c124" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-manual-review/request-05-codex-delivery-time.log", + "sha256": "32f60246a8d1f34114ecd68e19c7306016bfb5e585e79a5e5cfb669a4778edee" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-manual-review/request-05-codex-delivery-time.actions.json", + "sha256": "18a95d502c3f21f5282cd2d338bfc1825dcbbf888d0755b09a210fe331853955" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-manual-review/requests/request-05-codex-delivery-time.json", + "sha256": "7dcb980cf6ff0459030664a54079e779ac6077aaa3b7f87ebc00cfba6f44c0c3" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-manual-review/request-05-codex-delivery-time.exit.json", + "sha256": "f229e8e3093f537e5144b4983f729bd32b5edcb92f00ec608406646a29345914" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/replay-visual-review-codex-baseline-manual.json", + "sha256": "efe8447a9875190d36a00b0ef07d3c9c2764806b5f57feefd9045bd4ad50fef4" + } + ], + "reviewedAt": "2026-10-20T06:14:22.032966+00:00" + }, + { + "revision": "baseline", + "provider": "codex", + "prompt": "git-merge", + "width": 710, + "index": 4, + "label": "What is being compared?", + "verdict": "live", + "reason": "The actual before image has the disclosure closed; the after image visibly reveals the full explanatory paragraph about three-way merges, additions/deletions/renames and ancestry. This is revealed content, not merely a chevron or layout change. The observation-only eval confirms open=true and the same paragraph, and the log is console-clean. This proves expansion; collapse was not exercised. The independent keyboard surface remains dead.", + "sourceReplaySha256": "2356bce996be14eabc9cb4bb2d6768f829c1837596c41e9be98d49a316c64bbc", + "evidence": [ + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-manual-review/06-codex-git-disclosure-before2.png", + "sha256": "da8f9258c73128066a301d8b38fcd3d5bddd090409ed1b7890738976a1da9e21" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-manual-review/06-codex-git-disclosure-after0.png", + "sha256": "595835f292d981d31004e99c574fc610ea659b9087a9c7b0695153056425c918" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-manual-review/request-06-codex-git-disclosure.log", + "sha256": "3ae3874d744562037bc4a6588d885f012b37f961c358719773bdd646a7e900ba" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-manual-review/request-06-codex-git-disclosure.actions.json", + "sha256": "8e35b162c3569d76a45d94f4dc04cb0bdc2d5667bda3a845bddb9d7c98a3e712" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-manual-review/requests/request-06-codex-git-disclosure.json", + "sha256": "b02cb6ed111a908994c376140c08b74b1f2e5c3c9cebcd5ad00ec62a2d8bc16e" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-manual-review/request-06-codex-git-disclosure.exit.json", + "sha256": "c27d2fadf469f414c6a1031e8d7c93e526eadc753a9c7b725b278a8c0ceb3e0c" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/replay-visual-review-codex-baseline-manual.json", + "sha256": "efe8447a9875190d36a00b0ef07d3c9c2764806b5f57feefd9045bd4ad50fef4" + } + ], + "reviewedAt": "2026-10-20T06:14:22.039094+00:00" + }, + { + "revision": "baseline", + "provider": "claude-code", + "prompt": "toilet", + "width": 710, + "index": 0, + "label": "Toilet tank: press Space or Enter to flush; value is litres in the tank", + "verdict": "live", + "reason": "Supported Space input changes a settled Full tank to Flushing, visibly opens the flapper and lowers water. The earlier unsupported ArrowLeft automatic settling proof is superseded.", + "sourceReplaySha256": "3bd0928f6c28bfad5871de9655f846548019ade004b86ec53d06fb0250891a32", + "evidence": [ + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-manual-review/01-toilet-speed-1-before2.png", + "sha256": "167b4a1a3a7cd29a550e41a8f217c790ce76540af9649a980c3e721cedb22218" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-manual-review/01-toilet-speed-1-flush0.png", + "sha256": "e8371ba4b01e5c8c1deb6800012a9802e763a3851d80ef412973931e14cf036f" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-manual-review/request-01-toilet-speed-1.log", + "sha256": "6c31d5d9172b654ccc89de53971d1e1c34b4e42a099f9058f0a3e0083c4b200f" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-manual-review/request-01-toilet-speed-1.actions.json", + "sha256": "6a29135f61e8d327a76ff71d638c78e1e8d9eed87f562a55c51680e958767a72" + } + ], + "reviewedAt": "2026-10-20T06:14:22.042713+00:00" + }, + { + "revision": "baseline", + "provider": "claude-code", + "prompt": "toilet", + "width": 710, + "index": 3, + "label": "1\u00d7", + "verdict": "live", + "reason": "Fresh-page equal-window refill comparison after actual flush: selected 1x, 4x and 10x produce visibly different water rises (about 0.6, 2.1 and 5.1 L over 4.2 seconds). This proves simulation speed beyond selected-button styling; all three inputs and supported flush paths are recorded.", + "sourceReplaySha256": "3bd0928f6c28bfad5871de9655f846548019ade004b86ec53d06fb0250891a32", + "evidence": [ + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-manual-review/01-toilet-speed-1-refill0.png", + "sha256": "bf3da81ef8ee7767c217e5220faf2f8080ea7daa614c9115d7a31413f16ad72a" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-manual-review/01-toilet-speed-1-refill2.png", + "sha256": "dfff4833051854c271fe9ea00cfe855248e5191e3e66f433bbec4ef82d64a8d2" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-manual-review/request-01-toilet-speed-1.log", + "sha256": "6c31d5d9172b654ccc89de53971d1e1c34b4e42a099f9058f0a3e0083c4b200f" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-manual-review/request-01-toilet-speed-1.actions.json", + "sha256": "6a29135f61e8d327a76ff71d638c78e1e8d9eed87f562a55c51680e958767a72" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-manual-review/01-toilet-speed-4-refill0.png", + "sha256": "91a613d0e51b663a66a4d63cd2e07e04099becaef201a9b944b2d84d78d5bd13" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-manual-review/01-toilet-speed-4-refill2.png", + "sha256": "91057516fcb0f63f548f61eb60e0a3515efc17b0a7bec3e316ece402c3896b19" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-manual-review/request-01-toilet-speed-4.log", + "sha256": "501720645d11d7530e51fb0bbf53b28d082e2937edafb29fa47cb68870bb4e23" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-manual-review/request-01-toilet-speed-4.actions.json", + "sha256": "64a4511b075d06eac52cb172cd099804c2560c835c975c79449bda9f814dbea3" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-manual-review/01-toilet-speed-10-refill0.png", + "sha256": "95344607ab912c2d71f26678ad71d42009060ff57ccc41dbe31f7cd425c597b0" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-manual-review/01-toilet-speed-10-refill2.png", + "sha256": "2e0fda6e3f3060a50ad36b2e5cd8158308b4f2804cbf230c6280a30e115f2450" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-manual-review/request-01-toilet-speed-10.log", + "sha256": "747a570ab3a91ed13132a81d96eb2e0cf3c51bf06b86c11b2a25630235ba8a76" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-manual-review/request-01-toilet-speed-10.actions.json", + "sha256": "712b08ed185e348545f5da34487419d3237545abbe58599f41632a04639c5e14" + } + ], + "reviewedAt": "2026-10-20T06:14:22.046769+00:00" + }, + { + "revision": "baseline", + "provider": "claude-code", + "prompt": "toilet", + "width": 710, + "index": 4, + "label": "4\u00d7", + "verdict": "live", + "reason": "Fresh-page equal-window refill comparison after actual flush: selected 1x, 4x and 10x produce visibly different water rises (about 0.6, 2.1 and 5.1 L over 4.2 seconds). This proves simulation speed beyond selected-button styling; all three inputs and supported flush paths are recorded.", + "sourceReplaySha256": "3bd0928f6c28bfad5871de9655f846548019ade004b86ec53d06fb0250891a32", + "evidence": [ + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-manual-review/01-toilet-speed-1-refill0.png", + "sha256": "bf3da81ef8ee7767c217e5220faf2f8080ea7daa614c9115d7a31413f16ad72a" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-manual-review/01-toilet-speed-1-refill2.png", + "sha256": "dfff4833051854c271fe9ea00cfe855248e5191e3e66f433bbec4ef82d64a8d2" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-manual-review/request-01-toilet-speed-1.log", + "sha256": "6c31d5d9172b654ccc89de53971d1e1c34b4e42a099f9058f0a3e0083c4b200f" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-manual-review/request-01-toilet-speed-1.actions.json", + "sha256": "6a29135f61e8d327a76ff71d638c78e1e8d9eed87f562a55c51680e958767a72" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-manual-review/01-toilet-speed-4-refill0.png", + "sha256": "91a613d0e51b663a66a4d63cd2e07e04099becaef201a9b944b2d84d78d5bd13" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-manual-review/01-toilet-speed-4-refill2.png", + "sha256": "91057516fcb0f63f548f61eb60e0a3515efc17b0a7bec3e316ece402c3896b19" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-manual-review/request-01-toilet-speed-4.log", + "sha256": "501720645d11d7530e51fb0bbf53b28d082e2937edafb29fa47cb68870bb4e23" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-manual-review/request-01-toilet-speed-4.actions.json", + "sha256": "64a4511b075d06eac52cb172cd099804c2560c835c975c79449bda9f814dbea3" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-manual-review/01-toilet-speed-10-refill0.png", + "sha256": "95344607ab912c2d71f26678ad71d42009060ff57ccc41dbe31f7cd425c597b0" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-manual-review/01-toilet-speed-10-refill2.png", + "sha256": "2e0fda6e3f3060a50ad36b2e5cd8158308b4f2804cbf230c6280a30e115f2450" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-manual-review/request-01-toilet-speed-10.log", + "sha256": "747a570ab3a91ed13132a81d96eb2e0cf3c51bf06b86c11b2a25630235ba8a76" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-manual-review/request-01-toilet-speed-10.actions.json", + "sha256": "712b08ed185e348545f5da34487419d3237545abbe58599f41632a04639c5e14" + } + ], + "reviewedAt": "2026-10-20T06:14:22.051156+00:00" + }, + { + "revision": "baseline", + "provider": "claude-code", + "prompt": "toilet", + "width": 710, + "index": 5, + "label": "10\u00d7", + "verdict": "live", + "reason": "Fresh-page equal-window refill comparison after actual flush: selected 1x, 4x and 10x produce visibly different water rises (about 0.6, 2.1 and 5.1 L over 4.2 seconds). This proves simulation speed beyond selected-button styling; all three inputs and supported flush paths are recorded.", + "sourceReplaySha256": "3bd0928f6c28bfad5871de9655f846548019ade004b86ec53d06fb0250891a32", + "evidence": [ + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-manual-review/01-toilet-speed-1-refill0.png", + "sha256": "bf3da81ef8ee7767c217e5220faf2f8080ea7daa614c9115d7a31413f16ad72a" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-manual-review/01-toilet-speed-1-refill2.png", + "sha256": "dfff4833051854c271fe9ea00cfe855248e5191e3e66f433bbec4ef82d64a8d2" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-manual-review/request-01-toilet-speed-1.log", + "sha256": "6c31d5d9172b654ccc89de53971d1e1c34b4e42a099f9058f0a3e0083c4b200f" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-manual-review/request-01-toilet-speed-1.actions.json", + "sha256": "6a29135f61e8d327a76ff71d638c78e1e8d9eed87f562a55c51680e958767a72" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-manual-review/01-toilet-speed-4-refill0.png", + "sha256": "91a613d0e51b663a66a4d63cd2e07e04099becaef201a9b944b2d84d78d5bd13" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-manual-review/01-toilet-speed-4-refill2.png", + "sha256": "91057516fcb0f63f548f61eb60e0a3515efc17b0a7bec3e316ece402c3896b19" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-manual-review/request-01-toilet-speed-4.log", + "sha256": "501720645d11d7530e51fb0bbf53b28d082e2937edafb29fa47cb68870bb4e23" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-manual-review/request-01-toilet-speed-4.actions.json", + "sha256": "64a4511b075d06eac52cb172cd099804c2560c835c975c79449bda9f814dbea3" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-manual-review/01-toilet-speed-10-refill0.png", + "sha256": "95344607ab912c2d71f26678ad71d42009060ff57ccc41dbe31f7cd425c597b0" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-manual-review/01-toilet-speed-10-refill2.png", + "sha256": "2e0fda6e3f3060a50ad36b2e5cd8158308b4f2804cbf230c6280a30e115f2450" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-manual-review/request-01-toilet-speed-10.log", + "sha256": "747a570ab3a91ed13132a81d96eb2e0cf3c51bf06b86c11b2a25630235ba8a76" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-manual-review/request-01-toilet-speed-10.actions.json", + "sha256": "712b08ed185e348545f5da34487419d3237545abbe58599f41632a04639c5e14" + } + ], + "reviewedAt": "2026-10-20T06:14:22.055153+00:00" + }, + { + "revision": "baseline", + "provider": "claude-code", + "prompt": "toilet", + "width": 710, + "index": 1, + "label": "Water line", + "verdict": "live", + "reason": "Real low/high range drag raises the mechanism water line and tank water, changing Full 12.9 L to Refilling 13.4 L; visible output is independent of native thumb/value.", + "sourceReplaySha256": "3bd0928f6c28bfad5871de9655f846548019ade004b86ec53d06fb0250891a32", + "evidence": [ + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-manual-review/03-toilet-line-before2.png", + "sha256": "81b3e2fa619105d893b1796dc2366be60fa8a48c92a5ce5db279c72b56609e35" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-manual-review/03-toilet-line-after0.png", + "sha256": "4589ceceb5e40cd356541e5ddc07483d38939a817066fbc22bffcc9e62661e15" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-manual-review/request-03-toilet-line.log", + "sha256": "d20834d3d5cd1b9cefbd800fb9be9ca771c33f6f648d518837ebe4a7ca5c2938" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-manual-review/request-03-toilet-line.actions.json", + "sha256": "f10b2bab8fa1597304ec99b025c1517a02f1b53ed871b7015e64712eb0befac6" + } + ], + "reviewedAt": "2026-10-20T06:14:22.058423+00:00" + }, + { + "revision": "baseline", + "provider": "claude-code", + "prompt": "toilet", + "width": 710, + "index": 2, + "label": "Supply flow", + "verdict": "live", + "reason": "During actual refill, low/high supply drag changes external inlet flow from 3.4 to 12.8 L/min. The prior full-tank state could not expose this effect.", + "sourceReplaySha256": "3bd0928f6c28bfad5871de9655f846548019ade004b86ec53d06fb0250891a32", + "evidence": [ + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-manual-review/02-toilet-supply-before2.png", + "sha256": "8f8ca754dc658324b5fa4f9518a04fcaf73a47994696e37c371a9d03b0f146db" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-manual-review/02-toilet-supply-after0.png", + "sha256": "a3a046a36a04f4b46b491fc9f4fb6365aa638d89753d16c3a89abdf5ec271f5e" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-manual-review/request-02-toilet-supply.log", + "sha256": "213e0f0e6fe624fdf6157865baae6a0b225dc6973b0e76721c38ef01794a9627" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-manual-review/request-02-toilet-supply.actions.json", + "sha256": "dcd7bc080668b259d12fd3f238648dfe16598e8d208471225d3da89bacd9751a" + } + ], + "reviewedAt": "2026-10-20T06:14:22.061580+00:00" + }, + { + "revision": "baseline", + "provider": "claude-code", + "prompt": "websocket", + "width": 710, + "index": 3, + "label": "Network latency, one way", + "verdict": "live", + "reason": "After actual supported key-1 message sends and enough delivery time, low/high latency drag changes external delivery time from 42 to 404 ms. This resolves the inactive-message precondition.", + "sourceReplaySha256": "d9c5bc363e800a411c8966b155db934d24ad51ec27521ece1b81e5f186971719", + "evidence": [ + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-manual-review/04-websocket-latency-before2.png", + "sha256": "47d94a33c79dcf8118b08ed64ef7414d68e16b4a369dc4a1dc34f82498e20f8f" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-manual-review/04-websocket-latency-after0.png", + "sha256": "3f1bcd4e9fde0d924290d8ad8407b0fe6a5a75dc3e1fc96f036a665dbcf6698b" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-manual-review/request-04-websocket-latency.log", + "sha256": "e3eed2e6e97972708f24cd5cbedb3e446b9ad90d5cc41f0978b12701bed8ad80" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-manual-review/request-04-websocket-latency.actions.json", + "sha256": "b35bda5b404f1fd2f35c7e4288140c1d694c042983c48c244ea20447155ba10b" + } + ], + "reviewedAt": "2026-10-20T06:14:22.064684+00:00" + }, + { + "revision": "baseline", + "provider": "claude-code", + "prompt": "load-balancer", + "width": 710, + "index": 6, + "label": "None", + "verdict": "live", + "reason": "Equal eight-second observation after reset at the same traffic/algorithm: changing slow-server selection moves the visible 4\u20135-request backlog to the selected server; None removes it. Before/after mechanism geometry and queue readouts agree, beyond selection styling.", + "sourceReplaySha256": "a3eb72fe847999ed55d11616826a96a8c27134811e0bf9bd1fda02d25300302f", + "evidence": [ + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-manual-review/08-load-slow-none-before2.png", + "sha256": "196b7304f9a3d4a5c8e12b35e78a82367e191442ba0aac79f45b5c3bb50087db" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-manual-review/08-load-slow-none-after0.png", + "sha256": "b28008f605193dfcb363834973a5e8c2f1bf0a937f9d9927e548b9d6e9cc8bbc" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-manual-review/request-08-load-slow-none.log", + "sha256": "c8c8027cb11bcd9dc611507ce7d3398b0499561ed8c66591ccbaec9d1420874f" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-manual-review/request-08-load-slow-none.actions.json", + "sha256": "98f74987f310a8708f73d414a73acb0148b697401aebf42b9b3d4e3652bdae23" + } + ], + "reviewedAt": "2026-10-20T06:14:22.081026+00:00" + }, + { + "revision": "baseline", + "provider": "claude-code", + "prompt": "load-balancer", + "width": 710, + "index": 7, + "label": "1", + "verdict": "live", + "reason": "Equal eight-second observation after reset at the same traffic/algorithm: changing slow-server selection moves the visible 4\u20135-request backlog to the selected server; None removes it. Before/after mechanism geometry and queue readouts agree, beyond selection styling.", + "sourceReplaySha256": "a3eb72fe847999ed55d11616826a96a8c27134811e0bf9bd1fda02d25300302f", + "evidence": [ + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-manual-review/08-load-slow-1-before2.png", + "sha256": "701b41d6932d094bc063dbde4cbe0a7d2834803cf8607bd382a6b1578e2e141d" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-manual-review/08-load-slow-1-after0.png", + "sha256": "1888344783d2cf462cf5afe386b00468ce146112a797d693c33bb6a1ea7e78f9" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-manual-review/request-08-load-slow-1.log", + "sha256": "b5c7d2a3fc9d4564adddbf92255aef365e9ec5c51abbcf59d78eff5de9abba7e" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-manual-review/request-08-load-slow-1.actions.json", + "sha256": "df1904fa6a5f343c09399286289d9e9d81d215d5a1c8c025f17e81c22ae0b482" + } + ], + "reviewedAt": "2026-10-20T06:14:22.095442+00:00" + }, + { + "revision": "baseline", + "provider": "claude-code", + "prompt": "load-balancer", + "width": 710, + "index": 8, + "label": "2", + "verdict": "live", + "reason": "Equal eight-second observation after reset at the same traffic/algorithm: changing slow-server selection moves the visible 4\u20135-request backlog to the selected server; None removes it. Before/after mechanism geometry and queue readouts agree, beyond selection styling.", + "sourceReplaySha256": "a3eb72fe847999ed55d11616826a96a8c27134811e0bf9bd1fda02d25300302f", + "evidence": [ + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-manual-review/08-load-slow-2-before2.png", + "sha256": "196b7304f9a3d4a5c8e12b35e78a82367e191442ba0aac79f45b5c3bb50087db" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-manual-review/08-load-slow-2-after0.png", + "sha256": "eb1315b866fd2e5c507918002b048f9910394e367b98caed074808a52f723524" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-manual-review/request-08-load-slow-2.log", + "sha256": "ea5031a69711b2d28a5b35102b9efdcc1793c73e903426ea3495c6c6ca0347c1" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-manual-review/request-08-load-slow-2.actions.json", + "sha256": "7a2a6f9c8470a65c19a7422db9f10905bd5a0702e66e604bd538654761cb7121" + } + ], + "reviewedAt": "2026-10-20T06:14:22.108878+00:00" + }, + { + "revision": "baseline", + "provider": "claude-code", + "prompt": "load-balancer", + "width": 710, + "index": 9, + "label": "3", + "verdict": "live", + "reason": "Equal eight-second observation after reset at the same traffic/algorithm: changing slow-server selection moves the visible 4\u20135-request backlog to the selected server; None removes it. Before/after mechanism geometry and queue readouts agree, beyond selection styling.", + "sourceReplaySha256": "a3eb72fe847999ed55d11616826a96a8c27134811e0bf9bd1fda02d25300302f", + "evidence": [ + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-manual-review/08-load-slow-3-before2.png", + "sha256": "196b7304f9a3d4a5c8e12b35e78a82367e191442ba0aac79f45b5c3bb50087db" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-manual-review/08-load-slow-3-after0.png", + "sha256": "a724392f3ca7cd430ee816a583a4ccd01375554444476fd8f55dfc64508876ba" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-manual-review/request-08-load-slow-3.log", + "sha256": "a18360a52e1be3ae784d56a4c87b6f454ee056095af8d84075de6b6427306d94" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-manual-review/request-08-load-slow-3.actions.json", + "sha256": "f85ed1037b5e4b5c0a75ff668a3fb9ef70c957b9486b149ed1e9711e0fd7e0db" + } + ], + "reviewedAt": "2026-10-20T06:14:22.122423+00:00" + }, + { + "revision": "baseline", + "provider": "claude-code", + "prompt": "load-balancer", + "width": 710, + "index": 10, + "label": "4", + "verdict": "live", + "reason": "Equal eight-second observation after reset at the same traffic/algorithm: changing slow-server selection moves the visible 4\u20135-request backlog to the selected server; None removes it. Before/after mechanism geometry and queue readouts agree, beyond selection styling.", + "sourceReplaySha256": "a3eb72fe847999ed55d11616826a96a8c27134811e0bf9bd1fda02d25300302f", + "evidence": [ + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-manual-review/08-load-slow-4-before2.png", + "sha256": "196b7304f9a3d4a5c8e12b35e78a82367e191442ba0aac79f45b5c3bb50087db" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-manual-review/08-load-slow-4-after0.png", + "sha256": "e4c24e54af81ae9e087ad4c3ca11fdc416293cc7b73e2a140d1872941b30c8b4" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-manual-review/request-08-load-slow-4.log", + "sha256": "adf5d64a2cb6ece4725ea0df7e7b15555aaf1d5a2eb2d48a7dd2482b8ae67d1b" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-manual-review/request-08-load-slow-4.actions.json", + "sha256": "1329b15f5d8c6855fa7d77de0f69fcf0fe34e3cdb4e89b7c42b48236fa51df35" + } + ], + "reviewedAt": "2026-10-20T06:14:22.136112+00:00" + }, + { + "revision": "baseline", + "provider": "claude-code", + "prompt": "load-balancer", + "width": 710, + "index": 12, + "label": "1", + "verdict": "live", + "reason": "Actual click marks server 1 unavailable: its mechanism output changes and external queue position becomes \u00d7 while routing continues to other servers.", + "sourceReplaySha256": "a3eb72fe847999ed55d11616826a96a8c27134811e0bf9bd1fda02d25300302f", + "evidence": [ + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-manual-review/09-load-health-1-before2.png", + "sha256": "85bb58df31e1c5e6c374aa88c07bc4a279e80bb2cbd618e428a9aac53fa06a66" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-manual-review/09-load-health-1-after0.png", + "sha256": "1f37373886361f3f73d9d03a492abca1e6a380827c317ddf4c76b169250e12c3" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-manual-review/request-09-load-health.log", + "sha256": "f09977edd2baa2cced30e7f817e17237c731e3ce8a967b8d62972de6ab8e27fa" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-manual-review/request-09-load-health.actions.json", + "sha256": "830c6fd5eecbde67e1b3f0935e0d4485617cf730e06ead53862d77a1bb1ed804" + } + ], + "reviewedAt": "2026-10-20T06:14:22.149188+00:00" + }, + { + "revision": "baseline", + "provider": "claude-code", + "prompt": "load-balancer", + "width": 710, + "index": 13, + "label": "2", + "verdict": "live", + "reason": "Actual click marks server 2 unavailable: its mechanism output changes and external queue position becomes \u00d7 while routing continues to other servers.", + "sourceReplaySha256": "a3eb72fe847999ed55d11616826a96a8c27134811e0bf9bd1fda02d25300302f", + "evidence": [ + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-manual-review/09-load-health-2-before2.png", + "sha256": "4ae1e0a91d960ade0ea82ac67a409ab5b49163a8bb2100203aebf7eb3f673daa" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-manual-review/09-load-health-2-after0.png", + "sha256": "263d2d570d994f2376b3325effb06473f4ae371bb9d2ff448437a328945dd862" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-manual-review/request-09-load-health.log", + "sha256": "f09977edd2baa2cced30e7f817e17237c731e3ce8a967b8d62972de6ab8e27fa" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-manual-review/request-09-load-health.actions.json", + "sha256": "830c6fd5eecbde67e1b3f0935e0d4485617cf730e06ead53862d77a1bb1ed804" + } + ], + "reviewedAt": "2026-10-20T06:14:22.162586+00:00" + }, + { + "revision": "baseline", + "provider": "claude-code", + "prompt": "load-balancer", + "width": 710, + "index": 15, + "label": "4", + "verdict": "live", + "reason": "Actual click marks server 4 unavailable: its mechanism output changes and external queue position becomes \u00d7 while routing continues to other servers.", + "sourceReplaySha256": "a3eb72fe847999ed55d11616826a96a8c27134811e0bf9bd1fda02d25300302f", + "evidence": [ + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-manual-review/09-load-health-4-before2.png", + "sha256": "4ae1e0a91d960ade0ea82ac67a409ab5b49163a8bb2100203aebf7eb3f673daa" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-manual-review/09-load-health-4-after0.png", + "sha256": "950239cb1f9ea4af48b80d6212805549a0825aa8cf7c9c60b9f1fb63120daa5d" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-manual-review/request-09-load-health.log", + "sha256": "f09977edd2baa2cced30e7f817e17237c731e3ce8a967b8d62972de6ab8e27fa" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-manual-review/request-09-load-health.actions.json", + "sha256": "830c6fd5eecbde67e1b3f0935e0d4485617cf730e06ead53862d77a1bb1ed804" + } + ], + "reviewedAt": "2026-10-20T06:14:22.176350+00:00" + }, + { + "revision": "baseline", + "provider": "claude-code", + "prompt": "websocket", + "width": 710, + "index": 0, + "label": "Chat delivery time in milliseconds. Keys 1, 2 and 3 send from the left, front and right desks; M switches between WebSocket and polling; arrow keys change latency and the poll interval", + "verdict": "live", + "reason": "Supported key-1 input changes a settled open connection to a delivered message (121 ms), with visible desk/message geometry and readout change. This replaces ambiguous earlier click/settling evidence.", + "sourceReplaySha256": "d9c5bc363e800a411c8966b155db934d24ad51ec27521ece1b81e5f186971719", + "evidence": [ + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-manual-review/10-websocket-stage-before2.png", + "sha256": "e26c95447fbccc39a2fcca48290caadb14607f1ebf27bea3b0009487ba45dd2e" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-manual-review/10-websocket-stage-after0.png", + "sha256": "e85ad2b23a95ce632e9c3b547d824bd8e72bdf2c3321af080ac035ddab658abb" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-manual-review/request-10-websocket-stage.log", + "sha256": "51d7268d673478bb9b8a3b8951625e853dd5e868d6a2f18cfac727cd1970294a" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-manual-review/request-10-websocket-stage.actions.json", + "sha256": "bcd4ed61af1c37de38651a62384ddfa537673380857d6928ab64fab108ed49bb" + } + ], + "reviewedAt": "2026-10-20T06:14:55.020956+00:00" + }, + { + "revision": "baseline", + "provider": "claude-code", + "prompt": "load-balancer", + "width": 710, + "index": 4, + "label": "Fewer requests", + "verdict": "live", + "reason": "Repeated actual Fewer requests clicks lower traffic to 0.5 req/s; after a fixed 12-second observation the former 8/8/7/8 backlog has drained to empty. Both the independent mechanism and queue readout change, beyond the rate label.", + "sourceReplaySha256": "a3eb72fe847999ed55d11616826a96a8c27134811e0bf9bd1fda02d25300302f", + "evidence": [ + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-manual-review/11-load-rate-output-after0.png", + "sha256": "f6ec600f458800dc588a2fa767790bbd62a255e3a4cf5cb39e28a6fdb769765b" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-manual-review/11-load-rate-output-fewer0.png", + "sha256": "f37f2e45a2d58451b84e37ca75e25a2727f28b94e0935d142d9bf95dc79447a4" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-manual-review/request-11-load-rate-output.log", + "sha256": "dcdd2706132a5bbd770e28aae21d6f77ca4a1da5d2f291d6dd586d721faf6d1d" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-manual-review/request-11-load-rate-output.actions.json", + "sha256": "50d6722e779604f980c15402c0e221b5d42a1b40593ed174e02b0a243c032dc3" + } + ], + "reviewedAt": "2026-10-20T06:14:55.043482+00:00" + }, + { + "revision": "baseline", + "provider": "claude-code", + "prompt": "load-balancer", + "width": 710, + "index": 5, + "label": "More requests", + "verdict": "live", + "reason": "Repeated actual More requests clicks raise traffic from 0.5 to 5.5 req/s; at the same 12-second observation the visible queues grow from 0/1/0/0 to 8/8/7/8 with dropped requests. This proves traffic generation beyond the rate label.", + "sourceReplaySha256": "a3eb72fe847999ed55d11616826a96a8c27134811e0bf9bd1fda02d25300302f", + "evidence": [ + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-manual-review/11-load-rate-output-before2.png", + "sha256": "a739e1331886d9e0f94f519812c23b88c18a8c5fa059000957930a22fc8ff4b8" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-manual-review/11-load-rate-output-after0.png", + "sha256": "f6ec600f458800dc588a2fa767790bbd62a255e3a4cf5cb39e28a6fdb769765b" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-manual-review/request-11-load-rate-output.log", + "sha256": "dcdd2706132a5bbd770e28aae21d6f77ca4a1da5d2f291d6dd586d721faf6d1d" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-manual-review/request-11-load-rate-output.actions.json", + "sha256": "50d6722e779604f980c15402c0e221b5d42a1b40593ed174e02b0a243c032dc3" + } + ], + "reviewedAt": "2026-10-20T06:14:55.061994+00:00" + }, + { + "revision": "prototype", + "provider": "claude-code", + "prompt": "washing-machine", + "width": 710, + "index": 0, + "label": "Washing machine drum speed: arrow keys change rpm", + "verdict": "live", + "reason": "Supported Home key changes speed 50\u21920, device display/readout and drum behavior; the visible response is more than focus styling.", + "sourceReplaySha256": "2e3582435bcd1633b01cb22b933f8d886d2052e261307a106b069b2041c79ecc", + "evidence": [ + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/claude-code/washing-machine/width-710/control-0-key-Home-before2.png", + "sha256": "1cb8406d32fc35ae30c340058492e9bf7510b5df9fa3a61fd91fc8ce9b130919" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/claude-code/washing-machine/width-710/control-0-key-Home-after0.png", + "sha256": "a1b4b8aab00feb9cac333929e5338e97658897ca1366a24febaa12c41ded0d50" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/manual-plan-sources/prototype-claude-code-washing-machine.html", + "sha256": "2590b48c45e5a511d00af1d8f218ceabfaab95a5c7813351e824261e8998639a" + } + ], + "reviewedAt": "2026-10-20T06:21:47.681624+00:00" + }, + { + "revision": "prototype", + "provider": "claude-code", + "prompt": "washing-machine", + "width": 710, + "index": 1, + "label": "rpm", + "verdict": "live", + "reason": "Range drag changes 265\u21921205 rpm and independent device display, knob and calculated acceleration 20g\u2192406g.", + "sourceReplaySha256": "2e3582435bcd1633b01cb22b933f8d886d2052e261307a106b069b2041c79ecc", + "evidence": [ + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/claude-code/washing-machine/width-710/control-1-drag-before2.png", + "sha256": "1f65bb872c3acdcd3b17a8d9f9c3f9e778427f2236bc71f58eaa3da0b6670269" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/claude-code/washing-machine/width-710/control-1-drag-after0.png", + "sha256": "6ec7b48ecc2192d2187923843cf9ba0909e792abfd226d0ae0366ada0c8d5006" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/manual-plan-sources/prototype-claude-code-washing-machine.html", + "sha256": "2590b48c45e5a511d00af1d8f218ceabfaab95a5c7813351e824261e8998639a" + } + ], + "reviewedAt": "2026-10-20T06:21:47.689339+00:00" + }, + { + "revision": "prototype", + "provider": "claude-code", + "prompt": "washing-machine", + "width": 710, + "index": 2, + "label": "water", + "verdict": "live", + "reason": "Water range drag changes the independently drawn water annulus from a thin 11% ring to a thick 52% ring. Source waterPath uses fill to calculate inner radius; unchanged speed/readout does not invalidate visible mechanism geometry.", + "sourceReplaySha256": "2e3582435bcd1633b01cb22b933f8d886d2052e261307a106b069b2041c79ecc", + "evidence": [ + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/claude-code/washing-machine/width-710/control-2-drag-before2.png", + "sha256": "c834b24388bc95709ef7424356e8bf538f9bccd4ec7dd3c6f28fb3b90f40aca9" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/claude-code/washing-machine/width-710/control-2-drag-after0.png", + "sha256": "d59d5597a44e6060dd31c3f60f99baeb98cc043faca0759be4acb4edcf7404e2" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/manual-plan-sources/prototype-claude-code-washing-machine.html", + "sha256": "2590b48c45e5a511d00af1d8f218ceabfaab95a5c7813351e824261e8998639a" + } + ], + "reviewedAt": "2026-10-20T06:21:47.695480+00:00" + }, + { + "revision": "prototype", + "provider": "claude-code", + "prompt": "washing-machine", + "width": 710, + "index": 3, + "label": "Wash \u00b7 50 rpm", + "verdict": "live", + "reason": "Wash button changes 60\u219250 rpm, pinned annulus to a water pool and readout from pinned to lifting/falling clothes.", + "sourceReplaySha256": "2e3582435bcd1633b01cb22b933f8d886d2052e261307a106b069b2041c79ecc", + "evidence": [ + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/claude-code/washing-machine/width-710/control-3-primary-before2.png", + "sha256": "071e89815dca089f8f21141139102df7ae1f9f0422ee3ee229c6941531c6108b" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/claude-code/washing-machine/width-710/control-3-primary-after0.png", + "sha256": "c25901f46767133cf3784143d1e3d7604d2be914c25459fea8b9da1892694627" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/manual-plan-sources/prototype-claude-code-washing-machine.html", + "sha256": "2590b48c45e5a511d00af1d8f218ceabfaab95a5c7813351e824261e8998639a" + } + ], + "reviewedAt": "2026-10-20T06:21:47.701405+00:00" + }, + { + "revision": "prototype", + "provider": "claude-code", + "prompt": "washing-machine", + "width": 710, + "index": 4, + "label": "Tipping point \u00b7 60 rpm", + "verdict": "live", + "reason": "Tipping point changes 50\u219260 rpm and water/clothing regime from tumbling pool to annulus, with external acceleration/state readout.", + "sourceReplaySha256": "2e3582435bcd1633b01cb22b933f8d886d2052e261307a106b069b2041c79ecc", + "evidence": [ + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/claude-code/washing-machine/width-710/control-4-primary-before2.png", + "sha256": "cc7bae0132861ed0232f839963130dcee3236b8a3a8feffd6fe86f08d83cd8ba" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/claude-code/washing-machine/width-710/control-4-primary-after0.png", + "sha256": "ce96549129f85817acbfa4b09edd6e999a160f5c296f5bdb6d95c80254c9fef4" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/manual-plan-sources/prototype-claude-code-washing-machine.html", + "sha256": "2590b48c45e5a511d00af1d8f218ceabfaab95a5c7813351e824261e8998639a" + } + ], + "reviewedAt": "2026-10-20T06:21:47.707304+00:00" + }, + { + "revision": "prototype", + "provider": "claude-code", + "prompt": "washing-machine", + "width": 710, + "index": 5, + "label": "Drain", + "verdict": "live", + "reason": "Drain removes the blue water and stops the drum; independent device display/readout confirm 0 rpm.", + "sourceReplaySha256": "2e3582435bcd1633b01cb22b933f8d886d2052e261307a106b069b2041c79ecc", + "evidence": [ + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/claude-code/washing-machine/width-710/control-5-primary-before2.png", + "sha256": "34520efc07a5c3df2e391d48805ab6ad5e8c30cdf633f67ce138ffc9312df387" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/claude-code/washing-machine/width-710/control-5-primary-after0.png", + "sha256": "af3ef2bd945fb498ba3d6cec539e913ff9812f702a0d20854fbad50e7039e044" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/manual-plan-sources/prototype-claude-code-washing-machine.html", + "sha256": "2590b48c45e5a511d00af1d8f218ceabfaab95a5c7813351e824261e8998639a" + } + ], + "reviewedAt": "2026-10-20T06:21:47.713180+00:00" + }, + { + "revision": "prototype", + "provider": "claude-code", + "prompt": "bicycle-pump", + "width": 710, + "index": 0, + "label": "Pump handle: drag down or use arrow keys; space pumps one stroke", + "verdict": "live", + "reason": "The inspected supported pointer input lowers the piston and changes external barrel pressure 0\u219235 psi, tire 32.8\u219235.0 psi and needle/valve geometry. Source pointer handler steers the simulation.", + "sourceReplaySha256": "4bf5d103485aad335f57a724ba6a2d07d75d0bae62a65128c7621c929f8010b1", + "evidence": [ + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/claude-code/bicycle-pump/width-710/control-0-click-before2.png", + "sha256": "02a626975572a98cc9c2d713149161019a81241ae0117a61e2d9406794ce4631" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/claude-code/bicycle-pump/width-710/control-0-click-after0.png", + "sha256": "3be836ee1b888f73be7706c7bf15cee81039982fe540eb6d682d34314dafe38d" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/manual-plan-sources/prototype-claude-code-bicycle-pump.html", + "sha256": "4d32fe5014ff024f6ea0346cb5818359cb939d3d2c62b19e48a7599464e145d4" + } + ], + "reviewedAt": "2026-10-20T06:21:47.716719+00:00" + }, + { + "revision": "prototype", + "provider": "claude-code", + "prompt": "bicycle-pump", + "width": 710, + "index": 2, + "label": "Start flat (0 psi)", + "verdict": "live", + "reason": "Start flat resets the external tire pressure 5.9\u21920.0 psi, valve-opening threshold 31%\u21920%, and raises the piston. This matches the saved reset(0) handler, beyond button styling.", + "sourceReplaySha256": "4bf5d103485aad335f57a724ba6a2d07d75d0bae62a65128c7621c929f8010b1", + "evidence": [ + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/claude-code/bicycle-pump/width-710/control-2-primary-before2.png", + "sha256": "c3eb51dda6b511fa431ea7036a848d7c1fa48e8dc92e29ce0de19169d69626ee" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/claude-code/bicycle-pump/width-710/control-2-primary-after0.png", + "sha256": "9c93f7dbde46ba8068131d8e50e32c5c69a7d5a8d207a75a76dcffa94cce9013" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/manual-plan-sources/prototype-claude-code-bicycle-pump.html", + "sha256": "4d32fe5014ff024f6ea0346cb5818359cb939d3d2c62b19e48a7599464e145d4" + } + ], + "reviewedAt": "2026-10-20T06:21:47.720042+00:00" + }, + { + "revision": "prototype", + "provider": "claude-code", + "prompt": "bicycle-pump", + "width": 710, + "index": 3, + "label": "Start hard (90 psi)", + "verdict": "live", + "reason": "Start hard resets external tire pressure 3.1\u219290.0 psi and valve-opening threshold 19%\u219291%, matching reset(90).", + "sourceReplaySha256": "4bf5d103485aad335f57a724ba6a2d07d75d0bae62a65128c7621c929f8010b1", + "evidence": [ + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/claude-code/bicycle-pump/width-710/control-3-primary-before2.png", + "sha256": "e48229279c2b0290a2ad9e2e3068d63529edf8a66caae18374b26c605a1ab034" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/claude-code/bicycle-pump/width-710/control-3-primary-after0.png", + "sha256": "f7507decb85b7bee636e8cbef9a87566e6ce69be427dec11025bf00a92e81e1d" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/manual-plan-sources/prototype-claude-code-bicycle-pump.html", + "sha256": "4d32fe5014ff024f6ea0346cb5818359cb939d3d2c62b19e48a7599464e145d4" + } + ], + "reviewedAt": "2026-10-20T06:21:47.723399+00:00" + }, + { + "revision": "prototype", + "provider": "claude-code", + "prompt": "thermos", + "width": 710, + "index": 0, + "label": "Vacuum between the walls", + "verdict": "live", + "reason": "Vacuum toggle removes the conduction arrows, changes air gap to vacuum gap and independently changes temperature/heat-loss readouts (20.0\u219222.5 C).", + "sourceReplaySha256": "52983b0d8eded3271ce0f2b2ef336dc96d196b9b4d435b349bf150b1d3cef62a", + "evidence": [ + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/claude-code/thermos/width-710/control-0-drag-before2.png", + "sha256": "b42dde34e8ff55b60e384375ebd626f202d426d0bc3d8bc6a48f29ddea6ca7cc" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/claude-code/thermos/width-710/control-0-drag-after0.png", + "sha256": "0da1ca90b5f5b920901d2d71c16cefebcd343ba7e247774a8d45fd0cc535c84c" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/manual-plan-sources/prototype-claude-code-thermos.html", + "sha256": "560795a379ead31850fa3188bacd1f1644cf6bdbdcea1f01d384207b593c9c05" + } + ], + "reviewedAt": "2026-10-20T06:25:12.242231+00:00" + }, + { + "revision": "prototype", + "provider": "claude-code", + "prompt": "thermos", + "width": 710, + "index": 2, + "label": "Stopper in", + "verdict": "live", + "reason": "Stopper toggle visibly inserts the stopper, changes the heat-loss route and changes the independent biggest-leak readout from open top to air in the gap.", + "sourceReplaySha256": "52983b0d8eded3271ce0f2b2ef336dc96d196b9b4d435b349bf150b1d3cef62a", + "evidence": [ + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/claude-code/thermos/width-710/control-2-click-before2.png", + "sha256": "8db743da08d5f646b90ce2f204aecbfab4b04247ef0daa21dd11545cc25950a9" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/claude-code/thermos/width-710/control-2-click-after0.png", + "sha256": "fd40396e78915cdaabad1352e9c6082c3f7ad0c557e75b2026ec984f45b28315" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/manual-plan-sources/prototype-claude-code-thermos.html", + "sha256": "560795a379ead31850fa3188bacd1f1644cf6bdbdcea1f01d384207b593c9c05" + } + ], + "reviewedAt": "2026-10-20T06:25:12.252888+00:00" + }, + { + "revision": "prototype", + "provider": "claude-code", + "prompt": "refrigerator", + "width": 710, + "index": 0, + "label": "room", + "verdict": "live", + "reason": "Room range drag changes independent condenser temperature/pressure (about 26 C / 3.6 bar\u219247 C / 6.5 bar) and calculated compressor duty (16%\u219250%). Source binds room directly to these outputs; this is not autonomous temperature drift.", + "sourceReplaySha256": "83243205ff69639e906bf8017d6142518d8043ad1ea8f7aa3d117cc3f45d367a", + "evidence": [ + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/claude-code/refrigerator/width-710/control-0-drag-before2.png", + "sha256": "3eadf2dfe713853f25867a04b9b51366e87997e1925a21b4016fe6f22c00ec31" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/claude-code/refrigerator/width-710/control-0-drag-after0.png", + "sha256": "c83fe150254377d62fa76178c3ac7f32ff7ea8fc1e026346e4ca7e310e331a6c" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/manual-plan-sources/prototype-claude-code-refrigerator.html", + "sha256": "34ec4075720e898dd7a388e55255d66079ad4b513c311ee0152913af93c30ac3" + } + ], + "reviewedAt": "2026-10-20T06:26:55.131598+00:00" + }, + { + "revision": "prototype", + "provider": "claude-code", + "prompt": "refrigerator", + "width": 710, + "index": 1, + "label": "set", + "verdict": "live", + "reason": "Thermostat drag changes independent target-dependent evaporator temperature, duty (53%\u219244%) and steady interior temperature 2.5\u21927.3 C. No runtime error occurs in the prototype.", + "sourceReplaySha256": "83243205ff69639e906bf8017d6142518d8043ad1ea8f7aa3d117cc3f45d367a", + "evidence": [ + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/claude-code/refrigerator/width-710/control-1-drag-before2.png", + "sha256": "c21275b6af9c33f4283fc0fe5e4f74c4c64f3388aac24e40f858a39145f21492" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/claude-code/refrigerator/width-710/control-1-drag-after0.png", + "sha256": "d019b66c005c784c49745513b5aad41180753fcce86f2eacec19e4d43329a3fe" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/manual-plan-sources/prototype-claude-code-refrigerator.html", + "sha256": "34ec4075720e898dd7a388e55255d66079ad4b513c311ee0152913af93c30ac3" + } + ], + "reviewedAt": "2026-10-20T06:26:55.134029+00:00" + }, + { + "revision": "prototype", + "provider": "claude-code", + "prompt": "refrigerator", + "width": 710, + "index": 2, + "label": "door", + "verdict": "live", + "reason": "Door checkbox visibly opens the drawn door and changes predicted duty to 100% cannot keep up, with interior 8.1\u219230.8 C. Source raises heat-leak coefficient for open door; the effect is independent of native checkbox styling.", + "sourceReplaySha256": "83243205ff69639e906bf8017d6142518d8043ad1ea8f7aa3d117cc3f45d367a", + "evidence": [ + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/claude-code/refrigerator/width-710/control-2-primary-before2.png", + "sha256": "fa03ee056201c1eba20051dcbb404283698e4dcca2625b5a0e6d16a366f4e6c4" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/claude-code/refrigerator/width-710/control-2-primary-after0.png", + "sha256": "a08d9e258316faca5eaf75adf75d64b31b35df5af503ee16ae9313e9e87b2484" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/manual-plan-sources/prototype-claude-code-refrigerator.html", + "sha256": "34ec4075720e898dd7a388e55255d66079ad4b513c311ee0152913af93c30ac3" + } + ], + "reviewedAt": "2026-10-20T06:26:55.137577+00:00" + }, + { + "revision": "prototype", + "provider": "claude-code", + "prompt": "door-lock", + "width": 710, + "index": 0, + "label": "Pin tumbler lock: left and right arrows slide the key, Enter turns it", + "verdict": "live", + "reason": "Supported Home key withdraws the key, visibly drops the pins and changes all-five-gaps aligned to five pins blocking the shear line. Focus outline alone is not the proof.", + "sourceReplaySha256": "9dfa02ab67a20e6b89d73fde2a43afb7f3d4a273262d21a2883256d45ad8af42", + "evidence": [ + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/claude-code/door-lock/width-710/control-0-key-Home-before2.png", + "sha256": "5d9125d2e9f855322ce1745144e5dfdd8ec5c5b915e6789c9f09558ad1d4a725" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/claude-code/door-lock/width-710/control-0-key-Home-after0.png", + "sha256": "f10498d0fa375206cc5a6a6d6eb667ea8fc60f627dee8effb872e814f24307c9" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/manual-plan-sources/prototype-claude-code-door-lock.html", + "sha256": "dd9b8c870c2d1f9405099cbeaaba891741fe2771632fcf1df59faa75dd2d53f1" + } + ], + "reviewedAt": "2026-10-20T06:26:55.148958+00:00" + }, + { + "revision": "prototype", + "provider": "claude-code", + "prompt": "stapler", + "width": 710, + "index": 0, + "label": "Stapler: arrow keys press and release the arm", + "verdict": "live", + "reason": "Supported End key fully depresses the arm, changes the paper/staple mechanism and advances the external readout to folded staple legs. Reduced motion disables the idle tour, so this is a direct key-caused transition.", + "sourceReplaySha256": "45d9193eb4e08831d9778979e4ffe0bc2201e1b1df695b7f30659e0c23b64b8f", + "evidence": [ + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/claude-code/stapler/width-710/control-0-key-End-before2.png", + "sha256": "9149711c4ea1c512e3b0f89599e82cd691f22308de4370dcdcbb5777754d0503" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/claude-code/stapler/width-710/control-0-key-End-after0.png", + "sha256": "d20e50bfc12484ef738e2f5c81f96e1828064d9140715844a86e06bc4077f801" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/manual-plan-sources/prototype-claude-code-stapler.html", + "sha256": "c7e0b82587b40fcd98a9f9207cf01ae60b49ba1e1d55f5e34a3dc7ef9e2e49b7" + } + ], + "reviewedAt": "2026-10-20T06:27:19.879204+00:00" + }, + { + "revision": "prototype", + "provider": "claude-code", + "prompt": "cdn", + "width": 710, + "index": 1, + "label": "Purge on deploy", + "verdict": "live", + "reason": "Purge on deploy changes independent explanatory output from 9 min 30 s edge expiry to 5 s purge arrival and 1 min 54 s browser freshness; the retained screenshots show the correct mode effect.", + "sourceReplaySha256": "37ee2386d7df71e62638634c3a925ec4b64b8491ee4bcfcc5ec74e66de8065a3", + "evidence": [ + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/claude-code/cdn/width-710/control-1-primary-before2.png", + "sha256": "c6f6ccd8764870c3130fa47eb7502166c5333aee86898a662f3d1442109a28bc" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/claude-code/cdn/width-710/control-1-primary-after0.png", + "sha256": "92ff6f439d02726d01d7122a78d048e6289abb8d525db557c3bd9e4c5a3b318d" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/manual-plan-sources/prototype-claude-code-cdn.html", + "sha256": "5ed42eb9ecaf197985c2dc74526effdea1d3a6c05562f6c59a242e980647865b" + } + ], + "reviewedAt": "2026-10-20T06:33:47.865063+00:00" + }, + { + "revision": "prototype", + "provider": "claude-code", + "prompt": "cdn", + "width": 710, + "index": 2, + "label": "No purge, wait for TTL", + "verdict": "live", + "reason": "No purge switches the independent explanation from 5 s edge purge arrival to 9 min 30 s TTL expiry, beyond button styling.", + "sourceReplaySha256": "37ee2386d7df71e62638634c3a925ec4b64b8491ee4bcfcc5ec74e66de8065a3", + "evidence": [ + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/claude-code/cdn/width-710/control-2-primary-before2.png", + "sha256": "92ff6f439d02726d01d7122a78d048e6289abb8d525db557c3bd9e4c5a3b318d" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/claude-code/cdn/width-710/control-2-primary-after0.png", + "sha256": "c6f6ccd8764870c3130fa47eb7502166c5333aee86898a662f3d1442109a28bc" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/manual-plan-sources/prototype-claude-code-cdn.html", + "sha256": "5ed42eb9ecaf197985c2dc74526effdea1d3a6c05562f6c59a242e980647865b" + } + ], + "reviewedAt": "2026-10-20T06:33:47.872092+00:00" + }, + { + "revision": "prototype", + "provider": "claude-code", + "prompt": "cdn", + "width": 710, + "index": 4, + "label": "control 4", + "verdict": "live", + "reason": "In No purge mode, TTL drag changes the independent last-edge freshness prediction from 11 min 24 s to 49 min 24 s. The same figure remains visible.", + "sourceReplaySha256": "37ee2386d7df71e62638634c3a925ec4b64b8491ee4bcfcc5ec74e66de8065a3", + "evidence": [ + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/claude-code/cdn/width-710/control-4-drag-before2.png", + "sha256": "064b53764d7100231eb19be14dcc258122da86517f2fc4d735fa8abb1ab2be2a" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/claude-code/cdn/width-710/control-4-drag-after0.png", + "sha256": "dfba3fef232c261222c80eaef286bef91efac68d7efd63aec7730747ea0d2a23" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/manual-plan-sources/prototype-claude-code-cdn.html", + "sha256": "5ed42eb9ecaf197985c2dc74526effdea1d3a6c05562f6c59a242e980647865b" + } + ], + "reviewedAt": "2026-10-20T06:33:47.878212+00:00" + }, + { + "revision": "prototype", + "provider": "claude-code", + "prompt": "dns", + "width": 710, + "index": 0, + "label": "DNS lookup figure. Space or Enter replays; 1, 2, 3 or arrow keys change what is cached.", + "verdict": "live", + "reason": "Under reduced motion the retained stage click advances Step 1 of 8 to Step 2 and moves the packet from browser to resolver. Independent ArrowRight evidence also switches Cold cache (3 server trips) to Knows .com (2 trips); the saved source binds both routes.", + "sourceReplaySha256": "f059aef4ef21d3d174cc99f4eb59314b5d5f110f5a860fefa2ecc39870fe1527", + "evidence": [ + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/claude-code/dns/width-710/control-0-click-before2.png", + "sha256": "69f425acd60fb582ba1dbfaf06cfe6c08a017ec4c86c5dfedad70ae1f141bd34" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/claude-code/dns/width-710/control-0-click-after0.png", + "sha256": "a129a8e169394d74a7fcf84c85f7d2951566a3af832db15dbd5108352fa029f2" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/manual-plan-sources/prototype-claude-code-dns.html", + "sha256": "4edb845e573c141eb6a4d53b14d97ff5c9825bc13095e65d45a2647506f86cb9" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/claude-code/dns/width-710/control-0-key-ArrowRight-before2.png", + "sha256": "aac373e3d27a49130356e6b0007c9a6038cd0aa5112848ea421f8529f491d83d" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/claude-code/dns/width-710/control-0-key-ArrowRight-after0.png", + "sha256": "792b6f8ee9216656956fd7b88142d386dbc924b5e2c09840517ad6e9157c9436" + } + ], + "reviewedAt": "2026-10-20T06:36:05.395843+00:00" + }, + { + "revision": "prototype", + "provider": "claude-code", + "prompt": "dns", + "width": 710, + "index": 1, + "label": "Cold cache", + "verdict": "live", + "reason": "Cold cache changes the independent computed server-trip count from 2 to 3, corroborated by plan(cache).", + "sourceReplaySha256": "f059aef4ef21d3d174cc99f4eb59314b5d5f110f5a860fefa2ecc39870fe1527", + "evidence": [ + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/claude-code/dns/width-710/control-1-primary-before2.png", + "sha256": "afebf562131ddabc34e681a96a351c4ab79ef5f96d79b3e0666da833882c4ad6" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/claude-code/dns/width-710/control-1-primary-after0.png", + "sha256": "898fed089cb1be99ba2730d9ade4e11db7e674083d73c5329402c1f46bd59d4b" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/manual-plan-sources/prototype-claude-code-dns.html", + "sha256": "4edb845e573c141eb6a4d53b14d97ff5c9825bc13095e65d45a2647506f86cb9" + } + ], + "reviewedAt": "2026-10-20T06:36:05.400198+00:00" + }, + { + "revision": "prototype", + "provider": "claude-code", + "prompt": "dns", + "width": 710, + "index": 2, + "label": "Knows .com", + "verdict": "live", + "reason": "Knows .com changes the independent computed server-trip count from 3 to 2, corroborated by plan(cache).", + "sourceReplaySha256": "f059aef4ef21d3d174cc99f4eb59314b5d5f110f5a860fefa2ecc39870fe1527", + "evidence": [ + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/claude-code/dns/width-710/control-2-primary-before2.png", + "sha256": "898fed089cb1be99ba2730d9ade4e11db7e674083d73c5329402c1f46bd59d4b" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/claude-code/dns/width-710/control-2-primary-after0.png", + "sha256": "afebf562131ddabc34e681a96a351c4ab79ef5f96d79b3e0666da833882c4ad6" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/manual-plan-sources/prototype-claude-code-dns.html", + "sha256": "4edb845e573c141eb6a4d53b14d97ff5c9825bc13095e65d45a2647506f86cb9" + } + ], + "reviewedAt": "2026-10-20T06:36:05.404193+00:00" + }, + { + "revision": "prototype", + "provider": "claude-code", + "prompt": "dns", + "width": 710, + "index": 3, + "label": "Answer cached", + "verdict": "live", + "reason": "Answer cached changes the independent computed server-trip count from 3 to 0, corroborated by plan(cache).", + "sourceReplaySha256": "f059aef4ef21d3d174cc99f4eb59314b5d5f110f5a860fefa2ecc39870fe1527", + "evidence": [ + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/claude-code/dns/width-710/control-3-primary-before2.png", + "sha256": "898fed089cb1be99ba2730d9ade4e11db7e674083d73c5329402c1f46bd59d4b" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/claude-code/dns/width-710/control-3-primary-after0.png", + "sha256": "3fd26809b1349917e8b5237ed7e0669c720155cd461f47601a1dec5be033339b" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/manual-plan-sources/prototype-claude-code-dns.html", + "sha256": "4edb845e573c141eb6a4d53b14d97ff5c9825bc13095e65d45a2647506f86cb9" + } + ], + "reviewedAt": "2026-10-20T06:36:05.408243+00:00" + }, + { + "revision": "prototype", + "provider": "claude-code", + "prompt": "cdn", + "width": 710, + "index": 0, + "label": "CDN purge timeline: arrow keys move through time, space plays or pauses", + "verdict": "live", + "reason": "With pointer held outside the stage, Home\u2192End changes all ten drawn edge/browser copies v1\u2192v2 and the readout 0s/0 fresh\u21922m8s/5 fresh. This removes the prior pointer-leave/settling ambiguity.", + "sourceReplaySha256": "37ee2386d7df71e62638634c3a925ec4b64b8491ee4bcfcc5ec74e66de8065a3", + "evidence": [ + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/01-claude-cdn-stage-replay-home2.png", + "sha256": "0df912a505749076011fb00c50a74058f46620adbade6f941119c235196bc421" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/01-claude-cdn-stage-replay-end0.png", + "sha256": "b5974e63ace6f523f34b46ddcadbdde47174ad7ea29c63f9ea132c274e5f46fb" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/request-01-claude-cdn-stage-replay.log", + "sha256": "189b0b34406c825d49c2ecd577e4bb9a0fb3633250993b89d7fbb067b446f300" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/request-01-claude-cdn-stage-replay.actions.json", + "sha256": "2e29f59bee5a4cd908c04a13d649b2f21039712ce7cb801198dd211583e4d708" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/manual-plan-sources/prototype-claude-code-cdn.html", + "sha256": "5ed42eb9ecaf197985c2dc74526effdea1d3a6c05562f6c59a242e980647865b" + } + ], + "reviewedAt": "2026-10-20T06:55:50.247861+00:00" + }, + { + "revision": "prototype", + "provider": "claude-code", + "prompt": "cdn", + "width": 710, + "index": 6, + "label": "Replay", + "verdict": "dead", + "reason": "With reduced motion explicitly true, a real Replay click at the completed state leaves both retained post-input frames and readout unchanged at 2m8s/all fresh. Its handler resets t but never draws; run() refuses animation under reduced motion. The earlier automatic pass was a pointer/settling artifact.", + "sourceReplaySha256": "37ee2386d7df71e62638634c3a925ec4b64b8491ee4bcfcc5ec74e66de8065a3", + "evidence": [ + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/01-claude-cdn-stage-replay-end0.png", + "sha256": "b5974e63ace6f523f34b46ddcadbdde47174ad7ea29c63f9ea132c274e5f46fb" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/01-claude-cdn-stage-replay-replay0.png", + "sha256": "13d57a82af907f4f7ec75778302a5474b9691f685a821801163620d0285838a9" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/01-claude-cdn-stage-replay-replay1.png", + "sha256": "13d57a82af907f4f7ec75778302a5474b9691f685a821801163620d0285838a9" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/request-01-claude-cdn-stage-replay.log", + "sha256": "189b0b34406c825d49c2ecd577e4bb9a0fb3633250993b89d7fbb067b446f300" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/request-01-claude-cdn-stage-replay.actions.json", + "sha256": "2e29f59bee5a4cd908c04a13d649b2f21039712ce7cb801198dd211583e4d708" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/manual-plan-sources/prototype-claude-code-cdn.html", + "sha256": "5ed42eb9ecaf197985c2dc74526effdea1d3a6c05562f6c59a242e980647865b" + } + ], + "reviewedAt": "2026-10-20T06:55:50.254831+00:00" + }, + { + "revision": "prototype", + "provider": "claude-code", + "prompt": "cdn", + "width": 710, + "index": 3, + "label": "control 3", + "verdict": "live", + "reason": "In Purge mode with browser max-age zero, real propagation Home\u2192End changes independent last-edge prediction 0s\u21922min and the visible edge/browser freshness. The earlier No-purge state made this control ineffective.", + "sourceReplaySha256": "37ee2386d7df71e62638634c3a925ec4b64b8491ee4bcfcc5ec74e66de8065a3", + "evidence": [ + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/02-claude-cdn-propagation-before2.png", + "sha256": "64a1898b8eccf1750bc9b14f8725b62308fe336d73ddaa44eeb982788ebd0e08" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/02-claude-cdn-propagation-after0.png", + "sha256": "7edbbf0f248bb53d4216ad57fc75af75f92f03864515cab43bb0f3f38c9ee38b" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/request-02-claude-cdn-propagation.log", + "sha256": "ababe711a2195ebd01ded4676fa62af8c981afb54305afe52d58dcca22434800" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/request-02-claude-cdn-propagation.actions.json", + "sha256": "c417106068c39d8fa14d7ac804c18ee8a1f02172786d5d7749bc135a2a355f2e" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/manual-plan-sources/prototype-claude-code-cdn.html", + "sha256": "5ed42eb9ecaf197985c2dc74526effdea1d3a6c05562f6c59a242e980647865b" + } + ], + "reviewedAt": "2026-10-20T06:55:50.260626+00:00" + }, + { + "revision": "prototype", + "provider": "claude-code", + "prompt": "cdn", + "width": 710, + "index": 5, + "label": "control 5", + "verdict": "live", + "reason": "With purge propagation zero, real browser max-age Home\u2192End changes the independent last-user freshness prediction from immediate to 28m30s, while edges remain fresh. Prior TTL expiry dominated this effect.", + "sourceReplaySha256": "37ee2386d7df71e62638634c3a925ec4b64b8491ee4bcfcc5ec74e66de8065a3", + "evidence": [ + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/03-claude-cdn-browser-age-before2.png", + "sha256": "64a1898b8eccf1750bc9b14f8725b62308fe336d73ddaa44eeb982788ebd0e08" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/03-claude-cdn-browser-age-after0.png", + "sha256": "2252f2da44861be1dacd10a5ecaa307d504bc1a29a5ef78a1d1a9ecd3708ab13" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/request-03-claude-cdn-browser-age.log", + "sha256": "fa800d10a46d043ec523ef0f3673fbf273a829191684000fa199aad9cba8654e" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/request-03-claude-cdn-browser-age.actions.json", + "sha256": "a8883f3f54e5d7d22470c961a779c22e8bab358599ed26ebf74bfa27e4a9546d" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/manual-plan-sources/prototype-claude-code-cdn.html", + "sha256": "5ed42eb9ecaf197985c2dc74526effdea1d3a6c05562f6c59a242e980647865b" + } + ], + "reviewedAt": "2026-10-20T06:55:50.266318+00:00" + }, + { + "revision": "prototype", + "provider": "claude-code", + "prompt": "bicycle-pump", + "width": 710, + "index": 1, + "label": "Pump 5 strokes", + "verdict": "live", + "reason": "After starting flat and clicking Pump 5 strokes, the full 9.5-second cycle leaves the handle raised and tire pressure 0\u219214.7 psi, with valve-opening threshold 0\u219253%. The earlier short static windows missed the completed pumping effect.", + "sourceReplaySha256": "4bf5d103485aad335f57a724ba6a2d07d75d0bae62a65128c7621c929f8010b1", + "evidence": [ + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/08-claude-pump-cycle-before2.png", + "sha256": "9c93f7dbde46ba8068131d8e50e32c5c69a7d5a8d207a75a76dcffa94cce9013" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/08-claude-pump-cycle-after0.png", + "sha256": "4df801894c34967f6a8f350f404ae15bd9969c9ab30f329ccff0e7094cc22532" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/request-08-claude-pump-cycle.log", + "sha256": "4a0a60cec9605578f31fda83fda721b1b98bf449d1e52b89dd1f883f7fa94ee5" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/request-08-claude-pump-cycle.actions.json", + "sha256": "0fb3f8b5b6e4eecb9a1e9e84ecc03f5c5be6f020329ac4ede0f5c4f20bc7f9fc" + } + ], + "reviewedAt": "2026-10-20T06:58:05.903999+00:00" + }, + { + "revision": "prototype", + "provider": "claude-code", + "prompt": "toilet", + "width": 710, + "index": 1, + "label": "Flush", + "verdict": "live", + "reason": "Fresh settled tank plus actual Flush click opens the flapper, lowers the tank and visibly sends water through the rim/trapway; readout switches Ready\u2192Siphon pulling the bowl empty.", + "sourceReplaySha256": "3b1159c2ec8ea40711fce3f7597634f3518d65344f343df491b66973a37e17d4", + "evidence": [ + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/09-claude-toilet-pressure-low-before2.png", + "sha256": "827ea983c7a504a1196583eaa1014077d8917656c389bdfc0bc3e265dd0a64be" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/09-claude-toilet-pressure-low-flush0.png", + "sha256": "119e2d64f168237b2f9b9226515062a70c1ccc5ef23c6140e354bc8cb5c69083" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/request-09-claude-toilet-pressure-low.log", + "sha256": "8d4363e79d1a21738e06e56377775a50028f04827e51d18be4407861fbcbda33" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/request-09-claude-toilet-pressure-low.actions.json", + "sha256": "dbd0611a46be5db6cc68fd5bc95273f4517c978810ec6a17a91f6ab2511272cf" + } + ], + "reviewedAt": "2026-10-20T06:58:05.909548+00:00" + }, + { + "revision": "prototype", + "provider": "claude-code", + "prompt": "toilet", + "width": 710, + "index": 0, + "label": "Toilet cutaway. Press Enter to flush.", + "verdict": "live", + "reason": "The supported stage pointer input visibly advances the gravity-tank mechanism from filling to a new flush, with changed water/flapper state. Its saved onclick calls flush; the separately inspected fresh Flush control confirms that same model path.", + "sourceReplaySha256": "3b1159c2ec8ea40711fce3f7597634f3518d65344f343df491b66973a37e17d4", + "evidence": [ + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/09-claude-toilet-pressure-low-before2.png", + "sha256": "827ea983c7a504a1196583eaa1014077d8917656c389bdfc0bc3e265dd0a64be" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/09-claude-toilet-pressure-low-flush0.png", + "sha256": "119e2d64f168237b2f9b9226515062a70c1ccc5ef23c6140e354bc8cb5c69083" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/request-09-claude-toilet-pressure-low.log", + "sha256": "8d4363e79d1a21738e06e56377775a50028f04827e51d18be4407861fbcbda33" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/request-09-claude-toilet-pressure-low.actions.json", + "sha256": "dbd0611a46be5db6cc68fd5bc95273f4517c978810ec6a17a91f6ab2511272cf" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/claude-code/toilet/width-710/control-0-click-before2.png", + "sha256": "4a4dd127e750ddb689cfc4fbd85b138006e306eb4019f91d75823a2446524ee0" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/claude-code/toilet/width-710/control-0-click-after0.png", + "sha256": "ad14dbaf4524b9399edf79c8bfd1619c0efca7bac6965877740a274a060256d3" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/manual-plan-sources/prototype-claude-code-toilet.html", + "sha256": "e2a381a5f2b6aae3005857c57d05e8b2769e7d56aed0f92376e844959c532c7c" + } + ], + "reviewedAt": "2026-10-20T06:58:05.915372+00:00" + }, + { + "revision": "prototype", + "provider": "claude-code", + "prompt": "toilet", + "width": 710, + "index": 2, + "label": "control 2", + "verdict": "live", + "reason": "Fresh low/high pressure trials use the same tank and equal refill observation windows after a real flush. 20 psi yields about 1.3 L ready at t+16\u201317s; 80 psi yields 2.5 L, with visibly higher tank water and inlet flow. This proves pressure while refill is active.", + "sourceReplaySha256": "3b1159c2ec8ea40711fce3f7597634f3518d65344f343df491b66973a37e17d4", + "evidence": [ + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/09-claude-toilet-pressure-low-before2.png", + "sha256": "827ea983c7a504a1196583eaa1014077d8917656c389bdfc0bc3e265dd0a64be" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/09-claude-toilet-pressure-low-after0.png", + "sha256": "e44736fe1efd3d8e2ce64d7773181ac59d7020c1e2919caf6b21565af69f19d8" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/request-09-claude-toilet-pressure-low.log", + "sha256": "8d4363e79d1a21738e06e56377775a50028f04827e51d18be4407861fbcbda33" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/request-09-claude-toilet-pressure-low.actions.json", + "sha256": "dbd0611a46be5db6cc68fd5bc95273f4517c978810ec6a17a91f6ab2511272cf" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/10-claude-toilet-pressure-high-after0.png", + "sha256": "584fd0efec2edffcd2f940192471b3976d188803094c432f6f669786b9556d45" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/10-claude-toilet-pressure-high-refill0.png", + "sha256": "8db8bc021e8903f6b0d56a7a1e8fe6e0b74ddb7d0969a51cb376164501cbefb0" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/09-claude-toilet-pressure-low-refill0.png", + "sha256": "8b356b81b67fa67d956e43949b9c1b13447f56b262047dd09c32aad56acc0561" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/request-10-claude-toilet-pressure-high.log", + "sha256": "bb6b992ae2164a921314877a12c300674b5989c8a18e1c1d9c3172aafc021bc0" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/request-10-claude-toilet-pressure-high.actions.json", + "sha256": "bfe9834ba49fd98ef1b2d49b131bdeebb571debf1740bc1a7ef47d711c78bfca" + } + ], + "reviewedAt": "2026-10-20T06:58:05.920391+00:00" + }, + { + "revision": "prototype", + "provider": "claude-code", + "prompt": "toilet", + "width": 710, + "index": 3, + "label": "control 3", + "verdict": "live", + "reason": "Real float slider low\u2192high moves the shutoff float above the overflow, visibly raises tank water, starts overflow and changes Ready 5.3L to never shuts off 6.1L.", + "sourceReplaySha256": "3b1159c2ec8ea40711fce3f7597634f3518d65344f343df491b66973a37e17d4", + "evidence": [ + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/11-claude-toilet-float-before2.png", + "sha256": "46bf3469050d174f6f22bb4fbea6d300eab4f962bc902222c11ab17b41ea8bba" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/11-claude-toilet-float-after0.png", + "sha256": "89e8e299b6835f109d2f86e874890dd5cb91a7efe575600d590b8a3b5462b802" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/request-11-claude-toilet-float.log", + "sha256": "6838020e945a6d2b12891560312c340dcfad2bf34b6191639bb2fb4911569af3" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/request-11-claude-toilet-float.actions.json", + "sha256": "40f86db1dae9e5c3829e46c5c10d66264d5122bf520775ad6bdb12302b3a18ae" + } + ], + "reviewedAt": "2026-10-20T06:58:05.925084+00:00" + }, + { + "revision": "prototype", + "provider": "claude-code", + "prompt": "toilet", + "width": 710, + "index": 5, + "label": "Leaky", + "verdict": "live", + "reason": "From a full sealed tank, actual Leaky selection produces a small water loss and continued refill flow; screenshot and independent readout change Ready 5.3L\u2192Fill valve refilling 5.2L, matching the leak model.", + "sourceReplaySha256": "3b1159c2ec8ea40711fce3f7597634f3518d65344f343df491b66973a37e17d4", + "evidence": [ + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/12-claude-toilet-leak-before2.png", + "sha256": "f01063ea9e184728e2a5533896b7893cedfb25ba14f67ca58a4cfb32cbe6d49a" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/12-claude-toilet-leak-after0.png", + "sha256": "87521efb4d1c6611ba159f3b27827c1def2a05d81ef2c3b17f899e6491024e52" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/request-12-claude-toilet-leak.log", + "sha256": "98d23ca7601ee149b3af7ac46681d952b4c3b572859bf62239f26739b3f7f7a0" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/request-12-claude-toilet-leak.actions.json", + "sha256": "2542891092124ae6d3d6fb1c979855ebb974757b81e46698d21c44195820ad87" + } + ], + "reviewedAt": "2026-10-20T06:58:05.929874+00:00" + }, + { + "revision": "prototype", + "provider": "claude-code", + "prompt": "toilet", + "width": 710, + "index": 4, + "label": "Sealed", + "verdict": "live", + "reason": "After the demonstrated leak, selecting Sealed restores Ready 5.3L and stops visible refill/overflow flow after settling. The real input and before/after model state are retained.", + "sourceReplaySha256": "3b1159c2ec8ea40711fce3f7597634f3518d65344f343df491b66973a37e17d4", + "evidence": [ + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/12-claude-toilet-leak-after0.png", + "sha256": "87521efb4d1c6611ba159f3b27827c1def2a05d81ef2c3b17f899e6491024e52" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/12-claude-toilet-leak-sealed0.png", + "sha256": "f01063ea9e184728e2a5533896b7893cedfb25ba14f67ca58a4cfb32cbe6d49a" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/request-12-claude-toilet-leak.log", + "sha256": "98d23ca7601ee149b3af7ac46681d952b4c3b572859bf62239f26739b3f7f7a0" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/request-12-claude-toilet-leak.actions.json", + "sha256": "2542891092124ae6d3d6fb1c979855ebb974757b81e46698d21c44195820ad87" + } + ], + "reviewedAt": "2026-10-20T06:58:05.934652+00:00" + }, + { + "revision": "prototype", + "provider": "claude-code", + "prompt": "thermos", + "width": 710, + "index": 4, + "label": "How the model works", + "verdict": "live", + "reason": "Actual fresh-page disclosure click changes closed\u2192open and visibly reveals the model assumptions paragraph. The earlier replay had already opened it, so its final unchanged pair was insufficient.", + "sourceReplaySha256": "52983b0d8eded3271ce0f2b2ef336dc96d196b9b4d435b349bf150b1d3cef62a", + "evidence": [ + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/13-claude-thermos-disclosure-before2.png", + "sha256": "56d1f3556c544faae60234330094a36436bc2fd31f0401fa091c2a50157e90fc" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/13-claude-thermos-disclosure-after0.png", + "sha256": "642df06b4781e0df3ab5bb6e0367e063833a5544317622e9ae061a31e0491265" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/request-13-claude-thermos-disclosure.log", + "sha256": "6c26890e1abbefe189bd56610aa458f2c09ed48316e291ad9c15bae7e46626c7" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/request-13-claude-thermos-disclosure.actions.json", + "sha256": "d1191f1f11e8862d610b0730b0d19595ef8aa10851a29025bb9e31a8f3a9565e" + } + ], + "reviewedAt": "2026-10-20T06:58:05.945109+00:00" + }, + { + "revision": "prototype", + "provider": "claude-code", + "prompt": "door-lock", + "width": 710, + "index": 9, + "label": "Turn key", + "verdict": "live", + "reason": "With the right key fully inserted, actual Turn key click rotates the end-view cylinder and retracts the bolt; external readout changes free to turn\u2192plug turned / bolt retracted. The earlier 86%-inserted state was intentionally blocked.", + "sourceReplaySha256": "9dfa02ab67a20e6b89d73fde2a43afb7f3d4a273262d21a2883256d45ad8af42", + "evidence": [ + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/14-claude-lock-turn-before2.png", + "sha256": "5bc00ed938df5aae4afca595f51c6620402bc1b588c7dbfe2198c0703dc60123" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/14-claude-lock-turn-after0.png", + "sha256": "1a2d8a205fd56034b419c217957f11a0f4626627cf74461b8b4ecb376bd4b3cb" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/request-14-claude-lock-turn.log", + "sha256": "fb1da235b0e48f465d3bbf916d116d1fa91a636cd8eecca6fce932feec9f06e5" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/request-14-claude-lock-turn.actions.json", + "sha256": "002711fb8d7b05373263a58d0866ce357380b4053d4530d68ff0596e7ff84022" + } + ], + "reviewedAt": "2026-10-20T06:58:05.953718+00:00" + }, + { + "revision": "prototype", + "provider": "claude-code", + "prompt": "spray-bottle", + "width": 710, + "index": 0, + "label": "Trigger sprayer: arrow keys squeeze and release the trigger, space toggles auto pump", + "verdict": "live", + "reason": "Supported End key moves the piston from rest to full squeeze, compresses the spring and moves the trigger; readout changes from Rest/cylinder full to Held/both valves shut. The source End handler sets trigger=100 and disables auto pump, so the geometry is input-caused rather than ambient settling.", + "sourceReplaySha256": "28ba789bc8819e5513e5c01700e81accc9bda869360362ec66a264c789345cdc", + "evidence": [ + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/claude-code/spray-bottle/width-710/control-0-key-End-before2.png", + "sha256": "68f192049e10a3b6ff2b20ec959bf1809dd5939f04bba84c7f1bdb9c80621c7f" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/claude-code/spray-bottle/width-710/control-0-key-End-after0.png", + "sha256": "a706e04730eb8313640a9bca027d8201db86e38051484b837402c23d70e44d77" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/replay-pairs/prototype/claude-code/spray-bottle-710-0.png", + "sha256": "e75188fe2cd4b0f6701505d764ad953ee4706ad29d9f431defb79cea03d9cc64" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/replay-visual-review-claude-prototype-extra.json", + "sha256": "0abc97cd13644b65b43df59c4200db4099692acb096490c4aca7ddb9095f1092" + } + ], + "reviewedAt": "2026-10-20T07:03:23.853160+00:00" + }, + { + "revision": "prototype", + "provider": "claude-code", + "prompt": "spray-bottle", + "width": 710, + "index": 3, + "label": "Spray", + "verdict": "live", + "reason": "The before frame shows a narrow stream with Stream selected; the additionally inspected after1 frame shows a broad spray cone with Spray selected. Source nozzle-mode handler changes spread from 0.02 to 0.36; auto pumping supplies the squeeze, and the mode-specific pattern proves this control despite moving pixels failing the static threshold.", + "sourceReplaySha256": "28ba789bc8819e5513e5c01700e81accc9bda869360362ec66a264c789345cdc", + "evidence": [ + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/claude-code/spray-bottle/width-710/control-3-primary-before2.png", + "sha256": "9557693b9358cca7a81ad362065e7a244adcf9a4547fbd18b165d82a52ba84ca" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/claude-code/spray-bottle/width-710/control-3-primary-after0.png", + "sha256": "ca5487c4364dba92c516edb62b8796b43a46e631bea1f2b98e5dc022a5cc113c" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/replay-pairs/prototype/claude-code/spray-bottle-710-3.png", + "sha256": "eb92f4e797780ae73a370c36985f3c43dcb2f6bec9da600e332a2146982ffdc4" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/claude-code/spray-bottle/width-710/control-3-primary-after1.png", + "sha256": "7b56e135a4890427f4c87c70726b17d465a9ae723816c7e31830340c6edf67d6" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/replay-visual-review-claude-prototype-extra.json", + "sha256": "0abc97cd13644b65b43df59c4200db4099692acb096490c4aca7ddb9095f1092" + } + ], + "reviewedAt": "2026-10-20T07:03:23.860085+00:00" + }, + { + "revision": "prototype", + "provider": "claude-code", + "prompt": "spray-bottle", + "width": 710, + "index": 4, + "label": "Stream", + "verdict": "live", + "reason": "Before shows the broad spray droplets and Spray selected; after0 shows a narrow contiguous stream with Stream selected. The source stream branch changes particle spread/radius/speed, matching the visible pattern. Later after1 is the refill phase, explaining why persistent-pixel scoring remains unproven.", + "sourceReplaySha256": "28ba789bc8819e5513e5c01700e81accc9bda869360362ec66a264c789345cdc", + "evidence": [ + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/claude-code/spray-bottle/width-710/control-4-primary-before2.png", + "sha256": "960a7f6d4431d9f9993bd7181dd4f598f58117502d000da7c4e386a9cecfa893" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/claude-code/spray-bottle/width-710/control-4-primary-after0.png", + "sha256": "c4a4823a3d9715609dcee28da9d2654e4bcca3d60b3516cd257e39f535a33751" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/replay-pairs/prototype/claude-code/spray-bottle-710-4.png", + "sha256": "98d0af991b3fac96ba5d407792256a585971e108ff783741facc807e036e7b57" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/claude-code/spray-bottle/width-710/control-4-primary-after1.png", + "sha256": "16ce584b8b21b904f6ff5fca04fea55ebdaf35a21a3cc2e40ee5ba555768fd24" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/replay-visual-review-claude-prototype-extra.json", + "sha256": "0abc97cd13644b65b43df59c4200db4099692acb096490c4aca7ddb9095f1092" + } + ], + "reviewedAt": "2026-10-20T07:03:23.865602+00:00" + }, + { + "revision": "prototype", + "provider": "claude-code", + "prompt": "spray-bottle", + "width": 710, + "index": 5, + "label": "Off", + "verdict": "live", + "reason": "Off stops ejection and restores the trigger while both after frames display Nozzle shut / water cannot compress / trigger is stuck. This is the source nozzle-off hydraulic lock branch, not merely selected-button styling; automatic pump remains enabled.", + "sourceReplaySha256": "28ba789bc8819e5513e5c01700e81accc9bda869360362ec66a264c789345cdc", + "evidence": [ + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/claude-code/spray-bottle/width-710/control-5-primary-before2.png", + "sha256": "aa41dae105160cf8fb8de9ac557e1b0a20a2e73f37f17c966447288e695c4369" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/claude-code/spray-bottle/width-710/control-5-primary-after0.png", + "sha256": "5f6b12926e0adae8ac497825fbae0d4665417cc9b6b7283b4d879892ac22d17a" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/replay-pairs/prototype/claude-code/spray-bottle-710-5.png", + "sha256": "da1d8c414c3d7a4f456439b9e0eebfc19c656bfbbd27ae67f8a6ea534a5452bc" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/claude-code/spray-bottle/width-710/control-5-primary-after1.png", + "sha256": "5f6b12926e0adae8ac497825fbae0d4665417cc9b6b7283b4d879892ac22d17a" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/replay-visual-review-claude-prototype-extra.json", + "sha256": "0abc97cd13644b65b43df59c4200db4099692acb096490c4aca7ddb9095f1092" + } + ], + "reviewedAt": "2026-10-20T07:03:23.871062+00:00" + }, + { + "revision": "prototype", + "provider": "claude-code", + "prompt": "seat-belt", + "width": 710, + "index": 0, + "label": "Seat belt retractor: arrow keys change braking in g, M switches between car braking and belt yank", + "verdict": "live", + "reason": "Supported Home key changes braking from 0.80 g (locked by pendulum after 22 mm) to 0.00 g (free, 0 mm out), with the pendulum and pawl visibly returning. Source Home sets zero and reduced-motion settles the model deterministically, so the change is not autonomous timing or focus outline.", + "sourceReplaySha256": "c7930d7ce27161e2f6db9c33fae187bc1a6096de83a94177fa1eb912bf226203", + "evidence": [ + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/claude-code/seat-belt/width-710/control-0-key-Home-before2.png", + "sha256": "8e75fb45b4cd262123fa48f6374d143d1f7628a41a9290a9aed4c263034485b4" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/claude-code/seat-belt/width-710/control-0-key-Home-after0.png", + "sha256": "77312cf9f29da412522a4da144e039fe99b80ba31db43fe0ac856421277a771b" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/replay-pairs/prototype/claude-code/seat-belt-710-0.png", + "sha256": "fa1e290a364581ca2a5f65456ab9f424ea0715bf77ee680ff0173b59c0f0bb22" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/replay-visual-review-claude-prototype-extra.json", + "sha256": "0abc97cd13644b65b43df59c4200db4099692acb096490c4aca7ddb9095f1092" + } + ], + "reviewedAt": "2026-10-20T07:03:23.875264+00:00" + }, + { + "revision": "prototype", + "provider": "claude-code", + "prompt": "toaster", + "width": 710, + "index": 0, + "label": "Toaster: Space presses the lever, arrow keys set browning", + "verdict": "live", + "reason": "Stage click invokes the supported press/cancel handler. Before shows popped bread with lever raised; after shows bread lowered, compressed spring, hot element and active strip temperature/time. This is a new toast cycle started by the click, not focus styling.", + "sourceReplaySha256": "bc3162d90a3cd8d580b656dda4f6f2925dcff4f949ff8c3e40288a88d0f70dc4", + "evidence": [ + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/claude-code/toaster/width-710/control-0-click-before2.png", + "sha256": "26625947e9dfd68f8b970cab98a651568a63d93ab31ce61e2a1b043ae7d4dd8e" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/claude-code/toaster/width-710/control-0-click-after0.png", + "sha256": "914eb9255ae96301417d430506414476cf2f48ac0c2db538ba280101b15b9798" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/replay-pairs/prototype/claude-code/toaster-710-0.png", + "sha256": "07d903ecfb11c92b6725e06b623191facc307205b976edcb91f9690ebb84563b" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/replay-visual-review-claude-prototype-extra.json", + "sha256": "0abc97cd13644b65b43df59c4200db4099692acb096490c4aca7ddb9095f1092" + } + ], + "reviewedAt": "2026-10-20T07:03:23.880215+00:00" + }, + { + "revision": "prototype", + "provider": "claude-code", + "prompt": "toaster", + "width": 710, + "index": 2, + "label": "tw-browning", + "verdict": "live", + "reason": "Browning drag changes dial 2 to 5.5, visibly rotates the drawn dial and moves the trip stop; predicted next pop time changes from about 1:23 to 3:30 and remains 3:30 in after1. Previous pop time stays 1:23, so the new prediction is caused by browning rather than ongoing heating.", + "sourceReplaySha256": "bc3162d90a3cd8d580b656dda4f6f2925dcff4f949ff8c3e40288a88d0f70dc4", + "evidence": [ + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/claude-code/toaster/width-710/control-2-drag-before2.png", + "sha256": "fe0744a2b937e292c081ae7fba4d136479ca7a4b9506554b2e07e07cfaeb95d3" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/claude-code/toaster/width-710/control-2-drag-after0.png", + "sha256": "874ff9b79d0b4ea4ea6fa77fdfcecb52128187af2286192709f2de4784612cc3" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/replay-pairs/prototype/claude-code/toaster-710-2.png", + "sha256": "7f9b72f18b5a455145d9ef5fc4f36e3bcb6d354dda6452b3a50af849b60a3312" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/claude-code/toaster/width-710/control-2-drag-after1.png", + "sha256": "874ff9b79d0b4ea4ea6fa77fdfcecb52128187af2286192709f2de4784612cc3" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/replay-visual-review-claude-prototype-extra.json", + "sha256": "0abc97cd13644b65b43df59c4200db4099692acb096490c4aca7ddb9095f1092" + } + ], + "reviewedAt": "2026-10-20T07:03:23.885339+00:00" + }, + { + "revision": "prototype", + "provider": "claude-code", + "prompt": "database-index", + "width": 710, + "index": 0, + "label": "B-tree lookup: arrow keys pick the id, i toggles the index", + "verdict": "live", + "reason": "Supported ArrowRight changes lookup id from 420,000 to 530,000, updates the explanation and highlights a different leaf/table route. Source increments normalized key by 11; reduced-motion uses the final lookup state, excluding an autonomous tour.", + "sourceReplaySha256": "f90dc75b9440f9d4fe4901979b5f87522573eee11c3b73d0c7448858c8f141d2", + "evidence": [ + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/claude-code/database-index/width-710/control-0-key-ArrowRight-before2.png", + "sha256": "699b860a785ecc17c67c780587eca30a056219824d8048d16771c8b1301e8058" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/claude-code/database-index/width-710/control-0-key-ArrowRight-after0.png", + "sha256": "7bb410ef251f1322ab21b10c59333dd3084b985c34896b40ab6c1cae9f48117b" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/replay-pairs/prototype/claude-code/database-index-710-0.png", + "sha256": "7e8a2fca6a42bced48f6f9513135df0c93946e42174ef40e5ba1ede146244bf4" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/replay-visual-review-claude-prototype-extra.json", + "sha256": "0abc97cd13644b65b43df59c4200db4099692acb096490c4aca7ddb9095f1092" + } + ], + "reviewedAt": "2026-10-20T07:03:23.890752+00:00" + }, + { + "revision": "prototype", + "provider": "claude-code", + "prompt": "database-index", + "width": 710, + "index": 1, + "label": "No index", + "verdict": "live", + "reason": "No index click changes B-tree 4 page reads to Full scan 10,000 page reads and rewrites the explanation. Body height shrinks, but actual calculated output changes, matching the index=false branch.", + "sourceReplaySha256": "f90dc75b9440f9d4fe4901979b5f87522573eee11c3b73d0c7448858c8f141d2", + "evidence": [ + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/claude-code/database-index/width-710/control-1-primary-before2.png", + "sha256": "a785a229987db801daa2ea58f38c220b7f51d35cf6a76fa433a28eb8d2923d4a" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/claude-code/database-index/width-710/control-1-primary-after0.png", + "sha256": "05ee9dd6fd0b8069b436fb76f9eb2cbe37bbe0c3b8021a4faadc834f7f4fb195" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/replay-pairs/prototype/claude-code/database-index-710-1.png", + "sha256": "736053a033181a27bc18a3bef303f5da6f00dbf9add72845a6a0db71a9ec8b1a" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/replay-visual-review-claude-prototype-extra.json", + "sha256": "0abc97cd13644b65b43df59c4200db4099692acb096490c4aca7ddb9095f1092" + } + ], + "reviewedAt": "2026-10-20T07:03:23.896125+00:00" + }, + { + "revision": "prototype", + "provider": "claude-code", + "prompt": "database-index", + "width": 710, + "index": 2, + "label": "B-tree index", + "verdict": "live", + "reason": "B-tree index click changes Full scan 10,000 pages to 4 page reads and restores the index-path explanation and visible highlighted route. This is the supported index=true branch, not selected-button appearance.", + "sourceReplaySha256": "f90dc75b9440f9d4fe4901979b5f87522573eee11c3b73d0c7448858c8f141d2", + "evidence": [ + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/claude-code/database-index/width-710/control-2-primary-before2.png", + "sha256": "05ee9dd6fd0b8069b436fb76f9eb2cbe37bbe0c3b8021a4faadc834f7f4fb195" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/claude-code/database-index/width-710/control-2-primary-after0.png", + "sha256": "a785a229987db801daa2ea58f38c220b7f51d35cf6a76fa433a28eb8d2923d4a" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/replay-pairs/prototype/claude-code/database-index-710-2.png", + "sha256": "921f37911ecf87332cde3f5cc3fca97bf1e0c288c845345e8e1e21e61b350410" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/replay-visual-review-claude-prototype-extra.json", + "sha256": "0abc97cd13644b65b43df59c4200db4099692acb096490c4aca7ddb9095f1092" + } + ], + "reviewedAt": "2026-10-20T07:03:23.901547+00:00" + }, + { + "revision": "prototype", + "provider": "claude-code", + "prompt": "database-index", + "width": 710, + "index": 3, + "label": "Rows in table, powers of ten", + "verdict": "live", + "reason": "Rows slider changes 10 thousand to 100 million rows; output changes from 3 to 5 index page reads, hypothetical scan from 100 to 1,000,000, and lookup id from 4,200 to 42,000,000. The size/read-count model matches these changes despite text wrapping and card resize.", + "sourceReplaySha256": "f90dc75b9440f9d4fe4901979b5f87522573eee11c3b73d0c7448858c8f141d2", + "evidence": [ + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/claude-code/database-index/width-710/control-3-drag-before2.png", + "sha256": "76bb5a4f52a315c33a02bcee616af4f076635446c5a6e5384a9097e77bf9c8a7" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/claude-code/database-index/width-710/control-3-drag-after0.png", + "sha256": "db8cee631b5da3e3551cf9b49147113ee502f563786bf56f939c99fc05d33fa5" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/replay-pairs/prototype/claude-code/database-index-710-3.png", + "sha256": "bb7593a8d26d3a33fb973a6ae8bd5cfe061cb99059b32e2962db5bd8f79e0d74" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/replay-visual-review-claude-prototype-extra.json", + "sha256": "0abc97cd13644b65b43df59c4200db4099692acb096490c4aca7ddb9095f1092" + } + ], + "reviewedAt": "2026-10-20T07:03:23.907022+00:00" + }, + { + "revision": "prototype", + "provider": "claude-code", + "prompt": "git-merge", + "width": 710, + "index": 0, + "label": "Merge bench: keys 1 to 4 cycle each hunk, M toggles whether main moved", + "verdict": "live", + "reason": "Real-input request20 presses supported key 1 on the stage. The before/after PNGs show hunk1 feature and result blocks changing A to B while the unrelated conflict remains. Logs confirm hunk1 none\u2192feature; the persistent drawn output proves the stage despite generic unsupported probes failing.", + "sourceReplaySha256": "b27e9df0705a4d96e47801e96bc0826c5cdd3f6a481880bd998fda4e0644a945", + "evidence": [ + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/claude-code/git-merge/width-710/control-0-drag-before2.png", + "sha256": "b0f5c4ba6b731e4a387637b36243d7e0364f00d7e8f308a16a2b773c2204b970" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/claude-code/git-merge/width-710/control-0-drag-after0.png", + "sha256": "b0f5c4ba6b731e4a387637b36243d7e0364f00d7e8f308a16a2b773c2204b970" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/replay-pairs/prototype/claude-code/git-merge-710-0.png", + "sha256": "981abc1659be2ab4d1607063da0334d29a4832d8bfb07f402cbe40300ca11240" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/pairs/20-claude-git-stage-after0.png", + "sha256": "9edee258f878a552327f3682ec10b37059f544a0e831c79d77abfe8c90d4f16f" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/replay-visual-review-claude-prototype-extra.json", + "sha256": "0abc97cd13644b65b43df59c4200db4099692acb096490c4aca7ddb9095f1092" + } + ], + "reviewedAt": "2026-10-20T07:03:23.914026+00:00" + }, + { + "revision": "prototype", + "provider": "claude-code", + "prompt": "git-merge", + "width": 710, + "index": 5, + "label": "Neither branchFeature onlyMain onlyBoth, identicallyBoth, differently", + "verdict": "live", + "reason": "Request21 first uses Home to leave the final option, then ArrowDown/Enter on #h3. The inspected pair changes the last result block A\u2192B and the explanation/readout from 1 to 2 hunks from feature. Both after logs retain the changed output, establishing a live select rather than the old endpoint no-op.", + "sourceReplaySha256": "b27e9df0705a4d96e47801e96bc0826c5cdd3f6a481880bd998fda4e0644a945", + "evidence": [ + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/claude-code/git-merge/width-710/control-5-primary-before2.png", + "sha256": "d6bb6681df651e8fe785930af71e52c224efcaf0126c086aa71e46fdb1a985d0" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/claude-code/git-merge/width-710/control-5-primary-after0.png", + "sha256": "6094fc5d4b04e2b68b66ec5925777ab446d0a709eebbcbd25bfdbb28230ac389" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/replay-pairs/prototype/claude-code/git-merge-710-5.png", + "sha256": "eaf668035e8bf2d23486a04755df72858f8d1e726029f876d36d99158b58dafa" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/pairs/21-claude-git-final-hunk-after0.png", + "sha256": "9f172aee786da216d894a086731b4be064d02dbe6f4041309874e2b39d6139ed" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/replay-visual-review-claude-prototype-extra.json", + "sha256": "0abc97cd13644b65b43df59c4200db4099692acb096490c4aca7ddb9095f1092" + } + ], + "reviewedAt": "2026-10-20T07:03:23.921199+00:00" + }, + { + "revision": "prototype", + "provider": "claude-code", + "prompt": "websocket", + "width": 710, + "index": 0, + "label": "WebSocket chat: Enter sends a message, M switches between WebSocket and polling, arrows change the poll interval", + "verdict": "live", + "reason": "Supported stage click adds a third message line to all three client pads (two before, three in both after images). Source click invokes send and reduced-motion disables automatic touring, so the added bubbles are causal message delivery. The automatic semantic gate misses opacity-revealed SVG message paths.", + "sourceReplaySha256": "8a3a0490dbba7ea6ae68afd10cb72d40b72e697c844137b81348757425c5649c", + "evidence": [ + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/claude-code/websocket/width-710/control-0-click-before2.png", + "sha256": "fcf889178d0c21492f3a58f44fee8261a4a423402ba586b744fd615c870b5045" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/claude-code/websocket/width-710/control-0-click-after0.png", + "sha256": "95912b7d861698566aea902f92c2c74cbf4fada872e4b01ee348251cd75e06ae" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/replay-pairs/prototype/claude-code/websocket-710-0.png", + "sha256": "ae547f7d79bdd0aa9ca3a4249591d3c574bc5b2fa4bed0b3f7d8f495e125a383" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/claude-code/websocket/width-710/control-0-click-after1.png", + "sha256": "95912b7d861698566aea902f92c2c74cbf4fada872e4b01ee348251cd75e06ae" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/replay-visual-review-claude-prototype-extra.json", + "sha256": "0abc97cd13644b65b43df59c4200db4099692acb096490c4aca7ddb9095f1092" + } + ], + "reviewedAt": "2026-10-20T07:03:23.926621+00:00" + }, + { + "revision": "prototype", + "provider": "claude-code", + "prompt": "websocket", + "width": 710, + "index": 1, + "label": "WebSocket", + "verdict": "live", + "reason": "WebSocket click changes polling average/worst 1.6/3.1 s and 20 requests/min to 100/100 ms and zero polling requests, restores open wires, hides interval and shows completed handshake. These model outputs directly match mode=websocket.", + "sourceReplaySha256": "8a3a0490dbba7ea6ae68afd10cb72d40b72e697c844137b81348757425c5649c", + "evidence": [ + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/claude-code/websocket/width-710/control-1-primary-before2.png", + "sha256": "8dd30fe3a1002a04694e380eab9b7b7bcd6fea6b0cead5f9c8a0bd235352d6ee" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/claude-code/websocket/width-710/control-1-primary-after0.png", + "sha256": "5ee231e662649f330f0a5cb9620a45fdb09cec9936173c9068b97695d93ab432" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/replay-pairs/prototype/claude-code/websocket-710-1.png", + "sha256": "cb6643ee963886a3466f0c1ed2be5e50a79a4b979c0b2e3e34379c1536bcb24a" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/replay-visual-review-claude-prototype-extra.json", + "sha256": "0abc97cd13644b65b43df59c4200db4099692acb096490c4aca7ddb9095f1092" + } + ], + "reviewedAt": "2026-10-20T07:03:23.931649+00:00" + }, + { + "revision": "prototype", + "provider": "claude-code", + "prompt": "websocket", + "width": 710, + "index": 2, + "label": "Polling", + "verdict": "live", + "reason": "Polling click changes 100ms delivery and zero polls to 1.6s average, 3.1s worst and 20 requests/min; exposes interval and explains timed polling. Actual outputs change even though card height grows.", + "sourceReplaySha256": "8a3a0490dbba7ea6ae68afd10cb72d40b72e697c844137b81348757425c5649c", + "evidence": [ + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/claude-code/websocket/width-710/control-2-primary-before2.png", + "sha256": "5ee231e662649f330f0a5cb9620a45fdb09cec9936173c9068b97695d93ab432" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/claude-code/websocket/width-710/control-2-primary-after0.png", + "sha256": "6ed6e25928da7ff924251ef51943f5811984a5df4bba4fad764e84a2f868a6ac" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/replay-pairs/prototype/claude-code/websocket-710-2.png", + "sha256": "2d8669ead025f0938d58ed267b2d2693486ff03b369e3daa7d2ec42bc7c57a67" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/replay-visual-review-claude-prototype-extra.json", + "sha256": "0abc97cd13644b65b43df59c4200db4099692acb096490c4aca7ddb9095f1092" + } + ], + "reviewedAt": "2026-10-20T07:03:23.936419+00:00" + }, + { + "revision": "prototype", + "provider": "claude-code", + "prompt": "websocket", + "width": 710, + "index": 4, + "label": "latency", + "verdict": "live", + "reason": "Latency drag changes one-way 50 to 270 ms; average delivery changes 1.6 to 2.0 s and worst case 3.1 to 3.5 s while interval stays 3s and request rate stays 20. This is the model latency effect, not autonomous packet traffic.", + "sourceReplaySha256": "8a3a0490dbba7ea6ae68afd10cb72d40b72e697c844137b81348757425c5649c", + "evidence": [ + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/claude-code/websocket/width-710/control-4-drag-before2.png", + "sha256": "4ea1321813d604fdb21ff1422d79e5a2eff62f4f5f57ebc8187318795ed60e36" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/claude-code/websocket/width-710/control-4-drag-after0.png", + "sha256": "a6b033a1f06d15fc033cb13927d87104c8a1dcb176133556998340626c00a8a0" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/replay-pairs/prototype/claude-code/websocket-710-4.png", + "sha256": "c0e07491ffc4b36873e7d467ed9d6c084ffa6074c684ef14eeccf7eeaf848215" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/replay-visual-review-claude-prototype-extra.json", + "sha256": "0abc97cd13644b65b43df59c4200db4099692acb096490c4aca7ddb9095f1092" + } + ], + "reviewedAt": "2026-10-20T07:03:23.941211+00:00" + }, + { + "revision": "prototype", + "provider": "claude-code", + "prompt": "websocket", + "width": 710, + "index": 5, + "label": "interval", + "verdict": "live", + "reason": "Request23 enables Polling, sets #interval to Home then End with real keys. Inspected PNGs change interval 1\u219215 s, independent average delivery 600 ms\u21927.6 s and requests/min 60\u21924; latency stays 50 ms. Both after logs retain the new readout, proving the previously unexercised conditional control.", + "sourceReplaySha256": "8a3a0490dbba7ea6ae68afd10cb72d40b72e697c844137b81348757425c5649c", + "evidence": [ + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/claude-code/websocket/width-710/control-2-primary-after0.png", + "sha256": "6ed6e25928da7ff924251ef51943f5811984a5df4bba4fad764e84a2f868a6ac" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/pairs/23-claude-websocket-interval-after0.png", + "sha256": "124c4e4d8855892f74b6712c6cd4aba7d81179efafe29be21aabfb40897185e0" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/replay-visual-review-claude-prototype-extra.json", + "sha256": "0abc97cd13644b65b43df59c4200db4099692acb096490c4aca7ddb9095f1092" + } + ], + "reviewedAt": "2026-10-20T07:03:23.945850+00:00" + }, + { + "revision": "prototype", + "provider": "claude-code", + "prompt": "load-balancer", + "width": 710, + "index": 0, + "label": "Load balancer figure: left and right arrows change the algorithm, up and down change the traffic", + "verdict": "live", + "reason": "Supported ArrowRight changes algorithm from Round robin to Least-connections in the independent model readout. The source key handler updates algo and pick() consults it. Queue evolution is visible but is not used alone as causal proof because traffic runs continuously.", + "sourceReplaySha256": "7dc748d4f64c8368c9c5a1eed397594fb82640bf3abf123f76405587c3faaf42", + "evidence": [ + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/claude-code/load-balancer/width-710/control-0-key-ArrowRight-before2.png", + "sha256": "05469811b1850215e2b3d57012373b4eb8c8dd8f07754c4568246d0fafc01ebe" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/claude-code/load-balancer/width-710/control-0-key-ArrowRight-after0.png", + "sha256": "aff37653af50037d7676f70de62c513ee583ad8d0d6d5436fe2db7ff466f2bd5" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/replay-pairs/prototype/claude-code/load-balancer-710-0.png", + "sha256": "fca7cb8ac5ccb73663ea48a281b597af0a95cc448310d2d520d4c7c9c846ce97" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/replay-visual-review-claude-prototype-extra.json", + "sha256": "0abc97cd13644b65b43df59c4200db4099692acb096490c4aca7ddb9095f1092" + } + ], + "reviewedAt": "2026-10-20T07:03:23.952252+00:00" + }, + { + "revision": "prototype", + "provider": "claude-code", + "prompt": "load-balancer", + "width": 710, + "index": 1, + "label": "Round robin", + "verdict": "live", + "reason": "Round robin click changes the model readout from Least-connections to Round-robin, beyond selected-button styling. The source handler feeds the actual dispatch pick() branch. Simultaneous queue/average changes are not independently attributed to the click.", + "sourceReplaySha256": "7dc748d4f64c8368c9c5a1eed397594fb82640bf3abf123f76405587c3faaf42", + "evidence": [ + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/claude-code/load-balancer/width-710/control-1-primary-before2.png", + "sha256": "cac9c405d35cf34c4a50807eaab7d94f02be1127b7edc0a432906268979cfe45" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/claude-code/load-balancer/width-710/control-1-primary-after0.png", + "sha256": "96f9fd18a0bae07d00652a4f2ce33e2a13e8946b15ea03a145fb6516c7e7631a" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/replay-pairs/prototype/claude-code/load-balancer-710-1.png", + "sha256": "7c1216dbb107f387d85d3b3f8c79daaa0d83925dc7e305263c7a33f3a378b810" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/replay-visual-review-claude-prototype-extra.json", + "sha256": "0abc97cd13644b65b43df59c4200db4099692acb096490c4aca7ddb9095f1092" + } + ], + "reviewedAt": "2026-10-20T07:03:23.957511+00:00" + }, + { + "revision": "prototype", + "provider": "claude-code", + "prompt": "load-balancer", + "width": 710, + "index": 2, + "label": "Least connections", + "verdict": "live", + "reason": "Least connections click changes the model readout from Round-robin to Least-connections. Source maps this parameter to minimum-open-connections dispatch; readout change is causal, while the moving queue is treated as background rather than standalone proof.", + "sourceReplaySha256": "7dc748d4f64c8368c9c5a1eed397594fb82640bf3abf123f76405587c3faaf42", + "evidence": [ + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/claude-code/load-balancer/width-710/control-2-primary-before2.png", + "sha256": "949eaa7ed2c2701b3b3d9aef32a0ecfcda74d88907c4e2fd1d9ef3ac7661db07" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/claude-code/load-balancer/width-710/control-2-primary-after0.png", + "sha256": "a31bfab513c3b7a5331703ed5f99bab44ca65ac1cedc64cb5a04e6adec5db4a4" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/replay-pairs/prototype/claude-code/load-balancer-710-2.png", + "sha256": "6c2aec24526396677e933b2bfde1feba72bfec3b0dd7c995876eb1e5a741dd6b" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/replay-visual-review-claude-prototype-extra.json", + "sha256": "0abc97cd13644b65b43df59c4200db4099692acb096490c4aca7ddb9095f1092" + } + ], + "reviewedAt": "2026-10-20T07:03:23.962706+00:00" + }, + { + "revision": "prototype", + "provider": "claude-code", + "prompt": "load-balancer", + "width": 710, + "index": 3, + "label": "Random", + "verdict": "live", + "reason": "Random click changes the model readout from Round-robin to Random. Source dispatch pick() uses the selected random branch; no automatic cycling changes the algorithm. Changing queue counts alone is not counted as proof.", + "sourceReplaySha256": "7dc748d4f64c8368c9c5a1eed397594fb82640bf3abf123f76405587c3faaf42", + "evidence": [ + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/claude-code/load-balancer/width-710/control-3-primary-before2.png", + "sha256": "fd0bbf894349418452551501e202dab22671f0d17f4c5ffb536e4483312dd230" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/claude-code/load-balancer/width-710/control-3-primary-after0.png", + "sha256": "b4d7a4aa3f0eae040cf85157d652162531ace857be342fb60c8d3ecf6b66ef02" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/replay-pairs/prototype/claude-code/load-balancer-710-3.png", + "sha256": "2291a2c73796fafa9ed586d75163b65789ad9a7eef3f25c8b7a4363b58592c2a" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/replay-visual-review-claude-prototype-extra.json", + "sha256": "0abc97cd13644b65b43df59c4200db4099692acb096490c4aca7ddb9095f1092" + } + ], + "reviewedAt": "2026-10-20T07:03:23.967813+00:00" + }, + { + "revision": "prototype", + "provider": "claude-code", + "prompt": "load-balancer", + "width": 710, + "index": 4, + "label": "rate", + "verdict": "live", + "reason": "Fresh-page equal-time requests25/26 use Round robin and 4x Server C slowdown, changing only traffic through real Home/End input. At ~20.02/~20.01 s, inspected PNGs show open connections A/B/C=1/0/1 at 0.5 req/s versus 8/7/8 at 4 req/s, average 2.6\u21926.9 s, drops 0\u219219. Logs corroborate the contrast at 10 and 15 s. This isolates a substantial modeled load effect beyond the slider and autonomous aging of one run.", + "sourceReplaySha256": "7dc748d4f64c8368c9c5a1eed397594fb82640bf3abf123f76405587c3faaf42", + "evidence": [ + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/claude-code/load-balancer/width-710/control-4-drag-before2.png", + "sha256": "5ef1b08c6303c527fa98f5e97209233d4e5e1747a181160a6ad4e65775a6c0cc" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/claude-code/load-balancer/width-710/control-4-drag-after0.png", + "sha256": "866a6b8bd1056c2b10c911d64ec845fb2e82c48a952b5a5fed851f73900fbe02" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/replay-pairs/prototype/claude-code/load-balancer-710-4.png", + "sha256": "a5079cc132b1660c9e80c53bbe509fc14982484a2bf0b9c90f10b0e3c16624d3" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/25-claude-load-rate-low-at-20000.png", + "sha256": "e0ae92b6ed7f094c13a33aa49cf53aac8846476ba9c72144bc83fd4be1a8fdb8" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/26-claude-load-rate-high-at-20000.png", + "sha256": "576bbee73032b52c17dbd8cdda92c1a80768e2d96cfa438f17d9081c8bf26479" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/replay-visual-review-claude-prototype-extra.json", + "sha256": "0abc97cd13644b65b43df59c4200db4099692acb096490c4aca7ddb9095f1092" + } + ], + "reviewedAt": "2026-10-20T07:03:23.973237+00:00" + }, + { + "revision": "prototype", + "provider": "claude-code", + "prompt": "load-balancer", + "width": 710, + "index": 5, + "label": "slow", + "verdict": "live", + "reason": "Fresh-page equal-time requests27/28 hold Round robin and 4 req/s constant, changing only slowdown via real Home/End. At ~10.01/~10.02 s, inspected PNGs show identical A/B=5/6 but C=6 versus 8 and drops=0 versus 2; at ~20.02/~20.01 s the inspected drop counts are 9 versus 19 (averages 6.7 versus 6.9 s). This repeatable Server C pressure difference proves live service-time input beyond autonomous queue motion.", + "sourceReplaySha256": "7dc748d4f64c8368c9c5a1eed397594fb82640bf3abf123f76405587c3faaf42", + "evidence": [ + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/claude-code/load-balancer/width-710/control-5-drag-before2.png", + "sha256": "cdebb480db5d5aa3e1ffd40719180fe32d2c0866339b453ef2a729ae8d08f3ac" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/claude-code/load-balancer/width-710/control-5-drag-after0.png", + "sha256": "910a7f4f38ef808a70439f5da93853c376c601e27639a99c6f70e4235cb6c04d" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/replay-pairs/prototype/claude-code/load-balancer-710-5.png", + "sha256": "b30c06f979bdd6727529c80fed89de88d642fb1af396a8b40586c96e6416d7e6" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/27-claude-load-slow-min-at-10000.png", + "sha256": "f3b1ae0e0c32218d4ceeb734f16ba0ca87eba4e0a1ea5d025e30546dac033bbb" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/27-claude-load-slow-min-at-20000.png", + "sha256": "ca3c899b225cbc05fd1d16a972aa5ea6f5cd3c68acd5b07091a55ec9673a2b55" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/28-claude-load-slow-max-at-10000.png", + "sha256": "d9b6f05438f49427c7d8f4406eda616520724522204d438520ae76b3a9e3e6e4" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/28-claude-load-slow-max-at-20000.png", + "sha256": "58423de691809830e896ca65d45fbf9445d09772e23d52b04a86c64d20f90c0d" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/replay-visual-review-claude-prototype-extra.json", + "sha256": "0abc97cd13644b65b43df59c4200db4099692acb096490c4aca7ddb9095f1092" + } + ], + "reviewedAt": "2026-10-20T07:03:23.979017+00:00" + }, + { + "revision": "prototype", + "provider": "claude-code", + "prompt": "notification-settings", + "width": 710, + "index": 2, + "label": "Daily digest", + "verdict": "live", + "reason": "Daily digest click removes the time picker and the daily-digest clause from the explanatory sentence. The screenshot pair confirms real output despite card shrink, matching the digest parameter handler.", + "sourceReplaySha256": "ea576242765ff23cfc62388b843e2ca6584be55768953a3ffc04172373422632", + "evidence": [ + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/claude-code/notification-settings/width-710/control-2-primary-before2.png", + "sha256": "3df946977b7e31fdca2433c235c9e16858e4ee17f2ac41ccef791d588f332327" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/claude-code/notification-settings/width-710/control-2-primary-after0.png", + "sha256": "1974d3cb3110cea65af72298bc2462db9cf9da46ac1c20babdba7bb7356cae7e" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/replay-pairs/prototype/claude-code/notification-settings-710-2.png", + "sha256": "1a68dabe7e5fb70b57268007a8c48c53eb7fcef66c72da52182cd743ecebdea0" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/replay-visual-review-claude-prototype-extra.json", + "sha256": "0abc97cd13644b65b43df59c4200db4099692acb096490c4aca7ddb9095f1092" + } + ], + "reviewedAt": "2026-10-20T07:03:23.982219+00:00" + }, + { + "revision": "prototype", + "provider": "claude-code", + "prompt": "notification-settings", + "width": 710, + "index": 3, + "label": "Send digest at", + "verdict": "live", + "reason": "Request22 starts from fresh digest-enabled state and uses real keys on the visible time select. The inspected pair changes the separate summary from daily digest at 7 AM to 9 AM; both after logs confirm digest remains enabled and digestTime=9. The former failure was the earlier trial hiding the select.", + "sourceReplaySha256": "ea576242765ff23cfc62388b843e2ca6584be55768953a3ffc04172373422632", + "evidence": [ + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/claude-code/notification-settings/width-710/control-3-primary-before2.png", + "sha256": "1974d3cb3110cea65af72298bc2462db9cf9da46ac1c20babdba7bb7356cae7e" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/claude-code/notification-settings/width-710/control-3-primary-after0.png", + "sha256": "1974d3cb3110cea65af72298bc2462db9cf9da46ac1c20babdba7bb7356cae7e" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/replay-pairs/prototype/claude-code/notification-settings-710-3.png", + "sha256": "384447bcd131295c8b77aa617149d6618d5e37d63ddacae61d606a8d51b34758" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/pairs/22-claude-notification-time-after0.png", + "sha256": "5a6c190e33fae7974c6ec0f10e92310374a0ec8a6ae39f173c7a11ee3f8783a9" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/replay-visual-review-claude-prototype-extra.json", + "sha256": "0abc97cd13644b65b43df59c4200db4099692acb096490c4aca7ddb9095f1092" + } + ], + "reviewedAt": "2026-10-20T07:03:23.985333+00:00" + }, + { + "revision": "prototype", + "provider": "codex", + "prompt": "bicycle-pump", + "width": 710, + "index": 0, + "label": "Pump stroke phase", + "verdict": "live", + "reason": "Actual ArrowRight frames show piston moving down, compressed air chamber, inlet closure and a new compression paragraph/readout. Saved handler explicitly supports ArrowRight and selects phase 1 without autonomous settling.", + "sourceReplaySha256": "6f0625b152770c6b5a4cb3028c80270969ea7b22445df4a0b2d4dcf7d9f142e9", + "evidence": [ + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/codex/bicycle-pump/width-710/control-0-key-ArrowRight-before2.png", + "sha256": "e68462aded4345e376441d484348eddd5058dd3e610c43c901cd7f355bf9d901" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/codex/bicycle-pump/width-710/control-0-key-ArrowRight-after0.png", + "sha256": "b32d2c77db3c02f6446dbc567204d3038fa602f4bb9ede863248e013edb9ccf4" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/replay-pairs/prototype/codex/bicycle-pump-710-0.png", + "sha256": "305807133ac73b6bd540224c37b446584e9db1db2b0510e514a416dbdc70668c" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/replay-visual-review-codex-prototype.json", + "sha256": "16547345efee20bce0a5f962ea9fac13803b24ac756b00e05293b51796cdb45e" + } + ], + "reviewedAt": "2026-10-20T07:03:23.989509+00:00" + }, + { + "revision": "prototype", + "provider": "codex", + "prompt": "bicycle-pump", + "width": 710, + "index": 1, + "label": "\u2190 Previous", + "verdict": "live", + "reason": "Precondition Next enables Previous; click returns compression to fill, raises piston, opens inlet and replaces explanation.", + "sourceReplaySha256": "6f0625b152770c6b5a4cb3028c80270969ea7b22445df4a0b2d4dcf7d9f142e9", + "evidence": [ + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/04-codex-bicycle-pump-back-before2.png", + "sha256": "11c7dcc786f5a24c9da1be3f87196ae7ad4c01829f930a653bda95382cae5f29" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/04-codex-bicycle-pump-back-after0.png", + "sha256": "dc11505f2d0a035b33359a9ffbd5acaf4f2066f471e5ef260fc9fd51dcc2efd0" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/pairs/04-codex-bicycle-pump-back.png", + "sha256": "584bb4f4dacc8edb913dc620dcc801ed6b634cd5ee8496d5e65470348af332d6" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/request-04-codex-bicycle-pump-back.log", + "sha256": "875d3dd38ff3f328e9bbf498a0be23962cfbb085e2a2c93c8aff2a5bf8f45847" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/request-04-codex-bicycle-pump-back.exit.json", + "sha256": "af0ae04b44141625fc2a40a844c0b37224074bfe56f664a2c86b74dcec5e92e7" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/replay-visual-review-codex-prototype.json", + "sha256": "16547345efee20bce0a5f962ea9fac13803b24ac756b00e05293b51796cdb45e" + } + ], + "reviewedAt": "2026-10-20T07:03:23.993891+00:00" + }, + { + "revision": "prototype", + "provider": "codex", + "prompt": "cdn", + "width": 710, + "index": 0, + "label": "Fig 1 \u00b7 Distributed copiesBefore purge\n\n\nv1Edge Av1 cachedv1Edge Bv1 cachedv1Edge Cv1 cached\nv1Origi", + "verdict": "unproven", + "reason": "Only partial behavior is proved: ArrowRight advances Before purge to Purge accepted (0 to 1), but the saved phase definition omits numeric bounds and the frozen bridge defaults to 0..1. The full advertised 0..4 journey cannot be inferred from that single visible transition. Planned repeated-key/manual bounds evidence is needed; this must not become a whole-card pass.", + "sourceReplaySha256": "82626a0e95d104eca2455528a68df908732bd1fae7d95c0256d30ff5449bf405", + "evidence": [ + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/codex/cdn/width-710/control-0-key-ArrowRight-before2.png", + "sha256": "19a9068f60a8f8e87aa2c2e707dc77507c94bf992cb4d6a2285dc43379caae03" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/codex/cdn/width-710/control-0-key-ArrowRight-after0.png", + "sha256": "b8c7e20aeb77a3c51b1cc30da9a314ecb5c2e62450485b792866833161511fe8" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/replay-pairs/prototype/codex/cdn-710-0.png", + "sha256": "a0491bffd13a6052914ae6d7686d3d366692a0df78708c60ba3ed2ddb846d958" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/replay-visual-review-codex-prototype.json", + "sha256": "16547345efee20bce0a5f962ea9fac13803b24ac756b00e05293b51796cdb45e" + } + ], + "reviewedAt": "2026-10-20T07:03:24.001007+00:00" + }, + { + "revision": "prototype", + "provider": "codex", + "prompt": "cdn", + "width": 710, + "index": 1, + "label": "phase", + "verdict": "dead", + "reason": "Actual subsequent range drag reaches DOM value4 while diagram and explanation remain phase1/Purge accepted. The input thumb moves but bridge phase clamps to1; visible later stages do not work.", + "sourceReplaySha256": "82626a0e95d104eca2455528a68df908732bd1fae7d95c0256d30ff5449bf405", + "evidence": [ + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/06-codex-cdn-bounds-before2.png", + "sha256": "bf1301be359a11ddd16c2c58c320180b50db5d894ba5bf490992db8f48b138f0" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/06-codex-cdn-bounds-after0.png", + "sha256": "bf1301be359a11ddd16c2c58c320180b50db5d894ba5bf490992db8f48b138f0" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/pairs/06-codex-cdn-bounds.png", + "sha256": "6b466c0330a3b840f6fc6873b403b53faf15f66d139e5839844979410fd735d5" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/request-06-codex-cdn-bounds.log", + "sha256": "bd4fc12ad724e7ef6cfc5cce76b31f8fe0e72afed2a23e7b18beb74ad75b5a31" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/request-06-codex-cdn-bounds.exit.json", + "sha256": "61500500a8ccd330fa65e617321af96b76290b7c00a177f00741b46fcd77d7a7" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/06-codex-cdn-bounds-range-end0.png", + "sha256": "51249ba3fcb02ed1f564f5e0cb5f0083e1d3f5a0e00f3daef198dd55bd7ee4c9" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/replay-visual-review-codex-prototype.json", + "sha256": "16547345efee20bce0a5f962ea9fac13803b24ac756b00e05293b51796cdb45e" + } + ], + "reviewedAt": "2026-10-20T07:03:24.008613+00:00" + }, + { + "revision": "prototype", + "provider": "codex", + "prompt": "cdn", + "width": 710, + "index": 3, + "label": "browser", + "verdict": "live", + "reason": "The actual browser-cache checkbox changes the readout from Edge HIT to Local browser HIT and replaces the viewer explanation with the browser retaining its fresh v1 copy. This is independent visible output beyond checkbox styling.", + "sourceReplaySha256": "82626a0e95d104eca2455528a68df908732bd1fae7d95c0256d30ff5449bf405", + "evidence": [ + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/codex/cdn/width-710/control-3-primary-before2.png", + "sha256": "1719a0660f295cbdd92baed27be603e8dd8e4a699d075b3e6a4d105583f88742" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/codex/cdn/width-710/control-3-primary-after0.png", + "sha256": "954ca6a52142e808ecad22e080b08e78fc5c83039e5ff07a2aab83385b0b646b" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/replay-pairs/prototype/codex/cdn-710-3.png", + "sha256": "a5274ed63a0162b5d123cec01acc92df4efb5cfed1794b5af5a2c1fdbf5abfc6" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/replay-visual-review-codex-prototype.json", + "sha256": "16547345efee20bce0a5f962ea9fac13803b24ac756b00e05293b51796cdb45e" + } + ], + "reviewedAt": "2026-10-20T07:03:24.016191+00:00" + }, + { + "revision": "prototype", + "provider": "codex", + "prompt": "cdn", + "width": 710, + "index": 5, + "label": "Next stage \u2192", + "verdict": "dead", + "reason": "Next advances initial0 to1, then further real Next remains phase1/Purge accepted. Three advertised later phases are inaccessible because bridge default max1 clamps phase.", + "sourceReplaySha256": "82626a0e95d104eca2455528a68df908732bd1fae7d95c0256d30ff5449bf405", + "evidence": [ + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/06-codex-cdn-bounds-before2.png", + "sha256": "bf1301be359a11ddd16c2c58c320180b50db5d894ba5bf490992db8f48b138f0" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/06-codex-cdn-bounds-after0.png", + "sha256": "bf1301be359a11ddd16c2c58c320180b50db5d894ba5bf490992db8f48b138f0" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/pairs/06-codex-cdn-bounds.png", + "sha256": "6b466c0330a3b840f6fc6873b403b53faf15f66d139e5839844979410fd735d5" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/request-06-codex-cdn-bounds.log", + "sha256": "bd4fc12ad724e7ef6cfc5cce76b31f8fe0e72afed2a23e7b18beb74ad75b5a31" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/request-06-codex-cdn-bounds.exit.json", + "sha256": "61500500a8ccd330fa65e617321af96b76290b7c00a177f00741b46fcd77d7a7" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/06-codex-cdn-bounds-range-end0.png", + "sha256": "51249ba3fcb02ed1f564f5e0cb5f0083e1d3f5a0e00f3daef198dd55bd7ee4c9" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/replay-visual-review-codex-prototype.json", + "sha256": "16547345efee20bce0a5f962ea9fac13803b24ac756b00e05293b51796cdb45e" + } + ], + "reviewedAt": "2026-10-20T07:03:24.023673+00:00" + }, + { + "revision": "prototype", + "provider": "codex", + "prompt": "database-index", + "width": 710, + "index": 0, + "label": "Table tray; arrow keys change the target ID", + "verdict": "live", + "reason": "Actual ArrowRight frames move the emphasized table row from ID 1 to ID 2 and update the query/route ID. The saved handler explicitly changes target and renders; source geometry is static otherwise. The very pale external text is a readability limitation, not a dead input.", + "sourceReplaySha256": "4d6ab849479b49e53e9141340cce52edb9019d9b754fd1640989d561db54b5fe", + "evidence": [ + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/codex/database-index/width-710/control-0-key-ArrowRight-before2.png", + "sha256": "98b5abb2af7ed36c87e9656aa72dddf69b15f293d3ff1e6ad470ab8700153b86" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/codex/database-index/width-710/control-0-key-ArrowRight-after0.png", + "sha256": "3f70be64ac44aa7b4765ed167fdcb07c52fef4aba3a8799298fb5282cd1c2daf" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/replay-visual-review-codex-prototype.json", + "sha256": "16547345efee20bce0a5f962ea9fac13803b24ac756b00e05293b51796cdb45e" + } + ], + "reviewedAt": "2026-10-20T07:03:24.028767+00:00" + }, + { + "revision": "prototype", + "provider": "codex", + "prompt": "database-index", + "width": 710, + "index": 1, + "label": "B-tree indexFull table scan", + "verdict": "live", + "reason": "Actual Access path change from B-tree to full scan emphasizes every table row and changes the route/count to checking 12 rows. This meaningful output is visible outside the selector, though the pale text contrast is poor.", + "sourceReplaySha256": "4d6ab849479b49e53e9141340cce52edb9019d9b754fd1640989d561db54b5fe", + "evidence": [ + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/codex/database-index/width-710/control-1-primary-before2.png", + "sha256": "98b5abb2af7ed36c87e9656aa72dddf69b15f293d3ff1e6ad470ab8700153b86" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/codex/database-index/width-710/control-1-primary-after0.png", + "sha256": "f6939145c57feb0958cc758a5708bad01e504867546c7eb970124eed2ca28f60" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/replay-visual-review-codex-prototype.json", + "sha256": "16547345efee20bce0a5f962ea9fac13803b24ac756b00e05293b51796cdb45e" + } + ], + "reviewedAt": "2026-10-20T07:03:24.033591+00:00" + }, + { + "revision": "prototype", + "provider": "codex", + "prompt": "database-index", + "width": 710, + "index": 2, + "label": "123456789101112", + "verdict": "live", + "reason": "Actual full-resolution frames show SELECT WHERE id = 1 changing to id = 2 and route text return ID 1 changing to ID 2 while in scan mode. All rows correctly remain emphasized for a full scan. The text is very pale but visibly changes; the saved target handler matches this output.", + "sourceReplaySha256": "4d6ab849479b49e53e9141340cce52edb9019d9b754fd1640989d561db54b5fe", + "evidence": [ + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/codex/database-index/width-710/control-2-primary-before2.png", + "sha256": "f6939145c57feb0958cc758a5708bad01e504867546c7eb970124eed2ca28f60" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/codex/database-index/width-710/control-2-primary-after0.png", + "sha256": "bf8f15ecb2debc3d272089160707d2eb986444d2e9d793f1a799f7bb73d82819" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/replay-visual-review-codex-prototype.json", + "sha256": "16547345efee20bce0a5f962ea9fac13803b24ac756b00e05293b51796cdb45e" + } + ], + "reviewedAt": "2026-10-20T07:03:24.038084+00:00" + }, + { + "revision": "prototype", + "provider": "codex", + "prompt": "dns", + "width": 710, + "index": 0, + "label": "DNS lookup. Use left and right arrows to step.", + "verdict": "live", + "reason": "Actual supported End frames change local-cache check to Connect to the website, highlighting the device/web-server link and changing the caption. Source explicitly supports End and sets the last sequence step; no autonomous animation exists.", + "sourceReplaySha256": "ded728d019f784315f262b671d3f8eff4c7c7d08edfb12ab2cca4b5e6bc9cd75", + "evidence": [ + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/codex/dns/width-710/control-0-key-End-before2.png", + "sha256": "802e6c60739dbfc025f79e49401b41e3b2defd51e834856ebb456c1069e424f1" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/codex/dns/width-710/control-0-key-End-after0.png", + "sha256": "50698e71c4a8275247b5cf6adf112277cf5aef6423c72ccff920cbf386f84f41" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/replay-pairs/prototype/codex/dns-710-0.png", + "sha256": "321c4887ab4f7be46b0552920e28e1fd7d139d2c4e5f2bcaf5a7a79f7fd6f880" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/replay-visual-review-codex-prototype.json", + "sha256": "16547345efee20bce0a5f962ea9fac13803b24ac756b00e05293b51796cdb45e" + } + ], + "reviewedAt": "2026-10-20T07:03:24.043454+00:00" + }, + { + "revision": "prototype", + "provider": "codex", + "prompt": "dns", + "width": 710, + "index": 1, + "label": "No cacheAt the resolverOn your device", + "verdict": "dead", + "reason": "Native Home/Enter to End/Enter shows No cache then On your device, while dns.state.cache stays numeric0 and max stays3. Next twice clears selection and visits resolver/cache instead of device-cached route. Actual images confirm wrong route. Earlier automatic proof merely reset lookup step and did not prove cache selection.", + "sourceReplaySha256": "ded728d019f784315f262b671d3f8eff4c7c7d08edfb12ab2cca4b5e6bc9cd75", + "evidence": [ + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/19-codex-dns-cache-before2.png", + "sha256": "2f44e018ddfaf1ea2cc76b7e8eef3b1156f1070d6b834919d1d5c5fc0d66e124" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/19-codex-dns-cache-after0.png", + "sha256": "c64ed2b95cb38994d07a2651792dd76d07516ed13db960637c8d5731fee01b42" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/pairs/19-codex-dns-cache.png", + "sha256": "8911ee4a6b3dcff5a5c24d60e0ab81f19546942db233a98033cf67392042ef47" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/request-19-codex-dns-cache.log", + "sha256": "905f18496f8ffbfe8bc72209bec810d3d3f39e504f7d74df5bc7a75f5ab07679" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/request-19-codex-dns-cache.exit.json", + "sha256": "e05f8ade2b0a9e001868c7df26832104f68d53710174b76495ffa9ba406cf1bb" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/19-codex-dns-cache-next1.png", + "sha256": "cdfa5b033710b5eba371f02b841c503e9bd020eba6818a594724121b247eaa08" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/19-codex-dns-cache-next2.png", + "sha256": "f7a2521388845afa25d50e62a6eb64f5b7d4797076fca685906dbab985c2b754" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/replay-visual-review-codex-prototype.json", + "sha256": "16547345efee20bce0a5f962ea9fac13803b24ac756b00e05293b51796cdb45e" + } + ], + "reviewedAt": "2026-10-20T07:03:24.050052+00:00" + }, + { + "revision": "prototype", + "provider": "codex", + "prompt": "git-merge", + "width": 710, + "index": 0, + "label": "Different edits \u2192 clean mergeCompeting edits \u2192 conflictMain has no new commits \u2192 fast-forward", + "verdict": "dead", + "reason": "Real select changes Clean merge to Fast-forward, but actual diagram, merge explanation and history remain Clean merge; params stays {}. String-array options do not match frozen option.value contract.", + "sourceReplaySha256": "9a88555a0509c24be36498aae6a3a108bf100b732769e8ea142bf262784ff0c5", + "evidence": [ + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/18-codex-git-select-before2.png", + "sha256": "513e6ef6baa1c4c692e6194ca2b83674dc0f4470d1dc3ceaee007a3ea1aa68fa" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/18-codex-git-select-after0.png", + "sha256": "c36a13cb13909ff9e6aca1338206e402f8d39c8b03d180db55f082611ff8b30e" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/pairs/18-codex-git-select.png", + "sha256": "877ba4e0b495d3d84be8262d29369a22c797f4696ff20d124ca19c6e7b9d434e" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/request-18-codex-git-select.log", + "sha256": "d78a67a5c9f0c5ac05f42e8342afb5b409b5fc15714fa100baa0569c927831f4" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/request-18-codex-git-select.exit.json", + "sha256": "ebba7a2e1981715c92aae4162d7cc19e599bd10cf9e7da11853d43a99f346dc4" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/replay-visual-review-codex-prototype.json", + "sha256": "16547345efee20bce0a5f962ea9fac13803b24ac756b00e05293b51796cdb45e" + } + ], + "reviewedAt": "2026-10-20T07:03:24.053659+00:00" + }, + { + "revision": "prototype", + "provider": "codex", + "prompt": "load-balancer", + "width": 710, + "index": 0, + "label": "Requests sent", + "verdict": "live", + "reason": "Drag changes requests 3 to 11, routes C to B, server counts 1/1/1 to 4/4/3 and route readout; meaningful output corroborates supported range input.", + "sourceReplaySha256": "5e7b08e6f54782389e16ec5e40b4d2a1544e712f0b5b4c0d786d3a1e069584ec", + "evidence": [ + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/codex/load-balancer/width-710/control-0-drag-before2.png", + "sha256": "6bd6f86f8010edf5f39b9b69da602a672ce17908449c1250c941411a0943a746" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/codex/load-balancer/width-710/control-0-drag-after0.png", + "sha256": "6792d0a7d7389adbec3b477624d016cb6d76b156a19e4a81cd50e38b3969d61e" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/replay-pairs/prototype/codex/load-balancer-710-0.png", + "sha256": "b74df6963bf211e627316ce78dd2f55ac5f9c7a957d869605f013d3efe292c9d" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/replay-visual-review-codex-prototype.json", + "sha256": "16547345efee20bce0a5f962ea9fac13803b24ac756b00e05293b51796cdb45e" + } + ], + "reviewedAt": "2026-10-20T07:03:24.060791+00:00" + }, + { + "revision": "prototype", + "provider": "codex", + "prompt": "load-balancer", + "width": 710, + "index": 3, + "label": "What the model represents", + "verdict": "live", + "reason": "Actual summary click expands the previously hidden explanatory paragraphs; read-only details.open changes false to true and actual PNGs show the new text.", + "sourceReplaySha256": "5e7b08e6f54782389e16ec5e40b4d2a1544e712f0b5b4c0d786d3a1e069584ec", + "evidence": [ + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/17-codex-load-balancer-disclosure-before2.png", + "sha256": "f0af9a6217ed87e791ca55802833526de5110a000ad68e30889aa787d774dd14" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/17-codex-load-balancer-disclosure-after0.png", + "sha256": "faec2d6a0cb9f9917c0fce0ef3ad827dbcc06c26f74b9131ee7e1eb66675b2b2" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/pairs/17-codex-load-balancer-disclosure.png", + "sha256": "c0c0bd8a6348b169b432087e4ef708a48744bacb980c073fe51d17c1a85f87e4" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/request-17-codex-load-balancer-disclosure.log", + "sha256": "ed374e841c1c9b2074205a0519e2aef4dc33aa3465e91916cdee5f293f599d27" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/request-17-codex-load-balancer-disclosure.exit.json", + "sha256": "a95926e80452fc493794cc3d6704d20062ca43f7534b41d738866b2f127baef1" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/replay-visual-review-codex-prototype.json", + "sha256": "16547345efee20bce0a5f962ea9fac13803b24ac756b00e05293b51796cdb45e" + } + ], + "reviewedAt": "2026-10-20T07:03:24.068722+00:00" + }, + { + "revision": "prototype", + "provider": "codex", + "prompt": "notification-settings", + "width": 598, + "index": 0, + "label": "Email notifications", + "verdict": "live", + "reason": "After opening preview, Email click removes its example while keeping Push; meaningful external text change.", + "sourceReplaySha256": "9288ebb06f17cd71a3dd1bd6eccaf65e6a09a862b6c9d2a92c27e2ea2599d0aa", + "evidence": [ + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/07-codex-notification-preview-email-before2.png", + "sha256": "c47e2f7ce05a35fe03c824ebf0f52c90d05237fdbf4df0b28376981f81b1a8d8" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/07-codex-notification-preview-email-after0.png", + "sha256": "6f55028bff3588dd2ada6beed5e1a874c62b9fa4c2236e42a2cdbf646b945749" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/pairs/07-codex-notification-preview-email.png", + "sha256": "b38e5720593ac90555903865ec80ebf7a62ad58c28573bf6aab28bf4708384e6" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/request-07-codex-notification-preview.log", + "sha256": "eb5db1962deb1dd447c5d98e9b20cff17cd71f0b54635897a854e72fb7484506" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/request-07-codex-notification-preview.exit.json", + "sha256": "fb1ca2118cf61bed0a0a07ce25dee0f4b8ce3d85701125c0c05050687892d176" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/replay-visual-review-codex-prototype.json", + "sha256": "16547345efee20bce0a5f962ea9fac13803b24ac756b00e05293b51796cdb45e" + } + ], + "reviewedAt": "2026-10-20T07:03:24.078045+00:00" + }, + { + "revision": "prototype", + "provider": "codex", + "prompt": "notification-settings", + "width": 598, + "index": 1, + "label": "Push notifications", + "verdict": "live", + "reason": "With preview visible, Push click changes the Push example to All notifications are off.", + "sourceReplaySha256": "9288ebb06f17cd71a3dd1bd6eccaf65e6a09a862b6c9d2a92c27e2ea2599d0aa", + "evidence": [ + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/07-codex-notification-preview-push-before2.png", + "sha256": "6f55028bff3588dd2ada6beed5e1a874c62b9fa4c2236e42a2cdbf646b945749" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/07-codex-notification-preview-push-after0.png", + "sha256": "aa450a51ac2464bd4d09f107bf9303893bd07a2cab2086fdf216b5caa632746b" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/pairs/07-codex-notification-preview-push.png", + "sha256": "55c672acaf1c70bed43eb6ac3ffb1f3b2386271bd36832ed4f49d3a3d69c71f6" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/request-07-codex-notification-preview.log", + "sha256": "eb5db1962deb1dd447c5d98e9b20cff17cd71f0b54635897a854e72fb7484506" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/request-07-codex-notification-preview.exit.json", + "sha256": "fb1ca2118cf61bed0a0a07ce25dee0f4b8ce3d85701125c0c05050687892d176" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/replay-visual-review-codex-prototype.json", + "sha256": "16547345efee20bce0a5f962ea9fac13803b24ac756b00e05293b51796cdb45e" + } + ], + "reviewedAt": "2026-10-20T07:03:24.087545+00:00" + }, + { + "revision": "prototype", + "provider": "codex", + "prompt": "notification-settings", + "width": 598, + "index": 2, + "label": "Daily digest", + "verdict": "live", + "reason": "Daily digest click exposes the schedule select and changes external preview to Daily digest at 9 AM.", + "sourceReplaySha256": "9288ebb06f17cd71a3dd1bd6eccaf65e6a09a862b6c9d2a92c27e2ea2599d0aa", + "evidence": [ + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/07-codex-notification-preview-digest-before2.png", + "sha256": "aa450a51ac2464bd4d09f107bf9303893bd07a2cab2086fdf216b5caa632746b" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/07-codex-notification-preview-digest-after0.png", + "sha256": "67c1066b59329f1874496f530a2ed553a6da17ee7d08db8deb5959889d5c3d29" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/pairs/07-codex-notification-preview-digest.png", + "sha256": "1d5a6731c1f20ba98aacf643bfbf3058ed14017925ab3d5f3bd5c9fe8c57ee4a" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/request-07-codex-notification-preview.log", + "sha256": "eb5db1962deb1dd447c5d98e9b20cff17cd71f0b54635897a854e72fb7484506" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/request-07-codex-notification-preview.exit.json", + "sha256": "fb1ca2118cf61bed0a0a07ce25dee0f4b8ce3d85701125c0c05050687892d176" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/replay-visual-review-codex-prototype.json", + "sha256": "16547345efee20bce0a5f962ea9fac13803b24ac756b00e05293b51796cdb45e" + } + ], + "reviewedAt": "2026-10-20T07:03:24.097094+00:00" + }, + { + "revision": "prototype", + "provider": "codex", + "prompt": "notification-settings", + "width": 598, + "index": 3, + "label": "Preview notifications", + "verdict": "live", + "reason": "Click Preview notifications reveals the external preview panel with Email and Push examples.", + "sourceReplaySha256": "9288ebb06f17cd71a3dd1bd6eccaf65e6a09a862b6c9d2a92c27e2ea2599d0aa", + "evidence": [ + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/07-codex-notification-preview-before2.png", + "sha256": "b76498af60be9de80c11d2180f3e6d58527a089656efb942fe082f6e5a6d4145" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/07-codex-notification-preview-after0.png", + "sha256": "c47e2f7ce05a35fe03c824ebf0f52c90d05237fdbf4df0b28376981f81b1a8d8" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/pairs/07-codex-notification-preview.png", + "sha256": "159629e3b76d47d2819b444ca2f9949f002c422de34f6bff5452724ecbdedbe5" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/request-07-codex-notification-preview.log", + "sha256": "eb5db1962deb1dd447c5d98e9b20cff17cd71f0b54635897a854e72fb7484506" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/request-07-codex-notification-preview.exit.json", + "sha256": "fb1ca2118cf61bed0a0a07ce25dee0f4b8ce3d85701125c0c05050687892d176" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/replay-visual-review-codex-prototype.json", + "sha256": "16547345efee20bce0a5f962ea9fac13803b24ac756b00e05293b51796cdb45e" + } + ], + "reviewedAt": "2026-10-20T07:03:24.106518+00:00" + }, + { + "revision": "prototype", + "provider": "codex", + "prompt": "notification-settings", + "width": 598, + "index": 4, + "label": "Delivery time \u00b7 your local time", + "verdict": "live", + "reason": "After enabling Daily digest and preview, real Home/Enter then End/Enter changes 7 AM to 6 PM in both select and external preview.", + "sourceReplaySha256": "9288ebb06f17cd71a3dd1bd6eccaf65e6a09a862b6c9d2a92c27e2ea2599d0aa", + "evidence": [ + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/07-codex-notification-preview-time-before2.png", + "sha256": "1f1ba70fb3e3bf8f5f7943e4aa58f37432e75c093445e644e1d6fa31c8969900" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/07-codex-notification-preview-time-after0.png", + "sha256": "ccb9d8768d523399bbcbd27506138f6e5cc8e4719fb3fc4331951832ae01f64c" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/pairs/07-codex-notification-preview-time.png", + "sha256": "b5c5493164ce506b2a8b60bcbe90b0ab6aa36555df59bbb0decdf186eeebc84d" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/request-07-codex-notification-preview.log", + "sha256": "eb5db1962deb1dd447c5d98e9b20cff17cd71f0b54635897a854e72fb7484506" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/request-07-codex-notification-preview.exit.json", + "sha256": "fb1ca2118cf61bed0a0a07ce25dee0f4b8ce3d85701125c0c05050687892d176" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/replay-visual-review-codex-prototype.json", + "sha256": "16547345efee20bce0a5f962ea9fac13803b24ac756b00e05293b51796cdb45e" + } + ], + "reviewedAt": "2026-10-20T07:03:24.116148+00:00" + }, + { + "revision": "prototype", + "provider": "codex", + "prompt": "refrigerator", + "width": 710, + "index": 0, + "label": "Inside: heat absorbedRoom: heat releasedCompressorExpansion restriction", + "verdict": "live", + "reason": "Actual ArrowRight frames move the refrigerant marker from evaporator to compressor and replace the explanation and readout with compression. The source explicitly increments phase for ArrowRight; no autonomous motion can explain this state change.", + "sourceReplaySha256": "6343a865a83a503506f0e0fc0560c0610b485048e03abba750d32f1a0c40a902", + "evidence": [ + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/codex/refrigerator/width-710/control-0-key-ArrowRight-before2.png", + "sha256": "a08a0d91b36f5a90bbeafe1cc0704d000785f499cbaabae25703d3def40ad628" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/codex/refrigerator/width-710/control-0-key-ArrowRight-after0.png", + "sha256": "166f795017c6126b1729abd462189297e25d5c94fb76806706738765a8f73460" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/replay-pairs/prototype/codex/refrigerator-710-0.png", + "sha256": "abc17812857150d43f3558291db236530d3a4fa8c2a49df9c919a62fa529201c" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/replay-visual-review-codex-prototype.json", + "sha256": "16547345efee20bce0a5f962ea9fac13803b24ac756b00e05293b51796cdb45e" + } + ], + "reviewedAt": "2026-10-20T07:03:24.120662+00:00" + }, + { + "revision": "prototype", + "provider": "codex", + "prompt": "seat-belt", + "width": 710, + "index": 0, + "label": "Belt reelBelt \u2192Locking catchInertia weight", + "verdict": "live", + "reason": "The actual supported ArrowRight pair changes Normal to Sudden braking, moves the pendulum/link and engages the catch, with a matching payout-blocked readout. Saved handler updates local mode and draws synchronously; no incidental animation is involved.", + "sourceReplaySha256": "7128f5ae9629ba1d998ca8fd84f676e7627ab0ebfd4440a93cc7a2fed0b3681b", + "evidence": [ + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/codex/seat-belt/width-710/control-0-key-ArrowRight-before2.png", + "sha256": "2987fdbf9e9ffa7ff9e3034951575c8363462dad3fa3151b68b1bedc4d872064" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/codex/seat-belt/width-710/control-0-key-ArrowRight-after0.png", + "sha256": "657a2a7b57b0ab218715d29e0b723ea05f2f8deb7529be710cccebdab33e02d5" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/replay-pairs/prototype/codex/seat-belt-710-0.png", + "sha256": "4a2b2389741a64bc73ef3134af11fa2aa0a22d3d28635732b3a5ca0263e20823" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/replay-visual-review-codex-prototype.json", + "sha256": "16547345efee20bce0a5f962ea9fac13803b24ac756b00e05293b51796cdb45e" + } + ], + "reviewedAt": "2026-10-20T07:03:24.125927+00:00" + }, + { + "revision": "prototype", + "provider": "codex", + "prompt": "spray-bottle", + "width": 710, + "index": 0, + "label": "Spray bottle pump. Right arrow squeezes; left arrow releases.", + "verdict": "dead", + "reason": "Actual supported-input frames retain the release state, open inlet, closed outlet and unchanged explanation. The generated source defines stroke as type string with value squeeze; the frozen bridge only handles text/toggle specially and otherwise numeric-normalizes with default 0. Both squeeze/release strings therefore stay 0 and cannot trigger the intended state change. This is a parameter-contract defect, not a missing visual threshold.", + "sourceReplaySha256": "0db03fcce6247c6d588500c618e249ed3b843c01fc427d87dfa2a001ce33b718", + "evidence": [ + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/codex/spray-bottle/width-710/control-0-key-ArrowRight-before2.png", + "sha256": "e1a58c13f6ed83971a47c2b3bbfe9cfdc14f2867fb89f4cf1d11fb2f433f05dd" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/codex/spray-bottle/width-710/control-0-key-ArrowRight-after0.png", + "sha256": "e1a58c13f6ed83971a47c2b3bbfe9cfdc14f2867fb89f4cf1d11fb2f433f05dd" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/prototype/plugins/playgrounds/controls.ts", + "sha256": "46fb54957b04f70721f6f0a5df41d852149c3d34d83141ad6ad4b1408c152af3" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/replay-visual-review-codex-prototype.json", + "sha256": "16547345efee20bce0a5f962ea9fac13803b24ac756b00e05293b51796cdb45e" + } + ], + "reviewedAt": "2026-10-20T07:03:24.130769+00:00" + }, + { + "revision": "prototype", + "provider": "codex", + "prompt": "spray-bottle", + "width": 710, + "index": 1, + "label": "Squeeze trigger", + "verdict": "dead", + "reason": "Actual supported-input frames retain the release state, open inlet, closed outlet and unchanged explanation. The generated source defines stroke as type string with value squeeze; the frozen bridge only handles text/toggle specially and otherwise numeric-normalizes with default 0. Both squeeze/release strings therefore stay 0 and cannot trigger the intended state change. This is a parameter-contract defect, not a missing visual threshold.", + "sourceReplaySha256": "0db03fcce6247c6d588500c618e249ed3b843c01fc427d87dfa2a001ce33b718", + "evidence": [ + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/codex/spray-bottle/width-710/control-1-primary-before2.png", + "sha256": "4aa0217776eabb07ab01be4e9aaf9eaf15a95d09448ec11df3bdd2f06a18ee34" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/codex/spray-bottle/width-710/control-1-primary-after0.png", + "sha256": "4aa0217776eabb07ab01be4e9aaf9eaf15a95d09448ec11df3bdd2f06a18ee34" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/prototype/plugins/playgrounds/controls.ts", + "sha256": "46fb54957b04f70721f6f0a5df41d852149c3d34d83141ad6ad4b1408c152af3" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/replay-visual-review-codex-prototype.json", + "sha256": "16547345efee20bce0a5f962ea9fac13803b24ac756b00e05293b51796cdb45e" + } + ], + "reviewedAt": "2026-10-20T07:03:24.135415+00:00" + }, + { + "revision": "prototype", + "provider": "codex", + "prompt": "spray-bottle", + "width": 710, + "index": 2, + "label": "Release trigger", + "verdict": "dead", + "reason": "Actual supported-input frames retain the release state, open inlet, closed outlet and unchanged explanation. The generated source defines stroke as type string with value squeeze; the frozen bridge only handles text/toggle specially and otherwise numeric-normalizes with default 0. Both squeeze/release strings therefore stay 0 and cannot trigger the intended state change. This is a parameter-contract defect, not a missing visual threshold.", + "sourceReplaySha256": "0db03fcce6247c6d588500c618e249ed3b843c01fc427d87dfa2a001ce33b718", + "evidence": [ + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/codex/spray-bottle/width-710/control-2-primary-before2.png", + "sha256": "4aa0217776eabb07ab01be4e9aaf9eaf15a95d09448ec11df3bdd2f06a18ee34" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/codex/spray-bottle/width-710/control-2-primary-after0.png", + "sha256": "4aa0217776eabb07ab01be4e9aaf9eaf15a95d09448ec11df3bdd2f06a18ee34" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/prototype/plugins/playgrounds/controls.ts", + "sha256": "46fb54957b04f70721f6f0a5df41d852149c3d34d83141ad6ad4b1408c152af3" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/replay-visual-review-codex-prototype.json", + "sha256": "16547345efee20bce0a5f962ea9fac13803b24ac756b00e05293b51796cdb45e" + } + ], + "reviewedAt": "2026-10-20T07:03:24.139963+00:00" + }, + { + "revision": "prototype", + "provider": "codex", + "prompt": "stapler", + "width": 710, + "index": 0, + "label": "Stapling cycle. Use left and right arrows.", + "verdict": "live", + "reason": "The actual ArrowRight pair changes Ready to Press: handle and magazine lower, driver moves, and the explanation changes. Source explicitly increments step on ArrowRight; no autonomous animation exists.", + "sourceReplaySha256": "047bd19b2bf32790de9aabaccd4e9c3555e44a7dcba858303d29b3930b90749a", + "evidence": [ + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/codex/stapler/width-710/control-0-key-ArrowRight-before2.png", + "sha256": "77626affa49037e70b32f87849e79ca589c7609a35a169aff1c4770defa05c63" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/codex/stapler/width-710/control-0-key-ArrowRight-after0.png", + "sha256": "835407b52a8d35e83563580b85857b7b613556989ffe6187709aedc04ccf38df" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/replay-pairs/prototype/codex/stapler-710-0.png", + "sha256": "107191a1e3f5a7c19c0bd2e28ac69fff60cd6e2c8b6a09e04860f34a4368d520" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/replay-visual-review-codex-prototype.json", + "sha256": "16547345efee20bce0a5f962ea9fac13803b24ac756b00e05293b51796cdb45e" + } + ], + "reviewedAt": "2026-10-20T07:03:24.144501+00:00" + }, + { + "revision": "prototype", + "provider": "codex", + "prompt": "stapler", + "width": 710, + "index": 1, + "label": "\u2190 Back", + "verdict": "live", + "reason": "Next enables Back; click returns Press to Ready, lifts driver/staple and changes explanation.", + "sourceReplaySha256": "047bd19b2bf32790de9aabaccd4e9c3555e44a7dcba858303d29b3930b90749a", + "evidence": [ + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/04-codex-stapler-back-before2.png", + "sha256": "4d2b8921bf62812632ab5e0fc4bcfd5cba49b0523d95b88af2efef57239b3c9d" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/04-codex-stapler-back-after0.png", + "sha256": "8dd8d1e4b515d675e6a4e8fa96ecde909735cda0ec71388bdac25d314866773c" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/pairs/04-codex-stapler-back.png", + "sha256": "f684923dfdd910dbb25c7d931a62cf3f1641c005527130046c988230c4aab269" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/request-04-codex-stapler-back.log", + "sha256": "3747ffb1ffa00f3f712c72dfbdc544bb4cf105f841903b9e2119a986b8f4e5f8" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/request-04-codex-stapler-back.exit.json", + "sha256": "6583c2435c762fd34c7762f55abe7cfeade5ca760ca9a30bca7a4fd31c6125d9" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/replay-visual-review-codex-prototype.json", + "sha256": "16547345efee20bce0a5f962ea9fac13803b24ac756b00e05293b51796cdb45e" + } + ], + "reviewedAt": "2026-10-20T07:03:24.149035+00:00" + }, + { + "revision": "prototype", + "provider": "codex", + "prompt": "thermos", + "width": 710, + "index": 0, + "label": "ClosedOpen", + "verdict": "dead", + "reason": "Real native Home/Enter to End/Enter changes displayed selection, but actual diagram and explanation remain unchanged. Read-only thermosState.params remains {}. Source supplies string-array options; frozen bridge expects option.value and rejects every intended choice.", + "sourceReplaySha256": "4ec3c141f937d2a3a6276e681e3a2b9021fd20c747094d7a893f2fee6aa1b2c2", + "evidence": [ + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/15-codex-thermos-selects-cap-before2.png", + "sha256": "9159fd889bbeddcb7f9bab910671c014734008aa645c1949590d1d703e6e578f" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/15-codex-thermos-selects-cap-after0.png", + "sha256": "e128a96776d1e98a01ef9688d0b544e29fd80b20043e5116a8d0dcb77b5c4ab4" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/pairs/15-codex-thermos-selects-cap.png", + "sha256": "fddaa1d5627b6a926a364133d67999032c2d81ce924f6f5c34f55ba00429c7ae" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/request-15-codex-thermos-selects.log", + "sha256": "7936e800403591dfaafee40d5099af854f7455bc266bf8b18250245d1b4cd5ef" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/request-15-codex-thermos-selects.exit.json", + "sha256": "b8f37f3349a022cac95cd51e6cb19818c5a699608b7f1e4343ba8ce27ef507e7" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/replay-visual-review-codex-prototype.json", + "sha256": "16547345efee20bce0a5f962ea9fac13803b24ac756b00e05293b51796cdb45e" + } + ], + "reviewedAt": "2026-10-20T07:03:24.152751+00:00" + }, + { + "revision": "prototype", + "provider": "codex", + "prompt": "thermos", + "width": 710, + "index": 1, + "label": "VacuumAir filled", + "verdict": "dead", + "reason": "Real native Home/Enter to End/Enter changes displayed selection, but actual diagram and explanation remain unchanged. Read-only thermosState.params remains {}. Source supplies string-array options; frozen bridge expects option.value and rejects every intended choice.", + "sourceReplaySha256": "4ec3c141f937d2a3a6276e681e3a2b9021fd20c747094d7a893f2fee6aa1b2c2", + "evidence": [ + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/15-codex-thermos-selects-vacuum-before2.png", + "sha256": "3a7228f3b3880fd0b9769d825aeb74e823df97180eee1e00283f93211658ae50" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/15-codex-thermos-selects-vacuum-after0.png", + "sha256": "2ea09e8f46a7b88f2c801543c48dc6b4dfaeba5d25438543e032c7825cf9f514" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/pairs/15-codex-thermos-selects-vacuum.png", + "sha256": "58fd2e7b1f33dd00dbc0b0128d4d4c0f097c793c205050564dcb11844e477fa6" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/request-15-codex-thermos-selects.log", + "sha256": "7936e800403591dfaafee40d5099af854f7455bc266bf8b18250245d1b4cd5ef" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/request-15-codex-thermos-selects.exit.json", + "sha256": "b8f37f3349a022cac95cd51e6cb19818c5a699608b7f1e4343ba8ce27ef507e7" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/replay-visual-review-codex-prototype.json", + "sha256": "16547345efee20bce0a5f962ea9fac13803b24ac756b00e05293b51796cdb45e" + } + ], + "reviewedAt": "2026-10-20T07:03:24.156566+00:00" + }, + { + "revision": "prototype", + "provider": "codex", + "prompt": "thermos", + "width": 710, + "index": 2, + "label": "ReflectiveNonreflective", + "verdict": "dead", + "reason": "Real native Home/Enter to End/Enter changes displayed selection, but actual diagram and explanation remain unchanged. Read-only thermosState.params remains {}. Source supplies string-array options; frozen bridge expects option.value and rejects every intended choice.", + "sourceReplaySha256": "4ec3c141f937d2a3a6276e681e3a2b9021fd20c747094d7a893f2fee6aa1b2c2", + "evidence": [ + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/15-codex-thermos-selects-reflect-before2.png", + "sha256": "ae37dc8f9a7ab6852690761de47dc3a7cba3c981fc874905e1a279716a8769fa" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/15-codex-thermos-selects-reflect-after0.png", + "sha256": "8ff11c938a46f6ffe93bcb3d3f8822671a01e8d02ea8e6ac719e0d07fae0af36" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/pairs/15-codex-thermos-selects-reflect.png", + "sha256": "3f0ce121e5e86a6b9c031b9ed0f18b80e569d1d5d2a9d2e90ae5d62049688c42" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/request-15-codex-thermos-selects.log", + "sha256": "7936e800403591dfaafee40d5099af854f7455bc266bf8b18250245d1b4cd5ef" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/request-15-codex-thermos-selects.exit.json", + "sha256": "b8f37f3349a022cac95cd51e6cb19818c5a699608b7f1e4343ba8ce27ef507e7" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/replay-visual-review-codex-prototype.json", + "sha256": "16547345efee20bce0a5f962ea9fac13803b24ac756b00e05293b51796cdb45e" + } + ], + "reviewedAt": "2026-10-20T07:03:24.160314+00:00" + }, + { + "revision": "prototype", + "provider": "codex", + "prompt": "toaster", + "width": 710, + "index": 0, + "label": "Toasting cycle", + "verdict": "live", + "reason": "The actual End pair changes Ready to Released/heaters off and replaces the explanation with timer-end, latch release and spring-lift text. Source explicitly maps End to cycle 100; similar endpoint geometry does not negate the visible state/readout change.", + "sourceReplaySha256": "8b66dfff80073452140289f7e49e521edf9ea5be7b036aaa6633155066555141", + "evidence": [ + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/codex/toaster/width-710/control-0-key-End-before2.png", + "sha256": "de394e45b5517ed05a70be6b96a193094dc549d9d9ea9fe0b75769610e1c59e0" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/codex/toaster/width-710/control-0-key-End-after0.png", + "sha256": "a5daed47e2df761653a7e255f1f5d115af7d6648e8fe3a599fe319324aab8747" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/replay-pairs/prototype/codex/toaster-710-0.png", + "sha256": "1a321522fa1f39099a3e25f541262ddb789893865dd5f867bdb3dbbe8d886cdd" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/replay-visual-review-codex-prototype.json", + "sha256": "16547345efee20bce0a5f962ea9fac13803b24ac756b00e05293b51796cdb45e" + } + ], + "reviewedAt": "2026-10-20T07:03:24.164460+00:00" + }, + { + "revision": "prototype", + "provider": "codex", + "prompt": "toilet", + "width": 710, + "index": 1, + "label": "\u2190 Back", + "verdict": "live", + "reason": "Next enables Back; click returns Flush to Ready, restores tank level, closes flapper and changes explanation.", + "sourceReplaySha256": "a5fcea357e99e3116d250857f0477a4e8230b19e1052d4f01271ac2d444b9f8d", + "evidence": [ + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/04-codex-toilet-back-before2.png", + "sha256": "65b68393205b4947b9bf6969142c70e8dc7295d07f31433782a3153cf5d9c085" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/04-codex-toilet-back-after0.png", + "sha256": "17d76143c243a5406dab09833066e2be2aa0268ae2c47cd5dc170b3862473cb6" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/pairs/04-codex-toilet-back.png", + "sha256": "5916cc3fab734452fc0f2d957f0b6a7cb1b263cefcdd243d650b2ac17b6387a4" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/request-04-codex-toilet-back.log", + "sha256": "d95f08bb2b3a47b39952a1bb1d7d2c1bf6831dd263f04d9aadd81f7f7662a030" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/request-04-codex-toilet-back.exit.json", + "sha256": "8aa03246089bfea7a1830164742cefda1baba585a7e219f2e9b5d6564877535a" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/replay-visual-review-codex-prototype.json", + "sha256": "16547345efee20bce0a5f962ea9fac13803b24ac756b00e05293b51796cdb45e" + } + ], + "reviewedAt": "2026-10-20T07:03:24.168144+00:00" + }, + { + "revision": "prototype", + "provider": "codex", + "prompt": "umbrella", + "width": 710, + "index": 0, + "label": "Fig 1Manual umbrella \u00b7 section viewMove the runnerClosed", + "verdict": "live", + "reason": "The actual ArrowRight pair raises the runner, spreads ribs and fabric and changes Closed to the moving-ribs explanation. The source explicitly adjusts the target on ArrowRight; its easing animation follows that input rather than changing autonomously.", + "sourceReplaySha256": "679098d81ad5f331bf6e5954b5910c722e62ecf1fba15e33b0f2e4f2fb12ce05", + "evidence": [ + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/codex/umbrella/width-710/control-0-key-ArrowRight-before2.png", + "sha256": "fc23d8fed5574e0379d2b17e3a09060cf656d32e1cd57de05977fcf904a600c8" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/codex/umbrella/width-710/control-0-key-ArrowRight-after0.png", + "sha256": "11e807095da5571ea3f7482a9d07e83b4e4444fd90e12d5871660f7b97d1b59e" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/replay-pairs/prototype/codex/umbrella-710-0.png", + "sha256": "35571965c403cc5776501c12e0603d56cd44364d75945539073367a521f2cf3e" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/replay-visual-review-codex-prototype.json", + "sha256": "16547345efee20bce0a5f962ea9fac13803b24ac756b00e05293b51796cdb45e" + } + ], + "reviewedAt": "2026-10-20T07:03:24.173444+00:00" + }, + { + "revision": "prototype", + "provider": "codex", + "prompt": "washing-machine", + "width": 710, + "index": 0, + "label": "Cycle stage", + "verdict": "live", + "reason": "The actual selector pair changes Wash to Drain, lowers the water, colors the drain route and changes both readout and explanation. The source subscription changes stage only on input; the distinct drain output is not incidental drum animation.", + "sourceReplaySha256": "9496210a50ebbdba0ea911d4afec6d1baee475d1258e3b5f539be95ae665356b", + "evidence": [ + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/codex/washing-machine/width-710/control-0-primary-before2.png", + "sha256": "394292e7f5c387cc0aec28438735596e739d2f7e47b17f7bbf89f47373e69845" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/codex/washing-machine/width-710/control-0-primary-after0.png", + "sha256": "6eb8c54ff2c21a69b15ecb6a4f58e802644fa25d7ddd8958d44fd1d9d391f719" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/replay-pairs/prototype/codex/washing-machine-710-0.png", + "sha256": "34451c1993f94b76f9b24ab7896c49561ac04a572d3d4202e7c549b6de30ddf9" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/replay-visual-review-codex-prototype.json", + "sha256": "16547345efee20bce0a5f962ea9fac13803b24ac756b00e05293b51796cdb45e" + } + ], + "reviewedAt": "2026-10-20T07:03:24.179135+00:00" + }, + { + "revision": "prototype", + "provider": "codex", + "prompt": "washing-machine", + "width": 710, + "index": 1, + "label": "What the drawing simplifies", + "verdict": "live", + "reason": "Actual click frames show the full simplification text present before and hidden after the summary click. This is a working native disclosure collapse, despite the automatic aligned-region proof failing when text disappears; the source uses details/summary.", + "sourceReplaySha256": "9496210a50ebbdba0ea911d4afec6d1baee475d1258e3b5f539be95ae665356b", + "evidence": [ + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/codex/washing-machine/width-710/control-1-click-before2.png", + "sha256": "892ae27382ce2f043d281bd8dfabfa08d45f9b92fd3f010d532ebab5047885ba" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/codex/washing-machine/width-710/control-1-click-after0.png", + "sha256": "f22364abe4eba3d5441873708daf5783e217fc41d6de03e491172bb845e4fa17" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/replay-visual-review-codex-prototype.json", + "sha256": "16547345efee20bce0a5f962ea9fac13803b24ac756b00e05293b51796cdb45e" + } + ], + "reviewedAt": "2026-10-20T07:03:24.183528+00:00" + }, + { + "revision": "prototype", + "provider": "codex", + "prompt": "websocket", + "width": 710, + "index": 1, + "label": "\u2190 Back", + "verdict": "live", + "reason": "Next enables Back; click returns Send to Connection opened, moves packet back to sender and updates explanation.", + "sourceReplaySha256": "58fafd916565d91e6dcdd18b63f58e33ee5c2f4a6657a6b0a588bf610c5a7737", + "evidence": [ + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/04-codex-websocket-back-before2.png", + "sha256": "ca8c3713ea0d94cc59d7e1d766f8f61839163951d0ed8582cbaf10a2524246f3" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/04-codex-websocket-back-after0.png", + "sha256": "4a61797351732c377e6214845da40c54217a791f769e966c4e4ad76f8e0e246d" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/pairs/04-codex-websocket-back.png", + "sha256": "c12064a9920693f90d61ffdeba269862ee7c3ff92006d8081da7c23e4160dec8" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/request-04-codex-websocket-back.log", + "sha256": "2b777651599345db21cc11f5a801815621bfa65c09c9090fd5dcd3494b0ae5c1" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/request-04-codex-websocket-back.exit.json", + "sha256": "0eec48972ef017d5ef78e9cc51ea6db57523c40065d5ef346be1bfb200544377" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/replay-visual-review-codex-prototype.json", + "sha256": "16547345efee20bce0a5f962ea9fac13803b24ac756b00e05293b51796cdb45e" + } + ], + "reviewedAt": "2026-10-20T07:03:24.188918+00:00" + }, + { + "revision": "prototype", + "provider": "codex", + "prompt": "websocket", + "width": 710, + "index": 3, + "label": "What this model assumes", + "verdict": "live", + "reason": "Actual summary click expands the previously hidden explanatory paragraphs; read-only details.open changes false to true and actual PNGs show the new text.", + "sourceReplaySha256": "58fafd916565d91e6dcdd18b63f58e33ee5c2f4a6657a6b0a588bf610c5a7737", + "evidence": [ + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/17-codex-websocket-disclosure-before2.png", + "sha256": "4a61797351732c377e6214845da40c54217a791f769e966c4e4ad76f8e0e246d" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/17-codex-websocket-disclosure-after0.png", + "sha256": "c268b03eff463c50260341d96061c621f8250546a1ba0512eee0a7b7ce0e2e4f" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/pairs/17-codex-websocket-disclosure.png", + "sha256": "25543093e18aa9b003bcb5deaa33217ab0f6831ea9deb481204b1ac44ff8d189" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/request-17-codex-websocket-disclosure.log", + "sha256": "896fe886cde6809533941e117b9b2e9eb4446a6b2a89cb56a22a3e253c2dd3d6" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/request-17-codex-websocket-disclosure.exit.json", + "sha256": "af3e35e9469cc463ec33fbc9980a7b08e2339df55f0aa26ac9bc9b6c5faa8652" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/replay-visual-review-codex-prototype.json", + "sha256": "16547345efee20bce0a5f962ea9fac13803b24ac756b00e05293b51796cdb45e" + } + ], + "reviewedAt": "2026-10-20T07:03:24.194242+00:00" + }, + { + "revision": "prototype", + "provider": "codex", + "prompt": "zipper", + "width": 710, + "index": 0, + "label": "Zipper slider position; up closes and down opens", + "verdict": "live", + "reason": "The actual End pair moves the slider from the bottom to the top and joins the tooth rows below it. The source explicitly supports End and sets position 100; no autonomous motion exists.", + "sourceReplaySha256": "7f65dabb87c02c0835be319aed69e781f3a7cb333cebe528eb5eed7c7b85ba9b", + "evidence": [ + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/codex/zipper/width-710/control-0-key-End-before2.png", + "sha256": "45b6b6183233d8670b3e5df9640f1e9e312378a32b1db05615c215e4d430a5c1" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/codex/zipper/width-710/control-0-key-End-after0.png", + "sha256": "d01a369c190787bae946fe05b88dba943edbbc2901b079418e46ebcf153ce978" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/replay-pairs/prototype/codex/zipper-710-0.png", + "sha256": "fcc061d777e3f4bef29606951cc1a247411519cd5276130b4a3236d8ea41b8b0" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/replay-visual-review-codex-prototype.json", + "sha256": "16547345efee20bce0a5f962ea9fac13803b24ac756b00e05293b51796cdb45e" + } + ], + "reviewedAt": "2026-10-20T07:03:24.198816+00:00" + }, + { + "revision": "prototype", + "provider": "codex", + "prompt": "cdn", + "width": 710, + "index": 2, + "label": "Edge AEdge BEdge C", + "verdict": "dead", + "reason": "Partial control: real native Home/Enter then End/Enter should select last option Edge C but settles at Edge B, confirmed in actual PNG and params.region1. Missing valid string schema/bounds clamps intended region2 to1. A\u2192B response is real, but advertised Edge C never works.", + "sourceReplaySha256": "82626a0e95d104eca2455528a68df908732bd1fae7d95c0256d30ff5449bf405", + "evidence": [ + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/30-codex-cdn-region-before2.png", + "sha256": "c893fa5d4d69a0047b4ce237a4dff5914a90871ba6b3bf93d5176dd43a77a553" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/30-codex-cdn-region-after0.png", + "sha256": "e02fa1afe1c2963fa17ce6ee8cb366e5727fb36047e1722c3df523763b5b1c5e" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/pairs/30-codex-cdn-region.png", + "sha256": "528ff7d7ee02fe44bbf22ea531129e923f1bb1818d53e20aa5501de61a224a87" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/request-30-codex-cdn-region.log", + "sha256": "67a3d87b78b0819cce3385fe3a024ef14348e9622bc72e7364040d325f26b2ce" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/request-30-codex-cdn-region.exit.json", + "sha256": "3231e9a8959bae36cf0a55b3eb0454312f25d65a461efd343eb13b00e2d76785" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/replay-visual-review-codex-prototype.json", + "sha256": "16547345efee20bce0a5f962ea9fac13803b24ac756b00e05293b51796cdb45e" + } + ], + "reviewedAt": "2026-10-20T07:03:24.206161+00:00" + } + ] +} diff --git a/plugins/playgrounds/evals/launch/reports/gate-1/provenance.json b/plugins/playgrounds/evals/launch/reports/gate-1/provenance.json new file mode 100644 index 000000000..4318006e5 --- /dev/null +++ b/plugins/playgrounds/evals/launch/reports/gate-1/provenance.json @@ -0,0 +1,70 @@ +{ + "rawRoot": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results", + "sourceEvidence": [ + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/conditions.json", + "sha256": "afe4a544807236927e411f77d693c92eae1e2de3efacc04cc0855cf3bd3bfaf8" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/personal-baseline-evidence.json", + "sha256": "7e030d0b00dd584f9894b4cdda6808478abba6d38e32efa94c3c7ab89e341edc" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/question-adjudications.json", + "sha256": "946fb88f6c00baa20d046485302111ffe945bff7789161f8dd3ec68d7b93d8a1" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/interruption-evidence.json", + "sha256": "af340bb498ed1561a59789626148617736f5a6bab6c192e6bcd5a50fa40bd756" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/manual-control-adjudications.json", + "sha256": "902a67a1fc70c68a0289fc385ca55ea1decd0e8132a6acefb550960ec7abb4f5" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/supplemental-control-adjudications.json", + "sha256": "d99b43a2beee1c7205b89691fd0f86613f084b1defe9f46d4745119146b5b82d" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/replay-visual-review.json", + "sha256": "ec82ec6c8ce19e85996f54981c35eb2c5fc5b6478e8598262e38bca170d720c7" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/replay-visual-review-codex-baseline.json", + "sha256": "cd060b6469f414432b932d3c469ac7e7af83e70281c25bc46a18d43a2babce23" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/replay-visual-review-codex-baseline-manual.json", + "sha256": "efe8447a9875190d36a00b0ef07d3c9c2764806b5f57feefd9045bd4ad50fef4" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/replay-visual-review-codex-prototype.json", + "sha256": "16547345efee20bce0a5f962ea9fac13803b24ac756b00e05293b51796cdb45e" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/replay-visual-review-claude-prototype-extra.json", + "sha256": "0abc97cd13644b65b43df59c4200db4099692acb096490c4aca7ddb9095f1092" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/control-audit-claude.json", + "sha256": "17ed9309990a1f529dc8b23a64a9eb78cb43d5fdff82a06c81d521e5b48af173" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/control-audit-codex.json", + "sha256": "c3f5cb85249d659604c2065e8ad2a7a3912c57ea60cbae921510bff0f5ba713d" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/claude-timing-analysis.json", + "sha256": "11acb26b65c013ece7e11666c181222ef91f5b8d67bf493f42759e15a836dc20" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/claude-full-prototype-timing.json", + "sha256": "9e44adddb7714e3a93534b11b31ff02c0eb8a1bd0ca6d9cc306620b73d3c5e4e" + } + ], + "replayScript": { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/rescore-saved.mjs", + "sha256": "b7e9cfb08c8af6e5fa17ae75b07c18a79efc0e7048b3d1f6210cb97570b2c522" + }, + "note": "PNG and event evidence is retained at the linked worktree paths. No original evidence was overwritten; runs.json hashes bind each original result and replay." +} diff --git a/plugins/playgrounds/evals/launch/reports/gate-1/replay-visual-review-claude-prototype-extra.json b/plugins/playgrounds/evals/launch/reports/gate-1/replay-visual-review-claude-prototype-extra.json new file mode 100644 index 000000000..e15c2229d --- /dev/null +++ b/plugins/playgrounds/evals/launch/reports/gate-1/replay-visual-review-claude-prototype-extra.json @@ -0,0 +1,2408 @@ +{ + "manualReview": { + "complete": true, + "controlsReviewed": 6, + "requestNumbers": [ + 20, + 21, + 22, + 23, + 25, + 26, + 27, + 28 + ], + "note": "Worker inspected logs and actual before/after PNGs from the root-owned existing manual replay; no generation or browser launched by reviewer." + }, + "provider": "claude-code", + "label": "prototype", + "revision": "f009de5838f80b90e861e5727f0ad11cba8814f8", + "pluginRevision": "9de99949792c2c59b70693c1dcda6aa8cf36b428", + "complete": true, + "reviewedPrompts": [ + "spray-bottle", + "seat-belt", + "toaster", + "umbrella", + "database-index", + "git-merge", + "websocket", + "load-balancer", + "notification-settings", + "narrow-toggle" + ], + "controls": [ + { + "revision": "f009de5838f80b90e861e5727f0ad11cba8814f8", + "pluginRevision": "9de99949792c2c59b70693c1dcda6aa8cf36b428", + "provider": "claude-code", + "prompt": "spray-bottle", + "width": 710, + "index": 0, + "label": "Trigger sprayer: arrow keys squeeze and release the trigger, space toggles auto pump", + "verdict": "live", + "reason": "Supported End key moves the piston from rest to full squeeze, compresses the spring and moves the trigger; readout changes from Rest/cylinder full to Held/both valves shut. The source End handler sets trigger=100 and disables auto pump, so the geometry is input-caused rather than ambient settling.", + "mode": "key-End", + "automaticPass": true, + "v3Result": { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/claude-code/spray-bottle/result.json", + "sha256": "28ba789bc8819e5513e5c01700e81accc9bda869360362ec66a264c789345cdc" + }, + "evidence": [ + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/claude-code/spray-bottle/width-710/control-0-key-End-before2.png", + "sha256": "68f192049e10a3b6ff2b20ec959bf1809dd5939f04bba84c7f1bdb9c80621c7f", + "role": "before2" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/claude-code/spray-bottle/width-710/control-0-key-End-after0.png", + "sha256": "a706e04730eb8313640a9bca027d8201db86e38051484b837402c23d70e44d77", + "role": "after0" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/replay-pairs/prototype/claude-code/spray-bottle-710-0.png", + "sha256": "e75188fe2cd4b0f6701505d764ad953ee4706ad29d9f431defb79cea03d9cc64", + "role": "visually inspected comparison" + } + ], + "allProbeFrames": [ + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/claude-code/spray-bottle/width-710/control-0-key-End-before0.png", + "sha256": "68f192049e10a3b6ff2b20ec959bf1809dd5939f04bba84c7f1bdb9c80621c7f" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/claude-code/spray-bottle/width-710/control-0-key-End-before1.png", + "sha256": "68f192049e10a3b6ff2b20ec959bf1809dd5939f04bba84c7f1bdb9c80621c7f" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/claude-code/spray-bottle/width-710/control-0-key-End-before2.png", + "sha256": "68f192049e10a3b6ff2b20ec959bf1809dd5939f04bba84c7f1bdb9c80621c7f" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/claude-code/spray-bottle/width-710/control-0-key-End-after0.png", + "sha256": "a706e04730eb8313640a9bca027d8201db86e38051484b837402c23d70e44d77" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/claude-code/spray-bottle/width-710/control-0-key-End-after1.png", + "sha256": "35d2b9c0ce249d307f0b8f610834a13db04211b334078da63ae390dfe1bc1bc4" + } + ], + "source": { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/manual-plan-sources/prototype-claude-code-spray-bottle.html", + "sha256": "64b7cf6c2b536263592a227d9d9321b7e9e2f4b7313d5d3a0959881468b9c4f1" + }, + "identityMatch": true, + "oldIdentity": { + "index": 0, + "label": "Trigger sprayer: arrow keys squeeze and release the trigger, space toggles auto pump", + "tag": "div", + "type": "slider" + }, + "runtimeErrors": [], + "visuallyInspected": true + }, + { + "revision": "f009de5838f80b90e861e5727f0ad11cba8814f8", + "pluginRevision": "9de99949792c2c59b70693c1dcda6aa8cf36b428", + "provider": "claude-code", + "prompt": "spray-bottle", + "width": 710, + "index": 3, + "label": "Spray", + "verdict": "live", + "reason": "The before frame shows a narrow stream with Stream selected; the additionally inspected after1 frame shows a broad spray cone with Spray selected. Source nozzle-mode handler changes spread from 0.02 to 0.36; auto pumping supplies the squeeze, and the mode-specific pattern proves this control despite moving pixels failing the static threshold.", + "mode": "primary", + "automaticPass": false, + "v3Result": { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/claude-code/spray-bottle/result.json", + "sha256": "28ba789bc8819e5513e5c01700e81accc9bda869360362ec66a264c789345cdc" + }, + "evidence": [ + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/claude-code/spray-bottle/width-710/control-3-primary-before2.png", + "sha256": "9557693b9358cca7a81ad362065e7a244adcf9a4547fbd18b165d82a52ba84ca", + "role": "before2" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/claude-code/spray-bottle/width-710/control-3-primary-after0.png", + "sha256": "ca5487c4364dba92c516edb62b8796b43a46e631bea1f2b98e5dc022a5cc113c", + "role": "after0" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/replay-pairs/prototype/claude-code/spray-bottle-710-3.png", + "sha256": "eb92f4e797780ae73a370c36985f3c43dcb2f6bec9da600e332a2146982ffdc4", + "role": "visually inspected comparison" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/claude-code/spray-bottle/width-710/control-3-primary-after1.png", + "sha256": "7b56e135a4890427f4c87c70726b17d465a9ae723816c7e31830340c6edf67d6", + "role": "additional inspected evidence" + } + ], + "allProbeFrames": [ + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/claude-code/spray-bottle/width-710/control-3-primary-before0.png", + "sha256": "7546ae289cab612db81621fd34a8df133cc916196b88fcb255d5a0b52acaa344" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/claude-code/spray-bottle/width-710/control-3-primary-before1.png", + "sha256": "8360ef1265e1ed69e3e046249eb0e1f0d0a6103c381ddf702dcb463db1f45233" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/claude-code/spray-bottle/width-710/control-3-primary-before2.png", + "sha256": "9557693b9358cca7a81ad362065e7a244adcf9a4547fbd18b165d82a52ba84ca" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/claude-code/spray-bottle/width-710/control-3-primary-after0.png", + "sha256": "ca5487c4364dba92c516edb62b8796b43a46e631bea1f2b98e5dc022a5cc113c" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/claude-code/spray-bottle/width-710/control-3-primary-after1.png", + "sha256": "7b56e135a4890427f4c87c70726b17d465a9ae723816c7e31830340c6edf67d6" + } + ], + "source": { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/manual-plan-sources/prototype-claude-code-spray-bottle.html", + "sha256": "64b7cf6c2b536263592a227d9d9321b7e9e2f4b7313d5d3a0959881468b9c4f1" + }, + "identityMatch": true, + "oldIdentity": { + "index": 3, + "label": "Spray", + "tag": "button", + "type": "submit" + }, + "runtimeErrors": [], + "visuallyInspected": true + }, + { + "revision": "f009de5838f80b90e861e5727f0ad11cba8814f8", + "pluginRevision": "9de99949792c2c59b70693c1dcda6aa8cf36b428", + "provider": "claude-code", + "prompt": "spray-bottle", + "width": 710, + "index": 4, + "label": "Stream", + "verdict": "live", + "reason": "Before shows the broad spray droplets and Spray selected; after0 shows a narrow contiguous stream with Stream selected. The source stream branch changes particle spread/radius/speed, matching the visible pattern. Later after1 is the refill phase, explaining why persistent-pixel scoring remains unproven.", + "mode": "primary", + "automaticPass": false, + "v3Result": { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/claude-code/spray-bottle/result.json", + "sha256": "28ba789bc8819e5513e5c01700e81accc9bda869360362ec66a264c789345cdc" + }, + "evidence": [ + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/claude-code/spray-bottle/width-710/control-4-primary-before2.png", + "sha256": "960a7f6d4431d9f9993bd7181dd4f598f58117502d000da7c4e386a9cecfa893", + "role": "before2" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/claude-code/spray-bottle/width-710/control-4-primary-after0.png", + "sha256": "c4a4823a3d9715609dcee28da9d2654e4bcca3d60b3516cd257e39f535a33751", + "role": "after0" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/replay-pairs/prototype/claude-code/spray-bottle-710-4.png", + "sha256": "98d0af991b3fac96ba5d407792256a585971e108ff783741facc807e036e7b57", + "role": "visually inspected comparison" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/claude-code/spray-bottle/width-710/control-4-primary-after1.png", + "sha256": "16ce584b8b21b904f6ff5fca04fea55ebdaf35a21a3cc2e40ee5ba555768fd24", + "role": "additional inspected evidence" + } + ], + "allProbeFrames": [ + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/claude-code/spray-bottle/width-710/control-4-primary-before0.png", + "sha256": "0063864664d673003d645a48b9aeec030a3b5d455d547cb8b23a5e11d62d17fc" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/claude-code/spray-bottle/width-710/control-4-primary-before1.png", + "sha256": "f70e9e5ee20061b9da0cbab83bdeed192171cf1ca549a590bad1130bca0c1a47" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/claude-code/spray-bottle/width-710/control-4-primary-before2.png", + "sha256": "960a7f6d4431d9f9993bd7181dd4f598f58117502d000da7c4e386a9cecfa893" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/claude-code/spray-bottle/width-710/control-4-primary-after0.png", + "sha256": "c4a4823a3d9715609dcee28da9d2654e4bcca3d60b3516cd257e39f535a33751" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/claude-code/spray-bottle/width-710/control-4-primary-after1.png", + "sha256": "16ce584b8b21b904f6ff5fca04fea55ebdaf35a21a3cc2e40ee5ba555768fd24" + } + ], + "source": { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/manual-plan-sources/prototype-claude-code-spray-bottle.html", + "sha256": "64b7cf6c2b536263592a227d9d9321b7e9e2f4b7313d5d3a0959881468b9c4f1" + }, + "identityMatch": true, + "oldIdentity": { + "index": 4, + "label": "Stream", + "tag": "button", + "type": "submit" + }, + "runtimeErrors": [], + "visuallyInspected": true + }, + { + "revision": "f009de5838f80b90e861e5727f0ad11cba8814f8", + "pluginRevision": "9de99949792c2c59b70693c1dcda6aa8cf36b428", + "provider": "claude-code", + "prompt": "spray-bottle", + "width": 710, + "index": 5, + "label": "Off", + "verdict": "live", + "reason": "Off stops ejection and restores the trigger while both after frames display Nozzle shut / water cannot compress / trigger is stuck. This is the source nozzle-off hydraulic lock branch, not merely selected-button styling; automatic pump remains enabled.", + "mode": "primary", + "automaticPass": false, + "v3Result": { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/claude-code/spray-bottle/result.json", + "sha256": "28ba789bc8819e5513e5c01700e81accc9bda869360362ec66a264c789345cdc" + }, + "evidence": [ + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/claude-code/spray-bottle/width-710/control-5-primary-before2.png", + "sha256": "aa41dae105160cf8fb8de9ac557e1b0a20a2e73f37f17c966447288e695c4369", + "role": "before2" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/claude-code/spray-bottle/width-710/control-5-primary-after0.png", + "sha256": "5f6b12926e0adae8ac497825fbae0d4665417cc9b6b7283b4d879892ac22d17a", + "role": "after0" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/replay-pairs/prototype/claude-code/spray-bottle-710-5.png", + "sha256": "da1d8c414c3d7a4f456439b9e0eebfc19c656bfbbd27ae67f8a6ea534a5452bc", + "role": "visually inspected comparison" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/claude-code/spray-bottle/width-710/control-5-primary-after1.png", + "sha256": "5f6b12926e0adae8ac497825fbae0d4665417cc9b6b7283b4d879892ac22d17a", + "role": "additional inspected evidence" + } + ], + "allProbeFrames": [ + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/claude-code/spray-bottle/width-710/control-5-primary-before0.png", + "sha256": "ccda36398ebf95f507a1d0f8576de353392650c9da971882043b33c25879988a" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/claude-code/spray-bottle/width-710/control-5-primary-before1.png", + "sha256": "e69e9ed4bd3c0e2a76114f41d9477cf95daf059fb5822f56318614782c5235f5" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/claude-code/spray-bottle/width-710/control-5-primary-before2.png", + "sha256": "aa41dae105160cf8fb8de9ac557e1b0a20a2e73f37f17c966447288e695c4369" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/claude-code/spray-bottle/width-710/control-5-primary-after0.png", + "sha256": "5f6b12926e0adae8ac497825fbae0d4665417cc9b6b7283b4d879892ac22d17a" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/claude-code/spray-bottle/width-710/control-5-primary-after1.png", + "sha256": "5f6b12926e0adae8ac497825fbae0d4665417cc9b6b7283b4d879892ac22d17a" + } + ], + "source": { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/manual-plan-sources/prototype-claude-code-spray-bottle.html", + "sha256": "64b7cf6c2b536263592a227d9d9321b7e9e2f4b7313d5d3a0959881468b9c4f1" + }, + "identityMatch": true, + "oldIdentity": { + "index": 5, + "label": "Off", + "tag": "button", + "type": "submit" + }, + "runtimeErrors": [], + "visuallyInspected": true + }, + { + "revision": "f009de5838f80b90e861e5727f0ad11cba8814f8", + "pluginRevision": "9de99949792c2c59b70693c1dcda6aa8cf36b428", + "provider": "claude-code", + "prompt": "seat-belt", + "width": 710, + "index": 0, + "label": "Seat belt retractor: arrow keys change braking in g, M switches between car braking and belt yank", + "verdict": "live", + "reason": "Supported Home key changes braking from 0.80 g (locked by pendulum after 22 mm) to 0.00 g (free, 0 mm out), with the pendulum and pawl visibly returning. Source Home sets zero and reduced-motion settles the model deterministically, so the change is not autonomous timing or focus outline.", + "mode": "key-Home", + "automaticPass": true, + "v3Result": { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/claude-code/seat-belt/result.json", + "sha256": "c7930d7ce27161e2f6db9c33fae187bc1a6096de83a94177fa1eb912bf226203" + }, + "evidence": [ + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/claude-code/seat-belt/width-710/control-0-key-Home-before2.png", + "sha256": "8e75fb45b4cd262123fa48f6374d143d1f7628a41a9290a9aed4c263034485b4", + "role": "before2" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/claude-code/seat-belt/width-710/control-0-key-Home-after0.png", + "sha256": "77312cf9f29da412522a4da144e039fe99b80ba31db43fe0ac856421277a771b", + "role": "after0" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/replay-pairs/prototype/claude-code/seat-belt-710-0.png", + "sha256": "fa1e290a364581ca2a5f65456ab9f424ea0715bf77ee680ff0173b59c0f0bb22", + "role": "visually inspected comparison" + } + ], + "allProbeFrames": [ + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/claude-code/seat-belt/width-710/control-0-key-Home-before0.png", + "sha256": "8e75fb45b4cd262123fa48f6374d143d1f7628a41a9290a9aed4c263034485b4" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/claude-code/seat-belt/width-710/control-0-key-Home-before1.png", + "sha256": "8e75fb45b4cd262123fa48f6374d143d1f7628a41a9290a9aed4c263034485b4" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/claude-code/seat-belt/width-710/control-0-key-Home-before2.png", + "sha256": "8e75fb45b4cd262123fa48f6374d143d1f7628a41a9290a9aed4c263034485b4" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/claude-code/seat-belt/width-710/control-0-key-Home-after0.png", + "sha256": "77312cf9f29da412522a4da144e039fe99b80ba31db43fe0ac856421277a771b" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/claude-code/seat-belt/width-710/control-0-key-Home-after1.png", + "sha256": "77312cf9f29da412522a4da144e039fe99b80ba31db43fe0ac856421277a771b" + } + ], + "source": { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/manual-plan-sources/prototype-claude-code-seat-belt.html", + "sha256": "41190537ac251fe5e24de5c1758109a12ec82feaa19899fab601144482d497b4" + }, + "identityMatch": true, + "oldIdentity": { + "index": 0, + "label": "Seat belt retractor: arrow keys change braking in g, M switches between car braking and belt yank", + "tag": "div", + "type": "slider" + }, + "runtimeErrors": [], + "visuallyInspected": true + }, + { + "revision": "f009de5838f80b90e861e5727f0ad11cba8814f8", + "pluginRevision": "9de99949792c2c59b70693c1dcda6aa8cf36b428", + "provider": "claude-code", + "prompt": "toaster", + "width": 710, + "index": 0, + "label": "Toaster: Space presses the lever, arrow keys set browning", + "verdict": "live", + "reason": "Stage click invokes the supported press/cancel handler. Before shows popped bread with lever raised; after shows bread lowered, compressed spring, hot element and active strip temperature/time. This is a new toast cycle started by the click, not focus styling.", + "mode": "click", + "automaticPass": true, + "v3Result": { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/claude-code/toaster/result.json", + "sha256": "bc3162d90a3cd8d580b656dda4f6f2925dcff4f949ff8c3e40288a88d0f70dc4" + }, + "evidence": [ + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/claude-code/toaster/width-710/control-0-click-before2.png", + "sha256": "26625947e9dfd68f8b970cab98a651568a63d93ab31ce61e2a1b043ae7d4dd8e", + "role": "before2" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/claude-code/toaster/width-710/control-0-click-after0.png", + "sha256": "914eb9255ae96301417d430506414476cf2f48ac0c2db538ba280101b15b9798", + "role": "after0" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/replay-pairs/prototype/claude-code/toaster-710-0.png", + "sha256": "07d903ecfb11c92b6725e06b623191facc307205b976edcb91f9690ebb84563b", + "role": "visually inspected comparison" + } + ], + "allProbeFrames": [ + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/claude-code/toaster/width-710/control-0-click-before0.png", + "sha256": "26625947e9dfd68f8b970cab98a651568a63d93ab31ce61e2a1b043ae7d4dd8e" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/claude-code/toaster/width-710/control-0-click-before1.png", + "sha256": "26625947e9dfd68f8b970cab98a651568a63d93ab31ce61e2a1b043ae7d4dd8e" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/claude-code/toaster/width-710/control-0-click-before2.png", + "sha256": "26625947e9dfd68f8b970cab98a651568a63d93ab31ce61e2a1b043ae7d4dd8e" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/claude-code/toaster/width-710/control-0-click-after0.png", + "sha256": "914eb9255ae96301417d430506414476cf2f48ac0c2db538ba280101b15b9798" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/claude-code/toaster/width-710/control-0-click-after1.png", + "sha256": "c38e6e6bb6e3c65b0c434cb97f867bb8671d7429f5e9cc74db0118ce37164cdb" + } + ], + "source": { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/manual-plan-sources/prototype-claude-code-toaster.html", + "sha256": "9d73dc1a14e2688732a0f1c3dea922b07f2d9e35f50da54a23ce89a2f0f9b21a" + }, + "identityMatch": true, + "oldIdentity": { + "index": 0, + "label": "Toaster: Space presses the lever, arrow keys set browning", + "tag": "div", + "type": "slider" + }, + "runtimeErrors": [], + "visuallyInspected": true + }, + { + "revision": "f009de5838f80b90e861e5727f0ad11cba8814f8", + "pluginRevision": "9de99949792c2c59b70693c1dcda6aa8cf36b428", + "provider": "claude-code", + "prompt": "toaster", + "width": 710, + "index": 2, + "label": "tw-browning", + "verdict": "live", + "reason": "Browning drag changes dial 2 to 5.5, visibly rotates the drawn dial and moves the trip stop; predicted next pop time changes from about 1:23 to 3:30 and remains 3:30 in after1. Previous pop time stays 1:23, so the new prediction is caused by browning rather than ongoing heating.", + "mode": "drag", + "automaticPass": false, + "v3Result": { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/claude-code/toaster/result.json", + "sha256": "bc3162d90a3cd8d580b656dda4f6f2925dcff4f949ff8c3e40288a88d0f70dc4" + }, + "evidence": [ + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/claude-code/toaster/width-710/control-2-drag-before2.png", + "sha256": "fe0744a2b937e292c081ae7fba4d136479ca7a4b9506554b2e07e07cfaeb95d3", + "role": "before2" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/claude-code/toaster/width-710/control-2-drag-after0.png", + "sha256": "874ff9b79d0b4ea4ea6fa77fdfcecb52128187af2286192709f2de4784612cc3", + "role": "after0" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/replay-pairs/prototype/claude-code/toaster-710-2.png", + "sha256": "7f9b72f18b5a455145d9ef5fc4f36e3bcb6d354dda6452b3a50af849b60a3312", + "role": "visually inspected comparison" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/claude-code/toaster/width-710/control-2-drag-after1.png", + "sha256": "874ff9b79d0b4ea4ea6fa77fdfcecb52128187af2286192709f2de4784612cc3", + "role": "additional inspected evidence" + } + ], + "allProbeFrames": [ + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/claude-code/toaster/width-710/control-2-drag-before0.png", + "sha256": "1edda726ffb79113a17b8fafaa9dd08aea2fd26a97be012385da5c69d5c1bce1" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/claude-code/toaster/width-710/control-2-drag-before1.png", + "sha256": "55b9ea362e53c7c3ff2c3007aa5311988956de3f876d34554f5280633ffc11bd" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/claude-code/toaster/width-710/control-2-drag-before2.png", + "sha256": "fe0744a2b937e292c081ae7fba4d136479ca7a4b9506554b2e07e07cfaeb95d3" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/claude-code/toaster/width-710/control-2-drag-after0.png", + "sha256": "874ff9b79d0b4ea4ea6fa77fdfcecb52128187af2286192709f2de4784612cc3" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/claude-code/toaster/width-710/control-2-drag-after1.png", + "sha256": "874ff9b79d0b4ea4ea6fa77fdfcecb52128187af2286192709f2de4784612cc3" + } + ], + "source": { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/manual-plan-sources/prototype-claude-code-toaster.html", + "sha256": "9d73dc1a14e2688732a0f1c3dea922b07f2d9e35f50da54a23ce89a2f0f9b21a" + }, + "identityMatch": true, + "oldIdentity": { + "index": 2, + "label": "tw-browning", + "tag": "input", + "type": "range" + }, + "runtimeErrors": [], + "visuallyInspected": true + }, + { + "revision": "f009de5838f80b90e861e5727f0ad11cba8814f8", + "pluginRevision": "9de99949792c2c59b70693c1dcda6aa8cf36b428", + "provider": "claude-code", + "prompt": "database-index", + "width": 710, + "index": 0, + "label": "B-tree lookup: arrow keys pick the id, i toggles the index", + "verdict": "live", + "reason": "Supported ArrowRight changes lookup id from 420,000 to 530,000, updates the explanation and highlights a different leaf/table route. Source increments normalized key by 11; reduced-motion uses the final lookup state, excluding an autonomous tour.", + "mode": "key-ArrowRight", + "automaticPass": true, + "v3Result": { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/claude-code/database-index/result.json", + "sha256": "f90dc75b9440f9d4fe4901979b5f87522573eee11c3b73d0c7448858c8f141d2" + }, + "evidence": [ + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/claude-code/database-index/width-710/control-0-key-ArrowRight-before2.png", + "sha256": "699b860a785ecc17c67c780587eca30a056219824d8048d16771c8b1301e8058", + "role": "before2" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/claude-code/database-index/width-710/control-0-key-ArrowRight-after0.png", + "sha256": "7bb410ef251f1322ab21b10c59333dd3084b985c34896b40ab6c1cae9f48117b", + "role": "after0" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/replay-pairs/prototype/claude-code/database-index-710-0.png", + "sha256": "7e8a2fca6a42bced48f6f9513135df0c93946e42174ef40e5ba1ede146244bf4", + "role": "visually inspected comparison" + } + ], + "allProbeFrames": [ + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/claude-code/database-index/width-710/control-0-key-ArrowRight-before0.png", + "sha256": "294720bda4e839fb595eb8c59b08d94774f36ed12e912d0e062bb5842e4a5f19" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/claude-code/database-index/width-710/control-0-key-ArrowRight-before1.png", + "sha256": "699b860a785ecc17c67c780587eca30a056219824d8048d16771c8b1301e8058" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/claude-code/database-index/width-710/control-0-key-ArrowRight-before2.png", + "sha256": "699b860a785ecc17c67c780587eca30a056219824d8048d16771c8b1301e8058" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/claude-code/database-index/width-710/control-0-key-ArrowRight-after0.png", + "sha256": "7bb410ef251f1322ab21b10c59333dd3084b985c34896b40ab6c1cae9f48117b" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/claude-code/database-index/width-710/control-0-key-ArrowRight-after1.png", + "sha256": "7bb410ef251f1322ab21b10c59333dd3084b985c34896b40ab6c1cae9f48117b" + } + ], + "source": { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/manual-plan-sources/prototype-claude-code-database-index.html", + "sha256": "9138294e7cc0a66a8d7cc02920bbfd5cd3c7c40f50871a1e1a66b4a7b1b9fe2c" + }, + "identityMatch": true, + "oldIdentity": { + "index": 0, + "label": "B-tree lookup: arrow keys pick the id, i toggles the index", + "tag": "div", + "type": "slider" + }, + "runtimeErrors": [], + "visuallyInspected": true + }, + { + "revision": "f009de5838f80b90e861e5727f0ad11cba8814f8", + "pluginRevision": "9de99949792c2c59b70693c1dcda6aa8cf36b428", + "provider": "claude-code", + "prompt": "database-index", + "width": 710, + "index": 1, + "label": "No index", + "verdict": "live", + "reason": "No index click changes B-tree 4 page reads to Full scan 10,000 page reads and rewrites the explanation. Body height shrinks, but actual calculated output changes, matching the index=false branch.", + "mode": "primary", + "automaticPass": true, + "v3Result": { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/claude-code/database-index/result.json", + "sha256": "f90dc75b9440f9d4fe4901979b5f87522573eee11c3b73d0c7448858c8f141d2" + }, + "evidence": [ + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/claude-code/database-index/width-710/control-1-primary-before2.png", + "sha256": "a785a229987db801daa2ea58f38c220b7f51d35cf6a76fa433a28eb8d2923d4a", + "role": "before2" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/claude-code/database-index/width-710/control-1-primary-after0.png", + "sha256": "05ee9dd6fd0b8069b436fb76f9eb2cbe37bbe0c3b8021a4faadc834f7f4fb195", + "role": "after0" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/replay-pairs/prototype/claude-code/database-index-710-1.png", + "sha256": "736053a033181a27bc18a3bef303f5da6f00dbf9add72845a6a0db71a9ec8b1a", + "role": "visually inspected comparison" + } + ], + "allProbeFrames": [ + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/claude-code/database-index/width-710/control-1-primary-before0.png", + "sha256": "c583a2d9d171b6e40b45f78c1843536c5b00cb1154800b10a4a098d83b5168e6" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/claude-code/database-index/width-710/control-1-primary-before1.png", + "sha256": "a785a229987db801daa2ea58f38c220b7f51d35cf6a76fa433a28eb8d2923d4a" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/claude-code/database-index/width-710/control-1-primary-before2.png", + "sha256": "a785a229987db801daa2ea58f38c220b7f51d35cf6a76fa433a28eb8d2923d4a" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/claude-code/database-index/width-710/control-1-primary-after0.png", + "sha256": "05ee9dd6fd0b8069b436fb76f9eb2cbe37bbe0c3b8021a4faadc834f7f4fb195" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/claude-code/database-index/width-710/control-1-primary-after1.png", + "sha256": "05ee9dd6fd0b8069b436fb76f9eb2cbe37bbe0c3b8021a4faadc834f7f4fb195" + } + ], + "source": { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/manual-plan-sources/prototype-claude-code-database-index.html", + "sha256": "9138294e7cc0a66a8d7cc02920bbfd5cd3c7c40f50871a1e1a66b4a7b1b9fe2c" + }, + "identityMatch": true, + "oldIdentity": { + "index": 1, + "label": "No index", + "tag": "button", + "type": "button" + }, + "runtimeErrors": [], + "visuallyInspected": true + }, + { + "revision": "f009de5838f80b90e861e5727f0ad11cba8814f8", + "pluginRevision": "9de99949792c2c59b70693c1dcda6aa8cf36b428", + "provider": "claude-code", + "prompt": "database-index", + "width": 710, + "index": 2, + "label": "B-tree index", + "verdict": "live", + "reason": "B-tree index click changes Full scan 10,000 pages to 4 page reads and restores the index-path explanation and visible highlighted route. This is the supported index=true branch, not selected-button appearance.", + "mode": "primary", + "automaticPass": true, + "v3Result": { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/claude-code/database-index/result.json", + "sha256": "f90dc75b9440f9d4fe4901979b5f87522573eee11c3b73d0c7448858c8f141d2" + }, + "evidence": [ + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/claude-code/database-index/width-710/control-2-primary-before2.png", + "sha256": "05ee9dd6fd0b8069b436fb76f9eb2cbe37bbe0c3b8021a4faadc834f7f4fb195", + "role": "before2" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/claude-code/database-index/width-710/control-2-primary-after0.png", + "sha256": "a785a229987db801daa2ea58f38c220b7f51d35cf6a76fa433a28eb8d2923d4a", + "role": "after0" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/replay-pairs/prototype/claude-code/database-index-710-2.png", + "sha256": "921f37911ecf87332cde3f5cc3fca97bf1e0c288c845345e8e1e21e61b350410", + "role": "visually inspected comparison" + } + ], + "allProbeFrames": [ + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/claude-code/database-index/width-710/control-2-primary-before0.png", + "sha256": "05ee9dd6fd0b8069b436fb76f9eb2cbe37bbe0c3b8021a4faadc834f7f4fb195" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/claude-code/database-index/width-710/control-2-primary-before1.png", + "sha256": "05ee9dd6fd0b8069b436fb76f9eb2cbe37bbe0c3b8021a4faadc834f7f4fb195" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/claude-code/database-index/width-710/control-2-primary-before2.png", + "sha256": "05ee9dd6fd0b8069b436fb76f9eb2cbe37bbe0c3b8021a4faadc834f7f4fb195" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/claude-code/database-index/width-710/control-2-primary-after0.png", + "sha256": "a785a229987db801daa2ea58f38c220b7f51d35cf6a76fa433a28eb8d2923d4a" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/claude-code/database-index/width-710/control-2-primary-after1.png", + "sha256": "a785a229987db801daa2ea58f38c220b7f51d35cf6a76fa433a28eb8d2923d4a" + } + ], + "source": { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/manual-plan-sources/prototype-claude-code-database-index.html", + "sha256": "9138294e7cc0a66a8d7cc02920bbfd5cd3c7c40f50871a1e1a66b4a7b1b9fe2c" + }, + "identityMatch": true, + "oldIdentity": { + "index": 2, + "label": "B-tree index", + "tag": "button", + "type": "button" + }, + "runtimeErrors": [], + "visuallyInspected": true + }, + { + "revision": "f009de5838f80b90e861e5727f0ad11cba8814f8", + "pluginRevision": "9de99949792c2c59b70693c1dcda6aa8cf36b428", + "provider": "claude-code", + "prompt": "database-index", + "width": 710, + "index": 3, + "label": "Rows in table, powers of ten", + "verdict": "live", + "reason": "Rows slider changes 10 thousand to 100 million rows; output changes from 3 to 5 index page reads, hypothetical scan from 100 to 1,000,000, and lookup id from 4,200 to 42,000,000. The size/read-count model matches these changes despite text wrapping and card resize.", + "mode": "drag", + "automaticPass": true, + "v3Result": { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/claude-code/database-index/result.json", + "sha256": "f90dc75b9440f9d4fe4901979b5f87522573eee11c3b73d0c7448858c8f141d2" + }, + "evidence": [ + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/claude-code/database-index/width-710/control-3-drag-before2.png", + "sha256": "76bb5a4f52a315c33a02bcee616af4f076635446c5a6e5384a9097e77bf9c8a7", + "role": "before2" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/claude-code/database-index/width-710/control-3-drag-after0.png", + "sha256": "db8cee631b5da3e3551cf9b49147113ee502f563786bf56f939c99fc05d33fa5", + "role": "after0" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/replay-pairs/prototype/claude-code/database-index-710-3.png", + "sha256": "bb7593a8d26d3a33fb973a6ae8bd5cfe061cb99059b32e2962db5bd8f79e0d74", + "role": "visually inspected comparison" + } + ], + "allProbeFrames": [ + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/claude-code/database-index/width-710/control-3-drag-before0.png", + "sha256": "76bb5a4f52a315c33a02bcee616af4f076635446c5a6e5384a9097e77bf9c8a7" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/claude-code/database-index/width-710/control-3-drag-before1.png", + "sha256": "76bb5a4f52a315c33a02bcee616af4f076635446c5a6e5384a9097e77bf9c8a7" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/claude-code/database-index/width-710/control-3-drag-before2.png", + "sha256": "76bb5a4f52a315c33a02bcee616af4f076635446c5a6e5384a9097e77bf9c8a7" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/claude-code/database-index/width-710/control-3-drag-after0.png", + "sha256": "db8cee631b5da3e3551cf9b49147113ee502f563786bf56f939c99fc05d33fa5" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/claude-code/database-index/width-710/control-3-drag-after1.png", + "sha256": "db8cee631b5da3e3551cf9b49147113ee502f563786bf56f939c99fc05d33fa5" + } + ], + "source": { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/manual-plan-sources/prototype-claude-code-database-index.html", + "sha256": "9138294e7cc0a66a8d7cc02920bbfd5cd3c7c40f50871a1e1a66b4a7b1b9fe2c" + }, + "identityMatch": true, + "oldIdentity": { + "index": 3, + "label": "Rows in table, powers of ten", + "tag": "input", + "type": "range" + }, + "runtimeErrors": [], + "visuallyInspected": true + }, + { + "revision": "f009de5838f80b90e861e5727f0ad11cba8814f8", + "pluginRevision": "9de99949792c2c59b70693c1dcda6aa8cf36b428", + "provider": "claude-code", + "prompt": "git-merge", + "width": 710, + "index": 0, + "label": "Merge bench: keys 1 to 4 cycle each hunk, M toggles whether main moved", + "verdict": "live", + "reason": "Real-input request20 presses supported key 1 on the stage. The before/after PNGs show hunk1 feature and result blocks changing A to B while the unrelated conflict remains. Logs confirm hunk1 none\u2192feature; the persistent drawn output proves the stage despite generic unsupported probes failing.", + "mode": "drag", + "automaticPass": false, + "v3Result": { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/claude-code/git-merge/result.json", + "sha256": "b27e9df0705a4d96e47801e96bc0826c5cdd3f6a481880bd998fda4e0644a945" + }, + "evidence": [ + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/claude-code/git-merge/width-710/control-0-drag-before2.png", + "sha256": "b0f5c4ba6b731e4a387637b36243d7e0364f00d7e8f308a16a2b773c2204b970", + "role": "before2" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/claude-code/git-merge/width-710/control-0-drag-after0.png", + "sha256": "b0f5c4ba6b731e4a387637b36243d7e0364f00d7e8f308a16a2b773c2204b970", + "role": "after0" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/replay-pairs/prototype/claude-code/git-merge-710-0.png", + "sha256": "981abc1659be2ab4d1607063da0334d29a4832d8bfb07f402cbe40300ca11240", + "role": "visually inspected comparison" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/pairs/20-claude-git-stage-after0.png", + "sha256": "9edee258f878a552327f3682ec10b37059f544a0e831c79d77abfe8c90d4f16f", + "role": "additional inspected evidence" + } + ], + "allProbeFrames": [ + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/claude-code/git-merge/width-710/control-0-drag-before0.png", + "sha256": "b0f5c4ba6b731e4a387637b36243d7e0364f00d7e8f308a16a2b773c2204b970" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/claude-code/git-merge/width-710/control-0-drag-before1.png", + "sha256": "b0f5c4ba6b731e4a387637b36243d7e0364f00d7e8f308a16a2b773c2204b970" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/claude-code/git-merge/width-710/control-0-drag-before2.png", + "sha256": "b0f5c4ba6b731e4a387637b36243d7e0364f00d7e8f308a16a2b773c2204b970" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/claude-code/git-merge/width-710/control-0-drag-after0.png", + "sha256": "b0f5c4ba6b731e4a387637b36243d7e0364f00d7e8f308a16a2b773c2204b970" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/claude-code/git-merge/width-710/control-0-drag-after1.png", + "sha256": "b0f5c4ba6b731e4a387637b36243d7e0364f00d7e8f308a16a2b773c2204b970" + } + ], + "source": { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/manual-plan-sources/prototype-claude-code-git-merge.html", + "sha256": "a55393c01a3e11e20044a21ea27b06fcdae6b2c980f0ebbc32f6402630e9d37a" + }, + "identityMatch": true, + "oldIdentity": { + "index": 0, + "label": "Merge bench: keys 1 to 4 cycle each hunk, M toggles whether main moved", + "tag": "div", + "type": "group" + }, + "runtimeErrors": [], + "visuallyInspected": true, + "manualEvidence": [ + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/requests/request-20-claude-git-stage.json", + "sha256": "5944ae342469729b2da081d216ec0b91de7b4ee8ce0020cb90d69c23bf7f8534", + "role": "manual replay evidence" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/request-20-claude-git-stage.actions.json", + "sha256": "e39c69ba827d9479de364cbbab46b45fc77ec0d482fc390e0d54ade61c9b6535", + "role": "manual replay evidence" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/request-20-claude-git-stage.log", + "sha256": "8d98a48d6710b1d6abefd366f6d5c12fe99b677c8fe7cb1d104848a830764817", + "role": "manual replay evidence" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/20-claude-git-stage-after0.png", + "sha256": "cf4f8035e6745d9c2266b586166f22a7b535a62d8f0700c2aeaf18de8f5fa9b1", + "role": "manual replay evidence" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/20-claude-git-stage-after1.png", + "sha256": "cf4f8035e6745d9c2266b586166f22a7b535a62d8f0700c2aeaf18de8f5fa9b1", + "role": "manual replay evidence" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/20-claude-git-stage-before0.png", + "sha256": "3ca2860f6fb547d2cb1585a4584f29cd0a76e6078e965d600519afaf91646276", + "role": "manual replay evidence" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/20-claude-git-stage-before1.png", + "sha256": "3ca2860f6fb547d2cb1585a4584f29cd0a76e6078e965d600519afaf91646276", + "role": "manual replay evidence" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/20-claude-git-stage-before2.png", + "sha256": "3ca2860f6fb547d2cb1585a4584f29cd0a76e6078e965d600519afaf91646276", + "role": "manual replay evidence" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/pairs/20-claude-git-stage-after0.png", + "sha256": "9edee258f878a552327f3682ec10b37059f544a0e831c79d77abfe8c90d4f16f", + "role": "manual replay evidence" + } + ], + "replayVerdict": "unproven", + "replayReason": "Before/after geometry and state are unchanged. Source exposes only digit keys 1\u20134 and M on this stage; generic drag/click/Home/End/arrows/Space/Enter never invoke its handler. This is unsupported input coverage, not evidence of a dead stage. Prepared request20 uses key1." + }, + { + "revision": "f009de5838f80b90e861e5727f0ad11cba8814f8", + "pluginRevision": "9de99949792c2c59b70693c1dcda6aa8cf36b428", + "provider": "claude-code", + "prompt": "git-merge", + "width": 710, + "index": 5, + "label": "Neither branchFeature onlyMain onlyBoth, identicallyBoth, differently", + "verdict": "live", + "reason": "Request21 first uses Home to leave the final option, then ArrowDown/Enter on #h3. The inspected pair changes the last result block A\u2192B and the explanation/readout from 1 to 2 hunks from feature. Both after logs retain the changed output, establishing a live select rather than the old endpoint no-op.", + "mode": "primary", + "automaticPass": false, + "v3Result": { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/claude-code/git-merge/result.json", + "sha256": "b27e9df0705a4d96e47801e96bc0826c5cdd3f6a481880bd998fda4e0644a945" + }, + "evidence": [ + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/claude-code/git-merge/width-710/control-5-primary-before2.png", + "sha256": "d6bb6681df651e8fe785930af71e52c224efcaf0126c086aa71e46fdb1a985d0", + "role": "before2" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/claude-code/git-merge/width-710/control-5-primary-after0.png", + "sha256": "6094fc5d4b04e2b68b66ec5925777ab446d0a709eebbcbd25bfdbb28230ac389", + "role": "after0" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/replay-pairs/prototype/claude-code/git-merge-710-5.png", + "sha256": "eaf668035e8bf2d23486a04755df72858f8d1e726029f876d36d99158b58dafa", + "role": "visually inspected comparison" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/pairs/21-claude-git-final-hunk-after0.png", + "sha256": "9f172aee786da216d894a086731b4be064d02dbe6f4041309874e2b39d6139ed", + "role": "additional inspected evidence" + } + ], + "allProbeFrames": [ + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/claude-code/git-merge/width-710/control-5-primary-before0.png", + "sha256": "d6bb6681df651e8fe785930af71e52c224efcaf0126c086aa71e46fdb1a985d0" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/claude-code/git-merge/width-710/control-5-primary-before1.png", + "sha256": "d6bb6681df651e8fe785930af71e52c224efcaf0126c086aa71e46fdb1a985d0" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/claude-code/git-merge/width-710/control-5-primary-before2.png", + "sha256": "d6bb6681df651e8fe785930af71e52c224efcaf0126c086aa71e46fdb1a985d0" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/claude-code/git-merge/width-710/control-5-primary-after0.png", + "sha256": "6094fc5d4b04e2b68b66ec5925777ab446d0a709eebbcbd25bfdbb28230ac389" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/claude-code/git-merge/width-710/control-5-primary-after1.png", + "sha256": "6094fc5d4b04e2b68b66ec5925777ab446d0a709eebbcbd25bfdbb28230ac389" + } + ], + "source": { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/manual-plan-sources/prototype-claude-code-git-merge.html", + "sha256": "a55393c01a3e11e20044a21ea27b06fcdae6b2c980f0ebbc32f6402630e9d37a" + }, + "identityMatch": true, + "oldIdentity": { + "index": 5, + "label": "Neither branchFeature onlyMain onlyBoth, identicallyBoth, differently", + "tag": "select", + "type": "select-one" + }, + "runtimeErrors": [], + "visuallyInspected": true, + "manualEvidence": [ + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/requests/request-21-claude-git-final-hunk.json", + "sha256": "653c9ff193cc7fef137858ab1a397a8c5955c49e3e8334735ba20c121de4f485", + "role": "manual replay evidence" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/request-21-claude-git-final-hunk.actions.json", + "sha256": "83b6c6076ea4e5d3139743a8995283a573a19a6e82d38ae9dc09b1f9a036cdd0", + "role": "manual replay evidence" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/request-21-claude-git-final-hunk.log", + "sha256": "9712d935d43a67480df87521fb504ad4751cbd645920ea8e989958cc163dc84a", + "role": "manual replay evidence" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/21-claude-git-final-hunk-after0.png", + "sha256": "8e9cabe842fa5bf8dd0bf307d88ce042318e532979afb580bec5c37b5f6143e4", + "role": "manual replay evidence" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/21-claude-git-final-hunk-after1.png", + "sha256": "8e9cabe842fa5bf8dd0bf307d88ce042318e532979afb580bec5c37b5f6143e4", + "role": "manual replay evidence" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/21-claude-git-final-hunk-before0.png", + "sha256": "451f4e14e1dc46201d2a2995d2b593abed9afc7bd1835f0d32d805de368054cc", + "role": "manual replay evidence" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/21-claude-git-final-hunk-before1.png", + "sha256": "451f4e14e1dc46201d2a2995d2b593abed9afc7bd1835f0d32d805de368054cc", + "role": "manual replay evidence" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/21-claude-git-final-hunk-before2.png", + "sha256": "451f4e14e1dc46201d2a2995d2b593abed9afc7bd1835f0d32d805de368054cc", + "role": "manual replay evidence" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/pairs/21-claude-git-final-hunk-after0.png", + "sha256": "9f172aee786da216d894a086731b4be064d02dbe6f4041309874e2b39d6139ed", + "role": "manual replay evidence" + } + ], + "replayVerdict": "unproven", + "replayReason": "Hunk4 stays Both, differently in both screenshots. It starts at the final select option, so the generic ArrowDown is a no-op at its endpoint; source change handler would render a new hunk selection. Prepared request21 resets with Home before moving down." + }, + { + "revision": "f009de5838f80b90e861e5727f0ad11cba8814f8", + "pluginRevision": "9de99949792c2c59b70693c1dcda6aa8cf36b428", + "provider": "claude-code", + "prompt": "websocket", + "width": 710, + "index": 0, + "label": "WebSocket chat: Enter sends a message, M switches between WebSocket and polling, arrows change the poll interval", + "verdict": "live", + "reason": "Supported stage click adds a third message line to all three client pads (two before, three in both after images). Source click invokes send and reduced-motion disables automatic touring, so the added bubbles are causal message delivery. The automatic semantic gate misses opacity-revealed SVG message paths.", + "mode": "click", + "automaticPass": false, + "v3Result": { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/claude-code/websocket/result.json", + "sha256": "8a3a0490dbba7ea6ae68afd10cb72d40b72e697c844137b81348757425c5649c" + }, + "evidence": [ + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/claude-code/websocket/width-710/control-0-click-before2.png", + "sha256": "fcf889178d0c21492f3a58f44fee8261a4a423402ba586b744fd615c870b5045", + "role": "before2" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/claude-code/websocket/width-710/control-0-click-after0.png", + "sha256": "95912b7d861698566aea902f92c2c74cbf4fada872e4b01ee348251cd75e06ae", + "role": "after0" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/replay-pairs/prototype/claude-code/websocket-710-0.png", + "sha256": "ae547f7d79bdd0aa9ca3a4249591d3c574bc5b2fa4bed0b3f7d8f495e125a383", + "role": "visually inspected comparison" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/claude-code/websocket/width-710/control-0-click-after1.png", + "sha256": "95912b7d861698566aea902f92c2c74cbf4fada872e4b01ee348251cd75e06ae", + "role": "additional inspected evidence" + } + ], + "allProbeFrames": [ + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/claude-code/websocket/width-710/control-0-click-before0.png", + "sha256": "fcf889178d0c21492f3a58f44fee8261a4a423402ba586b744fd615c870b5045" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/claude-code/websocket/width-710/control-0-click-before1.png", + "sha256": "fcf889178d0c21492f3a58f44fee8261a4a423402ba586b744fd615c870b5045" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/claude-code/websocket/width-710/control-0-click-before2.png", + "sha256": "fcf889178d0c21492f3a58f44fee8261a4a423402ba586b744fd615c870b5045" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/claude-code/websocket/width-710/control-0-click-after0.png", + "sha256": "95912b7d861698566aea902f92c2c74cbf4fada872e4b01ee348251cd75e06ae" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/claude-code/websocket/width-710/control-0-click-after1.png", + "sha256": "95912b7d861698566aea902f92c2c74cbf4fada872e4b01ee348251cd75e06ae" + } + ], + "source": { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/manual-plan-sources/prototype-claude-code-websocket.html", + "sha256": "acec998dc58c9e0c532b033f67574dd81fa2b42816af46e2a3c629b43548f598" + }, + "identityMatch": true, + "oldIdentity": { + "index": 0, + "label": "WebSocket chat: Enter sends a message, M switches between WebSocket and polling, arrows change the poll interval", + "tag": "div", + "type": "slider" + }, + "runtimeErrors": [], + "visuallyInspected": true + }, + { + "revision": "f009de5838f80b90e861e5727f0ad11cba8814f8", + "pluginRevision": "9de99949792c2c59b70693c1dcda6aa8cf36b428", + "provider": "claude-code", + "prompt": "websocket", + "width": 710, + "index": 1, + "label": "WebSocket", + "verdict": "live", + "reason": "WebSocket click changes polling average/worst 1.6/3.1 s and 20 requests/min to 100/100 ms and zero polling requests, restores open wires, hides interval and shows completed handshake. These model outputs directly match mode=websocket.", + "mode": "primary", + "automaticPass": true, + "v3Result": { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/claude-code/websocket/result.json", + "sha256": "8a3a0490dbba7ea6ae68afd10cb72d40b72e697c844137b81348757425c5649c" + }, + "evidence": [ + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/claude-code/websocket/width-710/control-1-primary-before2.png", + "sha256": "8dd30fe3a1002a04694e380eab9b7b7bcd6fea6b0cead5f9c8a0bd235352d6ee", + "role": "before2" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/claude-code/websocket/width-710/control-1-primary-after0.png", + "sha256": "5ee231e662649f330f0a5cb9620a45fdb09cec9936173c9068b97695d93ab432", + "role": "after0" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/replay-pairs/prototype/claude-code/websocket-710-1.png", + "sha256": "cb6643ee963886a3466f0c1ed2be5e50a79a4b979c0b2e3e34379c1536bcb24a", + "role": "visually inspected comparison" + } + ], + "allProbeFrames": [ + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/claude-code/websocket/width-710/control-1-primary-before0.png", + "sha256": "6ed6e25928da7ff924251ef51943f5811984a5df4bba4fad764e84a2f868a6ac" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/claude-code/websocket/width-710/control-1-primary-before1.png", + "sha256": "00b1cfaacb6b740720d56202f0344d94006a3fcb377773e0daded31b1dd269bf" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/claude-code/websocket/width-710/control-1-primary-before2.png", + "sha256": "8dd30fe3a1002a04694e380eab9b7b7bcd6fea6b0cead5f9c8a0bd235352d6ee" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/claude-code/websocket/width-710/control-1-primary-after0.png", + "sha256": "5ee231e662649f330f0a5cb9620a45fdb09cec9936173c9068b97695d93ab432" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/claude-code/websocket/width-710/control-1-primary-after1.png", + "sha256": "5ee231e662649f330f0a5cb9620a45fdb09cec9936173c9068b97695d93ab432" + } + ], + "source": { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/manual-plan-sources/prototype-claude-code-websocket.html", + "sha256": "acec998dc58c9e0c532b033f67574dd81fa2b42816af46e2a3c629b43548f598" + }, + "identityMatch": true, + "oldIdentity": { + "index": 1, + "label": "WebSocket", + "tag": "button", + "type": "button" + }, + "runtimeErrors": [], + "visuallyInspected": true + }, + { + "revision": "f009de5838f80b90e861e5727f0ad11cba8814f8", + "pluginRevision": "9de99949792c2c59b70693c1dcda6aa8cf36b428", + "provider": "claude-code", + "prompt": "websocket", + "width": 710, + "index": 2, + "label": "Polling", + "verdict": "live", + "reason": "Polling click changes 100ms delivery and zero polls to 1.6s average, 3.1s worst and 20 requests/min; exposes interval and explains timed polling. Actual outputs change even though card height grows.", + "mode": "primary", + "automaticPass": true, + "v3Result": { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/claude-code/websocket/result.json", + "sha256": "8a3a0490dbba7ea6ae68afd10cb72d40b72e697c844137b81348757425c5649c" + }, + "evidence": [ + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/claude-code/websocket/width-710/control-2-primary-before2.png", + "sha256": "5ee231e662649f330f0a5cb9620a45fdb09cec9936173c9068b97695d93ab432", + "role": "before2" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/claude-code/websocket/width-710/control-2-primary-after0.png", + "sha256": "6ed6e25928da7ff924251ef51943f5811984a5df4bba4fad764e84a2f868a6ac", + "role": "after0" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/replay-pairs/prototype/claude-code/websocket-710-2.png", + "sha256": "2d8669ead025f0938d58ed267b2d2693486ff03b369e3daa7d2ec42bc7c57a67", + "role": "visually inspected comparison" + } + ], + "allProbeFrames": [ + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/claude-code/websocket/width-710/control-2-primary-before0.png", + "sha256": "5ee231e662649f330f0a5cb9620a45fdb09cec9936173c9068b97695d93ab432" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/claude-code/websocket/width-710/control-2-primary-before1.png", + "sha256": "5ee231e662649f330f0a5cb9620a45fdb09cec9936173c9068b97695d93ab432" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/claude-code/websocket/width-710/control-2-primary-before2.png", + "sha256": "5ee231e662649f330f0a5cb9620a45fdb09cec9936173c9068b97695d93ab432" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/claude-code/websocket/width-710/control-2-primary-after0.png", + "sha256": "6ed6e25928da7ff924251ef51943f5811984a5df4bba4fad764e84a2f868a6ac" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/claude-code/websocket/width-710/control-2-primary-after1.png", + "sha256": "8dd30fe3a1002a04694e380eab9b7b7bcd6fea6b0cead5f9c8a0bd235352d6ee" + } + ], + "source": { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/manual-plan-sources/prototype-claude-code-websocket.html", + "sha256": "acec998dc58c9e0c532b033f67574dd81fa2b42816af46e2a3c629b43548f598" + }, + "identityMatch": true, + "oldIdentity": { + "index": 2, + "label": "Polling", + "tag": "button", + "type": "button" + }, + "runtimeErrors": [], + "visuallyInspected": true + }, + { + "revision": "f009de5838f80b90e861e5727f0ad11cba8814f8", + "pluginRevision": "9de99949792c2c59b70693c1dcda6aa8cf36b428", + "provider": "claude-code", + "prompt": "websocket", + "width": 710, + "index": 4, + "label": "latency", + "verdict": "live", + "reason": "Latency drag changes one-way 50 to 270 ms; average delivery changes 1.6 to 2.0 s and worst case 3.1 to 3.5 s while interval stays 3s and request rate stays 20. This is the model latency effect, not autonomous packet traffic.", + "mode": "drag", + "automaticPass": true, + "v3Result": { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/claude-code/websocket/result.json", + "sha256": "8a3a0490dbba7ea6ae68afd10cb72d40b72e697c844137b81348757425c5649c" + }, + "evidence": [ + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/claude-code/websocket/width-710/control-4-drag-before2.png", + "sha256": "4ea1321813d604fdb21ff1422d79e5a2eff62f4f5f57ebc8187318795ed60e36", + "role": "before2" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/claude-code/websocket/width-710/control-4-drag-after0.png", + "sha256": "a6b033a1f06d15fc033cb13927d87104c8a1dcb176133556998340626c00a8a0", + "role": "after0" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/replay-pairs/prototype/claude-code/websocket-710-4.png", + "sha256": "c0e07491ffc4b36873e7d467ed9d6c084ffa6074c684ef14eeccf7eeaf848215", + "role": "visually inspected comparison" + } + ], + "allProbeFrames": [ + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/claude-code/websocket/width-710/control-4-drag-before0.png", + "sha256": "36aad5be52a79d2f99801fcaca203f3e94bfe892d09dc63461e18ba9e4205ed9" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/claude-code/websocket/width-710/control-4-drag-before1.png", + "sha256": "36aad5be52a79d2f99801fcaca203f3e94bfe892d09dc63461e18ba9e4205ed9" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/claude-code/websocket/width-710/control-4-drag-before2.png", + "sha256": "4ea1321813d604fdb21ff1422d79e5a2eff62f4f5f57ebc8187318795ed60e36" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/claude-code/websocket/width-710/control-4-drag-after0.png", + "sha256": "a6b033a1f06d15fc033cb13927d87104c8a1dcb176133556998340626c00a8a0" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/claude-code/websocket/width-710/control-4-drag-after1.png", + "sha256": "a6b033a1f06d15fc033cb13927d87104c8a1dcb176133556998340626c00a8a0" + } + ], + "source": { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/manual-plan-sources/prototype-claude-code-websocket.html", + "sha256": "acec998dc58c9e0c532b033f67574dd81fa2b42816af46e2a3c629b43548f598" + }, + "identityMatch": true, + "oldIdentity": { + "index": 4, + "label": "latency", + "tag": "input", + "type": "range" + }, + "runtimeErrors": [], + "visuallyInspected": true + }, + { + "revision": "f009de5838f80b90e861e5727f0ad11cba8814f8", + "pluginRevision": "9de99949792c2c59b70693c1dcda6aa8cf36b428", + "provider": "claude-code", + "prompt": "websocket", + "width": 710, + "index": 5, + "label": "interval", + "verdict": "live", + "reason": "Request23 enables Polling, sets #interval to Home then End with real keys. Inspected PNGs change interval 1\u219215 s, independent average delivery 600 ms\u21927.6 s and requests/min 60\u21924; latency stays 50 ms. Both after logs retain the new readout, proving the previously unexercised conditional control.", + "mode": null, + "automaticPass": false, + "v3Result": { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/claude-code/websocket/result.json", + "sha256": "8a3a0490dbba7ea6ae68afd10cb72d40b72e697c844137b81348757425c5649c" + }, + "evidence": [ + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/claude-code/websocket/width-710/control-2-primary-after0.png", + "sha256": "6ed6e25928da7ff924251ef51943f5811984a5df4bba4fad764e84a2f868a6ac", + "role": "additional inspected evidence" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/pairs/23-claude-websocket-interval-after0.png", + "sha256": "124c4e4d8855892f74b6712c6cd4aba7d81179efafe29be21aabfb40897185e0", + "role": "additional inspected evidence" + } + ], + "allProbeFrames": [], + "source": { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/manual-plan-sources/prototype-claude-code-websocket.html", + "sha256": "acec998dc58c9e0c532b033f67574dd81fa2b42816af46e2a3c629b43548f598" + }, + "identityMatch": true, + "oldIdentity": { + "index": 5, + "label": "interval", + "tag": "input", + "type": "range" + }, + "runtimeErrors": [], + "visuallyInspected": true, + "manualEvidence": [ + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/requests/request-23-claude-websocket-interval.json", + "sha256": "bd6e1d8e831313a1b9932368f5b393b93b83e325958c8626c9c80e177670e59a", + "role": "manual replay evidence" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/request-23-claude-websocket-interval.actions.json", + "sha256": "f49a3329e14cd1d23211089e57f3a0e9b05cde0772a901be8f05f46ab9de520e", + "role": "manual replay evidence" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/request-23-claude-websocket-interval.log", + "sha256": "3b420fb0b6fc9132e24b0642c41d0b0f8b7a865fc3c7cad4de19739c9b87064f", + "role": "manual replay evidence" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/23-claude-websocket-interval-after0.png", + "sha256": "86d2275173f1319d83ff50478679fbed6d509510c8aaf95a8af322a339d0ba85", + "role": "manual replay evidence" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/23-claude-websocket-interval-after1.png", + "sha256": "86d2275173f1319d83ff50478679fbed6d509510c8aaf95a8af322a339d0ba85", + "role": "manual replay evidence" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/23-claude-websocket-interval-before0.png", + "sha256": "3140785c16476b95964c4db7614216351894b0ea5f01215d8e31f2b7ffcc8108", + "role": "manual replay evidence" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/23-claude-websocket-interval-before1.png", + "sha256": "3140785c16476b95964c4db7614216351894b0ea5f01215d8e31f2b7ffcc8108", + "role": "manual replay evidence" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/23-claude-websocket-interval-before2.png", + "sha256": "3140785c16476b95964c4db7614216351894b0ea5f01215d8e31f2b7ffcc8108", + "role": "manual replay evidence" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/pairs/23-claude-websocket-interval-after0.png", + "sha256": "124c4e4d8855892f74b6712c6cd4aba7d81179efafe29be21aabfb40897185e0", + "role": "manual replay evidence" + } + ], + "replayVerdict": "unproven", + "replayReason": "Poll interval appears after mode selection; the replay retains its identity but never drives it. Visually inspected Polling after image confirms the visible 3s input. Source needs polling mode before #interval is meaningful. Prepared request23 changes Home to End while polling." + }, + { + "revision": "f009de5838f80b90e861e5727f0ad11cba8814f8", + "pluginRevision": "9de99949792c2c59b70693c1dcda6aa8cf36b428", + "provider": "claude-code", + "prompt": "load-balancer", + "width": 710, + "index": 0, + "label": "Load balancer figure: left and right arrows change the algorithm, up and down change the traffic", + "verdict": "live", + "reason": "Supported ArrowRight changes algorithm from Round robin to Least-connections in the independent model readout. The source key handler updates algo and pick() consults it. Queue evolution is visible but is not used alone as causal proof because traffic runs continuously.", + "mode": "key-ArrowRight", + "automaticPass": true, + "v3Result": { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/claude-code/load-balancer/result.json", + "sha256": "7dc748d4f64c8368c9c5a1eed397594fb82640bf3abf123f76405587c3faaf42" + }, + "evidence": [ + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/claude-code/load-balancer/width-710/control-0-key-ArrowRight-before2.png", + "sha256": "05469811b1850215e2b3d57012373b4eb8c8dd8f07754c4568246d0fafc01ebe", + "role": "before2" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/claude-code/load-balancer/width-710/control-0-key-ArrowRight-after0.png", + "sha256": "aff37653af50037d7676f70de62c513ee583ad8d0d6d5436fe2db7ff466f2bd5", + "role": "after0" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/replay-pairs/prototype/claude-code/load-balancer-710-0.png", + "sha256": "fca7cb8ac5ccb73663ea48a281b597af0a95cc448310d2d520d4c7c9c846ce97", + "role": "visually inspected comparison" + } + ], + "allProbeFrames": [ + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/claude-code/load-balancer/width-710/control-0-key-ArrowRight-before0.png", + "sha256": "d4d3d03f79c098da8e2059a5a88c224ab27b959533db582ce0fd3c8600b6249a" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/claude-code/load-balancer/width-710/control-0-key-ArrowRight-before1.png", + "sha256": "332e746ad5aef1e971ecdf62f26971b1e125a06ae32ec9c742d6d900fb88da55" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/claude-code/load-balancer/width-710/control-0-key-ArrowRight-before2.png", + "sha256": "05469811b1850215e2b3d57012373b4eb8c8dd8f07754c4568246d0fafc01ebe" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/claude-code/load-balancer/width-710/control-0-key-ArrowRight-after0.png", + "sha256": "aff37653af50037d7676f70de62c513ee583ad8d0d6d5436fe2db7ff466f2bd5" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/claude-code/load-balancer/width-710/control-0-key-ArrowRight-after1.png", + "sha256": "2ff6761c8c7e02e3b453b19f274c6344a60a243b67612b4692286ce3f3e7525c" + } + ], + "source": { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/manual-plan-sources/prototype-claude-code-load-balancer.html", + "sha256": "319193ec09d22217bda7f331863c0940de3a7cf0425d053ad025be3bac084b90" + }, + "identityMatch": true, + "oldIdentity": { + "index": 0, + "label": "Load balancer figure: left and right arrows change the algorithm, up and down change the traffic", + "tag": "div", + "type": "group" + }, + "runtimeErrors": [], + "visuallyInspected": true + }, + { + "revision": "f009de5838f80b90e861e5727f0ad11cba8814f8", + "pluginRevision": "9de99949792c2c59b70693c1dcda6aa8cf36b428", + "provider": "claude-code", + "prompt": "load-balancer", + "width": 710, + "index": 1, + "label": "Round robin", + "verdict": "live", + "reason": "Round robin click changes the model readout from Least-connections to Round-robin, beyond selected-button styling. The source handler feeds the actual dispatch pick() branch. Simultaneous queue/average changes are not independently attributed to the click.", + "mode": "primary", + "automaticPass": true, + "v3Result": { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/claude-code/load-balancer/result.json", + "sha256": "7dc748d4f64c8368c9c5a1eed397594fb82640bf3abf123f76405587c3faaf42" + }, + "evidence": [ + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/claude-code/load-balancer/width-710/control-1-primary-before2.png", + "sha256": "cac9c405d35cf34c4a50807eaab7d94f02be1127b7edc0a432906268979cfe45", + "role": "before2" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/claude-code/load-balancer/width-710/control-1-primary-after0.png", + "sha256": "96f9fd18a0bae07d00652a4f2ce33e2a13e8946b15ea03a145fb6516c7e7631a", + "role": "after0" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/replay-pairs/prototype/claude-code/load-balancer-710-1.png", + "sha256": "7c1216dbb107f387d85d3b3f8c79daaa0d83925dc7e305263c7a33f3a378b810", + "role": "visually inspected comparison" + } + ], + "allProbeFrames": [ + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/claude-code/load-balancer/width-710/control-1-primary-before0.png", + "sha256": "8bc73cb8a70cdd084878400b5f52b67943e5882bd54bb06ef10d252327654a02" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/claude-code/load-balancer/width-710/control-1-primary-before1.png", + "sha256": "a3658921077134e10b975079fffab7001c8f0064552d744f65c7453ca12a1e71" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/claude-code/load-balancer/width-710/control-1-primary-before2.png", + "sha256": "cac9c405d35cf34c4a50807eaab7d94f02be1127b7edc0a432906268979cfe45" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/claude-code/load-balancer/width-710/control-1-primary-after0.png", + "sha256": "96f9fd18a0bae07d00652a4f2ce33e2a13e8946b15ea03a145fb6516c7e7631a" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/claude-code/load-balancer/width-710/control-1-primary-after1.png", + "sha256": "0a857664211afe83f830a6df2770eee3c597f407fb23e86627669a448643acfd" + } + ], + "source": { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/manual-plan-sources/prototype-claude-code-load-balancer.html", + "sha256": "319193ec09d22217bda7f331863c0940de3a7cf0425d053ad025be3bac084b90" + }, + "identityMatch": true, + "oldIdentity": { + "index": 1, + "label": "Round robin", + "tag": "button", + "type": "button" + }, + "runtimeErrors": [], + "visuallyInspected": true + }, + { + "revision": "f009de5838f80b90e861e5727f0ad11cba8814f8", + "pluginRevision": "9de99949792c2c59b70693c1dcda6aa8cf36b428", + "provider": "claude-code", + "prompt": "load-balancer", + "width": 710, + "index": 2, + "label": "Least connections", + "verdict": "live", + "reason": "Least connections click changes the model readout from Round-robin to Least-connections. Source maps this parameter to minimum-open-connections dispatch; readout change is causal, while the moving queue is treated as background rather than standalone proof.", + "mode": "primary", + "automaticPass": true, + "v3Result": { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/claude-code/load-balancer/result.json", + "sha256": "7dc748d4f64c8368c9c5a1eed397594fb82640bf3abf123f76405587c3faaf42" + }, + "evidence": [ + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/claude-code/load-balancer/width-710/control-2-primary-before2.png", + "sha256": "949eaa7ed2c2701b3b3d9aef32a0ecfcda74d88907c4e2fd1d9ef3ac7661db07", + "role": "before2" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/claude-code/load-balancer/width-710/control-2-primary-after0.png", + "sha256": "a31bfab513c3b7a5331703ed5f99bab44ca65ac1cedc64cb5a04e6adec5db4a4", + "role": "after0" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/replay-pairs/prototype/claude-code/load-balancer-710-2.png", + "sha256": "6c2aec24526396677e933b2bfde1feba72bfec3b0dd7c995876eb1e5a741dd6b", + "role": "visually inspected comparison" + } + ], + "allProbeFrames": [ + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/claude-code/load-balancer/width-710/control-2-primary-before0.png", + "sha256": "082f57be3e6591ee98d4987c545055f96fd70bf139c32346f275a967e0bb5d5c" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/claude-code/load-balancer/width-710/control-2-primary-before1.png", + "sha256": "2d04519e8b3e9a3595e629850461e40101755956ce199f02d01a32561419df72" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/claude-code/load-balancer/width-710/control-2-primary-before2.png", + "sha256": "949eaa7ed2c2701b3b3d9aef32a0ecfcda74d88907c4e2fd1d9ef3ac7661db07" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/claude-code/load-balancer/width-710/control-2-primary-after0.png", + "sha256": "a31bfab513c3b7a5331703ed5f99bab44ca65ac1cedc64cb5a04e6adec5db4a4" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/claude-code/load-balancer/width-710/control-2-primary-after1.png", + "sha256": "d0d49cd11417d1b707cfd1435702ae9f0140d72680763fd42d185f18f17b2641" + } + ], + "source": { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/manual-plan-sources/prototype-claude-code-load-balancer.html", + "sha256": "319193ec09d22217bda7f331863c0940de3a7cf0425d053ad025be3bac084b90" + }, + "identityMatch": true, + "oldIdentity": { + "index": 2, + "label": "Least connections", + "tag": "button", + "type": "button" + }, + "runtimeErrors": [], + "visuallyInspected": true + }, + { + "revision": "f009de5838f80b90e861e5727f0ad11cba8814f8", + "pluginRevision": "9de99949792c2c59b70693c1dcda6aa8cf36b428", + "provider": "claude-code", + "prompt": "load-balancer", + "width": 710, + "index": 3, + "label": "Random", + "verdict": "live", + "reason": "Random click changes the model readout from Round-robin to Random. Source dispatch pick() uses the selected random branch; no automatic cycling changes the algorithm. Changing queue counts alone is not counted as proof.", + "mode": "primary", + "automaticPass": true, + "v3Result": { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/claude-code/load-balancer/result.json", + "sha256": "7dc748d4f64c8368c9c5a1eed397594fb82640bf3abf123f76405587c3faaf42" + }, + "evidence": [ + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/claude-code/load-balancer/width-710/control-3-primary-before2.png", + "sha256": "fd0bbf894349418452551501e202dab22671f0d17f4c5ffb536e4483312dd230", + "role": "before2" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/claude-code/load-balancer/width-710/control-3-primary-after0.png", + "sha256": "b4d7a4aa3f0eae040cf85157d652162531ace857be342fb60c8d3ecf6b66ef02", + "role": "after0" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/replay-pairs/prototype/claude-code/load-balancer-710-3.png", + "sha256": "2291a2c73796fafa9ed586d75163b65789ad9a7eef3f25c8b7a4363b58592c2a", + "role": "visually inspected comparison" + } + ], + "allProbeFrames": [ + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/claude-code/load-balancer/width-710/control-3-primary-before0.png", + "sha256": "94287377c048167b0888e4625523fc0797b67063b145c98063efd4fcbbf85fc6" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/claude-code/load-balancer/width-710/control-3-primary-before1.png", + "sha256": "6cd355d5d3b62db6674c985c440f13ccce2f50c4355e831de89682674212e296" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/claude-code/load-balancer/width-710/control-3-primary-before2.png", + "sha256": "fd0bbf894349418452551501e202dab22671f0d17f4c5ffb536e4483312dd230" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/claude-code/load-balancer/width-710/control-3-primary-after0.png", + "sha256": "b4d7a4aa3f0eae040cf85157d652162531ace857be342fb60c8d3ecf6b66ef02" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/claude-code/load-balancer/width-710/control-3-primary-after1.png", + "sha256": "8d66db473fdb36f23ff56abb8ee397b025f1f0661ad939eac73944ac74470256" + } + ], + "source": { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/manual-plan-sources/prototype-claude-code-load-balancer.html", + "sha256": "319193ec09d22217bda7f331863c0940de3a7cf0425d053ad025be3bac084b90" + }, + "identityMatch": true, + "oldIdentity": { + "index": 3, + "label": "Random", + "tag": "button", + "type": "button" + }, + "runtimeErrors": [], + "visuallyInspected": true + }, + { + "revision": "f009de5838f80b90e861e5727f0ad11cba8814f8", + "pluginRevision": "9de99949792c2c59b70693c1dcda6aa8cf36b428", + "provider": "claude-code", + "prompt": "load-balancer", + "width": 710, + "index": 4, + "label": "rate", + "verdict": "live", + "reason": "Fresh-page equal-time requests25/26 use Round robin and 4x Server C slowdown, changing only traffic through real Home/End input. At ~20.02/~20.01 s, inspected PNGs show open connections A/B/C=1/0/1 at 0.5 req/s versus 8/7/8 at 4 req/s, average 2.6\u21926.9 s, drops 0\u219219. Logs corroborate the contrast at 10 and 15 s. This isolates a substantial modeled load effect beyond the slider and autonomous aging of one run.", + "mode": "drag", + "automaticPass": false, + "v3Result": { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/claude-code/load-balancer/result.json", + "sha256": "7dc748d4f64c8368c9c5a1eed397594fb82640bf3abf123f76405587c3faaf42" + }, + "evidence": [ + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/claude-code/load-balancer/width-710/control-4-drag-before2.png", + "sha256": "5ef1b08c6303c527fa98f5e97209233d4e5e1747a181160a6ad4e65775a6c0cc", + "role": "before2" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/claude-code/load-balancer/width-710/control-4-drag-after0.png", + "sha256": "866a6b8bd1056c2b10c911d64ec845fb2e82c48a952b5a5fed851f73900fbe02", + "role": "after0" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/replay-pairs/prototype/claude-code/load-balancer-710-4.png", + "sha256": "a5079cc132b1660c9e80c53bbe509fc14982484a2bf0b9c90f10b0e3c16624d3", + "role": "visually inspected comparison" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/25-claude-load-rate-low-at-20000.png", + "sha256": "e0ae92b6ed7f094c13a33aa49cf53aac8846476ba9c72144bc83fd4be1a8fdb8", + "role": "additional inspected evidence" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/26-claude-load-rate-high-at-20000.png", + "sha256": "576bbee73032b52c17dbd8cdda92c1a80768e2d96cfa438f17d9081c8bf26479", + "role": "additional inspected evidence" + } + ], + "allProbeFrames": [ + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/claude-code/load-balancer/width-710/control-4-drag-before0.png", + "sha256": "10928e742ba664abb1a4c8c336625785ba70a89d710c9495028031b2f35cf442" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/claude-code/load-balancer/width-710/control-4-drag-before1.png", + "sha256": "70517d0075118f5ef071236a01d46ca32dc27a18c9f7a944e433b15e14d03686" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/claude-code/load-balancer/width-710/control-4-drag-before2.png", + "sha256": "5ef1b08c6303c527fa98f5e97209233d4e5e1747a181160a6ad4e65775a6c0cc" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/claude-code/load-balancer/width-710/control-4-drag-after0.png", + "sha256": "866a6b8bd1056c2b10c911d64ec845fb2e82c48a952b5a5fed851f73900fbe02" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/claude-code/load-balancer/width-710/control-4-drag-after1.png", + "sha256": "53540ce42e27aa18080a21406c6c882daaeea7be18a18b18f52afe284a9c6877" + } + ], + "source": { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/manual-plan-sources/prototype-claude-code-load-balancer.html", + "sha256": "319193ec09d22217bda7f331863c0940de3a7cf0425d053ad025be3bac084b90" + }, + "identityMatch": true, + "oldIdentity": { + "index": 4, + "label": "rate", + "tag": "input", + "type": "range" + }, + "runtimeErrors": [], + "visuallyInspected": true, + "manualEvidence": [ + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/requests/request-25-claude-load-rate-low.json", + "sha256": "1891dfae848df8d4fe3967b0892de45d05a81833f6ca25f7e418ab104d2c4e79", + "role": "manual replay evidence" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/request-25-claude-load-rate-low.actions.json", + "sha256": "5d0608c96cf2ed22bf99389b9b3a3414248a15c7908e607083468551cb5ca368", + "role": "manual replay evidence" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/request-25-claude-load-rate-low.log", + "sha256": "517fef6ec4b65a08f4d5a2becb1b33ef6df81b084cc02a596e16d4b7416cef6f", + "role": "manual replay evidence" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/25-claude-load-rate-low-at-10000.png", + "sha256": "f22b31a8e36905cbfaad5faa04dd0649b00175ea18dc9d9e9fd2d755b8b618d8", + "role": "manual replay evidence" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/25-claude-load-rate-low-at-15000.png", + "sha256": "b4234676ada0ebbde7257217524284302df8961c7a139b31ca93aec60cd9c398", + "role": "manual replay evidence" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/25-claude-load-rate-low-at-20000.png", + "sha256": "e0ae92b6ed7f094c13a33aa49cf53aac8846476ba9c72144bc83fd4be1a8fdb8", + "role": "manual replay evidence" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/requests/request-26-claude-load-rate-high.json", + "sha256": "3e6c73eeadcb904a5f0c685a64a9a5df40a45c63d25be2db6fd92933ab2b9801", + "role": "manual replay evidence" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/request-26-claude-load-rate-high.actions.json", + "sha256": "c36f86bdc3011e26d649533b3dbb764d6e6b766113d08c96039a05ff3a91a5e9", + "role": "manual replay evidence" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/request-26-claude-load-rate-high.log", + "sha256": "1251abcd7b69df224672a29c59434f1bb60785b513c35384fed386707adc3c6c", + "role": "manual replay evidence" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/26-claude-load-rate-high-at-10000.png", + "sha256": "d9b6f05438f49427c7d8f4406eda616520724522204d438520ae76b3a9e3e6e4", + "role": "manual replay evidence" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/26-claude-load-rate-high-at-15000.png", + "sha256": "9b4512504b686ed11a0c8d268e3a55260f8b970f458f0beb6d2f3d4c5039ae85", + "role": "manual replay evidence" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/26-claude-load-rate-high-at-20000.png", + "sha256": "576bbee73032b52c17dbd8cdda92c1a80768e2d96cfa438f17d9081c8bf26479", + "role": "manual replay evidence" + } + ], + "replayVerdict": "unproven", + "replayReason": "Slider moves from about 1.2 to 3.5 requests/s, but the observed queue/count/latency changes also occur autonomously under Random routing. Screenshots do not isolate a traffic-rate effect beyond input chrome. Prepared fresh-page equal-time requests25/26 compare low and high rate under fixed Round robin." + }, + { + "revision": "f009de5838f80b90e861e5727f0ad11cba8814f8", + "pluginRevision": "9de99949792c2c59b70693c1dcda6aa8cf36b428", + "provider": "claude-code", + "prompt": "load-balancer", + "width": 710, + "index": 5, + "label": "slow", + "verdict": "live", + "reason": "Fresh-page equal-time requests27/28 hold Round robin and 4 req/s constant, changing only slowdown via real Home/End. At ~10.01/~10.02 s, inspected PNGs show identical A/B=5/6 but C=6 versus 8 and drops=0 versus 2; at ~20.02/~20.01 s the inspected drop counts are 9 versus 19 (averages 6.7 versus 6.9 s). This repeatable Server C pressure difference proves live service-time input beyond autonomous queue motion.", + "mode": "drag", + "automaticPass": false, + "v3Result": { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/claude-code/load-balancer/result.json", + "sha256": "7dc748d4f64c8368c9c5a1eed397594fb82640bf3abf123f76405587c3faaf42" + }, + "evidence": [ + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/claude-code/load-balancer/width-710/control-5-drag-before2.png", + "sha256": "cdebb480db5d5aa3e1ffd40719180fe32d2c0866339b453ef2a729ae8d08f3ac", + "role": "before2" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/claude-code/load-balancer/width-710/control-5-drag-after0.png", + "sha256": "910a7f4f38ef808a70439f5da93853c376c601e27639a99c6f70e4235cb6c04d", + "role": "after0" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/replay-pairs/prototype/claude-code/load-balancer-710-5.png", + "sha256": "b30c06f979bdd6727529c80fed89de88d642fb1af396a8b40586c96e6416d7e6", + "role": "visually inspected comparison" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/27-claude-load-slow-min-at-10000.png", + "sha256": "f3b1ae0e0c32218d4ceeb734f16ba0ca87eba4e0a1ea5d025e30546dac033bbb", + "role": "additional inspected evidence" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/27-claude-load-slow-min-at-20000.png", + "sha256": "ca3c899b225cbc05fd1d16a972aa5ea6f5cd3c68acd5b07091a55ec9673a2b55", + "role": "additional inspected evidence" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/28-claude-load-slow-max-at-10000.png", + "sha256": "d9b6f05438f49427c7d8f4406eda616520724522204d438520ae76b3a9e3e6e4", + "role": "additional inspected evidence" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/28-claude-load-slow-max-at-20000.png", + "sha256": "58423de691809830e896ca65d45fbf9445d09772e23d52b04a86c64d20f90c0d", + "role": "additional inspected evidence" + } + ], + "allProbeFrames": [ + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/claude-code/load-balancer/width-710/control-5-drag-before0.png", + "sha256": "9cd69fc277700314d9f6c79b5e3c2e4862d759fb4d9e6d02f613178c7cf5bd2a" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/claude-code/load-balancer/width-710/control-5-drag-before1.png", + "sha256": "c36065a550fd6b671036464981919b1fd9e7162099aed5ec19958ac0e065d322" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/claude-code/load-balancer/width-710/control-5-drag-before2.png", + "sha256": "cdebb480db5d5aa3e1ffd40719180fe32d2c0866339b453ef2a729ae8d08f3ac" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/claude-code/load-balancer/width-710/control-5-drag-after0.png", + "sha256": "910a7f4f38ef808a70439f5da93853c376c601e27639a99c6f70e4235cb6c04d" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/claude-code/load-balancer/width-710/control-5-drag-after1.png", + "sha256": "9edc23d70d30c3630b5a15c8f3207416bed3d7e1925e5404eedd888132a15496" + } + ], + "source": { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/manual-plan-sources/prototype-claude-code-load-balancer.html", + "sha256": "319193ec09d22217bda7f331863c0940de3a7cf0425d053ad025be3bac084b90" + }, + "identityMatch": true, + "oldIdentity": { + "index": 5, + "label": "slow", + "tag": "input", + "type": "range" + }, + "runtimeErrors": [], + "visuallyInspected": true, + "manualEvidence": [ + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/requests/request-27-claude-load-slow-min.json", + "sha256": "c761a69397578d7df764e21c3d0da8198d4fdf59d179de37370b02555687a9e6", + "role": "manual replay evidence" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/request-27-claude-load-slow-min.actions.json", + "sha256": "2152996482df81fee17573d7ed3d8c8bc6600be4300025157b149d0854940c93", + "role": "manual replay evidence" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/request-27-claude-load-slow-min.log", + "sha256": "9e59f4df4b586f84751d350602cf3f727b263162d64dfc699366d71457782637", + "role": "manual replay evidence" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/27-claude-load-slow-min-at-10000.png", + "sha256": "f3b1ae0e0c32218d4ceeb734f16ba0ca87eba4e0a1ea5d025e30546dac033bbb", + "role": "manual replay evidence" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/27-claude-load-slow-min-at-15000.png", + "sha256": "8d57260e4815c21edc1cd11c85b9f84802baf86c35163d0c85322716fcb5c2d0", + "role": "manual replay evidence" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/27-claude-load-slow-min-at-20000.png", + "sha256": "ca3c899b225cbc05fd1d16a972aa5ea6f5cd3c68acd5b07091a55ec9673a2b55", + "role": "manual replay evidence" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/requests/request-28-claude-load-slow-max.json", + "sha256": "ac1e1c0931399a1972de2e334ac5fa5ed85803d18ffd3ca84811fa9b10d3bfe8", + "role": "manual replay evidence" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/request-28-claude-load-slow-max.actions.json", + "sha256": "977db20aecd1ae0d2163a8f2ba576e77dabde6440a0778bcf04417fa815f5718", + "role": "manual replay evidence" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/request-28-claude-load-slow-max.log", + "sha256": "2b23eb06b70d466a714ec45d98a0bf460e20fd08057da1c879cd5647fe92cc0b", + "role": "manual replay evidence" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/28-claude-load-slow-max-at-10000.png", + "sha256": "d9b6f05438f49427c7d8f4406eda616520724522204d438520ae76b3a9e3e6e4", + "role": "manual replay evidence" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/28-claude-load-slow-max-at-15000.png", + "sha256": "9b4512504b686ed11a0c8d268e3a55260f8b970f458f0beb6d2f3d4c5039ae85", + "role": "manual replay evidence" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/28-claude-load-slow-max-at-20000.png", + "sha256": "58423de691809830e896ca65d45fbf9445d09772e23d52b04a86c64d20f90c0d", + "role": "manual replay evidence" + } + ], + "replayVerdict": "unproven", + "replayReason": "Server C slowdown slider changes about 1.5x to 3.5x, while all queues, average latency and drop count keep evolving. This short Random-routing pair cannot isolate changed service time from autonomous traffic. Prepared requests27/28 compare min/max slowdown at equal elapsed times under fixed rate and Round robin." + }, + { + "revision": "f009de5838f80b90e861e5727f0ad11cba8814f8", + "pluginRevision": "9de99949792c2c59b70693c1dcda6aa8cf36b428", + "provider": "claude-code", + "prompt": "notification-settings", + "width": 710, + "index": 2, + "label": "Daily digest", + "verdict": "live", + "reason": "Daily digest click removes the time picker and the daily-digest clause from the explanatory sentence. The screenshot pair confirms real output despite card shrink, matching the digest parameter handler.", + "mode": "primary", + "automaticPass": true, + "v3Result": { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/claude-code/notification-settings/result.json", + "sha256": "ea576242765ff23cfc62388b843e2ca6584be55768953a3ffc04172373422632" + }, + "evidence": [ + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/claude-code/notification-settings/width-710/control-2-primary-before2.png", + "sha256": "3df946977b7e31fdca2433c235c9e16858e4ee17f2ac41ccef791d588f332327", + "role": "before2" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/claude-code/notification-settings/width-710/control-2-primary-after0.png", + "sha256": "1974d3cb3110cea65af72298bc2462db9cf9da46ac1c20babdba7bb7356cae7e", + "role": "after0" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/replay-pairs/prototype/claude-code/notification-settings-710-2.png", + "sha256": "1a68dabe7e5fb70b57268007a8c48c53eb7fcef66c72da52182cd743ecebdea0", + "role": "visually inspected comparison" + } + ], + "allProbeFrames": [ + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/claude-code/notification-settings/width-710/control-2-primary-before0.png", + "sha256": "3df946977b7e31fdca2433c235c9e16858e4ee17f2ac41ccef791d588f332327" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/claude-code/notification-settings/width-710/control-2-primary-before1.png", + "sha256": "3df946977b7e31fdca2433c235c9e16858e4ee17f2ac41ccef791d588f332327" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/claude-code/notification-settings/width-710/control-2-primary-before2.png", + "sha256": "3df946977b7e31fdca2433c235c9e16858e4ee17f2ac41ccef791d588f332327" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/claude-code/notification-settings/width-710/control-2-primary-after0.png", + "sha256": "1974d3cb3110cea65af72298bc2462db9cf9da46ac1c20babdba7bb7356cae7e" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/claude-code/notification-settings/width-710/control-2-primary-after1.png", + "sha256": "1974d3cb3110cea65af72298bc2462db9cf9da46ac1c20babdba7bb7356cae7e" + } + ], + "source": { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/manual-plan-sources/prototype-claude-code-notification-settings.html", + "sha256": "59058faaf2addc0e7720f54f677005f80d11f96c9c42f6f5951c1314457eb494" + }, + "identityMatch": true, + "oldIdentity": { + "index": 2, + "label": "Daily digest", + "tag": "button", + "type": "button" + }, + "runtimeErrors": [], + "visuallyInspected": true + }, + { + "revision": "f009de5838f80b90e861e5727f0ad11cba8814f8", + "pluginRevision": "9de99949792c2c59b70693c1dcda6aa8cf36b428", + "provider": "claude-code", + "prompt": "notification-settings", + "width": 710, + "index": 3, + "label": "Send digest at", + "verdict": "live", + "reason": "Request22 starts from fresh digest-enabled state and uses real keys on the visible time select. The inspected pair changes the separate summary from daily digest at 7 AM to 9 AM; both after logs confirm digest remains enabled and digestTime=9. The former failure was the earlier trial hiding the select.", + "mode": "primary", + "automaticPass": false, + "v3Result": { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/claude-code/notification-settings/result.json", + "sha256": "ea576242765ff23cfc62388b843e2ca6584be55768953a3ffc04172373422632" + }, + "evidence": [ + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/claude-code/notification-settings/width-710/control-3-primary-before2.png", + "sha256": "1974d3cb3110cea65af72298bc2462db9cf9da46ac1c20babdba7bb7356cae7e", + "role": "before2" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/claude-code/notification-settings/width-710/control-3-primary-after0.png", + "sha256": "1974d3cb3110cea65af72298bc2462db9cf9da46ac1c20babdba7bb7356cae7e", + "role": "after0" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/replay-pairs/prototype/claude-code/notification-settings-710-3.png", + "sha256": "384447bcd131295c8b77aa617149d6618d5e37d63ddacae61d606a8d51b34758", + "role": "visually inspected comparison" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/pairs/22-claude-notification-time-after0.png", + "sha256": "5a6c190e33fae7974c6ec0f10e92310374a0ec8a6ae39f173c7a11ee3f8783a9", + "role": "additional inspected evidence" + } + ], + "allProbeFrames": [ + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/claude-code/notification-settings/width-710/control-3-primary-before0.png", + "sha256": "1974d3cb3110cea65af72298bc2462db9cf9da46ac1c20babdba7bb7356cae7e" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/claude-code/notification-settings/width-710/control-3-primary-before1.png", + "sha256": "1974d3cb3110cea65af72298bc2462db9cf9da46ac1c20babdba7bb7356cae7e" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/claude-code/notification-settings/width-710/control-3-primary-before2.png", + "sha256": "1974d3cb3110cea65af72298bc2462db9cf9da46ac1c20babdba7bb7356cae7e" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/claude-code/notification-settings/width-710/control-3-primary-after0.png", + "sha256": "1974d3cb3110cea65af72298bc2462db9cf9da46ac1c20babdba7bb7356cae7e" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/claude-code/notification-settings/width-710/control-3-primary-after1.png", + "sha256": "1974d3cb3110cea65af72298bc2462db9cf9da46ac1c20babdba7bb7356cae7e" + } + ], + "source": { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/manual-plan-sources/prototype-claude-code-notification-settings.html", + "sha256": "59058faaf2addc0e7720f54f677005f80d11f96c9c42f6f5951c1314457eb494" + }, + "identityMatch": true, + "oldIdentity": { + "index": 3, + "label": "Send digest at", + "tag": "select", + "type": "select-one" + }, + "runtimeErrors": [], + "visuallyInspected": true, + "manualEvidence": [ + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/requests/request-22-claude-notification-time.json", + "sha256": "b168c756b9c7ab3a1378460b3b4324e40f9bd14e4820bc9f364ac638b1456e54", + "role": "manual replay evidence" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/request-22-claude-notification-time.actions.json", + "sha256": "dd16a6915c7259a2e831f0018c6715f7dff591980d6434e6e921723e6537e270", + "role": "manual replay evidence" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/request-22-claude-notification-time.log", + "sha256": "4e03791824a582af5b67963427b6c2df3f5001d02dc48da6b76710009a4b3870", + "role": "manual replay evidence" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/22-claude-notification-time-after0.png", + "sha256": "7cd49effbaa7624e58317487511bfc87f817e31eeb8bd20e248faa2dd9a4778b", + "role": "manual replay evidence" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/22-claude-notification-time-after1.png", + "sha256": "7cd49effbaa7624e58317487511bfc87f817e31eeb8bd20e248faa2dd9a4778b", + "role": "manual replay evidence" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/22-claude-notification-time-before0.png", + "sha256": "700ee47e4cb93253caf02ff679f5795fe610a9dbdbefd78317d51a9f3e323687", + "role": "manual replay evidence" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/22-claude-notification-time-before1.png", + "sha256": "700ee47e4cb93253caf02ff679f5795fe610a9dbdbefd78317d51a9f3e323687", + "role": "manual replay evidence" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/22-claude-notification-time-before2.png", + "sha256": "700ee47e4cb93253caf02ff679f5795fe610a9dbdbefd78317d51a9f3e323687", + "role": "manual replay evidence" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/pairs/22-claude-notification-time-after0.png", + "sha256": "5a6c190e33fae7974c6ec0f10e92310374a0ec8a6ae39f173c7a11ee3f8783a9", + "role": "manual replay evidence" + } + ], + "replayVerdict": "unproven", + "replayReason": "Both screenshots show Daily digest off, so the Send digest at select is hidden. The earlier toggle hid it before its trial. Source condition digest=true reveals it and summary uses digestTime; this replay never exercised that prerequisite. Prepared request22 starts from the fresh page with digest enabled and changes the select." + } + ], + "cardChecks": [ + { + "prompt": "spray-bottle", + "v3Result": { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/claude-code/spray-bottle/result.json", + "sha256": "28ba789bc8819e5513e5c01700e81accc9bda869360362ec66a264c789345cdc" + }, + "rawResult": { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype/claude-code/spray-bottle/result.json", + "sha256": "d172558bbf06255037c4f85e5afff56b6bcc3bcd7f7d4b5de2d7a836895b5e80" + }, + "requiredControls": [ + "spray-bottle/710/0", + "spray-bottle/710/3", + "spray-bottle/710/4", + "spray-bottle/710/5" + ], + "reviewed": true, + "note": "All four prior failures inspected as before/after PNGs; after1 inspected for all three nozzle settings to separate mode-specific flow from pump phase.", + "evidence": [] + }, + { + "prompt": "seat-belt", + "v3Result": { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/claude-code/seat-belt/result.json", + "sha256": "c7930d7ce27161e2f6db9c33fae187bc1a6096de83a94177fa1eb912bf226203" + }, + "rawResult": { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype/claude-code/seat-belt/result.json", + "sha256": "966cf98dc575658b6d892d8f977964d98ff71293e670d0996d68be4a9d09db00" + }, + "requiredControls": [ + "seat-belt/710/0" + ], + "reviewed": true, + "note": "The only prior failing stage was visually inspected; supported Home produces both model geometry and numerical state change.", + "evidence": [] + }, + { + "prompt": "toaster", + "v3Result": { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/claude-code/toaster/result.json", + "sha256": "bc3162d90a3cd8d580b656dda4f6f2925dcff4f949ff8c3e40288a88d0f70dc4" + }, + "rawResult": { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype/claude-code/toaster/result.json", + "sha256": "60d78421d502a33d6e4c60ac792a2dce029bb5be17160d75aa1d3dc420158512" + }, + "requiredControls": [ + "toaster/710/0", + "toaster/710/2" + ], + "reviewed": true, + "note": "Both prior failing controls visually inspected; browning has stable predicted-output proof despite automatic region threshold failing.", + "evidence": [] + }, + { + "prompt": "umbrella", + "v3Result": { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/claude-code/umbrella/result.json", + "sha256": "a7b8836d998028c6d5081189bb577f86b00dac268c0f1ab74bca6cc5d8e989cd" + }, + "rawResult": { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype/claude-code/umbrella/result.json", + "sha256": "ad130c968a97efde5a5995b576fb9d675c9617bee80992c9bd72c0bcfe6f57e1" + }, + "requiredControls": [], + "reviewed": true, + "note": "No previous or current failing controls. Stage before/after comparison additionally inspected: full closed-to-open canopy and runner displacement matches source drag behavior; all control identities remain matched.", + "evidence": [ + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/replay-pairs/prototype/claude-code/umbrella-710-0.png", + "sha256": "6c3cdfbba95dbff8a2434f195853d97981e71259db808c3780ff2841b964c716", + "role": "visually inspected comparison" + } + ] + }, + { + "prompt": "database-index", + "v3Result": { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/claude-code/database-index/result.json", + "sha256": "f90dc75b9440f9d4fe4901979b5f87522573eee11c3b73d0c7448858c8f141d2" + }, + "rawResult": { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype/claude-code/database-index/result.json", + "sha256": "98265fa8cd45c97bac34bae9784dd7baf72290b9595b0ddeeaaf81b4fe36101b" + }, + "requiredControls": [ + "database-index/710/0", + "database-index/710/1", + "database-index/710/2", + "database-index/710/3" + ], + "reviewed": true, + "note": "All four previously failed controls visually inspected; all have supported, causal model-output changes.", + "evidence": [] + }, + { + "prompt": "git-merge", + "v3Result": { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/claude-code/git-merge/result.json", + "sha256": "b27e9df0705a4d96e47801e96bc0826c5cdd3f6a481880bd998fda4e0644a945" + }, + "rawResult": { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype/claude-code/git-merge/result.json", + "sha256": "a3d14e7dad8d19f0ccdb877b206cd429f547caa0ecfb316adce140b9d120b6ce" + }, + "requiredControls": [ + "git-merge/710/0", + "git-merge/710/5" + ], + "reviewed": true, + "note": "Both initial failures resolved by inspected real-input manual requests20/21: supported stage key and select endpoint precondition.", + "evidence": [] + }, + { + "prompt": "websocket", + "v3Result": { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/claude-code/websocket/result.json", + "sha256": "8a3a0490dbba7ea6ae68afd10cb72d40b72e697c844137b81348757425c5649c" + }, + "rawResult": { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype/claude-code/websocket/result.json", + "sha256": "a1710127b7fdf740090195c6c82f0013c0b6a8a9e830f7e96b5e735605eb1951" + }, + "requiredControls": [ + "websocket/710/0", + "websocket/710/1", + "websocket/710/2", + "websocket/710/4", + "websocket/710/5" + ], + "reviewed": true, + "note": "All five prior failures now live: four v3 visual proofs plus conditional polling interval request23.", + "evidence": [] + }, + { + "prompt": "load-balancer", + "v3Result": { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/claude-code/load-balancer/result.json", + "sha256": "7dc748d4f64c8368c9c5a1eed397594fb82640bf3abf123f76405587c3faaf42" + }, + "rawResult": { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype/claude-code/load-balancer/result.json", + "sha256": "62bb8fdd212236d1dbe8dd00341e63b72b4fdd85d4a087bbab9c5006eb163971" + }, + "requiredControls": [ + "load-balancer/710/0", + "load-balancer/710/1", + "load-balancer/710/2", + "load-balancer/710/3", + "load-balancer/710/4", + "load-balancer/710/5" + ], + "reviewed": true, + "note": "All six prior failures now live. Four supported algorithm/stage readout changes plus fresh-page equal-time low/high rate and slow/no-slow comparisons with actual queue/drop output.", + "evidence": [] + }, + { + "prompt": "notification-settings", + "v3Result": { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/claude-code/notification-settings/result.json", + "sha256": "ea576242765ff23cfc62388b843e2ca6584be55768953a3ffc04172373422632" + }, + "rawResult": { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype/claude-code/notification-settings/result.json", + "sha256": "8ee212f64859dae950bad71de6d490cb29a6e1939f66805de771494a23ba562e" + }, + "requiredControls": [ + "notification-settings/710/2", + "notification-settings/710/3" + ], + "reviewed": true, + "note": "Digest resize proof inspected in v3; conditional time select proven in fresh digest-enabled request22.", + "evidence": [] + }, + { + "prompt": "narrow-toggle", + "v3Result": { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/claude-code/narrow-toggle/result.json", + "sha256": "db8dfe666c15aba2e265cb2cce614ca0418f0ca1f919ab9a2cf2201fdd03f3f4" + }, + "rawResult": { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype/claude-code/narrow-toggle/result.json", + "sha256": "0ae3296784cca3b049f5561182504179c6d947a4d26c716deb27cbbb3ff05d50" + }, + "requiredControls": [], + "reviewed": true, + "note": "All three before/after pairs at 360, 390 and 480 px visually inspected. Click changes entire preview theme and Dark mode is on/off text. Control is live at all widths, although the fixed sidebar leaves severe word wrapping in the preview column at 360/390 px (layout issue, not dead control).", + "evidence": [ + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/replay-pairs/prototype/claude-code/narrow-toggle-360-0.png", + "sha256": "616f41a2e3044ded3c6d7e3d536296a163b8afa46348b88737c538a5a88ec4a1", + "role": "visually inspected comparison" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/replay-pairs/prototype/claude-code/narrow-toggle-390-0.png", + "sha256": "f6b7f2261d3d6777714a60ab72e811f87f0efdf2abff2ce3f54e2fe4732152bf", + "role": "visually inspected comparison" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/replay-pairs/prototype/claude-code/narrow-toggle-480-0.png", + "sha256": "f8df10fd00a6873dd2d2283a63251a0c250b6356d364bd7d981d49044ed188b9", + "role": "visually inspected comparison" + } + ] + } + ], + "method": "Independent source-handler and actual PNG inspection of every prior failing/newly passing or still-failing control for the assigned ten Claude prototype prompts. No agent rerun, browser launch, state mutation, or central adjudication edit.", + "updatedAt": "2026-10-20T07:00:35.655025+00:00" +} diff --git a/plugins/playgrounds/evals/launch/reports/gate-1/replay-visual-review-claude-prototype-extra.md b/plugins/playgrounds/evals/launch/reports/gate-1/replay-visual-review-claude-prototype-extra.md new file mode 100644 index 000000000..20cff9a12 --- /dev/null +++ b/plugins/playgrounds/evals/launch/reports/gate-1/replay-visual-review-claude-prototype-extra.md @@ -0,0 +1,32 @@ +# Claude prototype extra visual review + +Frozen head: f009de5838f80b90e861e5727f0ad11cba8814f8. Complete: True. Reviewed 10/10 assigned prompts. + +| Prompt | Width | Control | Verdict | Evidence-based reason | +|---|---:|---|---|---| +| spray-bottle | 710 | 0 Trigger sprayer: arrow keys squeeze and release the trigger, space toggles auto pump | live | Supported End key moves the piston from rest to full squeeze, compresses the spring and moves the trigger; readout changes from Rest/cylinder full to Held/both valves shut. The source End handler sets trigger=100 and disables auto pump, so the geometry is input-caused rather than ambient settling. | +| spray-bottle | 710 | 3 Spray | live | The before frame shows a narrow stream with Stream selected; the additionally inspected after1 frame shows a broad spray cone with Spray selected. Source nozzle-mode handler changes spread from 0.02 to 0.36; auto pumping supplies the squeeze, and the mode-specific pattern proves this control despite moving pixels failing the static threshold. | +| spray-bottle | 710 | 4 Stream | live | Before shows the broad spray droplets and Spray selected; after0 shows a narrow contiguous stream with Stream selected. The source stream branch changes particle spread/radius/speed, matching the visible pattern. Later after1 is the refill phase, explaining why persistent-pixel scoring remains unproven. | +| spray-bottle | 710 | 5 Off | live | Off stops ejection and restores the trigger while both after frames display Nozzle shut / water cannot compress / trigger is stuck. This is the source nozzle-off hydraulic lock branch, not merely selected-button styling; automatic pump remains enabled. | +| seat-belt | 710 | 0 Seat belt retractor: arrow keys change braking in g, M switches between car braking and belt yank | live | Supported Home key changes braking from 0.80 g (locked by pendulum after 22 mm) to 0.00 g (free, 0 mm out), with the pendulum and pawl visibly returning. Source Home sets zero and reduced-motion settles the model deterministically, so the change is not autonomous timing or focus outline. | +| toaster | 710 | 0 Toaster: Space presses the lever, arrow keys set browning | live | Stage click invokes the supported press/cancel handler. Before shows popped bread with lever raised; after shows bread lowered, compressed spring, hot element and active strip temperature/time. This is a new toast cycle started by the click, not focus styling. | +| toaster | 710 | 2 tw-browning | live | Browning drag changes dial 2 to 5.5, visibly rotates the drawn dial and moves the trip stop; predicted next pop time changes from about 1:23 to 3:30 and remains 3:30 in after1. Previous pop time stays 1:23, so the new prediction is caused by browning rather than ongoing heating. | +| database-index | 710 | 0 B-tree lookup: arrow keys pick the id, i toggles the index | live | Supported ArrowRight changes lookup id from 420,000 to 530,000, updates the explanation and highlights a different leaf/table route. Source increments normalized key by 11; reduced-motion uses the final lookup state, excluding an autonomous tour. | +| database-index | 710 | 1 No index | live | No index click changes B-tree 4 page reads to Full scan 10,000 page reads and rewrites the explanation. Body height shrinks, but actual calculated output changes, matching the index=false branch. | +| database-index | 710 | 2 B-tree index | live | B-tree index click changes Full scan 10,000 pages to 4 page reads and restores the index-path explanation and visible highlighted route. This is the supported index=true branch, not selected-button appearance. | +| database-index | 710 | 3 Rows in table, powers of ten | live | Rows slider changes 10 thousand to 100 million rows; output changes from 3 to 5 index page reads, hypothetical scan from 100 to 1,000,000, and lookup id from 4,200 to 42,000,000. The size/read-count model matches these changes despite text wrapping and card resize. | +| git-merge | 710 | 0 Merge bench: keys 1 to 4 cycle each hunk, M toggles whether main moved | live | Real-input request20 presses supported key 1 on the stage. The before/after PNGs show hunk1 feature and result blocks changing A to B while the unrelated conflict remains. Logs confirm hunk1 none→feature; the persistent drawn output proves the stage despite generic unsupported probes failing. | +| git-merge | 710 | 5 Neither branchFeature onlyMain onlyBoth, identicallyBoth, differently | live | Request21 first uses Home to leave the final option, then ArrowDown/Enter on #h3. The inspected pair changes the last result block A→B and the explanation/readout from 1 to 2 hunks from feature. Both after logs retain the changed output, establishing a live select rather than the old endpoint no-op. | +| websocket | 710 | 0 WebSocket chat: Enter sends a message, M switches between WebSocket and polling, arrows change the poll interval | live | Supported stage click adds a third message line to all three client pads (two before, three in both after images). Source click invokes send and reduced-motion disables automatic touring, so the added bubbles are causal message delivery. The automatic semantic gate misses opacity-revealed SVG message paths. | +| websocket | 710 | 1 WebSocket | live | WebSocket click changes polling average/worst 1.6/3.1 s and 20 requests/min to 100/100 ms and zero polling requests, restores open wires, hides interval and shows completed handshake. These model outputs directly match mode=websocket. | +| websocket | 710 | 2 Polling | live | Polling click changes 100ms delivery and zero polls to 1.6s average, 3.1s worst and 20 requests/min; exposes interval and explains timed polling. Actual outputs change even though card height grows. | +| websocket | 710 | 4 latency | live | Latency drag changes one-way 50 to 270 ms; average delivery changes 1.6 to 2.0 s and worst case 3.1 to 3.5 s while interval stays 3s and request rate stays 20. This is the model latency effect, not autonomous packet traffic. | +| websocket | 710 | 5 interval | live | Request23 enables Polling, sets #interval to Home then End with real keys. Inspected PNGs change interval 1→15 s, independent average delivery 600 ms→7.6 s and requests/min 60→4; latency stays 50 ms. Both after logs retain the new readout, proving the previously unexercised conditional control. | +| load-balancer | 710 | 0 Load balancer figure: left and right arrows change the algorithm, up and down change the traffic | live | Supported ArrowRight changes algorithm from Round robin to Least-connections in the independent model readout. The source key handler updates algo and pick() consults it. Queue evolution is visible but is not used alone as causal proof because traffic runs continuously. | +| load-balancer | 710 | 1 Round robin | live | Round robin click changes the model readout from Least-connections to Round-robin, beyond selected-button styling. The source handler feeds the actual dispatch pick() branch. Simultaneous queue/average changes are not independently attributed to the click. | +| load-balancer | 710 | 2 Least connections | live | Least connections click changes the model readout from Round-robin to Least-connections. Source maps this parameter to minimum-open-connections dispatch; readout change is causal, while the moving queue is treated as background rather than standalone proof. | +| load-balancer | 710 | 3 Random | live | Random click changes the model readout from Round-robin to Random. Source dispatch pick() uses the selected random branch; no automatic cycling changes the algorithm. Changing queue counts alone is not counted as proof. | +| load-balancer | 710 | 4 rate | live | Fresh-page equal-time requests25/26 use Round robin and 4x Server C slowdown, changing only traffic through real Home/End input. At ~20.02/~20.01 s, inspected PNGs show open connections A/B/C=1/0/1 at 0.5 req/s versus 8/7/8 at 4 req/s, average 2.6→6.9 s, drops 0→19. Logs corroborate the contrast at 10 and 15 s. This isolates a substantial modeled load effect beyond the slider and autonomous aging of one run. | +| load-balancer | 710 | 5 slow | live | Fresh-page equal-time requests27/28 hold Round robin and 4 req/s constant, changing only slowdown via real Home/End. At ~10.01/~10.02 s, inspected PNGs show identical A/B=5/6 but C=6 versus 8 and drops=0 versus 2; at ~20.02/~20.01 s the inspected drop counts are 9 versus 19 (averages 6.7 versus 6.9 s). This repeatable Server C pressure difference proves live service-time input beyond autonomous queue motion. | +| notification-settings | 710 | 2 Daily digest | live | Daily digest click removes the time picker and the daily-digest clause from the explanatory sentence. The screenshot pair confirms real output despite card shrink, matching the digest parameter handler. | +| notification-settings | 710 | 3 Send digest at | live | Request22 starts from fresh digest-enabled state and uses real keys on the visible time select. The inspected pair changes the separate summary from daily digest at 7 AM to 9 AM; both after logs confirm digest remains enabled and digestTime=9. The former failure was the earlier trial hiding the select. | diff --git a/plugins/playgrounds/evals/launch/reports/gate-1/replay-visual-review-codex-baseline-manual.json b/plugins/playgrounds/evals/launch/reports/gate-1/replay-visual-review-codex-baseline-manual.json new file mode 100644 index 000000000..47d808897 --- /dev/null +++ b/plugins/playgrounds/evals/launch/reports/gate-1/replay-visual-review-codex-baseline-manual.json @@ -0,0 +1,181 @@ +{ + "revision": "f009de5838f80b90e861e5727f0ad11cba8814f8", + "pluginRevision": "a632572aa58adc9b6ddf947c9e527587d09f22ca", + "complete": true, + "updatedAt": "2026-10-20T06:13:36.552232+00:00", + "method": "Independent actual before2/after0 image inspection of two saved manual real-input interactions; observation-only eval corroboration. Exact manual target URL and width match saved v3 proof. No browser/server/provider started; raw evidence and central adjudications unchanged.", + "controls": [ + { + "revision": "f009de5838f80b90e861e5727f0ad11cba8814f8", + "pluginRevision": "a632572aa58adc9b6ddf947c9e527587d09f22ca", + "provider": "codex", + "prompt": "notification-settings", + "width": 558, + "index": 3, + "label": "Delivery time \u00b7 UTC", + "verdict": "live", + "reason": "Both actual images show digest enabled. The native selector changes Morning (8 AM) to Evening (6 PM), and the independent notification preview changes from 8 AM UTC to 6 PM UTC. The retained observation-only eval agrees (08 to 18); the log is console-clean. This proves the native-key route without a driver change. Reset defaults remains independently dead.", + "mode": "native-select Home/Enter then End/Enter", + "automaticPass": true, + "v3Result": { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/notification-settings/result.json", + "sha256": "c9e1df7a66812f0637c3c549af67dca46182859f97beec8504e1cb4efcc967d5" + }, + "evidence": [ + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-manual-review/05-codex-delivery-time-before2.png", + "sha256": "eca5e99d734df824a181f700240bc8895293cf2fff5526a19d64a2219ee6174a", + "role": "before2: visually inspected original" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-manual-review/05-codex-delivery-time-after0.png", + "sha256": "2ed90fc8c636b2f909f937837b5cea2877a2387631df318369954e8822a6c124", + "role": "after0: visually inspected original" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-manual-review/request-05-codex-delivery-time.log", + "sha256": "32f60246a8d1f34114ecd68e19c7306016bfb5e585e79a5e5cfb669a4778edee", + "role": "manual driver log" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-manual-review/request-05-codex-delivery-time.actions.json", + "sha256": "18a95d502c3f21f5282cd2d338bfc1825dcbbf888d0755b09a210fe331853955", + "role": "real input actions; eval observation only" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-manual-review/requests/request-05-codex-delivery-time.json", + "sha256": "7dcb980cf6ff0459030664a54079e779ac6077aaa3b7f87ebc00cfba6f44c0c3", + "role": "request identity and width" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-manual-review/request-05-codex-delivery-time.exit.json", + "sha256": "f229e8e3093f537e5144b4983f729bd32b5edcb92f00ec608406646a29345914", + "role": "driver exit" + } + ], + "allProbeFrames": [ + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-manual-review/05-codex-delivery-time-before0.png", + "sha256": "eca5e99d734df824a181f700240bc8895293cf2fff5526a19d64a2219ee6174a" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-manual-review/05-codex-delivery-time-before1.png", + "sha256": "eca5e99d734df824a181f700240bc8895293cf2fff5526a19d64a2219ee6174a" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-manual-review/05-codex-delivery-time-before2.png", + "sha256": "eca5e99d734df824a181f700240bc8895293cf2fff5526a19d64a2219ee6174a" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-manual-review/05-codex-delivery-time-after0.png", + "sha256": "2ed90fc8c636b2f909f937837b5cea2877a2387631df318369954e8822a6c124" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-manual-review/05-codex-delivery-time-after1.png", + "sha256": "2ed90fc8c636b2f909f937837b5cea2877a2387631df318369954e8822a6c124" + } + ], + "source": { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/control-audit-codex-sources/baseline-notification-settings.html", + "sha256": "4b8879343525f790b93b6e73d53f7f98ad4e12ff74f2a612b05ace2b691a1ccc" + }, + "identityMatch": true, + "oldIdentity": { + "index": 3, + "label": "Delivery time \u00b7 UTC", + "tag": "select", + "type": "select-one" + }, + "runtimeErrors": [], + "manualConsoleClean": true, + "visuallyInspected": true, + "cardPassOverride": false + }, + { + "revision": "f009de5838f80b90e861e5727f0ad11cba8814f8", + "pluginRevision": "a632572aa58adc9b6ddf947c9e527587d09f22ca", + "provider": "codex", + "prompt": "git-merge", + "width": 710, + "index": 4, + "label": "What is being compared?", + "verdict": "live", + "reason": "The actual before image has the disclosure closed; the after image visibly reveals the full explanatory paragraph about three-way merges, additions/deletions/renames and ancestry. This is revealed content, not merely a chevron or layout change. The observation-only eval confirms open=true and the same paragraph, and the log is console-clean. This proves expansion; collapse was not exercised. The independent keyboard surface remains dead.", + "mode": "click details > summary", + "automaticPass": false, + "v3Result": { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/git-merge/result.json", + "sha256": "2356bce996be14eabc9cb4bb2d6768f829c1837596c41e9be98d49a316c64bbc" + }, + "evidence": [ + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-manual-review/06-codex-git-disclosure-before2.png", + "sha256": "da8f9258c73128066a301d8b38fcd3d5bddd090409ed1b7890738976a1da9e21", + "role": "before2: visually inspected original" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-manual-review/06-codex-git-disclosure-after0.png", + "sha256": "595835f292d981d31004e99c574fc610ea659b9087a9c7b0695153056425c918", + "role": "after0: visually inspected original" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-manual-review/request-06-codex-git-disclosure.log", + "sha256": "3ae3874d744562037bc4a6588d885f012b37f961c358719773bdd646a7e900ba", + "role": "manual driver log" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-manual-review/request-06-codex-git-disclosure.actions.json", + "sha256": "8e35b162c3569d76a45d94f4dc04cb0bdc2d5667bda3a845bddb9d7c98a3e712", + "role": "real input actions; eval observation only" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-manual-review/requests/request-06-codex-git-disclosure.json", + "sha256": "b02cb6ed111a908994c376140c08b74b1f2e5c3c9cebcd5ad00ec62a2d8bc16e", + "role": "request identity and width" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-manual-review/request-06-codex-git-disclosure.exit.json", + "sha256": "c27d2fadf469f414c6a1031e8d7c93e526eadc753a9c7b725b278a8c0ceb3e0c", + "role": "driver exit" + } + ], + "allProbeFrames": [ + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-manual-review/06-codex-git-disclosure-before0.png", + "sha256": "da8f9258c73128066a301d8b38fcd3d5bddd090409ed1b7890738976a1da9e21" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-manual-review/06-codex-git-disclosure-before1.png", + "sha256": "da8f9258c73128066a301d8b38fcd3d5bddd090409ed1b7890738976a1da9e21" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-manual-review/06-codex-git-disclosure-before2.png", + "sha256": "da8f9258c73128066a301d8b38fcd3d5bddd090409ed1b7890738976a1da9e21" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-manual-review/06-codex-git-disclosure-after0.png", + "sha256": "595835f292d981d31004e99c574fc610ea659b9087a9c7b0695153056425c918" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-manual-review/06-codex-git-disclosure-after1.png", + "sha256": "595835f292d981d31004e99c574fc610ea659b9087a9c7b0695153056425c918" + } + ], + "source": { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/control-audit-codex-sources/baseline-git-merge.html", + "sha256": "2d4844ed59599ff2db8b85b9769572047cb7b25a2475d64260c5c5ebe5f947dc" + }, + "identityMatch": true, + "oldIdentity": { + "index": 4, + "label": "What is being compared?", + "tag": "summary", + "type": "" + }, + "runtimeErrors": [], + "manualConsoleClean": true, + "visuallyInspected": true, + "cardPassOverride": false + } + ] +} diff --git a/plugins/playgrounds/evals/launch/reports/gate-1/replay-visual-review-codex-baseline-manual.md b/plugins/playgrounds/evals/launch/reports/gate-1/replay-visual-review-codex-baseline-manual.md new file mode 100644 index 000000000..434e2a0dd --- /dev/null +++ b/plugins/playgrounds/evals/launch/reports/gate-1/replay-visual-review-codex-baseline-manual.md @@ -0,0 +1,14 @@ +# Independent Codex baseline manual review + +Independent actual before2/after0 image inspection of two saved manual real-input interactions; observation-only eval corroboration. Exact manual target URL and width match saved v3 proof. No browser/server/provider started; raw evidence and central adjudications unchanged. + +Plugin `a632572aa58adc9b6ddf947c9e527587d09f22ca`; scorer `f009de5838f80b90e861e5727f0ad11cba8814f8`. + +| Prompt / width / index / label | Verdict | Evidence and limit | +|---|---|---| +| notification-settings / 558 / 3 / Delivery time · UTC | live | Both actual images show digest enabled. The native selector changes Morning (8 AM) to Evening (6 PM), and the independent notification preview changes from 8 AM UTC to 6 PM UTC. The retained observation-only eval agrees (08 to 18); the log is console-clean. This proves the native-key route without a driver change. Reset defaults remains independently dead. [before2: visually inspected original](/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-manual-review/05-codex-delivery-time-before2.png) · [after0: visually inspected original](/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-manual-review/05-codex-delivery-time-after0.png) · [manual driver log](/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-manual-review/request-05-codex-delivery-time.log) | +| git-merge / 710 / 4 / What is being compared? | live | The actual before image has the disclosure closed; the after image visibly reveals the full explanatory paragraph about three-way merges, additions/deletions/renames and ancestry. This is revealed content, not merely a chevron or layout change. The observation-only eval confirms open=true and the same paragraph, and the log is console-clean. This proves expansion; collapse was not exercised. The independent keyboard surface remains dead. [before2: visually inspected original](/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-manual-review/06-codex-git-disclosure-before2.png) · [after0: visually inspected original](/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-manual-review/06-codex-git-disclosure-after0.png) · [manual driver log](/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-manual-review/request-06-codex-git-disclosure.log) | + +Both target/width/control identity checks match; both driver logs are console-clean. Neither decision overrides the existing whole-card failure: notification Reset defaults and the Git keyboard surface remain dead. + +[Exact result and evidence hashes](/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/replay-visual-review-codex-baseline-manual.json) diff --git a/plugins/playgrounds/evals/launch/reports/gate-1/replay-visual-review-codex-baseline.json b/plugins/playgrounds/evals/launch/reports/gate-1/replay-visual-review-codex-baseline.json new file mode 100644 index 000000000..2bf24081a --- /dev/null +++ b/plugins/playgrounds/evals/launch/reports/gate-1/replay-visual-review-codex-baseline.json @@ -0,0 +1,3807 @@ +{ + "provider": "codex", + "label": "baseline", + "revision": "f009de5838f80b90e861e5727f0ad11cba8814f8", + "pluginRevision": "a632572aa58adc9b6ddf947c9e527587d09f22ca", + "complete": true, + "reviewedPrompts": [ + "washing-machine", + "bicycle-pump", + "zipper", + "door-lock", + "thermos", + "toilet", + "refrigerator", + "stapler", + "spray-bottle", + "seat-belt", + "toaster", + "umbrella", + "cdn", + "notification-settings", + "dns", + "narrow-toggle", + "database-index", + "git-merge", + "websocket", + "load-balancer" + ], + "controls": [ + { + "revision": "f009de5838f80b90e861e5727f0ad11cba8814f8", + "pluginRevision": "a632572aa58adc9b6ddf947c9e527587d09f22ca", + "provider": "codex", + "prompt": "cdn", + "width": 710, + "index": 0, + "label": "Seconds since purge; use left and right arrow keys", + "verdict": "unproven", + "reason": "Partially functional, not a clean control pass: the default passing End pair visibly advances only 0 to 1 second although its supported End handler requests 90. An additionally inspected supported ArrowRight pair does advance 1 to 2 seconds and changes cache rows to v2. The omitted numeric bounds clamp stored time to 0..1 while local redraw can temporarily advance farther; one working arrow step does not establish the full exposed time control. The separate dead native slider also blocks a card pass.", + "mode": "key-End", + "automaticPass": true, + "v3Result": { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/cdn/result.json", + "sha256": "54c70dd4aac8a0f71a69f3a1f00e5928b37786cbe1760b09c93734407a9686a5" + }, + "evidence": [ + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/cdn/width-710/control-0-key-End-before2.png", + "sha256": "9b11986bea3e6d3ad11f6d73725eb643dec7626ff4fd99d1aea1d9a84f710753", + "role": "before2" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/cdn/width-710/control-0-key-End-after0.png", + "sha256": "9426610c09ca06f6bf0056d0d48fb37ff280c743326096f06ab40c25f2389107", + "role": "after0" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/replay-pairs/baseline/codex/cdn-710-0.png", + "sha256": "e5ef9b6b07dd650313927afdbf07b434f8ccd96dd6806135276ea27d97aa8930", + "role": "visually inspected comparison" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/cdn/width-710/control-0-key-ArrowRight-before2.png", + "sha256": "9426610c09ca06f6bf0056d0d48fb37ff280c743326096f06ab40c25f2389107", + "role": "additional inspected evidence" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/cdn/width-710/control-0-key-ArrowRight-after0.png", + "sha256": "c2847075758e3176aaf5267fd448062592b42a426b15507916126ac1a99b15ab", + "role": "additional inspected evidence" + } + ], + "allProbeFrames": [ + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/cdn/width-710/control-0-key-End-before0.png", + "sha256": "9b11986bea3e6d3ad11f6d73725eb643dec7626ff4fd99d1aea1d9a84f710753" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/cdn/width-710/control-0-key-End-before1.png", + "sha256": "9b11986bea3e6d3ad11f6d73725eb643dec7626ff4fd99d1aea1d9a84f710753" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/cdn/width-710/control-0-key-End-before2.png", + "sha256": "9b11986bea3e6d3ad11f6d73725eb643dec7626ff4fd99d1aea1d9a84f710753" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/cdn/width-710/control-0-key-End-after0.png", + "sha256": "9426610c09ca06f6bf0056d0d48fb37ff280c743326096f06ab40c25f2389107" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/cdn/width-710/control-0-key-End-after1.png", + "sha256": "9426610c09ca06f6bf0056d0d48fb37ff280c743326096f06ab40c25f2389107" + } + ], + "source": { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/control-audit-codex-sources/baseline-cdn.html", + "sha256": "9877a9e302f601bc0acfb36ad0fe3e2dffc31fa18a2afa2cab016cc391a1bd2e" + }, + "identityMatch": true, + "oldIdentity": { + "index": 0, + "label": "Seconds since purge; use left and right arrow keys", + "tag": "div", + "type": "slider" + }, + "originalAuditVerdict": "harness error", + "runtimeErrors": [], + "visuallyInspected": true + }, + { + "revision": "f009de5838f80b90e861e5727f0ad11cba8814f8", + "pluginRevision": "a632572aa58adc9b6ddf947c9e527587d09f22ca", + "provider": "codex", + "prompt": "cdn", + "width": 710, + "index": 1, + "label": "time", + "verdict": "dead", + "reason": "The inspected low/high drag pair moves the native thumb across its track while both external time readouts stay at 1 second and cache rows/mechanism remain unchanged. Saved parameter definitions omit min/max, so native time changes clamp to 0..1. The keyboard stage's local redraw cannot repair this separate control.", + "mode": "drag", + "automaticPass": false, + "v3Result": { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/cdn/result.json", + "sha256": "54c70dd4aac8a0f71a69f3a1f00e5928b37786cbe1760b09c93734407a9686a5" + }, + "evidence": [ + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/cdn/width-710/control-1-drag-before2.png", + "sha256": "3ce06332faaf354ed67654171e0fe73e69c9578db855ea488bc1387aefdbb147", + "role": "before2" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/cdn/width-710/control-1-drag-after0.png", + "sha256": "e3aa83ca1bd61c71c911785e9c12f77684ac2bfe47c00782b279a892af329902", + "role": "after0" + } + ], + "allProbeFrames": [ + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/cdn/width-710/control-1-drag-before0.png", + "sha256": "3ce06332faaf354ed67654171e0fe73e69c9578db855ea488bc1387aefdbb147" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/cdn/width-710/control-1-drag-before1.png", + "sha256": "3ce06332faaf354ed67654171e0fe73e69c9578db855ea488bc1387aefdbb147" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/cdn/width-710/control-1-drag-before2.png", + "sha256": "3ce06332faaf354ed67654171e0fe73e69c9578db855ea488bc1387aefdbb147" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/cdn/width-710/control-1-drag-after0.png", + "sha256": "e3aa83ca1bd61c71c911785e9c12f77684ac2bfe47c00782b279a892af329902" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/cdn/width-710/control-1-drag-after1.png", + "sha256": "e3aa83ca1bd61c71c911785e9c12f77684ac2bfe47c00782b279a892af329902" + } + ], + "source": { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/control-audit-codex-sources/baseline-cdn.html", + "sha256": "9877a9e302f601bc0acfb36ad0fe3e2dffc31fa18a2afa2cab016cc391a1bd2e" + }, + "identityMatch": true, + "oldIdentity": { + "index": 1, + "label": "time", + "tag": "input", + "type": "range" + }, + "originalAuditVerdict": "dead", + "runtimeErrors": [], + "visuallyInspected": true + }, + { + "revision": "f009de5838f80b90e861e5727f0ad11cba8814f8", + "pluginRevision": "a632572aa58adc9b6ddf947c9e527587d09f22ca", + "provider": "codex", + "prompt": "cdn", + "width": 710, + "index": 3, + "label": "local", + "verdict": "live", + "reason": "The inspected checkbox click changes the explanatory paragraph to the browser serving its fresh v1 copy and changes all three User receives cells to v1 (browser). The saved input handler updates the local boolean and redraws through the parameter subscription; this is meaningful output, not checkbox styling.", + "mode": "primary", + "automaticPass": true, + "v3Result": { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/cdn/result.json", + "sha256": "54c70dd4aac8a0f71a69f3a1f00e5928b37786cbe1760b09c93734407a9686a5" + }, + "evidence": [ + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/cdn/width-710/control-3-primary-before2.png", + "sha256": "72381eca88d6c3670525af4e1156d956ee57cd92b6f90c746cb48ffdc3afe779", + "role": "before2" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/cdn/width-710/control-3-primary-after0.png", + "sha256": "c1f436f77217affdeee173e9bdc5781c0a7b384767c3b236aa146856fac43ad5", + "role": "after0" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/replay-pairs/baseline/codex/cdn-710-3.png", + "sha256": "1ce4e6223a8e0c4c8db7eacb56e04afabe39bd1ce16e959e377533ac74ab372a", + "role": "visually inspected comparison" + } + ], + "allProbeFrames": [ + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/cdn/width-710/control-3-primary-before0.png", + "sha256": "72381eca88d6c3670525af4e1156d956ee57cd92b6f90c746cb48ffdc3afe779" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/cdn/width-710/control-3-primary-before1.png", + "sha256": "72381eca88d6c3670525af4e1156d956ee57cd92b6f90c746cb48ffdc3afe779" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/cdn/width-710/control-3-primary-before2.png", + "sha256": "72381eca88d6c3670525af4e1156d956ee57cd92b6f90c746cb48ffdc3afe779" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/cdn/width-710/control-3-primary-after0.png", + "sha256": "c1f436f77217affdeee173e9bdc5781c0a7b384767c3b236aa146856fac43ad5" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/cdn/width-710/control-3-primary-after1.png", + "sha256": "c1f436f77217affdeee173e9bdc5781c0a7b384767c3b236aa146856fac43ad5" + } + ], + "source": { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/control-audit-codex-sources/baseline-cdn.html", + "sha256": "9877a9e302f601bc0acfb36ad0fe3e2dffc31fa18a2afa2cab016cc391a1bd2e" + }, + "identityMatch": true, + "oldIdentity": { + "index": 3, + "label": "local", + "tag": "input", + "type": "checkbox" + }, + "originalAuditVerdict": "harness error", + "runtimeErrors": [], + "visuallyInspected": true + }, + { + "revision": "f009de5838f80b90e861e5727f0ad11cba8814f8", + "pluginRevision": "a632572aa58adc9b6ddf947c9e527587d09f22ca", + "provider": "codex", + "prompt": "database-index", + "width": 710, + "index": 0, + "label": "Lookup comparison; arrow keys step through", + "verdict": "dead", + "reason": "The inspected ArrowRight pair leaves the lookup diagram and blank explanation unchanged. Source object-form params.define throws before render subscription and keyboard registration; v3 records the same initialization exception. Native control chrome is not working lookup output.", + "mode": "key-ArrowRight", + "automaticPass": false, + "v3Result": { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/database-index/result.json", + "sha256": "8e69cb83806db4ef0f2a74f0978bca80b60b7f99e2786a2ddf23637897c3cbdf" + }, + "evidence": [ + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/database-index/width-710/control-0-key-ArrowRight-before2.png", + "sha256": "6b5bd77301b68e38afee06380664bb600c64dd325e9396666b6bdc1247041405", + "role": "before2" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/database-index/width-710/control-0-key-ArrowRight-after0.png", + "sha256": "6b5bd77301b68e38afee06380664bb600c64dd325e9396666b6bdc1247041405", + "role": "after0" + } + ], + "allProbeFrames": [ + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/database-index/width-710/control-0-key-ArrowRight-before0.png", + "sha256": "6b5bd77301b68e38afee06380664bb600c64dd325e9396666b6bdc1247041405" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/database-index/width-710/control-0-key-ArrowRight-before1.png", + "sha256": "6b5bd77301b68e38afee06380664bb600c64dd325e9396666b6bdc1247041405" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/database-index/width-710/control-0-key-ArrowRight-before2.png", + "sha256": "6b5bd77301b68e38afee06380664bb600c64dd325e9396666b6bdc1247041405" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/database-index/width-710/control-0-key-ArrowRight-after0.png", + "sha256": "6b5bd77301b68e38afee06380664bb600c64dd325e9396666b6bdc1247041405" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/database-index/width-710/control-0-key-ArrowRight-after1.png", + "sha256": "6b5bd77301b68e38afee06380664bb600c64dd325e9396666b6bdc1247041405" + } + ], + "source": { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/control-audit-codex-sources/baseline-database-index.html", + "sha256": "6e9a6fb8ffd7d653cf641ea3c5277bb292ef0c29e3015d962b9c4fc4a402238c" + }, + "identityMatch": true, + "oldIdentity": { + "index": 0, + "label": "Lookup comparison; arrow keys step through", + "tag": "div", + "type": "" + }, + "originalAuditVerdict": "dead", + "runtimeErrors": [ + "exception: Error: Parameter names are letters, digits, - and _: [object Object]" + ], + "visuallyInspected": true + }, + { + "revision": "f009de5838f80b90e861e5727f0ad11cba8814f8", + "pluginRevision": "a632572aa58adc9b6ddf947c9e527587d09f22ca", + "provider": "codex", + "prompt": "database-index", + "width": 710, + "index": 1, + "label": "Find key", + "verdict": "dead", + "reason": "The inspected low/high drag pair moves the native thumb and its own numeric value, but leaves the lookup diagram and blank explanation unchanged. Source object-form params.define throws before render subscription and keyboard registration; v3 records the same initialization exception. Native control chrome is not working lookup output.", + "mode": "drag", + "automaticPass": false, + "v3Result": { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/database-index/result.json", + "sha256": "8e69cb83806db4ef0f2a74f0978bca80b60b7f99e2786a2ddf23637897c3cbdf" + }, + "evidence": [ + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/database-index/width-710/control-1-drag-before2.png", + "sha256": "e2e04f316b98dce1c4abf829625e6e9807f977f285882431ba3accfe3dcc0d6d", + "role": "before2" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/database-index/width-710/control-1-drag-after0.png", + "sha256": "c10ea05a7e51210599964362ab63a8c5869a3c32f5fac70306dcba08cee1c8e7", + "role": "after0" + } + ], + "allProbeFrames": [ + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/database-index/width-710/control-1-drag-before0.png", + "sha256": "e2e04f316b98dce1c4abf829625e6e9807f977f285882431ba3accfe3dcc0d6d" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/database-index/width-710/control-1-drag-before1.png", + "sha256": "e2e04f316b98dce1c4abf829625e6e9807f977f285882431ba3accfe3dcc0d6d" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/database-index/width-710/control-1-drag-before2.png", + "sha256": "e2e04f316b98dce1c4abf829625e6e9807f977f285882431ba3accfe3dcc0d6d" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/database-index/width-710/control-1-drag-after0.png", + "sha256": "c10ea05a7e51210599964362ab63a8c5869a3c32f5fac70306dcba08cee1c8e7" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/database-index/width-710/control-1-drag-after1.png", + "sha256": "c10ea05a7e51210599964362ab63a8c5869a3c32f5fac70306dcba08cee1c8e7" + } + ], + "source": { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/control-audit-codex-sources/baseline-database-index.html", + "sha256": "6e9a6fb8ffd7d653cf641ea3c5277bb292ef0c29e3015d962b9c4fc4a402238c" + }, + "identityMatch": true, + "oldIdentity": { + "index": 1, + "label": "Find key", + "tag": "input", + "type": "range" + }, + "originalAuditVerdict": "dead", + "runtimeErrors": [ + "exception: Error: Parameter names are letters, digits, - and _: [object Object]" + ], + "visuallyInspected": true + }, + { + "revision": "f009de5838f80b90e861e5727f0ad11cba8814f8", + "pluginRevision": "a632572aa58adc9b6ddf947c9e527587d09f22ca", + "provider": "codex", + "prompt": "database-index", + "width": 710, + "index": 2, + "label": "Lookup step", + "verdict": "dead", + "reason": "The inspected low/high drag pair moves the native thumb and its own numeric value, but leaves the lookup diagram and blank explanation unchanged. Source object-form params.define throws before render subscription and keyboard registration; v3 records the same initialization exception. Native control chrome is not working lookup output.", + "mode": "drag", + "automaticPass": false, + "v3Result": { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/database-index/result.json", + "sha256": "8e69cb83806db4ef0f2a74f0978bca80b60b7f99e2786a2ddf23637897c3cbdf" + }, + "evidence": [ + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/database-index/width-710/control-2-drag-before2.png", + "sha256": "923da5d8ff407a92823f52d30bb62ebbd293acc183f12af96ee3c8aafe8ba845", + "role": "before2" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/database-index/width-710/control-2-drag-after0.png", + "sha256": "4abd98092ab1bd8ac961013b0dcf820e0002c3bbfd8de2044a04f3c3c601c3bd", + "role": "after0" + } + ], + "allProbeFrames": [ + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/database-index/width-710/control-2-drag-before0.png", + "sha256": "923da5d8ff407a92823f52d30bb62ebbd293acc183f12af96ee3c8aafe8ba845" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/database-index/width-710/control-2-drag-before1.png", + "sha256": "923da5d8ff407a92823f52d30bb62ebbd293acc183f12af96ee3c8aafe8ba845" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/database-index/width-710/control-2-drag-before2.png", + "sha256": "923da5d8ff407a92823f52d30bb62ebbd293acc183f12af96ee3c8aafe8ba845" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/database-index/width-710/control-2-drag-after0.png", + "sha256": "4abd98092ab1bd8ac961013b0dcf820e0002c3bbfd8de2044a04f3c3c601c3bd" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/database-index/width-710/control-2-drag-after1.png", + "sha256": "4abd98092ab1bd8ac961013b0dcf820e0002c3bbfd8de2044a04f3c3c601c3bd" + } + ], + "source": { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/control-audit-codex-sources/baseline-database-index.html", + "sha256": "6e9a6fb8ffd7d653cf641ea3c5277bb292ef0c29e3015d962b9c4fc4a402238c" + }, + "identityMatch": true, + "oldIdentity": { + "index": 2, + "label": "Lookup step", + "tag": "input", + "type": "range" + }, + "originalAuditVerdict": "dead", + "runtimeErrors": [ + "exception: Error: Parameter names are letters, digits, - and _: [object Object]" + ], + "visuallyInspected": true + }, + { + "revision": "f009de5838f80b90e861e5727f0ad11cba8814f8", + "pluginRevision": "a632572aa58adc9b6ddf947c9e527587d09f22ca", + "provider": "codex", + "prompt": "dns", + "width": 710, + "index": 0, + "label": "DNS lookup step", + "verdict": "live", + "reason": "The inspected Home pair changes the initial incomplete stage into the device-cache step, with an explanatory paragraph and matching readout. The saved keyboard handler explicitly handles Home and calls draw; its drawer animation is output of that input. The recorded initialization exception still rejects the card.", + "mode": "key-Home", + "automaticPass": true, + "v3Result": { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/dns/result.json", + "sha256": "e46768e0376b893a5491a38bc6f44f9325251dc0a3e0fbee42a9c0f5e735ec67" + }, + "evidence": [ + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/dns/width-710/control-0-key-Home-before2.png", + "sha256": "dad01a8e6794d76ef2a633e6b2247a83bb14c51d311e61c24b7d422f00e69acf", + "role": "before2" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/dns/width-710/control-0-key-Home-after0.png", + "sha256": "18a26e5c184d4960c9b9c2383c74ddd44ef360d2571315ef367ada1d4be0876c", + "role": "after0" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/replay-pairs/baseline/codex/dns-710-0.png", + "sha256": "cb9e57a6c6d85cbe2d277961bfaf8980dca16442d7cff8af48a9ac39a5b63e41", + "role": "visually inspected comparison" + } + ], + "allProbeFrames": [ + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/dns/width-710/control-0-key-Home-before0.png", + "sha256": "dad01a8e6794d76ef2a633e6b2247a83bb14c51d311e61c24b7d422f00e69acf" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/dns/width-710/control-0-key-Home-before1.png", + "sha256": "dad01a8e6794d76ef2a633e6b2247a83bb14c51d311e61c24b7d422f00e69acf" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/dns/width-710/control-0-key-Home-before2.png", + "sha256": "dad01a8e6794d76ef2a633e6b2247a83bb14c51d311e61c24b7d422f00e69acf" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/dns/width-710/control-0-key-Home-after0.png", + "sha256": "18a26e5c184d4960c9b9c2383c74ddd44ef360d2571315ef367ada1d4be0876c" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/dns/width-710/control-0-key-Home-after1.png", + "sha256": "18a26e5c184d4960c9b9c2383c74ddd44ef360d2571315ef367ada1d4be0876c" + } + ], + "source": { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/control-audit-codex-sources/baseline-dns.html", + "sha256": "29d50c647f1842a54f1f060be7f6987ccfc374cec838555c772979098b0062af" + }, + "identityMatch": true, + "oldIdentity": { + "index": 0, + "label": "DNS lookup step", + "tag": "div", + "type": "slider" + }, + "originalAuditVerdict": "harness error", + "runtimeErrors": [ + "exception: Error: Parameter names are letters, digits, - and _: [object Object]" + ], + "visuallyInspected": true + }, + { + "revision": "f009de5838f80b90e861e5727f0ad11cba8814f8", + "pluginRevision": "a632572aa58adc9b6ddf947c9e527587d09f22ca", + "provider": "codex", + "prompt": "dns", + "width": 710, + "index": 2, + "label": "Back", + "verdict": "live", + "reason": "The inspected Back click changes Your browser connects to Use the resolver's cached answer, updates the paragraph and query/drawer positions, and re-enables Next. The source go(-1) handler changes the step synchronously; this is a valid enabled-state Back transition. Initialization still throws, so this does not pass the card.", + "mode": "primary", + "automaticPass": true, + "v3Result": { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/dns/result.json", + "sha256": "e46768e0376b893a5491a38bc6f44f9325251dc0a3e0fbee42a9c0f5e735ec67" + }, + "evidence": [ + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/dns/width-710/control-2-primary-before2.png", + "sha256": "c23665d5ce12686807550c7145d6745dee4d94979efacc9ec4130beefd4cf1e9", + "role": "before2" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/dns/width-710/control-2-primary-after0.png", + "sha256": "8c54401ee28e8a00142c5d941b6a0dd5671ef338d069b23a17a4d6f10c288729", + "role": "after0" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/replay-pairs/baseline/codex/dns-710-2.png", + "sha256": "b58cf88114cb0bf1c4ed9bbf6771e28f0024adbbfc030874422a1f978f4e14c8", + "role": "visually inspected comparison" + } + ], + "allProbeFrames": [ + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/dns/width-710/control-2-primary-before0.png", + "sha256": "c23665d5ce12686807550c7145d6745dee4d94979efacc9ec4130beefd4cf1e9" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/dns/width-710/control-2-primary-before1.png", + "sha256": "c23665d5ce12686807550c7145d6745dee4d94979efacc9ec4130beefd4cf1e9" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/dns/width-710/control-2-primary-before2.png", + "sha256": "c23665d5ce12686807550c7145d6745dee4d94979efacc9ec4130beefd4cf1e9" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/dns/width-710/control-2-primary-after0.png", + "sha256": "8c54401ee28e8a00142c5d941b6a0dd5671ef338d069b23a17a4d6f10c288729" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/dns/width-710/control-2-primary-after1.png", + "sha256": "8c54401ee28e8a00142c5d941b6a0dd5671ef338d069b23a17a4d6f10c288729" + } + ], + "source": { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/control-audit-codex-sources/baseline-dns.html", + "sha256": "29d50c647f1842a54f1f060be7f6987ccfc374cec838555c772979098b0062af" + }, + "identityMatch": true, + "oldIdentity": { + "index": 2, + "label": "Back", + "tag": "button", + "type": "submit" + }, + "originalAuditVerdict": "harness error", + "runtimeErrors": [ + "exception: Error: Parameter names are letters, digits, - and _: [object Object]" + ], + "visuallyInspected": true + }, + { + "revision": "f009de5838f80b90e861e5727f0ad11cba8814f8", + "pluginRevision": "a632572aa58adc9b6ddf947c9e527587d09f22ca", + "provider": "codex", + "prompt": "door-lock", + "width": 710, + "index": 0, + "label": "Lock cutaway. Arrow keys choose a key; Enter attempts to turn it.", + "verdict": "live", + "reason": "The inspected ArrowRight pair changes the lock from its incomplete initial drawing to No key: springs and pins become visible, with blocked readout and matching explanation. The saved source explicitly handles ArrowRight by changing key and calling draw; no autonomous transition is involved. This proves this input route only: the captured initialization runtime error still rejects the whole card.", + "mode": "key-ArrowRight", + "automaticPass": true, + "v3Result": { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/door-lock/result.json", + "sha256": "dd68e571ddec4af2e34b5f72be0dba02c3059ae6ef7c56a7567123ea9a0bb4a1" + }, + "evidence": [ + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/door-lock/width-710/control-0-key-ArrowRight-before2.png", + "sha256": "d4901357edceabb6821bc3540ad6c5f03f60fe2b03228b0ffb159fda967343fa", + "role": "before2" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/door-lock/width-710/control-0-key-ArrowRight-after0.png", + "sha256": "4700b44a07b50b60404f99af153aa9f94450e6f3f69650051e92e6806352d2b1", + "role": "after0" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/replay-pairs/baseline/codex/door-lock-710-0.png", + "sha256": "dad32926abd2ed33502004e00daa99c605ba0b7377cb184a4f723c182a3f24fc", + "role": "visually inspected comparison" + } + ], + "allProbeFrames": [ + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/door-lock/width-710/control-0-key-ArrowRight-before0.png", + "sha256": "d4901357edceabb6821bc3540ad6c5f03f60fe2b03228b0ffb159fda967343fa" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/door-lock/width-710/control-0-key-ArrowRight-before1.png", + "sha256": "d4901357edceabb6821bc3540ad6c5f03f60fe2b03228b0ffb159fda967343fa" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/door-lock/width-710/control-0-key-ArrowRight-before2.png", + "sha256": "d4901357edceabb6821bc3540ad6c5f03f60fe2b03228b0ffb159fda967343fa" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/door-lock/width-710/control-0-key-ArrowRight-after0.png", + "sha256": "4700b44a07b50b60404f99af153aa9f94450e6f3f69650051e92e6806352d2b1" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/door-lock/width-710/control-0-key-ArrowRight-after1.png", + "sha256": "4700b44a07b50b60404f99af153aa9f94450e6f3f69650051e92e6806352d2b1" + } + ], + "source": { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/control-audit-codex-sources/baseline-door-lock.html", + "sha256": "4ec8ef814773b2835fca94813c5ca6cf1489be541173bdfced56bd1f5f016610" + }, + "identityMatch": true, + "oldIdentity": { + "index": 0, + "label": "Lock cutaway. Arrow keys choose a key; Enter attempts to turn it.", + "tag": "div", + "type": "group" + }, + "originalAuditVerdict": "harness error", + "runtimeErrors": [ + "exception: Error: Parameter names are letters, digits, - and _: [object Object]" + ], + "visuallyInspected": true + }, + { + "revision": "f009de5838f80b90e861e5727f0ad11cba8814f8", + "pluginRevision": "a632572aa58adc9b6ddf947c9e527587d09f22ca", + "provider": "codex", + "prompt": "door-lock", + "width": 710, + "index": 2, + "label": "Wrong key", + "verdict": "live", + "reason": "The inspected click pair visibly inserts the wrong key, changes pin heights and changes the explanation to a pin bridging the shell and plug. The saved onclick calls set/draw synchronously. The existing initialization runtime error remains a whole-card failure.", + "mode": "primary", + "automaticPass": true, + "v3Result": { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/door-lock/result.json", + "sha256": "dd68e571ddec4af2e34b5f72be0dba02c3059ae6ef7c56a7567123ea9a0bb4a1" + }, + "evidence": [ + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/door-lock/width-710/control-2-primary-before2.png", + "sha256": "e098417aa220db09a541f0d4251fa9a3c945bf68681d28ae202f2bf9ea4a4a24", + "role": "before2" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/door-lock/width-710/control-2-primary-after0.png", + "sha256": "6ac8d0a46dbebf9b6dd6557400a3d962f39c1e15de5cc0dc7d658e4b44879e7f", + "role": "after0" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/replay-pairs/baseline/codex/door-lock-710-2.png", + "sha256": "6ae4965fb7c75160aab9cb045398f09bd575006f3247f76fb43b734e942c1fd7", + "role": "visually inspected comparison" + } + ], + "allProbeFrames": [ + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/door-lock/width-710/control-2-primary-before0.png", + "sha256": "e098417aa220db09a541f0d4251fa9a3c945bf68681d28ae202f2bf9ea4a4a24" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/door-lock/width-710/control-2-primary-before1.png", + "sha256": "e098417aa220db09a541f0d4251fa9a3c945bf68681d28ae202f2bf9ea4a4a24" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/door-lock/width-710/control-2-primary-before2.png", + "sha256": "e098417aa220db09a541f0d4251fa9a3c945bf68681d28ae202f2bf9ea4a4a24" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/door-lock/width-710/control-2-primary-after0.png", + "sha256": "6ac8d0a46dbebf9b6dd6557400a3d962f39c1e15de5cc0dc7d658e4b44879e7f" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/door-lock/width-710/control-2-primary-after1.png", + "sha256": "6ac8d0a46dbebf9b6dd6557400a3d962f39c1e15de5cc0dc7d658e4b44879e7f" + } + ], + "source": { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/control-audit-codex-sources/baseline-door-lock.html", + "sha256": "4ec8ef814773b2835fca94813c5ca6cf1489be541173bdfced56bd1f5f016610" + }, + "identityMatch": true, + "oldIdentity": { + "index": 2, + "label": "Wrong key", + "tag": "button", + "type": "submit" + }, + "originalAuditVerdict": "harness error", + "runtimeErrors": [ + "exception: Error: Parameter names are letters, digits, - and _: [object Object]" + ], + "visuallyInspected": true + }, + { + "revision": "f009de5838f80b90e861e5727f0ad11cba8814f8", + "pluginRevision": "a632572aa58adc9b6ddf947c9e527587d09f22ca", + "provider": "codex", + "prompt": "git-merge", + "width": 710, + "index": 0, + "label": "Document comparison machine. Use left and right arrow keys to switch scenarios.", + "verdict": "dead", + "reason": "The inspected ArrowRight pair leaves the clean scenario, diagram text, branch history and explanation unchanged. The saved handler calls unsupported object-form params.set, confirming the original silent no-op. Working scenario buttons do not repair the exposed keyboard surface.", + "mode": "key-ArrowRight", + "automaticPass": false, + "v3Result": { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/git-merge/result.json", + "sha256": "2356bce996be14eabc9cb4bb2d6768f829c1837596c41e9be98d49a316c64bbc" + }, + "evidence": [ + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/git-merge/width-710/control-0-key-ArrowRight-before2.png", + "sha256": "d19839450923f3fd327cfa5ca02fd5f5b492dc864c66c7f5c673c9310647df14", + "role": "before2" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/git-merge/width-710/control-0-key-ArrowRight-after0.png", + "sha256": "d19839450923f3fd327cfa5ca02fd5f5b492dc864c66c7f5c673c9310647df14", + "role": "after0" + } + ], + "allProbeFrames": [ + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/git-merge/width-710/control-0-key-ArrowRight-before0.png", + "sha256": "d19839450923f3fd327cfa5ca02fd5f5b492dc864c66c7f5c673c9310647df14" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/git-merge/width-710/control-0-key-ArrowRight-before1.png", + "sha256": "d19839450923f3fd327cfa5ca02fd5f5b492dc864c66c7f5c673c9310647df14" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/git-merge/width-710/control-0-key-ArrowRight-before2.png", + "sha256": "d19839450923f3fd327cfa5ca02fd5f5b492dc864c66c7f5c673c9310647df14" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/git-merge/width-710/control-0-key-ArrowRight-after0.png", + "sha256": "d19839450923f3fd327cfa5ca02fd5f5b492dc864c66c7f5c673c9310647df14" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/git-merge/width-710/control-0-key-ArrowRight-after1.png", + "sha256": "d19839450923f3fd327cfa5ca02fd5f5b492dc864c66c7f5c673c9310647df14" + } + ], + "source": { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/control-audit-codex-sources/baseline-git-merge.html", + "sha256": "2d4844ed59599ff2db8b85b9769572047cb7b25a2475d64260c5c5ebe5f947dc" + }, + "identityMatch": true, + "oldIdentity": { + "index": 0, + "label": "Document comparison machine. Use left and right arrow keys to switch scenarios.", + "tag": "div", + "type": "" + }, + "originalAuditVerdict": "dead", + "runtimeErrors": [], + "visuallyInspected": true + }, + { + "revision": "f009de5838f80b90e861e5727f0ad11cba8814f8", + "pluginRevision": "a632572aa58adc9b6ddf947c9e527587d09f22ca", + "provider": "codex", + "prompt": "git-merge", + "width": 710, + "index": 1, + "label": "Clean merge", + "verdict": "live", + "reason": "The inspected Clean merge click replaces the conflict explanation and paused history with the clean merge explanation and a new merge commit M. Changed text and history are independent of selected-button styling.", + "mode": "primary", + "automaticPass": true, + "v3Result": { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/git-merge/result.json", + "sha256": "2356bce996be14eabc9cb4bb2d6768f829c1837596c41e9be98d49a316c64bbc" + }, + "evidence": [ + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/git-merge/width-710/control-1-primary-before2.png", + "sha256": "96768be3f94c5479a3b4b5206c6b84461cd8f7b0aa1bca30c6fbbaabc747d3c4", + "role": "before2" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/git-merge/width-710/control-1-primary-after0.png", + "sha256": "da8f9258c73128066a301d8b38fcd3d5bddd090409ed1b7890738976a1da9e21", + "role": "after0" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/replay-pairs/baseline/codex/git-merge-710-1.png", + "sha256": "23acd270803c817423267ad1ee573aa3188607537fdd5eda8f982d5f971c78cb", + "role": "visually inspected comparison" + } + ], + "allProbeFrames": [ + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/git-merge/width-710/control-1-primary-before0.png", + "sha256": "96768be3f94c5479a3b4b5206c6b84461cd8f7b0aa1bca30c6fbbaabc747d3c4" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/git-merge/width-710/control-1-primary-before1.png", + "sha256": "96768be3f94c5479a3b4b5206c6b84461cd8f7b0aa1bca30c6fbbaabc747d3c4" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/git-merge/width-710/control-1-primary-before2.png", + "sha256": "96768be3f94c5479a3b4b5206c6b84461cd8f7b0aa1bca30c6fbbaabc747d3c4" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/git-merge/width-710/control-1-primary-after0.png", + "sha256": "da8f9258c73128066a301d8b38fcd3d5bddd090409ed1b7890738976a1da9e21" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/git-merge/width-710/control-1-primary-after1.png", + "sha256": "da8f9258c73128066a301d8b38fcd3d5bddd090409ed1b7890738976a1da9e21" + } + ], + "source": { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/control-audit-codex-sources/baseline-git-merge.html", + "sha256": "2d4844ed59599ff2db8b85b9769572047cb7b25a2475d64260c5c5ebe5f947dc" + }, + "identityMatch": true, + "oldIdentity": { + "index": 1, + "label": "Clean merge", + "tag": "button", + "type": "button" + }, + "originalAuditVerdict": "harness error", + "runtimeErrors": [], + "visuallyInspected": true + }, + { + "revision": "f009de5838f80b90e861e5727f0ad11cba8814f8", + "pluginRevision": "a632572aa58adc9b6ddf947c9e527587d09f22ca", + "provider": "codex", + "prompt": "git-merge", + "width": 710, + "index": 2, + "label": "Conflict", + "verdict": "live", + "reason": "The inspected Conflict click changes the diagram's compared/result text and replaces the external paragraph/history with conflicting title edits and a paused merge, matching the scenario subscription.", + "mode": "primary", + "automaticPass": true, + "v3Result": { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/git-merge/result.json", + "sha256": "2356bce996be14eabc9cb4bb2d6768f829c1837596c41e9be98d49a316c64bbc" + }, + "evidence": [ + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/git-merge/width-710/control-2-primary-before2.png", + "sha256": "da8f9258c73128066a301d8b38fcd3d5bddd090409ed1b7890738976a1da9e21", + "role": "before2" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/git-merge/width-710/control-2-primary-after0.png", + "sha256": "96768be3f94c5479a3b4b5206c6b84461cd8f7b0aa1bca30c6fbbaabc747d3c4", + "role": "after0" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/replay-pairs/baseline/codex/git-merge-710-2.png", + "sha256": "9b91527498b8e9585f79a520f995b1b5291c41dbc6267dc05fc11acd5ef2862c", + "role": "visually inspected comparison" + } + ], + "allProbeFrames": [ + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/git-merge/width-710/control-2-primary-before0.png", + "sha256": "da8f9258c73128066a301d8b38fcd3d5bddd090409ed1b7890738976a1da9e21" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/git-merge/width-710/control-2-primary-before1.png", + "sha256": "da8f9258c73128066a301d8b38fcd3d5bddd090409ed1b7890738976a1da9e21" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/git-merge/width-710/control-2-primary-before2.png", + "sha256": "da8f9258c73128066a301d8b38fcd3d5bddd090409ed1b7890738976a1da9e21" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/git-merge/width-710/control-2-primary-after0.png", + "sha256": "96768be3f94c5479a3b4b5206c6b84461cd8f7b0aa1bca30c6fbbaabc747d3c4" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/git-merge/width-710/control-2-primary-after1.png", + "sha256": "96768be3f94c5479a3b4b5206c6b84461cd8f7b0aa1bca30c6fbbaabc747d3c4" + } + ], + "source": { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/control-audit-codex-sources/baseline-git-merge.html", + "sha256": "2d4844ed59599ff2db8b85b9769572047cb7b25a2475d64260c5c5ebe5f947dc" + }, + "identityMatch": true, + "oldIdentity": { + "index": 2, + "label": "Conflict", + "tag": "button", + "type": "button" + }, + "originalAuditVerdict": "harness error", + "runtimeErrors": [], + "visuallyInspected": true + }, + { + "revision": "f009de5838f80b90e861e5727f0ad11cba8814f8", + "pluginRevision": "a632572aa58adc9b6ddf947c9e527587d09f22ca", + "provider": "codex", + "prompt": "git-merge", + "width": 710, + "index": 3, + "label": "Fast-forward", + "verdict": "live", + "reason": "The inspected Fast-forward click changes the external explanation and branch history to moving main to C without a merge commit. The visible scenario output proves this button, while the keyboard control remains dead.", + "mode": "primary", + "automaticPass": true, + "v3Result": { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/git-merge/result.json", + "sha256": "2356bce996be14eabc9cb4bb2d6768f829c1837596c41e9be98d49a316c64bbc" + }, + "evidence": [ + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/git-merge/width-710/control-3-primary-before2.png", + "sha256": "da8f9258c73128066a301d8b38fcd3d5bddd090409ed1b7890738976a1da9e21", + "role": "before2" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/git-merge/width-710/control-3-primary-after0.png", + "sha256": "b5ad7d1a80a3d3fbcb0483de4e4e7e4aada3cb19403163e29023161ba3554dd7", + "role": "after0" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/replay-pairs/baseline/codex/git-merge-710-3.png", + "sha256": "450d8abf19dd58554a01206e4170e41bb96161ca12c0c0f7f707c5d5324b689b", + "role": "visually inspected comparison" + } + ], + "allProbeFrames": [ + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/git-merge/width-710/control-3-primary-before0.png", + "sha256": "da8f9258c73128066a301d8b38fcd3d5bddd090409ed1b7890738976a1da9e21" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/git-merge/width-710/control-3-primary-before1.png", + "sha256": "da8f9258c73128066a301d8b38fcd3d5bddd090409ed1b7890738976a1da9e21" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/git-merge/width-710/control-3-primary-before2.png", + "sha256": "da8f9258c73128066a301d8b38fcd3d5bddd090409ed1b7890738976a1da9e21" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/git-merge/width-710/control-3-primary-after0.png", + "sha256": "b5ad7d1a80a3d3fbcb0483de4e4e7e4aada3cb19403163e29023161ba3554dd7" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/git-merge/width-710/control-3-primary-after1.png", + "sha256": "b5ad7d1a80a3d3fbcb0483de4e4e7e4aada3cb19403163e29023161ba3554dd7" + } + ], + "source": { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/control-audit-codex-sources/baseline-git-merge.html", + "sha256": "2d4844ed59599ff2db8b85b9769572047cb7b25a2475d64260c5c5ebe5f947dc" + }, + "identityMatch": true, + "oldIdentity": { + "index": 3, + "label": "Fast-forward", + "tag": "button", + "type": "button" + }, + "originalAuditVerdict": "harness error", + "runtimeErrors": [], + "visuallyInspected": true + }, + { + "revision": "f009de5838f80b90e861e5727f0ad11cba8814f8", + "pluginRevision": "a632572aa58adc9b6ddf947c9e527587d09f22ca", + "provider": "codex", + "prompt": "load-balancer", + "width": 710, + "index": 0, + "label": "Load balancer: right arrow sends a request; left arrow steps back", + "verdict": "dead", + "reason": "The inspected ArrowRight pair leaves request count 6, per-server active/assigned totals, carriage and latest-server readout unchanged. The saved keyboard handler calls unsupported object-form params.set, retaining the original silent no-op. Working dropdowns and increment buttons do not repair the separate exposed keyboard surface.", + "mode": "key-ArrowRight", + "automaticPass": false, + "v3Result": { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/load-balancer/result.json", + "sha256": "35a0fa18f0455115d7ef7b193c71c0cda48d5058947a030ecbc689fc6194eb9b" + }, + "evidence": [ + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/load-balancer/width-710/control-0-key-ArrowRight-before2.png", + "sha256": "33e04a79fd29a5b5457a37bf9e913f9d06dc761188e0768bddf782e9f22ca3c1", + "role": "before2" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/load-balancer/width-710/control-0-key-ArrowRight-after0.png", + "sha256": "33e04a79fd29a5b5457a37bf9e913f9d06dc761188e0768bddf782e9f22ca3c1", + "role": "after0" + } + ], + "allProbeFrames": [ + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/load-balancer/width-710/control-0-key-ArrowRight-before0.png", + "sha256": "33e04a79fd29a5b5457a37bf9e913f9d06dc761188e0768bddf782e9f22ca3c1" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/load-balancer/width-710/control-0-key-ArrowRight-before1.png", + "sha256": "33e04a79fd29a5b5457a37bf9e913f9d06dc761188e0768bddf782e9f22ca3c1" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/load-balancer/width-710/control-0-key-ArrowRight-before2.png", + "sha256": "33e04a79fd29a5b5457a37bf9e913f9d06dc761188e0768bddf782e9f22ca3c1" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/load-balancer/width-710/control-0-key-ArrowRight-after0.png", + "sha256": "33e04a79fd29a5b5457a37bf9e913f9d06dc761188e0768bddf782e9f22ca3c1" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/load-balancer/width-710/control-0-key-ArrowRight-after1.png", + "sha256": "33e04a79fd29a5b5457a37bf9e913f9d06dc761188e0768bddf782e9f22ca3c1" + } + ], + "source": { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/control-audit-codex-sources/baseline-load-balancer.html", + "sha256": "d7c5257e7730f4344d03e51d3b3d97851de8ec30a105b255cceb53e8e5c0a855" + }, + "identityMatch": true, + "oldIdentity": { + "index": 0, + "label": "Load balancer: right arrow sends a request; left arrow steps back", + "tag": "div", + "type": "group" + }, + "originalAuditVerdict": "dead", + "runtimeErrors": [], + "visuallyInspected": true + }, + { + "revision": "f009de5838f80b90e861e5727f0ad11cba8814f8", + "pluginRevision": "a632572aa58adc9b6ddf947c9e527587d09f22ca", + "provider": "codex", + "prompt": "notification-settings", + "width": 558, + "index": 2, + "label": "Daily digest", + "verdict": "live", + "reason": "The inspected Daily digest click reveals the delivery-time selector and adds Daily digest at 8 AM UTC to the independent notification preview. This is meaningful output despite the card resizing.", + "mode": "click", + "automaticPass": true, + "v3Result": { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/notification-settings/result.json", + "sha256": "c9e1df7a66812f0637c3c549af67dca46182859f97beec8504e1cb4efcc967d5" + }, + "evidence": [ + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/notification-settings/width-558/control-2-click-before2.png", + "sha256": "74736d11bd2a15fdf58574f5bd34e59e0e48413787e21648b321b7e83a5cb4ef", + "role": "before2" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/notification-settings/width-558/control-2-click-after0.png", + "sha256": "eea07dce797c6b6d7ed2c20012791c02c350c33fe773d5139918741538617f57", + "role": "after0" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/replay-pairs/baseline/codex/notification-settings-558-2.png", + "sha256": "62f04836dd410453697f920869d3d22f910b51f44ee1c3c29ad51d6c640660f7", + "role": "visually inspected comparison" + } + ], + "allProbeFrames": [ + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/notification-settings/width-558/control-2-click-before0.png", + "sha256": "74736d11bd2a15fdf58574f5bd34e59e0e48413787e21648b321b7e83a5cb4ef" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/notification-settings/width-558/control-2-click-before1.png", + "sha256": "74736d11bd2a15fdf58574f5bd34e59e0e48413787e21648b321b7e83a5cb4ef" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/notification-settings/width-558/control-2-click-before2.png", + "sha256": "74736d11bd2a15fdf58574f5bd34e59e0e48413787e21648b321b7e83a5cb4ef" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/notification-settings/width-558/control-2-click-after0.png", + "sha256": "eea07dce797c6b6d7ed2c20012791c02c350c33fe773d5139918741538617f57" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/notification-settings/width-558/control-2-click-after1.png", + "sha256": "eea07dce797c6b6d7ed2c20012791c02c350c33fe773d5139918741538617f57" + } + ], + "source": { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/control-audit-codex-sources/baseline-notification-settings.html", + "sha256": "4b8879343525f790b93b6e73d53f7f98ad4e12ff74f2a612b05ace2b691a1ccc" + }, + "identityMatch": true, + "oldIdentity": { + "index": 2, + "label": "Daily digest", + "tag": "div", + "type": "button" + }, + "originalAuditVerdict": "harness error", + "runtimeErrors": [], + "visuallyInspected": true + }, + { + "revision": "f009de5838f80b90e861e5727f0ad11cba8814f8", + "pluginRevision": "a632572aa58adc9b6ddf947c9e527587d09f22ca", + "provider": "codex", + "prompt": "notification-settings", + "width": 558, + "index": 3, + "label": "Delivery time \u00b7 UTC", + "verdict": "live", + "reason": "With digest enabled in both frames, the inspected native select interaction changes Morning (8 AM) to Midday (12 PM) and independently changes the notification preview from 8 AM to 12 PM UTC. This resolves the earlier hidden-selector lack of evidence.", + "mode": "primary", + "automaticPass": true, + "v3Result": { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/notification-settings/result.json", + "sha256": "c9e1df7a66812f0637c3c549af67dca46182859f97beec8504e1cb4efcc967d5" + }, + "evidence": [ + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/notification-settings/width-558/control-3-primary-before2.png", + "sha256": "e552fed2b90ff50cb896bcb27bc47e67a6e4dc1531f7ef6c9366a425b077d413", + "role": "before2" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/notification-settings/width-558/control-3-primary-after0.png", + "sha256": "b5c81710e7ccbfec168f06fc604aa7cbcaa0946934af3e9c098100a3438d702e", + "role": "after0" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/replay-pairs/baseline/codex/notification-settings-558-3.png", + "sha256": "d7fcff5c1f48c890842632ef1892c90ea7fcc5937e182ff190588e1dca447202", + "role": "visually inspected comparison" + } + ], + "allProbeFrames": [ + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/notification-settings/width-558/control-3-primary-before0.png", + "sha256": "e552fed2b90ff50cb896bcb27bc47e67a6e4dc1531f7ef6c9366a425b077d413" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/notification-settings/width-558/control-3-primary-before1.png", + "sha256": "e552fed2b90ff50cb896bcb27bc47e67a6e4dc1531f7ef6c9366a425b077d413" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/notification-settings/width-558/control-3-primary-before2.png", + "sha256": "e552fed2b90ff50cb896bcb27bc47e67a6e4dc1531f7ef6c9366a425b077d413" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/notification-settings/width-558/control-3-primary-after0.png", + "sha256": "b5c81710e7ccbfec168f06fc604aa7cbcaa0946934af3e9c098100a3438d702e" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/notification-settings/width-558/control-3-primary-after1.png", + "sha256": "b5c81710e7ccbfec168f06fc604aa7cbcaa0946934af3e9c098100a3438d702e" + } + ], + "source": { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/control-audit-codex-sources/baseline-notification-settings.html", + "sha256": "4b8879343525f790b93b6e73d53f7f98ad4e12ff74f2a612b05ace2b691a1ccc" + }, + "identityMatch": true, + "oldIdentity": { + "index": 3, + "label": "Delivery time \u00b7 UTC", + "tag": "select", + "type": "select-one" + }, + "originalAuditVerdict": "harness error", + "runtimeErrors": [], + "visuallyInspected": true + }, + { + "revision": "f009de5838f80b90e861e5727f0ad11cba8814f8", + "pluginRevision": "a632572aa58adc9b6ddf947c9e527587d09f22ca", + "provider": "codex", + "prompt": "notification-settings", + "width": 558, + "index": 4, + "label": "Reset defaults", + "verdict": "dead", + "reason": "The inspected Reset defaults click starts from a genuinely nondefault state (email off, digest at 12 PM) and leaves all controls and the independent preview unchanged. Saved onclick uses unsupported object-form P.set, confirming the original silent no-op; a working digest or selector cannot make this card pass.", + "mode": "primary", + "automaticPass": false, + "v3Result": { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/notification-settings/result.json", + "sha256": "c9e1df7a66812f0637c3c549af67dca46182859f97beec8504e1cb4efcc967d5" + }, + "evidence": [ + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/notification-settings/width-558/control-4-primary-before2.png", + "sha256": "1e8c98a7db815b513a5319dc929e8ff71b7e75339fc4a08694d8a899a60c3bc4", + "role": "before2" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/notification-settings/width-558/control-4-primary-after0.png", + "sha256": "1e8c98a7db815b513a5319dc929e8ff71b7e75339fc4a08694d8a899a60c3bc4", + "role": "after0" + } + ], + "allProbeFrames": [ + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/notification-settings/width-558/control-4-primary-before0.png", + "sha256": "1e8c98a7db815b513a5319dc929e8ff71b7e75339fc4a08694d8a899a60c3bc4" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/notification-settings/width-558/control-4-primary-before1.png", + "sha256": "1e8c98a7db815b513a5319dc929e8ff71b7e75339fc4a08694d8a899a60c3bc4" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/notification-settings/width-558/control-4-primary-before2.png", + "sha256": "1e8c98a7db815b513a5319dc929e8ff71b7e75339fc4a08694d8a899a60c3bc4" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/notification-settings/width-558/control-4-primary-after0.png", + "sha256": "1e8c98a7db815b513a5319dc929e8ff71b7e75339fc4a08694d8a899a60c3bc4" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/notification-settings/width-558/control-4-primary-after1.png", + "sha256": "1e8c98a7db815b513a5319dc929e8ff71b7e75339fc4a08694d8a899a60c3bc4" + } + ], + "source": { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/control-audit-codex-sources/baseline-notification-settings.html", + "sha256": "4b8879343525f790b93b6e73d53f7f98ad4e12ff74f2a612b05ace2b691a1ccc" + }, + "identityMatch": true, + "oldIdentity": { + "index": 4, + "label": "Reset defaults", + "tag": "button", + "type": "button" + }, + "originalAuditVerdict": "dead", + "runtimeErrors": [], + "visuallyInspected": true + }, + { + "revision": "f009de5838f80b90e861e5727f0ad11cba8814f8", + "pluginRevision": "a632572aa58adc9b6ddf947c9e527587d09f22ca", + "provider": "codex", + "prompt": "refrigerator", + "width": 710, + "index": 0, + "label": "Refrigeration cycle. Use left and right arrow keys to change stage.", + "verdict": "dead", + "reason": "The inspected supported-input before/after frames keep the same uninitialized refrigerator, blank stage explanation and unchanged output. The retained source object-form params.define throws before registering the render subscription; v3 records that initialization exception. Thus the original dead-control finding remains, not a merely small visual delta.", + "mode": "key-ArrowRight", + "automaticPass": false, + "v3Result": { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/refrigerator/result.json", + "sha256": "56c4ae83a7d210d4030bc6680820b3e9ad655402e89976df0998a643f92edb13" + }, + "evidence": [ + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/refrigerator/width-710/control-0-key-ArrowRight-before2.png", + "sha256": "999d92c964e042265692a2c2dfc84d410fd56aa1bc3d9f00f79944888498c882", + "role": "before2" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/refrigerator/width-710/control-0-key-ArrowRight-after0.png", + "sha256": "999d92c964e042265692a2c2dfc84d410fd56aa1bc3d9f00f79944888498c882", + "role": "after0" + } + ], + "allProbeFrames": [ + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/refrigerator/width-710/control-0-key-ArrowRight-before0.png", + "sha256": "999d92c964e042265692a2c2dfc84d410fd56aa1bc3d9f00f79944888498c882" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/refrigerator/width-710/control-0-key-ArrowRight-before1.png", + "sha256": "999d92c964e042265692a2c2dfc84d410fd56aa1bc3d9f00f79944888498c882" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/refrigerator/width-710/control-0-key-ArrowRight-before2.png", + "sha256": "999d92c964e042265692a2c2dfc84d410fd56aa1bc3d9f00f79944888498c882" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/refrigerator/width-710/control-0-key-ArrowRight-after0.png", + "sha256": "999d92c964e042265692a2c2dfc84d410fd56aa1bc3d9f00f79944888498c882" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/refrigerator/width-710/control-0-key-ArrowRight-after1.png", + "sha256": "999d92c964e042265692a2c2dfc84d410fd56aa1bc3d9f00f79944888498c882" + } + ], + "source": { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/control-audit-codex-sources/baseline-refrigerator.html", + "sha256": "417e29d824b18c2f32b9908a8342f5f4849117db0915d075240058eb38040962" + }, + "identityMatch": true, + "oldIdentity": { + "index": 0, + "label": "Refrigeration cycle. Use left and right arrow keys to change stage.", + "tag": "div", + "type": "group" + }, + "originalAuditVerdict": "dead", + "runtimeErrors": [ + "exception: Error: Parameter names are letters, digits, - and _: [object Object]" + ], + "visuallyInspected": true + }, + { + "revision": "f009de5838f80b90e861e5727f0ad11cba8814f8", + "pluginRevision": "a632572aa58adc9b6ddf947c9e527587d09f22ca", + "provider": "codex", + "prompt": "refrigerator", + "width": 710, + "index": 1, + "label": "1. Absorb", + "verdict": "dead", + "reason": "The inspected supported-input before/after frames keep the same uninitialized refrigerator, blank stage explanation and unchanged output. The retained source object-form params.define throws before registering the render subscription; v3 records that initialization exception. Thus the original dead-control finding remains, not a merely small visual delta.", + "mode": "primary", + "automaticPass": false, + "v3Result": { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/refrigerator/result.json", + "sha256": "56c4ae83a7d210d4030bc6680820b3e9ad655402e89976df0998a643f92edb13" + }, + "evidence": [ + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/refrigerator/width-710/control-1-primary-before2.png", + "sha256": "36bb1ab53798927e167d665e9e2984b7a46615f9f6cedc3c99338b4b2ea0ec07", + "role": "before2" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/refrigerator/width-710/control-1-primary-after0.png", + "sha256": "36bb1ab53798927e167d665e9e2984b7a46615f9f6cedc3c99338b4b2ea0ec07", + "role": "after0" + } + ], + "allProbeFrames": [ + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/refrigerator/width-710/control-1-primary-before0.png", + "sha256": "36bb1ab53798927e167d665e9e2984b7a46615f9f6cedc3c99338b4b2ea0ec07" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/refrigerator/width-710/control-1-primary-before1.png", + "sha256": "36bb1ab53798927e167d665e9e2984b7a46615f9f6cedc3c99338b4b2ea0ec07" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/refrigerator/width-710/control-1-primary-before2.png", + "sha256": "36bb1ab53798927e167d665e9e2984b7a46615f9f6cedc3c99338b4b2ea0ec07" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/refrigerator/width-710/control-1-primary-after0.png", + "sha256": "36bb1ab53798927e167d665e9e2984b7a46615f9f6cedc3c99338b4b2ea0ec07" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/refrigerator/width-710/control-1-primary-after1.png", + "sha256": "36bb1ab53798927e167d665e9e2984b7a46615f9f6cedc3c99338b4b2ea0ec07" + } + ], + "source": { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/control-audit-codex-sources/baseline-refrigerator.html", + "sha256": "417e29d824b18c2f32b9908a8342f5f4849117db0915d075240058eb38040962" + }, + "identityMatch": true, + "oldIdentity": { + "index": 1, + "label": "1. Absorb", + "tag": "button", + "type": "submit" + }, + "originalAuditVerdict": "dead", + "runtimeErrors": [ + "exception: Error: Parameter names are letters, digits, - and _: [object Object]" + ], + "visuallyInspected": true + }, + { + "revision": "f009de5838f80b90e861e5727f0ad11cba8814f8", + "pluginRevision": "a632572aa58adc9b6ddf947c9e527587d09f22ca", + "provider": "codex", + "prompt": "refrigerator", + "width": 710, + "index": 2, + "label": "2. Compress", + "verdict": "dead", + "reason": "The inspected supported-input before/after frames keep the same uninitialized refrigerator, blank stage explanation and unchanged output. The retained source object-form params.define throws before registering the render subscription; v3 records that initialization exception. Thus the original dead-control finding remains, not a merely small visual delta.", + "mode": "primary", + "automaticPass": false, + "v3Result": { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/refrigerator/result.json", + "sha256": "56c4ae83a7d210d4030bc6680820b3e9ad655402e89976df0998a643f92edb13" + }, + "evidence": [ + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/refrigerator/width-710/control-2-primary-before2.png", + "sha256": "36bb1ab53798927e167d665e9e2984b7a46615f9f6cedc3c99338b4b2ea0ec07", + "role": "before2" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/refrigerator/width-710/control-2-primary-after0.png", + "sha256": "36bb1ab53798927e167d665e9e2984b7a46615f9f6cedc3c99338b4b2ea0ec07", + "role": "after0" + } + ], + "allProbeFrames": [ + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/refrigerator/width-710/control-2-primary-before0.png", + "sha256": "36bb1ab53798927e167d665e9e2984b7a46615f9f6cedc3c99338b4b2ea0ec07" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/refrigerator/width-710/control-2-primary-before1.png", + "sha256": "36bb1ab53798927e167d665e9e2984b7a46615f9f6cedc3c99338b4b2ea0ec07" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/refrigerator/width-710/control-2-primary-before2.png", + "sha256": "36bb1ab53798927e167d665e9e2984b7a46615f9f6cedc3c99338b4b2ea0ec07" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/refrigerator/width-710/control-2-primary-after0.png", + "sha256": "36bb1ab53798927e167d665e9e2984b7a46615f9f6cedc3c99338b4b2ea0ec07" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/refrigerator/width-710/control-2-primary-after1.png", + "sha256": "36bb1ab53798927e167d665e9e2984b7a46615f9f6cedc3c99338b4b2ea0ec07" + } + ], + "source": { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/control-audit-codex-sources/baseline-refrigerator.html", + "sha256": "417e29d824b18c2f32b9908a8342f5f4849117db0915d075240058eb38040962" + }, + "identityMatch": true, + "oldIdentity": { + "index": 2, + "label": "2. Compress", + "tag": "button", + "type": "submit" + }, + "originalAuditVerdict": "dead", + "runtimeErrors": [ + "exception: Error: Parameter names are letters, digits, - and _: [object Object]" + ], + "visuallyInspected": true + }, + { + "revision": "f009de5838f80b90e861e5727f0ad11cba8814f8", + "pluginRevision": "a632572aa58adc9b6ddf947c9e527587d09f22ca", + "provider": "codex", + "prompt": "refrigerator", + "width": 710, + "index": 3, + "label": "3. Release", + "verdict": "dead", + "reason": "The inspected supported-input before/after frames keep the same uninitialized refrigerator, blank stage explanation and unchanged output. The retained source object-form params.define throws before registering the render subscription; v3 records that initialization exception. Thus the original dead-control finding remains, not a merely small visual delta.", + "mode": "primary", + "automaticPass": false, + "v3Result": { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/refrigerator/result.json", + "sha256": "56c4ae83a7d210d4030bc6680820b3e9ad655402e89976df0998a643f92edb13" + }, + "evidence": [ + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/refrigerator/width-710/control-3-primary-before2.png", + "sha256": "36bb1ab53798927e167d665e9e2984b7a46615f9f6cedc3c99338b4b2ea0ec07", + "role": "before2" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/refrigerator/width-710/control-3-primary-after0.png", + "sha256": "36bb1ab53798927e167d665e9e2984b7a46615f9f6cedc3c99338b4b2ea0ec07", + "role": "after0" + } + ], + "allProbeFrames": [ + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/refrigerator/width-710/control-3-primary-before0.png", + "sha256": "36bb1ab53798927e167d665e9e2984b7a46615f9f6cedc3c99338b4b2ea0ec07" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/refrigerator/width-710/control-3-primary-before1.png", + "sha256": "36bb1ab53798927e167d665e9e2984b7a46615f9f6cedc3c99338b4b2ea0ec07" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/refrigerator/width-710/control-3-primary-before2.png", + "sha256": "36bb1ab53798927e167d665e9e2984b7a46615f9f6cedc3c99338b4b2ea0ec07" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/refrigerator/width-710/control-3-primary-after0.png", + "sha256": "36bb1ab53798927e167d665e9e2984b7a46615f9f6cedc3c99338b4b2ea0ec07" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/refrigerator/width-710/control-3-primary-after1.png", + "sha256": "36bb1ab53798927e167d665e9e2984b7a46615f9f6cedc3c99338b4b2ea0ec07" + } + ], + "source": { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/control-audit-codex-sources/baseline-refrigerator.html", + "sha256": "417e29d824b18c2f32b9908a8342f5f4849117db0915d075240058eb38040962" + }, + "identityMatch": true, + "oldIdentity": { + "index": 3, + "label": "3. Release", + "tag": "button", + "type": "submit" + }, + "originalAuditVerdict": "dead", + "runtimeErrors": [ + "exception: Error: Parameter names are letters, digits, - and _: [object Object]" + ], + "visuallyInspected": true + }, + { + "revision": "f009de5838f80b90e861e5727f0ad11cba8814f8", + "pluginRevision": "a632572aa58adc9b6ddf947c9e527587d09f22ca", + "provider": "codex", + "prompt": "refrigerator", + "width": 710, + "index": 4, + "label": "4. Expand", + "verdict": "dead", + "reason": "The inspected supported-input before/after frames keep the same uninitialized refrigerator, blank stage explanation and unchanged output. The retained source object-form params.define throws before registering the render subscription; v3 records that initialization exception. Thus the original dead-control finding remains, not a merely small visual delta.", + "mode": "primary", + "automaticPass": false, + "v3Result": { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/refrigerator/result.json", + "sha256": "56c4ae83a7d210d4030bc6680820b3e9ad655402e89976df0998a643f92edb13" + }, + "evidence": [ + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/refrigerator/width-710/control-4-primary-before2.png", + "sha256": "36bb1ab53798927e167d665e9e2984b7a46615f9f6cedc3c99338b4b2ea0ec07", + "role": "before2" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/refrigerator/width-710/control-4-primary-after0.png", + "sha256": "36bb1ab53798927e167d665e9e2984b7a46615f9f6cedc3c99338b4b2ea0ec07", + "role": "after0" + } + ], + "allProbeFrames": [ + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/refrigerator/width-710/control-4-primary-before0.png", + "sha256": "36bb1ab53798927e167d665e9e2984b7a46615f9f6cedc3c99338b4b2ea0ec07" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/refrigerator/width-710/control-4-primary-before1.png", + "sha256": "36bb1ab53798927e167d665e9e2984b7a46615f9f6cedc3c99338b4b2ea0ec07" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/refrigerator/width-710/control-4-primary-before2.png", + "sha256": "36bb1ab53798927e167d665e9e2984b7a46615f9f6cedc3c99338b4b2ea0ec07" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/refrigerator/width-710/control-4-primary-after0.png", + "sha256": "36bb1ab53798927e167d665e9e2984b7a46615f9f6cedc3c99338b4b2ea0ec07" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/refrigerator/width-710/control-4-primary-after1.png", + "sha256": "36bb1ab53798927e167d665e9e2984b7a46615f9f6cedc3c99338b4b2ea0ec07" + } + ], + "source": { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/control-audit-codex-sources/baseline-refrigerator.html", + "sha256": "417e29d824b18c2f32b9908a8342f5f4849117db0915d075240058eb38040962" + }, + "identityMatch": true, + "oldIdentity": { + "index": 4, + "label": "4. Expand", + "tag": "button", + "type": "submit" + }, + "originalAuditVerdict": "dead", + "runtimeErrors": [ + "exception: Error: Parameter names are letters, digits, - and _: [object Object]" + ], + "visuallyInspected": true + }, + { + "revision": "f009de5838f80b90e861e5727f0ad11cba8814f8", + "pluginRevision": "a632572aa58adc9b6ddf947c9e527587d09f22ca", + "provider": "codex", + "prompt": "seat-belt", + "width": 710, + "index": 0, + "label": "Braking condition; use arrow keys", + "verdict": "dead", + "reason": "The inspected supported-input pair retains the same reel/latch and Free to unwind output with no mode explanation. Source initialization throws on object-form params.define before render subscription and animation registration; v3 captures the same exception. The original dead-control finding remains.", + "mode": "key-ArrowRight", + "automaticPass": false, + "v3Result": { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/seat-belt/result.json", + "sha256": "8433ef2cd777da67e843809339aa49dcffb115cd4e76f06a0e079963b08732c9" + }, + "evidence": [ + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/seat-belt/width-710/control-0-key-ArrowRight-before2.png", + "sha256": "1b0b96fb6c110196f5f405d8d2eaf59dcafe7dfafa54f27b6dd40b2ffc177b3a", + "role": "before2" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/seat-belt/width-710/control-0-key-ArrowRight-after0.png", + "sha256": "1b0b96fb6c110196f5f405d8d2eaf59dcafe7dfafa54f27b6dd40b2ffc177b3a", + "role": "after0" + } + ], + "allProbeFrames": [ + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/seat-belt/width-710/control-0-key-ArrowRight-before0.png", + "sha256": "1b0b96fb6c110196f5f405d8d2eaf59dcafe7dfafa54f27b6dd40b2ffc177b3a" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/seat-belt/width-710/control-0-key-ArrowRight-before1.png", + "sha256": "1b0b96fb6c110196f5f405d8d2eaf59dcafe7dfafa54f27b6dd40b2ffc177b3a" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/seat-belt/width-710/control-0-key-ArrowRight-before2.png", + "sha256": "1b0b96fb6c110196f5f405d8d2eaf59dcafe7dfafa54f27b6dd40b2ffc177b3a" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/seat-belt/width-710/control-0-key-ArrowRight-after0.png", + "sha256": "1b0b96fb6c110196f5f405d8d2eaf59dcafe7dfafa54f27b6dd40b2ffc177b3a" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/seat-belt/width-710/control-0-key-ArrowRight-after1.png", + "sha256": "1b0b96fb6c110196f5f405d8d2eaf59dcafe7dfafa54f27b6dd40b2ffc177b3a" + } + ], + "source": { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/control-audit-codex-sources/baseline-seat-belt.html", + "sha256": "492c1d853880e265bc9934d100c01d3442f543646acc457fef6217b67d60d86c" + }, + "identityMatch": true, + "oldIdentity": { + "index": 0, + "label": "Braking condition; use arrow keys", + "tag": "div", + "type": "slider" + }, + "originalAuditVerdict": "dead", + "runtimeErrors": [ + "exception: Error: Parameter names are letters, digits, - and _: [object Object]" + ], + "visuallyInspected": true + }, + { + "revision": "f009de5838f80b90e861e5727f0ad11cba8814f8", + "pluginRevision": "a632572aa58adc9b6ddf947c9e527587d09f22ca", + "provider": "codex", + "prompt": "seat-belt", + "width": 710, + "index": 1, + "label": "Normal movement", + "verdict": "dead", + "reason": "The inspected supported-input pair retains the same reel/latch and Free to unwind output with no mode explanation. Source initialization throws on object-form params.define before render subscription and animation registration; v3 captures the same exception. The original dead-control finding remains.", + "mode": "primary", + "automaticPass": false, + "v3Result": { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/seat-belt/result.json", + "sha256": "8433ef2cd777da67e843809339aa49dcffb115cd4e76f06a0e079963b08732c9" + }, + "evidence": [ + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/seat-belt/width-710/control-1-primary-before2.png", + "sha256": "4ca35262649cb3f317012e9d285a54a11bda59222294072d9a6651651bd7cde3", + "role": "before2" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/seat-belt/width-710/control-1-primary-after0.png", + "sha256": "4ca35262649cb3f317012e9d285a54a11bda59222294072d9a6651651bd7cde3", + "role": "after0" + } + ], + "allProbeFrames": [ + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/seat-belt/width-710/control-1-primary-before0.png", + "sha256": "4ca35262649cb3f317012e9d285a54a11bda59222294072d9a6651651bd7cde3" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/seat-belt/width-710/control-1-primary-before1.png", + "sha256": "4ca35262649cb3f317012e9d285a54a11bda59222294072d9a6651651bd7cde3" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/seat-belt/width-710/control-1-primary-before2.png", + "sha256": "4ca35262649cb3f317012e9d285a54a11bda59222294072d9a6651651bd7cde3" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/seat-belt/width-710/control-1-primary-after0.png", + "sha256": "4ca35262649cb3f317012e9d285a54a11bda59222294072d9a6651651bd7cde3" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/seat-belt/width-710/control-1-primary-after1.png", + "sha256": "4ca35262649cb3f317012e9d285a54a11bda59222294072d9a6651651bd7cde3" + } + ], + "source": { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/control-audit-codex-sources/baseline-seat-belt.html", + "sha256": "492c1d853880e265bc9934d100c01d3442f543646acc457fef6217b67d60d86c" + }, + "identityMatch": true, + "oldIdentity": { + "index": 1, + "label": "Normal movement", + "tag": "button", + "type": "submit" + }, + "originalAuditVerdict": "dead", + "runtimeErrors": [ + "exception: Error: Parameter names are letters, digits, - and _: [object Object]" + ], + "visuallyInspected": true + }, + { + "revision": "f009de5838f80b90e861e5727f0ad11cba8814f8", + "pluginRevision": "a632572aa58adc9b6ddf947c9e527587d09f22ca", + "provider": "codex", + "prompt": "seat-belt", + "width": 710, + "index": 2, + "label": "Sudden braking", + "verdict": "dead", + "reason": "The inspected supported-input pair retains the same reel/latch and Free to unwind output with no mode explanation. Source initialization throws on object-form params.define before render subscription and animation registration; v3 captures the same exception. The original dead-control finding remains.", + "mode": "primary", + "automaticPass": false, + "v3Result": { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/seat-belt/result.json", + "sha256": "8433ef2cd777da67e843809339aa49dcffb115cd4e76f06a0e079963b08732c9" + }, + "evidence": [ + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/seat-belt/width-710/control-2-primary-before2.png", + "sha256": "4ca35262649cb3f317012e9d285a54a11bda59222294072d9a6651651bd7cde3", + "role": "before2" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/seat-belt/width-710/control-2-primary-after0.png", + "sha256": "4ca35262649cb3f317012e9d285a54a11bda59222294072d9a6651651bd7cde3", + "role": "after0" + } + ], + "allProbeFrames": [ + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/seat-belt/width-710/control-2-primary-before0.png", + "sha256": "4ca35262649cb3f317012e9d285a54a11bda59222294072d9a6651651bd7cde3" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/seat-belt/width-710/control-2-primary-before1.png", + "sha256": "4ca35262649cb3f317012e9d285a54a11bda59222294072d9a6651651bd7cde3" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/seat-belt/width-710/control-2-primary-before2.png", + "sha256": "4ca35262649cb3f317012e9d285a54a11bda59222294072d9a6651651bd7cde3" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/seat-belt/width-710/control-2-primary-after0.png", + "sha256": "4ca35262649cb3f317012e9d285a54a11bda59222294072d9a6651651bd7cde3" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/seat-belt/width-710/control-2-primary-after1.png", + "sha256": "4ca35262649cb3f317012e9d285a54a11bda59222294072d9a6651651bd7cde3" + } + ], + "source": { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/control-audit-codex-sources/baseline-seat-belt.html", + "sha256": "492c1d853880e265bc9934d100c01d3442f543646acc457fef6217b67d60d86c" + }, + "identityMatch": true, + "oldIdentity": { + "index": 2, + "label": "Sudden braking", + "tag": "button", + "type": "submit" + }, + "originalAuditVerdict": "dead", + "runtimeErrors": [ + "exception: Error: Parameter names are letters, digits, - and _: [object Object]" + ], + "visuallyInspected": true + }, + { + "revision": "f009de5838f80b90e861e5727f0ad11cba8814f8", + "pluginRevision": "a632572aa58adc9b6ddf947c9e527587d09f22ca", + "provider": "codex", + "prompt": "spray-bottle", + "width": 710, + "index": 0, + "label": "Pump stroke", + "verdict": "live", + "reason": "The inspected ArrowRight pair changes Release to Squeeze: mist appears, piston/spring geometry changes and the explanation and external readout update. The saved global keyboard handler explicitly supports ArrowRight and switches the phase before animation, so this is an input-caused transition. The captured initialization runtime error still rejects the card.", + "mode": "key-ArrowRight", + "automaticPass": true, + "v3Result": { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/spray-bottle/result.json", + "sha256": "5f3f2d0801a433b856a1fb33177b05defe162c1b7e09780493c327de77550f07" + }, + "evidence": [ + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/spray-bottle/width-710/control-0-key-ArrowRight-before2.png", + "sha256": "2355f7d3356e4b6b918886701bca138030093b3938f24ebbd3732f88772ade48", + "role": "before2" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/spray-bottle/width-710/control-0-key-ArrowRight-after0.png", + "sha256": "8b273319fe3686be6c4237603d13c986b927310320b79df4117fa288a0a90089", + "role": "after0" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/replay-pairs/baseline/codex/spray-bottle-710-0.png", + "sha256": "4999f782ebe6f455251299d0a51efca9c48fd2d0a24a817ba82e954eec8c51ab", + "role": "visually inspected comparison" + } + ], + "allProbeFrames": [ + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/spray-bottle/width-710/control-0-key-ArrowRight-before0.png", + "sha256": "2355f7d3356e4b6b918886701bca138030093b3938f24ebbd3732f88772ade48" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/spray-bottle/width-710/control-0-key-ArrowRight-before1.png", + "sha256": "2355f7d3356e4b6b918886701bca138030093b3938f24ebbd3732f88772ade48" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/spray-bottle/width-710/control-0-key-ArrowRight-before2.png", + "sha256": "2355f7d3356e4b6b918886701bca138030093b3938f24ebbd3732f88772ade48" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/spray-bottle/width-710/control-0-key-ArrowRight-after0.png", + "sha256": "8b273319fe3686be6c4237603d13c986b927310320b79df4117fa288a0a90089" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/spray-bottle/width-710/control-0-key-ArrowRight-after1.png", + "sha256": "8b273319fe3686be6c4237603d13c986b927310320b79df4117fa288a0a90089" + } + ], + "source": { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/control-audit-codex-sources/baseline-spray-bottle.html", + "sha256": "5c34419ceb39d7c67a00de41bce1c2520b9d1b27f76e87d28ebfda811b0bb49e" + }, + "identityMatch": true, + "oldIdentity": { + "index": 0, + "label": "Pump stroke", + "tag": "div", + "type": "slider" + }, + "originalAuditVerdict": "harness error", + "runtimeErrors": [ + "exception: Error: Parameter names are letters, digits, - and _: [object Object]" + ], + "visuallyInspected": true + }, + { + "revision": "f009de5838f80b90e861e5727f0ad11cba8814f8", + "pluginRevision": "a632572aa58adc9b6ddf947c9e527587d09f22ca", + "provider": "codex", + "prompt": "stapler", + "width": 710, + "index": 0, + "label": "Stapler cycle", + "verdict": "live", + "reason": "The inspected End pair changes Ready to Release and replaces the explanatory paragraph with the return-spring/feed-spring stage. The saved source explicitly handles End and sets cycle 100; there is no autonomous cycle timer.", + "mode": "key-End", + "automaticPass": true, + "v3Result": { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/stapler/result.json", + "sha256": "38fba8bbf0d9d5d185f4ba38ec7c34341a997efbaed9ad6dbe9add352a26d5fd" + }, + "evidence": [ + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/stapler/width-710/control-0-key-End-before2.png", + "sha256": "09eb5d2ca067411db041ba7e0f65c50e2ecad70f7cd0afe04b13574aa8230c53", + "role": "before2" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/stapler/width-710/control-0-key-End-after0.png", + "sha256": "a3d60468d966bf6b892826fef3ba6e1e18605c007eddd5df8070fdd2d50faf1b", + "role": "after0" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/replay-pairs/baseline/codex/stapler-710-0.png", + "sha256": "eab4ac84dcdc6db85265665b4772c288513880b4ac414f47d06be2cc1b9c4c19", + "role": "visually inspected comparison" + } + ], + "allProbeFrames": [ + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/stapler/width-710/control-0-key-End-before0.png", + "sha256": "09eb5d2ca067411db041ba7e0f65c50e2ecad70f7cd0afe04b13574aa8230c53" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/stapler/width-710/control-0-key-End-before1.png", + "sha256": "09eb5d2ca067411db041ba7e0f65c50e2ecad70f7cd0afe04b13574aa8230c53" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/stapler/width-710/control-0-key-End-before2.png", + "sha256": "09eb5d2ca067411db041ba7e0f65c50e2ecad70f7cd0afe04b13574aa8230c53" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/stapler/width-710/control-0-key-End-after0.png", + "sha256": "a3d60468d966bf6b892826fef3ba6e1e18605c007eddd5df8070fdd2d50faf1b" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/stapler/width-710/control-0-key-End-after1.png", + "sha256": "a3d60468d966bf6b892826fef3ba6e1e18605c007eddd5df8070fdd2d50faf1b" + } + ], + "source": { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/control-audit-codex-sources/baseline-stapler.html", + "sha256": "e724dfb45c4fec4e654a6adbb6e1255eb2be76e1c3bd56742cccad6c435f55ca" + }, + "identityMatch": true, + "oldIdentity": { + "index": 0, + "label": "Stapler cycle", + "tag": "div", + "type": "slider" + }, + "originalAuditVerdict": "harness error", + "runtimeErrors": [], + "visuallyInspected": true + }, + { + "revision": "f009de5838f80b90e861e5727f0ad11cba8814f8", + "pluginRevision": "a632572aa58adc9b6ddf947c9e527587d09f22ca", + "provider": "codex", + "prompt": "stapler", + "width": 710, + "index": 2, + "label": "Next stage \u2192", + "verdict": "live", + "reason": "The inspected Next-stage click resets Release to Ready, changes the mechanism geometry and explanatory paragraph, matching the saved synchronous next-stage handler.", + "mode": "primary", + "automaticPass": true, + "v3Result": { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/stapler/result.json", + "sha256": "38fba8bbf0d9d5d185f4ba38ec7c34341a997efbaed9ad6dbe9add352a26d5fd" + }, + "evidence": [ + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/stapler/width-710/control-2-primary-before2.png", + "sha256": "8d2146d8385f0dd7fd5ff2df0ef8290a9f91fb164f10597d74fce552f3ca8bc5", + "role": "before2" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/stapler/width-710/control-2-primary-after0.png", + "sha256": "c7bf01b93fc3b20b43c49bd7f0bf16e99611bfbf1dd94d7ecba17fa883b9b963", + "role": "after0" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/replay-pairs/baseline/codex/stapler-710-2.png", + "sha256": "96769d4086d48886b2f7786281cc16674078eb9b4365570ef25cf3ec522b240f", + "role": "visually inspected comparison" + } + ], + "allProbeFrames": [ + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/stapler/width-710/control-2-primary-before0.png", + "sha256": "8d2146d8385f0dd7fd5ff2df0ef8290a9f91fb164f10597d74fce552f3ca8bc5" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/stapler/width-710/control-2-primary-before1.png", + "sha256": "8d2146d8385f0dd7fd5ff2df0ef8290a9f91fb164f10597d74fce552f3ca8bc5" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/stapler/width-710/control-2-primary-before2.png", + "sha256": "8d2146d8385f0dd7fd5ff2df0ef8290a9f91fb164f10597d74fce552f3ca8bc5" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/stapler/width-710/control-2-primary-after0.png", + "sha256": "c7bf01b93fc3b20b43c49bd7f0bf16e99611bfbf1dd94d7ecba17fa883b9b963" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/stapler/width-710/control-2-primary-after1.png", + "sha256": "c7bf01b93fc3b20b43c49bd7f0bf16e99611bfbf1dd94d7ecba17fa883b9b963" + } + ], + "source": { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/control-audit-codex-sources/baseline-stapler.html", + "sha256": "e724dfb45c4fec4e654a6adbb6e1255eb2be76e1c3bd56742cccad6c435f55ca" + }, + "identityMatch": true, + "oldIdentity": { + "index": 2, + "label": "Next stage \u2192", + "tag": "button", + "type": "submit" + }, + "originalAuditVerdict": "harness error", + "runtimeErrors": [], + "visuallyInspected": true + }, + { + "revision": "f009de5838f80b90e861e5727f0ad11cba8814f8", + "pluginRevision": "a632572aa58adc9b6ddf947c9e527587d09f22ca", + "provider": "codex", + "prompt": "toilet", + "width": 710, + "index": 0, + "label": "Flush cycle; use left and right arrow keys", + "verdict": "live", + "reason": "The inspected End pair changes Ready to Shut off and the external readout and paragraph to Float raised / refill shuts off. The saved source explicitly handles End, stops the timer first and selects phase 4, so this is a supported input route rather than autonomous cycle settling.", + "mode": "key-End", + "automaticPass": true, + "v3Result": { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/toilet/result.json", + "sha256": "c0639791d117e9a5b9c489afc1c6c9448f93d6b2408630564da620ed456fc8e6" + }, + "evidence": [ + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/toilet/width-710/control-0-key-End-before2.png", + "sha256": "8eee889d8f17f94bfae25eff08badb329ba871b513390d80115c505cb459be49", + "role": "before2" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/toilet/width-710/control-0-key-End-after0.png", + "sha256": "152f5d1b36883685ab8581e26ddb5392f6435ed12f2a6064d28e14b1c626e7f0", + "role": "after0" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/replay-pairs/baseline/codex/toilet-710-0.png", + "sha256": "b18f8f6f6b3574ea39c8c88f77462fb66f6757b7a1761322b35016d6c00fa448", + "role": "visually inspected comparison" + } + ], + "allProbeFrames": [ + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/toilet/width-710/control-0-key-End-before0.png", + "sha256": "8eee889d8f17f94bfae25eff08badb329ba871b513390d80115c505cb459be49" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/toilet/width-710/control-0-key-End-before1.png", + "sha256": "8eee889d8f17f94bfae25eff08badb329ba871b513390d80115c505cb459be49" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/toilet/width-710/control-0-key-End-before2.png", + "sha256": "8eee889d8f17f94bfae25eff08badb329ba871b513390d80115c505cb459be49" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/toilet/width-710/control-0-key-End-after0.png", + "sha256": "152f5d1b36883685ab8581e26ddb5392f6435ed12f2a6064d28e14b1c626e7f0" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/toilet/width-710/control-0-key-End-after1.png", + "sha256": "152f5d1b36883685ab8581e26ddb5392f6435ed12f2a6064d28e14b1c626e7f0" + } + ], + "source": { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/control-audit-codex-sources/baseline-toilet.html", + "sha256": "5a62691d48c7ebddf174ff0e4fb35ccf4725e0af583c41071ef4800fa3575360" + }, + "identityMatch": true, + "oldIdentity": { + "index": 0, + "label": "Flush cycle; use left and right arrow keys", + "tag": "div", + "type": "slider" + }, + "originalAuditVerdict": "harness error", + "runtimeErrors": [], + "visuallyInspected": true + }, + { + "revision": "f009de5838f80b90e861e5727f0ad11cba8814f8", + "pluginRevision": "a632572aa58adc9b6ddf947c9e527587d09f22ca", + "provider": "codex", + "prompt": "umbrella", + "width": 710, + "index": 0, + "label": "Cutaway umbrella showing a sliding runner, hinged stretchers, ribs and fabric", + "verdict": "live", + "reason": "The inspected Home pair draws a closed umbrella and closed-state explanation from the initially blank stage. The saved handler explicitly supports Home and changes the target opening before rendering. This proves the input route, while the initialization exception still rejects the whole card.", + "mode": "key-Home", + "automaticPass": true, + "v3Result": { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/umbrella/result.json", + "sha256": "f5aaf770a526f7638f534ee4fe0e212eddb39e38bcb79d5c39c3e2a662f52371" + }, + "evidence": [ + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/umbrella/width-710/control-0-key-Home-before2.png", + "sha256": "721bd293a28fb176fd12adc52a5ff2296b3362121f5205a9d4d4e3375c67c5f1", + "role": "before2" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/umbrella/width-710/control-0-key-Home-after0.png", + "sha256": "ffa3ce1891b43ef62f3b51d6dc60d543d9d4f9845b1f3109cffe321eaf73bd48", + "role": "after0" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/replay-pairs/baseline/codex/umbrella-710-0.png", + "sha256": "4c6b4f596068c004825fe83694a4287221447c7355671dc1db4ad2aee1c0551e", + "role": "visually inspected comparison" + } + ], + "allProbeFrames": [ + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/umbrella/width-710/control-0-key-Home-before0.png", + "sha256": "721bd293a28fb176fd12adc52a5ff2296b3362121f5205a9d4d4e3375c67c5f1" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/umbrella/width-710/control-0-key-Home-before1.png", + "sha256": "721bd293a28fb176fd12adc52a5ff2296b3362121f5205a9d4d4e3375c67c5f1" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/umbrella/width-710/control-0-key-Home-before2.png", + "sha256": "721bd293a28fb176fd12adc52a5ff2296b3362121f5205a9d4d4e3375c67c5f1" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/umbrella/width-710/control-0-key-Home-after0.png", + "sha256": "ffa3ce1891b43ef62f3b51d6dc60d543d9d4f9845b1f3109cffe321eaf73bd48" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/umbrella/width-710/control-0-key-Home-after1.png", + "sha256": "ffa3ce1891b43ef62f3b51d6dc60d543d9d4f9845b1f3109cffe321eaf73bd48" + } + ], + "source": { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/control-audit-codex-sources/baseline-umbrella.html", + "sha256": "2ffa380beec3c6b295cf03f0ba19e98f6a3d5879e33f1776183cb74dce26f3e6" + }, + "identityMatch": true, + "oldIdentity": { + "index": 0, + "label": "Cutaway umbrella showing a sliding runner, hinged stretchers, ribs and fabric", + "tag": "svg", + "type": "img" + }, + "originalAuditVerdict": "harness error", + "runtimeErrors": [ + "exception: Error: Parameter names are letters, digits, - and _: [object Object]" + ], + "visuallyInspected": true + }, + { + "revision": "f009de5838f80b90e861e5727f0ad11cba8814f8", + "pluginRevision": "a632572aa58adc9b6ddf947c9e527587d09f22ca", + "provider": "codex", + "prompt": "umbrella", + "width": 710, + "index": 1, + "label": "Open", + "verdict": "live", + "reason": "The inspected Open click unfolds the canopy and ribs, raises the runner and changes the explanatory text to the open state. Its saved handler sets opening 100; the visible change is not merely control styling. The card initialization runtime error remains disqualifying.", + "mode": "primary", + "automaticPass": true, + "v3Result": { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/umbrella/result.json", + "sha256": "f5aaf770a526f7638f534ee4fe0e212eddb39e38bcb79d5c39c3e2a662f52371" + }, + "evidence": [ + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/umbrella/width-710/control-1-primary-before2.png", + "sha256": "12b61760fd7d82a7a5d421067e7f5393aff1faf38c1d797372742d9ce97c5b44", + "role": "before2" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/umbrella/width-710/control-1-primary-after0.png", + "sha256": "ed55c601fee92e2983632e48ab0931df14c77af135e600f08886dc19f239027c", + "role": "after0" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/replay-pairs/baseline/codex/umbrella-710-1.png", + "sha256": "0817f9258d0808b5c4d5a5bdbf21740fcebc224a49833de7620a6abdd33d334f", + "role": "visually inspected comparison" + } + ], + "allProbeFrames": [ + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/umbrella/width-710/control-1-primary-before0.png", + "sha256": "12b61760fd7d82a7a5d421067e7f5393aff1faf38c1d797372742d9ce97c5b44" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/umbrella/width-710/control-1-primary-before1.png", + "sha256": "12b61760fd7d82a7a5d421067e7f5393aff1faf38c1d797372742d9ce97c5b44" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/umbrella/width-710/control-1-primary-before2.png", + "sha256": "12b61760fd7d82a7a5d421067e7f5393aff1faf38c1d797372742d9ce97c5b44" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/umbrella/width-710/control-1-primary-after0.png", + "sha256": "ed55c601fee92e2983632e48ab0931df14c77af135e600f08886dc19f239027c" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/umbrella/width-710/control-1-primary-after1.png", + "sha256": "ed55c601fee92e2983632e48ab0931df14c77af135e600f08886dc19f239027c" + } + ], + "source": { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/control-audit-codex-sources/baseline-umbrella.html", + "sha256": "2ffa380beec3c6b295cf03f0ba19e98f6a3d5879e33f1776183cb74dce26f3e6" + }, + "identityMatch": true, + "oldIdentity": { + "index": 1, + "label": "Open", + "tag": "button", + "type": "submit" + }, + "originalAuditVerdict": "harness error", + "runtimeErrors": [ + "exception: Error: Parameter names are letters, digits, - and _: [object Object]" + ], + "visuallyInspected": true + }, + { + "revision": "f009de5838f80b90e861e5727f0ad11cba8814f8", + "pluginRevision": "a632572aa58adc9b6ddf947c9e527587d09f22ca", + "provider": "codex", + "prompt": "washing-machine", + "width": 710, + "index": 0, + "label": "control 0", + "verdict": "live", + "reason": "Supported ArrowRight changes Fill to Wash, including the explanatory paragraph and readout. No autonomous stage advance exists in the saved handler.", + "mode": "key-ArrowRight", + "automaticPass": true, + "v3Result": { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/washing-machine/result.json", + "sha256": "ec59840357e983941f82d58f3c47282a5b3461e1065695f13940e1f37ca20cd2" + }, + "evidence": [ + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/washing-machine/width-710/control-0-key-ArrowRight-before2.png", + "sha256": "7360b5794012577180e4017b3d3b11601614438b135ef9c43859254fb34889de", + "role": "before2" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/washing-machine/width-710/control-0-key-ArrowRight-after0.png", + "sha256": "fbf5d57db51b978a1dda31baa76d0e8d0f93845deee260d04ffa8aba933e3a54", + "role": "after0" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/replay-pairs/baseline/codex/washing-machine-710-0.png", + "sha256": "4d4b915f9dd9623c9e767d371e835aa9e33320017f8ffb0f63cbbb60cd06b23a", + "role": "visually inspected comparison" + } + ], + "allProbeFrames": [ + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/washing-machine/width-710/control-0-key-ArrowRight-before0.png", + "sha256": "7360b5794012577180e4017b3d3b11601614438b135ef9c43859254fb34889de" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/washing-machine/width-710/control-0-key-ArrowRight-before1.png", + "sha256": "7360b5794012577180e4017b3d3b11601614438b135ef9c43859254fb34889de" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/washing-machine/width-710/control-0-key-ArrowRight-before2.png", + "sha256": "7360b5794012577180e4017b3d3b11601614438b135ef9c43859254fb34889de" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/washing-machine/width-710/control-0-key-ArrowRight-after0.png", + "sha256": "fbf5d57db51b978a1dda31baa76d0e8d0f93845deee260d04ffa8aba933e3a54" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/washing-machine/width-710/control-0-key-ArrowRight-after1.png", + "sha256": "f0420870663b24dba00b30ae026d6bd52e5da6d6cb44e2405dc35329424526ff" + } + ], + "source": { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/control-audit-codex-sources/baseline-washing-machine.html", + "sha256": "0c59e3b559ce686bd52cb6390e0b4de42cb22e35357ea904979726f674312e65" + }, + "identityMatch": true, + "oldIdentity": { + "index": 0, + "label": "control 0", + "tag": "div", + "type": "" + } + }, + { + "revision": "f009de5838f80b90e861e5727f0ad11cba8814f8", + "pluginRevision": "a632572aa58adc9b6ddf947c9e527587d09f22ca", + "provider": "codex", + "prompt": "washing-machine", + "width": 710, + "index": 1, + "label": "Fill", + "verdict": "live", + "reason": "Click Fill changes Wash to Fill and replaces the mechanism explanation/readout.", + "mode": "primary", + "automaticPass": true, + "v3Result": { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/washing-machine/result.json", + "sha256": "ec59840357e983941f82d58f3c47282a5b3461e1065695f13940e1f37ca20cd2" + }, + "evidence": [ + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/washing-machine/width-710/control-1-primary-before2.png", + "sha256": "98a6a4d096dd60de323ce83bf0747fee5184990f5e1caf093e423266088669be", + "role": "before2" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/washing-machine/width-710/control-1-primary-after0.png", + "sha256": "fcd73db4601b3d70b2e64b70a8f89167b09f7664cde99b6e8297b26bd4fcaabd", + "role": "after0" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/replay-pairs/baseline/codex/washing-machine-710-1.png", + "sha256": "f35080c8425c78216cfb145844ae989cc31c51daa361a2dcbb161a650c19595a", + "role": "visually inspected comparison" + } + ], + "allProbeFrames": [ + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/washing-machine/width-710/control-1-primary-before0.png", + "sha256": "7d39659841cd5276eeb0efeac22b8faae679bbbfe269dc6a259ce99b62c947dc" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/washing-machine/width-710/control-1-primary-before1.png", + "sha256": "98a6a4d096dd60de323ce83bf0747fee5184990f5e1caf093e423266088669be" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/washing-machine/width-710/control-1-primary-before2.png", + "sha256": "98a6a4d096dd60de323ce83bf0747fee5184990f5e1caf093e423266088669be" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/washing-machine/width-710/control-1-primary-after0.png", + "sha256": "fcd73db4601b3d70b2e64b70a8f89167b09f7664cde99b6e8297b26bd4fcaabd" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/washing-machine/width-710/control-1-primary-after1.png", + "sha256": "352d54ac62f9cee113113c994c2e76ccc766d73a7a6b494ecf230c5795ab48db" + } + ], + "source": { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/control-audit-codex-sources/baseline-washing-machine.html", + "sha256": "0c59e3b559ce686bd52cb6390e0b4de42cb22e35357ea904979726f674312e65" + }, + "identityMatch": true, + "oldIdentity": { + "index": 1, + "label": "Fill", + "tag": "button", + "type": "button" + } + }, + { + "revision": "f009de5838f80b90e861e5727f0ad11cba8814f8", + "pluginRevision": "a632572aa58adc9b6ddf947c9e527587d09f22ca", + "provider": "codex", + "prompt": "washing-machine", + "width": 710, + "index": 2, + "label": "Wash", + "verdict": "live", + "reason": "Click Wash changes Fill to Wash and replaces the mechanism explanation/readout.", + "mode": "primary", + "automaticPass": true, + "v3Result": { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/washing-machine/result.json", + "sha256": "ec59840357e983941f82d58f3c47282a5b3461e1065695f13940e1f37ca20cd2" + }, + "evidence": [ + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/washing-machine/width-710/control-2-primary-before2.png", + "sha256": "352d54ac62f9cee113113c994c2e76ccc766d73a7a6b494ecf230c5795ab48db", + "role": "before2" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/washing-machine/width-710/control-2-primary-after0.png", + "sha256": "7d39659841cd5276eeb0efeac22b8faae679bbbfe269dc6a259ce99b62c947dc", + "role": "after0" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/replay-pairs/baseline/codex/washing-machine-710-2.png", + "sha256": "9f9fe1ffce5a6aa2ef1f74063f11a8584309cad68a73a3cd7748de17226b85ed", + "role": "visually inspected comparison" + } + ], + "allProbeFrames": [ + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/washing-machine/width-710/control-2-primary-before0.png", + "sha256": "352d54ac62f9cee113113c994c2e76ccc766d73a7a6b494ecf230c5795ab48db" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/washing-machine/width-710/control-2-primary-before1.png", + "sha256": "352d54ac62f9cee113113c994c2e76ccc766d73a7a6b494ecf230c5795ab48db" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/washing-machine/width-710/control-2-primary-before2.png", + "sha256": "352d54ac62f9cee113113c994c2e76ccc766d73a7a6b494ecf230c5795ab48db" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/washing-machine/width-710/control-2-primary-after0.png", + "sha256": "7d39659841cd5276eeb0efeac22b8faae679bbbfe269dc6a259ce99b62c947dc" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/washing-machine/width-710/control-2-primary-after1.png", + "sha256": "98a6a4d096dd60de323ce83bf0747fee5184990f5e1caf093e423266088669be" + } + ], + "source": { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/control-audit-codex-sources/baseline-washing-machine.html", + "sha256": "0c59e3b559ce686bd52cb6390e0b4de42cb22e35357ea904979726f674312e65" + }, + "identityMatch": true, + "oldIdentity": { + "index": 2, + "label": "Wash", + "tag": "button", + "type": "button" + } + }, + { + "revision": "f009de5838f80b90e861e5727f0ad11cba8814f8", + "pluginRevision": "a632572aa58adc9b6ddf947c9e527587d09f22ca", + "provider": "codex", + "prompt": "washing-machine", + "width": 710, + "index": 3, + "label": "Drain", + "verdict": "live", + "reason": "Click Drain visibly removes tank water, lights the drain route and changes the explanation/readout.", + "mode": "primary", + "automaticPass": true, + "v3Result": { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/washing-machine/result.json", + "sha256": "ec59840357e983941f82d58f3c47282a5b3461e1065695f13940e1f37ca20cd2" + }, + "evidence": [ + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/washing-machine/width-710/control-3-primary-before2.png", + "sha256": "352d54ac62f9cee113113c994c2e76ccc766d73a7a6b494ecf230c5795ab48db", + "role": "before2" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/washing-machine/width-710/control-3-primary-after0.png", + "sha256": "f025a087c59463060def596908cf6aebdbaac3b2da600a05ad4619f8661cd71f", + "role": "after0" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/replay-pairs/baseline/codex/washing-machine-710-3.png", + "sha256": "414bd2ffb951042aa9e29a4dcb3ba99f2885bc4cdd9b2b4de8646ab40b0a59d2", + "role": "visually inspected comparison" + } + ], + "allProbeFrames": [ + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/washing-machine/width-710/control-3-primary-before0.png", + "sha256": "fcd73db4601b3d70b2e64b70a8f89167b09f7664cde99b6e8297b26bd4fcaabd" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/washing-machine/width-710/control-3-primary-before1.png", + "sha256": "352d54ac62f9cee113113c994c2e76ccc766d73a7a6b494ecf230c5795ab48db" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/washing-machine/width-710/control-3-primary-before2.png", + "sha256": "352d54ac62f9cee113113c994c2e76ccc766d73a7a6b494ecf230c5795ab48db" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/washing-machine/width-710/control-3-primary-after0.png", + "sha256": "f025a087c59463060def596908cf6aebdbaac3b2da600a05ad4619f8661cd71f" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/washing-machine/width-710/control-3-primary-after1.png", + "sha256": "ed9515a441b8ba8fba5e1b7c78100235e97fa6001aae5a2723ca91bfa45cda5c" + } + ], + "source": { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/control-audit-codex-sources/baseline-washing-machine.html", + "sha256": "0c59e3b559ce686bd52cb6390e0b4de42cb22e35357ea904979726f674312e65" + }, + "identityMatch": true, + "oldIdentity": { + "index": 3, + "label": "Drain", + "tag": "button", + "type": "button" + } + }, + { + "revision": "f009de5838f80b90e861e5727f0ad11cba8814f8", + "pluginRevision": "a632572aa58adc9b6ddf947c9e527587d09f22ca", + "provider": "codex", + "prompt": "washing-machine", + "width": 710, + "index": 5, + "label": "Spin", + "verdict": "live", + "reason": "Click Spin visibly removes tank water, changes drum appearance and explains spinning/draining instead of filling.", + "mode": "primary", + "automaticPass": true, + "v3Result": { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/washing-machine/result.json", + "sha256": "ec59840357e983941f82d58f3c47282a5b3461e1065695f13940e1f37ca20cd2" + }, + "evidence": [ + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/washing-machine/width-710/control-5-primary-before2.png", + "sha256": "352d54ac62f9cee113113c994c2e76ccc766d73a7a6b494ecf230c5795ab48db", + "role": "before2" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/washing-machine/width-710/control-5-primary-after0.png", + "sha256": "aabaccc5e495c2ffaf20ba852c7754473dc1d4ca8c883fb6e700032ffc4f901e", + "role": "after0" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/replay-pairs/baseline/codex/washing-machine-710-5.png", + "sha256": "10771b0e6c999deba7c9ca26c9c2ec4f597724ab9bfede4677783996068f6313", + "role": "visually inspected comparison" + } + ], + "allProbeFrames": [ + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/washing-machine/width-710/control-5-primary-before0.png", + "sha256": "352d54ac62f9cee113113c994c2e76ccc766d73a7a6b494ecf230c5795ab48db" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/washing-machine/width-710/control-5-primary-before1.png", + "sha256": "352d54ac62f9cee113113c994c2e76ccc766d73a7a6b494ecf230c5795ab48db" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/washing-machine/width-710/control-5-primary-before2.png", + "sha256": "352d54ac62f9cee113113c994c2e76ccc766d73a7a6b494ecf230c5795ab48db" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/washing-machine/width-710/control-5-primary-after0.png", + "sha256": "aabaccc5e495c2ffaf20ba852c7754473dc1d4ca8c883fb6e700032ffc4f901e" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/washing-machine/width-710/control-5-primary-after1.png", + "sha256": "aabaccc5e495c2ffaf20ba852c7754473dc1d4ca8c883fb6e700032ffc4f901e" + } + ], + "source": { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/control-audit-codex-sources/baseline-washing-machine.html", + "sha256": "0c59e3b559ce686bd52cb6390e0b4de42cb22e35357ea904979726f674312e65" + }, + "identityMatch": true, + "oldIdentity": { + "index": 5, + "label": "Spin", + "tag": "button", + "type": "button" + } + }, + { + "revision": "f009de5838f80b90e861e5727f0ad11cba8814f8", + "pluginRevision": "a632572aa58adc9b6ddf947c9e527587d09f22ca", + "provider": "codex", + "prompt": "websocket", + "width": 710, + "index": 0, + "label": "Chat message delivery steps", + "verdict": "live", + "reason": "The inspected End key changes Connections open to Chat view updated, adds sender/server/recipient content and changes the paragraph to recipient push delivery. The saved keyboard handler explicitly supports End and sets step 3; no autonomous animation is used.", + "mode": "key-End", + "automaticPass": true, + "v3Result": { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/websocket/result.json", + "sha256": "d7c779c3095c1a7de8e0ce132b29541514d8b5b86a376a2c56beabb94773ffbf" + }, + "evidence": [ + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/websocket/width-710/control-0-key-End-before2.png", + "sha256": "d5942e84f5c669fcaa9c2be126d818f68a1acb1a1fe51bb5b3dbd3a8b8b0920e", + "role": "before2" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/websocket/width-710/control-0-key-End-after0.png", + "sha256": "c5da7159c882ef0478437868e29a60fabcd3e01d4383d8bcd94b66251d686b5f", + "role": "after0" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/replay-pairs/baseline/codex/websocket-710-0.png", + "sha256": "f4029844967ea2bb45998128ef86402e8247d503a065a80ed6170d9c959a4eb4", + "role": "visually inspected comparison" + } + ], + "allProbeFrames": [ + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/websocket/width-710/control-0-key-End-before0.png", + "sha256": "d5942e84f5c669fcaa9c2be126d818f68a1acb1a1fe51bb5b3dbd3a8b8b0920e" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/websocket/width-710/control-0-key-End-before1.png", + "sha256": "d5942e84f5c669fcaa9c2be126d818f68a1acb1a1fe51bb5b3dbd3a8b8b0920e" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/websocket/width-710/control-0-key-End-before2.png", + "sha256": "d5942e84f5c669fcaa9c2be126d818f68a1acb1a1fe51bb5b3dbd3a8b8b0920e" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/websocket/width-710/control-0-key-End-after0.png", + "sha256": "c5da7159c882ef0478437868e29a60fabcd3e01d4383d8bcd94b66251d686b5f" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/websocket/width-710/control-0-key-End-after1.png", + "sha256": "c5da7159c882ef0478437868e29a60fabcd3e01d4383d8bcd94b66251d686b5f" + } + ], + "source": { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/control-audit-codex-sources/baseline-websocket.html", + "sha256": "82f5a7152409e95dc69b58a38905a0ed16d212c06d4f7e186d28ad154c85141b" + }, + "identityMatch": true, + "oldIdentity": { + "index": 0, + "label": "Chat message delivery steps", + "tag": "div", + "type": "" + }, + "originalAuditVerdict": "harness error", + "runtimeErrors": [], + "visuallyInspected": true + }, + { + "revision": "f009de5838f80b90e861e5727f0ad11cba8814f8", + "pluginRevision": "a632572aa58adc9b6ddf947c9e527587d09f22ca", + "provider": "codex", + "prompt": "websocket", + "width": 710, + "index": 1, + "label": "Connect", + "verdict": "live", + "reason": "The inspected Connect click changes Message sent to Connections open, removes the message from the mechanism and replaces the external explanation with establishing connections.", + "mode": "primary", + "automaticPass": true, + "v3Result": { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/websocket/result.json", + "sha256": "d7c779c3095c1a7de8e0ce132b29541514d8b5b86a376a2c56beabb94773ffbf" + }, + "evidence": [ + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/websocket/width-710/control-1-primary-before2.png", + "sha256": "87371cf62a5a25f8a94a52a2e1770126ab86ecb3e763139cbcdfabb1d89ec388", + "role": "before2" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/websocket/width-710/control-1-primary-after0.png", + "sha256": "2dc2cad48ee38c0a256612b8798c5f284d30c466c09e8fecc580c18df81be9b4", + "role": "after0" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/replay-pairs/baseline/codex/websocket-710-1.png", + "sha256": "ce873134012a014b1872d9273e460e91a2eadf6ee2b1ad49597cebb51530e0b3", + "role": "visually inspected comparison" + } + ], + "allProbeFrames": [ + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/websocket/width-710/control-1-primary-before0.png", + "sha256": "87371cf62a5a25f8a94a52a2e1770126ab86ecb3e763139cbcdfabb1d89ec388" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/websocket/width-710/control-1-primary-before1.png", + "sha256": "87371cf62a5a25f8a94a52a2e1770126ab86ecb3e763139cbcdfabb1d89ec388" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/websocket/width-710/control-1-primary-before2.png", + "sha256": "87371cf62a5a25f8a94a52a2e1770126ab86ecb3e763139cbcdfabb1d89ec388" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/websocket/width-710/control-1-primary-after0.png", + "sha256": "2dc2cad48ee38c0a256612b8798c5f284d30c466c09e8fecc580c18df81be9b4" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/websocket/width-710/control-1-primary-after1.png", + "sha256": "2dc2cad48ee38c0a256612b8798c5f284d30c466c09e8fecc580c18df81be9b4" + } + ], + "source": { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/control-audit-codex-sources/baseline-websocket.html", + "sha256": "82f5a7152409e95dc69b58a38905a0ed16d212c06d4f7e186d28ad154c85141b" + }, + "identityMatch": true, + "oldIdentity": { + "index": 1, + "label": "Connect", + "tag": "button", + "type": "button" + }, + "originalAuditVerdict": "harness error", + "runtimeErrors": [], + "visuallyInspected": true + }, + { + "revision": "f009de5838f80b90e861e5727f0ad11cba8814f8", + "pluginRevision": "a632572aa58adc9b6ddf947c9e527587d09f22ca", + "provider": "codex", + "prompt": "websocket", + "width": 710, + "index": 2, + "label": "Send", + "verdict": "live", + "reason": "The inspected Send click adds a sender message/envelope and changes the independent readout and explanation from Connections open to Message sent.", + "mode": "primary", + "automaticPass": true, + "v3Result": { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/websocket/result.json", + "sha256": "d7c779c3095c1a7de8e0ce132b29541514d8b5b86a376a2c56beabb94773ffbf" + }, + "evidence": [ + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/websocket/width-710/control-2-primary-before2.png", + "sha256": "2dc2cad48ee38c0a256612b8798c5f284d30c466c09e8fecc580c18df81be9b4", + "role": "before2" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/websocket/width-710/control-2-primary-after0.png", + "sha256": "87371cf62a5a25f8a94a52a2e1770126ab86ecb3e763139cbcdfabb1d89ec388", + "role": "after0" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/replay-pairs/baseline/codex/websocket-710-2.png", + "sha256": "fcda45cd8cc8061080b0a9611a93cc44fe333dd4180a56283d36ddd7976abf7d", + "role": "visually inspected comparison" + } + ], + "allProbeFrames": [ + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/websocket/width-710/control-2-primary-before0.png", + "sha256": "2dc2cad48ee38c0a256612b8798c5f284d30c466c09e8fecc580c18df81be9b4" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/websocket/width-710/control-2-primary-before1.png", + "sha256": "2dc2cad48ee38c0a256612b8798c5f284d30c466c09e8fecc580c18df81be9b4" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/websocket/width-710/control-2-primary-before2.png", + "sha256": "2dc2cad48ee38c0a256612b8798c5f284d30c466c09e8fecc580c18df81be9b4" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/websocket/width-710/control-2-primary-after0.png", + "sha256": "87371cf62a5a25f8a94a52a2e1770126ab86ecb3e763139cbcdfabb1d89ec388" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/websocket/width-710/control-2-primary-after1.png", + "sha256": "87371cf62a5a25f8a94a52a2e1770126ab86ecb3e763139cbcdfabb1d89ec388" + } + ], + "source": { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/control-audit-codex-sources/baseline-websocket.html", + "sha256": "82f5a7152409e95dc69b58a38905a0ed16d212c06d4f7e186d28ad154c85141b" + }, + "identityMatch": true, + "oldIdentity": { + "index": 2, + "label": "Send", + "tag": "button", + "type": "button" + }, + "originalAuditVerdict": "harness error", + "runtimeErrors": [], + "visuallyInspected": true + }, + { + "revision": "f009de5838f80b90e861e5727f0ad11cba8814f8", + "pluginRevision": "a632572aa58adc9b6ddf947c9e527587d09f22ca", + "provider": "codex", + "prompt": "websocket", + "width": 710, + "index": 3, + "label": "Server", + "verdict": "live", + "reason": "The inspected Server click adds message history and server output to the diagram and changes the external readout and paragraph to server validation/storage.", + "mode": "primary", + "automaticPass": true, + "v3Result": { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/websocket/result.json", + "sha256": "d7c779c3095c1a7de8e0ce132b29541514d8b5b86a376a2c56beabb94773ffbf" + }, + "evidence": [ + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/websocket/width-710/control-3-primary-before2.png", + "sha256": "2dc2cad48ee38c0a256612b8798c5f284d30c466c09e8fecc580c18df81be9b4", + "role": "before2" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/websocket/width-710/control-3-primary-after0.png", + "sha256": "a4c6905de583009d2d7613fda6a1919e7735b87275eb585fa63e8e38f8fa8ec3", + "role": "after0" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/replay-pairs/baseline/codex/websocket-710-3.png", + "sha256": "345068c6141a5f4198fe3835a5680095fd6827c34753aa5fbfcaa2633e647896", + "role": "visually inspected comparison" + } + ], + "allProbeFrames": [ + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/websocket/width-710/control-3-primary-before0.png", + "sha256": "2dc2cad48ee38c0a256612b8798c5f284d30c466c09e8fecc580c18df81be9b4" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/websocket/width-710/control-3-primary-before1.png", + "sha256": "2dc2cad48ee38c0a256612b8798c5f284d30c466c09e8fecc580c18df81be9b4" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/websocket/width-710/control-3-primary-before2.png", + "sha256": "2dc2cad48ee38c0a256612b8798c5f284d30c466c09e8fecc580c18df81be9b4" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/websocket/width-710/control-3-primary-after0.png", + "sha256": "a4c6905de583009d2d7613fda6a1919e7735b87275eb585fa63e8e38f8fa8ec3" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/websocket/width-710/control-3-primary-after1.png", + "sha256": "a4c6905de583009d2d7613fda6a1919e7735b87275eb585fa63e8e38f8fa8ec3" + } + ], + "source": { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/control-audit-codex-sources/baseline-websocket.html", + "sha256": "82f5a7152409e95dc69b58a38905a0ed16d212c06d4f7e186d28ad154c85141b" + }, + "identityMatch": true, + "oldIdentity": { + "index": 3, + "label": "Server", + "tag": "button", + "type": "button" + }, + "originalAuditVerdict": "harness error", + "runtimeErrors": [], + "visuallyInspected": true + }, + { + "revision": "f009de5838f80b90e861e5727f0ad11cba8814f8", + "pluginRevision": "a632572aa58adc9b6ddf947c9e527587d09f22ca", + "provider": "codex", + "prompt": "websocket", + "width": 710, + "index": 5, + "label": "Connected", + "verdict": "live", + "reason": "From Disconnected at Receive, the inspected Connected click restores recipient message output, closes the latch and changes the readout/paragraph to successful catch-up. This is visible application behavior, not selection styling.", + "mode": "primary", + "automaticPass": true, + "v3Result": { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/websocket/result.json", + "sha256": "d7c779c3095c1a7de8e0ce132b29541514d8b5b86a376a2c56beabb94773ffbf" + }, + "evidence": [ + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/websocket/width-710/control-5-primary-before2.png", + "sha256": "bffd1f96cf87c819754b29d760a71080f808c49dde9d5347d8bdcac2b5de3367", + "role": "before2" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/websocket/width-710/control-5-primary-after0.png", + "sha256": "cb92cb4a06398c59a395a4d8d059460226e78d2034d1ea6be10f38d073db2c76", + "role": "after0" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/replay-pairs/baseline/codex/websocket-710-5.png", + "sha256": "990891e5601a58d37f0bfa28505e231a5db96a42da18faab7f135d85ad2795db", + "role": "visually inspected comparison" + } + ], + "allProbeFrames": [ + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/websocket/width-710/control-5-primary-before0.png", + "sha256": "bffd1f96cf87c819754b29d760a71080f808c49dde9d5347d8bdcac2b5de3367" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/websocket/width-710/control-5-primary-before1.png", + "sha256": "bffd1f96cf87c819754b29d760a71080f808c49dde9d5347d8bdcac2b5de3367" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/websocket/width-710/control-5-primary-before2.png", + "sha256": "bffd1f96cf87c819754b29d760a71080f808c49dde9d5347d8bdcac2b5de3367" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/websocket/width-710/control-5-primary-after0.png", + "sha256": "cb92cb4a06398c59a395a4d8d059460226e78d2034d1ea6be10f38d073db2c76" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/websocket/width-710/control-5-primary-after1.png", + "sha256": "cb92cb4a06398c59a395a4d8d059460226e78d2034d1ea6be10f38d073db2c76" + } + ], + "source": { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/control-audit-codex-sources/baseline-websocket.html", + "sha256": "82f5a7152409e95dc69b58a38905a0ed16d212c06d4f7e186d28ad154c85141b" + }, + "identityMatch": true, + "oldIdentity": { + "index": 5, + "label": "Connected", + "tag": "button", + "type": "button" + }, + "originalAuditVerdict": "harness error", + "runtimeErrors": [], + "visuallyInspected": true + }, + { + "revision": "f009de5838f80b90e861e5727f0ad11cba8814f8", + "pluginRevision": "a632572aa58adc9b6ddf947c9e527587d09f22ca", + "provider": "codex", + "prompt": "websocket", + "width": 710, + "index": 6, + "label": "Disconnected", + "verdict": "live", + "reason": "The inspected Disconnected click removes the recipient's received-message output, opens the latch and changes the readout/explanation to undelivered push and stored history. The saved subscription updates this state synchronously.", + "mode": "primary", + "automaticPass": true, + "v3Result": { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/websocket/result.json", + "sha256": "d7c779c3095c1a7de8e0ce132b29541514d8b5b86a376a2c56beabb94773ffbf" + }, + "evidence": [ + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/websocket/width-710/control-6-primary-before2.png", + "sha256": "cb92cb4a06398c59a395a4d8d059460226e78d2034d1ea6be10f38d073db2c76", + "role": "before2" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/websocket/width-710/control-6-primary-after0.png", + "sha256": "bffd1f96cf87c819754b29d760a71080f808c49dde9d5347d8bdcac2b5de3367", + "role": "after0" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/replay-pairs/baseline/codex/websocket-710-6.png", + "sha256": "b32a2c4751b2f44a78bc7f3afe9f70ff6247159155cc008b98af3f4851519e30", + "role": "visually inspected comparison" + } + ], + "allProbeFrames": [ + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/websocket/width-710/control-6-primary-before0.png", + "sha256": "cb92cb4a06398c59a395a4d8d059460226e78d2034d1ea6be10f38d073db2c76" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/websocket/width-710/control-6-primary-before1.png", + "sha256": "cb92cb4a06398c59a395a4d8d059460226e78d2034d1ea6be10f38d073db2c76" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/websocket/width-710/control-6-primary-before2.png", + "sha256": "cb92cb4a06398c59a395a4d8d059460226e78d2034d1ea6be10f38d073db2c76" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/websocket/width-710/control-6-primary-after0.png", + "sha256": "bffd1f96cf87c819754b29d760a71080f808c49dde9d5347d8bdcac2b5de3367" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/websocket/width-710/control-6-primary-after1.png", + "sha256": "bffd1f96cf87c819754b29d760a71080f808c49dde9d5347d8bdcac2b5de3367" + } + ], + "source": { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/control-audit-codex-sources/baseline-websocket.html", + "sha256": "82f5a7152409e95dc69b58a38905a0ed16d212c06d4f7e186d28ad154c85141b" + }, + "identityMatch": true, + "oldIdentity": { + "index": 6, + "label": "Disconnected", + "tag": "button", + "type": "button" + }, + "originalAuditVerdict": "harness error", + "runtimeErrors": [], + "visuallyInspected": true + }, + { + "revision": "f009de5838f80b90e861e5727f0ad11cba8814f8", + "pluginRevision": "a632572aa58adc9b6ddf947c9e527587d09f22ca", + "provider": "codex", + "prompt": "zipper", + "width": 710, + "index": 0, + "label": "Zipper position", + "verdict": "dead", + "reason": "The supported ArrowRight route leaves slider position at 50 and the mechanism unchanged in the inspected pair. The exact saved keyboard handler calls object-form params.set, which the frozen baseline silently ignores; the separate native range working does not repair this stage.", + "mode": "key-ArrowRight", + "automaticPass": false, + "v3Result": { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/zipper/result.json", + "sha256": "a7e02b7de93e0d1e5e8f95cf22b95fa5391a1811f9254ee29a5ba5143fa9f725" + }, + "evidence": [ + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/zipper/width-710/control-0-key-ArrowRight-before2.png", + "sha256": "cab6cc9fbf7d6cf323082716a969a4869b3c6ef17088f8282e835044fb298f6d", + "role": "before2" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/zipper/width-710/control-0-key-ArrowRight-after0.png", + "sha256": "cab6cc9fbf7d6cf323082716a969a4869b3c6ef17088f8282e835044fb298f6d", + "role": "after0" + } + ], + "allProbeFrames": [ + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/zipper/width-710/control-0-key-ArrowRight-before0.png", + "sha256": "cab6cc9fbf7d6cf323082716a969a4869b3c6ef17088f8282e835044fb298f6d" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/zipper/width-710/control-0-key-ArrowRight-before1.png", + "sha256": "cab6cc9fbf7d6cf323082716a969a4869b3c6ef17088f8282e835044fb298f6d" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/zipper/width-710/control-0-key-ArrowRight-before2.png", + "sha256": "cab6cc9fbf7d6cf323082716a969a4869b3c6ef17088f8282e835044fb298f6d" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/zipper/width-710/control-0-key-ArrowRight-after0.png", + "sha256": "cab6cc9fbf7d6cf323082716a969a4869b3c6ef17088f8282e835044fb298f6d" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/zipper/width-710/control-0-key-ArrowRight-after1.png", + "sha256": "cab6cc9fbf7d6cf323082716a969a4869b3c6ef17088f8282e835044fb298f6d" + } + ], + "source": { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/control-audit-codex-sources/baseline-zipper.html", + "sha256": "ad50185c5c51c60e07087738cf1f6cfada959c07c9aa4574532f583d240eb744" + }, + "identityMatch": true, + "oldIdentity": { + "index": 0, + "label": "Zipper position", + "tag": "div", + "type": "slider" + }, + "originalAuditVerdict": "dead", + "runtimeErrors": [], + "visuallyInspected": true + } + ], + "cardChecks": [ + { + "prompt": "washing-machine", + "v3Result": { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/washing-machine/result.json", + "sha256": "ec59840357e983941f82d58f3c47282a5b3461e1065695f13940e1f37ca20cd2" + }, + "cardVisible": true, + "automaticCardPass": true, + "originalConfirmedDeadControls": [], + "newlyLiveControls": [ + { + "width": 710, + "index": 0 + }, + { + "width": 710, + "index": 1 + }, + { + "width": 710, + "index": 2 + }, + { + "width": 710, + "index": 3 + }, + { + "width": 710, + "index": 5 + } + ], + "reviewedControlVerdicts": [ + { + "width": 710, + "index": 0, + "verdict": "live", + "identityMatch": true + }, + { + "width": 710, + "index": 1, + "verdict": "live", + "identityMatch": true + }, + { + "width": 710, + "index": 2, + "verdict": "live", + "identityMatch": true + }, + { + "width": 710, + "index": 3, + "verdict": "live", + "identityMatch": true + }, + { + "width": 710, + "index": 5, + "verdict": "live", + "identityMatch": true + } + ], + "runtimeErrors": [], + "blockAutomaticCardPass": false, + "note": "Newly-live automatic controls and every original confirmed-dead control reviewed; prior passing controls outside that scope retain their previous evidence. No source-only live verdicts." + }, + { + "prompt": "bicycle-pump", + "v3Result": { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/bicycle-pump/result.json", + "sha256": "2e2890d74859f813efdbeec093a86b0ec5d98cabdb2d8cfbe6090272f54256d4" + }, + "cardVisible": true, + "automaticCardPass": true, + "originalConfirmedDeadControls": [], + "newlyLiveControls": [], + "reviewedControlVerdicts": [], + "runtimeErrors": [], + "blockAutomaticCardPass": false, + "note": "Newly-live automatic controls and every original confirmed-dead control reviewed; prior passing controls outside that scope retain their previous evidence. No source-only live verdicts." + }, + { + "prompt": "zipper", + "v3Result": { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/zipper/result.json", + "sha256": "a7e02b7de93e0d1e5e8f95cf22b95fa5391a1811f9254ee29a5ba5143fa9f725" + }, + "cardVisible": true, + "automaticCardPass": false, + "originalConfirmedDeadControls": [ + 0 + ], + "newlyLiveControls": [], + "reviewedControlVerdicts": [ + { + "width": 710, + "index": 0, + "verdict": "dead", + "identityMatch": true + } + ], + "runtimeErrors": [], + "blockAutomaticCardPass": false, + "note": "Newly-live automatic controls and every original confirmed-dead control reviewed; prior passing controls outside that scope retain their previous evidence. No source-only live verdicts." + }, + { + "prompt": "door-lock", + "v3Result": { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/door-lock/result.json", + "sha256": "dd68e571ddec4af2e34b5f72be0dba02c3059ae6ef7c56a7567123ea9a0bb4a1" + }, + "cardVisible": true, + "automaticCardPass": false, + "originalConfirmedDeadControls": [], + "newlyLiveControls": [ + { + "width": 710, + "index": 0 + }, + { + "width": 710, + "index": 2 + } + ], + "reviewedControlVerdicts": [ + { + "width": 710, + "index": 0, + "verdict": "live", + "identityMatch": true + }, + { + "width": 710, + "index": 2, + "verdict": "live", + "identityMatch": true + } + ], + "runtimeErrors": [ + "exception: Error: Parameter names are letters, digits, - and _: [object Object]" + ], + "blockAutomaticCardPass": false, + "note": "Newly-live automatic controls and every original confirmed-dead control reviewed; prior passing controls outside that scope retain their previous evidence. No source-only live verdicts." + }, + { + "prompt": "thermos", + "v3Result": { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/thermos/result.json", + "sha256": "23a7b05c4861fa24f25bf7e794abb5f121c6dbb69ade41a4f90aba3018418eec" + }, + "cardVisible": false, + "automaticCardPass": false, + "originalConfirmedDeadControls": [], + "newlyLiveControls": [], + "reviewedControlVerdicts": [], + "runtimeErrors": [], + "blockAutomaticCardPass": false, + "note": "Newly-live automatic controls and every original confirmed-dead control reviewed; prior passing controls outside that scope retain their previous evidence. No source-only live verdicts." + }, + { + "prompt": "toilet", + "v3Result": { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/toilet/result.json", + "sha256": "c0639791d117e9a5b9c489afc1c6c9448f93d6b2408630564da620ed456fc8e6" + }, + "cardVisible": true, + "automaticCardPass": true, + "originalConfirmedDeadControls": [], + "newlyLiveControls": [ + { + "width": 710, + "index": 0 + } + ], + "reviewedControlVerdicts": [ + { + "width": 710, + "index": 0, + "verdict": "live", + "identityMatch": true + } + ], + "runtimeErrors": [], + "blockAutomaticCardPass": false, + "note": "Newly-live automatic controls and every original confirmed-dead control reviewed; prior passing controls outside that scope retain their previous evidence. No source-only live verdicts." + }, + { + "prompt": "refrigerator", + "v3Result": { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/refrigerator/result.json", + "sha256": "56c4ae83a7d210d4030bc6680820b3e9ad655402e89976df0998a643f92edb13" + }, + "cardVisible": true, + "automaticCardPass": false, + "originalConfirmedDeadControls": [ + 0, + 1, + 2, + 3, + 4 + ], + "newlyLiveControls": [], + "reviewedControlVerdicts": [ + { + "width": 710, + "index": 0, + "verdict": "dead", + "identityMatch": true + }, + { + "width": 710, + "index": 1, + "verdict": "dead", + "identityMatch": true + }, + { + "width": 710, + "index": 2, + "verdict": "dead", + "identityMatch": true + }, + { + "width": 710, + "index": 3, + "verdict": "dead", + "identityMatch": true + }, + { + "width": 710, + "index": 4, + "verdict": "dead", + "identityMatch": true + } + ], + "runtimeErrors": [ + "exception: Error: Parameter names are letters, digits, - and _: [object Object]" + ], + "blockAutomaticCardPass": false, + "note": "Newly-live automatic controls and every original confirmed-dead control reviewed; prior passing controls outside that scope retain their previous evidence. No source-only live verdicts." + }, + { + "prompt": "stapler", + "v3Result": { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/stapler/result.json", + "sha256": "38fba8bbf0d9d5d185f4ba38ec7c34341a997efbaed9ad6dbe9add352a26d5fd" + }, + "cardVisible": true, + "automaticCardPass": true, + "originalConfirmedDeadControls": [], + "newlyLiveControls": [ + { + "width": 710, + "index": 0 + }, + { + "width": 710, + "index": 2 + } + ], + "reviewedControlVerdicts": [ + { + "width": 710, + "index": 0, + "verdict": "live", + "identityMatch": true + }, + { + "width": 710, + "index": 2, + "verdict": "live", + "identityMatch": true + } + ], + "runtimeErrors": [], + "blockAutomaticCardPass": false, + "note": "Newly-live automatic controls and every original confirmed-dead control reviewed; prior passing controls outside that scope retain their previous evidence. No source-only live verdicts." + }, + { + "prompt": "spray-bottle", + "v3Result": { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/spray-bottle/result.json", + "sha256": "5f3f2d0801a433b856a1fb33177b05defe162c1b7e09780493c327de77550f07" + }, + "cardVisible": true, + "automaticCardPass": false, + "originalConfirmedDeadControls": [], + "newlyLiveControls": [ + { + "width": 710, + "index": 0 + } + ], + "reviewedControlVerdicts": [ + { + "width": 710, + "index": 0, + "verdict": "live", + "identityMatch": true + } + ], + "runtimeErrors": [ + "exception: Error: Parameter names are letters, digits, - and _: [object Object]" + ], + "blockAutomaticCardPass": false, + "note": "Newly-live automatic controls and every original confirmed-dead control reviewed; prior passing controls outside that scope retain their previous evidence. No source-only live verdicts." + }, + { + "prompt": "seat-belt", + "v3Result": { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/seat-belt/result.json", + "sha256": "8433ef2cd777da67e843809339aa49dcffb115cd4e76f06a0e079963b08732c9" + }, + "cardVisible": true, + "automaticCardPass": false, + "originalConfirmedDeadControls": [ + 0, + 1, + 2 + ], + "newlyLiveControls": [], + "reviewedControlVerdicts": [ + { + "width": 710, + "index": 0, + "verdict": "dead", + "identityMatch": true + }, + { + "width": 710, + "index": 1, + "verdict": "dead", + "identityMatch": true + }, + { + "width": 710, + "index": 2, + "verdict": "dead", + "identityMatch": true + } + ], + "runtimeErrors": [ + "exception: Error: Parameter names are letters, digits, - and _: [object Object]" + ], + "blockAutomaticCardPass": false, + "note": "Newly-live automatic controls and every original confirmed-dead control reviewed; prior passing controls outside that scope retain their previous evidence. No source-only live verdicts." + }, + { + "prompt": "toaster", + "v3Result": { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/toaster/result.json", + "sha256": "301271d272c500928fcdff37b5a52857a24306bc5be3aa41c06b1877de44c37d" + }, + "cardVisible": false, + "automaticCardPass": false, + "originalConfirmedDeadControls": [], + "newlyLiveControls": [], + "reviewedControlVerdicts": [], + "runtimeErrors": [], + "blockAutomaticCardPass": false, + "note": "Newly-live automatic controls and every original confirmed-dead control reviewed; prior passing controls outside that scope retain their previous evidence. No source-only live verdicts." + }, + { + "prompt": "umbrella", + "v3Result": { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/umbrella/result.json", + "sha256": "f5aaf770a526f7638f534ee4fe0e212eddb39e38bcb79d5c39c3e2a662f52371" + }, + "cardVisible": true, + "automaticCardPass": false, + "originalConfirmedDeadControls": [], + "newlyLiveControls": [ + { + "width": 710, + "index": 0 + }, + { + "width": 710, + "index": 1 + } + ], + "reviewedControlVerdicts": [ + { + "width": 710, + "index": 0, + "verdict": "live", + "identityMatch": true + }, + { + "width": 710, + "index": 1, + "verdict": "live", + "identityMatch": true + } + ], + "runtimeErrors": [ + "exception: Error: Parameter names are letters, digits, - and _: [object Object]" + ], + "blockAutomaticCardPass": false, + "note": "Newly-live automatic controls and every original confirmed-dead control reviewed; prior passing controls outside that scope retain their previous evidence. No source-only live verdicts." + }, + { + "prompt": "cdn", + "v3Result": { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/cdn/result.json", + "sha256": "54c70dd4aac8a0f71a69f3a1f00e5928b37786cbe1760b09c93734407a9686a5" + }, + "cardVisible": true, + "automaticCardPass": false, + "originalConfirmedDeadControls": [ + 1 + ], + "newlyLiveControls": [ + { + "width": 710, + "index": 0 + }, + { + "width": 710, + "index": 3 + } + ], + "reviewedControlVerdicts": [ + { + "width": 710, + "index": 0, + "verdict": "unproven", + "identityMatch": true + }, + { + "width": 710, + "index": 1, + "verdict": "dead", + "identityMatch": true + }, + { + "width": 710, + "index": 3, + "verdict": "live", + "identityMatch": true + } + ], + "runtimeErrors": [], + "blockAutomaticCardPass": false, + "note": "Newly-live automatic controls and every original confirmed-dead control reviewed; prior passing controls outside that scope retain their previous evidence. No source-only live verdicts." + }, + { + "prompt": "notification-settings", + "v3Result": { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/notification-settings/result.json", + "sha256": "c9e1df7a66812f0637c3c549af67dca46182859f97beec8504e1cb4efcc967d5" + }, + "cardVisible": true, + "automaticCardPass": false, + "originalConfirmedDeadControls": [ + 4 + ], + "newlyLiveControls": [ + { + "width": 558, + "index": 2 + }, + { + "width": 558, + "index": 3 + } + ], + "reviewedControlVerdicts": [ + { + "width": 558, + "index": 2, + "verdict": "live", + "identityMatch": true + }, + { + "width": 558, + "index": 3, + "verdict": "live", + "identityMatch": true + }, + { + "width": 558, + "index": 4, + "verdict": "dead", + "identityMatch": true + } + ], + "runtimeErrors": [], + "blockAutomaticCardPass": false, + "note": "Newly-live automatic controls and every original confirmed-dead control reviewed; prior passing controls outside that scope retain their previous evidence. No source-only live verdicts." + }, + { + "prompt": "dns", + "v3Result": { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/dns/result.json", + "sha256": "e46768e0376b893a5491a38bc6f44f9325251dc0a3e0fbee42a9c0f5e735ec67" + }, + "cardVisible": true, + "automaticCardPass": false, + "originalConfirmedDeadControls": [], + "newlyLiveControls": [ + { + "width": 710, + "index": 0 + }, + { + "width": 710, + "index": 2 + } + ], + "reviewedControlVerdicts": [ + { + "width": 710, + "index": 0, + "verdict": "live", + "identityMatch": true + }, + { + "width": 710, + "index": 2, + "verdict": "live", + "identityMatch": true + } + ], + "runtimeErrors": [ + "exception: Error: Parameter names are letters, digits, - and _: [object Object]" + ], + "blockAutomaticCardPass": false, + "note": "Newly-live automatic controls and every original confirmed-dead control reviewed; prior passing controls outside that scope retain their previous evidence. No source-only live verdicts." + }, + { + "prompt": "narrow-toggle", + "v3Result": { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/narrow-toggle/result.json", + "sha256": "053b10f4f2f1afc6dd634c3e16760864f34331db34ced660b505fedb4311eb3d" + }, + "cardVisible": true, + "automaticCardPass": true, + "originalConfirmedDeadControls": [], + "newlyLiveControls": [], + "reviewedControlVerdicts": [], + "runtimeErrors": [], + "blockAutomaticCardPass": false, + "note": "Newly-live automatic controls and every original confirmed-dead control reviewed; prior passing controls outside that scope retain their previous evidence. No source-only live verdicts." + }, + { + "prompt": "database-index", + "v3Result": { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/database-index/result.json", + "sha256": "8e69cb83806db4ef0f2a74f0978bca80b60b7f99e2786a2ddf23637897c3cbdf" + }, + "cardVisible": true, + "automaticCardPass": false, + "originalConfirmedDeadControls": [ + 0, + 1, + 2 + ], + "newlyLiveControls": [], + "reviewedControlVerdicts": [ + { + "width": 710, + "index": 0, + "verdict": "dead", + "identityMatch": true + }, + { + "width": 710, + "index": 1, + "verdict": "dead", + "identityMatch": true + }, + { + "width": 710, + "index": 2, + "verdict": "dead", + "identityMatch": true + } + ], + "runtimeErrors": [ + "exception: Error: Parameter names are letters, digits, - and _: [object Object]" + ], + "blockAutomaticCardPass": false, + "note": "Newly-live automatic controls and every original confirmed-dead control reviewed; prior passing controls outside that scope retain their previous evidence. No source-only live verdicts." + }, + { + "prompt": "git-merge", + "v3Result": { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/git-merge/result.json", + "sha256": "2356bce996be14eabc9cb4bb2d6768f829c1837596c41e9be98d49a316c64bbc" + }, + "cardVisible": true, + "automaticCardPass": false, + "originalConfirmedDeadControls": [ + 0 + ], + "newlyLiveControls": [ + { + "width": 710, + "index": 1 + }, + { + "width": 710, + "index": 2 + }, + { + "width": 710, + "index": 3 + } + ], + "reviewedControlVerdicts": [ + { + "width": 710, + "index": 0, + "verdict": "dead", + "identityMatch": true + }, + { + "width": 710, + "index": 1, + "verdict": "live", + "identityMatch": true + }, + { + "width": 710, + "index": 2, + "verdict": "live", + "identityMatch": true + }, + { + "width": 710, + "index": 3, + "verdict": "live", + "identityMatch": true + } + ], + "runtimeErrors": [], + "blockAutomaticCardPass": false, + "note": "Newly-live automatic controls and every original confirmed-dead control reviewed; prior passing controls outside that scope retain their previous evidence. No source-only live verdicts." + }, + { + "prompt": "websocket", + "v3Result": { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/websocket/result.json", + "sha256": "d7c779c3095c1a7de8e0ce132b29541514d8b5b86a376a2c56beabb94773ffbf" + }, + "cardVisible": true, + "automaticCardPass": true, + "originalConfirmedDeadControls": [], + "newlyLiveControls": [ + { + "width": 710, + "index": 0 + }, + { + "width": 710, + "index": 1 + }, + { + "width": 710, + "index": 2 + }, + { + "width": 710, + "index": 3 + }, + { + "width": 710, + "index": 5 + }, + { + "width": 710, + "index": 6 + } + ], + "reviewedControlVerdicts": [ + { + "width": 710, + "index": 0, + "verdict": "live", + "identityMatch": true + }, + { + "width": 710, + "index": 1, + "verdict": "live", + "identityMatch": true + }, + { + "width": 710, + "index": 2, + "verdict": "live", + "identityMatch": true + }, + { + "width": 710, + "index": 3, + "verdict": "live", + "identityMatch": true + }, + { + "width": 710, + "index": 5, + "verdict": "live", + "identityMatch": true + }, + { + "width": 710, + "index": 6, + "verdict": "live", + "identityMatch": true + } + ], + "runtimeErrors": [], + "blockAutomaticCardPass": false, + "note": "Newly-live automatic controls and every original confirmed-dead control reviewed; prior passing controls outside that scope retain their previous evidence. No source-only live verdicts." + }, + { + "prompt": "load-balancer", + "v3Result": { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/load-balancer/result.json", + "sha256": "35a0fa18f0455115d7ef7b193c71c0cda48d5058947a030ecbc689fc6194eb9b" + }, + "cardVisible": true, + "automaticCardPass": false, + "originalConfirmedDeadControls": [ + 0 + ], + "newlyLiveControls": [], + "reviewedControlVerdicts": [ + { + "width": 710, + "index": 0, + "verdict": "dead", + "identityMatch": true + } + ], + "runtimeErrors": [], + "blockAutomaticCardPass": false, + "note": "Newly-live automatic controls and every original confirmed-dead control reviewed; prior passing controls outside that scope retain their previous evidence. No source-only live verdicts." + } + ], + "method": "Independent visual inspection of saved v3 before/after PNGs, source handler review and original confirmed-dead audit cross-check. No browser/server/provider run. Raw evidence and central adjudication files unchanged.", + "updatedAt": "2026-10-20T06:09:15.413397+00:00" +} diff --git a/plugins/playgrounds/evals/launch/reports/gate-1/replay-visual-review-codex-baseline.md b/plugins/playgrounds/evals/launch/reports/gate-1/replay-visual-review-codex-baseline.md new file mode 100644 index 000000000..3ef3a771e --- /dev/null +++ b/plugins/playgrounds/evals/launch/reports/gate-1/replay-visual-review-codex-baseline.md @@ -0,0 +1,76 @@ +# Independent Codex baseline v3 visual review + +Status: complete; 20/20 prompts reviewed. {'live': 27, 'unproven': 1, 'dead': 16}. +Plugin revision `a632572aa58adc9b6ddf947c9e527587d09f22ca`; scorer revision `f009de5838f80b90e861e5727f0ad11cba8814f8`. + +Independent visual inspection of saved v3 before/after PNGs, source handler review and original confirmed-dead audit cross-check. No browser/server/provider run. Raw evidence and central adjudication files unchanged. + +Every automatic newly-live control receives actual before/after image inspection; every original confirmed-dead control is included even when v3 already rejects the card. A route is live only when visible output and supported input agree; incidental autonomous settling is not proof. The JSON preserves exact v3 result hashes, image hashes, source hashes and old/new identity checks. Prior passing controls outside this scope are not newly adjudicated. + +[Full machine-readable decisions](/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/replay-visual-review-codex-baseline.json) + +| Prompt / width / index / label | Verdict | Reason | Evidence | +|---|---|---|---| +| cdn / 710 / 0 / Seconds since purge; use left and right arrow keys | **unproven** | Partially functional, not a clean control pass: the default passing End pair visibly advances only 0 to 1 second although its supported End handler requests 90. An additionally inspected supported ArrowRight pair does advance 1 to 2 seconds and changes cache rows to v2. The omitted numeric bounds clamp stored time to 0..1 while local redraw can temporarily advance farther; one working arrow step does not establish the full exposed time control. The separate dead native slider also blocks a card pass. | [before2](/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/cdn/width-710/control-0-key-End-before2.png) · [after0](/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/cdn/width-710/control-0-key-End-after0.png) · [visually inspected comparison](/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/replay-pairs/baseline/codex/cdn-710-0.png) | +| cdn / 710 / 1 / time | **dead** | The inspected low/high drag pair moves the native thumb across its track while both external time readouts stay at 1 second and cache rows/mechanism remain unchanged. Saved parameter definitions omit min/max, so native time changes clamp to 0..1. The keyboard stage's local redraw cannot repair this separate control. | [before2](/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/cdn/width-710/control-1-drag-before2.png) · [after0](/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/cdn/width-710/control-1-drag-after0.png) | +| cdn / 710 / 3 / local | **live** | The inspected checkbox click changes the explanatory paragraph to the browser serving its fresh v1 copy and changes all three User receives cells to v1 (browser). The saved input handler updates the local boolean and redraws through the parameter subscription; this is meaningful output, not checkbox styling. | [before2](/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/cdn/width-710/control-3-primary-before2.png) · [after0](/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/cdn/width-710/control-3-primary-after0.png) · [visually inspected comparison](/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/replay-pairs/baseline/codex/cdn-710-3.png) | +| database-index / 710 / 0 / Lookup comparison; arrow keys step through | **dead** | The inspected ArrowRight pair leaves the lookup diagram and blank explanation unchanged. Source object-form params.define throws before render subscription and keyboard registration; v3 records the same initialization exception. Native control chrome is not working lookup output. | [before2](/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/database-index/width-710/control-0-key-ArrowRight-before2.png) · [after0](/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/database-index/width-710/control-0-key-ArrowRight-after0.png) | +| database-index / 710 / 1 / Find key | **dead** | The inspected low/high drag pair moves the native thumb and its own numeric value, but leaves the lookup diagram and blank explanation unchanged. Source object-form params.define throws before render subscription and keyboard registration; v3 records the same initialization exception. Native control chrome is not working lookup output. | [before2](/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/database-index/width-710/control-1-drag-before2.png) · [after0](/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/database-index/width-710/control-1-drag-after0.png) | +| database-index / 710 / 2 / Lookup step | **dead** | The inspected low/high drag pair moves the native thumb and its own numeric value, but leaves the lookup diagram and blank explanation unchanged. Source object-form params.define throws before render subscription and keyboard registration; v3 records the same initialization exception. Native control chrome is not working lookup output. | [before2](/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/database-index/width-710/control-2-drag-before2.png) · [after0](/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/database-index/width-710/control-2-drag-after0.png) | +| dns / 710 / 0 / DNS lookup step | **live** | The inspected Home pair changes the initial incomplete stage into the device-cache step, with an explanatory paragraph and matching readout. The saved keyboard handler explicitly handles Home and calls draw; its drawer animation is output of that input. The recorded initialization exception still rejects the card. | [before2](/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/dns/width-710/control-0-key-Home-before2.png) · [after0](/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/dns/width-710/control-0-key-Home-after0.png) · [visually inspected comparison](/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/replay-pairs/baseline/codex/dns-710-0.png) | +| dns / 710 / 2 / Back | **live** | The inspected Back click changes Your browser connects to Use the resolver's cached answer, updates the paragraph and query/drawer positions, and re-enables Next. The source go(-1) handler changes the step synchronously; this is a valid enabled-state Back transition. Initialization still throws, so this does not pass the card. | [before2](/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/dns/width-710/control-2-primary-before2.png) · [after0](/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/dns/width-710/control-2-primary-after0.png) · [visually inspected comparison](/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/replay-pairs/baseline/codex/dns-710-2.png) | +| door-lock / 710 / 0 / Lock cutaway. Arrow keys choose a key; Enter attempts to turn it. | **live** | The inspected ArrowRight pair changes the lock from its incomplete initial drawing to No key: springs and pins become visible, with blocked readout and matching explanation. The saved source explicitly handles ArrowRight by changing key and calling draw; no autonomous transition is involved. This proves this input route only: the captured initialization runtime error still rejects the whole card. | [before2](/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/door-lock/width-710/control-0-key-ArrowRight-before2.png) · [after0](/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/door-lock/width-710/control-0-key-ArrowRight-after0.png) · [visually inspected comparison](/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/replay-pairs/baseline/codex/door-lock-710-0.png) | +| door-lock / 710 / 2 / Wrong key | **live** | The inspected click pair visibly inserts the wrong key, changes pin heights and changes the explanation to a pin bridging the shell and plug. The saved onclick calls set/draw synchronously. The existing initialization runtime error remains a whole-card failure. | [before2](/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/door-lock/width-710/control-2-primary-before2.png) · [after0](/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/door-lock/width-710/control-2-primary-after0.png) · [visually inspected comparison](/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/replay-pairs/baseline/codex/door-lock-710-2.png) | +| git-merge / 710 / 0 / Document comparison machine. Use left and right arrow keys to switch scenarios. | **dead** | The inspected ArrowRight pair leaves the clean scenario, diagram text, branch history and explanation unchanged. The saved handler calls unsupported object-form params.set, confirming the original silent no-op. Working scenario buttons do not repair the exposed keyboard surface. | [before2](/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/git-merge/width-710/control-0-key-ArrowRight-before2.png) · [after0](/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/git-merge/width-710/control-0-key-ArrowRight-after0.png) | +| git-merge / 710 / 1 / Clean merge | **live** | The inspected Clean merge click replaces the conflict explanation and paused history with the clean merge explanation and a new merge commit M. Changed text and history are independent of selected-button styling. | [before2](/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/git-merge/width-710/control-1-primary-before2.png) · [after0](/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/git-merge/width-710/control-1-primary-after0.png) · [visually inspected comparison](/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/replay-pairs/baseline/codex/git-merge-710-1.png) | +| git-merge / 710 / 2 / Conflict | **live** | The inspected Conflict click changes the diagram's compared/result text and replaces the external paragraph/history with conflicting title edits and a paused merge, matching the scenario subscription. | [before2](/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/git-merge/width-710/control-2-primary-before2.png) · [after0](/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/git-merge/width-710/control-2-primary-after0.png) · [visually inspected comparison](/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/replay-pairs/baseline/codex/git-merge-710-2.png) | +| git-merge / 710 / 3 / Fast-forward | **live** | The inspected Fast-forward click changes the external explanation and branch history to moving main to C without a merge commit. The visible scenario output proves this button, while the keyboard control remains dead. | [before2](/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/git-merge/width-710/control-3-primary-before2.png) · [after0](/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/git-merge/width-710/control-3-primary-after0.png) · [visually inspected comparison](/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/replay-pairs/baseline/codex/git-merge-710-3.png) | +| load-balancer / 710 / 0 / Load balancer: right arrow sends a request; left arrow steps back | **dead** | The inspected ArrowRight pair leaves request count 6, per-server active/assigned totals, carriage and latest-server readout unchanged. The saved keyboard handler calls unsupported object-form params.set, retaining the original silent no-op. Working dropdowns and increment buttons do not repair the separate exposed keyboard surface. | [before2](/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/load-balancer/width-710/control-0-key-ArrowRight-before2.png) · [after0](/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/load-balancer/width-710/control-0-key-ArrowRight-after0.png) | +| notification-settings / 558 / 2 / Daily digest | **live** | The inspected Daily digest click reveals the delivery-time selector and adds Daily digest at 8 AM UTC to the independent notification preview. This is meaningful output despite the card resizing. | [before2](/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/notification-settings/width-558/control-2-click-before2.png) · [after0](/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/notification-settings/width-558/control-2-click-after0.png) · [visually inspected comparison](/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/replay-pairs/baseline/codex/notification-settings-558-2.png) | +| notification-settings / 558 / 3 / Delivery time · UTC | **live** | With digest enabled in both frames, the inspected native select interaction changes Morning (8 AM) to Midday (12 PM) and independently changes the notification preview from 8 AM to 12 PM UTC. This resolves the earlier hidden-selector lack of evidence. | [before2](/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/notification-settings/width-558/control-3-primary-before2.png) · [after0](/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/notification-settings/width-558/control-3-primary-after0.png) · [visually inspected comparison](/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/replay-pairs/baseline/codex/notification-settings-558-3.png) | +| notification-settings / 558 / 4 / Reset defaults | **dead** | The inspected Reset defaults click starts from a genuinely nondefault state (email off, digest at 12 PM) and leaves all controls and the independent preview unchanged. Saved onclick uses unsupported object-form P.set, confirming the original silent no-op; a working digest or selector cannot make this card pass. | [before2](/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/notification-settings/width-558/control-4-primary-before2.png) · [after0](/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/notification-settings/width-558/control-4-primary-after0.png) | +| refrigerator / 710 / 0 / Refrigeration cycle. Use left and right arrow keys to change stage. | **dead** | The inspected supported-input before/after frames keep the same uninitialized refrigerator, blank stage explanation and unchanged output. The retained source object-form params.define throws before registering the render subscription; v3 records that initialization exception. Thus the original dead-control finding remains, not a merely small visual delta. | [before2](/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/refrigerator/width-710/control-0-key-ArrowRight-before2.png) · [after0](/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/refrigerator/width-710/control-0-key-ArrowRight-after0.png) | +| refrigerator / 710 / 1 / 1. Absorb | **dead** | The inspected supported-input before/after frames keep the same uninitialized refrigerator, blank stage explanation and unchanged output. The retained source object-form params.define throws before registering the render subscription; v3 records that initialization exception. Thus the original dead-control finding remains, not a merely small visual delta. | [before2](/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/refrigerator/width-710/control-1-primary-before2.png) · [after0](/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/refrigerator/width-710/control-1-primary-after0.png) | +| refrigerator / 710 / 2 / 2. Compress | **dead** | The inspected supported-input before/after frames keep the same uninitialized refrigerator, blank stage explanation and unchanged output. The retained source object-form params.define throws before registering the render subscription; v3 records that initialization exception. Thus the original dead-control finding remains, not a merely small visual delta. | [before2](/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/refrigerator/width-710/control-2-primary-before2.png) · [after0](/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/refrigerator/width-710/control-2-primary-after0.png) | +| refrigerator / 710 / 3 / 3. Release | **dead** | The inspected supported-input before/after frames keep the same uninitialized refrigerator, blank stage explanation and unchanged output. The retained source object-form params.define throws before registering the render subscription; v3 records that initialization exception. Thus the original dead-control finding remains, not a merely small visual delta. | [before2](/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/refrigerator/width-710/control-3-primary-before2.png) · [after0](/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/refrigerator/width-710/control-3-primary-after0.png) | +| refrigerator / 710 / 4 / 4. Expand | **dead** | The inspected supported-input before/after frames keep the same uninitialized refrigerator, blank stage explanation and unchanged output. The retained source object-form params.define throws before registering the render subscription; v3 records that initialization exception. Thus the original dead-control finding remains, not a merely small visual delta. | [before2](/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/refrigerator/width-710/control-4-primary-before2.png) · [after0](/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/refrigerator/width-710/control-4-primary-after0.png) | +| seat-belt / 710 / 0 / Braking condition; use arrow keys | **dead** | The inspected supported-input pair retains the same reel/latch and Free to unwind output with no mode explanation. Source initialization throws on object-form params.define before render subscription and animation registration; v3 captures the same exception. The original dead-control finding remains. | [before2](/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/seat-belt/width-710/control-0-key-ArrowRight-before2.png) · [after0](/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/seat-belt/width-710/control-0-key-ArrowRight-after0.png) | +| seat-belt / 710 / 1 / Normal movement | **dead** | The inspected supported-input pair retains the same reel/latch and Free to unwind output with no mode explanation. Source initialization throws on object-form params.define before render subscription and animation registration; v3 captures the same exception. The original dead-control finding remains. | [before2](/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/seat-belt/width-710/control-1-primary-before2.png) · [after0](/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/seat-belt/width-710/control-1-primary-after0.png) | +| seat-belt / 710 / 2 / Sudden braking | **dead** | The inspected supported-input pair retains the same reel/latch and Free to unwind output with no mode explanation. Source initialization throws on object-form params.define before render subscription and animation registration; v3 captures the same exception. The original dead-control finding remains. | [before2](/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/seat-belt/width-710/control-2-primary-before2.png) · [after0](/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/seat-belt/width-710/control-2-primary-after0.png) | +| spray-bottle / 710 / 0 / Pump stroke | **live** | The inspected ArrowRight pair changes Release to Squeeze: mist appears, piston/spring geometry changes and the explanation and external readout update. The saved global keyboard handler explicitly supports ArrowRight and switches the phase before animation, so this is an input-caused transition. The captured initialization runtime error still rejects the card. | [before2](/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/spray-bottle/width-710/control-0-key-ArrowRight-before2.png) · [after0](/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/spray-bottle/width-710/control-0-key-ArrowRight-after0.png) · [visually inspected comparison](/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/replay-pairs/baseline/codex/spray-bottle-710-0.png) | +| stapler / 710 / 0 / Stapler cycle | **live** | The inspected End pair changes Ready to Release and replaces the explanatory paragraph with the return-spring/feed-spring stage. The saved source explicitly handles End and sets cycle 100; there is no autonomous cycle timer. | [before2](/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/stapler/width-710/control-0-key-End-before2.png) · [after0](/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/stapler/width-710/control-0-key-End-after0.png) · [visually inspected comparison](/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/replay-pairs/baseline/codex/stapler-710-0.png) | +| stapler / 710 / 2 / Next stage → | **live** | The inspected Next-stage click resets Release to Ready, changes the mechanism geometry and explanatory paragraph, matching the saved synchronous next-stage handler. | [before2](/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/stapler/width-710/control-2-primary-before2.png) · [after0](/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/stapler/width-710/control-2-primary-after0.png) · [visually inspected comparison](/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/replay-pairs/baseline/codex/stapler-710-2.png) | +| toilet / 710 / 0 / Flush cycle; use left and right arrow keys | **live** | The inspected End pair changes Ready to Shut off and the external readout and paragraph to Float raised / refill shuts off. The saved source explicitly handles End, stops the timer first and selects phase 4, so this is a supported input route rather than autonomous cycle settling. | [before2](/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/toilet/width-710/control-0-key-End-before2.png) · [after0](/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/toilet/width-710/control-0-key-End-after0.png) · [visually inspected comparison](/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/replay-pairs/baseline/codex/toilet-710-0.png) | +| umbrella / 710 / 0 / Cutaway umbrella showing a sliding runner, hinged stretchers, ribs and fabric | **live** | The inspected Home pair draws a closed umbrella and closed-state explanation from the initially blank stage. The saved handler explicitly supports Home and changes the target opening before rendering. This proves the input route, while the initialization exception still rejects the whole card. | [before2](/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/umbrella/width-710/control-0-key-Home-before2.png) · [after0](/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/umbrella/width-710/control-0-key-Home-after0.png) · [visually inspected comparison](/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/replay-pairs/baseline/codex/umbrella-710-0.png) | +| umbrella / 710 / 1 / Open | **live** | The inspected Open click unfolds the canopy and ribs, raises the runner and changes the explanatory text to the open state. Its saved handler sets opening 100; the visible change is not merely control styling. The card initialization runtime error remains disqualifying. | [before2](/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/umbrella/width-710/control-1-primary-before2.png) · [after0](/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/umbrella/width-710/control-1-primary-after0.png) · [visually inspected comparison](/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/replay-pairs/baseline/codex/umbrella-710-1.png) | +| washing-machine / 710 / 0 / control 0 | **live** | Supported ArrowRight changes Fill to Wash, including the explanatory paragraph and readout. No autonomous stage advance exists in the saved handler. | [before2](/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/washing-machine/width-710/control-0-key-ArrowRight-before2.png) · [after0](/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/washing-machine/width-710/control-0-key-ArrowRight-after0.png) · [visually inspected comparison](/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/replay-pairs/baseline/codex/washing-machine-710-0.png) | +| washing-machine / 710 / 1 / Fill | **live** | Click Fill changes Wash to Fill and replaces the mechanism explanation/readout. | [before2](/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/washing-machine/width-710/control-1-primary-before2.png) · [after0](/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/washing-machine/width-710/control-1-primary-after0.png) · [visually inspected comparison](/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/replay-pairs/baseline/codex/washing-machine-710-1.png) | +| washing-machine / 710 / 2 / Wash | **live** | Click Wash changes Fill to Wash and replaces the mechanism explanation/readout. | [before2](/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/washing-machine/width-710/control-2-primary-before2.png) · [after0](/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/washing-machine/width-710/control-2-primary-after0.png) · [visually inspected comparison](/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/replay-pairs/baseline/codex/washing-machine-710-2.png) | +| washing-machine / 710 / 3 / Drain | **live** | Click Drain visibly removes tank water, lights the drain route and changes the explanation/readout. | [before2](/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/washing-machine/width-710/control-3-primary-before2.png) · [after0](/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/washing-machine/width-710/control-3-primary-after0.png) · [visually inspected comparison](/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/replay-pairs/baseline/codex/washing-machine-710-3.png) | +| washing-machine / 710 / 5 / Spin | **live** | Click Spin visibly removes tank water, changes drum appearance and explains spinning/draining instead of filling. | [before2](/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/washing-machine/width-710/control-5-primary-before2.png) · [after0](/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/washing-machine/width-710/control-5-primary-after0.png) · [visually inspected comparison](/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/replay-pairs/baseline/codex/washing-machine-710-5.png) | +| websocket / 710 / 0 / Chat message delivery steps | **live** | The inspected End key changes Connections open to Chat view updated, adds sender/server/recipient content and changes the paragraph to recipient push delivery. The saved keyboard handler explicitly supports End and sets step 3; no autonomous animation is used. | [before2](/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/websocket/width-710/control-0-key-End-before2.png) · [after0](/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/websocket/width-710/control-0-key-End-after0.png) · [visually inspected comparison](/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/replay-pairs/baseline/codex/websocket-710-0.png) | +| websocket / 710 / 1 / Connect | **live** | The inspected Connect click changes Message sent to Connections open, removes the message from the mechanism and replaces the external explanation with establishing connections. | [before2](/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/websocket/width-710/control-1-primary-before2.png) · [after0](/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/websocket/width-710/control-1-primary-after0.png) · [visually inspected comparison](/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/replay-pairs/baseline/codex/websocket-710-1.png) | +| websocket / 710 / 2 / Send | **live** | The inspected Send click adds a sender message/envelope and changes the independent readout and explanation from Connections open to Message sent. | [before2](/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/websocket/width-710/control-2-primary-before2.png) · [after0](/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/websocket/width-710/control-2-primary-after0.png) · [visually inspected comparison](/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/replay-pairs/baseline/codex/websocket-710-2.png) | +| websocket / 710 / 3 / Server | **live** | The inspected Server click adds message history and server output to the diagram and changes the external readout and paragraph to server validation/storage. | [before2](/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/websocket/width-710/control-3-primary-before2.png) · [after0](/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/websocket/width-710/control-3-primary-after0.png) · [visually inspected comparison](/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/replay-pairs/baseline/codex/websocket-710-3.png) | +| websocket / 710 / 5 / Connected | **live** | From Disconnected at Receive, the inspected Connected click restores recipient message output, closes the latch and changes the readout/paragraph to successful catch-up. This is visible application behavior, not selection styling. | [before2](/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/websocket/width-710/control-5-primary-before2.png) · [after0](/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/websocket/width-710/control-5-primary-after0.png) · [visually inspected comparison](/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/replay-pairs/baseline/codex/websocket-710-5.png) | +| websocket / 710 / 6 / Disconnected | **live** | The inspected Disconnected click removes the recipient's received-message output, opens the latch and changes the readout/explanation to undelivered push and stored history. The saved subscription updates this state synchronously. | [before2](/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/websocket/width-710/control-6-primary-before2.png) · [after0](/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/websocket/width-710/control-6-primary-after0.png) · [visually inspected comparison](/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/replay-pairs/baseline/codex/websocket-710-6.png) | +| zipper / 710 / 0 / Zipper position | **dead** | The supported ArrowRight route leaves slider position at 50 and the mechanism unchanged in the inspected pair. The exact saved keyboard handler calls object-form params.set, which the frozen baseline silently ignores; the separate native range working does not repair this stage. | [before2](/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/zipper/width-710/control-0-key-ArrowRight-before2.png) · [after0](/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/zipper/width-710/control-0-key-ArrowRight-after0.png) | + +## Apparent card passes and blockers + +- **washing-machine**: automatic card pass=True; original confirmed-dead controls=[]; block automatic pass=False; runtime errors=0. +- **bicycle-pump**: automatic card pass=True; original confirmed-dead controls=[]; block automatic pass=False; runtime errors=0. +- **zipper**: automatic card pass=False; original confirmed-dead controls=[0]; block automatic pass=False; runtime errors=0. +- **toilet**: automatic card pass=True; original confirmed-dead controls=[]; block automatic pass=False; runtime errors=0. +- **refrigerator**: automatic card pass=False; original confirmed-dead controls=[0, 1, 2, 3, 4]; block automatic pass=False; runtime errors=1. +- **stapler**: automatic card pass=True; original confirmed-dead controls=[]; block automatic pass=False; runtime errors=0. +- **seat-belt**: automatic card pass=False; original confirmed-dead controls=[0, 1, 2]; block automatic pass=False; runtime errors=1. +- **cdn**: automatic card pass=False; original confirmed-dead controls=[1]; block automatic pass=False; runtime errors=0. +- **notification-settings**: automatic card pass=False; original confirmed-dead controls=[4]; block automatic pass=False; runtime errors=0. +- **narrow-toggle**: automatic card pass=True; original confirmed-dead controls=[]; block automatic pass=False; runtime errors=0. +- **database-index**: automatic card pass=False; original confirmed-dead controls=[0, 1, 2]; block automatic pass=False; runtime errors=1. +- **git-merge**: automatic card pass=False; original confirmed-dead controls=[0]; block automatic pass=False; runtime errors=0. +- **websocket**: automatic card pass=True; original confirmed-dead controls=[]; block automatic pass=False; runtime errors=0. +- **load-balancer**: automatic card pass=False; original confirmed-dead controls=[0]; block automatic pass=False; runtime errors=0. + +No raw result, generation timing, frozen plugin, central adjudication file or active browser job was changed. diff --git a/plugins/playgrounds/evals/launch/reports/gate-1/replay-visual-review-codex-prototype.json b/plugins/playgrounds/evals/launch/reports/gate-1/replay-visual-review-codex-prototype.json new file mode 100644 index 000000000..b508db122 --- /dev/null +++ b/plugins/playgrounds/evals/launch/reports/gate-1/replay-visual-review-codex-prototype.json @@ -0,0 +1,6426 @@ +{ + "revision": "f009de5838f80b90e861e5727f0ad11cba8814f8", + "pluginRevision": "9de99949792c2c59b70693c1dcda6aa8cf36b428", + "complete": true, + "replayComplete": true, + "manualComplete": true, + "reviewedPrompts": [ + "washing-machine", + "bicycle-pump", + "zipper", + "toilet", + "thermos", + "door-lock", + "refrigerator", + "stapler", + "spray-bottle", + "seat-belt", + "toaster", + "umbrella", + "cdn", + "notification-settings", + "narrow-toggle", + "dns", + "database-index", + "git-merge", + "load-balancer", + "websocket" + ], + "controls": [ + { + "revision": "f009de5838f80b90e861e5727f0ad11cba8814f8", + "pluginRevision": "9de99949792c2c59b70693c1dcda6aa8cf36b428", + "provider": "codex", + "prompt": "bicycle-pump", + "width": 710, + "index": 0, + "label": "Pump stroke phase", + "verdict": "live", + "reason": "Actual ArrowRight frames show piston moving down, compressed air chamber, inlet closure and a new compression paragraph/readout. Saved handler explicitly supports ArrowRight and selects phase 1 without autonomous settling.", + "mode": "key-ArrowRight", + "automaticPass": true, + "v3Result": { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/codex/bicycle-pump/result.json", + "sha256": "6f0625b152770c6b5a4cb3028c80270969ea7b22445df4a0b2d4dcf7d9f142e9" + }, + "evidence": [ + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/codex/bicycle-pump/width-710/control-0-key-ArrowRight-before2.png", + "sha256": "e68462aded4345e376441d484348eddd5058dd3e610c43c901cd7f355bf9d901", + "role": "before2" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/codex/bicycle-pump/width-710/control-0-key-ArrowRight-after0.png", + "sha256": "b32d2c77db3c02f6446dbc567204d3038fa602f4bb9ede863248e013edb9ccf4", + "role": "after0" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/replay-pairs/prototype/codex/bicycle-pump-710-0.png", + "sha256": "305807133ac73b6bd540224c37b446584e9db1db2b0510e514a416dbdc70668c", + "role": "visually inspected comparison" + } + ], + "allProbeFrames": [ + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/codex/bicycle-pump/width-710/control-0-key-ArrowRight-before0.png", + "sha256": "e68462aded4345e376441d484348eddd5058dd3e610c43c901cd7f355bf9d901" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/codex/bicycle-pump/width-710/control-0-key-ArrowRight-before1.png", + "sha256": "e68462aded4345e376441d484348eddd5058dd3e610c43c901cd7f355bf9d901" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/codex/bicycle-pump/width-710/control-0-key-ArrowRight-before2.png", + "sha256": "e68462aded4345e376441d484348eddd5058dd3e610c43c901cd7f355bf9d901" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/codex/bicycle-pump/width-710/control-0-key-ArrowRight-after0.png", + "sha256": "b32d2c77db3c02f6446dbc567204d3038fa602f4bb9ede863248e013edb9ccf4" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/codex/bicycle-pump/width-710/control-0-key-ArrowRight-after1.png", + "sha256": "b32d2c77db3c02f6446dbc567204d3038fa602f4bb9ede863248e013edb9ccf4" + } + ], + "source": { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/manual-plan-sources/prototype-codex-bicycle-pump.html", + "sha256": "314f1c4c0d740b0be57706bb922b9b4ccbc8c8e564aa9a847a55c1d336d0ee3d" + }, + "identityMatch": true, + "oldIdentity": { + "index": 0, + "label": "Pump stroke phase", + "tag": "div", + "type": "slider" + }, + "originalAuditVerdict": null, + "runtimeErrors": [], + "visuallyInspected": true + }, + { + "revision": "f009de5838f80b90e861e5727f0ad11cba8814f8", + "pluginRevision": "9de99949792c2c59b70693c1dcda6aa8cf36b428", + "provider": "codex", + "prompt": "bicycle-pump", + "width": 710, + "index": 1, + "label": "\u2190 Previous", + "selector": "#prev", + "verdict": "live", + "reason": "Precondition Next enables Previous; click returns compression to fill, raises piston, opens inlet and replaces explanation.", + "mode": "manual-real-input", + "automaticPass": false, + "v3Result": { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/codex/bicycle-pump/result.json", + "sha256": "6f0625b152770c6b5a4cb3028c80270969ea7b22445df4a0b2d4dcf7d9f142e9" + }, + "source": { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/manual-plan-sources/prototype-codex-bicycle-pump.html", + "sha256": "314f1c4c0d740b0be57706bb922b9b4ccbc8c8e564aa9a847a55c1d336d0ee3d" + }, + "request": { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/requests/request-04-codex-bicycle-pump-back.json", + "sha256": "18961c0d4c2e05c043ba7b7541e550489200985a0a80d46412f05eb98b43922f" + }, + "identityMatch": true, + "inventoryMatch": true, + "runtimeErrors": [], + "visuallyInspected": true, + "evidence": [ + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/04-codex-bicycle-pump-back-before2.png", + "sha256": "11c7dcc786f5a24c9da1be3f87196ae7ad4c01829f930a653bda95382cae5f29", + "role": "before2" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/04-codex-bicycle-pump-back-after0.png", + "sha256": "dc11505f2d0a035b33359a9ffbd5acaf4f2066f471e5ef260fc9fd51dcc2efd0", + "role": "after0" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/pairs/04-codex-bicycle-pump-back.png", + "sha256": "584bb4f4dacc8edb913dc620dcc801ed6b634cd5ee8496d5e65470348af332d6", + "role": "visually inspected comparison" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/request-04-codex-bicycle-pump-back.log", + "sha256": "875d3dd38ff3f328e9bbf498a0be23962cfbb085e2a2c93c8aff2a5bf8f45847", + "role": "real input log" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/request-04-codex-bicycle-pump-back.exit.json", + "sha256": "af0ae04b44141625fc2a40a844c0b37224074bfe56f664a2c86b74dcec5e92e7", + "role": "exit" + } + ], + "replayReview": { + "revision": "f009de5838f80b90e861e5727f0ad11cba8814f8", + "pluginRevision": "9de99949792c2c59b70693c1dcda6aa8cf36b428", + "provider": "codex", + "prompt": "bicycle-pump", + "width": 710, + "index": 1, + "label": "\u2190 Previous", + "verdict": "unproven", + "reason": "The v3 scorer skipped Previous while initially disabled. The stage before frame visibly shows that disabled state, but does not prove a Previous input. Source enables it above phase 0; manual Next then Previous evidence is required.", + "mode": null, + "automaticPass": false, + "v3Result": { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/codex/bicycle-pump/result.json", + "sha256": "6f0625b152770c6b5a4cb3028c80270969ea7b22445df4a0b2d4dcf7d9f142e9" + }, + "evidence": [ + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/codex/bicycle-pump/width-710/control-0-key-ArrowRight-before2.png", + "sha256": "e68462aded4345e376441d484348eddd5058dd3e610c43c901cd7f355bf9d901", + "role": "additional inspected evidence" + } + ], + "allProbeFrames": [], + "source": { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/manual-plan-sources/prototype-codex-bicycle-pump.html", + "sha256": "314f1c4c0d740b0be57706bb922b9b4ccbc8c8e564aa9a847a55c1d336d0ee3d" + }, + "identityMatch": true, + "oldIdentity": { + "index": 1, + "label": "\u2190 Previous", + "tag": "button", + "type": "submit" + }, + "originalAuditVerdict": null, + "runtimeErrors": [], + "visuallyInspected": true, + "missingVisualEvidence": "No interaction frames exist for the disabled Previous control; reviewed its disabled initial appearance in the stage before frame. Await planned enabled-state manual proof." + } + }, + { + "revision": "f009de5838f80b90e861e5727f0ad11cba8814f8", + "pluginRevision": "9de99949792c2c59b70693c1dcda6aa8cf36b428", + "provider": "codex", + "prompt": "cdn", + "width": 710, + "index": 0, + "label": "Fig 1 \u00b7 Distributed copiesBefore purge\n\n\nv1Edge Av1 cachedv1Edge Bv1 cachedv1Edge Cv1 cached\nv1Origi", + "verdict": "unproven", + "reason": "Only partial behavior is proved: ArrowRight advances Before purge to Purge accepted (0 to 1), but the saved phase definition omits numeric bounds and the frozen bridge defaults to 0..1. The full advertised 0..4 journey cannot be inferred from that single visible transition. Planned repeated-key/manual bounds evidence is needed; this must not become a whole-card pass.", + "mode": "key-ArrowRight", + "automaticPass": true, + "v3Result": { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/codex/cdn/result.json", + "sha256": "82626a0e95d104eca2455528a68df908732bd1fae7d95c0256d30ff5449bf405" + }, + "evidence": [ + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/codex/cdn/width-710/control-0-key-ArrowRight-before2.png", + "sha256": "19a9068f60a8f8e87aa2c2e707dc77507c94bf992cb4d6a2285dc43379caae03", + "role": "before2" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/codex/cdn/width-710/control-0-key-ArrowRight-after0.png", + "sha256": "b8c7e20aeb77a3c51b1cc30da9a314ecb5c2e62450485b792866833161511fe8", + "role": "after0" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/replay-pairs/prototype/codex/cdn-710-0.png", + "sha256": "a0491bffd13a6052914ae6d7686d3d366692a0df78708c60ba3ed2ddb846d958", + "role": "visually inspected comparison" + } + ], + "allProbeFrames": [ + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/codex/cdn/width-710/control-0-key-ArrowRight-before0.png", + "sha256": "19a9068f60a8f8e87aa2c2e707dc77507c94bf992cb4d6a2285dc43379caae03" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/codex/cdn/width-710/control-0-key-ArrowRight-before1.png", + "sha256": "19a9068f60a8f8e87aa2c2e707dc77507c94bf992cb4d6a2285dc43379caae03" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/codex/cdn/width-710/control-0-key-ArrowRight-before2.png", + "sha256": "19a9068f60a8f8e87aa2c2e707dc77507c94bf992cb4d6a2285dc43379caae03" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/codex/cdn/width-710/control-0-key-ArrowRight-after0.png", + "sha256": "b8c7e20aeb77a3c51b1cc30da9a314ecb5c2e62450485b792866833161511fe8" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/codex/cdn/width-710/control-0-key-ArrowRight-after1.png", + "sha256": "b8c7e20aeb77a3c51b1cc30da9a314ecb5c2e62450485b792866833161511fe8" + } + ], + "source": { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/manual-plan-sources/prototype-codex-cdn.html", + "sha256": "1d324a2d8c0b23e69b6b9a9733d61d8444eefa745d5c937047035c5eedfeaf73" + }, + "identityMatch": true, + "oldIdentity": { + "index": 0, + "label": "Fig 1 \u00b7 Distributed copiesBefore purge\n\n\nv1Edge Av1 cachedv1Edge Bv1 cachedv1Edge Cv1 cached\nv1Origi", + "tag": "div", + "type": "" + }, + "originalAuditVerdict": null, + "runtimeErrors": [], + "visuallyInspected": true + }, + { + "revision": "f009de5838f80b90e861e5727f0ad11cba8814f8", + "pluginRevision": "9de99949792c2c59b70693c1dcda6aa8cf36b428", + "provider": "codex", + "prompt": "cdn", + "width": 710, + "index": 1, + "label": "phase", + "selector": "#phase", + "verdict": "dead", + "reason": "Actual subsequent range drag reaches DOM value4 while diagram and explanation remain phase1/Purge accepted. The input thumb moves but bridge phase clamps to1; visible later stages do not work.", + "mode": "manual-real-input", + "automaticPass": false, + "v3Result": { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/codex/cdn/result.json", + "sha256": "82626a0e95d104eca2455528a68df908732bd1fae7d95c0256d30ff5449bf405" + }, + "source": { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/manual-plan-sources/prototype-codex-cdn.html", + "sha256": "1d324a2d8c0b23e69b6b9a9733d61d8444eefa745d5c937047035c5eedfeaf73" + }, + "request": { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/requests/request-06-codex-cdn-bounds.json", + "sha256": "e3d9abde0439b129fc51d1f9df7c55de00fce210dc71d4dadd92b0faa1d5f79e" + }, + "identityMatch": true, + "inventoryMatch": true, + "runtimeErrors": [], + "visuallyInspected": true, + "evidence": [ + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/06-codex-cdn-bounds-before2.png", + "sha256": "bf1301be359a11ddd16c2c58c320180b50db5d894ba5bf490992db8f48b138f0", + "role": "before2" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/06-codex-cdn-bounds-after0.png", + "sha256": "bf1301be359a11ddd16c2c58c320180b50db5d894ba5bf490992db8f48b138f0", + "role": "after0" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/pairs/06-codex-cdn-bounds.png", + "sha256": "6b466c0330a3b840f6fc6873b403b53faf15f66d139e5839844979410fd735d5", + "role": "visually inspected comparison" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/request-06-codex-cdn-bounds.log", + "sha256": "bd4fc12ad724e7ef6cfc5cce76b31f8fe0e72afed2a23e7b18beb74ad75b5a31", + "role": "real input log" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/request-06-codex-cdn-bounds.exit.json", + "sha256": "61500500a8ccd330fa65e617321af96b76290b7c00a177f00741b46fcd77d7a7", + "role": "exit" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/06-codex-cdn-bounds-range-end0.png", + "sha256": "51249ba3fcb02ed1f564f5e0cb5f0083e1d3f5a0e00f3daef198dd55bd7ee4c9", + "role": "additional inspected frame" + } + ], + "replayReview": { + "revision": "f009de5838f80b90e861e5727f0ad11cba8814f8", + "pluginRevision": "9de99949792c2c59b70693c1dcda6aa8cf36b428", + "provider": "codex", + "prompt": "cdn", + "width": 710, + "index": 1, + "label": "phase", + "verdict": "dead", + "reason": "Actual low/high drag frames move the thumb beyond Purge accepted but keep the stage, cache geometry and explanatory output at phase 1. Saved numeric phase definition omits bounds, so the frozen bridge clamps requests for phases 2\u20134 to 1.", + "mode": "drag", + "automaticPass": false, + "v3Result": { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/codex/cdn/result.json", + "sha256": "82626a0e95d104eca2455528a68df908732bd1fae7d95c0256d30ff5449bf405" + }, + "evidence": [ + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/codex/cdn/width-710/control-1-drag-before2.png", + "sha256": "bf1301be359a11ddd16c2c58c320180b50db5d894ba5bf490992db8f48b138f0", + "role": "before2" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/codex/cdn/width-710/control-1-drag-after0.png", + "sha256": "35172798b024b3039762b21d6875af66f72bba3f6154bc93a90a02eefa7df431", + "role": "after0" + } + ], + "allProbeFrames": [ + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/codex/cdn/width-710/control-1-drag-before0.png", + "sha256": "bf1301be359a11ddd16c2c58c320180b50db5d894ba5bf490992db8f48b138f0" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/codex/cdn/width-710/control-1-drag-before1.png", + "sha256": "bf1301be359a11ddd16c2c58c320180b50db5d894ba5bf490992db8f48b138f0" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/codex/cdn/width-710/control-1-drag-before2.png", + "sha256": "bf1301be359a11ddd16c2c58c320180b50db5d894ba5bf490992db8f48b138f0" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/codex/cdn/width-710/control-1-drag-after0.png", + "sha256": "35172798b024b3039762b21d6875af66f72bba3f6154bc93a90a02eefa7df431" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/codex/cdn/width-710/control-1-drag-after1.png", + "sha256": "35172798b024b3039762b21d6875af66f72bba3f6154bc93a90a02eefa7df431" + } + ], + "source": { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/manual-plan-sources/prototype-codex-cdn.html", + "sha256": "1d324a2d8c0b23e69b6b9a9733d61d8444eefa745d5c937047035c5eedfeaf73" + }, + "identityMatch": true, + "oldIdentity": { + "index": 1, + "label": "phase", + "tag": "input", + "type": "range" + }, + "originalAuditVerdict": null, + "runtimeErrors": [], + "visuallyInspected": true + } + }, + { + "revision": "f009de5838f80b90e861e5727f0ad11cba8814f8", + "pluginRevision": "9de99949792c2c59b70693c1dcda6aa8cf36b428", + "provider": "codex", + "prompt": "cdn", + "width": 710, + "index": 3, + "label": "browser", + "verdict": "live", + "reason": "The actual browser-cache checkbox changes the readout from Edge HIT to Local browser HIT and replaces the viewer explanation with the browser retaining its fresh v1 copy. This is independent visible output beyond checkbox styling.", + "mode": "primary", + "automaticPass": true, + "v3Result": { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/codex/cdn/result.json", + "sha256": "82626a0e95d104eca2455528a68df908732bd1fae7d95c0256d30ff5449bf405" + }, + "evidence": [ + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/codex/cdn/width-710/control-3-primary-before2.png", + "sha256": "1719a0660f295cbdd92baed27be603e8dd8e4a699d075b3e6a4d105583f88742", + "role": "before2" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/codex/cdn/width-710/control-3-primary-after0.png", + "sha256": "954ca6a52142e808ecad22e080b08e78fc5c83039e5ff07a2aab83385b0b646b", + "role": "after0" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/replay-pairs/prototype/codex/cdn-710-3.png", + "sha256": "a5274ed63a0162b5d123cec01acc92df4efb5cfed1794b5af5a2c1fdbf5abfc6", + "role": "visually inspected comparison" + } + ], + "allProbeFrames": [ + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/codex/cdn/width-710/control-3-primary-before0.png", + "sha256": "1719a0660f295cbdd92baed27be603e8dd8e4a699d075b3e6a4d105583f88742" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/codex/cdn/width-710/control-3-primary-before1.png", + "sha256": "1719a0660f295cbdd92baed27be603e8dd8e4a699d075b3e6a4d105583f88742" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/codex/cdn/width-710/control-3-primary-before2.png", + "sha256": "1719a0660f295cbdd92baed27be603e8dd8e4a699d075b3e6a4d105583f88742" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/codex/cdn/width-710/control-3-primary-after0.png", + "sha256": "954ca6a52142e808ecad22e080b08e78fc5c83039e5ff07a2aab83385b0b646b" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/codex/cdn/width-710/control-3-primary-after1.png", + "sha256": "954ca6a52142e808ecad22e080b08e78fc5c83039e5ff07a2aab83385b0b646b" + } + ], + "source": { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/manual-plan-sources/prototype-codex-cdn.html", + "sha256": "1d324a2d8c0b23e69b6b9a9733d61d8444eefa745d5c937047035c5eedfeaf73" + }, + "identityMatch": true, + "oldIdentity": { + "index": 3, + "label": "browser", + "tag": "input", + "type": "checkbox" + }, + "originalAuditVerdict": null, + "runtimeErrors": [], + "visuallyInspected": true + }, + { + "revision": "f009de5838f80b90e861e5727f0ad11cba8814f8", + "pluginRevision": "9de99949792c2c59b70693c1dcda6aa8cf36b428", + "provider": "codex", + "prompt": "cdn", + "width": 710, + "index": 5, + "label": "Next stage \u2192", + "selector": "#next", + "verdict": "dead", + "reason": "Next advances initial0 to1, then further real Next remains phase1/Purge accepted. Three advertised later phases are inaccessible because bridge default max1 clamps phase.", + "mode": "manual-real-input", + "automaticPass": false, + "v3Result": { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/codex/cdn/result.json", + "sha256": "82626a0e95d104eca2455528a68df908732bd1fae7d95c0256d30ff5449bf405" + }, + "source": { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/manual-plan-sources/prototype-codex-cdn.html", + "sha256": "1d324a2d8c0b23e69b6b9a9733d61d8444eefa745d5c937047035c5eedfeaf73" + }, + "request": { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/requests/request-06-codex-cdn-bounds.json", + "sha256": "e3d9abde0439b129fc51d1f9df7c55de00fce210dc71d4dadd92b0faa1d5f79e" + }, + "identityMatch": true, + "inventoryMatch": true, + "runtimeErrors": [], + "visuallyInspected": true, + "evidence": [ + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/06-codex-cdn-bounds-before2.png", + "sha256": "bf1301be359a11ddd16c2c58c320180b50db5d894ba5bf490992db8f48b138f0", + "role": "before2" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/06-codex-cdn-bounds-after0.png", + "sha256": "bf1301be359a11ddd16c2c58c320180b50db5d894ba5bf490992db8f48b138f0", + "role": "after0" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/pairs/06-codex-cdn-bounds.png", + "sha256": "6b466c0330a3b840f6fc6873b403b53faf15f66d139e5839844979410fd735d5", + "role": "visually inspected comparison" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/request-06-codex-cdn-bounds.log", + "sha256": "bd4fc12ad724e7ef6cfc5cce76b31f8fe0e72afed2a23e7b18beb74ad75b5a31", + "role": "real input log" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/request-06-codex-cdn-bounds.exit.json", + "sha256": "61500500a8ccd330fa65e617321af96b76290b7c00a177f00741b46fcd77d7a7", + "role": "exit" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/06-codex-cdn-bounds-range-end0.png", + "sha256": "51249ba3fcb02ed1f564f5e0cb5f0083e1d3f5a0e00f3daef198dd55bd7ee4c9", + "role": "additional inspected frame" + } + ], + "replayReview": { + "revision": "f009de5838f80b90e861e5727f0ad11cba8814f8", + "pluginRevision": "9de99949792c2c59b70693c1dcda6aa8cf36b428", + "provider": "codex", + "prompt": "cdn", + "width": 710, + "index": 5, + "label": "Next stage \u2192", + "verdict": "dead", + "reason": "Actual Next-stage click frames remain at Purge accepted with identical caches and explanation. The handler requests phase 2, but the parameter definition lacks max:4 and the frozen bridge clamps it to 1. This separately exposed control cannot reach the remaining stages.", + "mode": "primary", + "automaticPass": false, + "v3Result": { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/codex/cdn/result.json", + "sha256": "82626a0e95d104eca2455528a68df908732bd1fae7d95c0256d30ff5449bf405" + }, + "evidence": [ + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/codex/cdn/width-710/control-5-primary-before2.png", + "sha256": "0d79edfb71831ceb2defd4b82de09e5b4d4a533786145c551119bbb35c0b8a87", + "role": "before2" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/codex/cdn/width-710/control-5-primary-after0.png", + "sha256": "0d79edfb71831ceb2defd4b82de09e5b4d4a533786145c551119bbb35c0b8a87", + "role": "after0" + } + ], + "allProbeFrames": [ + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/codex/cdn/width-710/control-5-primary-before0.png", + "sha256": "0d79edfb71831ceb2defd4b82de09e5b4d4a533786145c551119bbb35c0b8a87" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/codex/cdn/width-710/control-5-primary-before1.png", + "sha256": "0d79edfb71831ceb2defd4b82de09e5b4d4a533786145c551119bbb35c0b8a87" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/codex/cdn/width-710/control-5-primary-before2.png", + "sha256": "0d79edfb71831ceb2defd4b82de09e5b4d4a533786145c551119bbb35c0b8a87" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/codex/cdn/width-710/control-5-primary-after0.png", + "sha256": "0d79edfb71831ceb2defd4b82de09e5b4d4a533786145c551119bbb35c0b8a87" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/codex/cdn/width-710/control-5-primary-after1.png", + "sha256": "0d79edfb71831ceb2defd4b82de09e5b4d4a533786145c551119bbb35c0b8a87" + } + ], + "source": { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/manual-plan-sources/prototype-codex-cdn.html", + "sha256": "1d324a2d8c0b23e69b6b9a9733d61d8444eefa745d5c937047035c5eedfeaf73" + }, + "identityMatch": true, + "oldIdentity": { + "index": 5, + "label": "Next stage \u2192", + "tag": "button", + "type": "submit" + }, + "originalAuditVerdict": null, + "runtimeErrors": [], + "visuallyInspected": true + } + }, + { + "revision": "f009de5838f80b90e861e5727f0ad11cba8814f8", + "pluginRevision": "9de99949792c2c59b70693c1dcda6aa8cf36b428", + "provider": "codex", + "prompt": "database-index", + "width": 710, + "index": 0, + "label": "Table tray; arrow keys change the target ID", + "verdict": "live", + "reason": "Actual ArrowRight frames move the emphasized table row from ID 1 to ID 2 and update the query/route ID. The saved handler explicitly changes target and renders; source geometry is static otherwise. The very pale external text is a readability limitation, not a dead input.", + "mode": "key-ArrowRight", + "automaticPass": false, + "v3Result": { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/codex/database-index/result.json", + "sha256": "4d6ab849479b49e53e9141340cce52edb9019d9b754fd1640989d561db54b5fe" + }, + "evidence": [ + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/codex/database-index/width-710/control-0-key-ArrowRight-before2.png", + "sha256": "98b5abb2af7ed36c87e9656aa72dddf69b15f293d3ff1e6ad470ab8700153b86", + "role": "before2" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/codex/database-index/width-710/control-0-key-ArrowRight-after0.png", + "sha256": "3f70be64ac44aa7b4765ed167fdcb07c52fef4aba3a8799298fb5282cd1c2daf", + "role": "after0" + } + ], + "allProbeFrames": [ + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/codex/database-index/width-710/control-0-key-ArrowRight-before0.png", + "sha256": "98b5abb2af7ed36c87e9656aa72dddf69b15f293d3ff1e6ad470ab8700153b86" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/codex/database-index/width-710/control-0-key-ArrowRight-before1.png", + "sha256": "98b5abb2af7ed36c87e9656aa72dddf69b15f293d3ff1e6ad470ab8700153b86" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/codex/database-index/width-710/control-0-key-ArrowRight-before2.png", + "sha256": "98b5abb2af7ed36c87e9656aa72dddf69b15f293d3ff1e6ad470ab8700153b86" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/codex/database-index/width-710/control-0-key-ArrowRight-after0.png", + "sha256": "3f70be64ac44aa7b4765ed167fdcb07c52fef4aba3a8799298fb5282cd1c2daf" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/codex/database-index/width-710/control-0-key-ArrowRight-after1.png", + "sha256": "3f70be64ac44aa7b4765ed167fdcb07c52fef4aba3a8799298fb5282cd1c2daf" + } + ], + "source": { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/manual-plan-sources/prototype-codex-database-index.html", + "sha256": "f913f2d1bbc2a62f12eb4e735a212d7b6fa1e18a89a86c8e6f80349b8e119f18" + }, + "identityMatch": true, + "oldIdentity": { + "index": 0, + "label": "Table tray; arrow keys change the target ID", + "tag": "div", + "type": "" + }, + "originalAuditVerdict": null, + "runtimeErrors": [], + "visuallyInspected": true + }, + { + "revision": "f009de5838f80b90e861e5727f0ad11cba8814f8", + "pluginRevision": "9de99949792c2c59b70693c1dcda6aa8cf36b428", + "provider": "codex", + "prompt": "database-index", + "width": 710, + "index": 1, + "label": "B-tree indexFull table scan", + "verdict": "live", + "reason": "Actual Access path change from B-tree to full scan emphasizes every table row and changes the route/count to checking 12 rows. This meaningful output is visible outside the selector, though the pale text contrast is poor.", + "mode": "primary", + "automaticPass": false, + "v3Result": { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/codex/database-index/result.json", + "sha256": "4d6ab849479b49e53e9141340cce52edb9019d9b754fd1640989d561db54b5fe" + }, + "evidence": [ + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/codex/database-index/width-710/control-1-primary-before2.png", + "sha256": "98b5abb2af7ed36c87e9656aa72dddf69b15f293d3ff1e6ad470ab8700153b86", + "role": "before2" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/codex/database-index/width-710/control-1-primary-after0.png", + "sha256": "f6939145c57feb0958cc758a5708bad01e504867546c7eb970124eed2ca28f60", + "role": "after0" + } + ], + "allProbeFrames": [ + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/codex/database-index/width-710/control-1-primary-before0.png", + "sha256": "98b5abb2af7ed36c87e9656aa72dddf69b15f293d3ff1e6ad470ab8700153b86" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/codex/database-index/width-710/control-1-primary-before1.png", + "sha256": "98b5abb2af7ed36c87e9656aa72dddf69b15f293d3ff1e6ad470ab8700153b86" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/codex/database-index/width-710/control-1-primary-before2.png", + "sha256": "98b5abb2af7ed36c87e9656aa72dddf69b15f293d3ff1e6ad470ab8700153b86" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/codex/database-index/width-710/control-1-primary-after0.png", + "sha256": "f6939145c57feb0958cc758a5708bad01e504867546c7eb970124eed2ca28f60" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/codex/database-index/width-710/control-1-primary-after1.png", + "sha256": "f6939145c57feb0958cc758a5708bad01e504867546c7eb970124eed2ca28f60" + } + ], + "source": { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/manual-plan-sources/prototype-codex-database-index.html", + "sha256": "f913f2d1bbc2a62f12eb4e735a212d7b6fa1e18a89a86c8e6f80349b8e119f18" + }, + "identityMatch": true, + "oldIdentity": { + "index": 1, + "label": "B-tree indexFull table scan", + "tag": "select", + "type": "select-one" + }, + "originalAuditVerdict": null, + "runtimeErrors": [], + "visuallyInspected": true + }, + { + "revision": "f009de5838f80b90e861e5727f0ad11cba8814f8", + "pluginRevision": "9de99949792c2c59b70693c1dcda6aa8cf36b428", + "provider": "codex", + "prompt": "database-index", + "width": 710, + "index": 2, + "label": "123456789101112", + "verdict": "live", + "reason": "Actual full-resolution frames show SELECT WHERE id = 1 changing to id = 2 and route text return ID 1 changing to ID 2 while in scan mode. All rows correctly remain emphasized for a full scan. The text is very pale but visibly changes; the saved target handler matches this output.", + "mode": "primary", + "automaticPass": false, + "v3Result": { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/codex/database-index/result.json", + "sha256": "4d6ab849479b49e53e9141340cce52edb9019d9b754fd1640989d561db54b5fe" + }, + "evidence": [ + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/codex/database-index/width-710/control-2-primary-before2.png", + "sha256": "f6939145c57feb0958cc758a5708bad01e504867546c7eb970124eed2ca28f60", + "role": "before2" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/codex/database-index/width-710/control-2-primary-after0.png", + "sha256": "bf8f15ecb2debc3d272089160707d2eb986444d2e9d793f1a799f7bb73d82819", + "role": "after0" + } + ], + "allProbeFrames": [ + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/codex/database-index/width-710/control-2-primary-before0.png", + "sha256": "f6939145c57feb0958cc758a5708bad01e504867546c7eb970124eed2ca28f60" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/codex/database-index/width-710/control-2-primary-before1.png", + "sha256": "f6939145c57feb0958cc758a5708bad01e504867546c7eb970124eed2ca28f60" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/codex/database-index/width-710/control-2-primary-before2.png", + "sha256": "f6939145c57feb0958cc758a5708bad01e504867546c7eb970124eed2ca28f60" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/codex/database-index/width-710/control-2-primary-after0.png", + "sha256": "bf8f15ecb2debc3d272089160707d2eb986444d2e9d793f1a799f7bb73d82819" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/codex/database-index/width-710/control-2-primary-after1.png", + "sha256": "bf8f15ecb2debc3d272089160707d2eb986444d2e9d793f1a799f7bb73d82819" + } + ], + "source": { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/manual-plan-sources/prototype-codex-database-index.html", + "sha256": "f913f2d1bbc2a62f12eb4e735a212d7b6fa1e18a89a86c8e6f80349b8e119f18" + }, + "identityMatch": true, + "oldIdentity": { + "index": 2, + "label": "123456789101112", + "tag": "select", + "type": "select-one" + }, + "originalAuditVerdict": null, + "runtimeErrors": [], + "visuallyInspected": true + }, + { + "revision": "f009de5838f80b90e861e5727f0ad11cba8814f8", + "pluginRevision": "9de99949792c2c59b70693c1dcda6aa8cf36b428", + "provider": "codex", + "prompt": "dns", + "width": 710, + "index": 0, + "label": "DNS lookup. Use left and right arrows to step.", + "verdict": "live", + "reason": "Actual supported End frames change local-cache check to Connect to the website, highlighting the device/web-server link and changing the caption. Source explicitly supports End and sets the last sequence step; no autonomous animation exists.", + "mode": "key-End", + "automaticPass": true, + "v3Result": { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/codex/dns/result.json", + "sha256": "ded728d019f784315f262b671d3f8eff4c7c7d08edfb12ab2cca4b5e6bc9cd75" + }, + "evidence": [ + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/codex/dns/width-710/control-0-key-End-before2.png", + "sha256": "802e6c60739dbfc025f79e49401b41e3b2defd51e834856ebb456c1069e424f1", + "role": "before2" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/codex/dns/width-710/control-0-key-End-after0.png", + "sha256": "50698e71c4a8275247b5cf6adf112277cf5aef6423c72ccff920cbf386f84f41", + "role": "after0" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/replay-pairs/prototype/codex/dns-710-0.png", + "sha256": "321c4887ab4f7be46b0552920e28e1fd7d139d2c4e5f2bcaf5a7a79f7fd6f880", + "role": "visually inspected comparison" + } + ], + "allProbeFrames": [ + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/codex/dns/width-710/control-0-key-End-before0.png", + "sha256": "802e6c60739dbfc025f79e49401b41e3b2defd51e834856ebb456c1069e424f1" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/codex/dns/width-710/control-0-key-End-before1.png", + "sha256": "802e6c60739dbfc025f79e49401b41e3b2defd51e834856ebb456c1069e424f1" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/codex/dns/width-710/control-0-key-End-before2.png", + "sha256": "802e6c60739dbfc025f79e49401b41e3b2defd51e834856ebb456c1069e424f1" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/codex/dns/width-710/control-0-key-End-after0.png", + "sha256": "50698e71c4a8275247b5cf6adf112277cf5aef6423c72ccff920cbf386f84f41" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/codex/dns/width-710/control-0-key-End-after1.png", + "sha256": "50698e71c4a8275247b5cf6adf112277cf5aef6423c72ccff920cbf386f84f41" + } + ], + "source": { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/manual-plan-sources/prototype-codex-dns.html", + "sha256": "1de41685f71e02e42f79e7cd91d640e90deada30a96e1ccd93c3064bf7963831" + }, + "identityMatch": true, + "oldIdentity": { + "index": 0, + "label": "DNS lookup. Use left and right arrows to step.", + "tag": "div", + "type": "group" + }, + "originalAuditVerdict": null, + "runtimeErrors": [], + "visuallyInspected": true + }, + { + "revision": "f009de5838f80b90e861e5727f0ad11cba8814f8", + "pluginRevision": "9de99949792c2c59b70693c1dcda6aa8cf36b428", + "provider": "codex", + "prompt": "dns", + "width": 710, + "index": 1, + "label": "No cacheAt the resolverOn your device", + "selector": "#cache", + "verdict": "dead", + "reason": "Native Home/Enter to End/Enter shows No cache then On your device, while dns.state.cache stays numeric0 and max stays3. Next twice clears selection and visits resolver/cache instead of device-cached route. Actual images confirm wrong route. Earlier automatic proof merely reset lookup step and did not prove cache selection.", + "mode": "manual-real-input", + "automaticPass": true, + "v3Result": { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/codex/dns/result.json", + "sha256": "ded728d019f784315f262b671d3f8eff4c7c7d08edfb12ab2cca4b5e6bc9cd75" + }, + "source": { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/manual-plan-sources/prototype-codex-dns.html", + "sha256": "1de41685f71e02e42f79e7cd91d640e90deada30a96e1ccd93c3064bf7963831" + }, + "request": { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/requests/request-19-codex-dns-cache.json", + "sha256": "0b7210531ba5598c7ab48ef8876c1280579675a4d6de27edade2456b1622c3e9" + }, + "identityMatch": true, + "inventoryMatch": true, + "runtimeErrors": [], + "visuallyInspected": true, + "evidence": [ + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/19-codex-dns-cache-before2.png", + "sha256": "2f44e018ddfaf1ea2cc76b7e8eef3b1156f1070d6b834919d1d5c5fc0d66e124", + "role": "before2" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/19-codex-dns-cache-after0.png", + "sha256": "c64ed2b95cb38994d07a2651792dd76d07516ed13db960637c8d5731fee01b42", + "role": "after0" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/pairs/19-codex-dns-cache.png", + "sha256": "8911ee4a6b3dcff5a5c24d60e0ab81f19546942db233a98033cf67392042ef47", + "role": "visually inspected comparison" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/request-19-codex-dns-cache.log", + "sha256": "905f18496f8ffbfe8bc72209bec810d3d3f39e504f7d74df5bc7a75f5ab07679", + "role": "real input log" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/request-19-codex-dns-cache.exit.json", + "sha256": "e05f8ade2b0a9e001868c7df26832104f68d53710174b76495ffa9ba406cf1bb", + "role": "exit" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/19-codex-dns-cache-next1.png", + "sha256": "cdfa5b033710b5eba371f02b841c503e9bd020eba6818a594724121b247eaa08", + "role": "additional inspected frame" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/19-codex-dns-cache-next2.png", + "sha256": "f7a2521388845afa25d50e62a6eb64f5b7d4797076fca685906dbab985c2b754", + "role": "additional inspected frame" + } + ], + "replayReview": { + "revision": "f009de5838f80b90e861e5727f0ad11cba8814f8", + "pluginRevision": "9de99949792c2c59b70693c1dcda6aa8cf36b428", + "provider": "codex", + "prompt": "dns", + "width": 710, + "index": 1, + "label": "No cacheAt the resolverOn your device", + "verdict": "unproven", + "reason": "The actual auto-passing select pair merely resets lookup progress from resolver-cache step to step 0; the select stays blank. Its onchange resets step independently of cache, while cache is declared type string and frozen numeric normalization can reject all cache strings. This partial reset does not prove selecting the requested cache scenario; queued native-key/state/route proof is required.", + "mode": "primary", + "automaticPass": true, + "v3Result": { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/codex/dns/result.json", + "sha256": "ded728d019f784315f262b671d3f8eff4c7c7d08edfb12ab2cca4b5e6bc9cd75" + }, + "evidence": [ + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/codex/dns/width-710/control-1-primary-before2.png", + "sha256": "109e77cc1c148064844d54189878c05e06d5ceba9b8a166549be0e3cc0f39771", + "role": "before2" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/codex/dns/width-710/control-1-primary-after0.png", + "sha256": "3af3904dbdf9f5626446b9bf08d7a3b07ee25bf919cde9e86798e0b013c9b114", + "role": "after0" + } + ], + "allProbeFrames": [ + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/codex/dns/width-710/control-1-primary-before0.png", + "sha256": "109e77cc1c148064844d54189878c05e06d5ceba9b8a166549be0e3cc0f39771" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/codex/dns/width-710/control-1-primary-before1.png", + "sha256": "109e77cc1c148064844d54189878c05e06d5ceba9b8a166549be0e3cc0f39771" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/codex/dns/width-710/control-1-primary-before2.png", + "sha256": "109e77cc1c148064844d54189878c05e06d5ceba9b8a166549be0e3cc0f39771" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/codex/dns/width-710/control-1-primary-after0.png", + "sha256": "3af3904dbdf9f5626446b9bf08d7a3b07ee25bf919cde9e86798e0b013c9b114" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/codex/dns/width-710/control-1-primary-after1.png", + "sha256": "3af3904dbdf9f5626446b9bf08d7a3b07ee25bf919cde9e86798e0b013c9b114" + } + ], + "source": { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/manual-plan-sources/prototype-codex-dns.html", + "sha256": "1de41685f71e02e42f79e7cd91d640e90deada30a96e1ccd93c3064bf7963831" + }, + "identityMatch": true, + "oldIdentity": { + "index": 1, + "label": "No cacheAt the resolverOn your device", + "tag": "select", + "type": "select-one" + }, + "originalAuditVerdict": null, + "runtimeErrors": [], + "visuallyInspected": true + } + }, + { + "revision": "f009de5838f80b90e861e5727f0ad11cba8814f8", + "pluginRevision": "9de99949792c2c59b70693c1dcda6aa8cf36b428", + "provider": "codex", + "prompt": "git-merge", + "width": 710, + "index": 0, + "label": "Different edits \u2192 clean mergeCompeting edits \u2192 conflictMain has no new commits \u2192 fast-forward", + "selector": "#scenario", + "verdict": "dead", + "reason": "Real select changes Clean merge to Fast-forward, but actual diagram, merge explanation and history remain Clean merge; params stays {}. String-array options do not match frozen option.value contract.", + "mode": "manual-real-input", + "automaticPass": false, + "v3Result": { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/codex/git-merge/result.json", + "sha256": "9a88555a0509c24be36498aae6a3a108bf100b732769e8ea142bf262784ff0c5" + }, + "source": { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/manual-plan-sources/prototype-codex-git-merge.html", + "sha256": "ade3766c9982d24a07b3783c48753548ca5cd402289648e8fec7ec64009e8717" + }, + "request": { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/requests/request-18-codex-git-select.json", + "sha256": "f84abe61665458737f1daf3173737b976fc5ae1c69bd88dda9c541c1ee538b1c" + }, + "identityMatch": true, + "inventoryMatch": true, + "runtimeErrors": [], + "visuallyInspected": true, + "evidence": [ + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/18-codex-git-select-before2.png", + "sha256": "513e6ef6baa1c4c692e6194ca2b83674dc0f4470d1dc3ceaee007a3ea1aa68fa", + "role": "before2" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/18-codex-git-select-after0.png", + "sha256": "c36a13cb13909ff9e6aca1338206e402f8d39c8b03d180db55f082611ff8b30e", + "role": "after0" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/pairs/18-codex-git-select.png", + "sha256": "877ba4e0b495d3d84be8262d29369a22c797f4696ff20d124ca19c6e7b9d434e", + "role": "visually inspected comparison" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/request-18-codex-git-select.log", + "sha256": "d78a67a5c9f0c5ac05f42e8342afb5b409b5fc15714fa100baa0569c927831f4", + "role": "real input log" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/request-18-codex-git-select.exit.json", + "sha256": "ebba7a2e1981715c92aae4162d7cc19e599bd10cf9e7da11853d43a99f346dc4", + "role": "exit" + } + ], + "replayReview": { + "revision": "f009de5838f80b90e861e5727f0ad11cba8814f8", + "pluginRevision": "9de99949792c2c59b70693c1dcda6aa8cf36b428", + "provider": "codex", + "prompt": "git-merge", + "width": 710, + "index": 0, + "label": "Different edits \u2192 clean mergeCompeting edits \u2192 conflictMain has no new commits \u2192 fast-forward", + "verdict": "unproven", + "reason": "The actual pair only changes a blank select to the first clean-merge label and leaves result/history unchanged. Source supplies string-array options while frozen parameter validation expects option.value, so a true scenario change may be rejected. Await queued Home/Enter to End/Enter proof rather than assuming live from the handler.", + "mode": "primary", + "automaticPass": false, + "v3Result": { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/codex/git-merge/result.json", + "sha256": "9a88555a0509c24be36498aae6a3a108bf100b732769e8ea142bf262784ff0c5" + }, + "evidence": [ + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/codex/git-merge/width-710/control-0-primary-before2.png", + "sha256": "1610ddf848d31130ad41f86bb8e73884a2590f1c4fba611c7d920ac85b60ad58", + "role": "before2" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/codex/git-merge/width-710/control-0-primary-after0.png", + "sha256": "513e6ef6baa1c4c692e6194ca2b83674dc0f4470d1dc3ceaee007a3ea1aa68fa", + "role": "after0" + } + ], + "allProbeFrames": [ + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/codex/git-merge/width-710/control-0-primary-before0.png", + "sha256": "1610ddf848d31130ad41f86bb8e73884a2590f1c4fba611c7d920ac85b60ad58" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/codex/git-merge/width-710/control-0-primary-before1.png", + "sha256": "1610ddf848d31130ad41f86bb8e73884a2590f1c4fba611c7d920ac85b60ad58" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/codex/git-merge/width-710/control-0-primary-before2.png", + "sha256": "1610ddf848d31130ad41f86bb8e73884a2590f1c4fba611c7d920ac85b60ad58" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/codex/git-merge/width-710/control-0-primary-after0.png", + "sha256": "513e6ef6baa1c4c692e6194ca2b83674dc0f4470d1dc3ceaee007a3ea1aa68fa" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/codex/git-merge/width-710/control-0-primary-after1.png", + "sha256": "513e6ef6baa1c4c692e6194ca2b83674dc0f4470d1dc3ceaee007a3ea1aa68fa" + } + ], + "source": { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/manual-plan-sources/prototype-codex-git-merge.html", + "sha256": "ade3766c9982d24a07b3783c48753548ca5cd402289648e8fec7ec64009e8717" + }, + "identityMatch": true, + "oldIdentity": { + "index": 0, + "label": "Different edits \u2192 clean mergeCompeting edits \u2192 conflictMain has no new commits \u2192 fast-forward", + "tag": "select", + "type": "select-one" + }, + "originalAuditVerdict": null, + "runtimeErrors": [], + "visuallyInspected": true + } + }, + { + "revision": "f009de5838f80b90e861e5727f0ad11cba8814f8", + "pluginRevision": "9de99949792c2c59b70693c1dcda6aa8cf36b428", + "provider": "codex", + "prompt": "load-balancer", + "width": 710, + "index": 0, + "label": "Requests sent", + "verdict": "live", + "reason": "Drag changes requests 3 to 11, routes C to B, server counts 1/1/1 to 4/4/3 and route readout; meaningful output corroborates supported range input.", + "mode": "drag", + "automaticPass": true, + "v3Result": { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/codex/load-balancer/result.json", + "sha256": "5e7b08e6f54782389e16ec5e40b4d2a1544e712f0b5b4c0d786d3a1e069584ec" + }, + "evidence": [ + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/codex/load-balancer/width-710/control-0-drag-before2.png", + "sha256": "6bd6f86f8010edf5f39b9b69da602a672ce17908449c1250c941411a0943a746", + "role": "before2" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/codex/load-balancer/width-710/control-0-drag-after0.png", + "sha256": "6792d0a7d7389adbec3b477624d016cb6d76b156a19e4a81cd50e38b3969d61e", + "role": "after0" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/replay-pairs/prototype/codex/load-balancer-710-0.png", + "sha256": "b74df6963bf211e627316ce78dd2f55ac5f9c7a957d869605f013d3efe292c9d", + "role": "visually inspected comparison" + } + ], + "allProbeFrames": [ + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/codex/load-balancer/width-710/control-0-drag-before0.png", + "sha256": "6bd6f86f8010edf5f39b9b69da602a672ce17908449c1250c941411a0943a746" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/codex/load-balancer/width-710/control-0-drag-before1.png", + "sha256": "6bd6f86f8010edf5f39b9b69da602a672ce17908449c1250c941411a0943a746" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/codex/load-balancer/width-710/control-0-drag-before2.png", + "sha256": "6bd6f86f8010edf5f39b9b69da602a672ce17908449c1250c941411a0943a746" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/codex/load-balancer/width-710/control-0-drag-after0.png", + "sha256": "6792d0a7d7389adbec3b477624d016cb6d76b156a19e4a81cd50e38b3969d61e" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/codex/load-balancer/width-710/control-0-drag-after1.png", + "sha256": "6792d0a7d7389adbec3b477624d016cb6d76b156a19e4a81cd50e38b3969d61e" + } + ], + "source": { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/manual-plan-sources/prototype-codex-load-balancer.html", + "sha256": "5dd95aac25ff2c5d2d32bcd17f56abffc1ebbc7fa2b69bfbfce3a6b3dd925d3b" + }, + "identityMatch": true, + "oldIdentity": { + "index": 0, + "label": "Requests sent", + "tag": "input", + "type": "range" + }, + "originalAuditVerdict": null, + "runtimeErrors": [], + "visuallyInspected": true + }, + { + "revision": "f009de5838f80b90e861e5727f0ad11cba8814f8", + "pluginRevision": "9de99949792c2c59b70693c1dcda6aa8cf36b428", + "provider": "codex", + "prompt": "load-balancer", + "width": 710, + "index": 3, + "label": "What the model represents", + "selector": "details > summary", + "verdict": "live", + "reason": "Actual summary click expands the previously hidden explanatory paragraphs; read-only details.open changes false to true and actual PNGs show the new text.", + "mode": "manual-real-input", + "automaticPass": false, + "v3Result": { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/codex/load-balancer/result.json", + "sha256": "5e7b08e6f54782389e16ec5e40b4d2a1544e712f0b5b4c0d786d3a1e069584ec" + }, + "source": { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/manual-plan-sources/prototype-codex-load-balancer.html", + "sha256": "5dd95aac25ff2c5d2d32bcd17f56abffc1ebbc7fa2b69bfbfce3a6b3dd925d3b" + }, + "request": { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/requests/request-17-codex-load-balancer-disclosure.json", + "sha256": "bb7420b09285dbaf113ba04e2495c038d3dddef91acafc5dd495363203527b56" + }, + "identityMatch": true, + "inventoryMatch": true, + "runtimeErrors": [], + "visuallyInspected": true, + "evidence": [ + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/17-codex-load-balancer-disclosure-before2.png", + "sha256": "f0af9a6217ed87e791ca55802833526de5110a000ad68e30889aa787d774dd14", + "role": "before2" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/17-codex-load-balancer-disclosure-after0.png", + "sha256": "faec2d6a0cb9f9917c0fce0ef3ad827dbcc06c26f74b9131ee7e1eb66675b2b2", + "role": "after0" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/pairs/17-codex-load-balancer-disclosure.png", + "sha256": "c0c0bd8a6348b169b432087e4ef708a48744bacb980c073fe51d17c1a85f87e4", + "role": "visually inspected comparison" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/request-17-codex-load-balancer-disclosure.log", + "sha256": "ed374e841c1c9b2074205a0519e2aef4dc33aa3465e91916cdee5f293f599d27", + "role": "real input log" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/request-17-codex-load-balancer-disclosure.exit.json", + "sha256": "a95926e80452fc493794cc3d6704d20062ca43f7534b41d738866b2f127baef1", + "role": "exit" + } + ], + "replayReview": { + "revision": "f009de5838f80b90e861e5727f0ad11cba8814f8", + "pluginRevision": "9de99949792c2c59b70693c1dcda6aa8cf36b428", + "provider": "codex", + "prompt": "load-balancer", + "width": 710, + "index": 3, + "label": "What the model represents", + "verdict": "live", + "reason": "Actual click pair collapses the open explanatory paragraph beneath What the model represents. Output disappears as expected; no autonomous animation explains this.", + "mode": "click", + "automaticPass": false, + "v3Result": { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/codex/load-balancer/result.json", + "sha256": "5e7b08e6f54782389e16ec5e40b4d2a1544e712f0b5b4c0d786d3a1e069584ec" + }, + "evidence": [ + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/codex/load-balancer/width-710/control-3-click-before2.png", + "sha256": "1ecb8b05a85b5c87e30abf3ce5f06a7e42c1af224d0e579aeb097a964869246b", + "role": "before2" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/codex/load-balancer/width-710/control-3-click-after0.png", + "sha256": "70da1b29ae9fe2983b09aa8a9f7df6ff6ca07b56f9df6e4c952674075a30518a", + "role": "after0" + } + ], + "allProbeFrames": [ + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/codex/load-balancer/width-710/control-3-click-before0.png", + "sha256": "1ecb8b05a85b5c87e30abf3ce5f06a7e42c1af224d0e579aeb097a964869246b" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/codex/load-balancer/width-710/control-3-click-before1.png", + "sha256": "1ecb8b05a85b5c87e30abf3ce5f06a7e42c1af224d0e579aeb097a964869246b" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/codex/load-balancer/width-710/control-3-click-before2.png", + "sha256": "1ecb8b05a85b5c87e30abf3ce5f06a7e42c1af224d0e579aeb097a964869246b" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/codex/load-balancer/width-710/control-3-click-after0.png", + "sha256": "70da1b29ae9fe2983b09aa8a9f7df6ff6ca07b56f9df6e4c952674075a30518a" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/codex/load-balancer/width-710/control-3-click-after1.png", + "sha256": "70da1b29ae9fe2983b09aa8a9f7df6ff6ca07b56f9df6e4c952674075a30518a" + } + ], + "source": { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/manual-plan-sources/prototype-codex-load-balancer.html", + "sha256": "5dd95aac25ff2c5d2d32bcd17f56abffc1ebbc7fa2b69bfbfce3a6b3dd925d3b" + }, + "identityMatch": true, + "oldIdentity": { + "index": 3, + "label": "What the model represents", + "tag": "summary", + "type": "" + }, + "originalAuditVerdict": null, + "runtimeErrors": [], + "visuallyInspected": true + } + }, + { + "revision": "f009de5838f80b90e861e5727f0ad11cba8814f8", + "pluginRevision": "9de99949792c2c59b70693c1dcda6aa8cf36b428", + "provider": "codex", + "prompt": "notification-settings", + "width": 598, + "index": 0, + "label": "Email notifications", + "selector": "[data-param=\"email\"]", + "verdict": "live", + "reason": "After opening preview, Email click removes its example while keeping Push; meaningful external text change.", + "mode": "manual-real-input", + "automaticPass": false, + "v3Result": { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/codex/notification-settings/result.json", + "sha256": "9288ebb06f17cd71a3dd1bd6eccaf65e6a09a862b6c9d2a92c27e2ea2599d0aa" + }, + "source": { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/manual-plan-sources/prototype-codex-notification-settings.html", + "sha256": "f81d5cdb0bb999c43d41b308a2102a0f5c731c0c5922bd9ae5f334997a95dbae" + }, + "request": { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/requests/request-07-codex-notification-preview.json", + "sha256": "f16d72a4f668d4216ee21d081ee59a823c251222c15070638f255be931aa901c" + }, + "identityMatch": true, + "inventoryMatch": true, + "runtimeErrors": [], + "visuallyInspected": true, + "evidence": [ + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/07-codex-notification-preview-email-before2.png", + "sha256": "c47e2f7ce05a35fe03c824ebf0f52c90d05237fdbf4df0b28376981f81b1a8d8", + "role": "before2" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/07-codex-notification-preview-email-after0.png", + "sha256": "6f55028bff3588dd2ada6beed5e1a874c62b9fa4c2236e42a2cdbf646b945749", + "role": "after0" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/pairs/07-codex-notification-preview-email.png", + "sha256": "b38e5720593ac90555903865ec80ebf7a62ad58c28573bf6aab28bf4708384e6", + "role": "visually inspected comparison" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/request-07-codex-notification-preview.log", + "sha256": "eb5db1962deb1dd447c5d98e9b20cff17cd71f0b54635897a854e72fb7484506", + "role": "real input log" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/request-07-codex-notification-preview.exit.json", + "sha256": "fb1ca2118cf61bed0a0a07ce25dee0f4b8ce3d85701125c0c05050687892d176", + "role": "exit" + } + ], + "replayReview": { + "revision": "f009de5838f80b90e861e5727f0ad11cba8814f8", + "pluginRevision": "9de99949792c2c59b70693c1dcda6aa8cf36b428", + "provider": "codex", + "prompt": "notification-settings", + "width": 598, + "index": 0, + "label": "Email notifications", + "verdict": "unproven", + "reason": "Actual click frames change only the toggle appearance while the independent preview remains hidden. Saved source updates hidden preview text, but this is not visual proof. Await queued real Preview click followed by toggles.", + "mode": "click", + "automaticPass": false, + "v3Result": { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/codex/notification-settings/result.json", + "sha256": "9288ebb06f17cd71a3dd1bd6eccaf65e6a09a862b6c9d2a92c27e2ea2599d0aa" + }, + "evidence": [ + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/codex/notification-settings/width-598/control-0-click-before2.png", + "sha256": "dcddb3d8ebf6dc409e261674d694adc985cd04da21b0eb20dbaceb5a4915b6e7", + "role": "before2" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/codex/notification-settings/width-598/control-0-click-after0.png", + "sha256": "b76498af60be9de80c11d2180f3e6d58527a089656efb942fe082f6e5a6d4145", + "role": "after0" + } + ], + "allProbeFrames": [ + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/codex/notification-settings/width-598/control-0-click-before0.png", + "sha256": "dcddb3d8ebf6dc409e261674d694adc985cd04da21b0eb20dbaceb5a4915b6e7" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/codex/notification-settings/width-598/control-0-click-before1.png", + "sha256": "dcddb3d8ebf6dc409e261674d694adc985cd04da21b0eb20dbaceb5a4915b6e7" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/codex/notification-settings/width-598/control-0-click-before2.png", + "sha256": "dcddb3d8ebf6dc409e261674d694adc985cd04da21b0eb20dbaceb5a4915b6e7" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/codex/notification-settings/width-598/control-0-click-after0.png", + "sha256": "b76498af60be9de80c11d2180f3e6d58527a089656efb942fe082f6e5a6d4145" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/codex/notification-settings/width-598/control-0-click-after1.png", + "sha256": "b76498af60be9de80c11d2180f3e6d58527a089656efb942fe082f6e5a6d4145" + } + ], + "source": { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/manual-plan-sources/prototype-codex-notification-settings.html", + "sha256": "f81d5cdb0bb999c43d41b308a2102a0f5c731c0c5922bd9ae5f334997a95dbae" + }, + "identityMatch": true, + "oldIdentity": { + "index": 0, + "label": "Email notifications", + "tag": "div", + "type": "button" + }, + "originalAuditVerdict": null, + "runtimeErrors": [], + "visuallyInspected": true + } + }, + { + "revision": "f009de5838f80b90e861e5727f0ad11cba8814f8", + "pluginRevision": "9de99949792c2c59b70693c1dcda6aa8cf36b428", + "provider": "codex", + "prompt": "notification-settings", + "width": 598, + "index": 1, + "label": "Push notifications", + "selector": "[data-param=\"push\"]", + "verdict": "live", + "reason": "With preview visible, Push click changes the Push example to All notifications are off.", + "mode": "manual-real-input", + "automaticPass": false, + "v3Result": { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/codex/notification-settings/result.json", + "sha256": "9288ebb06f17cd71a3dd1bd6eccaf65e6a09a862b6c9d2a92c27e2ea2599d0aa" + }, + "source": { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/manual-plan-sources/prototype-codex-notification-settings.html", + "sha256": "f81d5cdb0bb999c43d41b308a2102a0f5c731c0c5922bd9ae5f334997a95dbae" + }, + "request": { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/requests/request-07-codex-notification-preview.json", + "sha256": "f16d72a4f668d4216ee21d081ee59a823c251222c15070638f255be931aa901c" + }, + "identityMatch": true, + "inventoryMatch": true, + "runtimeErrors": [], + "visuallyInspected": true, + "evidence": [ + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/07-codex-notification-preview-push-before2.png", + "sha256": "6f55028bff3588dd2ada6beed5e1a874c62b9fa4c2236e42a2cdbf646b945749", + "role": "before2" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/07-codex-notification-preview-push-after0.png", + "sha256": "aa450a51ac2464bd4d09f107bf9303893bd07a2cab2086fdf216b5caa632746b", + "role": "after0" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/pairs/07-codex-notification-preview-push.png", + "sha256": "55c672acaf1c70bed43eb6ac3ffb1f3b2386271bd36832ed4f49d3a3d69c71f6", + "role": "visually inspected comparison" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/request-07-codex-notification-preview.log", + "sha256": "eb5db1962deb1dd447c5d98e9b20cff17cd71f0b54635897a854e72fb7484506", + "role": "real input log" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/request-07-codex-notification-preview.exit.json", + "sha256": "fb1ca2118cf61bed0a0a07ce25dee0f4b8ce3d85701125c0c05050687892d176", + "role": "exit" + } + ], + "replayReview": { + "revision": "f009de5838f80b90e861e5727f0ad11cba8814f8", + "pluginRevision": "9de99949792c2c59b70693c1dcda6aa8cf36b428", + "provider": "codex", + "prompt": "notification-settings", + "width": 598, + "index": 1, + "label": "Push notifications", + "verdict": "unproven", + "reason": "Actual click frames change only the toggle appearance while the independent preview remains hidden. Saved source updates hidden preview text, but this is not visual proof. Await queued real Preview click followed by toggles.", + "mode": "click", + "automaticPass": false, + "v3Result": { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/codex/notification-settings/result.json", + "sha256": "9288ebb06f17cd71a3dd1bd6eccaf65e6a09a862b6c9d2a92c27e2ea2599d0aa" + }, + "evidence": [ + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/codex/notification-settings/width-598/control-1-click-before2.png", + "sha256": "3540cb82e09417c18f697a05215afb277c44975a80da42ade41a578b86ad929c", + "role": "before2" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/codex/notification-settings/width-598/control-1-click-after0.png", + "sha256": "b76498af60be9de80c11d2180f3e6d58527a089656efb942fe082f6e5a6d4145", + "role": "after0" + } + ], + "allProbeFrames": [ + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/codex/notification-settings/width-598/control-1-click-before0.png", + "sha256": "3540cb82e09417c18f697a05215afb277c44975a80da42ade41a578b86ad929c" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/codex/notification-settings/width-598/control-1-click-before1.png", + "sha256": "3540cb82e09417c18f697a05215afb277c44975a80da42ade41a578b86ad929c" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/codex/notification-settings/width-598/control-1-click-before2.png", + "sha256": "3540cb82e09417c18f697a05215afb277c44975a80da42ade41a578b86ad929c" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/codex/notification-settings/width-598/control-1-click-after0.png", + "sha256": "b76498af60be9de80c11d2180f3e6d58527a089656efb942fe082f6e5a6d4145" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/codex/notification-settings/width-598/control-1-click-after1.png", + "sha256": "b76498af60be9de80c11d2180f3e6d58527a089656efb942fe082f6e5a6d4145" + } + ], + "source": { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/manual-plan-sources/prototype-codex-notification-settings.html", + "sha256": "f81d5cdb0bb999c43d41b308a2102a0f5c731c0c5922bd9ae5f334997a95dbae" + }, + "identityMatch": true, + "oldIdentity": { + "index": 1, + "label": "Push notifications", + "tag": "div", + "type": "button" + }, + "originalAuditVerdict": null, + "runtimeErrors": [], + "visuallyInspected": true + } + }, + { + "revision": "f009de5838f80b90e861e5727f0ad11cba8814f8", + "pluginRevision": "9de99949792c2c59b70693c1dcda6aa8cf36b428", + "provider": "codex", + "prompt": "notification-settings", + "width": 598, + "index": 2, + "label": "Daily digest", + "selector": "[data-param=\"digest\"]", + "verdict": "live", + "reason": "Daily digest click exposes the schedule select and changes external preview to Daily digest at 9 AM.", + "mode": "manual-real-input", + "automaticPass": false, + "v3Result": { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/codex/notification-settings/result.json", + "sha256": "9288ebb06f17cd71a3dd1bd6eccaf65e6a09a862b6c9d2a92c27e2ea2599d0aa" + }, + "source": { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/manual-plan-sources/prototype-codex-notification-settings.html", + "sha256": "f81d5cdb0bb999c43d41b308a2102a0f5c731c0c5922bd9ae5f334997a95dbae" + }, + "request": { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/requests/request-07-codex-notification-preview.json", + "sha256": "f16d72a4f668d4216ee21d081ee59a823c251222c15070638f255be931aa901c" + }, + "identityMatch": true, + "inventoryMatch": true, + "runtimeErrors": [], + "visuallyInspected": true, + "evidence": [ + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/07-codex-notification-preview-digest-before2.png", + "sha256": "aa450a51ac2464bd4d09f107bf9303893bd07a2cab2086fdf216b5caa632746b", + "role": "before2" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/07-codex-notification-preview-digest-after0.png", + "sha256": "67c1066b59329f1874496f530a2ed553a6da17ee7d08db8deb5959889d5c3d29", + "role": "after0" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/pairs/07-codex-notification-preview-digest.png", + "sha256": "1d5a6731c1f20ba98aacf643bfbf3058ed14017925ab3d5f3bd5c9fe8c57ee4a", + "role": "visually inspected comparison" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/request-07-codex-notification-preview.log", + "sha256": "eb5db1962deb1dd447c5d98e9b20cff17cd71f0b54635897a854e72fb7484506", + "role": "real input log" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/request-07-codex-notification-preview.exit.json", + "sha256": "fb1ca2118cf61bed0a0a07ce25dee0f4b8ce3d85701125c0c05050687892d176", + "role": "exit" + } + ], + "replayReview": { + "revision": "f009de5838f80b90e861e5727f0ad11cba8814f8", + "pluginRevision": "9de99949792c2c59b70693c1dcda6aa8cf36b428", + "provider": "codex", + "prompt": "notification-settings", + "width": 598, + "index": 2, + "label": "Daily digest", + "verdict": "live", + "reason": "Actual click frames remove the dependent Delivery time selector when Daily digest turns off. That is a meaningful conditional settings change beyond toggle styling; the separate delivery-time behavior still needs its own input proof.", + "mode": "click", + "automaticPass": false, + "v3Result": { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/codex/notification-settings/result.json", + "sha256": "9288ebb06f17cd71a3dd1bd6eccaf65e6a09a862b6c9d2a92c27e2ea2599d0aa" + }, + "evidence": [ + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/codex/notification-settings/width-598/control-2-click-before2.png", + "sha256": "ddaa98b2584510a0c0428a8c6dba67911e0c9663a4f028a77a7b4d4647215478", + "role": "before2" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/codex/notification-settings/width-598/control-2-click-after0.png", + "sha256": "b76498af60be9de80c11d2180f3e6d58527a089656efb942fe082f6e5a6d4145", + "role": "after0" + } + ], + "allProbeFrames": [ + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/codex/notification-settings/width-598/control-2-click-before0.png", + "sha256": "ddaa98b2584510a0c0428a8c6dba67911e0c9663a4f028a77a7b4d4647215478" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/codex/notification-settings/width-598/control-2-click-before1.png", + "sha256": "ddaa98b2584510a0c0428a8c6dba67911e0c9663a4f028a77a7b4d4647215478" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/codex/notification-settings/width-598/control-2-click-before2.png", + "sha256": "ddaa98b2584510a0c0428a8c6dba67911e0c9663a4f028a77a7b4d4647215478" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/codex/notification-settings/width-598/control-2-click-after0.png", + "sha256": "b76498af60be9de80c11d2180f3e6d58527a089656efb942fe082f6e5a6d4145" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/codex/notification-settings/width-598/control-2-click-after1.png", + "sha256": "b76498af60be9de80c11d2180f3e6d58527a089656efb942fe082f6e5a6d4145" + } + ], + "source": { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/manual-plan-sources/prototype-codex-notification-settings.html", + "sha256": "f81d5cdb0bb999c43d41b308a2102a0f5c731c0c5922bd9ae5f334997a95dbae" + }, + "identityMatch": true, + "oldIdentity": { + "index": 2, + "label": "Daily digest", + "tag": "div", + "type": "button" + }, + "originalAuditVerdict": null, + "runtimeErrors": [], + "visuallyInspected": true + } + }, + { + "revision": "f009de5838f80b90e861e5727f0ad11cba8814f8", + "pluginRevision": "9de99949792c2c59b70693c1dcda6aa8cf36b428", + "provider": "codex", + "prompt": "notification-settings", + "width": 598, + "index": 3, + "label": "Preview notifications", + "selector": "#test", + "verdict": "live", + "reason": "Click Preview notifications reveals the external preview panel with Email and Push examples.", + "mode": "manual-real-input", + "automaticPass": false, + "v3Result": { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/codex/notification-settings/result.json", + "sha256": "9288ebb06f17cd71a3dd1bd6eccaf65e6a09a862b6c9d2a92c27e2ea2599d0aa" + }, + "source": { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/manual-plan-sources/prototype-codex-notification-settings.html", + "sha256": "f81d5cdb0bb999c43d41b308a2102a0f5c731c0c5922bd9ae5f334997a95dbae" + }, + "request": { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/requests/request-07-codex-notification-preview.json", + "sha256": "f16d72a4f668d4216ee21d081ee59a823c251222c15070638f255be931aa901c" + }, + "identityMatch": true, + "inventoryMatch": true, + "runtimeErrors": [], + "visuallyInspected": true, + "evidence": [ + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/07-codex-notification-preview-before2.png", + "sha256": "b76498af60be9de80c11d2180f3e6d58527a089656efb942fe082f6e5a6d4145", + "role": "before2" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/07-codex-notification-preview-after0.png", + "sha256": "c47e2f7ce05a35fe03c824ebf0f52c90d05237fdbf4df0b28376981f81b1a8d8", + "role": "after0" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/pairs/07-codex-notification-preview.png", + "sha256": "159629e3b76d47d2819b444ca2f9949f002c422de34f6bff5452724ecbdedbe5", + "role": "visually inspected comparison" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/request-07-codex-notification-preview.log", + "sha256": "eb5db1962deb1dd447c5d98e9b20cff17cd71f0b54635897a854e72fb7484506", + "role": "real input log" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/request-07-codex-notification-preview.exit.json", + "sha256": "fb1ca2118cf61bed0a0a07ce25dee0f4b8ce3d85701125c0c05050687892d176", + "role": "exit" + } + ], + "replayReview": { + "revision": "f009de5838f80b90e861e5727f0ad11cba8814f8", + "pluginRevision": "9de99949792c2c59b70693c1dcda6aa8cf36b428", + "provider": "codex", + "prompt": "notification-settings", + "width": 598, + "index": 3, + "label": "Preview notifications", + "verdict": "live", + "reason": "Actual Preview click frames reveal the notification preview panel and its Email/Push messages. This is newly visible content; no autonomous state change exists in the saved handler.", + "mode": "primary", + "automaticPass": false, + "v3Result": { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/codex/notification-settings/result.json", + "sha256": "9288ebb06f17cd71a3dd1bd6eccaf65e6a09a862b6c9d2a92c27e2ea2599d0aa" + }, + "evidence": [ + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/codex/notification-settings/width-598/control-3-primary-before2.png", + "sha256": "b585484c4674f7ac8c53701e95a4184ada704565c359b82fe0a93f8048707e76", + "role": "before2" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/codex/notification-settings/width-598/control-3-primary-after0.png", + "sha256": "c47e2f7ce05a35fe03c824ebf0f52c90d05237fdbf4df0b28376981f81b1a8d8", + "role": "after0" + } + ], + "allProbeFrames": [ + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/codex/notification-settings/width-598/control-3-primary-before0.png", + "sha256": "b585484c4674f7ac8c53701e95a4184ada704565c359b82fe0a93f8048707e76" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/codex/notification-settings/width-598/control-3-primary-before1.png", + "sha256": "b585484c4674f7ac8c53701e95a4184ada704565c359b82fe0a93f8048707e76" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/codex/notification-settings/width-598/control-3-primary-before2.png", + "sha256": "b585484c4674f7ac8c53701e95a4184ada704565c359b82fe0a93f8048707e76" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/codex/notification-settings/width-598/control-3-primary-after0.png", + "sha256": "c47e2f7ce05a35fe03c824ebf0f52c90d05237fdbf4df0b28376981f81b1a8d8" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/codex/notification-settings/width-598/control-3-primary-after1.png", + "sha256": "c47e2f7ce05a35fe03c824ebf0f52c90d05237fdbf4df0b28376981f81b1a8d8" + } + ], + "source": { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/manual-plan-sources/prototype-codex-notification-settings.html", + "sha256": "f81d5cdb0bb999c43d41b308a2102a0f5c731c0c5922bd9ae5f334997a95dbae" + }, + "identityMatch": true, + "oldIdentity": { + "index": 3, + "label": "Preview notifications", + "tag": "button", + "type": "submit" + }, + "originalAuditVerdict": null, + "runtimeErrors": [], + "visuallyInspected": true + } + }, + { + "revision": "f009de5838f80b90e861e5727f0ad11cba8814f8", + "pluginRevision": "9de99949792c2c59b70693c1dcda6aa8cf36b428", + "provider": "codex", + "prompt": "notification-settings", + "width": 598, + "index": 4, + "label": "Delivery time \u00b7 your local time", + "selector": "[data-param=\"digest_time\"] select", + "verdict": "live", + "reason": "After enabling Daily digest and preview, real Home/Enter then End/Enter changes 7 AM to 6 PM in both select and external preview.", + "mode": "manual-real-input", + "automaticPass": false, + "v3Result": { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/codex/notification-settings/result.json", + "sha256": "9288ebb06f17cd71a3dd1bd6eccaf65e6a09a862b6c9d2a92c27e2ea2599d0aa" + }, + "source": { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/manual-plan-sources/prototype-codex-notification-settings.html", + "sha256": "f81d5cdb0bb999c43d41b308a2102a0f5c731c0c5922bd9ae5f334997a95dbae" + }, + "request": { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/requests/request-07-codex-notification-preview.json", + "sha256": "f16d72a4f668d4216ee21d081ee59a823c251222c15070638f255be931aa901c" + }, + "identityMatch": true, + "inventoryMatch": true, + "runtimeErrors": [], + "visuallyInspected": true, + "evidence": [ + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/07-codex-notification-preview-time-before2.png", + "sha256": "1f1ba70fb3e3bf8f5f7943e4aa58f37432e75c093445e644e1d6fa31c8969900", + "role": "before2" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/07-codex-notification-preview-time-after0.png", + "sha256": "ccb9d8768d523399bbcbd27506138f6e5cc8e4719fb3fc4331951832ae01f64c", + "role": "after0" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/pairs/07-codex-notification-preview-time.png", + "sha256": "b5c5493164ce506b2a8b60bcbe90b0ab6aa36555df59bbb0decdf186eeebc84d", + "role": "visually inspected comparison" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/request-07-codex-notification-preview.log", + "sha256": "eb5db1962deb1dd447c5d98e9b20cff17cd71f0b54635897a854e72fb7484506", + "role": "real input log" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/request-07-codex-notification-preview.exit.json", + "sha256": "fb1ca2118cf61bed0a0a07ce25dee0f4b8ce3d85701125c0c05050687892d176", + "role": "exit" + } + ], + "replayReview": { + "revision": "f009de5838f80b90e861e5727f0ad11cba8814f8", + "pluginRevision": "9de99949792c2c59b70693c1dcda6aa8cf36b428", + "provider": "codex", + "prompt": "notification-settings", + "width": 598, + "index": 4, + "label": "Delivery time \u00b7 your local time", + "verdict": "unproven", + "reason": "The scorer retained the newly exposed Delivery time control but did not interact with it. It is visibly present at 9 AM in the inspected digest-before frame. Await queued native-key Home/Enter to End/Enter proof with preview visible.", + "mode": null, + "automaticPass": false, + "v3Result": { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/codex/notification-settings/result.json", + "sha256": "9288ebb06f17cd71a3dd1bd6eccaf65e6a09a862b6c9d2a92c27e2ea2599d0aa" + }, + "evidence": [ + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/codex/notification-settings/width-598/control-2-click-before2.png", + "sha256": "ddaa98b2584510a0c0428a8c6dba67911e0c9663a4f028a77a7b4d4647215478", + "role": "additional inspected evidence" + } + ], + "allProbeFrames": [], + "source": { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/manual-plan-sources/prototype-codex-notification-settings.html", + "sha256": "f81d5cdb0bb999c43d41b308a2102a0f5c731c0c5922bd9ae5f334997a95dbae" + }, + "identityMatch": true, + "oldIdentity": { + "index": 4, + "label": "Delivery time \u00b7 your local time", + "tag": "select", + "type": "select-one" + }, + "originalAuditVerdict": null, + "runtimeErrors": [], + "visuallyInspected": true, + "missingVisualEvidence": "No delivery-time interaction frames exist; supporting screenshot only shows exposed selector." + } + }, + { + "revision": "f009de5838f80b90e861e5727f0ad11cba8814f8", + "pluginRevision": "9de99949792c2c59b70693c1dcda6aa8cf36b428", + "provider": "codex", + "prompt": "refrigerator", + "width": 710, + "index": 0, + "label": "Inside: heat absorbedRoom: heat releasedCompressorExpansion restriction", + "verdict": "live", + "reason": "Actual ArrowRight frames move the refrigerant marker from evaporator to compressor and replace the explanation and readout with compression. The source explicitly increments phase for ArrowRight; no autonomous motion can explain this state change.", + "mode": "key-ArrowRight", + "automaticPass": true, + "v3Result": { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/codex/refrigerator/result.json", + "sha256": "6343a865a83a503506f0e0fc0560c0610b485048e03abba750d32f1a0c40a902" + }, + "evidence": [ + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/codex/refrigerator/width-710/control-0-key-ArrowRight-before2.png", + "sha256": "a08a0d91b36f5a90bbeafe1cc0704d000785f499cbaabae25703d3def40ad628", + "role": "before2" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/codex/refrigerator/width-710/control-0-key-ArrowRight-after0.png", + "sha256": "166f795017c6126b1729abd462189297e25d5c94fb76806706738765a8f73460", + "role": "after0" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/replay-pairs/prototype/codex/refrigerator-710-0.png", + "sha256": "abc17812857150d43f3558291db236530d3a4fa8c2a49df9c919a62fa529201c", + "role": "visually inspected comparison" + } + ], + "allProbeFrames": [ + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/codex/refrigerator/width-710/control-0-key-ArrowRight-before0.png", + "sha256": "a08a0d91b36f5a90bbeafe1cc0704d000785f499cbaabae25703d3def40ad628" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/codex/refrigerator/width-710/control-0-key-ArrowRight-before1.png", + "sha256": "a08a0d91b36f5a90bbeafe1cc0704d000785f499cbaabae25703d3def40ad628" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/codex/refrigerator/width-710/control-0-key-ArrowRight-before2.png", + "sha256": "a08a0d91b36f5a90bbeafe1cc0704d000785f499cbaabae25703d3def40ad628" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/codex/refrigerator/width-710/control-0-key-ArrowRight-after0.png", + "sha256": "166f795017c6126b1729abd462189297e25d5c94fb76806706738765a8f73460" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/codex/refrigerator/width-710/control-0-key-ArrowRight-after1.png", + "sha256": "166f795017c6126b1729abd462189297e25d5c94fb76806706738765a8f73460" + } + ], + "source": { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/manual-plan-sources/prototype-codex-refrigerator.html", + "sha256": "58cfc415d6a48b8aa8e80bdf2c7b3eff1fc00b92879e102b400a077159444fe1" + }, + "identityMatch": true, + "oldIdentity": { + "index": 0, + "label": "Inside: heat absorbedRoom: heat releasedCompressorExpansion restriction", + "tag": "div", + "type": "" + }, + "originalAuditVerdict": null, + "runtimeErrors": [], + "visuallyInspected": true + }, + { + "revision": "f009de5838f80b90e861e5727f0ad11cba8814f8", + "pluginRevision": "9de99949792c2c59b70693c1dcda6aa8cf36b428", + "provider": "codex", + "prompt": "seat-belt", + "width": 710, + "index": 0, + "label": "Belt reelBelt \u2192Locking catchInertia weight", + "verdict": "live", + "reason": "The actual supported ArrowRight pair changes Normal to Sudden braking, moves the pendulum/link and engages the catch, with a matching payout-blocked readout. Saved handler updates local mode and draws synchronously; no incidental animation is involved.", + "mode": "key-ArrowRight", + "automaticPass": true, + "v3Result": { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/codex/seat-belt/result.json", + "sha256": "7128f5ae9629ba1d998ca8fd84f676e7627ab0ebfd4440a93cc7a2fed0b3681b" + }, + "evidence": [ + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/codex/seat-belt/width-710/control-0-key-ArrowRight-before2.png", + "sha256": "2987fdbf9e9ffa7ff9e3034951575c8363462dad3fa3151b68b1bedc4d872064", + "role": "before2" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/codex/seat-belt/width-710/control-0-key-ArrowRight-after0.png", + "sha256": "657a2a7b57b0ab218715d29e0b723ea05f2f8deb7529be710cccebdab33e02d5", + "role": "after0" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/replay-pairs/prototype/codex/seat-belt-710-0.png", + "sha256": "4a2b2389741a64bc73ef3134af11fa2aa0a22d3d28635732b3a5ca0263e20823", + "role": "visually inspected comparison" + } + ], + "allProbeFrames": [ + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/codex/seat-belt/width-710/control-0-key-ArrowRight-before0.png", + "sha256": "2987fdbf9e9ffa7ff9e3034951575c8363462dad3fa3151b68b1bedc4d872064" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/codex/seat-belt/width-710/control-0-key-ArrowRight-before1.png", + "sha256": "2987fdbf9e9ffa7ff9e3034951575c8363462dad3fa3151b68b1bedc4d872064" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/codex/seat-belt/width-710/control-0-key-ArrowRight-before2.png", + "sha256": "2987fdbf9e9ffa7ff9e3034951575c8363462dad3fa3151b68b1bedc4d872064" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/codex/seat-belt/width-710/control-0-key-ArrowRight-after0.png", + "sha256": "657a2a7b57b0ab218715d29e0b723ea05f2f8deb7529be710cccebdab33e02d5" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/codex/seat-belt/width-710/control-0-key-ArrowRight-after1.png", + "sha256": "657a2a7b57b0ab218715d29e0b723ea05f2f8deb7529be710cccebdab33e02d5" + } + ], + "source": { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/manual-plan-sources/prototype-codex-seat-belt.html", + "sha256": "9114e72fdd8cb308de7799fddab3a22d0623bee9770c24898b8e6f13ed9b0da2" + }, + "identityMatch": true, + "oldIdentity": { + "index": 0, + "label": "Belt reelBelt \u2192Locking catchInertia weight", + "tag": "div", + "type": "" + }, + "originalAuditVerdict": null, + "runtimeErrors": [], + "visuallyInspected": true + }, + { + "revision": "f009de5838f80b90e861e5727f0ad11cba8814f8", + "pluginRevision": "9de99949792c2c59b70693c1dcda6aa8cf36b428", + "provider": "codex", + "prompt": "spray-bottle", + "width": 710, + "index": 0, + "label": "Spray bottle pump. Right arrow squeezes; left arrow releases.", + "verdict": "dead", + "reason": "Actual supported-input frames retain the release state, open inlet, closed outlet and unchanged explanation. The generated source defines stroke as type string with value squeeze; the frozen bridge only handles text/toggle specially and otherwise numeric-normalizes with default 0. Both squeeze/release strings therefore stay 0 and cannot trigger the intended state change. This is a parameter-contract defect, not a missing visual threshold.", + "mode": "key-ArrowRight", + "automaticPass": false, + "v3Result": { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/codex/spray-bottle/result.json", + "sha256": "0db03fcce6247c6d588500c618e249ed3b843c01fc427d87dfa2a001ce33b718" + }, + "evidence": [ + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/codex/spray-bottle/width-710/control-0-key-ArrowRight-before2.png", + "sha256": "e1a58c13f6ed83971a47c2b3bbfe9cfdc14f2867fb89f4cf1d11fb2f433f05dd", + "role": "before2" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/codex/spray-bottle/width-710/control-0-key-ArrowRight-after0.png", + "sha256": "e1a58c13f6ed83971a47c2b3bbfe9cfdc14f2867fb89f4cf1d11fb2f433f05dd", + "role": "after0" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/prototype/plugins/playgrounds/controls.ts", + "sha256": "46fb54957b04f70721f6f0a5df41d852149c3d34d83141ad6ad4b1408c152af3", + "role": "additional inspected evidence" + } + ], + "allProbeFrames": [ + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/codex/spray-bottle/width-710/control-0-key-ArrowRight-before0.png", + "sha256": "e1a58c13f6ed83971a47c2b3bbfe9cfdc14f2867fb89f4cf1d11fb2f433f05dd" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/codex/spray-bottle/width-710/control-0-key-ArrowRight-before1.png", + "sha256": "e1a58c13f6ed83971a47c2b3bbfe9cfdc14f2867fb89f4cf1d11fb2f433f05dd" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/codex/spray-bottle/width-710/control-0-key-ArrowRight-before2.png", + "sha256": "e1a58c13f6ed83971a47c2b3bbfe9cfdc14f2867fb89f4cf1d11fb2f433f05dd" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/codex/spray-bottle/width-710/control-0-key-ArrowRight-after0.png", + "sha256": "e1a58c13f6ed83971a47c2b3bbfe9cfdc14f2867fb89f4cf1d11fb2f433f05dd" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/codex/spray-bottle/width-710/control-0-key-ArrowRight-after1.png", + "sha256": "e1a58c13f6ed83971a47c2b3bbfe9cfdc14f2867fb89f4cf1d11fb2f433f05dd" + } + ], + "source": { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/manual-plan-sources/prototype-codex-spray-bottle.html", + "sha256": "cda2bea3ac1fac2ce05ce0b8ecd771ed291297c5c3e4634341d17beca2dfa348" + }, + "identityMatch": true, + "oldIdentity": { + "index": 0, + "label": "Spray bottle pump. Right arrow squeezes; left arrow releases.", + "tag": "div", + "type": "" + }, + "originalAuditVerdict": null, + "runtimeErrors": [], + "visuallyInspected": true + }, + { + "revision": "f009de5838f80b90e861e5727f0ad11cba8814f8", + "pluginRevision": "9de99949792c2c59b70693c1dcda6aa8cf36b428", + "provider": "codex", + "prompt": "spray-bottle", + "width": 710, + "index": 1, + "label": "Squeeze trigger", + "verdict": "dead", + "reason": "Actual supported-input frames retain the release state, open inlet, closed outlet and unchanged explanation. The generated source defines stroke as type string with value squeeze; the frozen bridge only handles text/toggle specially and otherwise numeric-normalizes with default 0. Both squeeze/release strings therefore stay 0 and cannot trigger the intended state change. This is a parameter-contract defect, not a missing visual threshold.", + "mode": "primary", + "automaticPass": false, + "v3Result": { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/codex/spray-bottle/result.json", + "sha256": "0db03fcce6247c6d588500c618e249ed3b843c01fc427d87dfa2a001ce33b718" + }, + "evidence": [ + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/codex/spray-bottle/width-710/control-1-primary-before2.png", + "sha256": "4aa0217776eabb07ab01be4e9aaf9eaf15a95d09448ec11df3bdd2f06a18ee34", + "role": "before2" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/codex/spray-bottle/width-710/control-1-primary-after0.png", + "sha256": "4aa0217776eabb07ab01be4e9aaf9eaf15a95d09448ec11df3bdd2f06a18ee34", + "role": "after0" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/prototype/plugins/playgrounds/controls.ts", + "sha256": "46fb54957b04f70721f6f0a5df41d852149c3d34d83141ad6ad4b1408c152af3", + "role": "additional inspected evidence" + } + ], + "allProbeFrames": [ + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/codex/spray-bottle/width-710/control-1-primary-before0.png", + "sha256": "4aa0217776eabb07ab01be4e9aaf9eaf15a95d09448ec11df3bdd2f06a18ee34" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/codex/spray-bottle/width-710/control-1-primary-before1.png", + "sha256": "4aa0217776eabb07ab01be4e9aaf9eaf15a95d09448ec11df3bdd2f06a18ee34" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/codex/spray-bottle/width-710/control-1-primary-before2.png", + "sha256": "4aa0217776eabb07ab01be4e9aaf9eaf15a95d09448ec11df3bdd2f06a18ee34" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/codex/spray-bottle/width-710/control-1-primary-after0.png", + "sha256": "4aa0217776eabb07ab01be4e9aaf9eaf15a95d09448ec11df3bdd2f06a18ee34" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/codex/spray-bottle/width-710/control-1-primary-after1.png", + "sha256": "4aa0217776eabb07ab01be4e9aaf9eaf15a95d09448ec11df3bdd2f06a18ee34" + } + ], + "source": { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/manual-plan-sources/prototype-codex-spray-bottle.html", + "sha256": "cda2bea3ac1fac2ce05ce0b8ecd771ed291297c5c3e4634341d17beca2dfa348" + }, + "identityMatch": true, + "oldIdentity": { + "index": 1, + "label": "Squeeze trigger", + "tag": "button", + "type": "submit" + }, + "originalAuditVerdict": null, + "runtimeErrors": [], + "visuallyInspected": true + }, + { + "revision": "f009de5838f80b90e861e5727f0ad11cba8814f8", + "pluginRevision": "9de99949792c2c59b70693c1dcda6aa8cf36b428", + "provider": "codex", + "prompt": "spray-bottle", + "width": 710, + "index": 2, + "label": "Release trigger", + "verdict": "dead", + "reason": "Actual supported-input frames retain the release state, open inlet, closed outlet and unchanged explanation. The generated source defines stroke as type string with value squeeze; the frozen bridge only handles text/toggle specially and otherwise numeric-normalizes with default 0. Both squeeze/release strings therefore stay 0 and cannot trigger the intended state change. This is a parameter-contract defect, not a missing visual threshold.", + "mode": "primary", + "automaticPass": false, + "v3Result": { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/codex/spray-bottle/result.json", + "sha256": "0db03fcce6247c6d588500c618e249ed3b843c01fc427d87dfa2a001ce33b718" + }, + "evidence": [ + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/codex/spray-bottle/width-710/control-2-primary-before2.png", + "sha256": "4aa0217776eabb07ab01be4e9aaf9eaf15a95d09448ec11df3bdd2f06a18ee34", + "role": "before2" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/codex/spray-bottle/width-710/control-2-primary-after0.png", + "sha256": "4aa0217776eabb07ab01be4e9aaf9eaf15a95d09448ec11df3bdd2f06a18ee34", + "role": "after0" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/prototype/plugins/playgrounds/controls.ts", + "sha256": "46fb54957b04f70721f6f0a5df41d852149c3d34d83141ad6ad4b1408c152af3", + "role": "additional inspected evidence" + } + ], + "allProbeFrames": [ + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/codex/spray-bottle/width-710/control-2-primary-before0.png", + "sha256": "4aa0217776eabb07ab01be4e9aaf9eaf15a95d09448ec11df3bdd2f06a18ee34" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/codex/spray-bottle/width-710/control-2-primary-before1.png", + "sha256": "4aa0217776eabb07ab01be4e9aaf9eaf15a95d09448ec11df3bdd2f06a18ee34" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/codex/spray-bottle/width-710/control-2-primary-before2.png", + "sha256": "4aa0217776eabb07ab01be4e9aaf9eaf15a95d09448ec11df3bdd2f06a18ee34" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/codex/spray-bottle/width-710/control-2-primary-after0.png", + "sha256": "4aa0217776eabb07ab01be4e9aaf9eaf15a95d09448ec11df3bdd2f06a18ee34" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/codex/spray-bottle/width-710/control-2-primary-after1.png", + "sha256": "4aa0217776eabb07ab01be4e9aaf9eaf15a95d09448ec11df3bdd2f06a18ee34" + } + ], + "source": { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/manual-plan-sources/prototype-codex-spray-bottle.html", + "sha256": "cda2bea3ac1fac2ce05ce0b8ecd771ed291297c5c3e4634341d17beca2dfa348" + }, + "identityMatch": true, + "oldIdentity": { + "index": 2, + "label": "Release trigger", + "tag": "button", + "type": "submit" + }, + "originalAuditVerdict": null, + "runtimeErrors": [], + "visuallyInspected": true + }, + { + "revision": "f009de5838f80b90e861e5727f0ad11cba8814f8", + "pluginRevision": "9de99949792c2c59b70693c1dcda6aa8cf36b428", + "provider": "codex", + "prompt": "stapler", + "width": 710, + "index": 0, + "label": "Stapling cycle. Use left and right arrows.", + "verdict": "live", + "reason": "The actual ArrowRight pair changes Ready to Press: handle and magazine lower, driver moves, and the explanation changes. Source explicitly increments step on ArrowRight; no autonomous animation exists.", + "mode": "key-ArrowRight", + "automaticPass": true, + "v3Result": { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/codex/stapler/result.json", + "sha256": "047bd19b2bf32790de9aabaccd4e9c3555e44a7dcba858303d29b3930b90749a" + }, + "evidence": [ + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/codex/stapler/width-710/control-0-key-ArrowRight-before2.png", + "sha256": "77626affa49037e70b32f87849e79ca589c7609a35a169aff1c4770defa05c63", + "role": "before2" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/codex/stapler/width-710/control-0-key-ArrowRight-after0.png", + "sha256": "835407b52a8d35e83563580b85857b7b613556989ffe6187709aedc04ccf38df", + "role": "after0" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/replay-pairs/prototype/codex/stapler-710-0.png", + "sha256": "107191a1e3f5a7c19c0bd2e28ac69fff60cd6e2c8b6a09e04860f34a4368d520", + "role": "visually inspected comparison" + } + ], + "allProbeFrames": [ + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/codex/stapler/width-710/control-0-key-ArrowRight-before0.png", + "sha256": "77626affa49037e70b32f87849e79ca589c7609a35a169aff1c4770defa05c63" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/codex/stapler/width-710/control-0-key-ArrowRight-before1.png", + "sha256": "77626affa49037e70b32f87849e79ca589c7609a35a169aff1c4770defa05c63" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/codex/stapler/width-710/control-0-key-ArrowRight-before2.png", + "sha256": "77626affa49037e70b32f87849e79ca589c7609a35a169aff1c4770defa05c63" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/codex/stapler/width-710/control-0-key-ArrowRight-after0.png", + "sha256": "835407b52a8d35e83563580b85857b7b613556989ffe6187709aedc04ccf38df" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/codex/stapler/width-710/control-0-key-ArrowRight-after1.png", + "sha256": "835407b52a8d35e83563580b85857b7b613556989ffe6187709aedc04ccf38df" + } + ], + "source": { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/manual-plan-sources/prototype-codex-stapler.html", + "sha256": "1156bd1349e9b2d4f8b6bd70d08c63dde4c3870859227fcfbb40bcce68c7132d" + }, + "identityMatch": true, + "oldIdentity": { + "index": 0, + "label": "Stapling cycle. Use left and right arrows.", + "tag": "div", + "type": "" + }, + "originalAuditVerdict": null, + "runtimeErrors": [], + "visuallyInspected": true + }, + { + "revision": "f009de5838f80b90e861e5727f0ad11cba8814f8", + "pluginRevision": "9de99949792c2c59b70693c1dcda6aa8cf36b428", + "provider": "codex", + "prompt": "stapler", + "width": 710, + "index": 1, + "label": "\u2190 Back", + "selector": "#back", + "verdict": "live", + "reason": "Next enables Back; click returns Press to Ready, lifts driver/staple and changes explanation.", + "mode": "manual-real-input", + "automaticPass": false, + "v3Result": { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/codex/stapler/result.json", + "sha256": "047bd19b2bf32790de9aabaccd4e9c3555e44a7dcba858303d29b3930b90749a" + }, + "source": { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/manual-plan-sources/prototype-codex-stapler.html", + "sha256": "1156bd1349e9b2d4f8b6bd70d08c63dde4c3870859227fcfbb40bcce68c7132d" + }, + "request": { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/requests/request-04-codex-stapler-back.json", + "sha256": "3d726f92f0ee91720fe2fa8d6a90a0aac3dc91fdfeae7369ddf6116d6161e3b6" + }, + "identityMatch": true, + "inventoryMatch": true, + "runtimeErrors": [], + "visuallyInspected": true, + "evidence": [ + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/04-codex-stapler-back-before2.png", + "sha256": "4d2b8921bf62812632ab5e0fc4bcfd5cba49b0523d95b88af2efef57239b3c9d", + "role": "before2" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/04-codex-stapler-back-after0.png", + "sha256": "8dd8d1e4b515d675e6a4e8fa96ecde909735cda0ec71388bdac25d314866773c", + "role": "after0" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/pairs/04-codex-stapler-back.png", + "sha256": "f684923dfdd910dbb25c7d931a62cf3f1641c005527130046c988230c4aab269", + "role": "visually inspected comparison" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/request-04-codex-stapler-back.log", + "sha256": "3747ffb1ffa00f3f712c72dfbdc544bb4cf105f841903b9e2119a986b8f4e5f8", + "role": "real input log" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/request-04-codex-stapler-back.exit.json", + "sha256": "6583c2435c762fd34c7762f55abe7cfeade5ca760ca9a30bca7a4fd31c6125d9", + "role": "exit" + } + ], + "replayReview": { + "revision": "f009de5838f80b90e861e5727f0ad11cba8814f8", + "pluginRevision": "9de99949792c2c59b70693c1dcda6aa8cf36b428", + "provider": "codex", + "prompt": "stapler", + "width": 710, + "index": 1, + "label": "\u2190 Back", + "verdict": "unproven", + "reason": "The stage before frame shows Back disabled in Ready. The scorer has no Back interaction pair, so the source-enabled state at later steps needs the planned Next then Back manual proof.", + "mode": null, + "automaticPass": false, + "v3Result": { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/codex/stapler/result.json", + "sha256": "047bd19b2bf32790de9aabaccd4e9c3555e44a7dcba858303d29b3930b90749a" + }, + "evidence": [ + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/codex/stapler/width-710/control-0-key-ArrowRight-before2.png", + "sha256": "77626affa49037e70b32f87849e79ca589c7609a35a169aff1c4770defa05c63", + "role": "additional inspected evidence" + } + ], + "allProbeFrames": [], + "source": { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/manual-plan-sources/prototype-codex-stapler.html", + "sha256": "1156bd1349e9b2d4f8b6bd70d08c63dde4c3870859227fcfbb40bcce68c7132d" + }, + "identityMatch": true, + "oldIdentity": { + "index": 1, + "label": "\u2190 Back", + "tag": "button", + "type": "submit" + }, + "originalAuditVerdict": null, + "runtimeErrors": [], + "visuallyInspected": true, + "missingVisualEvidence": "No per-Back interaction frames; only its disabled initial appearance was inspected." + } + }, + { + "revision": "f009de5838f80b90e861e5727f0ad11cba8814f8", + "pluginRevision": "9de99949792c2c59b70693c1dcda6aa8cf36b428", + "provider": "codex", + "prompt": "thermos", + "width": 710, + "index": 0, + "label": "ClosedOpen", + "selector": "#cap", + "verdict": "dead", + "reason": "Real native Home/Enter to End/Enter changes displayed selection, but actual diagram and explanation remain unchanged. Read-only thermosState.params remains {}. Source supplies string-array options; frozen bridge expects option.value and rejects every intended choice.", + "mode": "manual-real-input", + "automaticPass": false, + "v3Result": { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/codex/thermos/result.json", + "sha256": "4ec3c141f937d2a3a6276e681e3a2b9021fd20c747094d7a893f2fee6aa1b2c2" + }, + "source": { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/manual-plan-sources/prototype-codex-thermos.html", + "sha256": "87767e1db635ac5359596f24ef4821cc4db9445d44611263dc859d00596382db" + }, + "request": { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/requests/request-15-codex-thermos-selects.json", + "sha256": "dbd6ceab6ee4d79ae4634fb01631198a581e0ad77359a83075574374d087d2b9" + }, + "identityMatch": true, + "inventoryMatch": true, + "runtimeErrors": [], + "visuallyInspected": true, + "evidence": [ + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/15-codex-thermos-selects-cap-before2.png", + "sha256": "9159fd889bbeddcb7f9bab910671c014734008aa645c1949590d1d703e6e578f", + "role": "before2" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/15-codex-thermos-selects-cap-after0.png", + "sha256": "e128a96776d1e98a01ef9688d0b544e29fd80b20043e5116a8d0dcb77b5c4ab4", + "role": "after0" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/pairs/15-codex-thermos-selects-cap.png", + "sha256": "fddaa1d5627b6a926a364133d67999032c2d81ce924f6f5c34f55ba00429c7ae", + "role": "visually inspected comparison" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/request-15-codex-thermos-selects.log", + "sha256": "7936e800403591dfaafee40d5099af854f7455bc266bf8b18250245d1b4cd5ef", + "role": "real input log" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/request-15-codex-thermos-selects.exit.json", + "sha256": "b8f37f3349a022cac95cd51e6cb19818c5a699608b7f1e4343ba8ce27ef507e7", + "role": "exit" + } + ], + "replayReview": { + "revision": "f009de5838f80b90e861e5727f0ad11cba8814f8", + "pluginRevision": "9de99949792c2c59b70693c1dcda6aa8cf36b428", + "provider": "codex", + "prompt": "thermos", + "width": 710, + "index": 0, + "label": "ClosedOpen", + "verdict": "unproven", + "reason": "The actual pair changes an initially blank native select to its first option, while the mechanism and explanation remain unchanged. This does not exercise the opposite setting. Source has an update handler, but live behavior needs the requested real Home/Enter to End/Enter comparison; no source-only pass.", + "mode": "primary", + "automaticPass": false, + "v3Result": { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/codex/thermos/result.json", + "sha256": "4ec3c141f937d2a3a6276e681e3a2b9021fd20c747094d7a893f2fee6aa1b2c2" + }, + "evidence": [ + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/codex/thermos/width-710/control-0-primary-before2.png", + "sha256": "dbeedcfa0457e65967e64b2732d815e628aa6e05f8b1da829b182c5ef42b0cb8", + "role": "before2" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/codex/thermos/width-710/control-0-primary-after0.png", + "sha256": "9159fd889bbeddcb7f9bab910671c014734008aa645c1949590d1d703e6e578f", + "role": "after0" + } + ], + "allProbeFrames": [ + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/codex/thermos/width-710/control-0-primary-before0.png", + "sha256": "dbeedcfa0457e65967e64b2732d815e628aa6e05f8b1da829b182c5ef42b0cb8" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/codex/thermos/width-710/control-0-primary-before1.png", + "sha256": "dbeedcfa0457e65967e64b2732d815e628aa6e05f8b1da829b182c5ef42b0cb8" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/codex/thermos/width-710/control-0-primary-before2.png", + "sha256": "dbeedcfa0457e65967e64b2732d815e628aa6e05f8b1da829b182c5ef42b0cb8" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/codex/thermos/width-710/control-0-primary-after0.png", + "sha256": "9159fd889bbeddcb7f9bab910671c014734008aa645c1949590d1d703e6e578f" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/codex/thermos/width-710/control-0-primary-after1.png", + "sha256": "9159fd889bbeddcb7f9bab910671c014734008aa645c1949590d1d703e6e578f" + } + ], + "source": { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/manual-plan-sources/prototype-codex-thermos.html", + "sha256": "87767e1db635ac5359596f24ef4821cc4db9445d44611263dc859d00596382db" + }, + "identityMatch": true, + "oldIdentity": { + "index": 0, + "label": "ClosedOpen", + "tag": "select", + "type": "select-one" + }, + "originalAuditVerdict": null, + "runtimeErrors": [], + "visuallyInspected": true + } + }, + { + "revision": "f009de5838f80b90e861e5727f0ad11cba8814f8", + "pluginRevision": "9de99949792c2c59b70693c1dcda6aa8cf36b428", + "provider": "codex", + "prompt": "thermos", + "width": 710, + "index": 1, + "label": "VacuumAir filled", + "selector": "#vacuum", + "verdict": "dead", + "reason": "Real native Home/Enter to End/Enter changes displayed selection, but actual diagram and explanation remain unchanged. Read-only thermosState.params remains {}. Source supplies string-array options; frozen bridge expects option.value and rejects every intended choice.", + "mode": "manual-real-input", + "automaticPass": false, + "v3Result": { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/codex/thermos/result.json", + "sha256": "4ec3c141f937d2a3a6276e681e3a2b9021fd20c747094d7a893f2fee6aa1b2c2" + }, + "source": { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/manual-plan-sources/prototype-codex-thermos.html", + "sha256": "87767e1db635ac5359596f24ef4821cc4db9445d44611263dc859d00596382db" + }, + "request": { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/requests/request-15-codex-thermos-selects.json", + "sha256": "dbd6ceab6ee4d79ae4634fb01631198a581e0ad77359a83075574374d087d2b9" + }, + "identityMatch": true, + "inventoryMatch": true, + "runtimeErrors": [], + "visuallyInspected": true, + "evidence": [ + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/15-codex-thermos-selects-vacuum-before2.png", + "sha256": "3a7228f3b3880fd0b9769d825aeb74e823df97180eee1e00283f93211658ae50", + "role": "before2" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/15-codex-thermos-selects-vacuum-after0.png", + "sha256": "2ea09e8f46a7b88f2c801543c48dc6b4dfaeba5d25438543e032c7825cf9f514", + "role": "after0" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/pairs/15-codex-thermos-selects-vacuum.png", + "sha256": "58fd2e7b1f33dd00dbc0b0128d4d4c0f097c793c205050564dcb11844e477fa6", + "role": "visually inspected comparison" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/request-15-codex-thermos-selects.log", + "sha256": "7936e800403591dfaafee40d5099af854f7455bc266bf8b18250245d1b4cd5ef", + "role": "real input log" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/request-15-codex-thermos-selects.exit.json", + "sha256": "b8f37f3349a022cac95cd51e6cb19818c5a699608b7f1e4343ba8ce27ef507e7", + "role": "exit" + } + ], + "replayReview": { + "revision": "f009de5838f80b90e861e5727f0ad11cba8814f8", + "pluginRevision": "9de99949792c2c59b70693c1dcda6aa8cf36b428", + "provider": "codex", + "prompt": "thermos", + "width": 710, + "index": 1, + "label": "VacuumAir filled", + "verdict": "unproven", + "reason": "The actual pair changes an initially blank native select to its first option, while the mechanism and explanation remain unchanged. This does not exercise the opposite setting. Source has an update handler, but live behavior needs the requested real Home/Enter to End/Enter comparison; no source-only pass.", + "mode": "primary", + "automaticPass": false, + "v3Result": { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/codex/thermos/result.json", + "sha256": "4ec3c141f937d2a3a6276e681e3a2b9021fd20c747094d7a893f2fee6aa1b2c2" + }, + "evidence": [ + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/codex/thermos/width-710/control-1-primary-before2.png", + "sha256": "9159fd889bbeddcb7f9bab910671c014734008aa645c1949590d1d703e6e578f", + "role": "before2" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/codex/thermos/width-710/control-1-primary-after0.png", + "sha256": "b0e11665754a61ffe4d115fc6944780b4358169a2a6189c87348be3625db544c", + "role": "after0" + } + ], + "allProbeFrames": [ + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/codex/thermos/width-710/control-1-primary-before0.png", + "sha256": "9159fd889bbeddcb7f9bab910671c014734008aa645c1949590d1d703e6e578f" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/codex/thermos/width-710/control-1-primary-before1.png", + "sha256": "9159fd889bbeddcb7f9bab910671c014734008aa645c1949590d1d703e6e578f" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/codex/thermos/width-710/control-1-primary-before2.png", + "sha256": "9159fd889bbeddcb7f9bab910671c014734008aa645c1949590d1d703e6e578f" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/codex/thermos/width-710/control-1-primary-after0.png", + "sha256": "b0e11665754a61ffe4d115fc6944780b4358169a2a6189c87348be3625db544c" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/codex/thermos/width-710/control-1-primary-after1.png", + "sha256": "b0e11665754a61ffe4d115fc6944780b4358169a2a6189c87348be3625db544c" + } + ], + "source": { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/manual-plan-sources/prototype-codex-thermos.html", + "sha256": "87767e1db635ac5359596f24ef4821cc4db9445d44611263dc859d00596382db" + }, + "identityMatch": true, + "oldIdentity": { + "index": 1, + "label": "VacuumAir filled", + "tag": "select", + "type": "select-one" + }, + "originalAuditVerdict": null, + "runtimeErrors": [], + "visuallyInspected": true + } + }, + { + "revision": "f009de5838f80b90e861e5727f0ad11cba8814f8", + "pluginRevision": "9de99949792c2c59b70693c1dcda6aa8cf36b428", + "provider": "codex", + "prompt": "thermos", + "width": 710, + "index": 2, + "label": "ReflectiveNonreflective", + "selector": "#reflect", + "verdict": "dead", + "reason": "Real native Home/Enter to End/Enter changes displayed selection, but actual diagram and explanation remain unchanged. Read-only thermosState.params remains {}. Source supplies string-array options; frozen bridge expects option.value and rejects every intended choice.", + "mode": "manual-real-input", + "automaticPass": false, + "v3Result": { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/codex/thermos/result.json", + "sha256": "4ec3c141f937d2a3a6276e681e3a2b9021fd20c747094d7a893f2fee6aa1b2c2" + }, + "source": { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/manual-plan-sources/prototype-codex-thermos.html", + "sha256": "87767e1db635ac5359596f24ef4821cc4db9445d44611263dc859d00596382db" + }, + "request": { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/requests/request-15-codex-thermos-selects.json", + "sha256": "dbd6ceab6ee4d79ae4634fb01631198a581e0ad77359a83075574374d087d2b9" + }, + "identityMatch": true, + "inventoryMatch": true, + "runtimeErrors": [], + "visuallyInspected": true, + "evidence": [ + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/15-codex-thermos-selects-reflect-before2.png", + "sha256": "ae37dc8f9a7ab6852690761de47dc3a7cba3c981fc874905e1a279716a8769fa", + "role": "before2" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/15-codex-thermos-selects-reflect-after0.png", + "sha256": "8ff11c938a46f6ffe93bcb3d3f8822671a01e8d02ea8e6ac719e0d07fae0af36", + "role": "after0" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/pairs/15-codex-thermos-selects-reflect.png", + "sha256": "3f0ce121e5e86a6b9c031b9ed0f18b80e569d1d5d2a9d2e90ae5d62049688c42", + "role": "visually inspected comparison" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/request-15-codex-thermos-selects.log", + "sha256": "7936e800403591dfaafee40d5099af854f7455bc266bf8b18250245d1b4cd5ef", + "role": "real input log" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/request-15-codex-thermos-selects.exit.json", + "sha256": "b8f37f3349a022cac95cd51e6cb19818c5a699608b7f1e4343ba8ce27ef507e7", + "role": "exit" + } + ], + "replayReview": { + "revision": "f009de5838f80b90e861e5727f0ad11cba8814f8", + "pluginRevision": "9de99949792c2c59b70693c1dcda6aa8cf36b428", + "provider": "codex", + "prompt": "thermos", + "width": 710, + "index": 2, + "label": "ReflectiveNonreflective", + "verdict": "unproven", + "reason": "The actual pair changes an initially blank native select to its first option, while the mechanism and explanation remain unchanged. This does not exercise the opposite setting. Source has an update handler, but live behavior needs the requested real Home/Enter to End/Enter comparison; no source-only pass.", + "mode": "primary", + "automaticPass": false, + "v3Result": { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/codex/thermos/result.json", + "sha256": "4ec3c141f937d2a3a6276e681e3a2b9021fd20c747094d7a893f2fee6aa1b2c2" + }, + "evidence": [ + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/codex/thermos/width-710/control-2-primary-before2.png", + "sha256": "b0e11665754a61ffe4d115fc6944780b4358169a2a6189c87348be3625db544c", + "role": "before2" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/codex/thermos/width-710/control-2-primary-after0.png", + "sha256": "2c06307cd7aa90ae1dcd2d316a3f80487ebf037eab0bf9361d45f9635b1d6ffb", + "role": "after0" + } + ], + "allProbeFrames": [ + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/codex/thermos/width-710/control-2-primary-before0.png", + "sha256": "b0e11665754a61ffe4d115fc6944780b4358169a2a6189c87348be3625db544c" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/codex/thermos/width-710/control-2-primary-before1.png", + "sha256": "b0e11665754a61ffe4d115fc6944780b4358169a2a6189c87348be3625db544c" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/codex/thermos/width-710/control-2-primary-before2.png", + "sha256": "b0e11665754a61ffe4d115fc6944780b4358169a2a6189c87348be3625db544c" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/codex/thermos/width-710/control-2-primary-after0.png", + "sha256": "2c06307cd7aa90ae1dcd2d316a3f80487ebf037eab0bf9361d45f9635b1d6ffb" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/codex/thermos/width-710/control-2-primary-after1.png", + "sha256": "2c06307cd7aa90ae1dcd2d316a3f80487ebf037eab0bf9361d45f9635b1d6ffb" + } + ], + "source": { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/manual-plan-sources/prototype-codex-thermos.html", + "sha256": "87767e1db635ac5359596f24ef4821cc4db9445d44611263dc859d00596382db" + }, + "identityMatch": true, + "oldIdentity": { + "index": 2, + "label": "ReflectiveNonreflective", + "tag": "select", + "type": "select-one" + }, + "originalAuditVerdict": null, + "runtimeErrors": [], + "visuallyInspected": true + } + }, + { + "revision": "f009de5838f80b90e861e5727f0ad11cba8814f8", + "pluginRevision": "9de99949792c2c59b70693c1dcda6aa8cf36b428", + "provider": "codex", + "prompt": "toaster", + "width": 710, + "index": 0, + "label": "Toasting cycle", + "verdict": "live", + "reason": "The actual End pair changes Ready to Released/heaters off and replaces the explanation with timer-end, latch release and spring-lift text. Source explicitly maps End to cycle 100; similar endpoint geometry does not negate the visible state/readout change.", + "mode": "key-End", + "automaticPass": true, + "v3Result": { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/codex/toaster/result.json", + "sha256": "8b66dfff80073452140289f7e49e521edf9ea5be7b036aaa6633155066555141" + }, + "evidence": [ + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/codex/toaster/width-710/control-0-key-End-before2.png", + "sha256": "de394e45b5517ed05a70be6b96a193094dc549d9d9ea9fe0b75769610e1c59e0", + "role": "before2" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/codex/toaster/width-710/control-0-key-End-after0.png", + "sha256": "a5daed47e2df761653a7e255f1f5d115af7d6648e8fe3a599fe319324aab8747", + "role": "after0" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/replay-pairs/prototype/codex/toaster-710-0.png", + "sha256": "1a321522fa1f39099a3e25f541262ddb789893865dd5f867bdb3dbbe8d886cdd", + "role": "visually inspected comparison" + } + ], + "allProbeFrames": [ + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/codex/toaster/width-710/control-0-key-End-before0.png", + "sha256": "de394e45b5517ed05a70be6b96a193094dc549d9d9ea9fe0b75769610e1c59e0" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/codex/toaster/width-710/control-0-key-End-before1.png", + "sha256": "de394e45b5517ed05a70be6b96a193094dc549d9d9ea9fe0b75769610e1c59e0" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/codex/toaster/width-710/control-0-key-End-before2.png", + "sha256": "de394e45b5517ed05a70be6b96a193094dc549d9d9ea9fe0b75769610e1c59e0" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/codex/toaster/width-710/control-0-key-End-after0.png", + "sha256": "a5daed47e2df761653a7e255f1f5d115af7d6648e8fe3a599fe319324aab8747" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/codex/toaster/width-710/control-0-key-End-after1.png", + "sha256": "a5daed47e2df761653a7e255f1f5d115af7d6648e8fe3a599fe319324aab8747" + } + ], + "source": { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/manual-plan-sources/prototype-codex-toaster.html", + "sha256": "d4b77e4498b363d22088493e6a01984acbe013d9aed2381a0cbf791ae67485ba" + }, + "identityMatch": true, + "oldIdentity": { + "index": 0, + "label": "Toasting cycle", + "tag": "div", + "type": "slider" + }, + "originalAuditVerdict": null, + "runtimeErrors": [], + "visuallyInspected": true + }, + { + "revision": "f009de5838f80b90e861e5727f0ad11cba8814f8", + "pluginRevision": "9de99949792c2c59b70693c1dcda6aa8cf36b428", + "provider": "codex", + "prompt": "toilet", + "width": 710, + "index": 1, + "label": "\u2190 Back", + "selector": "#back", + "verdict": "live", + "reason": "Next enables Back; click returns Flush to Ready, restores tank level, closes flapper and changes explanation.", + "mode": "manual-real-input", + "automaticPass": false, + "v3Result": { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/codex/toilet/result.json", + "sha256": "a5fcea357e99e3116d250857f0477a4e8230b19e1052d4f01271ac2d444b9f8d" + }, + "source": { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/manual-plan-sources/prototype-codex-toilet.html", + "sha256": "b5e1bca138d7615e95db8a207132dca3b89dd4f1b0116d38d6789896538cc93b" + }, + "request": { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/requests/request-04-codex-toilet-back.json", + "sha256": "96ad2bcec2ab102370b57209d7e09905b522f653590be71a2545a27a77ee1141" + }, + "identityMatch": true, + "inventoryMatch": true, + "runtimeErrors": [], + "visuallyInspected": true, + "evidence": [ + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/04-codex-toilet-back-before2.png", + "sha256": "65b68393205b4947b9bf6969142c70e8dc7295d07f31433782a3153cf5d9c085", + "role": "before2" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/04-codex-toilet-back-after0.png", + "sha256": "17d76143c243a5406dab09833066e2be2aa0268ae2c47cd5dc170b3862473cb6", + "role": "after0" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/pairs/04-codex-toilet-back.png", + "sha256": "5916cc3fab734452fc0f2d957f0b6a7cb1b263cefcdd243d650b2ac17b6387a4", + "role": "visually inspected comparison" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/request-04-codex-toilet-back.log", + "sha256": "d95f08bb2b3a47b39952a1bb1d7d2c1bf6831dd263f04d9aadd81f7f7662a030", + "role": "real input log" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/request-04-codex-toilet-back.exit.json", + "sha256": "8aa03246089bfea7a1830164742cefda1baba585a7e219f2e9b5d6564877535a", + "role": "exit" + } + ], + "replayReview": { + "revision": "f009de5838f80b90e861e5727f0ad11cba8814f8", + "pluginRevision": "9de99949792c2c59b70693c1dcda6aa8cf36b428", + "provider": "codex", + "prompt": "toilet", + "width": 710, + "index": 1, + "label": "\u2190 Back", + "verdict": "unproven", + "reason": "The scorer skipped Back as initially disabled and retained no Back interaction frames. The inspected slider frame shows Back enabled in Flush, establishing a possible precondition but not a Back action. Await planned enabled-state manual proof.", + "mode": null, + "automaticPass": false, + "v3Result": { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/codex/toilet/result.json", + "sha256": "a5fcea357e99e3116d250857f0477a4e8230b19e1052d4f01271ac2d444b9f8d" + }, + "evidence": [ + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/codex/toilet/width-710/control-0-drag-before2.png", + "sha256": "65b68393205b4947b9bf6969142c70e8dc7295d07f31433782a3153cf5d9c085", + "role": "additional inspected evidence" + } + ], + "allProbeFrames": [], + "source": { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/manual-plan-sources/prototype-codex-toilet.html", + "sha256": "b5e1bca138d7615e95db8a207132dca3b89dd4f1b0116d38d6789896538cc93b" + }, + "identityMatch": true, + "oldIdentity": { + "index": 1, + "label": "\u2190 Back", + "tag": "button", + "type": "submit" + }, + "originalAuditVerdict": null, + "runtimeErrors": [], + "visuallyInspected": true, + "missingVisualEvidence": "No per-Back before/after pair exists; supporting screenshot is from slider probe, not Back interaction." + } + }, + { + "revision": "f009de5838f80b90e861e5727f0ad11cba8814f8", + "pluginRevision": "9de99949792c2c59b70693c1dcda6aa8cf36b428", + "provider": "codex", + "prompt": "umbrella", + "width": 710, + "index": 0, + "label": "Fig 1Manual umbrella \u00b7 section viewMove the runnerClosed", + "verdict": "live", + "reason": "The actual ArrowRight pair raises the runner, spreads ribs and fabric and changes Closed to the moving-ribs explanation. The source explicitly adjusts the target on ArrowRight; its easing animation follows that input rather than changing autonomously.", + "mode": "key-ArrowRight", + "automaticPass": true, + "v3Result": { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/codex/umbrella/result.json", + "sha256": "679098d81ad5f331bf6e5954b5910c722e62ecf1fba15e33b0f2e4f2fb12ce05" + }, + "evidence": [ + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/codex/umbrella/width-710/control-0-key-ArrowRight-before2.png", + "sha256": "fc23d8fed5574e0379d2b17e3a09060cf656d32e1cd57de05977fcf904a600c8", + "role": "before2" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/codex/umbrella/width-710/control-0-key-ArrowRight-after0.png", + "sha256": "11e807095da5571ea3f7482a9d07e83b4e4444fd90e12d5871660f7b97d1b59e", + "role": "after0" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/replay-pairs/prototype/codex/umbrella-710-0.png", + "sha256": "35571965c403cc5776501c12e0603d56cd44364d75945539073367a521f2cf3e", + "role": "visually inspected comparison" + } + ], + "allProbeFrames": [ + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/codex/umbrella/width-710/control-0-key-ArrowRight-before0.png", + "sha256": "fc23d8fed5574e0379d2b17e3a09060cf656d32e1cd57de05977fcf904a600c8" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/codex/umbrella/width-710/control-0-key-ArrowRight-before1.png", + "sha256": "fc23d8fed5574e0379d2b17e3a09060cf656d32e1cd57de05977fcf904a600c8" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/codex/umbrella/width-710/control-0-key-ArrowRight-before2.png", + "sha256": "fc23d8fed5574e0379d2b17e3a09060cf656d32e1cd57de05977fcf904a600c8" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/codex/umbrella/width-710/control-0-key-ArrowRight-after0.png", + "sha256": "11e807095da5571ea3f7482a9d07e83b4e4444fd90e12d5871660f7b97d1b59e" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/codex/umbrella/width-710/control-0-key-ArrowRight-after1.png", + "sha256": "11e807095da5571ea3f7482a9d07e83b4e4444fd90e12d5871660f7b97d1b59e" + } + ], + "source": { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/manual-plan-sources/prototype-codex-umbrella.html", + "sha256": "ef786a81687518d2276aacf241373fa6c10efa9af30058964dde44a7fc9d3049" + }, + "identityMatch": true, + "oldIdentity": { + "index": 0, + "label": "Fig 1Manual umbrella \u00b7 section viewMove the runnerClosed", + "tag": "div", + "type": "" + }, + "originalAuditVerdict": null, + "runtimeErrors": [], + "visuallyInspected": true + }, + { + "revision": "f009de5838f80b90e861e5727f0ad11cba8814f8", + "pluginRevision": "9de99949792c2c59b70693c1dcda6aa8cf36b428", + "provider": "codex", + "prompt": "washing-machine", + "width": 710, + "index": 0, + "label": "Cycle stage", + "verdict": "live", + "reason": "The actual selector pair changes Wash to Drain, lowers the water, colors the drain route and changes both readout and explanation. The source subscription changes stage only on input; the distinct drain output is not incidental drum animation.", + "mode": "primary", + "automaticPass": true, + "v3Result": { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/codex/washing-machine/result.json", + "sha256": "9496210a50ebbdba0ea911d4afec6d1baee475d1258e3b5f539be95ae665356b" + }, + "evidence": [ + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/codex/washing-machine/width-710/control-0-primary-before2.png", + "sha256": "394292e7f5c387cc0aec28438735596e739d2f7e47b17f7bbf89f47373e69845", + "role": "before2" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/codex/washing-machine/width-710/control-0-primary-after0.png", + "sha256": "6eb8c54ff2c21a69b15ecb6a4f58e802644fa25d7ddd8958d44fd1d9d391f719", + "role": "after0" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/replay-pairs/prototype/codex/washing-machine-710-0.png", + "sha256": "34451c1993f94b76f9b24ab7896c49561ac04a572d3d4202e7c549b6de30ddf9", + "role": "visually inspected comparison" + } + ], + "allProbeFrames": [ + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/codex/washing-machine/width-710/control-0-primary-before0.png", + "sha256": "394292e7f5c387cc0aec28438735596e739d2f7e47b17f7bbf89f47373e69845" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/codex/washing-machine/width-710/control-0-primary-before1.png", + "sha256": "394292e7f5c387cc0aec28438735596e739d2f7e47b17f7bbf89f47373e69845" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/codex/washing-machine/width-710/control-0-primary-before2.png", + "sha256": "394292e7f5c387cc0aec28438735596e739d2f7e47b17f7bbf89f47373e69845" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/codex/washing-machine/width-710/control-0-primary-after0.png", + "sha256": "6eb8c54ff2c21a69b15ecb6a4f58e802644fa25d7ddd8958d44fd1d9d391f719" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/codex/washing-machine/width-710/control-0-primary-after1.png", + "sha256": "6eb8c54ff2c21a69b15ecb6a4f58e802644fa25d7ddd8958d44fd1d9d391f719" + } + ], + "source": { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/manual-plan-sources/prototype-codex-washing-machine.html", + "sha256": "950eaf8da6f64515f28936d6c6923304bdd32ee4c0d6b03049c6e947b0dc92d4" + }, + "identityMatch": true, + "oldIdentity": { + "index": 0, + "label": "Cycle stage", + "tag": "select", + "type": "select-one" + }, + "originalAuditVerdict": null, + "runtimeErrors": [], + "visuallyInspected": true + }, + { + "revision": "f009de5838f80b90e861e5727f0ad11cba8814f8", + "pluginRevision": "9de99949792c2c59b70693c1dcda6aa8cf36b428", + "provider": "codex", + "prompt": "washing-machine", + "width": 710, + "index": 1, + "label": "What the drawing simplifies", + "verdict": "live", + "reason": "Actual click frames show the full simplification text present before and hidden after the summary click. This is a working native disclosure collapse, despite the automatic aligned-region proof failing when text disappears; the source uses details/summary.", + "mode": "click", + "automaticPass": false, + "v3Result": { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/codex/washing-machine/result.json", + "sha256": "9496210a50ebbdba0ea911d4afec6d1baee475d1258e3b5f539be95ae665356b" + }, + "evidence": [ + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/codex/washing-machine/width-710/control-1-click-before2.png", + "sha256": "892ae27382ce2f043d281bd8dfabfa08d45f9b92fd3f010d532ebab5047885ba", + "role": "before2" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/codex/washing-machine/width-710/control-1-click-after0.png", + "sha256": "f22364abe4eba3d5441873708daf5783e217fc41d6de03e491172bb845e4fa17", + "role": "after0" + } + ], + "allProbeFrames": [ + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/codex/washing-machine/width-710/control-1-click-before0.png", + "sha256": "892ae27382ce2f043d281bd8dfabfa08d45f9b92fd3f010d532ebab5047885ba" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/codex/washing-machine/width-710/control-1-click-before1.png", + "sha256": "892ae27382ce2f043d281bd8dfabfa08d45f9b92fd3f010d532ebab5047885ba" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/codex/washing-machine/width-710/control-1-click-before2.png", + "sha256": "892ae27382ce2f043d281bd8dfabfa08d45f9b92fd3f010d532ebab5047885ba" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/codex/washing-machine/width-710/control-1-click-after0.png", + "sha256": "f22364abe4eba3d5441873708daf5783e217fc41d6de03e491172bb845e4fa17" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/codex/washing-machine/width-710/control-1-click-after1.png", + "sha256": "f22364abe4eba3d5441873708daf5783e217fc41d6de03e491172bb845e4fa17" + } + ], + "source": { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/manual-plan-sources/prototype-codex-washing-machine.html", + "sha256": "950eaf8da6f64515f28936d6c6923304bdd32ee4c0d6b03049c6e947b0dc92d4" + }, + "identityMatch": true, + "oldIdentity": { + "index": 1, + "label": "What the drawing simplifies", + "tag": "summary", + "type": "" + }, + "originalAuditVerdict": null, + "runtimeErrors": [], + "visuallyInspected": true + }, + { + "revision": "f009de5838f80b90e861e5727f0ad11cba8814f8", + "pluginRevision": "9de99949792c2c59b70693c1dcda6aa8cf36b428", + "provider": "codex", + "prompt": "websocket", + "width": 710, + "index": 1, + "label": "\u2190 Back", + "selector": "#back", + "verdict": "live", + "reason": "Next enables Back; click returns Send to Connection opened, moves packet back to sender and updates explanation.", + "mode": "manual-real-input", + "automaticPass": false, + "v3Result": { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/codex/websocket/result.json", + "sha256": "58fafd916565d91e6dcdd18b63f58e33ee5c2f4a6657a6b0a588bf610c5a7737" + }, + "source": { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/manual-plan-sources/prototype-codex-websocket.html", + "sha256": "ef6a797b228bc623412923eebf501671ff8c9cec12e21998f27ca4ce63494ec7" + }, + "request": { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/requests/request-04-codex-websocket-back.json", + "sha256": "6e04bb71f8c5e6c7cb7cefd6ebb947fd4352f38cea799b36aaa148779b2ab9c1" + }, + "identityMatch": true, + "inventoryMatch": true, + "runtimeErrors": [], + "visuallyInspected": true, + "evidence": [ + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/04-codex-websocket-back-before2.png", + "sha256": "ca8c3713ea0d94cc59d7e1d766f8f61839163951d0ed8582cbaf10a2524246f3", + "role": "before2" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/04-codex-websocket-back-after0.png", + "sha256": "4a61797351732c377e6214845da40c54217a791f769e966c4e4ad76f8e0e246d", + "role": "after0" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/pairs/04-codex-websocket-back.png", + "sha256": "c12064a9920693f90d61ffdeba269862ee7c3ff92006d8081da7c23e4160dec8", + "role": "visually inspected comparison" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/request-04-codex-websocket-back.log", + "sha256": "2b777651599345db21cc11f5a801815621bfa65c09c9090fd5dcd3494b0ae5c1", + "role": "real input log" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/request-04-codex-websocket-back.exit.json", + "sha256": "0eec48972ef017d5ef78e9cc51ea6db57523c40065d5ef346be1bfb200544377", + "role": "exit" + } + ], + "replayReview": { + "revision": "f009de5838f80b90e861e5727f0ad11cba8814f8", + "pluginRevision": "9de99949792c2c59b70693c1dcda6aa8cf36b428", + "provider": "codex", + "prompt": "websocket", + "width": 710, + "index": 1, + "label": "\u2190 Back", + "verdict": "unproven", + "reason": "Back was skipped as initially disabled, so no Back interaction frames exist. A stage interaction frame shows Back enabled later, but does not prove its click handler.", + "mode": null, + "automaticPass": false, + "v3Result": { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/codex/websocket/result.json", + "sha256": "58fafd916565d91e6dcdd18b63f58e33ee5c2f4a6657a6b0a588bf610c5a7737" + }, + "evidence": [], + "allProbeFrames": [], + "source": { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/manual-plan-sources/prototype-codex-websocket.html", + "sha256": "ef6a797b228bc623412923eebf501671ff8c9cec12e21998f27ca4ce63494ec7" + }, + "identityMatch": true, + "oldIdentity": { + "index": 1, + "label": "\u2190 Back", + "tag": "button", + "type": "submit" + }, + "originalAuditVerdict": null, + "runtimeErrors": [], + "visuallyInspected": true, + "missingVisualEvidence": "No Back before/after frames; manual precondition pending." + } + }, + { + "revision": "f009de5838f80b90e861e5727f0ad11cba8814f8", + "pluginRevision": "9de99949792c2c59b70693c1dcda6aa8cf36b428", + "provider": "codex", + "prompt": "websocket", + "width": 710, + "index": 3, + "label": "What this model assumes", + "selector": "details > summary", + "verdict": "live", + "reason": "Actual summary click expands the previously hidden explanatory paragraphs; read-only details.open changes false to true and actual PNGs show the new text.", + "mode": "manual-real-input", + "automaticPass": false, + "v3Result": { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/codex/websocket/result.json", + "sha256": "58fafd916565d91e6dcdd18b63f58e33ee5c2f4a6657a6b0a588bf610c5a7737" + }, + "source": { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/manual-plan-sources/prototype-codex-websocket.html", + "sha256": "ef6a797b228bc623412923eebf501671ff8c9cec12e21998f27ca4ce63494ec7" + }, + "request": { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/requests/request-17-codex-websocket-disclosure.json", + "sha256": "03ada2b69d4573fb01f4dc5110ad39460020d99e53c5b805ea5d0daeb4223746" + }, + "identityMatch": true, + "inventoryMatch": true, + "runtimeErrors": [], + "visuallyInspected": true, + "evidence": [ + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/17-codex-websocket-disclosure-before2.png", + "sha256": "4a61797351732c377e6214845da40c54217a791f769e966c4e4ad76f8e0e246d", + "role": "before2" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/17-codex-websocket-disclosure-after0.png", + "sha256": "c268b03eff463c50260341d96061c621f8250546a1ba0512eee0a7b7ce0e2e4f", + "role": "after0" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/pairs/17-codex-websocket-disclosure.png", + "sha256": "25543093e18aa9b003bcb5deaa33217ab0f6831ea9deb481204b1ac44ff8d189", + "role": "visually inspected comparison" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/request-17-codex-websocket-disclosure.log", + "sha256": "896fe886cde6809533941e117b9b2e9eb4446a6b2a89cb56a22a3e253c2dd3d6", + "role": "real input log" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/request-17-codex-websocket-disclosure.exit.json", + "sha256": "af3e35e9469cc463ec33fbc9980a7b08e2339df55f0aa26ac9bc9b6c5faa8652", + "role": "exit" + } + ], + "replayReview": { + "revision": "f009de5838f80b90e861e5727f0ad11cba8814f8", + "pluginRevision": "9de99949792c2c59b70693c1dcda6aa8cf36b428", + "provider": "codex", + "prompt": "websocket", + "width": 710, + "index": 3, + "label": "What this model assumes", + "verdict": "live", + "reason": "Actual click pair collapses the open explanatory paragraphs under What this model assumes, a meaningful disclosure change despite the scorer rejecting disappearing output.", + "mode": "click", + "automaticPass": false, + "v3Result": { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/codex/websocket/result.json", + "sha256": "58fafd916565d91e6dcdd18b63f58e33ee5c2f4a6657a6b0a588bf610c5a7737" + }, + "evidence": [ + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/codex/websocket/width-710/control-3-click-before2.png", + "sha256": "40136b9bc03cec840160751de0e529ef06e32a1afd85b51bde6349966e90b438", + "role": "before2" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/codex/websocket/width-710/control-3-click-after0.png", + "sha256": "140d0b9aaf41e5c2baa2e03eff57cf743b4bdb6f6b55bc4b80dcc8a710638872", + "role": "after0" + } + ], + "allProbeFrames": [ + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/codex/websocket/width-710/control-3-click-before0.png", + "sha256": "40136b9bc03cec840160751de0e529ef06e32a1afd85b51bde6349966e90b438" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/codex/websocket/width-710/control-3-click-before1.png", + "sha256": "40136b9bc03cec840160751de0e529ef06e32a1afd85b51bde6349966e90b438" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/codex/websocket/width-710/control-3-click-before2.png", + "sha256": "40136b9bc03cec840160751de0e529ef06e32a1afd85b51bde6349966e90b438" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/codex/websocket/width-710/control-3-click-after0.png", + "sha256": "140d0b9aaf41e5c2baa2e03eff57cf743b4bdb6f6b55bc4b80dcc8a710638872" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/codex/websocket/width-710/control-3-click-after1.png", + "sha256": "140d0b9aaf41e5c2baa2e03eff57cf743b4bdb6f6b55bc4b80dcc8a710638872" + } + ], + "source": { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/manual-plan-sources/prototype-codex-websocket.html", + "sha256": "ef6a797b228bc623412923eebf501671ff8c9cec12e21998f27ca4ce63494ec7" + }, + "identityMatch": true, + "oldIdentity": { + "index": 3, + "label": "What this model assumes", + "tag": "summary", + "type": "" + }, + "originalAuditVerdict": null, + "runtimeErrors": [], + "visuallyInspected": true + } + }, + { + "revision": "f009de5838f80b90e861e5727f0ad11cba8814f8", + "pluginRevision": "9de99949792c2c59b70693c1dcda6aa8cf36b428", + "provider": "codex", + "prompt": "zipper", + "width": 710, + "index": 0, + "label": "Zipper slider position; up closes and down opens", + "verdict": "live", + "reason": "The actual End pair moves the slider from the bottom to the top and joins the tooth rows below it. The source explicitly supports End and sets position 100; no autonomous motion exists.", + "mode": "key-End", + "automaticPass": true, + "v3Result": { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/codex/zipper/result.json", + "sha256": "7f65dabb87c02c0835be319aed69e781f3a7cb333cebe528eb5eed7c7b85ba9b" + }, + "evidence": [ + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/codex/zipper/width-710/control-0-key-End-before2.png", + "sha256": "45b6b6183233d8670b3e5df9640f1e9e312378a32b1db05615c215e4d430a5c1", + "role": "before2" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/codex/zipper/width-710/control-0-key-End-after0.png", + "sha256": "d01a369c190787bae946fe05b88dba943edbbc2901b079418e46ebcf153ce978", + "role": "after0" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/replay-pairs/prototype/codex/zipper-710-0.png", + "sha256": "fcc061d777e3f4bef29606951cc1a247411519cd5276130b4a3236d8ea41b8b0", + "role": "visually inspected comparison" + } + ], + "allProbeFrames": [ + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/codex/zipper/width-710/control-0-key-End-before0.png", + "sha256": "45b6b6183233d8670b3e5df9640f1e9e312378a32b1db05615c215e4d430a5c1" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/codex/zipper/width-710/control-0-key-End-before1.png", + "sha256": "45b6b6183233d8670b3e5df9640f1e9e312378a32b1db05615c215e4d430a5c1" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/codex/zipper/width-710/control-0-key-End-before2.png", + "sha256": "45b6b6183233d8670b3e5df9640f1e9e312378a32b1db05615c215e4d430a5c1" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/codex/zipper/width-710/control-0-key-End-after0.png", + "sha256": "d01a369c190787bae946fe05b88dba943edbbc2901b079418e46ebcf153ce978" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/codex/zipper/width-710/control-0-key-End-after1.png", + "sha256": "d01a369c190787bae946fe05b88dba943edbbc2901b079418e46ebcf153ce978" + } + ], + "source": { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/manual-plan-sources/prototype-codex-zipper.html", + "sha256": "d9caa5e91dc7b2545e4f272bf0a0b5117440f46229978e7ff959e045ccf3e649" + }, + "identityMatch": true, + "oldIdentity": { + "index": 0, + "label": "Zipper slider position; up closes and down opens", + "tag": "div", + "type": "slider" + }, + "originalAuditVerdict": null, + "runtimeErrors": [], + "visuallyInspected": true + }, + { + "revision": "f009de5838f80b90e861e5727f0ad11cba8814f8", + "pluginRevision": "9de99949792c2c59b70693c1dcda6aa8cf36b428", + "provider": "codex", + "prompt": "cdn", + "width": 710, + "index": 2, + "label": "Edge AEdge BEdge C", + "selector": "#region", + "verdict": "dead", + "reason": "Partial control: real native Home/Enter then End/Enter should select last option Edge C but settles at Edge B, confirmed in actual PNG and params.region1. Missing valid string schema/bounds clamps intended region2 to1. A\u2192B response is real, but advertised Edge C never works.", + "mode": "manual-real-input", + "automaticPass": true, + "v3Result": { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/codex/cdn/result.json", + "sha256": "82626a0e95d104eca2455528a68df908732bd1fae7d95c0256d30ff5449bf405" + }, + "source": { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/manual-plan-sources/prototype-codex-cdn.html", + "sha256": "1d324a2d8c0b23e69b6b9a9733d61d8444eefa745d5c937047035c5eedfeaf73" + }, + "request": { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/requests/request-30-codex-cdn-region.json", + "sha256": "c0a467482a539b58dc297906a92d98478489f85e11fa34b6611c5609f541489f" + }, + "identityMatch": true, + "inventoryMatch": true, + "runtimeErrors": [], + "visuallyInspected": true, + "evidence": [ + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/30-codex-cdn-region-before2.png", + "sha256": "c893fa5d4d69a0047b4ce237a4dff5914a90871ba6b3bf93d5176dd43a77a553", + "role": "before2" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/30-codex-cdn-region-after0.png", + "sha256": "e02fa1afe1c2963fa17ce6ee8cb366e5727fb36047e1722c3df523763b5b1c5e", + "role": "after0" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/pairs/30-codex-cdn-region.png", + "sha256": "528ff7d7ee02fe44bbf22ea531129e923f1bb1818d53e20aa5501de61a224a87", + "role": "visually inspected comparison" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/request-30-codex-cdn-region.log", + "sha256": "67a3d87b78b0819cce3385fe3a024ef14348e9622bc72e7364040d325f26b2ce", + "role": "real input log" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/request-30-codex-cdn-region.exit.json", + "sha256": "3231e9a8959bae36cf0a55b3eb0454312f25d65a461efd343eb13b00e2d76785", + "role": "exit" + } + ] + } + ], + "cardChecks": [ + { + "prompt": "washing-machine", + "v3Result": { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/codex/washing-machine/result.json", + "sha256": "9496210a50ebbdba0ea911d4afec6d1baee475d1258e3b5f539be95ae665356b" + }, + "cardVisible": true, + "automaticCardPass": false, + "originalConfirmedDeadControls": [], + "newlyLiveControls": [ + { + "width": 710, + "index": 0 + }, + { + "width": 710, + "index": 1 + } + ], + "reviewedControlVerdicts": [ + { + "width": 710, + "index": 0, + "verdict": "live", + "identityMatch": true + }, + { + "width": 710, + "index": 1, + "verdict": "live", + "identityMatch": true + } + ], + "runtimeErrors": [], + "blockAutomaticCardPass": false, + "note": "Every newly-live or remaining failing control and known partial bounds case reviewed; real-input manual follow-ups are applied. Unchanged prior passing controls retain their saved proof. Five missing summaries remain separately identified with null index. No source-only live verdicts.", + "effectiveControlVerdicts": [ + { + "width": 710, + "index": 0, + "label": "Cycle stage", + "verdict": "live", + "basis": "independent visual review" + }, + { + "width": 710, + "index": 1, + "label": "What the drawing simplifies", + "verdict": "live", + "basis": "independent visual review" + } + ], + "supplementalControlCount": 0, + "supplementalAllLive": true, + "reviewedAllControlsLive": true + }, + { + "prompt": "bicycle-pump", + "v3Result": { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/codex/bicycle-pump/result.json", + "sha256": "6f0625b152770c6b5a4cb3028c80270969ea7b22445df4a0b2d4dcf7d9f142e9" + }, + "cardVisible": true, + "automaticCardPass": false, + "originalConfirmedDeadControls": [], + "newlyLiveControls": [ + { + "width": 710, + "index": 0 + }, + { + "width": 710, + "index": 1 + } + ], + "reviewedControlVerdicts": [ + { + "width": 710, + "index": 0, + "verdict": "live", + "identityMatch": true + }, + { + "width": 710, + "index": 1, + "verdict": "live", + "identityMatch": true + } + ], + "runtimeErrors": [], + "blockAutomaticCardPass": false, + "note": "Every newly-live or remaining failing control and known partial bounds case reviewed; real-input manual follow-ups are applied. Unchanged prior passing controls retain their saved proof. Five missing summaries remain separately identified with null index. No source-only live verdicts.", + "effectiveControlVerdicts": [ + { + "width": 710, + "index": 0, + "label": "Pump stroke phase", + "verdict": "live", + "basis": "independent visual review" + }, + { + "width": 710, + "index": 1, + "label": "\u2190 Previous", + "verdict": "live", + "basis": "independent visual review" + }, + { + "width": 710, + "index": 2, + "label": "Next \u2192", + "verdict": "live", + "basis": "unchanged prior-pass evidence" + } + ], + "supplementalControlCount": 0, + "supplementalAllLive": true, + "reviewedAllControlsLive": true + }, + { + "prompt": "zipper", + "v3Result": { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/codex/zipper/result.json", + "sha256": "7f65dabb87c02c0835be319aed69e781f3a7cb333cebe528eb5eed7c7b85ba9b" + }, + "cardVisible": true, + "automaticCardPass": true, + "originalConfirmedDeadControls": [], + "newlyLiveControls": [ + { + "width": 710, + "index": 0 + } + ], + "reviewedControlVerdicts": [ + { + "width": 710, + "index": 0, + "verdict": "live", + "identityMatch": true + } + ], + "runtimeErrors": [], + "blockAutomaticCardPass": false, + "note": "Every newly-live or remaining failing control and known partial bounds case reviewed; real-input manual follow-ups are applied. Unchanged prior passing controls retain their saved proof. Five missing summaries remain separately identified with null index. No source-only live verdicts.", + "effectiveControlVerdicts": [ + { + "width": 710, + "index": 0, + "label": "Zipper slider position; up closes and down opens", + "verdict": "live", + "basis": "independent visual review" + }, + { + "width": 710, + "index": 1, + "label": "Move slider toward closed", + "verdict": "live", + "basis": "unchanged prior-pass evidence" + } + ], + "supplementalControlCount": 0, + "supplementalAllLive": true, + "reviewedAllControlsLive": true + }, + { + "prompt": "toilet", + "v3Result": { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/codex/toilet/result.json", + "sha256": "a5fcea357e99e3116d250857f0477a4e8230b19e1052d4f01271ac2d444b9f8d" + }, + "cardVisible": true, + "automaticCardPass": false, + "originalConfirmedDeadControls": [], + "newlyLiveControls": [ + { + "width": 710, + "index": 1 + } + ], + "reviewedControlVerdicts": [ + { + "width": 710, + "index": 1, + "verdict": "live", + "identityMatch": true + } + ], + "runtimeErrors": [], + "blockAutomaticCardPass": false, + "note": "Every newly-live or remaining failing control and known partial bounds case reviewed; real-input manual follow-ups are applied. Unchanged prior passing controls retain their saved proof. Five missing summaries remain separately identified with null index. No source-only live verdicts.", + "effectiveControlVerdicts": [ + { + "width": 710, + "index": 0, + "label": "step", + "verdict": "live", + "basis": "unchanged prior-pass evidence" + }, + { + "width": 710, + "index": 1, + "label": "\u2190 Back", + "verdict": "live", + "basis": "independent visual review" + }, + { + "width": 710, + "index": 2, + "label": "Next \u2192", + "verdict": "live", + "basis": "unchanged prior-pass evidence" + } + ], + "supplementalControlCount": 0, + "supplementalAllLive": true, + "reviewedAllControlsLive": true + }, + { + "prompt": "thermos", + "v3Result": { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/codex/thermos/result.json", + "sha256": "4ec3c141f937d2a3a6276e681e3a2b9021fd20c747094d7a893f2fee6aa1b2c2" + }, + "cardVisible": true, + "automaticCardPass": false, + "originalConfirmedDeadControls": [], + "newlyLiveControls": [ + { + "width": 710, + "index": 0 + }, + { + "width": 710, + "index": 1 + }, + { + "width": 710, + "index": 2 + } + ], + "reviewedControlVerdicts": [ + { + "width": 710, + "index": 0, + "verdict": "dead", + "identityMatch": true + }, + { + "width": 710, + "index": 1, + "verdict": "dead", + "identityMatch": true + }, + { + "width": 710, + "index": 2, + "verdict": "dead", + "identityMatch": true + } + ], + "runtimeErrors": [], + "blockAutomaticCardPass": false, + "note": "Every newly-live or remaining failing control and known partial bounds case reviewed; real-input manual follow-ups are applied. Unchanged prior passing controls retain their saved proof. Five missing summaries remain separately identified with null index. No source-only live verdicts.", + "effectiveControlVerdicts": [ + { + "width": 710, + "index": 0, + "label": "ClosedOpen", + "verdict": "dead", + "basis": "independent visual review" + }, + { + "width": 710, + "index": 1, + "label": "VacuumAir filled", + "verdict": "dead", + "basis": "independent visual review" + }, + { + "width": 710, + "index": 2, + "label": "ReflectiveNonreflective", + "verdict": "dead", + "basis": "independent visual review" + } + ], + "supplementalControlCount": 0, + "supplementalAllLive": true, + "reviewedAllControlsLive": false + }, + { + "prompt": "door-lock", + "v3Result": { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/codex/door-lock/result.json", + "sha256": "1924bf1564ac33783e2ca9a3b49cb342f280c24af3ce8d3e90651953bef425fd" + }, + "cardVisible": true, + "automaticCardPass": true, + "originalConfirmedDeadControls": [], + "newlyLiveControls": [], + "reviewedControlVerdicts": [], + "runtimeErrors": [], + "blockAutomaticCardPass": false, + "note": "Every newly-live or remaining failing control and known partial bounds case reviewed; real-input manual follow-ups are applied. Unchanged prior passing controls retain their saved proof. Five missing summaries remain separately identified with null index. No source-only live verdicts.", + "effectiveControlVerdicts": [ + { + "width": 710, + "index": 0, + "label": "No keyWrong keyRight key", + "verdict": "live", + "basis": "unchanged prior-pass evidence" + }, + { + "width": 710, + "index": 1, + "label": "Turn key", + "verdict": "live", + "basis": "unchanged prior-pass evidence" + } + ], + "supplementalControlCount": 1, + "supplementalAllLive": true, + "reviewedAllControlsLive": true + }, + { + "prompt": "refrigerator", + "v3Result": { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/codex/refrigerator/result.json", + "sha256": "6343a865a83a503506f0e0fc0560c0610b485048e03abba750d32f1a0c40a902" + }, + "cardVisible": true, + "automaticCardPass": true, + "originalConfirmedDeadControls": [], + "newlyLiveControls": [ + { + "width": 710, + "index": 0 + } + ], + "reviewedControlVerdicts": [ + { + "width": 710, + "index": 0, + "verdict": "live", + "identityMatch": true + } + ], + "runtimeErrors": [], + "blockAutomaticCardPass": false, + "note": "Every newly-live or remaining failing control and known partial bounds case reviewed; real-input manual follow-ups are applied. Unchanged prior passing controls retain their saved proof. Five missing summaries remain separately identified with null index. No source-only live verdicts.", + "effectiveControlVerdicts": [ + { + "width": 710, + "index": 0, + "label": "Inside: heat absorbedRoom: heat releasedCompressorExpansion restriction", + "verdict": "live", + "basis": "independent visual review" + }, + { + "width": 710, + "index": 1, + "label": "phase", + "verdict": "live", + "basis": "unchanged prior-pass evidence" + } + ], + "supplementalControlCount": 0, + "supplementalAllLive": true, + "reviewedAllControlsLive": true + }, + { + "prompt": "stapler", + "v3Result": { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/codex/stapler/result.json", + "sha256": "047bd19b2bf32790de9aabaccd4e9c3555e44a7dcba858303d29b3930b90749a" + }, + "cardVisible": true, + "automaticCardPass": false, + "originalConfirmedDeadControls": [], + "newlyLiveControls": [ + { + "width": 710, + "index": 0 + }, + { + "width": 710, + "index": 1 + } + ], + "reviewedControlVerdicts": [ + { + "width": 710, + "index": 0, + "verdict": "live", + "identityMatch": true + }, + { + "width": 710, + "index": 1, + "verdict": "live", + "identityMatch": true + } + ], + "runtimeErrors": [], + "blockAutomaticCardPass": false, + "note": "Every newly-live or remaining failing control and known partial bounds case reviewed; real-input manual follow-ups are applied. Unchanged prior passing controls retain their saved proof. Five missing summaries remain separately identified with null index. No source-only live verdicts.", + "effectiveControlVerdicts": [ + { + "width": 710, + "index": 0, + "label": "Stapling cycle. Use left and right arrows.", + "verdict": "live", + "basis": "independent visual review" + }, + { + "width": 710, + "index": 1, + "label": "\u2190 Back", + "verdict": "live", + "basis": "independent visual review" + }, + { + "width": 710, + "index": 2, + "label": "Next \u2192", + "verdict": "live", + "basis": "unchanged prior-pass evidence" + } + ], + "supplementalControlCount": 0, + "supplementalAllLive": true, + "reviewedAllControlsLive": true + }, + { + "prompt": "spray-bottle", + "v3Result": { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/codex/spray-bottle/result.json", + "sha256": "0db03fcce6247c6d588500c618e249ed3b843c01fc427d87dfa2a001ce33b718" + }, + "cardVisible": true, + "automaticCardPass": false, + "originalConfirmedDeadControls": [], + "newlyLiveControls": [ + { + "width": 710, + "index": 0 + }, + { + "width": 710, + "index": 1 + }, + { + "width": 710, + "index": 2 + } + ], + "reviewedControlVerdicts": [ + { + "width": 710, + "index": 0, + "verdict": "dead", + "identityMatch": true + }, + { + "width": 710, + "index": 1, + "verdict": "dead", + "identityMatch": true + }, + { + "width": 710, + "index": 2, + "verdict": "dead", + "identityMatch": true + } + ], + "runtimeErrors": [], + "blockAutomaticCardPass": false, + "note": "Every newly-live or remaining failing control and known partial bounds case reviewed; real-input manual follow-ups are applied. Unchanged prior passing controls retain their saved proof. Five missing summaries remain separately identified with null index. No source-only live verdicts.", + "effectiveControlVerdicts": [ + { + "width": 710, + "index": 0, + "label": "Spray bottle pump. Right arrow squeezes; left arrow releases.", + "verdict": "dead", + "basis": "independent visual review" + }, + { + "width": 710, + "index": 1, + "label": "Squeeze trigger", + "verdict": "dead", + "basis": "independent visual review" + }, + { + "width": 710, + "index": 2, + "label": "Release trigger", + "verdict": "dead", + "basis": "independent visual review" + } + ], + "supplementalControlCount": 0, + "supplementalAllLive": true, + "reviewedAllControlsLive": false + }, + { + "prompt": "seat-belt", + "v3Result": { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/codex/seat-belt/result.json", + "sha256": "7128f5ae9629ba1d998ca8fd84f676e7627ab0ebfd4440a93cc7a2fed0b3681b" + }, + "cardVisible": true, + "automaticCardPass": true, + "originalConfirmedDeadControls": [], + "newlyLiveControls": [ + { + "width": 710, + "index": 0 + } + ], + "reviewedControlVerdicts": [ + { + "width": 710, + "index": 0, + "verdict": "live", + "identityMatch": true + } + ], + "runtimeErrors": [], + "blockAutomaticCardPass": false, + "note": "Every newly-live or remaining failing control and known partial bounds case reviewed; real-input manual follow-ups are applied. Unchanged prior passing controls retain their saved proof. Five missing summaries remain separately identified with null index. No source-only live verdicts.", + "effectiveControlVerdicts": [ + { + "width": 710, + "index": 0, + "label": "Belt reelBelt \u2192Locking catchInertia weight", + "verdict": "live", + "basis": "independent visual review" + }, + { + "width": 710, + "index": 1, + "label": "Normal movement", + "verdict": "live", + "basis": "unchanged prior-pass evidence" + }, + { + "width": 710, + "index": 2, + "label": "Sudden braking", + "verdict": "live", + "basis": "unchanged prior-pass evidence" + }, + { + "width": 710, + "index": 3, + "label": "Release tension", + "verdict": "live", + "basis": "unchanged prior-pass evidence" + } + ], + "supplementalControlCount": 0, + "supplementalAllLive": true, + "reviewedAllControlsLive": true + }, + { + "prompt": "toaster", + "v3Result": { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/codex/toaster/result.json", + "sha256": "8b66dfff80073452140289f7e49e521edf9ea5be7b036aaa6633155066555141" + }, + "cardVisible": true, + "automaticCardPass": true, + "originalConfirmedDeadControls": [], + "newlyLiveControls": [ + { + "width": 710, + "index": 0 + } + ], + "reviewedControlVerdicts": [ + { + "width": 710, + "index": 0, + "verdict": "live", + "identityMatch": true + } + ], + "runtimeErrors": [], + "blockAutomaticCardPass": false, + "note": "Every newly-live or remaining failing control and known partial bounds case reviewed; real-input manual follow-ups are applied. Unchanged prior passing controls retain their saved proof. Five missing summaries remain separately identified with null index. No source-only live verdicts.", + "effectiveControlVerdicts": [ + { + "width": 710, + "index": 0, + "label": "Toasting cycle", + "verdict": "live", + "basis": "independent visual review" + }, + { + "width": 710, + "index": 1, + "label": "Toasting cycle", + "verdict": "live", + "basis": "unchanged prior-pass evidence" + } + ], + "supplementalControlCount": 0, + "supplementalAllLive": true, + "reviewedAllControlsLive": true + }, + { + "prompt": "umbrella", + "v3Result": { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/codex/umbrella/result.json", + "sha256": "679098d81ad5f331bf6e5954b5910c722e62ecf1fba15e33b0f2e4f2fb12ce05" + }, + "cardVisible": true, + "automaticCardPass": true, + "originalConfirmedDeadControls": [], + "newlyLiveControls": [ + { + "width": 710, + "index": 0 + } + ], + "reviewedControlVerdicts": [ + { + "width": 710, + "index": 0, + "verdict": "live", + "identityMatch": true + } + ], + "runtimeErrors": [], + "blockAutomaticCardPass": false, + "note": "Every newly-live or remaining failing control and known partial bounds case reviewed; real-input manual follow-ups are applied. Unchanged prior passing controls retain their saved proof. Five missing summaries remain separately identified with null index. No source-only live verdicts.", + "effectiveControlVerdicts": [ + { + "width": 710, + "index": 0, + "label": "Fig 1Manual umbrella \u00b7 section viewMove the runnerClosed", + "verdict": "live", + "basis": "independent visual review" + }, + { + "width": 710, + "index": 1, + "label": "Runner position", + "verdict": "live", + "basis": "unchanged prior-pass evidence" + }, + { + "width": 710, + "index": 2, + "label": "Open", + "verdict": "live", + "basis": "unchanged prior-pass evidence" + }, + { + "width": 710, + "index": 3, + "label": "Release & close", + "verdict": "live", + "basis": "unchanged prior-pass evidence" + } + ], + "supplementalControlCount": 1, + "supplementalAllLive": true, + "reviewedAllControlsLive": true + }, + { + "prompt": "cdn", + "v3Result": { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/codex/cdn/result.json", + "sha256": "82626a0e95d104eca2455528a68df908732bd1fae7d95c0256d30ff5449bf405" + }, + "cardVisible": true, + "automaticCardPass": false, + "originalConfirmedDeadControls": [], + "newlyLiveControls": [ + { + "width": 710, + "index": 0 + }, + { + "width": 710, + "index": 1 + }, + { + "width": 710, + "index": 3 + }, + { + "width": 710, + "index": 5 + } + ], + "reviewedControlVerdicts": [ + { + "width": 710, + "index": 0, + "verdict": "unproven", + "identityMatch": true + }, + { + "width": 710, + "index": 1, + "verdict": "dead", + "identityMatch": true + }, + { + "width": 710, + "index": 3, + "verdict": "live", + "identityMatch": true + }, + { + "width": 710, + "index": 5, + "verdict": "dead", + "identityMatch": true + }, + { + "width": 710, + "index": 2, + "verdict": "dead", + "identityMatch": true + } + ], + "runtimeErrors": [], + "blockAutomaticCardPass": false, + "note": "Every newly-live or remaining failing control and known partial bounds case reviewed; real-input manual follow-ups are applied. Unchanged prior passing controls retain their saved proof. Five missing summaries remain separately identified with null index. No source-only live verdicts.", + "effectiveControlVerdicts": [ + { + "width": 710, + "index": 0, + "label": "Fig 1 \u00b7 Distributed copiesBefore purge\n\n\nv1Edge Av1 cachedv1Edge Bv1 cachedv1Edge Cv1 cached\nv1Origi", + "verdict": "unproven", + "basis": "independent visual review" + }, + { + "width": 710, + "index": 1, + "label": "phase", + "verdict": "dead", + "basis": "independent visual review" + }, + { + "width": 710, + "index": 2, + "label": "Edge AEdge BEdge C", + "verdict": "dead", + "basis": "independent visual review" + }, + { + "width": 710, + "index": 3, + "label": "browser", + "verdict": "live", + "basis": "independent visual review" + }, + { + "width": 710, + "index": 4, + "label": "origin", + "verdict": "live", + "basis": "unchanged prior-pass evidence" + }, + { + "width": 710, + "index": 5, + "label": "Next stage \u2192", + "verdict": "dead", + "basis": "independent visual review" + } + ], + "supplementalControlCount": 1, + "supplementalAllLive": true, + "reviewedAllControlsLive": false + }, + { + "prompt": "notification-settings", + "v3Result": { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/codex/notification-settings/result.json", + "sha256": "9288ebb06f17cd71a3dd1bd6eccaf65e6a09a862b6c9d2a92c27e2ea2599d0aa" + }, + "cardVisible": true, + "automaticCardPass": false, + "originalConfirmedDeadControls": [], + "newlyLiveControls": [ + { + "width": 598, + "index": 0 + }, + { + "width": 598, + "index": 1 + }, + { + "width": 598, + "index": 2 + }, + { + "width": 598, + "index": 3 + }, + { + "width": 598, + "index": 4 + } + ], + "reviewedControlVerdicts": [ + { + "width": 598, + "index": 0, + "verdict": "live", + "identityMatch": true + }, + { + "width": 598, + "index": 1, + "verdict": "live", + "identityMatch": true + }, + { + "width": 598, + "index": 2, + "verdict": "live", + "identityMatch": true + }, + { + "width": 598, + "index": 3, + "verdict": "live", + "identityMatch": true + }, + { + "width": 598, + "index": 4, + "verdict": "live", + "identityMatch": true + } + ], + "runtimeErrors": [], + "blockAutomaticCardPass": false, + "note": "Every newly-live or remaining failing control and known partial bounds case reviewed; real-input manual follow-ups are applied. Unchanged prior passing controls retain their saved proof. Five missing summaries remain separately identified with null index. No source-only live verdicts.", + "effectiveControlVerdicts": [ + { + "width": 598, + "index": 0, + "label": "Email notifications", + "verdict": "live", + "basis": "independent visual review" + }, + { + "width": 598, + "index": 1, + "label": "Push notifications", + "verdict": "live", + "basis": "independent visual review" + }, + { + "width": 598, + "index": 2, + "label": "Daily digest", + "verdict": "live", + "basis": "independent visual review" + }, + { + "width": 598, + "index": 3, + "label": "Preview notifications", + "verdict": "live", + "basis": "independent visual review" + }, + { + "width": 598, + "index": 4, + "label": "Delivery time \u00b7 your local time", + "verdict": "live", + "basis": "independent visual review" + } + ], + "supplementalControlCount": 0, + "supplementalAllLive": true, + "reviewedAllControlsLive": true + }, + { + "prompt": "narrow-toggle", + "v3Result": { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/codex/narrow-toggle/result.json", + "sha256": "5912daefcfe6875e1a33d2428c65d2986b8d54c8dcb6069c4aa73a68da7e7d4f" + }, + "cardVisible": true, + "automaticCardPass": true, + "originalConfirmedDeadControls": [], + "newlyLiveControls": [], + "reviewedControlVerdicts": [], + "runtimeErrors": [], + "blockAutomaticCardPass": false, + "note": "Every newly-live or remaining failing control and known partial bounds case reviewed; real-input manual follow-ups are applied. Unchanged prior passing controls retain their saved proof. Five missing summaries remain separately identified with null index. No source-only live verdicts.", + "effectiveControlVerdicts": [ + { + "width": 360, + "index": 0, + "label": "Dark mode", + "verdict": "live", + "basis": "unchanged prior-pass evidence" + }, + { + "width": 390, + "index": 0, + "label": "Dark mode", + "verdict": "live", + "basis": "unchanged prior-pass evidence" + }, + { + "width": 480, + "index": 0, + "label": "Dark mode", + "verdict": "live", + "basis": "unchanged prior-pass evidence" + } + ], + "supplementalControlCount": 0, + "supplementalAllLive": true, + "reviewedAllControlsLive": true + }, + { + "prompt": "dns", + "v3Result": { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/codex/dns/result.json", + "sha256": "ded728d019f784315f262b671d3f8eff4c7c7d08edfb12ab2cca4b5e6bc9cd75" + }, + "cardVisible": true, + "automaticCardPass": true, + "originalConfirmedDeadControls": [], + "newlyLiveControls": [ + { + "width": 710, + "index": 0 + } + ], + "reviewedControlVerdicts": [ + { + "width": 710, + "index": 0, + "verdict": "live", + "identityMatch": true + }, + { + "width": 710, + "index": 1, + "verdict": "dead", + "identityMatch": true + } + ], + "runtimeErrors": [], + "blockAutomaticCardPass": true, + "note": "Every newly-live or remaining failing control and known partial bounds case reviewed; real-input manual follow-ups are applied. Unchanged prior passing controls retain their saved proof. Five missing summaries remain separately identified with null index. No source-only live verdicts.", + "effectiveControlVerdicts": [ + { + "width": 710, + "index": 0, + "label": "DNS lookup. Use left and right arrows to step.", + "verdict": "live", + "basis": "independent visual review" + }, + { + "width": 710, + "index": 1, + "label": "No cacheAt the resolverOn your device", + "verdict": "dead", + "basis": "independent visual review" + }, + { + "width": 710, + "index": 2, + "label": "step", + "verdict": "live", + "basis": "unchanged prior-pass evidence" + }, + { + "width": 710, + "index": 3, + "label": "Next \u2192", + "verdict": "live", + "basis": "unchanged prior-pass evidence" + } + ], + "supplementalControlCount": 1, + "supplementalAllLive": true, + "reviewedAllControlsLive": false + }, + { + "prompt": "database-index", + "v3Result": { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/codex/database-index/result.json", + "sha256": "4d6ab849479b49e53e9141340cce52edb9019d9b754fd1640989d561db54b5fe" + }, + "cardVisible": true, + "automaticCardPass": false, + "originalConfirmedDeadControls": [], + "newlyLiveControls": [ + { + "width": 710, + "index": 0 + }, + { + "width": 710, + "index": 1 + }, + { + "width": 710, + "index": 2 + } + ], + "reviewedControlVerdicts": [ + { + "width": 710, + "index": 0, + "verdict": "live", + "identityMatch": true + }, + { + "width": 710, + "index": 1, + "verdict": "live", + "identityMatch": true + }, + { + "width": 710, + "index": 2, + "verdict": "live", + "identityMatch": true + } + ], + "runtimeErrors": [], + "blockAutomaticCardPass": false, + "note": "Every newly-live or remaining failing control and known partial bounds case reviewed; real-input manual follow-ups are applied. Unchanged prior passing controls retain their saved proof. Five missing summaries remain separately identified with null index. No source-only live verdicts.", + "effectiveControlVerdicts": [ + { + "width": 710, + "index": 0, + "label": "Table tray; arrow keys change the target ID", + "verdict": "live", + "basis": "independent visual review" + }, + { + "width": 710, + "index": 1, + "label": "B-tree indexFull table scan", + "verdict": "live", + "basis": "independent visual review" + }, + { + "width": 710, + "index": 2, + "label": "123456789101112", + "verdict": "live", + "basis": "independent visual review" + } + ], + "supplementalControlCount": 0, + "supplementalAllLive": true, + "reviewedAllControlsLive": true + }, + { + "prompt": "git-merge", + "v3Result": { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/codex/git-merge/result.json", + "sha256": "9a88555a0509c24be36498aae6a3a108bf100b732769e8ea142bf262784ff0c5" + }, + "cardVisible": true, + "automaticCardPass": false, + "originalConfirmedDeadControls": [], + "newlyLiveControls": [ + { + "width": 710, + "index": 0 + } + ], + "reviewedControlVerdicts": [ + { + "width": 710, + "index": 0, + "verdict": "dead", + "identityMatch": true + } + ], + "runtimeErrors": [], + "blockAutomaticCardPass": false, + "note": "Every newly-live or remaining failing control and known partial bounds case reviewed; real-input manual follow-ups are applied. Unchanged prior passing controls retain their saved proof. Five missing summaries remain separately identified with null index. No source-only live verdicts.", + "effectiveControlVerdicts": [ + { + "width": 710, + "index": 0, + "label": "Different edits \u2192 clean mergeCompeting edits \u2192 conflictMain has no new commits \u2192 fast-forward", + "verdict": "dead", + "basis": "independent visual review" + } + ], + "supplementalControlCount": 1, + "supplementalAllLive": true, + "reviewedAllControlsLive": false + }, + { + "prompt": "load-balancer", + "v3Result": { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/codex/load-balancer/result.json", + "sha256": "5e7b08e6f54782389e16ec5e40b4d2a1544e712f0b5b4c0d786d3a1e069584ec" + }, + "cardVisible": true, + "automaticCardPass": false, + "originalConfirmedDeadControls": [], + "newlyLiveControls": [ + { + "width": 710, + "index": 0 + }, + { + "width": 710, + "index": 3 + } + ], + "reviewedControlVerdicts": [ + { + "width": 710, + "index": 0, + "verdict": "live", + "identityMatch": true + }, + { + "width": 710, + "index": 3, + "verdict": "live", + "identityMatch": true + } + ], + "runtimeErrors": [], + "blockAutomaticCardPass": false, + "note": "Every newly-live or remaining failing control and known partial bounds case reviewed; real-input manual follow-ups are applied. Unchanged prior passing controls retain their saved proof. Five missing summaries remain separately identified with null index. No source-only live verdicts.", + "effectiveControlVerdicts": [ + { + "width": 710, + "index": 0, + "label": "Requests sent", + "verdict": "live", + "basis": "independent visual review" + }, + { + "width": 710, + "index": 1, + "label": "Routing rule", + "verdict": "live", + "basis": "unchanged prior-pass evidence" + }, + { + "width": 710, + "index": 2, + "label": "B marked unhealthy", + "verdict": "live", + "basis": "unchanged prior-pass evidence" + }, + { + "width": 710, + "index": 3, + "label": "What the model represents", + "verdict": "live", + "basis": "independent visual review" + } + ], + "supplementalControlCount": 0, + "supplementalAllLive": true, + "reviewedAllControlsLive": true + }, + { + "prompt": "websocket", + "v3Result": { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/codex/websocket/result.json", + "sha256": "58fafd916565d91e6dcdd18b63f58e33ee5c2f4a6657a6b0a588bf610c5a7737" + }, + "cardVisible": true, + "automaticCardPass": false, + "originalConfirmedDeadControls": [], + "newlyLiveControls": [ + { + "width": 710, + "index": 1 + }, + { + "width": 710, + "index": 3 + } + ], + "reviewedControlVerdicts": [ + { + "width": 710, + "index": 1, + "verdict": "live", + "identityMatch": true + }, + { + "width": 710, + "index": 3, + "verdict": "live", + "identityMatch": true + } + ], + "runtimeErrors": [], + "blockAutomaticCardPass": false, + "note": "Every newly-live or remaining failing control and known partial bounds case reviewed; real-input manual follow-ups are applied. Unchanged prior passing controls retain their saved proof. Five missing summaries remain separately identified with null index. No source-only live verdicts.", + "effectiveControlVerdicts": [ + { + "width": 710, + "index": 0, + "label": "Message journey", + "verdict": "live", + "basis": "unchanged prior-pass evidence" + }, + { + "width": 710, + "index": 1, + "label": "\u2190 Back", + "verdict": "live", + "basis": "independent visual review" + }, + { + "width": 710, + "index": 2, + "label": "Next \u2192", + "verdict": "live", + "basis": "unchanged prior-pass evidence" + }, + { + "width": 710, + "index": 3, + "label": "What this model assumes", + "verdict": "live", + "basis": "independent visual review" + } + ], + "supplementalControlCount": 0, + "supplementalAllLive": true, + "reviewedAllControlsLive": true + } + ], + "manualReviews": [ + { + "revision": "f009de5838f80b90e861e5727f0ad11cba8814f8", + "pluginRevision": "9de99949792c2c59b70693c1dcda6aa8cf36b428", + "provider": "codex", + "prompt": "bicycle-pump", + "width": 710, + "index": 1, + "label": "\u2190 Previous", + "selector": "#prev", + "verdict": "live", + "reason": "Precondition Next enables Previous; click returns compression to fill, raises piston, opens inlet and replaces explanation.", + "mode": "manual-real-input", + "automaticPass": false, + "v3Result": { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/codex/bicycle-pump/result.json", + "sha256": "6f0625b152770c6b5a4cb3028c80270969ea7b22445df4a0b2d4dcf7d9f142e9" + }, + "source": { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/manual-plan-sources/prototype-codex-bicycle-pump.html", + "sha256": "314f1c4c0d740b0be57706bb922b9b4ccbc8c8e564aa9a847a55c1d336d0ee3d" + }, + "request": { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/requests/request-04-codex-bicycle-pump-back.json", + "sha256": "18961c0d4c2e05c043ba7b7541e550489200985a0a80d46412f05eb98b43922f" + }, + "identityMatch": true, + "inventoryMatch": true, + "runtimeErrors": [], + "visuallyInspected": true, + "evidence": [ + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/04-codex-bicycle-pump-back-before2.png", + "sha256": "11c7dcc786f5a24c9da1be3f87196ae7ad4c01829f930a653bda95382cae5f29", + "role": "before2" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/04-codex-bicycle-pump-back-after0.png", + "sha256": "dc11505f2d0a035b33359a9ffbd5acaf4f2066f471e5ef260fc9fd51dcc2efd0", + "role": "after0" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/pairs/04-codex-bicycle-pump-back.png", + "sha256": "584bb4f4dacc8edb913dc620dcc801ed6b634cd5ee8496d5e65470348af332d6", + "role": "visually inspected comparison" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/request-04-codex-bicycle-pump-back.log", + "sha256": "875d3dd38ff3f328e9bbf498a0be23962cfbb085e2a2c93c8aff2a5bf8f45847", + "role": "real input log" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/request-04-codex-bicycle-pump-back.exit.json", + "sha256": "af0ae04b44141625fc2a40a844c0b37224074bfe56f664a2c86b74dcec5e92e7", + "role": "exit" + } + ] + }, + { + "revision": "f009de5838f80b90e861e5727f0ad11cba8814f8", + "pluginRevision": "9de99949792c2c59b70693c1dcda6aa8cf36b428", + "provider": "codex", + "prompt": "stapler", + "width": 710, + "index": 1, + "label": "\u2190 Back", + "selector": "#back", + "verdict": "live", + "reason": "Next enables Back; click returns Press to Ready, lifts driver/staple and changes explanation.", + "mode": "manual-real-input", + "automaticPass": false, + "v3Result": { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/codex/stapler/result.json", + "sha256": "047bd19b2bf32790de9aabaccd4e9c3555e44a7dcba858303d29b3930b90749a" + }, + "source": { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/manual-plan-sources/prototype-codex-stapler.html", + "sha256": "1156bd1349e9b2d4f8b6bd70d08c63dde4c3870859227fcfbb40bcce68c7132d" + }, + "request": { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/requests/request-04-codex-stapler-back.json", + "sha256": "3d726f92f0ee91720fe2fa8d6a90a0aac3dc91fdfeae7369ddf6116d6161e3b6" + }, + "identityMatch": true, + "inventoryMatch": true, + "runtimeErrors": [], + "visuallyInspected": true, + "evidence": [ + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/04-codex-stapler-back-before2.png", + "sha256": "4d2b8921bf62812632ab5e0fc4bcfd5cba49b0523d95b88af2efef57239b3c9d", + "role": "before2" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/04-codex-stapler-back-after0.png", + "sha256": "8dd8d1e4b515d675e6a4e8fa96ecde909735cda0ec71388bdac25d314866773c", + "role": "after0" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/pairs/04-codex-stapler-back.png", + "sha256": "f684923dfdd910dbb25c7d931a62cf3f1641c005527130046c988230c4aab269", + "role": "visually inspected comparison" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/request-04-codex-stapler-back.log", + "sha256": "3747ffb1ffa00f3f712c72dfbdc544bb4cf105f841903b9e2119a986b8f4e5f8", + "role": "real input log" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/request-04-codex-stapler-back.exit.json", + "sha256": "6583c2435c762fd34c7762f55abe7cfeade5ca760ca9a30bca7a4fd31c6125d9", + "role": "exit" + } + ] + }, + { + "revision": "f009de5838f80b90e861e5727f0ad11cba8814f8", + "pluginRevision": "9de99949792c2c59b70693c1dcda6aa8cf36b428", + "provider": "codex", + "prompt": "toilet", + "width": 710, + "index": 1, + "label": "\u2190 Back", + "selector": "#back", + "verdict": "live", + "reason": "Next enables Back; click returns Flush to Ready, restores tank level, closes flapper and changes explanation.", + "mode": "manual-real-input", + "automaticPass": false, + "v3Result": { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/codex/toilet/result.json", + "sha256": "a5fcea357e99e3116d250857f0477a4e8230b19e1052d4f01271ac2d444b9f8d" + }, + "source": { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/manual-plan-sources/prototype-codex-toilet.html", + "sha256": "b5e1bca138d7615e95db8a207132dca3b89dd4f1b0116d38d6789896538cc93b" + }, + "request": { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/requests/request-04-codex-toilet-back.json", + "sha256": "96ad2bcec2ab102370b57209d7e09905b522f653590be71a2545a27a77ee1141" + }, + "identityMatch": true, + "inventoryMatch": true, + "runtimeErrors": [], + "visuallyInspected": true, + "evidence": [ + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/04-codex-toilet-back-before2.png", + "sha256": "65b68393205b4947b9bf6969142c70e8dc7295d07f31433782a3153cf5d9c085", + "role": "before2" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/04-codex-toilet-back-after0.png", + "sha256": "17d76143c243a5406dab09833066e2be2aa0268ae2c47cd5dc170b3862473cb6", + "role": "after0" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/pairs/04-codex-toilet-back.png", + "sha256": "5916cc3fab734452fc0f2d957f0b6a7cb1b263cefcdd243d650b2ac17b6387a4", + "role": "visually inspected comparison" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/request-04-codex-toilet-back.log", + "sha256": "d95f08bb2b3a47b39952a1bb1d7d2c1bf6831dd263f04d9aadd81f7f7662a030", + "role": "real input log" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/request-04-codex-toilet-back.exit.json", + "sha256": "8aa03246089bfea7a1830164742cefda1baba585a7e219f2e9b5d6564877535a", + "role": "exit" + } + ] + }, + { + "revision": "f009de5838f80b90e861e5727f0ad11cba8814f8", + "pluginRevision": "9de99949792c2c59b70693c1dcda6aa8cf36b428", + "provider": "codex", + "prompt": "websocket", + "width": 710, + "index": 1, + "label": "\u2190 Back", + "selector": "#back", + "verdict": "live", + "reason": "Next enables Back; click returns Send to Connection opened, moves packet back to sender and updates explanation.", + "mode": "manual-real-input", + "automaticPass": false, + "v3Result": { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/codex/websocket/result.json", + "sha256": "58fafd916565d91e6dcdd18b63f58e33ee5c2f4a6657a6b0a588bf610c5a7737" + }, + "source": { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/manual-plan-sources/prototype-codex-websocket.html", + "sha256": "ef6a797b228bc623412923eebf501671ff8c9cec12e21998f27ca4ce63494ec7" + }, + "request": { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/requests/request-04-codex-websocket-back.json", + "sha256": "6e04bb71f8c5e6c7cb7cefd6ebb947fd4352f38cea799b36aaa148779b2ab9c1" + }, + "identityMatch": true, + "inventoryMatch": true, + "runtimeErrors": [], + "visuallyInspected": true, + "evidence": [ + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/04-codex-websocket-back-before2.png", + "sha256": "ca8c3713ea0d94cc59d7e1d766f8f61839163951d0ed8582cbaf10a2524246f3", + "role": "before2" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/04-codex-websocket-back-after0.png", + "sha256": "4a61797351732c377e6214845da40c54217a791f769e966c4e4ad76f8e0e246d", + "role": "after0" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/pairs/04-codex-websocket-back.png", + "sha256": "c12064a9920693f90d61ffdeba269862ee7c3ff92006d8081da7c23e4160dec8", + "role": "visually inspected comparison" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/request-04-codex-websocket-back.log", + "sha256": "2b777651599345db21cc11f5a801815621bfa65c09c9090fd5dcd3494b0ae5c1", + "role": "real input log" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/request-04-codex-websocket-back.exit.json", + "sha256": "0eec48972ef017d5ef78e9cc51ea6db57523c40065d5ef346be1bfb200544377", + "role": "exit" + } + ] + }, + { + "revision": "f009de5838f80b90e861e5727f0ad11cba8814f8", + "pluginRevision": "9de99949792c2c59b70693c1dcda6aa8cf36b428", + "provider": "codex", + "prompt": "cdn", + "width": 710, + "index": null, + "label": "Model and real-world caveats", + "selector": "details > summary", + "verdict": "live", + "reason": "Actual summary click expands the previously hidden explanatory paragraphs; read-only details.open changes false to true and actual PNGs show the new text.", + "mode": "manual-real-input", + "automaticPass": null, + "v3Result": { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/codex/cdn/result.json", + "sha256": "82626a0e95d104eca2455528a68df908732bd1fae7d95c0256d30ff5449bf405" + }, + "source": { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/manual-plan-sources/prototype-codex-cdn.html", + "sha256": "1d324a2d8c0b23e69b6b9a9733d61d8444eefa745d5c937047035c5eedfeaf73" + }, + "request": { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/requests/request-05-codex-cdn-disclosure.json", + "sha256": "afe09856c9c2c03af031bba7362eeb6436dc15ef7ef604820553849ff2412617" + }, + "identityMatch": true, + "inventoryMatch": false, + "runtimeErrors": [], + "visuallyInspected": true, + "evidence": [ + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/05-codex-cdn-disclosure-before2.png", + "sha256": "15cbea2051109ff4f723e51c086261c38f5b13599a10a4b9610c6cfe18fc243d", + "role": "before2" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/05-codex-cdn-disclosure-after0.png", + "sha256": "f12fee8b505bad0eed78795d918e0e30f106f1d30e849dd2921f3693490e5c4f", + "role": "after0" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/pairs/05-codex-cdn-disclosure.png", + "sha256": "7b234f5de6626dc3e0dd43bc063a5661e7a7000ac3fc7713a78514f225ce4f8a", + "role": "visually inspected comparison" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/request-05-codex-cdn-disclosure.log", + "sha256": "ccc6297c3a09d0903656491a73a611b9dc6bfc749f3c47f770e9ca400a44bba4", + "role": "real input log" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/request-05-codex-cdn-disclosure.exit.json", + "sha256": "86feab459501ad8a6dc5aee757949bba553a25428028dc63bada032f1e57ff7d", + "role": "exit" + } + ] + }, + { + "revision": "f009de5838f80b90e861e5727f0ad11cba8814f8", + "pluginRevision": "9de99949792c2c59b70693c1dcda6aa8cf36b428", + "provider": "codex", + "prompt": "umbrella", + "width": 710, + "index": null, + "label": "Which parts do what?", + "selector": "details > summary", + "verdict": "live", + "reason": "Actual summary click expands the previously hidden explanatory paragraphs; read-only details.open changes false to true and actual PNGs show the new text.", + "mode": "manual-real-input", + "automaticPass": null, + "v3Result": { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/codex/umbrella/result.json", + "sha256": "679098d81ad5f331bf6e5954b5910c722e62ecf1fba15e33b0f2e4f2fb12ce05" + }, + "source": { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/manual-plan-sources/prototype-codex-umbrella.html", + "sha256": "ef786a81687518d2276aacf241373fa6c10efa9af30058964dde44a7fc9d3049" + }, + "request": { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/requests/request-16-codex-umbrella-disclosure.json", + "sha256": "e8488f5f2fd74b5911b951ebf0e004c1bffe59f3795dc5188b8fca7136dcaf03" + }, + "identityMatch": true, + "inventoryMatch": false, + "runtimeErrors": [], + "visuallyInspected": true, + "evidence": [ + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/16-codex-umbrella-disclosure-before2.png", + "sha256": "39c04d0aa981441647feba10933567fdd6179c519474d57f120b68de3d7626fe", + "role": "before2" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/16-codex-umbrella-disclosure-after0.png", + "sha256": "e063295dc78fb7a5233673b3ef489bc7f22877fe62e5ad69d7571d4ff102c6fc", + "role": "after0" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/pairs/16-codex-umbrella-disclosure.png", + "sha256": "79dbf49513b404c9bdb7fd2a509d1663181ad9a027e90e4f4696de750dcb9069", + "role": "visually inspected comparison" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/request-16-codex-umbrella-disclosure.log", + "sha256": "8cf07276d16a7c2b180efc5acc43c1244c7dff43631f484d412ecdd13b404838", + "role": "real input log" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/request-16-codex-umbrella-disclosure.exit.json", + "sha256": "648f1210b61ceee59eddcc4598da4ae6b92c2554a1bc58ccc3184056bfee4490", + "role": "exit" + } + ] + }, + { + "revision": "f009de5838f80b90e861e5727f0ad11cba8814f8", + "pluginRevision": "9de99949792c2c59b70693c1dcda6aa8cf36b428", + "provider": "codex", + "prompt": "door-lock", + "width": 710, + "index": null, + "label": "What moves the door bolt?", + "selector": "details > summary", + "verdict": "live", + "reason": "Actual summary click expands the previously hidden explanatory paragraphs; read-only details.open changes false to true and actual PNGs show the new text.", + "mode": "manual-real-input", + "automaticPass": null, + "v3Result": { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/codex/door-lock/result.json", + "sha256": "1924bf1564ac33783e2ca9a3b49cb342f280c24af3ce8d3e90651953bef425fd" + }, + "source": { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/manual-plan-sources/prototype-codex-door-lock.html", + "sha256": "7e0ef75272f3357c181912ff7b80255dd77479daa4926f481190790eaab7a1dd" + }, + "request": { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/requests/request-17-codex-door-lock-disclosure.json", + "sha256": "2b17b55c7b5f555fdd0e35553fe143cc4cb74f0f8b41d1c8da57a255e4dbcdd8" + }, + "identityMatch": true, + "inventoryMatch": false, + "runtimeErrors": [], + "visuallyInspected": true, + "evidence": [ + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/17-codex-door-lock-disclosure-before2.png", + "sha256": "5845ce93a6acabf2baf36009d592aad8dfa89f82fc82ce9201b769c2a9f8f08f", + "role": "before2" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/17-codex-door-lock-disclosure-after0.png", + "sha256": "72b1a8130ed29f6861d982324ec1a43789da568c40aa88452b04481184a99406", + "role": "after0" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/pairs/17-codex-door-lock-disclosure.png", + "sha256": "0298869b61f199882b0e7fb2eda3d43f4d2228d9fa435a1cae6198b5509f025c", + "role": "visually inspected comparison" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/request-17-codex-door-lock-disclosure.log", + "sha256": "2ec9519c9a82fc02762486b9833dda7ab4116680b7987b4d3a4b4a1cd1d6c1fc", + "role": "real input log" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/request-17-codex-door-lock-disclosure.exit.json", + "sha256": "e374d48b596f4307618ba0ddf81fe84a6ce01ef600cbaddd6c09463685c02b29", + "role": "exit" + } + ] + }, + { + "revision": "f009de5838f80b90e861e5727f0ad11cba8814f8", + "pluginRevision": "9de99949792c2c59b70693c1dcda6aa8cf36b428", + "provider": "codex", + "prompt": "dns", + "width": 710, + "index": null, + "label": "What this model leaves out", + "selector": "details > summary", + "verdict": "live", + "reason": "Actual summary click expands the previously hidden explanatory paragraphs; read-only details.open changes false to true and actual PNGs show the new text.", + "mode": "manual-real-input", + "automaticPass": null, + "v3Result": { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/codex/dns/result.json", + "sha256": "ded728d019f784315f262b671d3f8eff4c7c7d08edfb12ab2cca4b5e6bc9cd75" + }, + "source": { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/manual-plan-sources/prototype-codex-dns.html", + "sha256": "1de41685f71e02e42f79e7cd91d640e90deada30a96e1ccd93c3064bf7963831" + }, + "request": { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/requests/request-17-codex-dns-disclosure.json", + "sha256": "5e007c46feddbf67d27ed7df90394aed0b6d76e90e6e6915d74c4356ed4d1331" + }, + "identityMatch": true, + "inventoryMatch": false, + "runtimeErrors": [], + "visuallyInspected": true, + "evidence": [ + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/17-codex-dns-disclosure-before2.png", + "sha256": "19423c8ae637ae47bedf458f642ffd8ed7df83cf86bbff2230f58d75185ed05e", + "role": "before2" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/17-codex-dns-disclosure-after0.png", + "sha256": "0e087e72ac7594be44321abc46158bc58583a47727266ce1978649e0c76809d4", + "role": "after0" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/pairs/17-codex-dns-disclosure.png", + "sha256": "51f712371e82d04dcab5784ffa80a081b31d9fcb1b4edac55c52f33f71669a59", + "role": "visually inspected comparison" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/request-17-codex-dns-disclosure.log", + "sha256": "94260b65022cc497c4a9cb97bb79a68221103119c878062ef2c783397e4bde57", + "role": "real input log" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/request-17-codex-dns-disclosure.exit.json", + "sha256": "9fb4daa3ca10344af2c14dd661f888a4ad527c874ba29415a9a2dcff40950061", + "role": "exit" + } + ] + }, + { + "revision": "f009de5838f80b90e861e5727f0ad11cba8814f8", + "pluginRevision": "9de99949792c2c59b70693c1dcda6aa8cf36b428", + "provider": "codex", + "prompt": "git-merge", + "width": 710, + "index": null, + "label": "What Git compares", + "selector": "details > summary", + "verdict": "live", + "reason": "Actual summary click expands the previously hidden explanatory paragraphs; read-only details.open changes false to true and actual PNGs show the new text.", + "mode": "manual-real-input", + "automaticPass": null, + "v3Result": { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/codex/git-merge/result.json", + "sha256": "9a88555a0509c24be36498aae6a3a108bf100b732769e8ea142bf262784ff0c5" + }, + "source": { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/manual-plan-sources/prototype-codex-git-merge.html", + "sha256": "ade3766c9982d24a07b3783c48753548ca5cd402289648e8fec7ec64009e8717" + }, + "request": { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/requests/request-17-codex-git-merge-disclosure.json", + "sha256": "471a6b592e44ba489133fc2deaba145bf44d41d837db196430e063ce33d6ba65" + }, + "identityMatch": true, + "inventoryMatch": false, + "runtimeErrors": [], + "visuallyInspected": true, + "evidence": [ + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/17-codex-git-merge-disclosure-before2.png", + "sha256": "1610ddf848d31130ad41f86bb8e73884a2590f1c4fba611c7d920ac85b60ad58", + "role": "before2" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/17-codex-git-merge-disclosure-after0.png", + "sha256": "26a291543f319670abc80e820bece6ae54586352d2093ceb22fff5be0fbc11aa", + "role": "after0" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/pairs/17-codex-git-merge-disclosure.png", + "sha256": "3012106a0ee63a5c4f62f83fad04f6f6205faf882f93cbf302aca1ea01701415", + "role": "visually inspected comparison" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/request-17-codex-git-merge-disclosure.log", + "sha256": "0d2fd3f0724b91a78b5240afff8365df340570b9cd4cf06650772a132088e023", + "role": "real input log" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/request-17-codex-git-merge-disclosure.exit.json", + "sha256": "cd31e24331111c1c165e9299c27e21e6f31201b945c9165062e8f86e9d1bd066", + "role": "exit" + } + ] + }, + { + "revision": "f009de5838f80b90e861e5727f0ad11cba8814f8", + "pluginRevision": "9de99949792c2c59b70693c1dcda6aa8cf36b428", + "provider": "codex", + "prompt": "websocket", + "width": 710, + "index": 3, + "label": "What this model assumes", + "selector": "details > summary", + "verdict": "live", + "reason": "Actual summary click expands the previously hidden explanatory paragraphs; read-only details.open changes false to true and actual PNGs show the new text.", + "mode": "manual-real-input", + "automaticPass": false, + "v3Result": { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/codex/websocket/result.json", + "sha256": "58fafd916565d91e6dcdd18b63f58e33ee5c2f4a6657a6b0a588bf610c5a7737" + }, + "source": { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/manual-plan-sources/prototype-codex-websocket.html", + "sha256": "ef6a797b228bc623412923eebf501671ff8c9cec12e21998f27ca4ce63494ec7" + }, + "request": { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/requests/request-17-codex-websocket-disclosure.json", + "sha256": "03ada2b69d4573fb01f4dc5110ad39460020d99e53c5b805ea5d0daeb4223746" + }, + "identityMatch": true, + "inventoryMatch": true, + "runtimeErrors": [], + "visuallyInspected": true, + "evidence": [ + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/17-codex-websocket-disclosure-before2.png", + "sha256": "4a61797351732c377e6214845da40c54217a791f769e966c4e4ad76f8e0e246d", + "role": "before2" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/17-codex-websocket-disclosure-after0.png", + "sha256": "c268b03eff463c50260341d96061c621f8250546a1ba0512eee0a7b7ce0e2e4f", + "role": "after0" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/pairs/17-codex-websocket-disclosure.png", + "sha256": "25543093e18aa9b003bcb5deaa33217ab0f6831ea9deb481204b1ac44ff8d189", + "role": "visually inspected comparison" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/request-17-codex-websocket-disclosure.log", + "sha256": "896fe886cde6809533941e117b9b2e9eb4446a6b2a89cb56a22a3e253c2dd3d6", + "role": "real input log" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/request-17-codex-websocket-disclosure.exit.json", + "sha256": "af3e35e9469cc463ec33fbc9980a7b08e2339df55f0aa26ac9bc9b6c5faa8652", + "role": "exit" + } + ] + }, + { + "revision": "f009de5838f80b90e861e5727f0ad11cba8814f8", + "pluginRevision": "9de99949792c2c59b70693c1dcda6aa8cf36b428", + "provider": "codex", + "prompt": "load-balancer", + "width": 710, + "index": 3, + "label": "What the model represents", + "selector": "details > summary", + "verdict": "live", + "reason": "Actual summary click expands the previously hidden explanatory paragraphs; read-only details.open changes false to true and actual PNGs show the new text.", + "mode": "manual-real-input", + "automaticPass": false, + "v3Result": { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/codex/load-balancer/result.json", + "sha256": "5e7b08e6f54782389e16ec5e40b4d2a1544e712f0b5b4c0d786d3a1e069584ec" + }, + "source": { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/manual-plan-sources/prototype-codex-load-balancer.html", + "sha256": "5dd95aac25ff2c5d2d32bcd17f56abffc1ebbc7fa2b69bfbfce3a6b3dd925d3b" + }, + "request": { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/requests/request-17-codex-load-balancer-disclosure.json", + "sha256": "bb7420b09285dbaf113ba04e2495c038d3dddef91acafc5dd495363203527b56" + }, + "identityMatch": true, + "inventoryMatch": true, + "runtimeErrors": [], + "visuallyInspected": true, + "evidence": [ + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/17-codex-load-balancer-disclosure-before2.png", + "sha256": "f0af9a6217ed87e791ca55802833526de5110a000ad68e30889aa787d774dd14", + "role": "before2" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/17-codex-load-balancer-disclosure-after0.png", + "sha256": "faec2d6a0cb9f9917c0fce0ef3ad827dbcc06c26f74b9131ee7e1eb66675b2b2", + "role": "after0" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/pairs/17-codex-load-balancer-disclosure.png", + "sha256": "c0c0bd8a6348b169b432087e4ef708a48744bacb980c073fe51d17c1a85f87e4", + "role": "visually inspected comparison" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/request-17-codex-load-balancer-disclosure.log", + "sha256": "ed374e841c1c9b2074205a0519e2aef4dc33aa3465e91916cdee5f293f599d27", + "role": "real input log" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/request-17-codex-load-balancer-disclosure.exit.json", + "sha256": "a95926e80452fc493794cc3d6704d20062ca43f7534b41d738866b2f127baef1", + "role": "exit" + } + ] + }, + { + "revision": "f009de5838f80b90e861e5727f0ad11cba8814f8", + "pluginRevision": "9de99949792c2c59b70693c1dcda6aa8cf36b428", + "provider": "codex", + "prompt": "notification-settings", + "width": 598, + "index": 3, + "label": "Preview notifications", + "selector": "#test", + "verdict": "live", + "reason": "Click Preview notifications reveals the external preview panel with Email and Push examples.", + "mode": "manual-real-input", + "automaticPass": false, + "v3Result": { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/codex/notification-settings/result.json", + "sha256": "9288ebb06f17cd71a3dd1bd6eccaf65e6a09a862b6c9d2a92c27e2ea2599d0aa" + }, + "source": { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/manual-plan-sources/prototype-codex-notification-settings.html", + "sha256": "f81d5cdb0bb999c43d41b308a2102a0f5c731c0c5922bd9ae5f334997a95dbae" + }, + "request": { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/requests/request-07-codex-notification-preview.json", + "sha256": "f16d72a4f668d4216ee21d081ee59a823c251222c15070638f255be931aa901c" + }, + "identityMatch": true, + "inventoryMatch": true, + "runtimeErrors": [], + "visuallyInspected": true, + "evidence": [ + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/07-codex-notification-preview-before2.png", + "sha256": "b76498af60be9de80c11d2180f3e6d58527a089656efb942fe082f6e5a6d4145", + "role": "before2" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/07-codex-notification-preview-after0.png", + "sha256": "c47e2f7ce05a35fe03c824ebf0f52c90d05237fdbf4df0b28376981f81b1a8d8", + "role": "after0" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/pairs/07-codex-notification-preview.png", + "sha256": "159629e3b76d47d2819b444ca2f9949f002c422de34f6bff5452724ecbdedbe5", + "role": "visually inspected comparison" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/request-07-codex-notification-preview.log", + "sha256": "eb5db1962deb1dd447c5d98e9b20cff17cd71f0b54635897a854e72fb7484506", + "role": "real input log" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/request-07-codex-notification-preview.exit.json", + "sha256": "fb1ca2118cf61bed0a0a07ce25dee0f4b8ce3d85701125c0c05050687892d176", + "role": "exit" + } + ] + }, + { + "revision": "f009de5838f80b90e861e5727f0ad11cba8814f8", + "pluginRevision": "9de99949792c2c59b70693c1dcda6aa8cf36b428", + "provider": "codex", + "prompt": "notification-settings", + "width": 598, + "index": 0, + "label": "Email notifications", + "selector": "[data-param=\"email\"]", + "verdict": "live", + "reason": "After opening preview, Email click removes its example while keeping Push; meaningful external text change.", + "mode": "manual-real-input", + "automaticPass": false, + "v3Result": { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/codex/notification-settings/result.json", + "sha256": "9288ebb06f17cd71a3dd1bd6eccaf65e6a09a862b6c9d2a92c27e2ea2599d0aa" + }, + "source": { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/manual-plan-sources/prototype-codex-notification-settings.html", + "sha256": "f81d5cdb0bb999c43d41b308a2102a0f5c731c0c5922bd9ae5f334997a95dbae" + }, + "request": { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/requests/request-07-codex-notification-preview.json", + "sha256": "f16d72a4f668d4216ee21d081ee59a823c251222c15070638f255be931aa901c" + }, + "identityMatch": true, + "inventoryMatch": true, + "runtimeErrors": [], + "visuallyInspected": true, + "evidence": [ + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/07-codex-notification-preview-email-before2.png", + "sha256": "c47e2f7ce05a35fe03c824ebf0f52c90d05237fdbf4df0b28376981f81b1a8d8", + "role": "before2" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/07-codex-notification-preview-email-after0.png", + "sha256": "6f55028bff3588dd2ada6beed5e1a874c62b9fa4c2236e42a2cdbf646b945749", + "role": "after0" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/pairs/07-codex-notification-preview-email.png", + "sha256": "b38e5720593ac90555903865ec80ebf7a62ad58c28573bf6aab28bf4708384e6", + "role": "visually inspected comparison" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/request-07-codex-notification-preview.log", + "sha256": "eb5db1962deb1dd447c5d98e9b20cff17cd71f0b54635897a854e72fb7484506", + "role": "real input log" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/request-07-codex-notification-preview.exit.json", + "sha256": "fb1ca2118cf61bed0a0a07ce25dee0f4b8ce3d85701125c0c05050687892d176", + "role": "exit" + } + ] + }, + { + "revision": "f009de5838f80b90e861e5727f0ad11cba8814f8", + "pluginRevision": "9de99949792c2c59b70693c1dcda6aa8cf36b428", + "provider": "codex", + "prompt": "notification-settings", + "width": 598, + "index": 1, + "label": "Push notifications", + "selector": "[data-param=\"push\"]", + "verdict": "live", + "reason": "With preview visible, Push click changes the Push example to All notifications are off.", + "mode": "manual-real-input", + "automaticPass": false, + "v3Result": { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/codex/notification-settings/result.json", + "sha256": "9288ebb06f17cd71a3dd1bd6eccaf65e6a09a862b6c9d2a92c27e2ea2599d0aa" + }, + "source": { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/manual-plan-sources/prototype-codex-notification-settings.html", + "sha256": "f81d5cdb0bb999c43d41b308a2102a0f5c731c0c5922bd9ae5f334997a95dbae" + }, + "request": { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/requests/request-07-codex-notification-preview.json", + "sha256": "f16d72a4f668d4216ee21d081ee59a823c251222c15070638f255be931aa901c" + }, + "identityMatch": true, + "inventoryMatch": true, + "runtimeErrors": [], + "visuallyInspected": true, + "evidence": [ + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/07-codex-notification-preview-push-before2.png", + "sha256": "6f55028bff3588dd2ada6beed5e1a874c62b9fa4c2236e42a2cdbf646b945749", + "role": "before2" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/07-codex-notification-preview-push-after0.png", + "sha256": "aa450a51ac2464bd4d09f107bf9303893bd07a2cab2086fdf216b5caa632746b", + "role": "after0" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/pairs/07-codex-notification-preview-push.png", + "sha256": "55c672acaf1c70bed43eb6ac3ffb1f3b2386271bd36832ed4f49d3a3d69c71f6", + "role": "visually inspected comparison" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/request-07-codex-notification-preview.log", + "sha256": "eb5db1962deb1dd447c5d98e9b20cff17cd71f0b54635897a854e72fb7484506", + "role": "real input log" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/request-07-codex-notification-preview.exit.json", + "sha256": "fb1ca2118cf61bed0a0a07ce25dee0f4b8ce3d85701125c0c05050687892d176", + "role": "exit" + } + ] + }, + { + "revision": "f009de5838f80b90e861e5727f0ad11cba8814f8", + "pluginRevision": "9de99949792c2c59b70693c1dcda6aa8cf36b428", + "provider": "codex", + "prompt": "notification-settings", + "width": 598, + "index": 2, + "label": "Daily digest", + "selector": "[data-param=\"digest\"]", + "verdict": "live", + "reason": "Daily digest click exposes the schedule select and changes external preview to Daily digest at 9 AM.", + "mode": "manual-real-input", + "automaticPass": false, + "v3Result": { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/codex/notification-settings/result.json", + "sha256": "9288ebb06f17cd71a3dd1bd6eccaf65e6a09a862b6c9d2a92c27e2ea2599d0aa" + }, + "source": { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/manual-plan-sources/prototype-codex-notification-settings.html", + "sha256": "f81d5cdb0bb999c43d41b308a2102a0f5c731c0c5922bd9ae5f334997a95dbae" + }, + "request": { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/requests/request-07-codex-notification-preview.json", + "sha256": "f16d72a4f668d4216ee21d081ee59a823c251222c15070638f255be931aa901c" + }, + "identityMatch": true, + "inventoryMatch": true, + "runtimeErrors": [], + "visuallyInspected": true, + "evidence": [ + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/07-codex-notification-preview-digest-before2.png", + "sha256": "aa450a51ac2464bd4d09f107bf9303893bd07a2cab2086fdf216b5caa632746b", + "role": "before2" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/07-codex-notification-preview-digest-after0.png", + "sha256": "67c1066b59329f1874496f530a2ed553a6da17ee7d08db8deb5959889d5c3d29", + "role": "after0" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/pairs/07-codex-notification-preview-digest.png", + "sha256": "1d5a6731c1f20ba98aacf643bfbf3058ed14017925ab3d5f3bd5c9fe8c57ee4a", + "role": "visually inspected comparison" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/request-07-codex-notification-preview.log", + "sha256": "eb5db1962deb1dd447c5d98e9b20cff17cd71f0b54635897a854e72fb7484506", + "role": "real input log" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/request-07-codex-notification-preview.exit.json", + "sha256": "fb1ca2118cf61bed0a0a07ce25dee0f4b8ce3d85701125c0c05050687892d176", + "role": "exit" + } + ] + }, + { + "revision": "f009de5838f80b90e861e5727f0ad11cba8814f8", + "pluginRevision": "9de99949792c2c59b70693c1dcda6aa8cf36b428", + "provider": "codex", + "prompt": "notification-settings", + "width": 598, + "index": 4, + "label": "Delivery time \u00b7 your local time", + "selector": "[data-param=\"digest_time\"] select", + "verdict": "live", + "reason": "After enabling Daily digest and preview, real Home/Enter then End/Enter changes 7 AM to 6 PM in both select and external preview.", + "mode": "manual-real-input", + "automaticPass": false, + "v3Result": { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/codex/notification-settings/result.json", + "sha256": "9288ebb06f17cd71a3dd1bd6eccaf65e6a09a862b6c9d2a92c27e2ea2599d0aa" + }, + "source": { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/manual-plan-sources/prototype-codex-notification-settings.html", + "sha256": "f81d5cdb0bb999c43d41b308a2102a0f5c731c0c5922bd9ae5f334997a95dbae" + }, + "request": { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/requests/request-07-codex-notification-preview.json", + "sha256": "f16d72a4f668d4216ee21d081ee59a823c251222c15070638f255be931aa901c" + }, + "identityMatch": true, + "inventoryMatch": true, + "runtimeErrors": [], + "visuallyInspected": true, + "evidence": [ + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/07-codex-notification-preview-time-before2.png", + "sha256": "1f1ba70fb3e3bf8f5f7943e4aa58f37432e75c093445e644e1d6fa31c8969900", + "role": "before2" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/07-codex-notification-preview-time-after0.png", + "sha256": "ccb9d8768d523399bbcbd27506138f6e5cc8e4719fb3fc4331951832ae01f64c", + "role": "after0" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/pairs/07-codex-notification-preview-time.png", + "sha256": "b5c5493164ce506b2a8b60bcbe90b0ab6aa36555df59bbb0decdf186eeebc84d", + "role": "visually inspected comparison" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/request-07-codex-notification-preview.log", + "sha256": "eb5db1962deb1dd447c5d98e9b20cff17cd71f0b54635897a854e72fb7484506", + "role": "real input log" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/request-07-codex-notification-preview.exit.json", + "sha256": "fb1ca2118cf61bed0a0a07ce25dee0f4b8ce3d85701125c0c05050687892d176", + "role": "exit" + } + ] + }, + { + "revision": "f009de5838f80b90e861e5727f0ad11cba8814f8", + "pluginRevision": "9de99949792c2c59b70693c1dcda6aa8cf36b428", + "provider": "codex", + "prompt": "thermos", + "width": 710, + "index": 0, + "label": "ClosedOpen", + "selector": "#cap", + "verdict": "dead", + "reason": "Real native Home/Enter to End/Enter changes displayed selection, but actual diagram and explanation remain unchanged. Read-only thermosState.params remains {}. Source supplies string-array options; frozen bridge expects option.value and rejects every intended choice.", + "mode": "manual-real-input", + "automaticPass": false, + "v3Result": { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/codex/thermos/result.json", + "sha256": "4ec3c141f937d2a3a6276e681e3a2b9021fd20c747094d7a893f2fee6aa1b2c2" + }, + "source": { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/manual-plan-sources/prototype-codex-thermos.html", + "sha256": "87767e1db635ac5359596f24ef4821cc4db9445d44611263dc859d00596382db" + }, + "request": { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/requests/request-15-codex-thermos-selects.json", + "sha256": "dbd6ceab6ee4d79ae4634fb01631198a581e0ad77359a83075574374d087d2b9" + }, + "identityMatch": true, + "inventoryMatch": true, + "runtimeErrors": [], + "visuallyInspected": true, + "evidence": [ + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/15-codex-thermos-selects-cap-before2.png", + "sha256": "9159fd889bbeddcb7f9bab910671c014734008aa645c1949590d1d703e6e578f", + "role": "before2" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/15-codex-thermos-selects-cap-after0.png", + "sha256": "e128a96776d1e98a01ef9688d0b544e29fd80b20043e5116a8d0dcb77b5c4ab4", + "role": "after0" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/pairs/15-codex-thermos-selects-cap.png", + "sha256": "fddaa1d5627b6a926a364133d67999032c2d81ce924f6f5c34f55ba00429c7ae", + "role": "visually inspected comparison" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/request-15-codex-thermos-selects.log", + "sha256": "7936e800403591dfaafee40d5099af854f7455bc266bf8b18250245d1b4cd5ef", + "role": "real input log" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/request-15-codex-thermos-selects.exit.json", + "sha256": "b8f37f3349a022cac95cd51e6cb19818c5a699608b7f1e4343ba8ce27ef507e7", + "role": "exit" + } + ] + }, + { + "revision": "f009de5838f80b90e861e5727f0ad11cba8814f8", + "pluginRevision": "9de99949792c2c59b70693c1dcda6aa8cf36b428", + "provider": "codex", + "prompt": "thermos", + "width": 710, + "index": 1, + "label": "VacuumAir filled", + "selector": "#vacuum", + "verdict": "dead", + "reason": "Real native Home/Enter to End/Enter changes displayed selection, but actual diagram and explanation remain unchanged. Read-only thermosState.params remains {}. Source supplies string-array options; frozen bridge expects option.value and rejects every intended choice.", + "mode": "manual-real-input", + "automaticPass": false, + "v3Result": { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/codex/thermos/result.json", + "sha256": "4ec3c141f937d2a3a6276e681e3a2b9021fd20c747094d7a893f2fee6aa1b2c2" + }, + "source": { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/manual-plan-sources/prototype-codex-thermos.html", + "sha256": "87767e1db635ac5359596f24ef4821cc4db9445d44611263dc859d00596382db" + }, + "request": { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/requests/request-15-codex-thermos-selects.json", + "sha256": "dbd6ceab6ee4d79ae4634fb01631198a581e0ad77359a83075574374d087d2b9" + }, + "identityMatch": true, + "inventoryMatch": true, + "runtimeErrors": [], + "visuallyInspected": true, + "evidence": [ + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/15-codex-thermos-selects-vacuum-before2.png", + "sha256": "3a7228f3b3880fd0b9769d825aeb74e823df97180eee1e00283f93211658ae50", + "role": "before2" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/15-codex-thermos-selects-vacuum-after0.png", + "sha256": "2ea09e8f46a7b88f2c801543c48dc6b4dfaeba5d25438543e032c7825cf9f514", + "role": "after0" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/pairs/15-codex-thermos-selects-vacuum.png", + "sha256": "58fd2e7b1f33dd00dbc0b0128d4d4c0f097c793c205050564dcb11844e477fa6", + "role": "visually inspected comparison" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/request-15-codex-thermos-selects.log", + "sha256": "7936e800403591dfaafee40d5099af854f7455bc266bf8b18250245d1b4cd5ef", + "role": "real input log" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/request-15-codex-thermos-selects.exit.json", + "sha256": "b8f37f3349a022cac95cd51e6cb19818c5a699608b7f1e4343ba8ce27ef507e7", + "role": "exit" + } + ] + }, + { + "revision": "f009de5838f80b90e861e5727f0ad11cba8814f8", + "pluginRevision": "9de99949792c2c59b70693c1dcda6aa8cf36b428", + "provider": "codex", + "prompt": "thermos", + "width": 710, + "index": 2, + "label": "ReflectiveNonreflective", + "selector": "#reflect", + "verdict": "dead", + "reason": "Real native Home/Enter to End/Enter changes displayed selection, but actual diagram and explanation remain unchanged. Read-only thermosState.params remains {}. Source supplies string-array options; frozen bridge expects option.value and rejects every intended choice.", + "mode": "manual-real-input", + "automaticPass": false, + "v3Result": { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/codex/thermos/result.json", + "sha256": "4ec3c141f937d2a3a6276e681e3a2b9021fd20c747094d7a893f2fee6aa1b2c2" + }, + "source": { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/manual-plan-sources/prototype-codex-thermos.html", + "sha256": "87767e1db635ac5359596f24ef4821cc4db9445d44611263dc859d00596382db" + }, + "request": { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/requests/request-15-codex-thermos-selects.json", + "sha256": "dbd6ceab6ee4d79ae4634fb01631198a581e0ad77359a83075574374d087d2b9" + }, + "identityMatch": true, + "inventoryMatch": true, + "runtimeErrors": [], + "visuallyInspected": true, + "evidence": [ + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/15-codex-thermos-selects-reflect-before2.png", + "sha256": "ae37dc8f9a7ab6852690761de47dc3a7cba3c981fc874905e1a279716a8769fa", + "role": "before2" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/15-codex-thermos-selects-reflect-after0.png", + "sha256": "8ff11c938a46f6ffe93bcb3d3f8822671a01e8d02ea8e6ac719e0d07fae0af36", + "role": "after0" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/pairs/15-codex-thermos-selects-reflect.png", + "sha256": "3f0ce121e5e86a6b9c031b9ed0f18b80e569d1d5d2a9d2e90ae5d62049688c42", + "role": "visually inspected comparison" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/request-15-codex-thermos-selects.log", + "sha256": "7936e800403591dfaafee40d5099af854f7455bc266bf8b18250245d1b4cd5ef", + "role": "real input log" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/request-15-codex-thermos-selects.exit.json", + "sha256": "b8f37f3349a022cac95cd51e6cb19818c5a699608b7f1e4343ba8ce27ef507e7", + "role": "exit" + } + ] + }, + { + "revision": "f009de5838f80b90e861e5727f0ad11cba8814f8", + "pluginRevision": "9de99949792c2c59b70693c1dcda6aa8cf36b428", + "provider": "codex", + "prompt": "git-merge", + "width": 710, + "index": 0, + "label": "Different edits \u2192 clean mergeCompeting edits \u2192 conflictMain has no new commits \u2192 fast-forward", + "selector": "#scenario", + "verdict": "dead", + "reason": "Real select changes Clean merge to Fast-forward, but actual diagram, merge explanation and history remain Clean merge; params stays {}. String-array options do not match frozen option.value contract.", + "mode": "manual-real-input", + "automaticPass": false, + "v3Result": { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/codex/git-merge/result.json", + "sha256": "9a88555a0509c24be36498aae6a3a108bf100b732769e8ea142bf262784ff0c5" + }, + "source": { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/manual-plan-sources/prototype-codex-git-merge.html", + "sha256": "ade3766c9982d24a07b3783c48753548ca5cd402289648e8fec7ec64009e8717" + }, + "request": { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/requests/request-18-codex-git-select.json", + "sha256": "f84abe61665458737f1daf3173737b976fc5ae1c69bd88dda9c541c1ee538b1c" + }, + "identityMatch": true, + "inventoryMatch": true, + "runtimeErrors": [], + "visuallyInspected": true, + "evidence": [ + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/18-codex-git-select-before2.png", + "sha256": "513e6ef6baa1c4c692e6194ca2b83674dc0f4470d1dc3ceaee007a3ea1aa68fa", + "role": "before2" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/18-codex-git-select-after0.png", + "sha256": "c36a13cb13909ff9e6aca1338206e402f8d39c8b03d180db55f082611ff8b30e", + "role": "after0" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/pairs/18-codex-git-select.png", + "sha256": "877ba4e0b495d3d84be8262d29369a22c797f4696ff20d124ca19c6e7b9d434e", + "role": "visually inspected comparison" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/request-18-codex-git-select.log", + "sha256": "d78a67a5c9f0c5ac05f42e8342afb5b409b5fc15714fa100baa0569c927831f4", + "role": "real input log" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/request-18-codex-git-select.exit.json", + "sha256": "ebba7a2e1981715c92aae4162d7cc19e599bd10cf9e7da11853d43a99f346dc4", + "role": "exit" + } + ] + }, + { + "revision": "f009de5838f80b90e861e5727f0ad11cba8814f8", + "pluginRevision": "9de99949792c2c59b70693c1dcda6aa8cf36b428", + "provider": "codex", + "prompt": "dns", + "width": 710, + "index": 1, + "label": "No cacheAt the resolverOn your device", + "selector": "#cache", + "verdict": "dead", + "reason": "Native Home/Enter to End/Enter shows No cache then On your device, while dns.state.cache stays numeric0 and max stays3. Next twice clears selection and visits resolver/cache instead of device-cached route. Actual images confirm wrong route. Earlier automatic proof merely reset lookup step and did not prove cache selection.", + "mode": "manual-real-input", + "automaticPass": true, + "v3Result": { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/codex/dns/result.json", + "sha256": "ded728d019f784315f262b671d3f8eff4c7c7d08edfb12ab2cca4b5e6bc9cd75" + }, + "source": { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/manual-plan-sources/prototype-codex-dns.html", + "sha256": "1de41685f71e02e42f79e7cd91d640e90deada30a96e1ccd93c3064bf7963831" + }, + "request": { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/requests/request-19-codex-dns-cache.json", + "sha256": "0b7210531ba5598c7ab48ef8876c1280579675a4d6de27edade2456b1622c3e9" + }, + "identityMatch": true, + "inventoryMatch": true, + "runtimeErrors": [], + "visuallyInspected": true, + "evidence": [ + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/19-codex-dns-cache-before2.png", + "sha256": "2f44e018ddfaf1ea2cc76b7e8eef3b1156f1070d6b834919d1d5c5fc0d66e124", + "role": "before2" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/19-codex-dns-cache-after0.png", + "sha256": "c64ed2b95cb38994d07a2651792dd76d07516ed13db960637c8d5731fee01b42", + "role": "after0" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/pairs/19-codex-dns-cache.png", + "sha256": "8911ee4a6b3dcff5a5c24d60e0ab81f19546942db233a98033cf67392042ef47", + "role": "visually inspected comparison" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/request-19-codex-dns-cache.log", + "sha256": "905f18496f8ffbfe8bc72209bec810d3d3f39e504f7d74df5bc7a75f5ab07679", + "role": "real input log" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/request-19-codex-dns-cache.exit.json", + "sha256": "e05f8ade2b0a9e001868c7df26832104f68d53710174b76495ffa9ba406cf1bb", + "role": "exit" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/19-codex-dns-cache-next1.png", + "sha256": "cdfa5b033710b5eba371f02b841c503e9bd020eba6818a594724121b247eaa08", + "role": "additional inspected frame" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/19-codex-dns-cache-next2.png", + "sha256": "f7a2521388845afa25d50e62a6eb64f5b7d4797076fca685906dbab985c2b754", + "role": "additional inspected frame" + } + ] + }, + { + "revision": "f009de5838f80b90e861e5727f0ad11cba8814f8", + "pluginRevision": "9de99949792c2c59b70693c1dcda6aa8cf36b428", + "provider": "codex", + "prompt": "cdn", + "width": 710, + "index": 5, + "label": "Next stage \u2192", + "selector": "#next", + "verdict": "dead", + "reason": "Next advances initial0 to1, then further real Next remains phase1/Purge accepted. Three advertised later phases are inaccessible because bridge default max1 clamps phase.", + "mode": "manual-real-input", + "automaticPass": false, + "v3Result": { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/codex/cdn/result.json", + "sha256": "82626a0e95d104eca2455528a68df908732bd1fae7d95c0256d30ff5449bf405" + }, + "source": { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/manual-plan-sources/prototype-codex-cdn.html", + "sha256": "1d324a2d8c0b23e69b6b9a9733d61d8444eefa745d5c937047035c5eedfeaf73" + }, + "request": { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/requests/request-06-codex-cdn-bounds.json", + "sha256": "e3d9abde0439b129fc51d1f9df7c55de00fce210dc71d4dadd92b0faa1d5f79e" + }, + "identityMatch": true, + "inventoryMatch": true, + "runtimeErrors": [], + "visuallyInspected": true, + "evidence": [ + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/06-codex-cdn-bounds-before2.png", + "sha256": "bf1301be359a11ddd16c2c58c320180b50db5d894ba5bf490992db8f48b138f0", + "role": "before2" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/06-codex-cdn-bounds-after0.png", + "sha256": "bf1301be359a11ddd16c2c58c320180b50db5d894ba5bf490992db8f48b138f0", + "role": "after0" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/pairs/06-codex-cdn-bounds.png", + "sha256": "6b466c0330a3b840f6fc6873b403b53faf15f66d139e5839844979410fd735d5", + "role": "visually inspected comparison" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/request-06-codex-cdn-bounds.log", + "sha256": "bd4fc12ad724e7ef6cfc5cce76b31f8fe0e72afed2a23e7b18beb74ad75b5a31", + "role": "real input log" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/request-06-codex-cdn-bounds.exit.json", + "sha256": "61500500a8ccd330fa65e617321af96b76290b7c00a177f00741b46fcd77d7a7", + "role": "exit" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/06-codex-cdn-bounds-range-end0.png", + "sha256": "51249ba3fcb02ed1f564f5e0cb5f0083e1d3f5a0e00f3daef198dd55bd7ee4c9", + "role": "additional inspected frame" + } + ] + }, + { + "revision": "f009de5838f80b90e861e5727f0ad11cba8814f8", + "pluginRevision": "9de99949792c2c59b70693c1dcda6aa8cf36b428", + "provider": "codex", + "prompt": "cdn", + "width": 710, + "index": 1, + "label": "phase", + "selector": "#phase", + "verdict": "dead", + "reason": "Actual subsequent range drag reaches DOM value4 while diagram and explanation remain phase1/Purge accepted. The input thumb moves but bridge phase clamps to1; visible later stages do not work.", + "mode": "manual-real-input", + "automaticPass": false, + "v3Result": { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/codex/cdn/result.json", + "sha256": "82626a0e95d104eca2455528a68df908732bd1fae7d95c0256d30ff5449bf405" + }, + "source": { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/manual-plan-sources/prototype-codex-cdn.html", + "sha256": "1d324a2d8c0b23e69b6b9a9733d61d8444eefa745d5c937047035c5eedfeaf73" + }, + "request": { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/requests/request-06-codex-cdn-bounds.json", + "sha256": "e3d9abde0439b129fc51d1f9df7c55de00fce210dc71d4dadd92b0faa1d5f79e" + }, + "identityMatch": true, + "inventoryMatch": true, + "runtimeErrors": [], + "visuallyInspected": true, + "evidence": [ + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/06-codex-cdn-bounds-before2.png", + "sha256": "bf1301be359a11ddd16c2c58c320180b50db5d894ba5bf490992db8f48b138f0", + "role": "before2" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/06-codex-cdn-bounds-after0.png", + "sha256": "bf1301be359a11ddd16c2c58c320180b50db5d894ba5bf490992db8f48b138f0", + "role": "after0" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/pairs/06-codex-cdn-bounds.png", + "sha256": "6b466c0330a3b840f6fc6873b403b53faf15f66d139e5839844979410fd735d5", + "role": "visually inspected comparison" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/request-06-codex-cdn-bounds.log", + "sha256": "bd4fc12ad724e7ef6cfc5cce76b31f8fe0e72afed2a23e7b18beb74ad75b5a31", + "role": "real input log" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/request-06-codex-cdn-bounds.exit.json", + "sha256": "61500500a8ccd330fa65e617321af96b76290b7c00a177f00741b46fcd77d7a7", + "role": "exit" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/06-codex-cdn-bounds-range-end0.png", + "sha256": "51249ba3fcb02ed1f564f5e0cb5f0083e1d3f5a0e00f3daef198dd55bd7ee4c9", + "role": "additional inspected frame" + } + ] + }, + { + "revision": "f009de5838f80b90e861e5727f0ad11cba8814f8", + "pluginRevision": "9de99949792c2c59b70693c1dcda6aa8cf36b428", + "provider": "codex", + "prompt": "cdn", + "width": 710, + "index": 2, + "label": "Edge AEdge BEdge C", + "selector": "#region", + "verdict": "dead", + "reason": "Partial control: real native Home/Enter then End/Enter should select last option Edge C but settles at Edge B, confirmed in actual PNG and params.region1. Missing valid string schema/bounds clamps intended region2 to1. A\u2192B response is real, but advertised Edge C never works.", + "mode": "manual-real-input", + "automaticPass": true, + "v3Result": { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/codex/cdn/result.json", + "sha256": "82626a0e95d104eca2455528a68df908732bd1fae7d95c0256d30ff5449bf405" + }, + "source": { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/manual-plan-sources/prototype-codex-cdn.html", + "sha256": "1d324a2d8c0b23e69b6b9a9733d61d8444eefa745d5c937047035c5eedfeaf73" + }, + "request": { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/requests/request-30-codex-cdn-region.json", + "sha256": "c0a467482a539b58dc297906a92d98478489f85e11fa34b6611c5609f541489f" + }, + "identityMatch": true, + "inventoryMatch": true, + "runtimeErrors": [], + "visuallyInspected": true, + "evidence": [ + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/30-codex-cdn-region-before2.png", + "sha256": "c893fa5d4d69a0047b4ce237a4dff5914a90871ba6b3bf93d5176dd43a77a553", + "role": "before2" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/30-codex-cdn-region-after0.png", + "sha256": "e02fa1afe1c2963fa17ce6ee8cb366e5727fb36047e1722c3df523763b5b1c5e", + "role": "after0" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/pairs/30-codex-cdn-region.png", + "sha256": "528ff7d7ee02fe44bbf22ea531129e923f1bb1818d53e20aa5501de61a224a87", + "role": "visually inspected comparison" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/request-30-codex-cdn-region.log", + "sha256": "67a3d87b78b0819cce3385fe3a024ef14348e9622bc72e7364040d325f26b2ce", + "role": "real input log" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/request-30-codex-cdn-region.exit.json", + "sha256": "3231e9a8959bae36cf0a55b3eb0454312f25d65a461efd343eb13b00e2d76785", + "role": "exit" + } + ] + } + ], + "method": "Independent actual saved-frame inspection and retained-source handler checks. Every newly passing prior-fail control, every remaining failing control, and CDN partial bounds cases require decisions. Missing results never count completed. Manual follow-ups are appended only after actual execution evidence is inspected. Raw generation timings and central adjudications remain unchanged.", + "updatedAt": "2026-10-20T07:02:13.042024+00:00", + "supplementalControls": [ + { + "revision": "f009de5838f80b90e861e5727f0ad11cba8814f8", + "pluginRevision": "9de99949792c2c59b70693c1dcda6aa8cf36b428", + "provider": "codex", + "prompt": "cdn", + "width": 710, + "index": null, + "label": "Model and real-world caveats", + "selector": "details > summary", + "verdict": "live", + "reason": "Actual summary click expands the previously hidden explanatory paragraphs; read-only details.open changes false to true and actual PNGs show the new text.", + "mode": "manual-real-input", + "automaticPass": null, + "v3Result": { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/codex/cdn/result.json", + "sha256": "82626a0e95d104eca2455528a68df908732bd1fae7d95c0256d30ff5449bf405" + }, + "source": { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/manual-plan-sources/prototype-codex-cdn.html", + "sha256": "1d324a2d8c0b23e69b6b9a9733d61d8444eefa745d5c937047035c5eedfeaf73" + }, + "request": { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/requests/request-05-codex-cdn-disclosure.json", + "sha256": "afe09856c9c2c03af031bba7362eeb6436dc15ef7ef604820553849ff2412617" + }, + "identityMatch": true, + "inventoryMatch": false, + "runtimeErrors": [], + "visuallyInspected": true, + "evidence": [ + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/05-codex-cdn-disclosure-before2.png", + "sha256": "15cbea2051109ff4f723e51c086261c38f5b13599a10a4b9610c6cfe18fc243d", + "role": "before2" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/05-codex-cdn-disclosure-after0.png", + "sha256": "f12fee8b505bad0eed78795d918e0e30f106f1d30e849dd2921f3693490e5c4f", + "role": "after0" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/pairs/05-codex-cdn-disclosure.png", + "sha256": "7b234f5de6626dc3e0dd43bc063a5661e7a7000ac3fc7713a78514f225ce4f8a", + "role": "visually inspected comparison" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/request-05-codex-cdn-disclosure.log", + "sha256": "ccc6297c3a09d0903656491a73a611b9dc6bfc749f3c47f770e9ca400a44bba4", + "role": "real input log" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/request-05-codex-cdn-disclosure.exit.json", + "sha256": "86feab459501ad8a6dc5aee757949bba553a25428028dc63bada032f1e57ff7d", + "role": "exit" + } + ] + }, + { + "revision": "f009de5838f80b90e861e5727f0ad11cba8814f8", + "pluginRevision": "9de99949792c2c59b70693c1dcda6aa8cf36b428", + "provider": "codex", + "prompt": "umbrella", + "width": 710, + "index": null, + "label": "Which parts do what?", + "selector": "details > summary", + "verdict": "live", + "reason": "Actual summary click expands the previously hidden explanatory paragraphs; read-only details.open changes false to true and actual PNGs show the new text.", + "mode": "manual-real-input", + "automaticPass": null, + "v3Result": { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/codex/umbrella/result.json", + "sha256": "679098d81ad5f331bf6e5954b5910c722e62ecf1fba15e33b0f2e4f2fb12ce05" + }, + "source": { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/manual-plan-sources/prototype-codex-umbrella.html", + "sha256": "ef786a81687518d2276aacf241373fa6c10efa9af30058964dde44a7fc9d3049" + }, + "request": { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/requests/request-16-codex-umbrella-disclosure.json", + "sha256": "e8488f5f2fd74b5911b951ebf0e004c1bffe59f3795dc5188b8fca7136dcaf03" + }, + "identityMatch": true, + "inventoryMatch": false, + "runtimeErrors": [], + "visuallyInspected": true, + "evidence": [ + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/16-codex-umbrella-disclosure-before2.png", + "sha256": "39c04d0aa981441647feba10933567fdd6179c519474d57f120b68de3d7626fe", + "role": "before2" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/16-codex-umbrella-disclosure-after0.png", + "sha256": "e063295dc78fb7a5233673b3ef489bc7f22877fe62e5ad69d7571d4ff102c6fc", + "role": "after0" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/pairs/16-codex-umbrella-disclosure.png", + "sha256": "79dbf49513b404c9bdb7fd2a509d1663181ad9a027e90e4f4696de750dcb9069", + "role": "visually inspected comparison" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/request-16-codex-umbrella-disclosure.log", + "sha256": "8cf07276d16a7c2b180efc5acc43c1244c7dff43631f484d412ecdd13b404838", + "role": "real input log" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/request-16-codex-umbrella-disclosure.exit.json", + "sha256": "648f1210b61ceee59eddcc4598da4ae6b92c2554a1bc58ccc3184056bfee4490", + "role": "exit" + } + ] + }, + { + "revision": "f009de5838f80b90e861e5727f0ad11cba8814f8", + "pluginRevision": "9de99949792c2c59b70693c1dcda6aa8cf36b428", + "provider": "codex", + "prompt": "door-lock", + "width": 710, + "index": null, + "label": "What moves the door bolt?", + "selector": "details > summary", + "verdict": "live", + "reason": "Actual summary click expands the previously hidden explanatory paragraphs; read-only details.open changes false to true and actual PNGs show the new text.", + "mode": "manual-real-input", + "automaticPass": null, + "v3Result": { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/codex/door-lock/result.json", + "sha256": "1924bf1564ac33783e2ca9a3b49cb342f280c24af3ce8d3e90651953bef425fd" + }, + "source": { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/manual-plan-sources/prototype-codex-door-lock.html", + "sha256": "7e0ef75272f3357c181912ff7b80255dd77479daa4926f481190790eaab7a1dd" + }, + "request": { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/requests/request-17-codex-door-lock-disclosure.json", + "sha256": "2b17b55c7b5f555fdd0e35553fe143cc4cb74f0f8b41d1c8da57a255e4dbcdd8" + }, + "identityMatch": true, + "inventoryMatch": false, + "runtimeErrors": [], + "visuallyInspected": true, + "evidence": [ + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/17-codex-door-lock-disclosure-before2.png", + "sha256": "5845ce93a6acabf2baf36009d592aad8dfa89f82fc82ce9201b769c2a9f8f08f", + "role": "before2" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/17-codex-door-lock-disclosure-after0.png", + "sha256": "72b1a8130ed29f6861d982324ec1a43789da568c40aa88452b04481184a99406", + "role": "after0" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/pairs/17-codex-door-lock-disclosure.png", + "sha256": "0298869b61f199882b0e7fb2eda3d43f4d2228d9fa435a1cae6198b5509f025c", + "role": "visually inspected comparison" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/request-17-codex-door-lock-disclosure.log", + "sha256": "2ec9519c9a82fc02762486b9833dda7ab4116680b7987b4d3a4b4a1cd1d6c1fc", + "role": "real input log" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/request-17-codex-door-lock-disclosure.exit.json", + "sha256": "e374d48b596f4307618ba0ddf81fe84a6ce01ef600cbaddd6c09463685c02b29", + "role": "exit" + } + ] + }, + { + "revision": "f009de5838f80b90e861e5727f0ad11cba8814f8", + "pluginRevision": "9de99949792c2c59b70693c1dcda6aa8cf36b428", + "provider": "codex", + "prompt": "dns", + "width": 710, + "index": null, + "label": "What this model leaves out", + "selector": "details > summary", + "verdict": "live", + "reason": "Actual summary click expands the previously hidden explanatory paragraphs; read-only details.open changes false to true and actual PNGs show the new text.", + "mode": "manual-real-input", + "automaticPass": null, + "v3Result": { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/codex/dns/result.json", + "sha256": "ded728d019f784315f262b671d3f8eff4c7c7d08edfb12ab2cca4b5e6bc9cd75" + }, + "source": { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/manual-plan-sources/prototype-codex-dns.html", + "sha256": "1de41685f71e02e42f79e7cd91d640e90deada30a96e1ccd93c3064bf7963831" + }, + "request": { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/requests/request-17-codex-dns-disclosure.json", + "sha256": "5e007c46feddbf67d27ed7df90394aed0b6d76e90e6e6915d74c4356ed4d1331" + }, + "identityMatch": true, + "inventoryMatch": false, + "runtimeErrors": [], + "visuallyInspected": true, + "evidence": [ + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/17-codex-dns-disclosure-before2.png", + "sha256": "19423c8ae637ae47bedf458f642ffd8ed7df83cf86bbff2230f58d75185ed05e", + "role": "before2" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/17-codex-dns-disclosure-after0.png", + "sha256": "0e087e72ac7594be44321abc46158bc58583a47727266ce1978649e0c76809d4", + "role": "after0" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/pairs/17-codex-dns-disclosure.png", + "sha256": "51f712371e82d04dcab5784ffa80a081b31d9fcb1b4edac55c52f33f71669a59", + "role": "visually inspected comparison" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/request-17-codex-dns-disclosure.log", + "sha256": "94260b65022cc497c4a9cb97bb79a68221103119c878062ef2c783397e4bde57", + "role": "real input log" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/request-17-codex-dns-disclosure.exit.json", + "sha256": "9fb4daa3ca10344af2c14dd661f888a4ad527c874ba29415a9a2dcff40950061", + "role": "exit" + } + ] + }, + { + "revision": "f009de5838f80b90e861e5727f0ad11cba8814f8", + "pluginRevision": "9de99949792c2c59b70693c1dcda6aa8cf36b428", + "provider": "codex", + "prompt": "git-merge", + "width": 710, + "index": null, + "label": "What Git compares", + "selector": "details > summary", + "verdict": "live", + "reason": "Actual summary click expands the previously hidden explanatory paragraphs; read-only details.open changes false to true and actual PNGs show the new text.", + "mode": "manual-real-input", + "automaticPass": null, + "v3Result": { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/codex/git-merge/result.json", + "sha256": "9a88555a0509c24be36498aae6a3a108bf100b732769e8ea142bf262784ff0c5" + }, + "source": { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/manual-plan-sources/prototype-codex-git-merge.html", + "sha256": "ade3766c9982d24a07b3783c48753548ca5cd402289648e8fec7ec64009e8717" + }, + "request": { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/requests/request-17-codex-git-merge-disclosure.json", + "sha256": "471a6b592e44ba489133fc2deaba145bf44d41d837db196430e063ce33d6ba65" + }, + "identityMatch": true, + "inventoryMatch": false, + "runtimeErrors": [], + "visuallyInspected": true, + "evidence": [ + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/17-codex-git-merge-disclosure-before2.png", + "sha256": "1610ddf848d31130ad41f86bb8e73884a2590f1c4fba611c7d920ac85b60ad58", + "role": "before2" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/17-codex-git-merge-disclosure-after0.png", + "sha256": "26a291543f319670abc80e820bece6ae54586352d2093ceb22fff5be0fbc11aa", + "role": "after0" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/pairs/17-codex-git-merge-disclosure.png", + "sha256": "3012106a0ee63a5c4f62f83fad04f6f6205faf882f93cbf302aca1ea01701415", + "role": "visually inspected comparison" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/request-17-codex-git-merge-disclosure.log", + "sha256": "0d2fd3f0724b91a78b5240afff8365df340570b9cd4cf06650772a132088e023", + "role": "real input log" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/request-17-codex-git-merge-disclosure.exit.json", + "sha256": "cd31e24331111c1c165e9299c27e21e6f31201b945c9165062e8f86e9d1bd066", + "role": "exit" + } + ] + } + ], + "summary": { + "reviewedPromptCount": 20, + "manualReviewCount": 24, + "supplementalCount": 5, + "indexedReviewCounts": { + "live": 26, + "unproven": 1, + "dead": 11 + }, + "reviewedAllControlsLiveCards": 15, + "runtimeErrorCards": [], + "identityMismatches": [] + } +} diff --git a/plugins/playgrounds/evals/launch/reports/gate-1/replay-visual-review-codex-prototype.md b/plugins/playgrounds/evals/launch/reports/gate-1/replay-visual-review-codex-prototype.md new file mode 100644 index 000000000..04814d0b1 --- /dev/null +++ b/plugins/playgrounds/evals/launch/reports/gate-1/replay-visual-review-codex-prototype.md @@ -0,0 +1,80 @@ +# Codex prototype independent visual review + +Completed all20 replay cases and 24 manual control decisions; 5 true inventory omissions retain index=null. 15/20 cards have all controls proven live after manual evidence. Generation timings unchanged. + +Source/scorer revisions and exact result/source/request/frame SHA256 hashes are in the adjacent JSON. Only real input actions drove manual checks; eval observed state. Every newly passing prior-fail and remaining failing control was visually inspected. Runtime errors are never waived. Unchanged prior-pass controls retain their saved proof. + +Confirmed failures: thermos all3 selects; spray-bottle all3 controls; Git scenario; DNS cache route; CDN phase/Next/Edge C. CDN stage has a real initial transition but remains unproven for its advertised full journey. + +WebSocket and load-balancer disclosures already have v3 index3; they are not supplemental duplicates. Five true missing summaries (CDN, umbrella, door-lock, DNS, Git) are individually proven by actual expansion frames. + +| Prompt | All controls live | Blocking controls | +|---|---|---| +| washing-machine | True | | +| bicycle-pump | True | | +| zipper | True | | +| toilet | True | | +| thermos | False | 0:dead, 1:dead, 2:dead | +| door-lock | True | | +| refrigerator | True | | +| stapler | True | | +| spray-bottle | False | 0:dead, 1:dead, 2:dead | +| seat-belt | True | | +| toaster | True | | +| umbrella | True | | +| cdn | False | 0:unproven, 1:dead, 2:dead, 5:dead | +| notification-settings | True | | +| narrow-toggle | True | | +| dns | False | 1:dead | +| database-index | True | | +| git-merge | False | 0:dead | +| load-balancer | True | | +| websocket | True | | + +| Prompt / width / index | Verdict | Reason | +|---|---|---| +| bicycle-pump / 710 / 0 | live | Actual ArrowRight frames show piston moving down, compressed air chamber, inlet closure and a new compression paragraph/readout. Saved handler explicitly supports ArrowRight and selects phase 1 without autonomous settling. | +| bicycle-pump / 710 / 1 | live | Precondition Next enables Previous; click returns compression to fill, raises piston, opens inlet and replaces explanation. | +| cdn / 710 / 0 | unproven | Only partial behavior is proved: ArrowRight advances Before purge to Purge accepted (0 to 1), but the saved phase definition omits numeric bounds and the frozen bridge defaults to 0..1. The full advertised 0..4 journey cannot be inferred from that single visible transition. Planned repeated-key/manual bounds evidence is needed; this must not become a whole-card pass. | +| cdn / 710 / 1 | dead | Actual subsequent range drag reaches DOM value4 while diagram and explanation remain phase1/Purge accepted. The input thumb moves but bridge phase clamps to1; visible later stages do not work. | +| cdn / 710 / 3 | live | The actual browser-cache checkbox changes the readout from Edge HIT to Local browser HIT and replaces the viewer explanation with the browser retaining its fresh v1 copy. This is independent visible output beyond checkbox styling. | +| cdn / 710 / 5 | dead | Next advances initial0 to1, then further real Next remains phase1/Purge accepted. Three advertised later phases are inaccessible because bridge default max1 clamps phase. | +| database-index / 710 / 0 | live | Actual ArrowRight frames move the emphasized table row from ID 1 to ID 2 and update the query/route ID. The saved handler explicitly changes target and renders; source geometry is static otherwise. The very pale external text is a readability limitation, not a dead input. | +| database-index / 710 / 1 | live | Actual Access path change from B-tree to full scan emphasizes every table row and changes the route/count to checking 12 rows. This meaningful output is visible outside the selector, though the pale text contrast is poor. | +| database-index / 710 / 2 | live | Actual full-resolution frames show SELECT WHERE id = 1 changing to id = 2 and route text return ID 1 changing to ID 2 while in scan mode. All rows correctly remain emphasized for a full scan. The text is very pale but visibly changes; the saved target handler matches this output. | +| dns / 710 / 0 | live | Actual supported End frames change local-cache check to Connect to the website, highlighting the device/web-server link and changing the caption. Source explicitly supports End and sets the last sequence step; no autonomous animation exists. | +| dns / 710 / 1 | dead | Native Home/Enter to End/Enter shows No cache then On your device, while dns.state.cache stays numeric0 and max stays3. Next twice clears selection and visits resolver/cache instead of device-cached route. Actual images confirm wrong route. Earlier automatic proof merely reset lookup step and did not prove cache selection. | +| git-merge / 710 / 0 | dead | Real select changes Clean merge to Fast-forward, but actual diagram, merge explanation and history remain Clean merge; params stays {}. String-array options do not match frozen option.value contract. | +| load-balancer / 710 / 0 | live | Drag changes requests 3 to 11, routes C to B, server counts 1/1/1 to 4/4/3 and route readout; meaningful output corroborates supported range input. | +| load-balancer / 710 / 3 | live | Actual summary click expands the previously hidden explanatory paragraphs; read-only details.open changes false to true and actual PNGs show the new text. | +| notification-settings / 598 / 0 | live | After opening preview, Email click removes its example while keeping Push; meaningful external text change. | +| notification-settings / 598 / 1 | live | With preview visible, Push click changes the Push example to All notifications are off. | +| notification-settings / 598 / 2 | live | Daily digest click exposes the schedule select and changes external preview to Daily digest at 9 AM. | +| notification-settings / 598 / 3 | live | Click Preview notifications reveals the external preview panel with Email and Push examples. | +| notification-settings / 598 / 4 | live | After enabling Daily digest and preview, real Home/Enter then End/Enter changes 7 AM to 6 PM in both select and external preview. | +| refrigerator / 710 / 0 | live | Actual ArrowRight frames move the refrigerant marker from evaporator to compressor and replace the explanation and readout with compression. The source explicitly increments phase for ArrowRight; no autonomous motion can explain this state change. | +| seat-belt / 710 / 0 | live | The actual supported ArrowRight pair changes Normal to Sudden braking, moves the pendulum/link and engages the catch, with a matching payout-blocked readout. Saved handler updates local mode and draws synchronously; no incidental animation is involved. | +| spray-bottle / 710 / 0 | dead | Actual supported-input frames retain the release state, open inlet, closed outlet and unchanged explanation. The generated source defines stroke as type string with value squeeze; the frozen bridge only handles text/toggle specially and otherwise numeric-normalizes with default 0. Both squeeze/release strings therefore stay 0 and cannot trigger the intended state change. This is a parameter-contract defect, not a missing visual threshold. | +| spray-bottle / 710 / 1 | dead | Actual supported-input frames retain the release state, open inlet, closed outlet and unchanged explanation. The generated source defines stroke as type string with value squeeze; the frozen bridge only handles text/toggle specially and otherwise numeric-normalizes with default 0. Both squeeze/release strings therefore stay 0 and cannot trigger the intended state change. This is a parameter-contract defect, not a missing visual threshold. | +| spray-bottle / 710 / 2 | dead | Actual supported-input frames retain the release state, open inlet, closed outlet and unchanged explanation. The generated source defines stroke as type string with value squeeze; the frozen bridge only handles text/toggle specially and otherwise numeric-normalizes with default 0. Both squeeze/release strings therefore stay 0 and cannot trigger the intended state change. This is a parameter-contract defect, not a missing visual threshold. | +| stapler / 710 / 0 | live | The actual ArrowRight pair changes Ready to Press: handle and magazine lower, driver moves, and the explanation changes. Source explicitly increments step on ArrowRight; no autonomous animation exists. | +| stapler / 710 / 1 | live | Next enables Back; click returns Press to Ready, lifts driver/staple and changes explanation. | +| thermos / 710 / 0 | dead | Real native Home/Enter to End/Enter changes displayed selection, but actual diagram and explanation remain unchanged. Read-only thermosState.params remains {}. Source supplies string-array options; frozen bridge expects option.value and rejects every intended choice. | +| thermos / 710 / 1 | dead | Real native Home/Enter to End/Enter changes displayed selection, but actual diagram and explanation remain unchanged. Read-only thermosState.params remains {}. Source supplies string-array options; frozen bridge expects option.value and rejects every intended choice. | +| thermos / 710 / 2 | dead | Real native Home/Enter to End/Enter changes displayed selection, but actual diagram and explanation remain unchanged. Read-only thermosState.params remains {}. Source supplies string-array options; frozen bridge expects option.value and rejects every intended choice. | +| toaster / 710 / 0 | live | The actual End pair changes Ready to Released/heaters off and replaces the explanation with timer-end, latch release and spring-lift text. Source explicitly maps End to cycle 100; similar endpoint geometry does not negate the visible state/readout change. | +| toilet / 710 / 1 | live | Next enables Back; click returns Flush to Ready, restores tank level, closes flapper and changes explanation. | +| umbrella / 710 / 0 | live | The actual ArrowRight pair raises the runner, spreads ribs and fabric and changes Closed to the moving-ribs explanation. The source explicitly adjusts the target on ArrowRight; its easing animation follows that input rather than changing autonomously. | +| washing-machine / 710 / 0 | live | The actual selector pair changes Wash to Drain, lowers the water, colors the drain route and changes both readout and explanation. The source subscription changes stage only on input; the distinct drain output is not incidental drum animation. | +| washing-machine / 710 / 1 | live | Actual click frames show the full simplification text present before and hidden after the summary click. This is a working native disclosure collapse, despite the automatic aligned-region proof failing when text disappears; the source uses details/summary. | +| websocket / 710 / 1 | live | Next enables Back; click returns Send to Connection opened, moves packet back to sender and updates explanation. | +| websocket / 710 / 3 | live | Actual summary click expands the previously hidden explanatory paragraphs; read-only details.open changes false to true and actual PNGs show the new text. | +| zipper / 710 / 0 | live | The actual End pair moves the slider from the bottom to the top and joins the tooth rows below it. The source explicitly supports End and sets position 100; no autonomous motion exists. | +| cdn / 710 / 2 | dead | Partial control: real native Home/Enter then End/Enter should select last option Edge C but settles at Edge B, confirmed in actual PNG and params.region1. Missing valid string schema/bounds clamps intended region2 to1. A→B response is real, but advertised Edge C never works. | +| cdn / 710 / None | live | Actual summary click expands the previously hidden explanatory paragraphs; read-only details.open changes false to true and actual PNGs show the new text. | +| umbrella / 710 / None | live | Actual summary click expands the previously hidden explanatory paragraphs; read-only details.open changes false to true and actual PNGs show the new text. | +| door-lock / 710 / None | live | Actual summary click expands the previously hidden explanatory paragraphs; read-only details.open changes false to true and actual PNGs show the new text. | +| dns / 710 / None | live | Actual summary click expands the previously hidden explanatory paragraphs; read-only details.open changes false to true and actual PNGs show the new text. | +| git-merge / 710 / None | live | Actual summary click expands the previously hidden explanatory paragraphs; read-only details.open changes false to true and actual PNGs show the new text. | + +Manual evidence was inspected as before2/after0 pairs under `prototype-manual-review/pairs/`, with additional actual DNS Next1/Next2 and CDN range-end0 frames. Complete original PNGs remain unchanged. Each paired original and contact sheet is hashed in JSON. diff --git a/plugins/playgrounds/evals/launch/reports/gate-1/replay-visual-review.json b/plugins/playgrounds/evals/launch/reports/gate-1/replay-visual-review.json new file mode 100644 index 000000000..c77704693 --- /dev/null +++ b/plugins/playgrounds/evals/launch/reports/gate-1/replay-visual-review.json @@ -0,0 +1,344 @@ +{ + "rows": [ + { + "revision": "baseline", + "provider": "claude-code", + "prompt": "toilet", + "width": 710, + "index": 0, + "review": "automatic proof unproven", + "finding": "Selected proof uses ArrowLeft, but retained handler only accepts Space/Enter or click. Pair shows refilling completing naturally, not an input-triggered flush. Reject automatic route proof; manually test advertised flush input.", + "evidence": [ + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/replay-pairs/baseline/claude-code/toilet-710-0.json", + "sha256": "14a545f235380472ef7c5d64b4b46fb8524fd421150dbbf99e451de4b65bf531" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/replay-pairs/baseline/claude-code/toilet-710-0.png", + "sha256": "b4b8efcdd042240257955b69a6f0f7a8afb62a9a33b0d7231ff910cf3866e39f" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/claude-code/toilet/result.json", + "sha256": "3bd0928f6c28bfad5871de9655f846548019ade004b86ec53d06fb0250891a32" + } + ], + "reviewedAt": "2026-10-20T05:40:45.930123+00:00" + }, + { + "revision": "baseline", + "provider": "claude-code", + "prompt": "toilet", + "width": 710, + "index": 3, + "review": "automatic proof unproven", + "finding": "Pair shows refilling reaching Full after selecting 1x. This is compatible with autonomous settling and does not establish playback-rate effect. Compare refill slopes under controlled real-input preconditions.", + "evidence": [ + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/replay-pairs/baseline/claude-code/toilet-710-3.json", + "sha256": "64c7f1466b87c24752f5f361896ac9ba70a4e5730d9836f1a5a3465e2277862d" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/replay-pairs/baseline/claude-code/toilet-710-3.png", + "sha256": "0aa49c3da23e7826a57649106f54be9a8a00c5b972bf51479c45b84e4241b4fc" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/claude-code/toilet/result.json", + "sha256": "3bd0928f6c28bfad5871de9655f846548019ade004b86ec53d06fb0250891a32" + } + ], + "reviewedAt": "2026-10-20T05:40:45.930826+00:00" + }, + { + "revision": "baseline", + "provider": "claude-code", + "prompt": "refrigerator", + "width": 710, + "index": 0, + "review": "live through supported alternate route", + "finding": "Reject the coincidental drag/unsupported-key proofs. Actual ArrowRight changes the thermostat threshold readout from on5.0/off3.0 to on5.5/off3.5, with knob geometry and duty24%->23%; saved source nudge updates local model before the initialization exception. This proves the stage keyboard route only; card remains runtime-error.", + "evidence": [ + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/claude-code/refrigerator/width-710/control-0-key-ArrowRight-before2.png", + "sha256": "145ef8199e3fb857df3fce2125304ac68b93752eb99c5bf3b608affd5173263c" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/claude-code/refrigerator/width-710/control-0-key-ArrowRight-after0.png", + "sha256": "1642993e954af2c6686d017013ca8f0cce65cd4c8b49011f5c08cf90e44db7a6" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/claude-code/refrigerator/result.json", + "sha256": "d9130f077778372b7d011de6961d5780d0d422eb10a664b682b45eb8054fba44" + } + ], + "reviewedAt": "2026-10-20T05:44:30.972900+00:00" + }, + { + "revision": "baseline", + "provider": "claude-code", + "prompt": "refrigerator", + "width": 710, + "index": 3, + "review": "dead; automatic proof rejected", + "finding": "Drag pair changes door selected chrome but running share stays24%, heat-leak note still says through walls and gasket. Minor thermal drift and page reflow are not door response. Source initialization failure prevents subscription; original dead classification retained.", + "evidence": [ + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/replay-pairs/baseline/claude-code/refrigerator-710-3.png", + "sha256": "54e040992d2f40d93f6af23b79f38b375cde4d781535b200a4af4eb9f601d1e8" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/claude-code/refrigerator/result.json", + "sha256": "d9130f077778372b7d011de6961d5780d0d422eb10a664b682b45eb8054fba44" + } + ], + "reviewedAt": "2026-10-20T05:44:30.973623+00:00" + }, + { + "revision": "baseline", + "provider": "claude-code", + "prompt": "spray-bottle", + "width": 710, + "index": 0, + "evidence": [ + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/claude-code/spray-bottle/width-710/control-0-key-ArrowRight-before2.png", + "sha256": "e0c84af8007869ae0f4d1e1bc092c10030a41a021ad43107925222754f4a8a43" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/claude-code/spray-bottle/width-710/control-0-key-ArrowRight-after0.png", + "sha256": "becb6085738e369f173464e1ffc37ff417cca29fed1adefe329ad7008252b866" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline/claude-code/spray-bottle/published.html", + "sha256": "99feaea769771d35e13945cabb1acae6b35c539293ab5a63d5d7de5ae97722c8" + } + ], + "reviewedAt": "2026-10-20T05:46:43.315035+00:00", + "review": "live through supported route", + "finding": "Advertised keyboard squeeze pulse increases the settled sprayed total1.0->2.0mL and reduces bottle259->258mL. Reduced-motion source disables idle touring; this is input-caused cumulative output, not hover styling." + }, + { + "revision": "baseline", + "provider": "claude-code", + "prompt": "stapler", + "width": 710, + "index": 0, + "evidence": [ + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/claude-code/stapler/width-710/control-0-key-End-before2.png", + "sha256": "6acd05e9bd9b52595ac7dd5eb424ba92f9ffe5dd43400174bfe165d7fb7d523b" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/claude-code/stapler/width-710/control-0-key-End-after0.png", + "sha256": "75f908ba476edf55a98ca3090fe15c1f81916272ba7ed7b40ba4f7f7141a4382" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline/claude-code/stapler/published.html", + "sha256": "af887c2514e6adedd7e2888e843a20f0dda2b562d96d502902c58d5bd3872b44" + } + ], + "reviewedAt": "2026-10-20T05:46:43.322256+00:00", + "review": "live through supported route", + "finding": "Supported End key closes the handle and drives/folds the staple: visible open gap9.0mm becomes clinched legs folded5.0mm, with clear mechanism geometry change. Prefer this supported route over the first click probe." + }, + { + "revision": "baseline", + "provider": "claude-code", + "prompt": "websocket", + "width": 710, + "index": 0, + "evidence": [ + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/replay-pairs/baseline/claude-code/websocket-710-0.png", + "sha256": "b61b960be0e6f03a693b3cba35853be1d219ab99ecd344c79185bcae0a2df9a7" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/replay-pairs/baseline/claude-code/websocket-710-0.json", + "sha256": "4bdc50ac22b7c41e753647ba644146bf9f06d62d600c98b2c2ee30a0cfa62e43" + } + ], + "reviewedAt": "2026-10-20T05:50:00.021813+00:00", + "review": "unproven", + "finding": "The click pair has the same delivery-time/framing text and subtle geometry differences. Retain as unproven pending a deliberate send with a distinct latency/readout; source alone does not grant visual proof." + }, + { + "revision": "baseline", + "provider": "claude-code", + "prompt": "websocket", + "width": 710, + "index": 1, + "evidence": [ + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/replay-pairs/baseline/claude-code/websocket-710-1.png", + "sha256": "b0f34b00d7e1f5269d2ff72871046ed5a316dfd7d489a764497cbcf850bddbbd" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/replay-pairs/baseline/claude-code/websocket-710-1.json", + "sha256": "8d720b7c6d86e163fc48d7515387296439ca87fe7689fe67758fc0b08075f5a4" + } + ], + "reviewedAt": "2026-10-20T05:50:00.025004+00:00", + "review": "live", + "finding": "After preparing Polling, clicking WebSocket changes the explanatory readout from Polling every1s to WebSocket handshake and changes gate geometry; selection styling is not the sole evidence." + }, + { + "revision": "baseline", + "provider": "claude-code", + "prompt": "websocket", + "width": 710, + "index": 2, + "evidence": [ + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/replay-pairs/baseline/claude-code/websocket-710-2.png", + "sha256": "491caaed53f6088136e3a2d60d2884b0c4ebc2c68d69258584798b3b76b83623" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/replay-pairs/baseline/claude-code/websocket-710-2.json", + "sha256": "8bed8275562848d39378b184a29ca6f3db58d0b8207b5397b465694f1668a88d" + } + ], + "reviewedAt": "2026-10-20T05:50:00.028134+00:00", + "review": "live", + "finding": "After preparing WebSocket, clicking Polling changes the readout from3 open connections to Polling every1s and changes connection/gate state." + }, + { + "revision": "baseline", + "provider": "claude-code", + "prompt": "websocket", + "width": 710, + "index": 4, + "evidence": [ + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/replay-pairs/baseline/claude-code/websocket-710-4.png", + "sha256": "43352e31e5a7fc421aff2cef60ffb6a7bc79db4bba3587d5523efb697e97ab5a" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/replay-pairs/baseline/claude-code/websocket-710-4.json", + "sha256": "464760c2b09cb4809aadeff0aca2641d35582908958bb27ba165e3ed5aaab07e" + } + ], + "reviewedAt": "2026-10-20T05:50:00.031107+00:00", + "review": "live", + "finding": "Real slider drag changes the stable output interval from Polling every1s to every4.5s. The unrelated empty-poll counter is not used as proof." + }, + { + "revision": "baseline", + "provider": "claude-code", + "prompt": "load-balancer", + "width": 710, + "index": 0, + "evidence": [ + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/replay-pairs/baseline/claude-code/load-balancer-710-0.png", + "sha256": "e31c058f74866592342ac546784eda085376f270482cce208b3b470e658721e3" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/replay-pairs/baseline/claude-code/load-balancer-710-0.json", + "sha256": "2f44dfd563dd295fdf104fc4258e5b3c543dfe8aeee557e540eba6122ea035e5" + } + ], + "reviewedAt": "2026-10-20T05:52:26.606493+00:00", + "review": "live", + "finding": "Supported ArrowRight changes model algorithm from round robin to least connections; output algorithm words change and queues reset, beyond selected-button styling." + }, + { + "revision": "baseline", + "provider": "claude-code", + "prompt": "load-balancer", + "width": 710, + "index": 1, + "evidence": [ + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/replay-pairs/baseline/claude-code/load-balancer-710-1.png", + "sha256": "7f8b690f40fc0b1968a7e2d8228d2e30cb63d1141cd48e9998c0d1a9dbd02cef" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/replay-pairs/baseline/claude-code/load-balancer-710-1.json", + "sha256": "92c3693b400c4f2517f14255325a9de212a169570de2f7e071e2ddb0c9622ee8" + } + ], + "reviewedAt": "2026-10-20T05:52:26.625223+00:00", + "review": "live", + "finding": "After preparing least connections, Round robin changes the output algorithm words to round robin and resets queues." + }, + { + "revision": "baseline", + "provider": "claude-code", + "prompt": "load-balancer", + "width": 710, + "index": 2, + "evidence": [ + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/replay-pairs/baseline/claude-code/load-balancer-710-2.png", + "sha256": "32fc4cc93949fda55484fa1295888127d82c552a04281585f33f6284be0ff982" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/replay-pairs/baseline/claude-code/load-balancer-710-2.json", + "sha256": "2e3c2c6c85d34ce3ac7d8d639d3108909bd8c7217ebeccee6f48d3fb86fceb61" + } + ], + "reviewedAt": "2026-10-20T05:52:26.642331+00:00", + "review": "live", + "finding": "Least connections changes the output algorithm words from round robin to least connections." + }, + { + "revision": "baseline", + "provider": "claude-code", + "prompt": "load-balancer", + "width": 710, + "index": 3, + "evidence": [ + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/replay-pairs/baseline/claude-code/load-balancer-710-3.png", + "sha256": "97503bcf1e676fa74b3d80b3e040abef647578db32ef693a0ca4134ebc9f9630" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/replay-pairs/baseline/claude-code/load-balancer-710-3.json", + "sha256": "fa2f73d970d2672175d92aac127a852dfad446b871cb9f73a3092c6fa382dc99" + } + ], + "reviewedAt": "2026-10-20T05:52:26.659408+00:00", + "review": "live", + "finding": "Random changes the output algorithm words from round robin to random." + }, + { + "revision": "baseline", + "provider": "claude-code", + "prompt": "load-balancer", + "width": 710, + "index": 11, + "evidence": [ + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/replay-pairs/baseline/claude-code/load-balancer-710-11.png", + "sha256": "649bc0287d6643233e0e5bbe1e87483b4a26a033ef1536269fcd271c6a870dcf" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/replay-pairs/baseline/claude-code/load-balancer-710-11.json", + "sha256": "96a4ed00ca9fea88a2cb3a0fe0b36d0107eb8388c4f285c4a5f5842548d3e97f" + } + ], + "reviewedAt": "2026-10-20T05:52:26.676412+00:00", + "review": "live", + "finding": "Selecting no failed server removes the unavailable x marker from the first server queue in the model readout." + }, + { + "revision": "baseline", + "provider": "claude-code", + "prompt": "load-balancer", + "width": 710, + "index": 14, + "evidence": [ + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/replay-pairs/baseline/claude-code/load-balancer-710-14.png", + "sha256": "2244ac4c3b0f3e6a9883e6a47e52292afdc4d69f88de49ef6cef45626f57f4e9" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/replay-pairs/baseline/claude-code/load-balancer-710-14.json", + "sha256": "03e1a506b542dde7ce532f680685561755d7bb0a01ea1d8e91914bbd52034d1e" + } + ], + "reviewedAt": "2026-10-20T05:52:26.694309+00:00", + "review": "live", + "finding": "Marking server3 failed changes the third queue to an unavailable x, beyond the selected-button state." + } + ] +} diff --git a/plugins/playgrounds/evals/launch/reports/gate-1/runs.json b/plugins/playgrounds/evals/launch/reports/gate-1/runs.json new file mode 100644 index 000000000..bf74eb9b1 --- /dev/null +++ b/plugins/playgrounds/evals/launch/reports/gate-1/runs.json @@ -0,0 +1,5556 @@ +[ + { + "revision": "baseline", + "provider": "claude-code", + "promptId": "washing-machine", + "model": "claude-opus-5-5", + "scoreMs": 817220, + "cardVisible": true, + "allControlsProven": true, + "questions": { + "structured": [], + "textQuestions": [], + "count": 0, + "needsReview": false + }, + "progressShown": true, + "renderGraceUsed": false, + "renderDelayMs": null, + "renderGraceRetainedCard": false, + "finalReview": { + "sourceReplay": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/claude-code/washing-machine/result.json", + "sourceReplaySha256": "8feac5341e16a811dc351cff90a2137bc59f6aa23bc44f2ed82d6cdb07f14225", + "manualControls": 0, + "supplementalControls": 0 + }, + "controlStatuses": [ + { + "width": 710, + "status": "live", + "runtimeErrors": [], + "controls": [ + { + "index": 0, + "label": "Washing machine: arrow keys step through fill, heat, wash, drain and spin; Home runs the whole cycle", + "pass": true, + "status": "live", + "reason": "stable output changed outside controls", + "mode": "drag" + } + ] + } + ], + "source": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline/claude-code/washing-machine/result.json", + "sourceSha256": "55aac494a1b176374df4a13ec7b30378094debab60a0d4b858b18d203f35c4c2", + "replay": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-final/claude-code/washing-machine/result.json", + "replaySha256": "17912f0dc3f1fc37103c42cc48f1a2e003f9d04faa9b4583fbfac7a8e17756f5", + "scorerCommit": "f009de5838f80b90e861e5727f0ad11cba8814f8" + }, + { + "revision": "baseline", + "provider": "claude-code", + "promptId": "bicycle-pump", + "model": "claude-opus-5-5", + "scoreMs": 521547, + "cardVisible": true, + "allControlsProven": true, + "questions": { + "structured": [], + "textQuestions": [], + "count": 0, + "needsReview": false + }, + "progressShown": true, + "renderGraceUsed": false, + "renderDelayMs": null, + "renderGraceRetainedCard": false, + "finalReview": { + "sourceReplay": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/claude-code/bicycle-pump/result.json", + "sourceReplaySha256": "8a1447297c69102b97b08ad12cf20059f9cd6ed928b6eca2a0c384a3abc7d0ba", + "manualControls": 0, + "supplementalControls": 0 + }, + "controlStatuses": [ + { + "width": 710, + "status": "live", + "runtimeErrors": [], + "controls": [ + { + "index": 0, + "label": "Floor pump handle: up and down arrows move the handle, Space pumps one full stroke", + "pass": true, + "status": "live", + "reason": "stable output changed outside controls", + "mode": "drag" + } + ] + } + ], + "source": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline/claude-code/bicycle-pump/result.json", + "sourceSha256": "8dde69ce92b51c5f0891112587e55939c26b86ea6685035f6b4074ac7487ba2e", + "replay": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-final/claude-code/bicycle-pump/result.json", + "replaySha256": "fc3169c997d1df3a65490d051ad0fcd0c07aaba43a256d0fc459efcb50301a51", + "scorerCommit": "f009de5838f80b90e861e5727f0ad11cba8814f8" + }, + { + "revision": "baseline", + "provider": "claude-code", + "promptId": "zipper", + "model": "claude-opus-5-5", + "scoreMs": 407764, + "cardVisible": true, + "allControlsProven": true, + "questions": { + "structured": [], + "textQuestions": [], + "count": 0, + "needsReview": false + }, + "progressShown": true, + "renderGraceUsed": false, + "renderDelayMs": null, + "renderGraceRetainedCard": false, + "finalReview": { + "sourceReplay": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/claude-code/zipper/result.json", + "sourceReplaySha256": "8d2842f2dfe17885bf51aa3d230e7a77c6eff10fcee464a7916ca5650b9b4ceb", + "manualControls": 0, + "supplementalControls": 0 + }, + "controlStatuses": [ + { + "width": 710, + "status": "live", + "runtimeErrors": [], + "controls": [ + { + "index": 0, + "label": "Zipper: arrow keys move the slider one tooth at a time", + "pass": true, + "status": "live", + "reason": "stable output changed outside controls", + "mode": "drag" + } + ] + } + ], + "source": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline/claude-code/zipper/result.json", + "sourceSha256": "492efa5021fcc0f23233e0a8547bec413e9889a858d9a4f6a4fff00e87c3dd0d", + "replay": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-final/claude-code/zipper/result.json", + "replaySha256": "f63f912567071d2f48d6d91a0bbf7dcecc65b05602a15da27b9f6847b3d21cb0", + "scorerCommit": "f009de5838f80b90e861e5727f0ad11cba8814f8" + }, + { + "revision": "baseline", + "provider": "claude-code", + "promptId": "toilet", + "model": "claude-opus-5-5", + "scoreMs": 581928, + "cardVisible": true, + "allControlsProven": true, + "questions": { + "structured": [], + "textQuestions": [], + "count": 0, + "needsReview": false + }, + "progressShown": true, + "renderGraceUsed": true, + "renderDelayMs": 308, + "renderGraceRetainedCard": true, + "finalReview": { + "sourceReplay": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/claude-code/toilet/result.json", + "sourceReplaySha256": "3bd0928f6c28bfad5871de9655f846548019ade004b86ec53d06fb0250891a32", + "manualControls": 6, + "supplementalControls": 0 + }, + "controlStatuses": [ + { + "width": 710, + "status": "live", + "runtimeErrors": [], + "controls": [ + { + "index": 0, + "label": "Toilet tank: press Space or Enter to flush; value is litres in the tank", + "pass": true, + "status": "live", + "reason": "Supported Space input changes a settled Full tank to Flushing, visibly opens the flapper and lowers water. The earlier unsupported ArrowLeft automatic settling proof is superseded.", + "mode": "key-ArrowLeft" + }, + { + "index": 1, + "label": "Water line", + "pass": true, + "status": "live", + "reason": "Real low/high range drag raises the mechanism water line and tank water, changing Full 12.9 L to Refilling 13.4 L; visible output is independent of native thumb/value.", + "mode": "drag" + }, + { + "index": 2, + "label": "Supply flow", + "pass": true, + "status": "live", + "reason": "During actual refill, low/high supply drag changes external inlet flow from 3.4 to 12.8 L/min. The prior full-tank state could not expose this effect.", + "mode": "drag" + }, + { + "index": 3, + "label": "1\u00d7", + "pass": true, + "status": "live", + "reason": "Fresh-page equal-window refill comparison after actual flush: selected 1x, 4x and 10x produce visibly different water rises (about 0.6, 2.1 and 5.1 L over 4.2 seconds). This proves simulation speed beyond selected-button styling; all three inputs and supported flush paths are recorded.", + "mode": "primary" + }, + { + "index": 4, + "label": "4\u00d7", + "pass": true, + "status": "live", + "reason": "Fresh-page equal-window refill comparison after actual flush: selected 1x, 4x and 10x produce visibly different water rises (about 0.6, 2.1 and 5.1 L over 4.2 seconds). This proves simulation speed beyond selected-button styling; all three inputs and supported flush paths are recorded.", + "mode": "primary" + }, + { + "index": 5, + "label": "10\u00d7", + "pass": true, + "status": "live", + "reason": "Fresh-page equal-window refill comparison after actual flush: selected 1x, 4x and 10x produce visibly different water rises (about 0.6, 2.1 and 5.1 L over 4.2 seconds). This proves simulation speed beyond selected-button styling; all three inputs and supported flush paths are recorded.", + "mode": "primary" + }, + { + "index": 6, + "label": "Flush", + "pass": true, + "status": "live", + "reason": "stable output changed outside controls", + "mode": "primary" + } + ] + } + ], + "source": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline/claude-code/toilet/result.json", + "sourceSha256": "bcd6de86fbb82a0995be8b670c844905856ae606e9022afacf1560b987740d90", + "replay": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-final/claude-code/toilet/result.json", + "replaySha256": "a035a9159487c7a98e41b8a92dd5096c3a5d9c1b525450c4f8ca019e45ca5fab", + "scorerCommit": "f009de5838f80b90e861e5727f0ad11cba8814f8" + }, + { + "revision": "baseline", + "provider": "claude-code", + "promptId": "thermos", + "model": "claude-opus-5-5", + "scoreMs": 544640, + "cardVisible": true, + "allControlsProven": true, + "questions": { + "structured": [], + "textQuestions": [], + "count": 0, + "needsReview": false + }, + "progressShown": true, + "renderGraceUsed": false, + "renderDelayMs": null, + "renderGraceRetainedCard": false, + "finalReview": { + "sourceReplay": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/claude-code/thermos/result.json", + "sourceReplaySha256": "611e55f9ddea60071b81b4f9653384ae3f2139f15b773b41c2f40dfa9a713acd", + "manualControls": 0, + "supplementalControls": 0 + }, + "controlStatuses": [ + { + "width": 710, + "status": "live", + "runtimeErrors": [], + "controls": [ + { + "index": 0, + "label": "Vacuum flask: arrow keys run the clock; V vacuum, M mirror walls, S stopper", + "pass": true, + "status": "live", + "reason": "stable output changed outside controls", + "mode": "click" + }, + { + "index": 1, + "label": "Vacuum gap", + "pass": true, + "status": "live", + "reason": "stable output changed outside controls", + "mode": "primary" + }, + { + "index": 2, + "label": "Mirror walls", + "pass": true, + "status": "live", + "reason": "stable output changed outside controls", + "mode": "primary" + }, + { + "index": 3, + "label": "Stopper in", + "pass": true, + "status": "live", + "reason": "stable output changed outside controls", + "mode": "primary" + } + ] + } + ], + "source": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline/claude-code/thermos/result.json", + "sourceSha256": "94c9bf59e4a47f91aead169d231ca8129cc90093c5715c17f1df2a213b18f709", + "replay": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-final/claude-code/thermos/result.json", + "replaySha256": "b6ff3fafa195e0df761c014134f7b4dbd9c4581191749c29b8e94dd8b29a6cf1", + "scorerCommit": "f009de5838f80b90e861e5727f0ad11cba8814f8" + }, + { + "revision": "baseline", + "provider": "claude-code", + "promptId": "door-lock", + "model": "claude-opus-5-5", + "scoreMs": 667920, + "cardVisible": true, + "allControlsProven": true, + "questions": { + "structured": [], + "textQuestions": [], + "count": 0, + "needsReview": false + }, + "progressShown": true, + "renderGraceUsed": false, + "renderDelayMs": null, + "renderGraceRetainedCard": false, + "finalReview": { + "sourceReplay": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/claude-code/door-lock/result.json", + "sourceReplaySha256": "9c7de249b260dc2697c31093f97b6d46f6827616e50cbb788db4c82c7a307e56", + "manualControls": 0, + "supplementalControls": 0 + }, + "controlStatuses": [ + { + "width": 710, + "status": "live", + "runtimeErrors": [], + "controls": [ + { + "index": 0, + "label": "Pin-tumbler lock: left and right arrows slide the key, Enter turns it, K swaps keys", + "pass": true, + "status": "live", + "reason": "stable output changed outside controls", + "mode": "drag" + } + ] + } + ], + "source": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline/claude-code/door-lock/result.json", + "sourceSha256": "8bb083098e0b5b37622f33beed644aa182cb3cf3a4b8194cc333caeceb8bd773", + "replay": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-final/claude-code/door-lock/result.json", + "replaySha256": "00e3dfa8da61b037799b9b7b74b4187fd2ca1b8c38f44835a50a719c01d67562", + "scorerCommit": "f009de5838f80b90e861e5727f0ad11cba8814f8" + }, + { + "revision": "baseline", + "provider": "claude-code", + "promptId": "refrigerator", + "model": "claude-opus-5-5", + "scoreMs": 691058, + "cardVisible": true, + "allControlsProven": false, + "questions": { + "structured": [], + "textQuestions": [], + "count": 0, + "needsReview": false + }, + "progressShown": true, + "renderGraceUsed": false, + "renderDelayMs": null, + "renderGraceRetainedCard": false, + "finalReview": { + "sourceReplay": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/claude-code/refrigerator/result.json", + "sourceReplaySha256": "d9130f077778372b7d011de6961d5780d0d422eb10a664b682b45eb8054fba44", + "manualControls": 4, + "supplementalControls": 0 + }, + "controlStatuses": [ + { + "width": 710, + "status": "runtime-error", + "runtimeErrors": [ + "exception: Error: Parameter names are letters, digits, - and _: [object Object]" + ], + "controls": [ + { + "index": 0, + "label": "Fridge thermostat: arrow keys change the set temperature", + "pass": true, + "status": "live", + "reason": "Reject the coincidental drag/unsupported-key proofs. Actual ArrowRight changes the thermostat threshold readout from on5.0/off3.0 to on5.5/off3.5, with knob geometry and duty24%->23%; saved source nudge updates local model before the initialization exception. This proves the stage keyboard route only; card remains runtime-error.", + "mode": "drag" + }, + { + "index": 1, + "label": "Thermostat", + "pass": false, + "status": "dead", + "reason": "Native parameter changes never reach the model: initialization throws on params.define(object) before readParams/subscription. The manually reviewed pair and source show unchanged thresholds/duty under changed settings. Autonomous thermal drift is not input response.", + "mode": "drag" + }, + { + "index": 2, + "label": "Room", + "pass": false, + "status": "dead", + "reason": "Native parameter changes never reach the model: initialization throws on params.define(object) before readParams/subscription. The manually reviewed pair and source show unchanged thresholds/duty under changed settings. Autonomous thermal drift is not input response.", + "mode": "drag" + }, + { + "index": 3, + "label": "Door open", + "pass": false, + "status": "dead", + "reason": "Drag pair changes door selected chrome but running share stays24%, heat-leak note still says through walls and gasket. Minor thermal drift and page reflow are not door response. Source initialization failure prevents subscription; original dead classification retained.", + "mode": "drag" + } + ] + } + ], + "source": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline/claude-code/refrigerator/result.json", + "sourceSha256": "be90ba53e0e4f879efc1cfcc779118e01d3486a11c72797cd6416a9f8aafece1", + "replay": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-final/claude-code/refrigerator/result.json", + "replaySha256": "5813694bffd0556935844f8b086dc9cca5a16c9135c9a8e758d8561387fe5377", + "scorerCommit": "f009de5838f80b90e861e5727f0ad11cba8814f8" + }, + { + "revision": "baseline", + "provider": "claude-code", + "promptId": "stapler", + "model": "claude-opus-5-5", + "scoreMs": 617825, + "cardVisible": true, + "allControlsProven": true, + "questions": { + "structured": [], + "textQuestions": [], + "count": 0, + "needsReview": false + }, + "progressShown": true, + "renderGraceUsed": false, + "renderDelayMs": null, + "renderGraceRetainedCard": false, + "finalReview": { + "sourceReplay": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/claude-code/stapler/result.json", + "sourceReplaySha256": "4e2f4de23dd705a275b86e3c87cf3d5932963e20356c4abdff524dd84a878e2a", + "manualControls": 1, + "supplementalControls": 0 + }, + "controlStatuses": [ + { + "width": 710, + "status": "live", + "runtimeErrors": [], + "controls": [ + { + "index": 0, + "label": "Stapler: arrow keys press and release the handle", + "pass": true, + "status": "live", + "reason": "Supported End key closes the handle and drives/folds the staple: visible open gap9.0mm becomes clinched legs folded5.0mm, with clear mechanism geometry change. Prefer this supported route over the first click probe.", + "mode": "click" + }, + { + "index": 1, + "label": "Handle pressed", + "pass": true, + "status": "live", + "reason": "stable output changed outside controls", + "mode": "drag" + }, + { + "index": 2, + "label": "Paper", + "pass": true, + "status": "live", + "reason": "stable output changed outside controls", + "mode": "drag" + }, + { + "index": 3, + "label": "Closed clinch", + "pass": true, + "status": "live", + "reason": "stable output changed outside controls", + "mode": "primary" + }, + { + "index": 4, + "label": "Pinning", + "pass": true, + "status": "live", + "reason": "stable output changed outside controls", + "mode": "primary" + } + ] + } + ], + "source": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline/claude-code/stapler/result.json", + "sourceSha256": "5291a2719eaacc232488431dff8fea8448e27c733ab233c5832ab3e4a78933e3", + "replay": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-final/claude-code/stapler/result.json", + "replaySha256": "f9324b39774ff785ea19b8f04909fa5c66dfc7cdfdf776044894b9de3924c2fe", + "scorerCommit": "f009de5838f80b90e861e5727f0ad11cba8814f8" + }, + { + "revision": "baseline", + "provider": "claude-code", + "promptId": "spray-bottle", + "model": "claude-opus-5-5", + "scoreMs": 547618, + "cardVisible": true, + "allControlsProven": true, + "questions": { + "structured": [], + "textQuestions": [], + "count": 0, + "needsReview": false + }, + "progressShown": true, + "renderGraceUsed": false, + "renderDelayMs": null, + "renderGraceRetainedCard": false, + "finalReview": { + "sourceReplay": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/claude-code/spray-bottle/result.json", + "sourceReplaySha256": "625032b41756f0ac6a63e9a86314cc70533efa5d76bb0a55f9135afb0d7dccc6", + "manualControls": 1, + "supplementalControls": 0 + }, + "controlStatuses": [ + { + "width": 710, + "status": "live", + "runtimeErrors": [], + "controls": [ + { + "index": 0, + "label": "Spray bottle: hold Space or press to squeeze the trigger, N turns the nozzle", + "pass": true, + "status": "live", + "reason": "Advertised keyboard squeeze pulse increases the settled sprayed total1.0->2.0mL and reduces bottle259->258mL. Reduced-motion source disables idle touring; this is input-caused cumulative output, not hover styling.", + "mode": "key-ArrowRight" + } + ] + } + ], + "source": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline/claude-code/spray-bottle/result.json", + "sourceSha256": "05ccab52159a1bfa2a00f3a53646a595f268f81771e5e2fe3a1cc28f195cae82", + "replay": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-final/claude-code/spray-bottle/result.json", + "replaySha256": "33676758200fcc0da392a0d8e74ff4a9cad246b392f71639a3fdee8d4378c56a", + "scorerCommit": "f009de5838f80b90e861e5727f0ad11cba8814f8" + }, + { + "revision": "baseline", + "provider": "claude-code", + "promptId": "seat-belt", + "model": "claude-opus-5-5", + "scoreMs": 900000, + "cardVisible": false, + "allControlsProven": false, + "questions": { + "structured": [], + "textQuestions": [], + "count": 0, + "needsReview": false + }, + "progressShown": false, + "renderGraceUsed": false, + "renderDelayMs": null, + "renderGraceRetainedCard": false, + "finalReview": { + "sourceReplay": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/claude-code/seat-belt/result.json", + "sourceReplaySha256": "5298719d906f251e358e892ee83945aad21e58cf81e999562450e361931fc720", + "manualControls": 0, + "supplementalControls": 0 + }, + "controlStatuses": [], + "source": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline/claude-code/seat-belt/result.json", + "sourceSha256": "06f8107d0dbdc071df8e1f7b618ba1301b0486374d3239fb5042d316b075ee3b", + "replay": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-final/claude-code/seat-belt/result.json", + "replaySha256": "7d30436132a246ad70c0504283e5c296e34538b8932d45dc97904b3dfadc7700", + "scorerCommit": "f009de5838f80b90e861e5727f0ad11cba8814f8" + }, + { + "revision": "baseline", + "provider": "claude-code", + "promptId": "toaster", + "model": "claude-opus-5-5", + "scoreMs": 449076, + "cardVisible": true, + "allControlsProven": true, + "questions": { + "structured": [], + "textQuestions": [], + "count": 0, + "needsReview": false + }, + "progressShown": true, + "renderGraceUsed": false, + "renderDelayMs": null, + "renderGraceRetainedCard": false, + "finalReview": { + "sourceReplay": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/claude-code/toaster/result.json", + "sourceReplaySha256": "3d4bad0a8a5947d643c0c82e4adb219890d3ab757e67927f806167d68bfad316", + "manualControls": 0, + "supplementalControls": 0 + }, + "controlStatuses": [ + { + "width": 710, + "status": "live", + "runtimeErrors": [], + "controls": [ + { + "index": 0, + "label": "Toaster: Space presses the lever, arrow keys set the shade, Escape cancels", + "pass": true, + "status": "live", + "reason": "stable output changed outside controls", + "mode": "drag" + } + ] + } + ], + "source": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline/claude-code/toaster/result.json", + "sourceSha256": "1c9d8eef5cc88ab2ab6defe223c4c106f90a89dd87950250ef9f1ddbe57e29e0", + "replay": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-final/claude-code/toaster/result.json", + "replaySha256": "5d1141acf8320ee7da276dfbaa0fd3e3f7e3e41ce1374f6ed5f630991a5f83dc", + "scorerCommit": "f009de5838f80b90e861e5727f0ad11cba8814f8" + }, + { + "revision": "baseline", + "provider": "claude-code", + "promptId": "umbrella", + "model": "claude-opus-5-5", + "scoreMs": 609834, + "cardVisible": true, + "allControlsProven": true, + "questions": { + "structured": [], + "textQuestions": [], + "count": 0, + "needsReview": false + }, + "progressShown": true, + "renderGraceUsed": false, + "renderDelayMs": null, + "renderGraceRetainedCard": false, + "finalReview": { + "sourceReplay": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/claude-code/umbrella/result.json", + "sourceReplaySha256": "3d580846514488b0e454a0666014ed07530d2a27cf923f6ea1867f2cbdee418b", + "manualControls": 0, + "supplementalControls": 0 + }, + "controlStatuses": [ + { + "width": 710, + "status": "live", + "runtimeErrors": [], + "controls": [ + { + "index": 0, + "label": "Umbrella: up and down arrows slide the runner, space snaps it open or shut", + "pass": true, + "status": "live", + "reason": "stable output changed outside controls", + "mode": "drag" + } + ] + } + ], + "source": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline/claude-code/umbrella/result.json", + "sourceSha256": "bf6b4c0cd3502008c51f7b98d34b01887cc3918c9706103a8abb1a9a26b51da0", + "replay": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-final/claude-code/umbrella/result.json", + "replaySha256": "3577809174ff08fbc37d78203174ec0b5a1d64a47988fb51be393f8bd252eaad", + "scorerCommit": "f009de5838f80b90e861e5727f0ad11cba8814f8" + }, + { + "revision": "baseline", + "provider": "claude-code", + "promptId": "cdn", + "model": "claude-opus-5-5", + "scoreMs": 447035, + "cardVisible": true, + "allControlsProven": true, + "questions": { + "structured": [], + "textQuestions": [], + "count": 0, + "needsReview": false + }, + "progressShown": true, + "renderGraceUsed": false, + "renderDelayMs": null, + "renderGraceRetainedCard": false, + "finalReview": { + "sourceReplay": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/claude-code/cdn/result.json", + "sourceReplaySha256": "501c834c2d2e5e7ef6a436305fbd714b747752ee5c87c83c7e6cc4fdc6c6e6d9", + "manualControls": 0, + "supplementalControls": 0 + }, + "controlStatuses": [ + { + "width": 710, + "status": "live", + "runtimeErrors": [], + "controls": [ + { + "index": 0, + "label": "Time since the purge: arrow keys step through time", + "pass": true, + "status": "live", + "reason": "stable output changed outside controls", + "mode": "drag" + }, + { + "index": 1, + "label": "Cloudflare", + "pass": true, + "status": "live", + "reason": "stable output changed outside controls", + "mode": "primary" + }, + { + "index": 2, + "label": "Fastly", + "pass": true, + "status": "live", + "reason": "stable output changed outside controls", + "mode": "primary" + }, + { + "index": 3, + "label": "CloudFront", + "pass": true, + "status": "live", + "reason": "stable output changed outside controls", + "mode": "primary" + }, + { + "index": 4, + "label": "Browser max-age", + "pass": true, + "status": "live", + "reason": "stable output changed outside controls", + "mode": "primary" + }, + { + "index": 5, + "label": "User's last visit before purge", + "pass": true, + "status": "live", + "reason": "stable output changed outside controls", + "mode": "primary" + } + ] + } + ], + "source": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline/claude-code/cdn/result.json", + "sourceSha256": "40dd621119d10e6e8dbac152c84ca17c1bfbb83caf550072796fd9970a79b265", + "replay": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-final/claude-code/cdn/result.json", + "replaySha256": "e079b37578d3b1430cddfe2d826a7fc25e2c64e966ec4fa032bf359c3dad28fb", + "scorerCommit": "f009de5838f80b90e861e5727f0ad11cba8814f8" + }, + { + "revision": "baseline", + "provider": "claude-code", + "promptId": "notification-settings", + "model": null, + "scoreMs": 900000, + "cardVisible": false, + "allControlsProven": false, + "questions": { + "structured": [], + "textQuestions": [], + "count": 0, + "needsReview": false + }, + "progressShown": false, + "renderGraceUsed": null, + "renderDelayMs": null, + "renderGraceRetainedCard": null, + "finalReview": { + "sourceReplay": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/claude-code/notification-settings/result.json", + "sourceReplaySha256": "0b711f1b73ec9911168e0fcf174c8f50478488004b489f9cb828b2aa2c611435", + "manualControls": 0, + "supplementalControls": 0 + }, + "controlStatuses": [], + "source": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline/claude-code/notification-settings/result.json", + "sourceSha256": "098c6bc150c37f5c669e1df5ca6d2c9c2a4c2bb90d632fc87ae702e92f2d3df1", + "replay": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-final/claude-code/notification-settings/result.json", + "replaySha256": "a838dc37ee0a9b27aa54d77d74adb0eb9ea29347c2a4a2f0519a725777b868eb", + "scorerCommit": "f009de5838f80b90e861e5727f0ad11cba8814f8" + }, + { + "revision": "baseline", + "provider": "claude-code", + "promptId": "narrow-toggle", + "model": null, + "scoreMs": 900000, + "cardVisible": false, + "allControlsProven": false, + "questions": { + "structured": [], + "textQuestions": [], + "count": 0, + "needsReview": false + }, + "progressShown": false, + "renderGraceUsed": null, + "renderDelayMs": null, + "renderGraceRetainedCard": null, + "finalReview": { + "sourceReplay": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/claude-code/narrow-toggle/result.json", + "sourceReplaySha256": "32239464db00c4553eebf4b27b34ad73d5cb7397c5fb316e748e870e30b6a884", + "manualControls": 0, + "supplementalControls": 0 + }, + "controlStatuses": [], + "source": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline/claude-code/narrow-toggle/result.json", + "sourceSha256": "806911068e27f93dbf734c77250787a1b3c566db75c1f9f8f2484c740b9de1a7", + "replay": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-final/claude-code/narrow-toggle/result.json", + "replaySha256": "63bac47f6c11abcce6645a22ec8e5903f68fc106829874da514a13870ba3af15", + "scorerCommit": "f009de5838f80b90e861e5727f0ad11cba8814f8" + }, + { + "revision": "baseline", + "provider": "claude-code", + "promptId": "dns", + "model": null, + "scoreMs": 900000, + "cardVisible": false, + "allControlsProven": false, + "questions": { + "structured": [], + "textQuestions": [], + "count": 0, + "needsReview": false + }, + "progressShown": false, + "renderGraceUsed": null, + "renderDelayMs": null, + "renderGraceRetainedCard": null, + "finalReview": { + "sourceReplay": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/claude-code/dns/result.json", + "sourceReplaySha256": "2bb5c449d0413b1720bda451d80d88f0b7eca31ea631bc020c3f030dfc1c6e8d", + "manualControls": 0, + "supplementalControls": 0 + }, + "controlStatuses": [], + "source": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline/claude-code/dns/result.json", + "sourceSha256": "691aa0196720c4b34fdc74edc848cf28507ef337f5b0b81ef0b3f11dcd4df110", + "replay": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-final/claude-code/dns/result.json", + "replaySha256": "f69295ec5dfb359b10388fe501ea696d673b34d4440d653bb714597faacb2ce6", + "scorerCommit": "f009de5838f80b90e861e5727f0ad11cba8814f8" + }, + { + "revision": "baseline", + "provider": "claude-code", + "promptId": "database-index", + "model": null, + "scoreMs": 900000, + "cardVisible": false, + "allControlsProven": false, + "questions": { + "structured": [], + "textQuestions": [], + "count": 0, + "needsReview": false + }, + "progressShown": false, + "renderGraceUsed": null, + "renderDelayMs": null, + "renderGraceRetainedCard": null, + "finalReview": { + "sourceReplay": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/claude-code/database-index/result.json", + "sourceReplaySha256": "b2da7a3eeb9dfe6700c91aca988f5ececa7aa83ea8160430d005a90cf855e024", + "manualControls": 0, + "supplementalControls": 0 + }, + "controlStatuses": [], + "source": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline/claude-code/database-index/result.json", + "sourceSha256": "04d1704b5e861105862532da14422ee47fdf8ec2101e5ad5fcd951f78bf64c80", + "replay": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-final/claude-code/database-index/result.json", + "replaySha256": "10c421d96eef7f48397d2d83dba17556d43134de9cb466388ca5b423c5a8da55", + "scorerCommit": "f009de5838f80b90e861e5727f0ad11cba8814f8" + }, + { + "revision": "baseline", + "provider": "claude-code", + "promptId": "git-merge", + "model": "claude-opus-5-5", + "scoreMs": 470672, + "cardVisible": true, + "allControlsProven": true, + "questions": { + "structured": [], + "textQuestions": [], + "count": 0, + "needsReview": false + }, + "progressShown": true, + "renderGraceUsed": false, + "renderDelayMs": null, + "renderGraceRetainedCard": false, + "finalReview": { + "sourceReplay": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/claude-code/git-merge/result.json", + "sourceReplaySha256": "85547fd386097ea9cc929e7fa108147a056937942a5461c2a9ace7cd2968e830", + "manualControls": 0, + "supplementalControls": 0 + }, + "controlStatuses": [ + { + "width": 710, + "status": "live", + "runtimeErrors": [], + "controls": [ + { + "index": 0, + "label": "Three-way merge: arrow keys move the carriage from line to line, C switches between a clean merge and a conflict", + "pass": true, + "status": "live", + "reason": "stable output changed outside controls", + "mode": "drag" + }, + { + "index": 1, + "label": "Clean merge", + "pass": true, + "status": "live", + "reason": "stable output changed outside controls", + "mode": "primary" + }, + { + "index": 2, + "label": "Conflict", + "pass": true, + "status": "live", + "reason": "stable output changed outside controls", + "mode": "primary" + } + ] + } + ], + "source": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline/claude-code/git-merge/result.json", + "sourceSha256": "8851bb178c13d80d2a4f53176a50795ff65a55fab87ad631d8b5cc66a6fb3233", + "replay": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-final/claude-code/git-merge/result.json", + "replaySha256": "a5a0123e7d8150f50e34d894667499397ef8d7c43af3ed4d5495febfaedcff72", + "scorerCommit": "f009de5838f80b90e861e5727f0ad11cba8814f8" + }, + { + "revision": "baseline", + "provider": "claude-code", + "promptId": "websocket", + "model": "claude-opus-5-5", + "scoreMs": 575075, + "cardVisible": true, + "allControlsProven": true, + "questions": { + "structured": [], + "textQuestions": [], + "count": 0, + "needsReview": false + }, + "progressShown": true, + "renderGraceUsed": false, + "renderDelayMs": null, + "renderGraceRetainedCard": false, + "finalReview": { + "sourceReplay": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/claude-code/websocket/result.json", + "sourceReplaySha256": "d9c5bc363e800a411c8966b155db934d24ad51ec27521ece1b81e5f186971719", + "manualControls": 5, + "supplementalControls": 0 + }, + "controlStatuses": [ + { + "width": 710, + "status": "live", + "runtimeErrors": [], + "controls": [ + { + "index": 0, + "label": "Chat delivery time in milliseconds. Keys 1, 2 and 3 send from the left, front and right desks; M switches between WebSocket and polling; arrow keys change latency and the poll interval", + "pass": true, + "status": "live", + "reason": "Supported key-1 input changes a settled open connection to a delivered message (121 ms), with visible desk/message geometry and readout change. This replaces ambiguous earlier click/settling evidence.", + "mode": "click" + }, + { + "index": 1, + "label": "WebSocket", + "pass": true, + "status": "live", + "reason": "After preparing Polling, clicking WebSocket changes the explanatory readout from Polling every1s to WebSocket handshake and changes gate geometry; selection styling is not the sole evidence.", + "mode": "primary" + }, + { + "index": 2, + "label": "Polling", + "pass": true, + "status": "live", + "reason": "After preparing WebSocket, clicking Polling changes the readout from3 open connections to Polling every1s and changes connection/gate state.", + "mode": "primary" + }, + { + "index": 3, + "label": "Network latency, one way", + "pass": true, + "status": "live", + "reason": "After actual supported key-1 message sends and enough delivery time, low/high latency drag changes external delivery time from 42 to 404 ms. This resolves the inactive-message precondition.", + "mode": "drag" + }, + { + "index": 4, + "label": "Poll interval", + "pass": true, + "status": "live", + "reason": "Real slider drag changes the stable output interval from Polling every1s to every4.5s. The unrelated empty-poll counter is not used as proof.", + "mode": "drag" + } + ] + } + ], + "source": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline/claude-code/websocket/result.json", + "sourceSha256": "7edf8cad8249cb01800d9573265a1c5950bdad36beee6c455d5a6eade94a8171", + "replay": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-final/claude-code/websocket/result.json", + "replaySha256": "0ee79a16ed4ebf31f311609b336b661d625bef8eca4ec6fe8b9dae34ceb8ffcd", + "scorerCommit": "f009de5838f80b90e861e5727f0ad11cba8814f8" + }, + { + "revision": "baseline", + "provider": "claude-code", + "promptId": "load-balancer", + "model": "claude-opus-5-5", + "scoreMs": 340791, + "cardVisible": true, + "allControlsProven": true, + "questions": { + "structured": [], + "textQuestions": [], + "count": 0, + "needsReview": false + }, + "progressShown": true, + "renderGraceUsed": false, + "renderDelayMs": null, + "renderGraceRetainedCard": false, + "finalReview": { + "sourceReplay": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/claude-code/load-balancer/result.json", + "sourceReplaySha256": "a3eb72fe847999ed55d11616826a96a8c27134811e0bf9bd1fda02d25300302f", + "manualControls": 16, + "supplementalControls": 0 + }, + "controlStatuses": [ + { + "width": 710, + "status": "live", + "runtimeErrors": [], + "controls": [ + { + "index": 0, + "label": "Load balancer: left and right arrows change the algorithm, up and down change traffic", + "pass": true, + "status": "live", + "reason": "Supported ArrowRight changes model algorithm from round robin to least connections; output algorithm words change and queues reset, beyond selected-button styling.", + "mode": "key-ArrowRight" + }, + { + "index": 1, + "label": "Round robin", + "pass": true, + "status": "live", + "reason": "After preparing least connections, Round robin changes the output algorithm words to round robin and resets queues.", + "mode": "primary" + }, + { + "index": 2, + "label": "Least connections", + "pass": true, + "status": "live", + "reason": "Least connections changes the output algorithm words from round robin to least connections.", + "mode": "primary" + }, + { + "index": 3, + "label": "Random", + "pass": true, + "status": "live", + "reason": "Random changes the output algorithm words from round robin to random.", + "mode": "primary" + }, + { + "index": 4, + "label": "Fewer requests", + "pass": true, + "status": "live", + "reason": "Repeated actual Fewer requests clicks lower traffic to 0.5 req/s; after a fixed 12-second observation the former 8/8/7/8 backlog has drained to empty. Both the independent mechanism and queue readout change, beyond the rate label.", + "mode": "primary" + }, + { + "index": 5, + "label": "More requests", + "pass": true, + "status": "live", + "reason": "Repeated actual More requests clicks raise traffic from 0.5 to 5.5 req/s; at the same 12-second observation the visible queues grow from 0/1/0/0 to 8/8/7/8 with dropped requests. This proves traffic generation beyond the rate label.", + "mode": "primary" + }, + { + "index": 6, + "label": "None", + "pass": true, + "status": "live", + "reason": "Equal eight-second observation after reset at the same traffic/algorithm: changing slow-server selection moves the visible 4\u20135-request backlog to the selected server; None removes it. Before/after mechanism geometry and queue readouts agree, beyond selection styling.", + "mode": "primary" + }, + { + "index": 7, + "label": "1", + "pass": true, + "status": "live", + "reason": "Equal eight-second observation after reset at the same traffic/algorithm: changing slow-server selection moves the visible 4\u20135-request backlog to the selected server; None removes it. Before/after mechanism geometry and queue readouts agree, beyond selection styling.", + "mode": "primary" + }, + { + "index": 8, + "label": "2", + "pass": true, + "status": "live", + "reason": "Equal eight-second observation after reset at the same traffic/algorithm: changing slow-server selection moves the visible 4\u20135-request backlog to the selected server; None removes it. Before/after mechanism geometry and queue readouts agree, beyond selection styling.", + "mode": "primary" + }, + { + "index": 9, + "label": "3", + "pass": true, + "status": "live", + "reason": "Equal eight-second observation after reset at the same traffic/algorithm: changing slow-server selection moves the visible 4\u20135-request backlog to the selected server; None removes it. Before/after mechanism geometry and queue readouts agree, beyond selection styling.", + "mode": "primary" + }, + { + "index": 10, + "label": "4", + "pass": true, + "status": "live", + "reason": "Equal eight-second observation after reset at the same traffic/algorithm: changing slow-server selection moves the visible 4\u20135-request backlog to the selected server; None removes it. Before/after mechanism geometry and queue readouts agree, beyond selection styling.", + "mode": "primary" + }, + { + "index": 11, + "label": "None", + "pass": true, + "status": "live", + "reason": "Selecting no failed server removes the unavailable x marker from the first server queue in the model readout.", + "mode": "primary" + }, + { + "index": 12, + "label": "1", + "pass": true, + "status": "live", + "reason": "Actual click marks server 1 unavailable: its mechanism output changes and external queue position becomes \u00d7 while routing continues to other servers.", + "mode": "primary" + }, + { + "index": 13, + "label": "2", + "pass": true, + "status": "live", + "reason": "Actual click marks server 2 unavailable: its mechanism output changes and external queue position becomes \u00d7 while routing continues to other servers.", + "mode": "primary" + }, + { + "index": 14, + "label": "3", + "pass": true, + "status": "live", + "reason": "Marking server3 failed changes the third queue to an unavailable x, beyond the selected-button state.", + "mode": "primary" + }, + { + "index": 15, + "label": "4", + "pass": true, + "status": "live", + "reason": "Actual click marks server 4 unavailable: its mechanism output changes and external queue position becomes \u00d7 while routing continues to other servers.", + "mode": "primary" + } + ] + } + ], + "source": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline/claude-code/load-balancer/result.json", + "sourceSha256": "29f43ace05c0dd9a66fd2d1dd7aa332bf5b2109b4414b4b6ce333690e2be1198", + "replay": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-final/claude-code/load-balancer/result.json", + "replaySha256": "e7da3f4bd48bd8f81a594c17d353aa61dfd86b17c58c20e0d0e9bb04f1f05219", + "scorerCommit": "f009de5838f80b90e861e5727f0ad11cba8814f8" + }, + { + "revision": "baseline", + "provider": "codex", + "promptId": "washing-machine", + "model": "gpt-6.1-sol", + "scoreMs": 111879, + "cardVisible": true, + "allControlsProven": true, + "questions": { + "structured": [], + "textQuestions": [], + "count": 0, + "needsReview": false + }, + "progressShown": true, + "renderGraceUsed": false, + "renderDelayMs": null, + "renderGraceRetainedCard": false, + "finalReview": { + "sourceReplay": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/washing-machine/result.json", + "sourceReplaySha256": "ec59840357e983941f82d58f3c47282a5b3461e1065695f13940e1f37ca20cd2", + "manualControls": 5, + "supplementalControls": 0 + }, + "controlStatuses": [ + { + "width": 710, + "status": "live", + "runtimeErrors": [], + "controls": [ + { + "index": 0, + "label": "control 0", + "pass": true, + "status": "live", + "reason": "Supported ArrowRight changes Fill to Wash, including the explanatory paragraph and readout. No autonomous stage advance exists in the saved handler.", + "mode": "key-ArrowRight" + }, + { + "index": 1, + "label": "Fill", + "pass": true, + "status": "live", + "reason": "Click Fill changes Wash to Fill and replaces the mechanism explanation/readout.", + "mode": "primary" + }, + { + "index": 2, + "label": "Wash", + "pass": true, + "status": "live", + "reason": "Click Wash changes Fill to Wash and replaces the mechanism explanation/readout.", + "mode": "primary" + }, + { + "index": 3, + "label": "Drain", + "pass": true, + "status": "live", + "reason": "Click Drain visibly removes tank water, lights the drain route and changes the explanation/readout.", + "mode": "primary" + }, + { + "index": 4, + "label": "Rinse", + "pass": true, + "status": "live", + "reason": "stable output changed outside controls", + "mode": "primary" + }, + { + "index": 5, + "label": "Spin", + "pass": true, + "status": "live", + "reason": "Click Spin visibly removes tank water, changes drum appearance and explains spinning/draining instead of filling.", + "mode": "primary" + } + ] + } + ], + "source": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline/codex/washing-machine/result.json", + "sourceSha256": "0e67e5e744e3a51f05a0735e548bfbfdd54c3f0bbd7f51ada834d890be733f54", + "replay": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-final/codex/washing-machine/result.json", + "replaySha256": "3bae3444d26f2fc1da534893b9b0b4c42e5d131ed8cfed41ab0d7e1df59a9053", + "scorerCommit": "f009de5838f80b90e861e5727f0ad11cba8814f8" + }, + { + "revision": "baseline", + "provider": "codex", + "promptId": "bicycle-pump", + "model": "gpt-6.1-sol", + "scoreMs": 72624, + "cardVisible": true, + "allControlsProven": true, + "questions": { + "structured": [], + "textQuestions": [], + "count": 0, + "needsReview": false + }, + "progressShown": true, + "renderGraceUsed": false, + "renderDelayMs": 26, + "renderGraceRetainedCard": false, + "finalReview": { + "sourceReplay": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/bicycle-pump/result.json", + "sourceReplaySha256": "2e2890d74859f813efdbeec093a86b0ec5d98cabdb2d8cfbe6090272f54256d4", + "manualControls": 0, + "supplementalControls": 0 + }, + "controlStatuses": [ + { + "width": 710, + "status": "live", + "runtimeErrors": [], + "controls": [ + { + "index": 0, + "label": "Pull up", + "pass": true, + "status": "live", + "reason": "stable output changed outside controls", + "mode": "primary" + }, + { + "index": 1, + "label": "Push down", + "pass": true, + "status": "live", + "reason": "stable output changed outside controls", + "mode": "primary" + }, + { + "index": 2, + "label": "Air enters tire", + "pass": true, + "status": "live", + "reason": "stable output changed outside controls", + "mode": "primary" + } + ] + } + ], + "source": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline/codex/bicycle-pump/result.json", + "sourceSha256": "bb4b39e7ae82d1783d4adbda646362c47d80f3d72f49c6837a73c3f5a0545929", + "replay": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-final/codex/bicycle-pump/result.json", + "replaySha256": "ced75bd762ad58f29970c871e767e20d929519dd3a8841e8dca4ee4b24f9d74d", + "scorerCommit": "f009de5838f80b90e861e5727f0ad11cba8814f8" + }, + { + "revision": "baseline", + "provider": "codex", + "promptId": "zipper", + "model": "gpt-6.1-sol", + "scoreMs": 134287, + "cardVisible": true, + "allControlsProven": false, + "questions": { + "structured": [], + "textQuestions": [], + "count": 0, + "needsReview": false + }, + "progressShown": true, + "renderGraceUsed": false, + "renderDelayMs": 0, + "renderGraceRetainedCard": false, + "finalReview": { + "sourceReplay": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/zipper/result.json", + "sourceReplaySha256": "a7e02b7de93e0d1e5e8f95cf22b95fa5391a1811f9254ee29a5ba5143fa9f725", + "manualControls": 1, + "supplementalControls": 0 + }, + "controlStatuses": [ + { + "width": 710, + "status": "unproven", + "runtimeErrors": [], + "controls": [ + { + "index": 0, + "label": "Zipper position", + "pass": false, + "status": "dead", + "reason": "The supported ArrowRight route leaves slider position at 50 and the mechanism unchanged in the inspected pair. The exact saved keyboard handler calls object-form params.set, which the frozen baseline silently ignores; the separate native range working does not repair this stage.", + "mode": "drag" + }, + { + "index": 1, + "label": "Slider position \u00b7 right closes", + "pass": true, + "status": "live", + "reason": "stable output changed outside controls", + "mode": "drag" + }, + { + "index": 2, + "label": "Cutaway", + "pass": true, + "status": "live", + "reason": "stable output changed outside controls", + "mode": "primary" + }, + { + "index": 3, + "label": "With cover", + "pass": true, + "status": "live", + "reason": "stable output changed outside controls", + "mode": "primary" + } + ] + } + ], + "source": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline/codex/zipper/result.json", + "sourceSha256": "6b9ca81a9d5be205d9108361b315ecf30063a3419ad7907ec31ec060045ccfd2", + "replay": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-final/codex/zipper/result.json", + "replaySha256": "ae636bd2c1bb46474e042acc9f7102c5469877cf4df0f1936614a34a6c535a86", + "scorerCommit": "f009de5838f80b90e861e5727f0ad11cba8814f8" + }, + { + "revision": "baseline", + "provider": "codex", + "promptId": "toilet", + "model": "gpt-6.1-sol", + "scoreMs": 156153, + "cardVisible": true, + "allControlsProven": true, + "questions": { + "structured": [], + "textQuestions": [], + "count": 0, + "needsReview": false + }, + "progressShown": true, + "renderGraceUsed": false, + "renderDelayMs": null, + "renderGraceRetainedCard": false, + "finalReview": { + "sourceReplay": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/toilet/result.json", + "sourceReplaySha256": "c0639791d117e9a5b9c489afc1c6c9448f93d6b2408630564da620ed456fc8e6", + "manualControls": 1, + "supplementalControls": 0 + }, + "controlStatuses": [ + { + "width": 710, + "status": "live", + "runtimeErrors": [], + "controls": [ + { + "index": 0, + "label": "Flush cycle; use left and right arrow keys", + "pass": true, + "status": "live", + "reason": "The inspected End pair changes Ready to Shut off and the external readout and paragraph to Float raised / refill shuts off. The saved source explicitly handles End, stops the timer first and selects phase 4, so this is a supported input route rather than autonomous cycle settling.", + "mode": "key-End" + }, + { + "index": 1, + "label": "ReadyRelease tank waterSiphon the bowlRefill tank and bowlShut off", + "pass": true, + "status": "live", + "reason": "stable output changed outside controls", + "mode": "primary" + }, + { + "index": 2, + "label": "Next stage \u2192", + "pass": true, + "status": "live", + "reason": "stable output changed outside controls", + "mode": "primary" + }, + { + "index": 3, + "label": "Play cycle", + "pass": true, + "status": "live", + "reason": "stable output changed outside controls", + "mode": "primary" + } + ] + } + ], + "source": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline/codex/toilet/result.json", + "sourceSha256": "c1eebeed91c4a3645217f0bf124132676a2657991809fcead99ec55ef40c0b67", + "replay": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-final/codex/toilet/result.json", + "replaySha256": "655cdc3e8dd4745fd264fcf14b390e7825d3b776a7c6ac90be0d0f64a4660b4c", + "scorerCommit": "f009de5838f80b90e861e5727f0ad11cba8814f8" + }, + { + "revision": "baseline", + "provider": "codex", + "promptId": "thermos", + "model": "gpt-6.1-sol", + "scoreMs": 900000, + "cardVisible": false, + "allControlsProven": false, + "questions": { + "structured": [], + "textQuestions": [], + "count": 0, + "needsReview": false + }, + "progressShown": true, + "renderGraceUsed": true, + "renderDelayMs": null, + "renderGraceRetainedCard": false, + "finalReview": { + "sourceReplay": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/thermos/result.json", + "sourceReplaySha256": "23a7b05c4861fa24f25bf7e794abb5f121c6dbb69ade41a4f90aba3018418eec", + "manualControls": 0, + "supplementalControls": 0 + }, + "controlStatuses": [], + "source": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline/codex/thermos/result.json", + "sourceSha256": "3ce1afc0d3bd8c136a60d2b70c2fd49fd42ea039c1321785aa11d0804ffac28c", + "replay": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-final/codex/thermos/result.json", + "replaySha256": "6dfa86417887604336185563da004a5ac28b50e4ce8e415c64c1cb1638110444", + "scorerCommit": "f009de5838f80b90e861e5727f0ad11cba8814f8" + }, + { + "revision": "baseline", + "provider": "codex", + "promptId": "door-lock", + "model": "gpt-6.1-sol", + "scoreMs": 114738, + "cardVisible": true, + "allControlsProven": false, + "questions": { + "structured": [], + "textQuestions": [], + "count": 0, + "needsReview": false + }, + "progressShown": true, + "renderGraceUsed": false, + "renderDelayMs": null, + "renderGraceRetainedCard": false, + "finalReview": { + "sourceReplay": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/door-lock/result.json", + "sourceReplaySha256": "dd68e571ddec4af2e34b5f72be0dba02c3059ae6ef7c56a7567123ea9a0bb4a1", + "manualControls": 2, + "supplementalControls": 0 + }, + "controlStatuses": [ + { + "width": 710, + "status": "runtime-error", + "runtimeErrors": [ + "exception: Error: Parameter names are letters, digits, - and _: [object Object]" + ], + "controls": [ + { + "index": 0, + "label": "Lock cutaway. Arrow keys choose a key; Enter attempts to turn it.", + "pass": true, + "status": "live", + "reason": "The inspected ArrowRight pair changes the lock from its incomplete initial drawing to No key: springs and pins become visible, with blocked readout and matching explanation. The saved source explicitly handles ArrowRight by changing key and calling draw; no autonomous transition is involved. This proves this input route only: the captured initialization runtime error still rejects the whole card.", + "mode": "key-ArrowRight" + }, + { + "index": 1, + "label": "No key", + "pass": true, + "status": "live", + "reason": "stable output changed outside controls", + "mode": "primary" + }, + { + "index": 2, + "label": "Wrong key", + "pass": true, + "status": "live", + "reason": "The inspected click pair visibly inserts the wrong key, changes pin heights and changes the explanation to a pin bridging the shell and plug. The saved onclick calls set/draw synchronously. The existing initialization runtime error remains a whole-card failure.", + "mode": "primary" + }, + { + "index": 3, + "label": "Correct key", + "pass": true, + "status": "live", + "reason": "stable output changed outside controls", + "mode": "primary" + }, + { + "index": 4, + "label": "Turn key \u21bb", + "pass": false, + "status": "unproven", + "reason": "No proven output change outside controls", + "mode": "primary" + } + ] + } + ], + "source": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline/codex/door-lock/result.json", + "sourceSha256": "877452b69167aac2f0e0e9c1e88bae189a3fc276a6ba2e5f3b819814f39928bb", + "replay": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-final/codex/door-lock/result.json", + "replaySha256": "bb5ed1a9aae7f9a930e6195e6cfaaefc750a531dcf11aafbc49f45e8acfb5e4b", + "scorerCommit": "f009de5838f80b90e861e5727f0ad11cba8814f8" + }, + { + "revision": "baseline", + "provider": "codex", + "promptId": "refrigerator", + "model": "gpt-6.1-sol", + "scoreMs": 164764, + "cardVisible": true, + "allControlsProven": false, + "questions": { + "structured": [], + "textQuestions": [], + "count": 0, + "needsReview": false + }, + "progressShown": true, + "renderGraceUsed": false, + "renderDelayMs": null, + "renderGraceRetainedCard": false, + "finalReview": { + "sourceReplay": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/refrigerator/result.json", + "sourceReplaySha256": "56c4ae83a7d210d4030bc6680820b3e9ad655402e89976df0998a643f92edb13", + "manualControls": 5, + "supplementalControls": 0 + }, + "controlStatuses": [ + { + "width": 710, + "status": "runtime-error", + "runtimeErrors": [ + "exception: Error: Parameter names are letters, digits, - and _: [object Object]" + ], + "controls": [ + { + "index": 0, + "label": "Refrigeration cycle. Use left and right arrow keys to change stage.", + "pass": false, + "status": "dead", + "reason": "The inspected supported-input before/after frames keep the same uninitialized refrigerator, blank stage explanation and unchanged output. The retained source object-form params.define throws before registering the render subscription; v3 records that initialization exception. Thus the original dead-control finding remains, not a merely small visual delta.", + "mode": "drag" + }, + { + "index": 1, + "label": "1. Absorb", + "pass": false, + "status": "dead", + "reason": "The inspected supported-input before/after frames keep the same uninitialized refrigerator, blank stage explanation and unchanged output. The retained source object-form params.define throws before registering the render subscription; v3 records that initialization exception. Thus the original dead-control finding remains, not a merely small visual delta.", + "mode": "primary" + }, + { + "index": 2, + "label": "2. Compress", + "pass": false, + "status": "dead", + "reason": "The inspected supported-input before/after frames keep the same uninitialized refrigerator, blank stage explanation and unchanged output. The retained source object-form params.define throws before registering the render subscription; v3 records that initialization exception. Thus the original dead-control finding remains, not a merely small visual delta.", + "mode": "primary" + }, + { + "index": 3, + "label": "3. Release", + "pass": false, + "status": "dead", + "reason": "The inspected supported-input before/after frames keep the same uninitialized refrigerator, blank stage explanation and unchanged output. The retained source object-form params.define throws before registering the render subscription; v3 records that initialization exception. Thus the original dead-control finding remains, not a merely small visual delta.", + "mode": "primary" + }, + { + "index": 4, + "label": "4. Expand", + "pass": false, + "status": "dead", + "reason": "The inspected supported-input before/after frames keep the same uninitialized refrigerator, blank stage explanation and unchanged output. The retained source object-form params.define throws before registering the render subscription; v3 records that initialization exception. Thus the original dead-control finding remains, not a merely small visual delta.", + "mode": "primary" + } + ] + } + ], + "source": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline/codex/refrigerator/result.json", + "sourceSha256": "e3850a377dccd204e24c6453073539a4594a5400dc774517b627d19d84859605", + "replay": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-final/codex/refrigerator/result.json", + "replaySha256": "06ab7bc5f8c64e0828fba502b07cb6fffede6b1139b452b756dd09434077b9b5", + "scorerCommit": "f009de5838f80b90e861e5727f0ad11cba8814f8" + }, + { + "revision": "baseline", + "provider": "codex", + "promptId": "stapler", + "model": "gpt-6.1-sol", + "scoreMs": 151759, + "cardVisible": true, + "allControlsProven": true, + "questions": { + "structured": [], + "textQuestions": [], + "count": 0, + "needsReview": false + }, + "progressShown": true, + "renderGraceUsed": false, + "renderDelayMs": null, + "renderGraceRetainedCard": false, + "finalReview": { + "sourceReplay": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/stapler/result.json", + "sourceReplaySha256": "38fba8bbf0d9d5d185f4ba38ec7c34341a997efbaed9ad6dbe9add352a26d5fd", + "manualControls": 2, + "supplementalControls": 0 + }, + "controlStatuses": [ + { + "width": 710, + "status": "live", + "runtimeErrors": [], + "controls": [ + { + "index": 0, + "label": "Stapler cycle", + "pass": true, + "status": "live", + "reason": "The inspected End pair changes Ready to Release and replaces the explanatory paragraph with the return-spring/feed-spring stage. The saved source explicitly handles End and sets cycle 100; there is no autonomous cycle timer.", + "mode": "key-End" + }, + { + "index": 1, + "label": "Press \u2192 bend \u2192 release", + "pass": true, + "status": "live", + "reason": "stable output changed outside controls", + "mode": "drag" + }, + { + "index": 2, + "label": "Next stage \u2192", + "pass": true, + "status": "live", + "reason": "The inspected Next-stage click resets Release to Ready, changes the mechanism geometry and explanatory paragraph, matching the saved synchronous next-stage handler.", + "mode": "primary" + } + ] + } + ], + "source": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline/codex/stapler/result.json", + "sourceSha256": "a4c71ddabc46b0a3899bcee1af7cb379c2e568663881989b5217b268aab0ce3f", + "replay": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-final/codex/stapler/result.json", + "replaySha256": "6fb0c80b9aebb05efe83670b5b557bd2f26e5aebc34eeaed846d061d9fb29281", + "scorerCommit": "f009de5838f80b90e861e5727f0ad11cba8814f8" + }, + { + "revision": "baseline", + "provider": "codex", + "promptId": "spray-bottle", + "model": "gpt-6.1-sol", + "scoreMs": 108465, + "cardVisible": true, + "allControlsProven": false, + "questions": { + "structured": [], + "textQuestions": [], + "count": 0, + "needsReview": false + }, + "progressShown": true, + "renderGraceUsed": false, + "renderDelayMs": null, + "renderGraceRetainedCard": false, + "finalReview": { + "sourceReplay": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/spray-bottle/result.json", + "sourceReplaySha256": "5f3f2d0801a433b856a1fb33177b05defe162c1b7e09780493c327de77550f07", + "manualControls": 1, + "supplementalControls": 0 + }, + "controlStatuses": [ + { + "width": 710, + "status": "runtime-error", + "runtimeErrors": [ + "exception: Error: Parameter names are letters, digits, - and _: [object Object]" + ], + "controls": [ + { + "index": 0, + "label": "Pump stroke", + "pass": true, + "status": "live", + "reason": "The inspected ArrowRight pair changes Release to Squeeze: mist appears, piston/spring geometry changes and the explanation and external readout update. The saved global keyboard handler explicitly supports ArrowRight and switches the phase before animation, so this is an input-caused transition. The captured initialization runtime error still rejects the card.", + "mode": "key-ArrowRight" + }, + { + "index": 1, + "label": "Squeeze trigger", + "pass": true, + "status": "live", + "reason": "stable output changed outside controls", + "mode": "primary" + }, + { + "index": 2, + "label": "Release trigger", + "pass": true, + "status": "live", + "reason": "stable output changed outside controls", + "mode": "primary" + } + ] + } + ], + "source": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline/codex/spray-bottle/result.json", + "sourceSha256": "b9e737c3b3327c2c184af190d03b0d50243b62c7dc6d8b67574d90a4446c46d8", + "replay": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-final/codex/spray-bottle/result.json", + "replaySha256": "c5aa217236d2ac6b2f603679b4ab1bb11a6e999bc7a32c5af8a055235d869858", + "scorerCommit": "f009de5838f80b90e861e5727f0ad11cba8814f8" + }, + { + "revision": "baseline", + "provider": "codex", + "promptId": "seat-belt", + "model": "gpt-6.1-sol", + "scoreMs": 93573, + "cardVisible": true, + "allControlsProven": false, + "questions": { + "structured": [], + "textQuestions": [], + "count": 0, + "needsReview": false + }, + "progressShown": true, + "renderGraceUsed": false, + "renderDelayMs": 0, + "renderGraceRetainedCard": false, + "finalReview": { + "sourceReplay": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/seat-belt/result.json", + "sourceReplaySha256": "8433ef2cd777da67e843809339aa49dcffb115cd4e76f06a0e079963b08732c9", + "manualControls": 3, + "supplementalControls": 0 + }, + "controlStatuses": [ + { + "width": 710, + "status": "runtime-error", + "runtimeErrors": [ + "exception: Error: Parameter names are letters, digits, - and _: [object Object]" + ], + "controls": [ + { + "index": 0, + "label": "Braking condition; use arrow keys", + "pass": false, + "status": "dead", + "reason": "The inspected supported-input pair retains the same reel/latch and Free to unwind output with no mode explanation. Source initialization throws on object-form params.define before render subscription and animation registration; v3 captures the same exception. The original dead-control finding remains.", + "mode": "drag" + }, + { + "index": 1, + "label": "Normal movement", + "pass": false, + "status": "dead", + "reason": "The inspected supported-input pair retains the same reel/latch and Free to unwind output with no mode explanation. Source initialization throws on object-form params.define before render subscription and animation registration; v3 captures the same exception. The original dead-control finding remains.", + "mode": "primary" + }, + { + "index": 2, + "label": "Sudden braking", + "pass": false, + "status": "dead", + "reason": "The inspected supported-input pair retains the same reel/latch and Free to unwind output with no mode explanation. Source initialization throws on object-form params.define before render subscription and animation registration; v3 captures the same exception. The original dead-control finding remains.", + "mode": "primary" + } + ] + } + ], + "source": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline/codex/seat-belt/result.json", + "sourceSha256": "cfac771328a50dd0d2ebd4bb95ff26cab5151d0222240f7ebb5ff2d818f2eeb0", + "replay": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-final/codex/seat-belt/result.json", + "replaySha256": "6b9e8b871c9beb466dbd041a3d6b82b3925ba145a5a384f0470e078fb066cc28", + "scorerCommit": "f009de5838f80b90e861e5727f0ad11cba8814f8" + }, + { + "revision": "baseline", + "provider": "codex", + "promptId": "toaster", + "model": "gpt-6.1-sol", + "scoreMs": 900000, + "cardVisible": false, + "allControlsProven": false, + "questions": { + "structured": [], + "textQuestions": [], + "count": 0, + "needsReview": false + }, + "progressShown": true, + "renderGraceUsed": true, + "renderDelayMs": null, + "renderGraceRetainedCard": false, + "finalReview": { + "sourceReplay": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/toaster/result.json", + "sourceReplaySha256": "301271d272c500928fcdff37b5a52857a24306bc5be3aa41c06b1877de44c37d", + "manualControls": 0, + "supplementalControls": 0 + }, + "controlStatuses": [], + "source": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline/codex/toaster/result.json", + "sourceSha256": "f123663b21d6a00f8c2c3234d0ed436b37c89a2509e338dc7986d70c0d0d7edf", + "replay": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-final/codex/toaster/result.json", + "replaySha256": "acae0b0212e7cdc9aec53623defacd0cdf64c20a8d0ac468330e0bf8b761f4d7", + "scorerCommit": "f009de5838f80b90e861e5727f0ad11cba8814f8" + }, + { + "revision": "baseline", + "provider": "codex", + "promptId": "umbrella", + "model": "gpt-6.1-sol", + "scoreMs": 110728, + "cardVisible": true, + "allControlsProven": false, + "questions": { + "structured": [], + "textQuestions": [], + "count": 0, + "needsReview": false + }, + "progressShown": true, + "renderGraceUsed": false, + "renderDelayMs": 0, + "renderGraceRetainedCard": false, + "finalReview": { + "sourceReplay": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/umbrella/result.json", + "sourceReplaySha256": "f5aaf770a526f7638f534ee4fe0e212eddb39e38bcb79d5c39c3e2a662f52371", + "manualControls": 2, + "supplementalControls": 0 + }, + "controlStatuses": [ + { + "width": 710, + "status": "runtime-error", + "runtimeErrors": [ + "exception: Error: Parameter names are letters, digits, - and _: [object Object]" + ], + "controls": [ + { + "index": 0, + "label": "Cutaway umbrella showing a sliding runner, hinged stretchers, ribs and fabric", + "pass": true, + "status": "live", + "reason": "The inspected Home pair draws a closed umbrella and closed-state explanation from the initially blank stage. The saved handler explicitly supports Home and changes the target opening before rendering. This proves the input route, while the initialization exception still rejects the whole card.", + "mode": "key-Home" + }, + { + "index": 1, + "label": "Open", + "pass": true, + "status": "live", + "reason": "The inspected Open click unfolds the canopy and ribs, raises the runner and changes the explanatory text to the open state. Its saved handler sets opening 100; the visible change is not merely control styling. The card initialization runtime error remains disqualifying.", + "mode": "primary" + }, + { + "index": 2, + "label": "Close", + "pass": true, + "status": "live", + "reason": "stable output changed outside controls", + "mode": "primary" + }, + { + "index": 3, + "label": "Opening position", + "pass": true, + "status": "live", + "reason": "stable output changed outside controls", + "mode": "drag" + }, + { + "index": 4, + "label": "cutaway", + "pass": true, + "status": "live", + "reason": "stable output changed outside controls", + "mode": "primary" + } + ] + } + ], + "source": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline/codex/umbrella/result.json", + "sourceSha256": "c2a76de139b31395e33d52963d1d9fb525643507d3d157bad73097f9323dc8e4", + "replay": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-final/codex/umbrella/result.json", + "replaySha256": "a6f0ce560edc56d7323c186556c08dbd93b1546d9811578ff17c935bcfbc8d52", + "scorerCommit": "f009de5838f80b90e861e5727f0ad11cba8814f8" + }, + { + "revision": "baseline", + "provider": "codex", + "promptId": "cdn", + "model": "gpt-6.1-sol", + "scoreMs": 139927, + "cardVisible": true, + "allControlsProven": false, + "questions": { + "structured": [], + "textQuestions": [], + "count": 0, + "needsReview": false + }, + "progressShown": true, + "renderGraceUsed": false, + "renderDelayMs": null, + "renderGraceRetainedCard": false, + "finalReview": { + "sourceReplay": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/cdn/result.json", + "sourceReplaySha256": "54c70dd4aac8a0f71a69f3a1f00e5928b37786cbe1760b09c93734407a9686a5", + "manualControls": 3, + "supplementalControls": 0 + }, + "controlStatuses": [ + { + "width": 710, + "status": "unproven", + "runtimeErrors": [], + "controls": [ + { + "index": 0, + "label": "Seconds since purge; use left and right arrow keys", + "pass": false, + "status": "unproven", + "reason": "Partially functional, not a clean control pass: the default passing End pair visibly advances only 0 to 1 second although its supported End handler requests 90. An additionally inspected supported ArrowRight pair does advance 1 to 2 seconds and changes cache rows to v2. The omitted numeric bounds clamp stored time to 0..1 while local redraw can temporarily advance farther; one working arrow step does not establish the full exposed time control. The separate dead native slider also blocks a card pass.", + "mode": "key-End" + }, + { + "index": 1, + "label": "time", + "pass": false, + "status": "dead", + "reason": "The inspected low/high drag pair moves the native thumb across its track while both external time readouts stay at 1 second and cache rows/mechanism remain unchanged. Saved parameter definitions omit min/max, so native time changes clamp to 0..1. The keyboard stage's local redraw cannot repair this separate control.", + "mode": "drag" + }, + { + "index": 2, + "label": "6 seconds30 seconds60 seconds", + "pass": false, + "status": "unproven", + "reason": "No proven output change outside controls", + "mode": "primary" + }, + { + "index": 3, + "label": "local", + "pass": true, + "status": "live", + "reason": "The inspected checkbox click changes the explanatory paragraph to the browser serving its fresh v1 copy and changes all three User receives cells to v1 (browser). The saved input handler updates the local boolean and redraws through the parameter subscription; this is meaningful output, not checkbox styling.", + "mode": "primary" + }, + { + "index": 4, + "label": "late", + "pass": false, + "status": "unproven", + "reason": "No proven output change outside controls", + "mode": "primary" + } + ] + } + ], + "source": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline/codex/cdn/result.json", + "sourceSha256": "e55caa15bfbdbeb60cf0a8487efaadd5ff5a9f310e4b887142ca5cf7ec40b41e", + "replay": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-final/codex/cdn/result.json", + "replaySha256": "13901138858fb72979cb92a1d95c4cf20e118b1a4dfaa013afdf4cff1d96543d", + "scorerCommit": "f009de5838f80b90e861e5727f0ad11cba8814f8" + }, + { + "revision": "baseline", + "provider": "codex", + "promptId": "notification-settings", + "model": "gpt-6.1-sol", + "scoreMs": 37348, + "cardVisible": true, + "allControlsProven": false, + "questions": { + "structured": [], + "textQuestions": [], + "count": 0, + "needsReview": false + }, + "progressShown": true, + "renderGraceUsed": false, + "renderDelayMs": 82, + "renderGraceRetainedCard": false, + "finalReview": { + "sourceReplay": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/notification-settings/result.json", + "sourceReplaySha256": "c9e1df7a66812f0637c3c549af67dca46182859f97beec8504e1cb4efcc967d5", + "manualControls": 3, + "supplementalControls": 0 + }, + "controlStatuses": [ + { + "width": 558, + "status": "unproven", + "runtimeErrors": [], + "controls": [ + { + "index": 0, + "label": "Email notifications", + "pass": true, + "status": "live", + "reason": "stable output changed outside controls", + "mode": "click" + }, + { + "index": 1, + "label": "Push notifications", + "pass": true, + "status": "live", + "reason": "stable output changed outside controls", + "mode": "click" + }, + { + "index": 2, + "label": "Daily digest", + "pass": true, + "status": "live", + "reason": "The inspected Daily digest click reveals the delivery-time selector and adds Daily digest at 8 AM UTC to the independent notification preview. This is meaningful output despite the card resizing.", + "mode": "click" + }, + { + "index": 3, + "label": "Delivery time \u00b7 UTC", + "pass": true, + "status": "live", + "reason": "Both actual images show digest enabled. The native selector changes Morning (8 AM) to Evening (6 PM), and the independent notification preview changes from 8 AM UTC to 6 PM UTC. The retained observation-only eval agrees (08 to 18); the log is console-clean. This proves the native-key route without a driver change. Reset defaults remains independently dead.", + "mode": "primary" + }, + { + "index": 4, + "label": "Reset defaults", + "pass": false, + "status": "dead", + "reason": "The inspected Reset defaults click starts from a genuinely nondefault state (email off, digest at 12 PM) and leaves all controls and the independent preview unchanged. Saved onclick uses unsupported object-form P.set, confirming the original silent no-op; a working digest or selector cannot make this card pass.", + "mode": "primary" + } + ] + } + ], + "source": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline/codex/notification-settings/result.json", + "sourceSha256": "70e2fe1d172fa4d2a3e96c4711349dd0e50e326727b3f656d11125ea1a1024eb", + "replay": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-final/codex/notification-settings/result.json", + "replaySha256": "dee7b8560935f710b23b5e389a6781e04080e915f03b552dd913a46dba0751b9", + "scorerCommit": "f009de5838f80b90e861e5727f0ad11cba8814f8" + }, + { + "revision": "baseline", + "provider": "codex", + "promptId": "narrow-toggle", + "model": "gpt-6.1-sol", + "scoreMs": 40892, + "cardVisible": true, + "allControlsProven": true, + "questions": { + "structured": [], + "textQuestions": [], + "count": 0, + "needsReview": false + }, + "progressShown": true, + "renderGraceUsed": false, + "renderDelayMs": 103, + "renderGraceRetainedCard": false, + "finalReview": { + "sourceReplay": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/narrow-toggle/result.json", + "sourceReplaySha256": "053b10f4f2f1afc6dd634c3e16760864f34331db34ced660b505fedb4311eb3d", + "manualControls": 0, + "supplementalControls": 0 + }, + "controlStatuses": [ + { + "width": 360, + "status": "live", + "runtimeErrors": [], + "controls": [ + { + "index": 0, + "label": "Dark mode", + "pass": true, + "status": "live", + "reason": "stable output changed outside controls", + "mode": "click" + } + ] + }, + { + "width": 390, + "status": "live", + "runtimeErrors": [], + "controls": [ + { + "index": 0, + "label": "Dark mode", + "pass": true, + "status": "live", + "reason": "stable output changed outside controls", + "mode": "click" + } + ] + }, + { + "width": 480, + "status": "live", + "runtimeErrors": [], + "controls": [ + { + "index": 0, + "label": "Dark mode", + "pass": true, + "status": "live", + "reason": "stable output changed outside controls", + "mode": "click" + } + ] + } + ], + "source": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline/codex/narrow-toggle/result.json", + "sourceSha256": "ca62dac136ed9caa7405c2eb71f59ec05433f13db4424a930598d125823e3acc", + "replay": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-final/codex/narrow-toggle/result.json", + "replaySha256": "fee6817a228468d90b266510fa5560e19ac84fc86ddec586138d725c8e3b332c", + "scorerCommit": "f009de5838f80b90e861e5727f0ad11cba8814f8" + }, + { + "revision": "baseline", + "provider": "codex", + "promptId": "dns", + "model": "gpt-6.1-sol", + "scoreMs": 114706, + "cardVisible": true, + "allControlsProven": false, + "questions": { + "structured": [], + "textQuestions": [], + "count": 0, + "needsReview": false + }, + "progressShown": true, + "renderGraceUsed": false, + "renderDelayMs": null, + "renderGraceRetainedCard": false, + "finalReview": { + "sourceReplay": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/dns/result.json", + "sourceReplaySha256": "e46768e0376b893a5491a38bc6f44f9325251dc0a3e0fbee42a9c0f5e735ec67", + "manualControls": 2, + "supplementalControls": 0 + }, + "controlStatuses": [ + { + "width": 710, + "status": "runtime-error", + "runtimeErrors": [ + "exception: Error: Parameter names are letters, digits, - and _: [object Object]" + ], + "controls": [ + { + "index": 0, + "label": "DNS lookup step", + "pass": true, + "status": "live", + "reason": "The inspected Home pair changes the initial incomplete stage into the device-cache step, with an explanatory paragraph and matching readout. The saved keyboard handler explicitly handles Home and calls draw; its drawer animation is output of that input. The recorded initialization exception still rejects the card.", + "mode": "key-Home" + }, + { + "index": 1, + "label": "Answer already cached?", + "pass": false, + "status": "unproven", + "reason": "No proven output change outside controls", + "mode": "primary" + }, + { + "index": 2, + "label": "Back", + "pass": true, + "status": "live", + "reason": "The inspected Back click changes Your browser connects to Use the resolver's cached answer, updates the paragraph and query/drawer positions, and re-enables Next. The source go(-1) handler changes the step synchronously; this is a valid enabled-state Back transition. Initialization still throws, so this does not pass the card.", + "mode": "primary" + }, + { + "index": 3, + "label": "Next step \u2192", + "pass": true, + "status": "live", + "reason": "stable output changed outside controls", + "mode": "primary" + } + ] + } + ], + "source": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline/codex/dns/result.json", + "sourceSha256": "aa8e6e46975c3c78f265572fa041aae08cc889df943ff35cac11a0a8fa089ce4", + "replay": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-final/codex/dns/result.json", + "replaySha256": "cd8005498bc59f14b7f7b71c87098addc23967f841085a157c5f231992b2f786", + "scorerCommit": "f009de5838f80b90e861e5727f0ad11cba8814f8" + }, + { + "revision": "baseline", + "provider": "codex", + "promptId": "database-index", + "model": "gpt-6.1-sol", + "scoreMs": 109774, + "cardVisible": true, + "allControlsProven": false, + "questions": { + "structured": [], + "textQuestions": [], + "count": 0, + "needsReview": false + }, + "progressShown": true, + "renderGraceUsed": false, + "renderDelayMs": null, + "renderGraceRetainedCard": false, + "finalReview": { + "sourceReplay": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/database-index/result.json", + "sourceReplaySha256": "8e69cb83806db4ef0f2a74f0978bca80b60b7f99e2786a2ddf23637897c3cbdf", + "manualControls": 3, + "supplementalControls": 0 + }, + "controlStatuses": [ + { + "width": 710, + "status": "runtime-error", + "runtimeErrors": [ + "exception: Error: Parameter names are letters, digits, - and _: [object Object]" + ], + "controls": [ + { + "index": 0, + "label": "Lookup comparison; arrow keys step through", + "pass": false, + "status": "dead", + "reason": "The inspected ArrowRight pair leaves the lookup diagram and blank explanation unchanged. Source object-form params.define throws before render subscription and keyboard registration; v3 records the same initialization exception. Native control chrome is not working lookup output.", + "mode": "drag" + }, + { + "index": 1, + "label": "Find key", + "pass": false, + "status": "dead", + "reason": "The inspected low/high drag pair moves the native thumb and its own numeric value, but leaves the lookup diagram and blank explanation unchanged. Source object-form params.define throws before render subscription and keyboard registration; v3 records the same initialization exception. Native control chrome is not working lookup output.", + "mode": "drag" + }, + { + "index": 2, + "label": "Lookup step", + "pass": false, + "status": "dead", + "reason": "The inspected low/high drag pair moves the native thumb and its own numeric value, but leaves the lookup diagram and blank explanation unchanged. Source object-form params.define throws before render subscription and keyboard registration; v3 records the same initialization exception. Native control chrome is not working lookup output.", + "mode": "drag" + } + ] + } + ], + "source": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline/codex/database-index/result.json", + "sourceSha256": "d4b8384057886fead9450fe7b95e8fe0d96978c2df288b64392d11349a0ef872", + "replay": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-final/codex/database-index/result.json", + "replaySha256": "ff9ff53e2af1c99fea3a8b098d6e6d9c912d5660ae35cd9b187de01587effcfb", + "scorerCommit": "f009de5838f80b90e861e5727f0ad11cba8814f8" + }, + { + "revision": "baseline", + "provider": "codex", + "promptId": "git-merge", + "model": "gpt-6.1-sol", + "scoreMs": 76338, + "cardVisible": true, + "allControlsProven": false, + "questions": { + "structured": [], + "textQuestions": [], + "count": 0, + "needsReview": false + }, + "progressShown": true, + "renderGraceUsed": false, + "renderDelayMs": null, + "renderGraceRetainedCard": false, + "finalReview": { + "sourceReplay": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/git-merge/result.json", + "sourceReplaySha256": "2356bce996be14eabc9cb4bb2d6768f829c1837596c41e9be98d49a316c64bbc", + "manualControls": 5, + "supplementalControls": 0 + }, + "controlStatuses": [ + { + "width": 710, + "status": "unproven", + "runtimeErrors": [], + "controls": [ + { + "index": 0, + "label": "Document comparison machine. Use left and right arrow keys to switch scenarios.", + "pass": false, + "status": "dead", + "reason": "The inspected ArrowRight pair leaves the clean scenario, diagram text, branch history and explanation unchanged. The saved handler calls unsupported object-form params.set, confirming the original silent no-op. Working scenario buttons do not repair the exposed keyboard surface.", + "mode": "drag" + }, + { + "index": 1, + "label": "Clean merge", + "pass": true, + "status": "live", + "reason": "The inspected Clean merge click replaces the conflict explanation and paused history with the clean merge explanation and a new merge commit M. Changed text and history are independent of selected-button styling.", + "mode": "primary" + }, + { + "index": 2, + "label": "Conflict", + "pass": true, + "status": "live", + "reason": "The inspected Conflict click changes the diagram's compared/result text and replaces the external paragraph/history with conflicting title edits and a paused merge, matching the scenario subscription.", + "mode": "primary" + }, + { + "index": 3, + "label": "Fast-forward", + "pass": true, + "status": "live", + "reason": "The inspected Fast-forward click changes the external explanation and branch history to moving main to C without a merge commit. The visible scenario output proves this button, while the keyboard control remains dead.", + "mode": "primary" + }, + { + "index": 4, + "label": "What is being compared?", + "pass": true, + "status": "live", + "reason": "The actual before image has the disclosure closed; the after image visibly reveals the full explanatory paragraph about three-way merges, additions/deletions/renames and ancestry. This is revealed content, not merely a chevron or layout change. The observation-only eval confirms open=true and the same paragraph, and the log is console-clean. This proves expansion; collapse was not exercised. The independent keyboard surface remains dead.", + "mode": "drag" + } + ] + } + ], + "source": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline/codex/git-merge/result.json", + "sourceSha256": "50ca1133e149c82903f5cba7b0d183d639ca182c431709255b94d597d140d61f", + "replay": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-final/codex/git-merge/result.json", + "replaySha256": "b561845b1bd98995fe9eaaca722a607f1de1f208b4bb7b2577593cbfa9b5b14e", + "scorerCommit": "f009de5838f80b90e861e5727f0ad11cba8814f8" + }, + { + "revision": "baseline", + "provider": "codex", + "promptId": "websocket", + "model": "gpt-6.1-sol", + "scoreMs": 125099, + "cardVisible": true, + "allControlsProven": true, + "questions": { + "structured": [], + "textQuestions": [], + "count": 0, + "needsReview": false + }, + "progressShown": true, + "renderGraceUsed": false, + "renderDelayMs": null, + "renderGraceRetainedCard": false, + "finalReview": { + "sourceReplay": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/websocket/result.json", + "sourceReplaySha256": "d7c779c3095c1a7de8e0ce132b29541514d8b5b86a376a2c56beabb94773ffbf", + "manualControls": 6, + "supplementalControls": 0 + }, + "controlStatuses": [ + { + "width": 710, + "status": "live", + "runtimeErrors": [], + "controls": [ + { + "index": 0, + "label": "Chat message delivery steps", + "pass": true, + "status": "live", + "reason": "The inspected End key changes Connections open to Chat view updated, adds sender/server/recipient content and changes the paragraph to recipient push delivery. The saved keyboard handler explicitly supports End and sets step 3; no autonomous animation is used.", + "mode": "key-End" + }, + { + "index": 1, + "label": "Connect", + "pass": true, + "status": "live", + "reason": "The inspected Connect click changes Message sent to Connections open, removes the message from the mechanism and replaces the external explanation with establishing connections.", + "mode": "primary" + }, + { + "index": 2, + "label": "Send", + "pass": true, + "status": "live", + "reason": "The inspected Send click adds a sender message/envelope and changes the independent readout and explanation from Connections open to Message sent.", + "mode": "primary" + }, + { + "index": 3, + "label": "Server", + "pass": true, + "status": "live", + "reason": "The inspected Server click adds message history and server output to the diagram and changes the external readout and paragraph to server validation/storage.", + "mode": "primary" + }, + { + "index": 4, + "label": "Receive", + "pass": true, + "status": "live", + "reason": "stable output changed outside controls", + "mode": "primary" + }, + { + "index": 5, + "label": "Connected", + "pass": true, + "status": "live", + "reason": "From Disconnected at Receive, the inspected Connected click restores recipient message output, closes the latch and changes the readout/paragraph to successful catch-up. This is visible application behavior, not selection styling.", + "mode": "primary" + }, + { + "index": 6, + "label": "Disconnected", + "pass": true, + "status": "live", + "reason": "The inspected Disconnected click removes the recipient's received-message output, opens the latch and changes the readout/explanation to undelivered push and stored history. The saved subscription updates this state synchronously.", + "mode": "primary" + } + ] + } + ], + "source": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline/codex/websocket/result.json", + "sourceSha256": "3e6d515a4d7a46f38d306df73458a6276736b5dc831c59a53d7d5c899eb30727", + "replay": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-final/codex/websocket/result.json", + "replaySha256": "f441547ebcf769896179da036f71f495f0f188ad9160dfa50b1b3fc5108ef570", + "scorerCommit": "f009de5838f80b90e861e5727f0ad11cba8814f8" + }, + { + "revision": "baseline", + "provider": "codex", + "promptId": "load-balancer", + "model": "gpt-6.1-sol", + "scoreMs": 157578, + "cardVisible": true, + "allControlsProven": false, + "questions": { + "structured": [], + "textQuestions": [], + "count": 0, + "needsReview": false + }, + "progressShown": true, + "renderGraceUsed": false, + "renderDelayMs": null, + "renderGraceRetainedCard": false, + "finalReview": { + "sourceReplay": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-v3/codex/load-balancer/result.json", + "sourceReplaySha256": "35a0fa18f0455115d7ef7b193c71c0cda48d5058947a030ecbc689fc6194eb9b", + "manualControls": 1, + "supplementalControls": 0 + }, + "controlStatuses": [ + { + "width": 710, + "status": "unproven", + "runtimeErrors": [], + "controls": [ + { + "index": 0, + "label": "Load balancer: right arrow sends a request; left arrow steps back", + "pass": false, + "status": "dead", + "reason": "The inspected ArrowRight pair leaves request count 6, per-server active/assigned totals, carriage and latest-server readout unchanged. The saved keyboard handler calls unsupported object-form params.set, retaining the original silent no-op. Working dropdowns and increment buttons do not repair the separate exposed keyboard surface.", + "mode": "drag" + }, + { + "index": 1, + "label": "Routing rule", + "pass": true, + "status": "live", + "reason": "stable output changed outside controls", + "mode": "primary" + }, + { + "index": 2, + "label": "Server B", + "pass": true, + "status": "live", + "reason": "stable output changed outside controls", + "mode": "primary" + }, + { + "index": 3, + "label": "Decrease", + "pass": true, + "status": "live", + "reason": "stable output changed outside controls", + "mode": "primary" + }, + { + "index": 4, + "label": "Increase", + "pass": true, + "status": "live", + "reason": "stable output changed outside controls", + "mode": "primary" + } + ] + } + ], + "source": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline/codex/load-balancer/result.json", + "sourceSha256": "f2b885c39183b2b6d3ff62833371de68609426833b8b6187ebadffe46d715333", + "replay": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/baseline-reviewed-final/codex/load-balancer/result.json", + "replaySha256": "e5e74ea3e5528f335835df0c5279d12db7fa7830fc50682af799c118fe762314", + "scorerCommit": "f009de5838f80b90e861e5727f0ad11cba8814f8" + }, + { + "revision": "prototype", + "provider": "claude-code", + "promptId": "washing-machine", + "model": "claude-opus-5-5", + "scoreMs": 218992, + "cardVisible": true, + "allControlsProven": true, + "questions": { + "structured": [], + "textQuestions": [], + "count": 0, + "needsReview": false + }, + "progressShown": true, + "renderGraceUsed": false, + "renderDelayMs": null, + "renderGraceRetainedCard": false, + "finalReview": { + "sourceReplay": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/claude-code/washing-machine/result.json", + "sourceReplaySha256": "2e3582435bcd1633b01cb22b933f8d886d2052e261307a106b069b2041c79ecc", + "manualControls": 6, + "supplementalControls": 0 + }, + "controlStatuses": [ + { + "width": 710, + "status": "live", + "runtimeErrors": [], + "controls": [ + { + "index": 0, + "label": "Washing machine drum speed: arrow keys change rpm", + "pass": true, + "status": "live", + "reason": "Supported Home key changes speed 50\u21920, device display/readout and drum behavior; the visible response is more than focus styling.", + "mode": "key-Home" + }, + { + "index": 1, + "label": "rpm", + "pass": true, + "status": "live", + "reason": "Range drag changes 265\u21921205 rpm and independent device display, knob and calculated acceleration 20g\u2192406g.", + "mode": "drag" + }, + { + "index": 2, + "label": "water", + "pass": true, + "status": "live", + "reason": "Water range drag changes the independently drawn water annulus from a thin 11% ring to a thick 52% ring. Source waterPath uses fill to calculate inner radius; unchanged speed/readout does not invalidate visible mechanism geometry.", + "mode": "drag" + }, + { + "index": 3, + "label": "Wash \u00b7 50 rpm", + "pass": true, + "status": "live", + "reason": "Wash button changes 60\u219250 rpm, pinned annulus to a water pool and readout from pinned to lifting/falling clothes.", + "mode": "primary" + }, + { + "index": 4, + "label": "Tipping point \u00b7 60 rpm", + "pass": true, + "status": "live", + "reason": "Tipping point changes 50\u219260 rpm and water/clothing regime from tumbling pool to annulus, with external acceleration/state readout.", + "mode": "primary" + }, + { + "index": 5, + "label": "Drain", + "pass": true, + "status": "live", + "reason": "Drain removes the blue water and stops the drum; independent device display/readout confirm 0 rpm.", + "mode": "primary" + }, + { + "index": 6, + "label": "Spin \u00b7 1200 rpm", + "pass": true, + "status": "live", + "reason": "stable output changed outside controls", + "mode": "primary" + } + ] + } + ], + "source": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype/claude-code/washing-machine/result.json", + "sourceSha256": "be2f8d463136b284dc1b748981c39bf93c73eb4aaaf3a2ccb8fa47aaf7cf6c80", + "replay": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-final/claude-code/washing-machine/result.json", + "replaySha256": "b30e3ef0169222c9d2e8bb7eb9cb4de05df4feefc3514d350a38201af5d8454e", + "scorerCommit": "f009de5838f80b90e861e5727f0ad11cba8814f8" + }, + { + "revision": "prototype", + "provider": "claude-code", + "promptId": "bicycle-pump", + "model": "claude-opus-5-5", + "scoreMs": 237968, + "cardVisible": true, + "allControlsProven": true, + "questions": { + "structured": [], + "textQuestions": [], + "count": 0, + "needsReview": false + }, + "progressShown": true, + "renderGraceUsed": false, + "renderDelayMs": null, + "renderGraceRetainedCard": false, + "finalReview": { + "sourceReplay": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/claude-code/bicycle-pump/result.json", + "sourceReplaySha256": "4bf5d103485aad335f57a724ba6a2d07d75d0bae62a65128c7621c929f8010b1", + "manualControls": 4, + "supplementalControls": 0 + }, + "controlStatuses": [ + { + "width": 710, + "status": "live", + "runtimeErrors": [], + "controls": [ + { + "index": 0, + "label": "Pump handle: drag down or use arrow keys; space pumps one stroke", + "pass": true, + "status": "live", + "reason": "The inspected supported pointer input lowers the piston and changes external barrel pressure 0\u219235 psi, tire 32.8\u219235.0 psi and needle/valve geometry. Source pointer handler steers the simulation.", + "mode": "click" + }, + { + "index": 1, + "label": "Pump 5 strokes", + "pass": true, + "status": "live", + "reason": "After starting flat and clicking Pump 5 strokes, the full 9.5-second cycle leaves the handle raised and tire pressure 0\u219214.7 psi, with valve-opening threshold 0\u219253%. The earlier short static windows missed the completed pumping effect.", + "mode": "primary" + }, + { + "index": 2, + "label": "Start flat (0 psi)", + "pass": true, + "status": "live", + "reason": "Start flat resets the external tire pressure 5.9\u21920.0 psi, valve-opening threshold 31%\u21920%, and raises the piston. This matches the saved reset(0) handler, beyond button styling.", + "mode": "primary" + }, + { + "index": 3, + "label": "Start hard (90 psi)", + "pass": true, + "status": "live", + "reason": "Start hard resets external tire pressure 3.1\u219290.0 psi and valve-opening threshold 19%\u219291%, matching reset(90).", + "mode": "primary" + } + ] + } + ], + "source": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype/claude-code/bicycle-pump/result.json", + "sourceSha256": "bf1e0f41c72510e459940b15e0c828c415fc91ad711e27440e56d73288e08f0b", + "replay": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-final/claude-code/bicycle-pump/result.json", + "replaySha256": "a7b418b6ee8cd19fe36c074d42fe1bfa2321853dd55f11322fdec916bbcb1f66", + "scorerCommit": "f009de5838f80b90e861e5727f0ad11cba8814f8" + }, + { + "revision": "prototype", + "provider": "claude-code", + "promptId": "zipper", + "model": "claude-opus-5-5", + "scoreMs": 234135, + "cardVisible": true, + "allControlsProven": true, + "questions": { + "structured": [], + "textQuestions": [], + "count": 0, + "needsReview": false + }, + "progressShown": true, + "renderGraceUsed": false, + "renderDelayMs": null, + "renderGraceRetainedCard": false, + "finalReview": { + "sourceReplay": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/claude-code/zipper/result.json", + "sourceReplaySha256": "c899b61e8780943bea60c1fb75e0fbe3b81d6eb363b8c550822fdcdc5d72a170", + "manualControls": 0, + "supplementalControls": 0 + }, + "controlStatuses": [ + { + "width": 710, + "status": "live", + "runtimeErrors": [], + "controls": [ + { + "index": 0, + "label": "Zipper slider: arrow keys move it one tooth", + "pass": true, + "status": "live", + "reason": "stable output changed outside controls", + "mode": "drag" + }, + { + "index": 1, + "label": "Slider position, percent of the way closed", + "pass": true, + "status": "live", + "reason": "stable output changed outside controls", + "mode": "drag" + }, + { + "index": 2, + "label": "Sideways pull on the tapes", + "pass": true, + "status": "live", + "reason": "stable output changed outside controls", + "mode": "drag" + }, + { + "index": 3, + "label": "control 3", + "pass": true, + "status": "live", + "reason": "stable output changed outside controls", + "mode": "primary" + } + ] + } + ], + "source": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype/claude-code/zipper/result.json", + "sourceSha256": "33923301876a95c8cac72f89983f65d9a0307b745878c20a15d5fd0fd890ae75", + "replay": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-final/claude-code/zipper/result.json", + "replaySha256": "157ec3fc640557b9ae21fad0725c60c7763fd58b15449f4ad629fec992fc3e18", + "scorerCommit": "f009de5838f80b90e861e5727f0ad11cba8814f8" + }, + { + "revision": "prototype", + "provider": "claude-code", + "promptId": "toilet", + "model": "claude-opus-5-5", + "scoreMs": 331297, + "cardVisible": true, + "allControlsProven": true, + "questions": { + "structured": [], + "textQuestions": [], + "count": 0, + "needsReview": false + }, + "progressShown": true, + "renderGraceUsed": false, + "renderDelayMs": null, + "renderGraceRetainedCard": false, + "finalReview": { + "sourceReplay": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/claude-code/toilet/result.json", + "sourceReplaySha256": "3b1159c2ec8ea40711fce3f7597634f3518d65344f343df491b66973a37e17d4", + "manualControls": 6, + "supplementalControls": 0 + }, + "controlStatuses": [ + { + "width": 710, + "status": "live", + "runtimeErrors": [], + "controls": [ + { + "index": 0, + "label": "Toilet cutaway. Press Enter to flush.", + "pass": true, + "status": "live", + "reason": "The supported stage pointer input visibly advances the gravity-tank mechanism from filling to a new flush, with changed water/flapper state. Its saved onclick calls flush; the separately inspected fresh Flush control confirms that same model path.", + "mode": "click" + }, + { + "index": 1, + "label": "Flush", + "pass": true, + "status": "live", + "reason": "Fresh settled tank plus actual Flush click opens the flapper, lowers the tank and visibly sends water through the rim/trapway; readout switches Ready\u2192Siphon pulling the bowl empty.", + "mode": "primary" + }, + { + "index": 2, + "label": "control 2", + "pass": true, + "status": "live", + "reason": "Fresh low/high pressure trials use the same tank and equal refill observation windows after a real flush. 20 psi yields about 1.3 L ready at t+16\u201317s; 80 psi yields 2.5 L, with visibly higher tank water and inlet flow. This proves pressure while refill is active.", + "mode": "drag" + }, + { + "index": 3, + "label": "control 3", + "pass": true, + "status": "live", + "reason": "Real float slider low\u2192high moves the shutoff float above the overflow, visibly raises tank water, starts overflow and changes Ready 5.3L to never shuts off 6.1L.", + "mode": "drag" + }, + { + "index": 4, + "label": "Sealed", + "pass": true, + "status": "live", + "reason": "After the demonstrated leak, selecting Sealed restores Ready 5.3L and stops visible refill/overflow flow after settling. The real input and before/after model state are retained.", + "mode": "primary" + }, + { + "index": 5, + "label": "Leaky", + "pass": true, + "status": "live", + "reason": "From a full sealed tank, actual Leaky selection produces a small water loss and continued refill flow; screenshot and independent readout change Ready 5.3L\u2192Fill valve refilling 5.2L, matching the leak model.", + "mode": "primary" + } + ] + } + ], + "source": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype/claude-code/toilet/result.json", + "sourceSha256": "040aa963cd76995a2f192704b8bdfc65da6cc4e8b1037839435eaef2342a5744", + "replay": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-final/claude-code/toilet/result.json", + "replaySha256": "3b532b684450a9f59cba9cd87b5a54bfe8d6b59dcf7e4e6f7edc42d0d6394b90", + "scorerCommit": "f009de5838f80b90e861e5727f0ad11cba8814f8" + }, + { + "revision": "prototype", + "provider": "claude-code", + "promptId": "thermos", + "model": "claude-opus-5-5", + "scoreMs": 118720, + "cardVisible": true, + "allControlsProven": true, + "questions": { + "structured": [], + "textQuestions": [], + "count": 0, + "needsReview": false + }, + "progressShown": true, + "renderGraceUsed": false, + "renderDelayMs": null, + "renderGraceRetainedCard": false, + "finalReview": { + "sourceReplay": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/claude-code/thermos/result.json", + "sourceReplaySha256": "52983b0d8eded3271ce0f2b2ef336dc96d196b9b4d435b349bf150b1d3cef62a", + "manualControls": 3, + "supplementalControls": 0 + }, + "controlStatuses": [ + { + "width": 710, + "status": "live", + "runtimeErrors": [], + "controls": [ + { + "index": 0, + "label": "Vacuum between the walls", + "pass": true, + "status": "live", + "reason": "Vacuum toggle removes the conduction arrows, changes air gap to vacuum gap and independently changes temperature/heat-loss readouts (20.0\u219222.5 C).", + "mode": "drag" + }, + { + "index": 1, + "label": "Silvered (reflective) walls", + "pass": true, + "status": "live", + "reason": "stable output changed outside controls", + "mode": "drag" + }, + { + "index": 2, + "label": "Stopper in", + "pass": true, + "status": "live", + "reason": "Stopper toggle visibly inserts the stopper, changes the heat-loss route and changes the independent biggest-leak readout from open top to air in the gap.", + "mode": "click" + }, + { + "index": 3, + "label": "Time since filling", + "pass": true, + "status": "live", + "reason": "stable output changed outside controls", + "mode": "drag" + }, + { + "index": 4, + "label": "How the model works", + "pass": true, + "status": "live", + "reason": "Actual fresh-page disclosure click changes closed\u2192open and visibly reveals the model assumptions paragraph. The earlier replay had already opened it, so its final unchanged pair was insufficient.", + "mode": "drag" + } + ] + } + ], + "source": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype/claude-code/thermos/result.json", + "sourceSha256": "f22fda3816d0192085ed9379e8e0f3be62cb73c13ea4dbaa79e59b44480440a0", + "replay": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-final/claude-code/thermos/result.json", + "replaySha256": "5baf44b5a5d4b7000bb00842e57c1bc0526656db21e9e78cfc981bea3d4f3f84", + "scorerCommit": "f009de5838f80b90e861e5727f0ad11cba8814f8" + }, + { + "revision": "prototype", + "provider": "claude-code", + "promptId": "door-lock", + "model": "claude-opus-5-5", + "scoreMs": 255018, + "cardVisible": true, + "allControlsProven": true, + "questions": { + "structured": [], + "textQuestions": [], + "count": 0, + "needsReview": false + }, + "progressShown": true, + "renderGraceUsed": false, + "renderDelayMs": null, + "renderGraceRetainedCard": false, + "finalReview": { + "sourceReplay": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/claude-code/door-lock/result.json", + "sourceReplaySha256": "9dfa02ab67a20e6b89d73fde2a43afb7f3d4a273262d21a2883256d45ad8af42", + "manualControls": 2, + "supplementalControls": 0 + }, + "controlStatuses": [ + { + "width": 710, + "status": "live", + "runtimeErrors": [], + "controls": [ + { + "index": 0, + "label": "Pin tumbler lock: left and right arrows slide the key, Enter turns it", + "pass": true, + "status": "live", + "reason": "Supported Home key withdraws the key, visibly drops the pins and changes all-five-gaps aligned to five pins blocking the shear line. Focus outline alone is not the proof.", + "mode": "key-Home" + }, + { + "index": 1, + "label": "Key cut 1 depth", + "pass": true, + "status": "live", + "reason": "stable output changed outside controls", + "mode": "drag" + }, + { + "index": 2, + "label": "Key cut 2 depth", + "pass": true, + "status": "live", + "reason": "stable output changed outside controls", + "mode": "drag" + }, + { + "index": 3, + "label": "Key cut 3 depth", + "pass": true, + "status": "live", + "reason": "stable output changed outside controls", + "mode": "drag" + }, + { + "index": 4, + "label": "Key cut 4 depth", + "pass": true, + "status": "live", + "reason": "stable output changed outside controls", + "mode": "drag" + }, + { + "index": 5, + "label": "Key cut 5 depth", + "pass": true, + "status": "live", + "reason": "stable output changed outside controls", + "mode": "drag" + }, + { + "index": 6, + "label": "How far the key is inserted", + "pass": true, + "status": "live", + "reason": "stable output changed outside controls", + "mode": "drag" + }, + { + "index": 7, + "label": "Right key", + "pass": true, + "status": "live", + "reason": "stable output changed outside controls", + "mode": "primary" + }, + { + "index": 8, + "label": "Random key", + "pass": true, + "status": "live", + "reason": "stable output changed outside controls", + "mode": "primary" + }, + { + "index": 9, + "label": "Turn key", + "pass": true, + "status": "live", + "reason": "With the right key fully inserted, actual Turn key click rotates the end-view cylinder and retracts the bolt; external readout changes free to turn\u2192plug turned / bolt retracted. The earlier 86%-inserted state was intentionally blocked.", + "mode": "primary" + } + ] + } + ], + "source": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype/claude-code/door-lock/result.json", + "sourceSha256": "76b572e32ec48e74a6bc176999d70295bb729459633d7bd591ec935db6fbcb79", + "replay": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-final/claude-code/door-lock/result.json", + "replaySha256": "7399acf936c3162feb56c67a929742f7a924a330045ba29563f6e91c891eb1ef", + "scorerCommit": "f009de5838f80b90e861e5727f0ad11cba8814f8" + }, + { + "revision": "prototype", + "provider": "claude-code", + "promptId": "refrigerator", + "model": "claude-opus-5-5", + "scoreMs": 369464, + "cardVisible": true, + "allControlsProven": true, + "questions": { + "structured": [], + "textQuestions": [], + "count": 0, + "needsReview": false + }, + "progressShown": true, + "renderGraceUsed": false, + "renderDelayMs": null, + "renderGraceRetainedCard": false, + "finalReview": { + "sourceReplay": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/claude-code/refrigerator/result.json", + "sourceReplaySha256": "83243205ff69639e906bf8017d6142518d8043ad1ea8f7aa3d117cc3f45d367a", + "manualControls": 3, + "supplementalControls": 0 + }, + "controlStatuses": [ + { + "width": 710, + "status": "live", + "runtimeErrors": [], + "controls": [ + { + "index": 0, + "label": "room", + "pass": true, + "status": "live", + "reason": "Room range drag changes independent condenser temperature/pressure (about 26 C / 3.6 bar\u219247 C / 6.5 bar) and calculated compressor duty (16%\u219250%). Source binds room directly to these outputs; this is not autonomous temperature drift.", + "mode": "drag" + }, + { + "index": 1, + "label": "set", + "pass": true, + "status": "live", + "reason": "Thermostat drag changes independent target-dependent evaporator temperature, duty (53%\u219244%) and steady interior temperature 2.5\u21927.3 C. No runtime error occurs in the prototype.", + "mode": "drag" + }, + { + "index": 2, + "label": "door", + "pass": true, + "status": "live", + "reason": "Door checkbox visibly opens the drawn door and changes predicted duty to 100% cannot keep up, with interior 8.1\u219230.8 C. Source raises heat-leak coefficient for open door; the effect is independent of native checkbox styling.", + "mode": "primary" + } + ] + } + ], + "source": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype/claude-code/refrigerator/result.json", + "sourceSha256": "d1ea2f4c8d61271f82327d2bea1d8fc0967729ed9148cc432bde263aa08abdc3", + "replay": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-final/claude-code/refrigerator/result.json", + "replaySha256": "ca160f6c1cff139f04e6e027c3e1f265ea95f99dbdeed07497b58366ca4cf480", + "scorerCommit": "f009de5838f80b90e861e5727f0ad11cba8814f8" + }, + { + "revision": "prototype", + "provider": "claude-code", + "promptId": "stapler", + "model": "claude-opus-5-5", + "scoreMs": 380894, + "cardVisible": true, + "allControlsProven": true, + "questions": { + "structured": [], + "textQuestions": [], + "count": 0, + "needsReview": false + }, + "progressShown": true, + "renderGraceUsed": false, + "renderDelayMs": null, + "renderGraceRetainedCard": false, + "finalReview": { + "sourceReplay": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/claude-code/stapler/result.json", + "sourceReplaySha256": "45d9193eb4e08831d9778979e4ffe0bc2201e1b1df695b7f30659e0c23b64b8f", + "manualControls": 1, + "supplementalControls": 0 + }, + "controlStatuses": [ + { + "width": 710, + "status": "live", + "runtimeErrors": [], + "controls": [ + { + "index": 0, + "label": "Stapler: arrow keys press and release the arm", + "pass": true, + "status": "live", + "reason": "Supported End key fully depresses the arm, changes the paper/staple mechanism and advances the external readout to folded staple legs. Reduced motion disables the idle tour, so this is a direct key-caused transition.", + "mode": "key-End" + }, + { + "index": 1, + "label": "press", + "pass": true, + "status": "live", + "reason": "stable output changed outside controls", + "mode": "drag" + }, + { + "index": 2, + "label": "sheets", + "pass": true, + "status": "live", + "reason": "stable output changed outside controls", + "mode": "drag" + } + ] + } + ], + "source": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype/claude-code/stapler/result.json", + "sourceSha256": "b80750b848ef2e8f5f9ec7f9391890fca6690e2ff1e21ec272f79523e027177f", + "replay": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-final/claude-code/stapler/result.json", + "replaySha256": "ee6e5eadeda5cc92dc60646c23c0c2c8e88325a63cb68f261fa512b0f1f471d8", + "scorerCommit": "f009de5838f80b90e861e5727f0ad11cba8814f8" + }, + { + "revision": "prototype", + "provider": "claude-code", + "promptId": "spray-bottle", + "model": "claude-opus-5-5", + "scoreMs": 244026, + "cardVisible": true, + "allControlsProven": true, + "questions": { + "structured": [], + "textQuestions": [], + "count": 0, + "needsReview": false + }, + "progressShown": true, + "renderGraceUsed": false, + "renderDelayMs": null, + "renderGraceRetainedCard": false, + "finalReview": { + "sourceReplay": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/claude-code/spray-bottle/result.json", + "sourceReplaySha256": "28ba789bc8819e5513e5c01700e81accc9bda869360362ec66a264c789345cdc", + "manualControls": 4, + "supplementalControls": 0 + }, + "controlStatuses": [ + { + "width": 710, + "status": "live", + "runtimeErrors": [], + "controls": [ + { + "index": 0, + "label": "Trigger sprayer: arrow keys squeeze and release the trigger, space toggles auto pump", + "pass": true, + "status": "live", + "reason": "Supported End key moves the piston from rest to full squeeze, compresses the spring and moves the trigger; readout changes from Rest/cylinder full to Held/both valves shut. The source End handler sets trigger=100 and disables auto pump, so the geometry is input-caused rather than ambient settling.", + "mode": "key-End" + }, + { + "index": 1, + "label": "Trigger squeeze, percent", + "pass": true, + "status": "live", + "reason": "stable output changed outside controls", + "mode": "drag" + }, + { + "index": 2, + "label": "Auto pump", + "pass": true, + "status": "live", + "reason": "stable output changed outside controls", + "mode": "primary" + }, + { + "index": 3, + "label": "Spray", + "pass": true, + "status": "live", + "reason": "The before frame shows a narrow stream with Stream selected; the additionally inspected after1 frame shows a broad spray cone with Spray selected. Source nozzle-mode handler changes spread from 0.02 to 0.36; auto pumping supplies the squeeze, and the mode-specific pattern proves this control despite moving pixels failing the static threshold.", + "mode": "primary" + }, + { + "index": 4, + "label": "Stream", + "pass": true, + "status": "live", + "reason": "Before shows the broad spray droplets and Spray selected; after0 shows a narrow contiguous stream with Stream selected. The source stream branch changes particle spread/radius/speed, matching the visible pattern. Later after1 is the refill phase, explaining why persistent-pixel scoring remains unproven.", + "mode": "primary" + }, + { + "index": 5, + "label": "Off", + "pass": true, + "status": "live", + "reason": "Off stops ejection and restores the trigger while both after frames display Nozzle shut / water cannot compress / trigger is stuck. This is the source nozzle-off hydraulic lock branch, not merely selected-button styling; automatic pump remains enabled.", + "mode": "primary" + } + ] + } + ], + "source": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype/claude-code/spray-bottle/result.json", + "sourceSha256": "d172558bbf06255037c4f85e5afff56b6bcc3bcd7f7d4b5de2d7a836895b5e80", + "replay": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-final/claude-code/spray-bottle/result.json", + "replaySha256": "c7df80342f6be9a950e37ac071aeb29c8b779628fb0c78b97797c22e2801bb01", + "scorerCommit": "f009de5838f80b90e861e5727f0ad11cba8814f8" + }, + { + "revision": "prototype", + "provider": "claude-code", + "promptId": "seat-belt", + "model": "claude-opus-5-5", + "scoreMs": 316735, + "cardVisible": true, + "allControlsProven": true, + "questions": { + "structured": [], + "textQuestions": [], + "count": 0, + "needsReview": false + }, + "progressShown": true, + "renderGraceUsed": false, + "renderDelayMs": null, + "renderGraceRetainedCard": false, + "finalReview": { + "sourceReplay": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/claude-code/seat-belt/result.json", + "sourceReplaySha256": "c7930d7ce27161e2f6db9c33fae187bc1a6096de83a94177fa1eb912bf226203", + "manualControls": 1, + "supplementalControls": 0 + }, + "controlStatuses": [ + { + "width": 710, + "status": "live", + "runtimeErrors": [], + "controls": [ + { + "index": 0, + "label": "Seat belt retractor: arrow keys change braking in g, M switches between car braking and belt yank", + "pass": true, + "status": "live", + "reason": "Supported Home key changes braking from 0.80 g (locked by pendulum after 22 mm) to 0.00 g (free, 0 mm out), with the pendulum and pawl visibly returning. Source Home sets zero and reduced-motion settles the model deterministically, so the change is not autonomous timing or focus outline.", + "mode": "key-Home" + }, + { + "index": 1, + "label": "Braking / pull", + "pass": true, + "status": "live", + "reason": "stable output changed outside controls", + "mode": "drag" + }, + { + "index": 2, + "label": "Car brakes", + "pass": true, + "status": "live", + "reason": "stable output changed outside controls", + "mode": "primary" + }, + { + "index": 3, + "label": "Belt yanked", + "pass": true, + "status": "live", + "reason": "stable output changed outside controls", + "mode": "primary" + } + ] + } + ], + "source": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype/claude-code/seat-belt/result.json", + "sourceSha256": "966cf98dc575658b6d892d8f977964d98ff71293e670d0996d68be4a9d09db00", + "replay": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-final/claude-code/seat-belt/result.json", + "replaySha256": "a36766a40d45a53f34bc42c464bf1aabb092ae81b8b657ec4fdcf2f6ed03e0cf", + "scorerCommit": "f009de5838f80b90e861e5727f0ad11cba8814f8" + }, + { + "revision": "prototype", + "provider": "claude-code", + "promptId": "toaster", + "model": "claude-opus-5-5", + "scoreMs": 224133, + "cardVisible": true, + "allControlsProven": true, + "questions": { + "structured": [], + "textQuestions": [], + "count": 0, + "needsReview": false + }, + "progressShown": true, + "renderGraceUsed": false, + "renderDelayMs": null, + "renderGraceRetainedCard": false, + "finalReview": { + "sourceReplay": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/claude-code/toaster/result.json", + "sourceReplaySha256": "bc3162d90a3cd8d580b656dda4f6f2925dcff4f949ff8c3e40288a88d0f70dc4", + "manualControls": 2, + "supplementalControls": 0 + }, + "controlStatuses": [ + { + "width": 710, + "status": "live", + "runtimeErrors": [], + "controls": [ + { + "index": 0, + "label": "Toaster: Space presses the lever, arrow keys set browning", + "pass": true, + "status": "live", + "reason": "Stage click invokes the supported press/cancel handler. Before shows popped bread with lever raised; after shows bread lowered, compressed spring, hot element and active strip temperature/time. This is a new toast cycle started by the click, not focus styling.", + "mode": "click" + }, + { + "index": 1, + "label": "Press the lever", + "pass": true, + "status": "live", + "reason": "stable output changed outside controls", + "mode": "primary" + }, + { + "index": 2, + "label": "tw-browning", + "pass": true, + "status": "live", + "reason": "Browning drag changes dial 2 to 5.5, visibly rotates the drawn dial and moves the trip stop; predicted next pop time changes from about 1:23 to 3:30 and remains 3:30 in after1. Previous pop time stays 1:23, so the new prediction is caused by browning rather than ongoing heating.", + "mode": "drag" + }, + { + "index": 3, + "label": "tw-warm", + "pass": true, + "status": "live", + "reason": "stable output changed outside controls", + "mode": "primary" + } + ] + } + ], + "source": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype/claude-code/toaster/result.json", + "sourceSha256": "60d78421d502a33d6e4c60ac792a2dce029bb5be17160d75aa1d3dc420158512", + "replay": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-final/claude-code/toaster/result.json", + "replaySha256": "f49cf44b5caa272b6218311b05f17a6dd17b8af024e3e45f3a0b213c77e032f7", + "scorerCommit": "f009de5838f80b90e861e5727f0ad11cba8814f8" + }, + { + "revision": "prototype", + "provider": "claude-code", + "promptId": "umbrella", + "model": "claude-opus-5-5", + "scoreMs": 178751, + "cardVisible": true, + "allControlsProven": true, + "questions": { + "structured": [], + "textQuestions": [], + "count": 0, + "needsReview": false + }, + "progressShown": true, + "renderGraceUsed": true, + "renderDelayMs": 117, + "renderGraceRetainedCard": true, + "finalReview": { + "sourceReplay": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/claude-code/umbrella/result.json", + "sourceReplaySha256": "a7b8836d998028c6d5081189bb577f86b00dac268c0f1ab74bca6cc5d8e989cd", + "manualControls": 0, + "supplementalControls": 0 + }, + "controlStatuses": [ + { + "width": 710, + "status": "live", + "runtimeErrors": [], + "controls": [ + { + "index": 0, + "label": "Umbrella runner: up arrow opens, down arrow closes", + "pass": true, + "status": "live", + "reason": "stable output changed outside controls", + "mode": "drag" + }, + { + "index": 1, + "label": "Close", + "pass": true, + "status": "live", + "reason": "stable output changed outside controls", + "mode": "primary" + }, + { + "index": 2, + "label": "open", + "pass": true, + "status": "live", + "reason": "stable output changed outside controls", + "mode": "drag" + }, + { + "index": 3, + "label": "Open", + "pass": true, + "status": "live", + "reason": "stable output changed outside controls", + "mode": "primary" + } + ] + } + ], + "source": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype/claude-code/umbrella/result.json", + "sourceSha256": "ad130c968a97efde5a5995b576fb9d675c9617bee80992c9bd72c0bcfe6f57e1", + "replay": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-final/claude-code/umbrella/result.json", + "replaySha256": "6f569729bf60d845431f9a78118115113e18dea1241ffae376a586eb44100ed3", + "scorerCommit": "f009de5838f80b90e861e5727f0ad11cba8814f8" + }, + { + "revision": "prototype", + "provider": "claude-code", + "promptId": "cdn", + "model": "claude-opus-5-5", + "scoreMs": 243482, + "cardVisible": true, + "allControlsProven": false, + "questions": { + "structured": [], + "textQuestions": [], + "count": 0, + "needsReview": false + }, + "progressShown": true, + "renderGraceUsed": false, + "renderDelayMs": null, + "renderGraceRetainedCard": false, + "finalReview": { + "sourceReplay": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/claude-code/cdn/result.json", + "sourceReplaySha256": "37ee2386d7df71e62638634c3a925ec4b64b8491ee4bcfcc5ec74e66de8065a3", + "manualControls": 7, + "supplementalControls": 0 + }, + "controlStatuses": [ + { + "width": 710, + "status": "unproven", + "runtimeErrors": [], + "controls": [ + { + "index": 0, + "label": "CDN purge timeline: arrow keys move through time, space plays or pauses", + "pass": true, + "status": "live", + "reason": "With pointer held outside the stage, Home\u2192End changes all ten drawn edge/browser copies v1\u2192v2 and the readout 0s/0 fresh\u21922m8s/5 fresh. This removes the prior pointer-leave/settling ambiguity.", + "mode": "click" + }, + { + "index": 1, + "label": "Purge on deploy", + "pass": true, + "status": "live", + "reason": "Purge on deploy changes independent explanatory output from 9 min 30 s edge expiry to 5 s purge arrival and 1 min 54 s browser freshness; the retained screenshots show the correct mode effect.", + "mode": "primary" + }, + { + "index": 2, + "label": "No purge, wait for TTL", + "pass": true, + "status": "live", + "reason": "No purge switches the independent explanation from 5 s edge purge arrival to 9 min 30 s TTL expiry, beyond button styling.", + "mode": "primary" + }, + { + "index": 3, + "label": "control 3", + "pass": true, + "status": "live", + "reason": "In Purge mode with browser max-age zero, real propagation Home\u2192End changes independent last-edge prediction 0s\u21922min and the visible edge/browser freshness. The earlier No-purge state made this control ineffective.", + "mode": "drag" + }, + { + "index": 4, + "label": "control 4", + "pass": true, + "status": "live", + "reason": "In No purge mode, TTL drag changes the independent last-edge freshness prediction from 11 min 24 s to 49 min 24 s. The same figure remains visible.", + "mode": "drag" + }, + { + "index": 5, + "label": "control 5", + "pass": true, + "status": "live", + "reason": "With purge propagation zero, real browser max-age Home\u2192End changes the independent last-user freshness prediction from immediate to 28m30s, while edges remain fresh. Prior TTL expiry dominated this effect.", + "mode": "drag" + }, + { + "index": 6, + "label": "Replay", + "pass": false, + "status": "dead", + "reason": "With reduced motion explicitly true, a real Replay click at the completed state leaves both retained post-input frames and readout unchanged at 2m8s/all fresh. Its handler resets t but never draws; run() refuses animation under reduced motion. The earlier automatic pass was a pointer/settling artifact.", + "mode": "primary" + } + ] + } + ], + "source": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype/claude-code/cdn/result.json", + "sourceSha256": "5e6f73e25e371cfa6dc1bf8030c531a8b6936799709a2eb47c440eae49300fa7", + "replay": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-final/claude-code/cdn/result.json", + "replaySha256": "198d0659c07b722e82b417032d272dbb6b771c29ab020f378a8c94f404bc75d3", + "scorerCommit": "f009de5838f80b90e861e5727f0ad11cba8814f8" + }, + { + "revision": "prototype", + "provider": "claude-code", + "promptId": "notification-settings", + "model": "claude-opus-5-5", + "scoreMs": 46544, + "cardVisible": true, + "allControlsProven": true, + "questions": { + "structured": [], + "textQuestions": [], + "count": 0, + "needsReview": false + }, + "progressShown": true, + "renderGraceUsed": false, + "renderDelayMs": null, + "renderGraceRetainedCard": false, + "finalReview": { + "sourceReplay": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/claude-code/notification-settings/result.json", + "sourceReplaySha256": "ea576242765ff23cfc62388b843e2ca6584be55768953a3ffc04172373422632", + "manualControls": 2, + "supplementalControls": 0 + }, + "controlStatuses": [ + { + "width": 710, + "status": "live", + "runtimeErrors": [], + "controls": [ + { + "index": 0, + "label": "Email", + "pass": true, + "status": "live", + "reason": "stable output changed outside controls", + "mode": "primary" + }, + { + "index": 1, + "label": "Push", + "pass": true, + "status": "live", + "reason": "stable output changed outside controls", + "mode": "primary" + }, + { + "index": 2, + "label": "Daily digest", + "pass": true, + "status": "live", + "reason": "Daily digest click removes the time picker and the daily-digest clause from the explanatory sentence. The screenshot pair confirms real output despite card shrink, matching the digest parameter handler.", + "mode": "primary" + }, + { + "index": 3, + "label": "Send digest at", + "pass": true, + "status": "live", + "reason": "Request22 starts from fresh digest-enabled state and uses real keys on the visible time select. The inspected pair changes the separate summary from daily digest at 7 AM to 9 AM; both after logs confirm digest remains enabled and digestTime=9. The former failure was the earlier trial hiding the select.", + "mode": "primary" + } + ] + } + ], + "source": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype/claude-code/notification-settings/result.json", + "sourceSha256": "8ee212f64859dae950bad71de6d490cb29a6e1939f66805de771494a23ba562e", + "replay": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-final/claude-code/notification-settings/result.json", + "replaySha256": "1d9c2bac7f5c86ccd3db6524a66243005b78f35a85e667ee76fb485eae2dd252", + "scorerCommit": "f009de5838f80b90e861e5727f0ad11cba8814f8" + }, + { + "revision": "prototype", + "provider": "claude-code", + "promptId": "narrow-toggle", + "model": "claude-opus-5-5", + "scoreMs": 50432, + "cardVisible": true, + "allControlsProven": true, + "questions": { + "structured": [], + "textQuestions": [], + "count": 0, + "needsReview": false + }, + "progressShown": false, + "renderGraceUsed": false, + "renderDelayMs": null, + "renderGraceRetainedCard": false, + "finalReview": { + "sourceReplay": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/claude-code/narrow-toggle/result.json", + "sourceReplaySha256": "db8dfe666c15aba2e265cb2cce614ca0418f0ca1f919ab9a2cf2201fdd03f3f4", + "manualControls": 0, + "supplementalControls": 0 + }, + "controlStatuses": [ + { + "width": 360, + "status": "live", + "runtimeErrors": [], + "controls": [ + { + "index": 0, + "label": "Dark mode", + "pass": true, + "status": "live", + "reason": "stable output changed outside controls", + "mode": "click" + } + ] + }, + { + "width": 390, + "status": "live", + "runtimeErrors": [], + "controls": [ + { + "index": 0, + "label": "Dark mode", + "pass": true, + "status": "live", + "reason": "stable output changed outside controls", + "mode": "click" + } + ] + }, + { + "width": 480, + "status": "live", + "runtimeErrors": [], + "controls": [ + { + "index": 0, + "label": "Dark mode", + "pass": true, + "status": "live", + "reason": "stable output changed outside controls", + "mode": "click" + } + ] + } + ], + "source": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype/claude-code/narrow-toggle/result.json", + "sourceSha256": "0ae3296784cca3b049f5561182504179c6d947a4d26c716deb27cbbb3ff05d50", + "replay": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-final/claude-code/narrow-toggle/result.json", + "replaySha256": "0e46e4e532d6ff0a93cff9bd9c3af7a2c054d6d57afeb6a748d22199cedd6818", + "scorerCommit": "f009de5838f80b90e861e5727f0ad11cba8814f8" + }, + { + "revision": "prototype", + "provider": "claude-code", + "promptId": "dns", + "model": "claude-opus-5-5", + "scoreMs": 184760, + "cardVisible": true, + "allControlsProven": true, + "questions": { + "structured": [], + "textQuestions": [], + "count": 0, + "needsReview": false + }, + "progressShown": true, + "renderGraceUsed": false, + "renderDelayMs": null, + "renderGraceRetainedCard": false, + "finalReview": { + "sourceReplay": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/claude-code/dns/result.json", + "sourceReplaySha256": "f059aef4ef21d3d174cc99f4eb59314b5d5f110f5a860fefa2ecc39870fe1527", + "manualControls": 4, + "supplementalControls": 0 + }, + "controlStatuses": [ + { + "width": 710, + "status": "live", + "runtimeErrors": [], + "controls": [ + { + "index": 0, + "label": "DNS lookup figure. Space or Enter replays; 1, 2, 3 or arrow keys change what is cached.", + "pass": true, + "status": "live", + "reason": "Under reduced motion the retained stage click advances Step 1 of 8 to Step 2 and moves the packet from browser to resolver. Independent ArrowRight evidence also switches Cold cache (3 server trips) to Knows .com (2 trips); the saved source binds both routes.", + "mode": "click" + }, + { + "index": 1, + "label": "Cold cache", + "pass": true, + "status": "live", + "reason": "Cold cache changes the independent computed server-trip count from 2 to 3, corroborated by plan(cache).", + "mode": "primary" + }, + { + "index": 2, + "label": "Knows .com", + "pass": true, + "status": "live", + "reason": "Knows .com changes the independent computed server-trip count from 3 to 2, corroborated by plan(cache).", + "mode": "primary" + }, + { + "index": 3, + "label": "Answer cached", + "pass": true, + "status": "live", + "reason": "Answer cached changes the independent computed server-trip count from 3 to 0, corroborated by plan(cache).", + "mode": "primary" + } + ] + } + ], + "source": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype/claude-code/dns/result.json", + "sourceSha256": "fbaaea317ec423b8a7711fb471a8e636f47868546bfb925175e1e341e4f258b0", + "replay": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-final/claude-code/dns/result.json", + "replaySha256": "2741cee296f202e265ecbec94ca4d3a72cc02fc4aec5065ae7b6552b5acc1f4c", + "scorerCommit": "f009de5838f80b90e861e5727f0ad11cba8814f8" + }, + { + "revision": "prototype", + "provider": "claude-code", + "promptId": "database-index", + "model": "claude-opus-5-5", + "scoreMs": 248126, + "cardVisible": true, + "allControlsProven": true, + "questions": { + "structured": [], + "textQuestions": [], + "count": 0, + "needsReview": false + }, + "progressShown": true, + "renderGraceUsed": true, + "renderDelayMs": 80, + "renderGraceRetainedCard": true, + "finalReview": { + "sourceReplay": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/claude-code/database-index/result.json", + "sourceReplaySha256": "f90dc75b9440f9d4fe4901979b5f87522573eee11c3b73d0c7448858c8f141d2", + "manualControls": 4, + "supplementalControls": 0 + }, + "controlStatuses": [ + { + "width": 710, + "status": "live", + "runtimeErrors": [], + "controls": [ + { + "index": 0, + "label": "B-tree lookup: arrow keys pick the id, i toggles the index", + "pass": true, + "status": "live", + "reason": "Supported ArrowRight changes lookup id from 420,000 to 530,000, updates the explanation and highlights a different leaf/table route. Source increments normalized key by 11; reduced-motion uses the final lookup state, excluding an autonomous tour.", + "mode": "key-ArrowRight" + }, + { + "index": 1, + "label": "No index", + "pass": true, + "status": "live", + "reason": "No index click changes B-tree 4 page reads to Full scan 10,000 page reads and rewrites the explanation. Body height shrinks, but actual calculated output changes, matching the index=false branch.", + "mode": "primary" + }, + { + "index": 2, + "label": "B-tree index", + "pass": true, + "status": "live", + "reason": "B-tree index click changes Full scan 10,000 pages to 4 page reads and restores the index-path explanation and visible highlighted route. This is the supported index=true branch, not selected-button appearance.", + "mode": "primary" + }, + { + "index": 3, + "label": "Rows in table, powers of ten", + "pass": true, + "status": "live", + "reason": "Rows slider changes 10 thousand to 100 million rows; output changes from 3 to 5 index page reads, hypothetical scan from 100 to 1,000,000, and lookup id from 4,200 to 42,000,000. The size/read-count model matches these changes despite text wrapping and card resize.", + "mode": "drag" + }, + { + "index": 4, + "label": "Which id to look up", + "pass": true, + "status": "live", + "reason": "stable output changed outside controls", + "mode": "drag" + } + ] + } + ], + "source": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype/claude-code/database-index/result.json", + "sourceSha256": "98265fa8cd45c97bac34bae9784dd7baf72290b9595b0ddeeaaf81b4fe36101b", + "replay": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-final/claude-code/database-index/result.json", + "replaySha256": "eb9fc12d40581fff15f089b157390269acd35d4ce645d3c8cf1a4c1fde81deac", + "scorerCommit": "f009de5838f80b90e861e5727f0ad11cba8814f8" + }, + { + "revision": "prototype", + "provider": "claude-code", + "promptId": "git-merge", + "model": "claude-opus-5-5", + "scoreMs": 161324, + "cardVisible": true, + "allControlsProven": true, + "questions": { + "structured": [], + "textQuestions": [], + "count": 0, + "needsReview": false + }, + "progressShown": true, + "renderGraceUsed": false, + "renderDelayMs": null, + "renderGraceRetainedCard": false, + "finalReview": { + "sourceReplay": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/claude-code/git-merge/result.json", + "sourceReplaySha256": "b27e9df0705a4d96e47801e96bc0826c5cdd3f6a481880bd998fda4e0644a945", + "manualControls": 2, + "supplementalControls": 0 + }, + "controlStatuses": [ + { + "width": 710, + "status": "live", + "runtimeErrors": [], + "controls": [ + { + "index": 0, + "label": "Merge bench: keys 1 to 4 cycle each hunk, M toggles whether main moved", + "pass": true, + "status": "live", + "reason": "Real-input request20 presses supported key 1 on the stage. The before/after PNGs show hunk1 feature and result blocks changing A to B while the unrelated conflict remains. Logs confirm hunk1 none\u2192feature; the persistent drawn output proves the stage despite generic unsupported probes failing.", + "mode": "drag" + }, + { + "index": 1, + "label": "moved", + "pass": true, + "status": "live", + "reason": "stable output changed outside controls", + "mode": "primary" + }, + { + "index": 2, + "label": "Neither branchFeature onlyMain onlyBoth, identicallyBoth, differently", + "pass": true, + "status": "live", + "reason": "stable output changed outside controls", + "mode": "primary" + }, + { + "index": 3, + "label": "Neither branchFeature onlyMain onlyBoth, identicallyBoth, differently", + "pass": true, + "status": "live", + "reason": "stable output changed outside controls", + "mode": "primary" + }, + { + "index": 4, + "label": "Neither branchFeature onlyMain onlyBoth, identicallyBoth, differently", + "pass": true, + "status": "live", + "reason": "stable output changed outside controls", + "mode": "primary" + }, + { + "index": 5, + "label": "Neither branchFeature onlyMain onlyBoth, identicallyBoth, differently", + "pass": true, + "status": "live", + "reason": "Request21 first uses Home to leave the final option, then ArrowDown/Enter on #h3. The inspected pair changes the last result block A\u2192B and the explanation/readout from 1 to 2 hunks from feature. Both after logs retain the changed output, establishing a live select rather than the old endpoint no-op.", + "mode": "primary" + } + ] + } + ], + "source": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype/claude-code/git-merge/result.json", + "sourceSha256": "a3d14e7dad8d19f0ccdb877b206cd429f547caa0ecfb316adce140b9d120b6ce", + "replay": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-final/claude-code/git-merge/result.json", + "replaySha256": "fe6992e0582a21e82d973a57b023dc972afb7a223ea3a22a77707d3a246f555c", + "scorerCommit": "f009de5838f80b90e861e5727f0ad11cba8814f8" + }, + { + "revision": "prototype", + "provider": "claude-code", + "promptId": "websocket", + "model": "claude-opus-5-5", + "scoreMs": 209497, + "cardVisible": true, + "allControlsProven": true, + "questions": { + "structured": [], + "textQuestions": [], + "count": 0, + "needsReview": false + }, + "progressShown": true, + "renderGraceUsed": true, + "renderDelayMs": 104, + "renderGraceRetainedCard": true, + "finalReview": { + "sourceReplay": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/claude-code/websocket/result.json", + "sourceReplaySha256": "8a3a0490dbba7ea6ae68afd10cb72d40b72e697c844137b81348757425c5649c", + "manualControls": 5, + "supplementalControls": 0 + }, + "controlStatuses": [ + { + "width": 710, + "status": "live", + "runtimeErrors": [], + "controls": [ + { + "index": 0, + "label": "WebSocket chat: Enter sends a message, M switches between WebSocket and polling, arrows change the poll interval", + "pass": true, + "status": "live", + "reason": "Supported stage click adds a third message line to all three client pads (two before, three in both after images). Source click invokes send and reduced-motion disables automatic touring, so the added bubbles are causal message delivery. The automatic semantic gate misses opacity-revealed SVG message paths.", + "mode": "drag" + }, + { + "index": 1, + "label": "WebSocket", + "pass": true, + "status": "live", + "reason": "WebSocket click changes polling average/worst 1.6/3.1 s and 20 requests/min to 100/100 ms and zero polling requests, restores open wires, hides interval and shows completed handshake. These model outputs directly match mode=websocket.", + "mode": "primary" + }, + { + "index": 2, + "label": "Polling", + "pass": true, + "status": "live", + "reason": "Polling click changes 100ms delivery and zero polls to 1.6s average, 3.1s worst and 20 requests/min; exposes interval and explains timed polling. Actual outputs change even though card height grows.", + "mode": "primary" + }, + { + "index": 3, + "label": "Ana sends a message", + "pass": true, + "status": "live", + "reason": "stable output changed outside controls", + "mode": "primary" + }, + { + "index": 4, + "label": "latency", + "pass": true, + "status": "live", + "reason": "Latency drag changes one-way 50 to 270 ms; average delivery changes 1.6 to 2.0 s and worst case 3.1 to 3.5 s while interval stays 3s and request rate stays 20. This is the model latency effect, not autonomous packet traffic.", + "mode": "drag" + }, + { + "index": 5, + "label": "interval", + "pass": true, + "status": "live", + "reason": "Request23 enables Polling, sets #interval to Home then End with real keys. Inspected PNGs change interval 1\u219215 s, independent average delivery 600 ms\u21927.6 s and requests/min 60\u21924; latency stays 50 ms. Both after logs retain the new readout, proving the previously unexercised conditional control.", + "mode": null + } + ] + } + ], + "source": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype/claude-code/websocket/result.json", + "sourceSha256": "a1710127b7fdf740090195c6c82f0013c0b6a8a9e830f7e96b5e735605eb1951", + "replay": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-final/claude-code/websocket/result.json", + "replaySha256": "4ec51eee5ab7c8170192b9d2281b47db5dd31e1cf9b0c8736da4920ad2356907", + "scorerCommit": "f009de5838f80b90e861e5727f0ad11cba8814f8" + }, + { + "revision": "prototype", + "provider": "claude-code", + "promptId": "load-balancer", + "model": "claude-opus-5-5", + "scoreMs": 313179, + "cardVisible": true, + "allControlsProven": true, + "questions": { + "structured": [], + "textQuestions": [], + "count": 0, + "needsReview": false + }, + "progressShown": true, + "renderGraceUsed": false, + "renderDelayMs": null, + "renderGraceRetainedCard": false, + "finalReview": { + "sourceReplay": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/claude-code/load-balancer/result.json", + "sourceReplaySha256": "7dc748d4f64c8368c9c5a1eed397594fb82640bf3abf123f76405587c3faaf42", + "manualControls": 6, + "supplementalControls": 0 + }, + "controlStatuses": [ + { + "width": 710, + "status": "live", + "runtimeErrors": [], + "controls": [ + { + "index": 0, + "label": "Load balancer figure: left and right arrows change the algorithm, up and down change the traffic", + "pass": true, + "status": "live", + "reason": "Supported ArrowRight changes algorithm from Round robin to Least-connections in the independent model readout. The source key handler updates algo and pick() consults it. Queue evolution is visible but is not used alone as causal proof because traffic runs continuously.", + "mode": "key-ArrowRight" + }, + { + "index": 1, + "label": "Round robin", + "pass": true, + "status": "live", + "reason": "Round robin click changes the model readout from Least-connections to Round-robin, beyond selected-button styling. The source handler feeds the actual dispatch pick() branch. Simultaneous queue/average changes are not independently attributed to the click.", + "mode": "primary" + }, + { + "index": 2, + "label": "Least connections", + "pass": true, + "status": "live", + "reason": "Least connections click changes the model readout from Round-robin to Least-connections. Source maps this parameter to minimum-open-connections dispatch; readout change is causal, while the moving queue is treated as background rather than standalone proof.", + "mode": "primary" + }, + { + "index": 3, + "label": "Random", + "pass": true, + "status": "live", + "reason": "Random click changes the model readout from Round-robin to Random. Source dispatch pick() uses the selected random branch; no automatic cycling changes the algorithm. Changing queue counts alone is not counted as proof.", + "mode": "primary" + }, + { + "index": 4, + "label": "rate", + "pass": true, + "status": "live", + "reason": "Fresh-page equal-time requests25/26 use Round robin and 4x Server C slowdown, changing only traffic through real Home/End input. At ~20.02/~20.01 s, inspected PNGs show open connections A/B/C=1/0/1 at 0.5 req/s versus 8/7/8 at 4 req/s, average 2.6\u21926.9 s, drops 0\u219219. Logs corroborate the contrast at 10 and 15 s. This isolates a substantial modeled load effect beyond the slider and autonomous aging of one run.", + "mode": "drag" + }, + { + "index": 5, + "label": "slow", + "pass": true, + "status": "live", + "reason": "Fresh-page equal-time requests27/28 hold Round robin and 4 req/s constant, changing only slowdown via real Home/End. At ~10.01/~10.02 s, inspected PNGs show identical A/B=5/6 but C=6 versus 8 and drops=0 versus 2; at ~20.02/~20.01 s the inspected drop counts are 9 versus 19 (averages 6.7 versus 6.9 s). This repeatable Server C pressure difference proves live service-time input beyond autonomous queue motion.", + "mode": "drag" + } + ] + } + ], + "source": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype/claude-code/load-balancer/result.json", + "sourceSha256": "62bb8fdd212236d1dbe8dd00341e63b72b4fdd85d4a087bbab9c5006eb163971", + "replay": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-final/claude-code/load-balancer/result.json", + "replaySha256": "73d3be091e7547e378c995fc70adc558d4d7ca26b056054f3116e5d3b7652536", + "scorerCommit": "f009de5838f80b90e861e5727f0ad11cba8814f8" + }, + { + "revision": "prototype", + "provider": "codex", + "promptId": "washing-machine", + "model": "gpt-6.1-sol", + "scoreMs": 98984, + "cardVisible": true, + "allControlsProven": true, + "questions": { + "structured": [], + "textQuestions": [], + "count": 0, + "needsReview": false + }, + "progressShown": true, + "renderGraceUsed": false, + "renderDelayMs": 0, + "renderGraceRetainedCard": false, + "finalReview": { + "sourceReplay": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/codex/washing-machine/result.json", + "sourceReplaySha256": "9496210a50ebbdba0ea911d4afec6d1baee475d1258e3b5f539be95ae665356b", + "manualControls": 2, + "supplementalControls": 0 + }, + "controlStatuses": [ + { + "width": 710, + "status": "live", + "runtimeErrors": [], + "controls": [ + { + "index": 0, + "label": "Cycle stage", + "pass": true, + "status": "live", + "reason": "The actual selector pair changes Wash to Drain, lowers the water, colors the drain route and changes both readout and explanation. The source subscription changes stage only on input; the distinct drain output is not incidental drum animation.", + "mode": "primary" + }, + { + "index": 1, + "label": "What the drawing simplifies", + "pass": true, + "status": "live", + "reason": "Actual click frames show the full simplification text present before and hidden after the summary click. This is a working native disclosure collapse, despite the automatic aligned-region proof failing when text disappears; the source uses details/summary.", + "mode": "drag" + } + ] + } + ], + "source": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype/codex/washing-machine/result.json", + "sourceSha256": "3a366b75934f8aa1fdd7ea25d866742bdb1c3327a3bf876337f163d4e0452571", + "replay": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-final/codex/washing-machine/result.json", + "replaySha256": "87e4dfcce73951fc3b12e11b165a32ca651d3afa39101725993e013de21ec7ea", + "scorerCommit": "f009de5838f80b90e861e5727f0ad11cba8814f8" + }, + { + "revision": "prototype", + "provider": "codex", + "promptId": "bicycle-pump", + "model": "gpt-6.1-sol", + "scoreMs": 110580, + "cardVisible": true, + "allControlsProven": true, + "questions": { + "structured": [], + "textQuestions": [], + "count": 0, + "needsReview": false + }, + "progressShown": true, + "renderGraceUsed": false, + "renderDelayMs": null, + "renderGraceRetainedCard": false, + "finalReview": { + "sourceReplay": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/codex/bicycle-pump/result.json", + "sourceReplaySha256": "6f0625b152770c6b5a4cb3028c80270969ea7b22445df4a0b2d4dcf7d9f142e9", + "manualControls": 2, + "supplementalControls": 0 + }, + "controlStatuses": [ + { + "width": 710, + "status": "live", + "runtimeErrors": [], + "controls": [ + { + "index": 0, + "label": "Pump stroke phase", + "pass": true, + "status": "live", + "reason": "Actual ArrowRight frames show piston moving down, compressed air chamber, inlet closure and a new compression paragraph/readout. Saved handler explicitly supports ArrowRight and selects phase 1 without autonomous settling.", + "mode": "key-ArrowRight" + }, + { + "index": 1, + "label": "\u2190 Previous", + "pass": true, + "status": "live", + "reason": "Precondition Next enables Previous; click returns compression to fill, raises piston, opens inlet and replaces explanation.", + "mode": null + }, + { + "index": 2, + "label": "Next \u2192", + "pass": true, + "status": "live", + "reason": "stable output changed outside controls", + "mode": "primary" + } + ] + } + ], + "source": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype/codex/bicycle-pump/result.json", + "sourceSha256": "9baddcef6f3f1a3f2e7fb4de01d6bd7efe2b91c889e9ded90c808fa588fb7523", + "replay": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-final/codex/bicycle-pump/result.json", + "replaySha256": "cdf2e290ba89b226800023e1ea8dad1094e7db828e648465c69d5d6907710465", + "scorerCommit": "f009de5838f80b90e861e5727f0ad11cba8814f8" + }, + { + "revision": "prototype", + "provider": "codex", + "promptId": "zipper", + "model": "gpt-6.1-sol", + "scoreMs": 100157, + "cardVisible": true, + "allControlsProven": true, + "questions": { + "structured": [], + "textQuestions": [], + "count": 0, + "needsReview": false + }, + "progressShown": true, + "renderGraceUsed": false, + "renderDelayMs": null, + "renderGraceRetainedCard": false, + "finalReview": { + "sourceReplay": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/codex/zipper/result.json", + "sourceReplaySha256": "7f65dabb87c02c0835be319aed69e781f3a7cb333cebe528eb5eed7c7b85ba9b", + "manualControls": 1, + "supplementalControls": 0 + }, + "controlStatuses": [ + { + "width": 710, + "status": "live", + "runtimeErrors": [], + "controls": [ + { + "index": 0, + "label": "Zipper slider position; up closes and down opens", + "pass": true, + "status": "live", + "reason": "The actual End pair moves the slider from the bottom to the top and joins the tooth rows below it. The source explicitly supports End and sets position 100; no autonomous motion exists.", + "mode": "key-End" + }, + { + "index": 1, + "label": "Move slider toward closed", + "pass": true, + "status": "live", + "reason": "stable output changed outside controls", + "mode": "drag" + } + ] + } + ], + "source": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype/codex/zipper/result.json", + "sourceSha256": "03c9783ff9751b7ad6465ae9886335db2bc6d7aee12437a43ebc57e88b658d10", + "replay": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-final/codex/zipper/result.json", + "replaySha256": "a48ac5143f107f8edb4ef2824d2d87be688e153025450500ef472f68f126799a", + "scorerCommit": "f009de5838f80b90e861e5727f0ad11cba8814f8" + }, + { + "revision": "prototype", + "provider": "codex", + "promptId": "toilet", + "model": "gpt-6.1-sol", + "scoreMs": 102093, + "cardVisible": true, + "allControlsProven": true, + "questions": { + "structured": [], + "textQuestions": [], + "count": 0, + "needsReview": false + }, + "progressShown": true, + "renderGraceUsed": false, + "renderDelayMs": 0, + "renderGraceRetainedCard": false, + "finalReview": { + "sourceReplay": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/codex/toilet/result.json", + "sourceReplaySha256": "a5fcea357e99e3116d250857f0477a4e8230b19e1052d4f01271ac2d444b9f8d", + "manualControls": 1, + "supplementalControls": 0 + }, + "controlStatuses": [ + { + "width": 710, + "status": "live", + "runtimeErrors": [], + "controls": [ + { + "index": 0, + "label": "step", + "pass": true, + "status": "live", + "reason": "stable output changed outside controls", + "mode": "drag" + }, + { + "index": 1, + "label": "\u2190 Back", + "pass": true, + "status": "live", + "reason": "Next enables Back; click returns Flush to Ready, restores tank level, closes flapper and changes explanation.", + "mode": null + }, + { + "index": 2, + "label": "Next \u2192", + "pass": true, + "status": "live", + "reason": "stable output changed outside controls", + "mode": "primary" + } + ] + } + ], + "source": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype/codex/toilet/result.json", + "sourceSha256": "0745a8ebb2c468419b89b9854b20b6f4b8364a61062448119fbc970a57c90d48", + "replay": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-final/codex/toilet/result.json", + "replaySha256": "14e0217795f7b6cba53d19ef4afdba865b4701a661afd1e5719410bad27b9ea3", + "scorerCommit": "f009de5838f80b90e861e5727f0ad11cba8814f8" + }, + { + "revision": "prototype", + "provider": "codex", + "promptId": "thermos", + "model": "gpt-6.1-sol", + "scoreMs": 93286, + "cardVisible": true, + "allControlsProven": false, + "questions": { + "structured": [], + "textQuestions": [], + "count": 0, + "needsReview": false + }, + "progressShown": true, + "renderGraceUsed": false, + "renderDelayMs": 238, + "renderGraceRetainedCard": false, + "finalReview": { + "sourceReplay": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/codex/thermos/result.json", + "sourceReplaySha256": "4ec3c141f937d2a3a6276e681e3a2b9021fd20c747094d7a893f2fee6aa1b2c2", + "manualControls": 3, + "supplementalControls": 0 + }, + "controlStatuses": [ + { + "width": 710, + "status": "unproven", + "runtimeErrors": [], + "controls": [ + { + "index": 0, + "label": "ClosedOpen", + "pass": false, + "status": "dead", + "reason": "Real native Home/Enter to End/Enter changes displayed selection, but actual diagram and explanation remain unchanged. Read-only thermosState.params remains {}. Source supplies string-array options; frozen bridge expects option.value and rejects every intended choice.", + "mode": "primary" + }, + { + "index": 1, + "label": "VacuumAir filled", + "pass": false, + "status": "dead", + "reason": "Real native Home/Enter to End/Enter changes displayed selection, but actual diagram and explanation remain unchanged. Read-only thermosState.params remains {}. Source supplies string-array options; frozen bridge expects option.value and rejects every intended choice.", + "mode": "primary" + }, + { + "index": 2, + "label": "ReflectiveNonreflective", + "pass": false, + "status": "dead", + "reason": "Real native Home/Enter to End/Enter changes displayed selection, but actual diagram and explanation remain unchanged. Read-only thermosState.params remains {}. Source supplies string-array options; frozen bridge expects option.value and rejects every intended choice.", + "mode": "primary" + } + ] + } + ], + "source": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype/codex/thermos/result.json", + "sourceSha256": "4e8236839940c697157aedd891977c2b26ae28ab15d223d9c9ea339f16811d2f", + "replay": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-final/codex/thermos/result.json", + "replaySha256": "6a45b814c2ff247c4382456c223ea0992ce42ff356c7dedc770685617647bb6f", + "scorerCommit": "f009de5838f80b90e861e5727f0ad11cba8814f8" + }, + { + "revision": "prototype", + "provider": "codex", + "promptId": "door-lock", + "model": "gpt-6.1-sol", + "scoreMs": 83822, + "cardVisible": true, + "allControlsProven": true, + "questions": { + "structured": [], + "textQuestions": [], + "count": 0, + "needsReview": false + }, + "progressShown": true, + "renderGraceUsed": false, + "renderDelayMs": 166, + "renderGraceRetainedCard": false, + "finalReview": { + "sourceReplay": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/codex/door-lock/result.json", + "sourceReplaySha256": "1924bf1564ac33783e2ca9a3b49cb342f280c24af3ce8d3e90651953bef425fd", + "manualControls": 0, + "supplementalControls": 1 + }, + "controlStatuses": [ + { + "width": 710, + "status": "live", + "runtimeErrors": [], + "controls": [ + { + "index": 0, + "label": "No keyWrong keyRight key", + "pass": true, + "status": "live", + "reason": "stable output changed outside controls", + "mode": "primary" + }, + { + "index": 1, + "label": "Turn key", + "pass": true, + "status": "live", + "reason": "stable output changed outside controls", + "mode": "primary" + }, + { + "index": null, + "label": "What moves the door bolt?", + "pass": true, + "status": "live", + "reason": "Actual summary click expands the previously hidden explanatory paragraphs; read-only details.open changes false to true and actual PNGs show the new text.", + "mode": null + } + ] + } + ], + "source": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype/codex/door-lock/result.json", + "sourceSha256": "2600f60e42898296fe01bf7fd0011106d2960d572c9c5a77747a728d92dae075", + "replay": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-final/codex/door-lock/result.json", + "replaySha256": "72299f7159fc007b62090bbed5d39bde28f7ec4cb5f0a31c8d9b5a05186c4b96", + "scorerCommit": "f009de5838f80b90e861e5727f0ad11cba8814f8" + }, + { + "revision": "prototype", + "provider": "codex", + "promptId": "refrigerator", + "model": "gpt-6.1-sol", + "scoreMs": 84319, + "cardVisible": true, + "allControlsProven": true, + "questions": { + "structured": [], + "textQuestions": [], + "count": 0, + "needsReview": false + }, + "progressShown": true, + "renderGraceUsed": false, + "renderDelayMs": 0, + "renderGraceRetainedCard": false, + "finalReview": { + "sourceReplay": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/codex/refrigerator/result.json", + "sourceReplaySha256": "6343a865a83a503506f0e0fc0560c0610b485048e03abba750d32f1a0c40a902", + "manualControls": 1, + "supplementalControls": 0 + }, + "controlStatuses": [ + { + "width": 710, + "status": "live", + "runtimeErrors": [], + "controls": [ + { + "index": 0, + "label": "Inside: heat absorbedRoom: heat releasedCompressorExpansion restriction", + "pass": true, + "status": "live", + "reason": "Actual ArrowRight frames move the refrigerant marker from evaporator to compressor and replace the explanation and readout with compression. The source explicitly increments phase for ArrowRight; no autonomous motion can explain this state change.", + "mode": "key-ArrowRight" + }, + { + "index": 1, + "label": "phase", + "pass": true, + "status": "live", + "reason": "stable output changed outside controls", + "mode": "drag" + } + ] + } + ], + "source": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype/codex/refrigerator/result.json", + "sourceSha256": "7d8a6cedfdc7d75c4c90aee4c1c4576d2934bf548c55697bde41b566e749a7bb", + "replay": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-final/codex/refrigerator/result.json", + "replaySha256": "2298354f81b007862f27338b4be0aafab901b12b437a4ad185cddc603283371f", + "scorerCommit": "f009de5838f80b90e861e5727f0ad11cba8814f8" + }, + { + "revision": "prototype", + "provider": "codex", + "promptId": "stapler", + "model": "gpt-6.1-sol", + "scoreMs": 94750, + "cardVisible": true, + "allControlsProven": true, + "questions": { + "structured": [], + "textQuestions": [], + "count": 0, + "needsReview": false + }, + "progressShown": true, + "renderGraceUsed": false, + "renderDelayMs": 0, + "renderGraceRetainedCard": false, + "finalReview": { + "sourceReplay": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/codex/stapler/result.json", + "sourceReplaySha256": "047bd19b2bf32790de9aabaccd4e9c3555e44a7dcba858303d29b3930b90749a", + "manualControls": 2, + "supplementalControls": 0 + }, + "controlStatuses": [ + { + "width": 710, + "status": "live", + "runtimeErrors": [], + "controls": [ + { + "index": 0, + "label": "Stapling cycle. Use left and right arrows.", + "pass": true, + "status": "live", + "reason": "The actual ArrowRight pair changes Ready to Press: handle and magazine lower, driver moves, and the explanation changes. Source explicitly increments step on ArrowRight; no autonomous animation exists.", + "mode": "key-ArrowRight" + }, + { + "index": 1, + "label": "\u2190 Back", + "pass": true, + "status": "live", + "reason": "Next enables Back; click returns Press to Ready, lifts driver/staple and changes explanation.", + "mode": null + }, + { + "index": 2, + "label": "Next \u2192", + "pass": true, + "status": "live", + "reason": "stable output changed outside controls", + "mode": "primary" + } + ] + } + ], + "source": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype/codex/stapler/result.json", + "sourceSha256": "2fb79f03917190c7fefc789b306e4d1316601c0f54743763832182e414f460dc", + "replay": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-final/codex/stapler/result.json", + "replaySha256": "90e5eb449d32904bc7b39894dfbe7fe20510da1cff20d742c1ff19e9be51217a", + "scorerCommit": "f009de5838f80b90e861e5727f0ad11cba8814f8" + }, + { + "revision": "prototype", + "provider": "codex", + "promptId": "spray-bottle", + "model": "gpt-6.1-sol", + "scoreMs": 95860, + "cardVisible": true, + "allControlsProven": false, + "questions": { + "structured": [], + "textQuestions": [], + "count": 0, + "needsReview": false + }, + "progressShown": true, + "renderGraceUsed": false, + "renderDelayMs": null, + "renderGraceRetainedCard": false, + "finalReview": { + "sourceReplay": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/codex/spray-bottle/result.json", + "sourceReplaySha256": "0db03fcce6247c6d588500c618e249ed3b843c01fc427d87dfa2a001ce33b718", + "manualControls": 3, + "supplementalControls": 0 + }, + "controlStatuses": [ + { + "width": 710, + "status": "unproven", + "runtimeErrors": [], + "controls": [ + { + "index": 0, + "label": "Spray bottle pump. Right arrow squeezes; left arrow releases.", + "pass": false, + "status": "dead", + "reason": "Actual supported-input frames retain the release state, open inlet, closed outlet and unchanged explanation. The generated source defines stroke as type string with value squeeze; the frozen bridge only handles text/toggle specially and otherwise numeric-normalizes with default 0. Both squeeze/release strings therefore stay 0 and cannot trigger the intended state change. This is a parameter-contract defect, not a missing visual threshold.", + "mode": "drag" + }, + { + "index": 1, + "label": "Squeeze trigger", + "pass": false, + "status": "dead", + "reason": "Actual supported-input frames retain the release state, open inlet, closed outlet and unchanged explanation. The generated source defines stroke as type string with value squeeze; the frozen bridge only handles text/toggle specially and otherwise numeric-normalizes with default 0. Both squeeze/release strings therefore stay 0 and cannot trigger the intended state change. This is a parameter-contract defect, not a missing visual threshold.", + "mode": "primary" + }, + { + "index": 2, + "label": "Release trigger", + "pass": false, + "status": "dead", + "reason": "Actual supported-input frames retain the release state, open inlet, closed outlet and unchanged explanation. The generated source defines stroke as type string with value squeeze; the frozen bridge only handles text/toggle specially and otherwise numeric-normalizes with default 0. Both squeeze/release strings therefore stay 0 and cannot trigger the intended state change. This is a parameter-contract defect, not a missing visual threshold.", + "mode": "primary" + } + ] + } + ], + "source": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype/codex/spray-bottle/result.json", + "sourceSha256": "a890d3403f8efbec1d0483430debc52d11b85d89bcd1fd85154a90a087501e6a", + "replay": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-final/codex/spray-bottle/result.json", + "replaySha256": "db3cffb1917a4b9c6256292f9dfac13e1c931a6c462c2130475d8a58d6784e7e", + "scorerCommit": "f009de5838f80b90e861e5727f0ad11cba8814f8" + }, + { + "revision": "prototype", + "provider": "codex", + "promptId": "seat-belt", + "model": "gpt-6.1-sol", + "scoreMs": 74240, + "cardVisible": true, + "allControlsProven": true, + "questions": { + "structured": [], + "textQuestions": [], + "count": 0, + "needsReview": false + }, + "progressShown": true, + "renderGraceUsed": false, + "renderDelayMs": null, + "renderGraceRetainedCard": false, + "finalReview": { + "sourceReplay": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/codex/seat-belt/result.json", + "sourceReplaySha256": "7128f5ae9629ba1d998ca8fd84f676e7627ab0ebfd4440a93cc7a2fed0b3681b", + "manualControls": 1, + "supplementalControls": 0 + }, + "controlStatuses": [ + { + "width": 710, + "status": "live", + "runtimeErrors": [], + "controls": [ + { + "index": 0, + "label": "Belt reelBelt \u2192Locking catchInertia weight", + "pass": true, + "status": "live", + "reason": "The actual supported ArrowRight pair changes Normal to Sudden braking, moves the pendulum/link and engages the catch, with a matching payout-blocked readout. Saved handler updates local mode and draws synchronously; no incidental animation is involved.", + "mode": "key-ArrowRight" + }, + { + "index": 1, + "label": "Normal movement", + "pass": true, + "status": "live", + "reason": "stable output changed outside controls", + "mode": "primary" + }, + { + "index": 2, + "label": "Sudden braking", + "pass": true, + "status": "live", + "reason": "stable output changed outside controls", + "mode": "primary" + }, + { + "index": 3, + "label": "Release tension", + "pass": true, + "status": "live", + "reason": "stable output changed outside controls", + "mode": "primary" + } + ] + } + ], + "source": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype/codex/seat-belt/result.json", + "sourceSha256": "7a02f94986ce5b5ff37d90cd1fd4e98e6949c31322d23c7801cb15985ea8c13b", + "replay": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-final/codex/seat-belt/result.json", + "replaySha256": "ab5980c41fd6ef49bdbfc6a202700b569a3fbe834e724e76fbfddac97718c410", + "scorerCommit": "f009de5838f80b90e861e5727f0ad11cba8814f8" + }, + { + "revision": "prototype", + "provider": "codex", + "promptId": "toaster", + "model": "gpt-6.1-sol", + "scoreMs": 90943, + "cardVisible": true, + "allControlsProven": true, + "questions": { + "structured": [], + "textQuestions": [], + "count": 0, + "needsReview": false + }, + "progressShown": true, + "renderGraceUsed": false, + "renderDelayMs": 0, + "renderGraceRetainedCard": false, + "finalReview": { + "sourceReplay": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/codex/toaster/result.json", + "sourceReplaySha256": "8b66dfff80073452140289f7e49e521edf9ea5be7b036aaa6633155066555141", + "manualControls": 1, + "supplementalControls": 0 + }, + "controlStatuses": [ + { + "width": 710, + "status": "live", + "runtimeErrors": [], + "controls": [ + { + "index": 0, + "label": "Toasting cycle", + "pass": true, + "status": "live", + "reason": "The actual End pair changes Ready to Released/heaters off and replaces the explanation with timer-end, latch release and spring-lift text. Source explicitly maps End to cycle 100; similar endpoint geometry does not negate the visible state/readout change.", + "mode": "key-End" + }, + { + "index": 1, + "label": "Toasting cycle", + "pass": true, + "status": "live", + "reason": "stable output changed outside controls", + "mode": "drag" + } + ] + } + ], + "source": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype/codex/toaster/result.json", + "sourceSha256": "936a669dc89ee0b882af0ae72c856b11cddd508a9559d2945cdbf05c6e157af0", + "replay": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-final/codex/toaster/result.json", + "replaySha256": "42c7c9acb40ce63286d48d6beb438fc5e4846a7aa80a5d86fea4ec9371618b25", + "scorerCommit": "f009de5838f80b90e861e5727f0ad11cba8814f8" + }, + { + "revision": "prototype", + "provider": "codex", + "promptId": "umbrella", + "model": "gpt-6.1-sol", + "scoreMs": 83545, + "cardVisible": true, + "allControlsProven": true, + "questions": { + "structured": [], + "textQuestions": [], + "count": 0, + "needsReview": false + }, + "progressShown": true, + "renderGraceUsed": false, + "renderDelayMs": null, + "renderGraceRetainedCard": false, + "finalReview": { + "sourceReplay": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/codex/umbrella/result.json", + "sourceReplaySha256": "679098d81ad5f331bf6e5954b5910c722e62ecf1fba15e33b0f2e4f2fb12ce05", + "manualControls": 1, + "supplementalControls": 1 + }, + "controlStatuses": [ + { + "width": 710, + "status": "live", + "runtimeErrors": [], + "controls": [ + { + "index": 0, + "label": "Fig 1Manual umbrella \u00b7 section viewMove the runnerClosed", + "pass": true, + "status": "live", + "reason": "The actual ArrowRight pair raises the runner, spreads ribs and fabric and changes Closed to the moving-ribs explanation. The source explicitly adjusts the target on ArrowRight; its easing animation follows that input rather than changing autonomously.", + "mode": "key-ArrowRight" + }, + { + "index": 1, + "label": "Runner position", + "pass": true, + "status": "live", + "reason": "stable output changed outside controls", + "mode": "drag" + }, + { + "index": 2, + "label": "Open", + "pass": true, + "status": "live", + "reason": "stable output changed outside controls", + "mode": "primary" + }, + { + "index": 3, + "label": "Release & close", + "pass": true, + "status": "live", + "reason": "stable output changed outside controls", + "mode": "primary" + }, + { + "index": null, + "label": "Which parts do what?", + "pass": true, + "status": "live", + "reason": "Actual summary click expands the previously hidden explanatory paragraphs; read-only details.open changes false to true and actual PNGs show the new text.", + "mode": null + } + ] + } + ], + "source": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype/codex/umbrella/result.json", + "sourceSha256": "3d937092c4835dc40d8f78b77c999013d1060f1fcbf4788be0e295a8c1a839bd", + "replay": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-final/codex/umbrella/result.json", + "replaySha256": "2ee3f4015dfcdd8c7478d9b08d8639a0be36ade6a06f14ae84374bc233ae0b09", + "scorerCommit": "f009de5838f80b90e861e5727f0ad11cba8814f8" + }, + { + "revision": "prototype", + "provider": "codex", + "promptId": "cdn", + "model": "gpt-6.1-sol", + "scoreMs": 134034, + "cardVisible": true, + "allControlsProven": false, + "questions": { + "structured": [], + "textQuestions": [], + "count": 0, + "needsReview": false + }, + "progressShown": true, + "renderGraceUsed": false, + "renderDelayMs": null, + "renderGraceRetainedCard": false, + "finalReview": { + "sourceReplay": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/codex/cdn/result.json", + "sourceReplaySha256": "82626a0e95d104eca2455528a68df908732bd1fae7d95c0256d30ff5449bf405", + "manualControls": 5, + "supplementalControls": 1 + }, + "controlStatuses": [ + { + "width": 710, + "status": "unproven", + "runtimeErrors": [], + "controls": [ + { + "index": 0, + "label": "Fig 1 \u00b7 Distributed copiesBefore purge\n\n\nv1Edge Av1 cachedv1Edge Bv1 cachedv1Edge Cv1 cached\nv1Origi", + "pass": false, + "status": "unproven", + "reason": "Only partial behavior is proved: ArrowRight advances Before purge to Purge accepted (0 to 1), but the saved phase definition omits numeric bounds and the frozen bridge defaults to 0..1. The full advertised 0..4 journey cannot be inferred from that single visible transition. Planned repeated-key/manual bounds evidence is needed; this must not become a whole-card pass.", + "mode": "key-ArrowRight" + }, + { + "index": 1, + "label": "phase", + "pass": false, + "status": "dead", + "reason": "Actual subsequent range drag reaches DOM value4 while diagram and explanation remain phase1/Purge accepted. The input thumb moves but bridge phase clamps to1; visible later stages do not work.", + "mode": "drag" + }, + { + "index": 2, + "label": "Edge AEdge BEdge C", + "pass": false, + "status": "dead", + "reason": "Partial control: real native Home/Enter then End/Enter should select last option Edge C but settles at Edge B, confirmed in actual PNG and params.region1. Missing valid string schema/bounds clamps intended region2 to1. A\u2192B response is real, but advertised Edge C never works.", + "mode": "primary" + }, + { + "index": 3, + "label": "browser", + "pass": true, + "status": "live", + "reason": "The actual browser-cache checkbox changes the readout from Edge HIT to Local browser HIT and replaces the viewer explanation with the browser retaining its fresh v1 copy. This is independent visible output beyond checkbox styling.", + "mode": "primary" + }, + { + "index": 4, + "label": "origin", + "pass": true, + "status": "live", + "reason": "stable output changed outside controls", + "mode": "primary" + }, + { + "index": 5, + "label": "Next stage \u2192", + "pass": false, + "status": "dead", + "reason": "Next advances initial0 to1, then further real Next remains phase1/Purge accepted. Three advertised later phases are inaccessible because bridge default max1 clamps phase.", + "mode": "primary" + }, + { + "index": null, + "label": "Model and real-world caveats", + "pass": true, + "status": "live", + "reason": "Actual summary click expands the previously hidden explanatory paragraphs; read-only details.open changes false to true and actual PNGs show the new text.", + "mode": null + } + ] + } + ], + "source": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype/codex/cdn/result.json", + "sourceSha256": "6cdbf80abf38c1948d1ccea6a10d7ddaed281b34c1a174354fd54209b2942395", + "replay": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-final/codex/cdn/result.json", + "replaySha256": "7b4a54004a0057eab3a6ff3db52d89446838086b2c7eb3d5a20fa2f8ba3c0cc7", + "scorerCommit": "f009de5838f80b90e861e5727f0ad11cba8814f8" + }, + { + "revision": "prototype", + "provider": "codex", + "promptId": "notification-settings", + "model": "gpt-6.1-sol", + "scoreMs": 37209, + "cardVisible": true, + "allControlsProven": true, + "questions": { + "structured": [], + "textQuestions": [], + "count": 0, + "needsReview": false + }, + "progressShown": true, + "renderGraceUsed": false, + "renderDelayMs": 94, + "renderGraceRetainedCard": false, + "finalReview": { + "sourceReplay": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/codex/notification-settings/result.json", + "sourceReplaySha256": "9288ebb06f17cd71a3dd1bd6eccaf65e6a09a862b6c9d2a92c27e2ea2599d0aa", + "manualControls": 5, + "supplementalControls": 0 + }, + "controlStatuses": [ + { + "width": 598, + "status": "live", + "runtimeErrors": [], + "controls": [ + { + "index": 0, + "label": "Email notifications", + "pass": true, + "status": "live", + "reason": "After opening preview, Email click removes its example while keeping Push; meaningful external text change.", + "mode": "drag" + }, + { + "index": 1, + "label": "Push notifications", + "pass": true, + "status": "live", + "reason": "With preview visible, Push click changes the Push example to All notifications are off.", + "mode": "drag" + }, + { + "index": 2, + "label": "Daily digest", + "pass": true, + "status": "live", + "reason": "Daily digest click exposes the schedule select and changes external preview to Daily digest at 9 AM.", + "mode": "drag" + }, + { + "index": 3, + "label": "Preview notifications", + "pass": true, + "status": "live", + "reason": "Click Preview notifications reveals the external preview panel with Email and Push examples.", + "mode": "primary" + }, + { + "index": 4, + "label": "Delivery time \u00b7 your local time", + "pass": true, + "status": "live", + "reason": "After enabling Daily digest and preview, real Home/Enter then End/Enter changes 7 AM to 6 PM in both select and external preview.", + "mode": null + } + ] + } + ], + "source": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype/codex/notification-settings/result.json", + "sourceSha256": "72dd0d6c5135406c491226bf3f04895193a926a219fcd8b9bbd4939b85f24ead", + "replay": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-final/codex/notification-settings/result.json", + "replaySha256": "52613c97729589bf0765dfa0cbdf5546e875038940df90ea3865f762fdd550c8", + "scorerCommit": "f009de5838f80b90e861e5727f0ad11cba8814f8" + }, + { + "revision": "prototype", + "provider": "codex", + "promptId": "narrow-toggle", + "model": "gpt-6.1-sol", + "scoreMs": 38482, + "cardVisible": true, + "allControlsProven": true, + "questions": { + "structured": [], + "textQuestions": [], + "count": 0, + "needsReview": false + }, + "progressShown": true, + "renderGraceUsed": false, + "renderDelayMs": 321, + "renderGraceRetainedCard": false, + "finalReview": { + "sourceReplay": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/codex/narrow-toggle/result.json", + "sourceReplaySha256": "5912daefcfe6875e1a33d2428c65d2986b8d54c8dcb6069c4aa73a68da7e7d4f", + "manualControls": 0, + "supplementalControls": 0 + }, + "controlStatuses": [ + { + "width": 360, + "status": "live", + "runtimeErrors": [], + "controls": [ + { + "index": 0, + "label": "Dark mode", + "pass": true, + "status": "live", + "reason": "stable output changed outside controls", + "mode": "click" + } + ] + }, + { + "width": 390, + "status": "live", + "runtimeErrors": [], + "controls": [ + { + "index": 0, + "label": "Dark mode", + "pass": true, + "status": "live", + "reason": "stable output changed outside controls", + "mode": "click" + } + ] + }, + { + "width": 480, + "status": "live", + "runtimeErrors": [], + "controls": [ + { + "index": 0, + "label": "Dark mode", + "pass": true, + "status": "live", + "reason": "stable output changed outside controls", + "mode": "click" + } + ] + } + ], + "source": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype/codex/narrow-toggle/result.json", + "sourceSha256": "9b528a77d67401cfbb3a291f0be682a6e52bc2daf4c7d203c838410218ac638d", + "replay": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-final/codex/narrow-toggle/result.json", + "replaySha256": "9b980d977df44c5504c921d1ad31185a2043798214607bca8ec21079de7b36bd", + "scorerCommit": "f009de5838f80b90e861e5727f0ad11cba8814f8" + }, + { + "revision": "prototype", + "provider": "codex", + "promptId": "dns", + "model": "gpt-6.1-sol", + "scoreMs": 80247, + "cardVisible": true, + "allControlsProven": false, + "questions": { + "structured": [], + "textQuestions": [], + "count": 0, + "needsReview": false + }, + "progressShown": true, + "renderGraceUsed": false, + "renderDelayMs": null, + "renderGraceRetainedCard": false, + "finalReview": { + "sourceReplay": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/codex/dns/result.json", + "sourceReplaySha256": "ded728d019f784315f262b671d3f8eff4c7c7d08edfb12ab2cca4b5e6bc9cd75", + "manualControls": 2, + "supplementalControls": 1 + }, + "controlStatuses": [ + { + "width": 710, + "status": "unproven", + "runtimeErrors": [], + "controls": [ + { + "index": 0, + "label": "DNS lookup. Use left and right arrows to step.", + "pass": true, + "status": "live", + "reason": "Actual supported End frames change local-cache check to Connect to the website, highlighting the device/web-server link and changing the caption. Source explicitly supports End and sets the last sequence step; no autonomous animation exists.", + "mode": "key-End" + }, + { + "index": 1, + "label": "No cacheAt the resolverOn your device", + "pass": false, + "status": "dead", + "reason": "Native Home/Enter to End/Enter shows No cache then On your device, while dns.state.cache stays numeric0 and max stays3. Next twice clears selection and visits resolver/cache instead of device-cached route. Actual images confirm wrong route. Earlier automatic proof merely reset lookup step and did not prove cache selection.", + "mode": "primary" + }, + { + "index": 2, + "label": "step", + "pass": true, + "status": "live", + "reason": "stable output changed outside controls", + "mode": "drag" + }, + { + "index": 3, + "label": "Next \u2192", + "pass": true, + "status": "live", + "reason": "stable output changed outside controls", + "mode": "primary" + }, + { + "index": null, + "label": "What this model leaves out", + "pass": true, + "status": "live", + "reason": "Actual summary click expands the previously hidden explanatory paragraphs; read-only details.open changes false to true and actual PNGs show the new text.", + "mode": null + } + ] + } + ], + "source": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype/codex/dns/result.json", + "sourceSha256": "7e6c7bc11050021bcbfdcc2d40713f2dd6b4ee07939ecc7a1b44bfaecee43bdc", + "replay": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-final/codex/dns/result.json", + "replaySha256": "faec67559e6bcab3d50cbf43e836da6f908027bf962623ddae6412b44ecc9ee8", + "scorerCommit": "f009de5838f80b90e861e5727f0ad11cba8814f8" + }, + { + "revision": "prototype", + "provider": "codex", + "promptId": "database-index", + "model": "gpt-6.1-sol", + "scoreMs": 72354, + "cardVisible": true, + "allControlsProven": true, + "questions": { + "structured": [], + "textQuestions": [], + "count": 0, + "needsReview": false + }, + "progressShown": true, + "renderGraceUsed": false, + "renderDelayMs": null, + "renderGraceRetainedCard": false, + "finalReview": { + "sourceReplay": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/codex/database-index/result.json", + "sourceReplaySha256": "4d6ab849479b49e53e9141340cce52edb9019d9b754fd1640989d561db54b5fe", + "manualControls": 3, + "supplementalControls": 0 + }, + "controlStatuses": [ + { + "width": 710, + "status": "live", + "runtimeErrors": [], + "controls": [ + { + "index": 0, + "label": "Table tray; arrow keys change the target ID", + "pass": true, + "status": "live", + "reason": "Actual ArrowRight frames move the emphasized table row from ID 1 to ID 2 and update the query/route ID. The saved handler explicitly changes target and renders; source geometry is static otherwise. The very pale external text is a readability limitation, not a dead input.", + "mode": "drag" + }, + { + "index": 1, + "label": "B-tree indexFull table scan", + "pass": true, + "status": "live", + "reason": "Actual Access path change from B-tree to full scan emphasizes every table row and changes the route/count to checking 12 rows. This meaningful output is visible outside the selector, though the pale text contrast is poor.", + "mode": "primary" + }, + { + "index": 2, + "label": "123456789101112", + "pass": true, + "status": "live", + "reason": "Actual full-resolution frames show SELECT WHERE id = 1 changing to id = 2 and route text return ID 1 changing to ID 2 while in scan mode. All rows correctly remain emphasized for a full scan. The text is very pale but visibly changes; the saved target handler matches this output.", + "mode": "primary" + } + ] + } + ], + "source": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype/codex/database-index/result.json", + "sourceSha256": "8c340a84d3bed5ea3b2225e00c41170867c98ecb5b7bf666ee6d1628d68133a6", + "replay": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-final/codex/database-index/result.json", + "replaySha256": "19cc903fb56ba4846d263f9df8ed583a2eccac6a3886d213a493fe6a913614b3", + "scorerCommit": "f009de5838f80b90e861e5727f0ad11cba8814f8" + }, + { + "revision": "prototype", + "provider": "codex", + "promptId": "git-merge", + "model": "gpt-6.1-sol", + "scoreMs": 91108, + "cardVisible": true, + "allControlsProven": false, + "questions": { + "structured": [], + "textQuestions": [], + "count": 0, + "needsReview": false + }, + "progressShown": true, + "renderGraceUsed": false, + "renderDelayMs": null, + "renderGraceRetainedCard": false, + "finalReview": { + "sourceReplay": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/codex/git-merge/result.json", + "sourceReplaySha256": "9a88555a0509c24be36498aae6a3a108bf100b732769e8ea142bf262784ff0c5", + "manualControls": 1, + "supplementalControls": 1 + }, + "controlStatuses": [ + { + "width": 710, + "status": "unproven", + "runtimeErrors": [], + "controls": [ + { + "index": 0, + "label": "Different edits \u2192 clean mergeCompeting edits \u2192 conflictMain has no new commits \u2192 fast-forward", + "pass": false, + "status": "dead", + "reason": "Real select changes Clean merge to Fast-forward, but actual diagram, merge explanation and history remain Clean merge; params stays {}. String-array options do not match frozen option.value contract.", + "mode": "primary" + }, + { + "index": null, + "label": "What Git compares", + "pass": true, + "status": "live", + "reason": "Actual summary click expands the previously hidden explanatory paragraphs; read-only details.open changes false to true and actual PNGs show the new text.", + "mode": null + } + ] + } + ], + "source": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype/codex/git-merge/result.json", + "sourceSha256": "6659abcd90862d51c26abf0b185c2e6d240746eb5e6cd58891bfac872d810b2a", + "replay": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-final/codex/git-merge/result.json", + "replaySha256": "0ed8eba02f98c8fe606f8cb24a6de3ba0b56f1aa34adba245021aa24f5935f53", + "scorerCommit": "f009de5838f80b90e861e5727f0ad11cba8814f8" + }, + { + "revision": "prototype", + "provider": "codex", + "promptId": "websocket", + "model": "gpt-6.1-sol", + "scoreMs": 81707, + "cardVisible": true, + "allControlsProven": true, + "questions": { + "structured": [], + "textQuestions": [], + "count": 0, + "needsReview": false + }, + "progressShown": true, + "renderGraceUsed": false, + "renderDelayMs": null, + "renderGraceRetainedCard": false, + "finalReview": { + "sourceReplay": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/codex/websocket/result.json", + "sourceReplaySha256": "58fafd916565d91e6dcdd18b63f58e33ee5c2f4a6657a6b0a588bf610c5a7737", + "manualControls": 2, + "supplementalControls": 0 + }, + "controlStatuses": [ + { + "width": 710, + "status": "live", + "runtimeErrors": [], + "controls": [ + { + "index": 0, + "label": "Message journey", + "pass": true, + "status": "live", + "reason": "stable output changed outside controls", + "mode": "drag" + }, + { + "index": 1, + "label": "\u2190 Back", + "pass": true, + "status": "live", + "reason": "Next enables Back; click returns Send to Connection opened, moves packet back to sender and updates explanation.", + "mode": null + }, + { + "index": 2, + "label": "Next \u2192", + "pass": true, + "status": "live", + "reason": "stable output changed outside controls", + "mode": "primary" + }, + { + "index": 3, + "label": "What this model assumes", + "pass": true, + "status": "live", + "reason": "Actual summary click expands the previously hidden explanatory paragraphs; read-only details.open changes false to true and actual PNGs show the new text.", + "mode": "drag" + } + ] + } + ], + "source": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype/codex/websocket/result.json", + "sourceSha256": "4a5a064eab0a14f84d5b80cfc01e4cf63bf60d5db9d82aa9f066ce5cf36c39a8", + "replay": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-final/codex/websocket/result.json", + "replaySha256": "f6b8c709f39e7b18bffa8599a461dd5b4a6ebb23ec9799df83cd725c5489d879", + "scorerCommit": "f009de5838f80b90e861e5727f0ad11cba8814f8" + }, + { + "revision": "prototype", + "provider": "codex", + "promptId": "load-balancer", + "model": "gpt-6.1-sol", + "scoreMs": 80148, + "cardVisible": true, + "allControlsProven": true, + "questions": { + "structured": [], + "textQuestions": [], + "count": 0, + "needsReview": false + }, + "progressShown": true, + "renderGraceUsed": false, + "renderDelayMs": null, + "renderGraceRetainedCard": false, + "finalReview": { + "sourceReplay": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-v3/codex/load-balancer/result.json", + "sourceReplaySha256": "5e7b08e6f54782389e16ec5e40b4d2a1544e712f0b5b4c0d786d3a1e069584ec", + "manualControls": 2, + "supplementalControls": 0 + }, + "controlStatuses": [ + { + "width": 710, + "status": "live", + "runtimeErrors": [], + "controls": [ + { + "index": 0, + "label": "Requests sent", + "pass": true, + "status": "live", + "reason": "Drag changes requests 3 to 11, routes C to B, server counts 1/1/1 to 4/4/3 and route readout; meaningful output corroborates supported range input.", + "mode": "drag" + }, + { + "index": 1, + "label": "Routing rule", + "pass": true, + "status": "live", + "reason": "stable output changed outside controls", + "mode": "primary" + }, + { + "index": 2, + "label": "B marked unhealthy", + "pass": true, + "status": "live", + "reason": "stable output changed outside controls", + "mode": "click" + }, + { + "index": 3, + "label": "What the model represents", + "pass": true, + "status": "live", + "reason": "Actual summary click expands the previously hidden explanatory paragraphs; read-only details.open changes false to true and actual PNGs show the new text.", + "mode": "drag" + } + ] + } + ], + "source": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype/codex/load-balancer/result.json", + "sourceSha256": "632da9da1c5a17c953c1eac2371ff5b696ec152854eb10a969ee865fb2b68f6a", + "replay": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-reviewed-final/codex/load-balancer/result.json", + "replaySha256": "8323eb31ffbeb535d0e87e977ac5098a23ee383d01f2f3a5b86642ce658425cb", + "scorerCommit": "f009de5838f80b90e861e5727f0ad11cba8814f8" + } +] diff --git a/plugins/playgrounds/evals/launch/reports/gate-1/supplemental-control-adjudications.json b/plugins/playgrounds/evals/launch/reports/gate-1/supplemental-control-adjudications.json new file mode 100644 index 000000000..e12297514 --- /dev/null +++ b/plugins/playgrounds/evals/launch/reports/gate-1/supplemental-control-adjudications.json @@ -0,0 +1,219 @@ +{ + "rows": [ + { + "revision": "prototype", + "provider": "codex", + "prompt": "cdn", + "width": 710, + "label": "Model and real-world caveats", + "selector": "details > summary", + "verdict": "live", + "reason": "Actual summary click expands the previously hidden explanatory paragraphs; read-only details.open changes false to true and actual PNGs show the new text.", + "sourceReplaySha256": "82626a0e95d104eca2455528a68df908732bd1fae7d95c0256d30ff5449bf405", + "evidence": [ + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/05-codex-cdn-disclosure-before2.png", + "sha256": "15cbea2051109ff4f723e51c086261c38f5b13599a10a4b9610c6cfe18fc243d", + "role": "before2" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/05-codex-cdn-disclosure-after0.png", + "sha256": "f12fee8b505bad0eed78795d918e0e30f106f1d30e849dd2921f3693490e5c4f", + "role": "after0" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/pairs/05-codex-cdn-disclosure.png", + "sha256": "7b234f5de6626dc3e0dd43bc063a5661e7a7000ac3fc7713a78514f225ce4f8a", + "role": "visually inspected comparison" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/request-05-codex-cdn-disclosure.log", + "sha256": "ccc6297c3a09d0903656491a73a611b9dc6bfc749f3c47f770e9ca400a44bba4", + "role": "real input log" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/request-05-codex-cdn-disclosure.exit.json", + "sha256": "86feab459501ad8a6dc5aee757949bba553a25428028dc63bada032f1e57ff7d", + "role": "exit" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/replay-visual-review-codex-prototype.json", + "sha256": "16547345efee20bce0a5f962ea9fac13803b24ac756b00e05293b51796cdb45e" + } + ], + "inventoryOmission": true + }, + { + "revision": "prototype", + "provider": "codex", + "prompt": "umbrella", + "width": 710, + "label": "Which parts do what?", + "selector": "details > summary", + "verdict": "live", + "reason": "Actual summary click expands the previously hidden explanatory paragraphs; read-only details.open changes false to true and actual PNGs show the new text.", + "sourceReplaySha256": "679098d81ad5f331bf6e5954b5910c722e62ecf1fba15e33b0f2e4f2fb12ce05", + "evidence": [ + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/16-codex-umbrella-disclosure-before2.png", + "sha256": "39c04d0aa981441647feba10933567fdd6179c519474d57f120b68de3d7626fe", + "role": "before2" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/16-codex-umbrella-disclosure-after0.png", + "sha256": "e063295dc78fb7a5233673b3ef489bc7f22877fe62e5ad69d7571d4ff102c6fc", + "role": "after0" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/pairs/16-codex-umbrella-disclosure.png", + "sha256": "79dbf49513b404c9bdb7fd2a509d1663181ad9a027e90e4f4696de750dcb9069", + "role": "visually inspected comparison" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/request-16-codex-umbrella-disclosure.log", + "sha256": "8cf07276d16a7c2b180efc5acc43c1244c7dff43631f484d412ecdd13b404838", + "role": "real input log" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/request-16-codex-umbrella-disclosure.exit.json", + "sha256": "648f1210b61ceee59eddcc4598da4ae6b92c2554a1bc58ccc3184056bfee4490", + "role": "exit" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/replay-visual-review-codex-prototype.json", + "sha256": "16547345efee20bce0a5f962ea9fac13803b24ac756b00e05293b51796cdb45e" + } + ], + "inventoryOmission": true + }, + { + "revision": "prototype", + "provider": "codex", + "prompt": "door-lock", + "width": 710, + "label": "What moves the door bolt?", + "selector": "details > summary", + "verdict": "live", + "reason": "Actual summary click expands the previously hidden explanatory paragraphs; read-only details.open changes false to true and actual PNGs show the new text.", + "sourceReplaySha256": "1924bf1564ac33783e2ca9a3b49cb342f280c24af3ce8d3e90651953bef425fd", + "evidence": [ + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/17-codex-door-lock-disclosure-before2.png", + "sha256": "5845ce93a6acabf2baf36009d592aad8dfa89f82fc82ce9201b769c2a9f8f08f", + "role": "before2" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/17-codex-door-lock-disclosure-after0.png", + "sha256": "72b1a8130ed29f6861d982324ec1a43789da568c40aa88452b04481184a99406", + "role": "after0" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/pairs/17-codex-door-lock-disclosure.png", + "sha256": "0298869b61f199882b0e7fb2eda3d43f4d2228d9fa435a1cae6198b5509f025c", + "role": "visually inspected comparison" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/request-17-codex-door-lock-disclosure.log", + "sha256": "2ec9519c9a82fc02762486b9833dda7ab4116680b7987b4d3a4b4a1cd1d6c1fc", + "role": "real input log" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/request-17-codex-door-lock-disclosure.exit.json", + "sha256": "e374d48b596f4307618ba0ddf81fe84a6ce01ef600cbaddd6c09463685c02b29", + "role": "exit" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/replay-visual-review-codex-prototype.json", + "sha256": "16547345efee20bce0a5f962ea9fac13803b24ac756b00e05293b51796cdb45e" + } + ], + "inventoryOmission": true + }, + { + "revision": "prototype", + "provider": "codex", + "prompt": "dns", + "width": 710, + "label": "What this model leaves out", + "selector": "details > summary", + "verdict": "live", + "reason": "Actual summary click expands the previously hidden explanatory paragraphs; read-only details.open changes false to true and actual PNGs show the new text.", + "sourceReplaySha256": "ded728d019f784315f262b671d3f8eff4c7c7d08edfb12ab2cca4b5e6bc9cd75", + "evidence": [ + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/17-codex-dns-disclosure-before2.png", + "sha256": "19423c8ae637ae47bedf458f642ffd8ed7df83cf86bbff2230f58d75185ed05e", + "role": "before2" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/17-codex-dns-disclosure-after0.png", + "sha256": "0e087e72ac7594be44321abc46158bc58583a47727266ce1978649e0c76809d4", + "role": "after0" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/pairs/17-codex-dns-disclosure.png", + "sha256": "51f712371e82d04dcab5784ffa80a081b31d9fcb1b4edac55c52f33f71669a59", + "role": "visually inspected comparison" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/request-17-codex-dns-disclosure.log", + "sha256": "94260b65022cc497c4a9cb97bb79a68221103119c878062ef2c783397e4bde57", + "role": "real input log" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/request-17-codex-dns-disclosure.exit.json", + "sha256": "9fb4daa3ca10344af2c14dd661f888a4ad527c874ba29415a9a2dcff40950061", + "role": "exit" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/replay-visual-review-codex-prototype.json", + "sha256": "16547345efee20bce0a5f962ea9fac13803b24ac756b00e05293b51796cdb45e" + } + ], + "inventoryOmission": true + }, + { + "revision": "prototype", + "provider": "codex", + "prompt": "git-merge", + "width": 710, + "label": "What Git compares", + "selector": "details > summary", + "verdict": "live", + "reason": "Actual summary click expands the previously hidden explanatory paragraphs; read-only details.open changes false to true and actual PNGs show the new text.", + "sourceReplaySha256": "9a88555a0509c24be36498aae6a3a108bf100b732769e8ea142bf262784ff0c5", + "evidence": [ + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/17-codex-git-merge-disclosure-before2.png", + "sha256": "1610ddf848d31130ad41f86bb8e73884a2590f1c4fba611c7d920ac85b60ad58", + "role": "before2" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/17-codex-git-merge-disclosure-after0.png", + "sha256": "26a291543f319670abc80e820bece6ae54586352d2093ceb22fff5be0fbc11aa", + "role": "after0" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/pairs/17-codex-git-merge-disclosure.png", + "sha256": "3012106a0ee63a5c4f62f83fad04f6f6205faf882f93cbf302aca1ea01701415", + "role": "visually inspected comparison" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/request-17-codex-git-merge-disclosure.log", + "sha256": "0d2fd3f0724b91a78b5240afff8365df340570b9cd4cf06650772a132088e023", + "role": "real input log" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/prototype-manual-review/request-17-codex-git-merge-disclosure.exit.json", + "sha256": "cd31e24331111c1c165e9299c27e21e6f31201b945c9165062e8f86e9d1bd066", + "role": "exit" + }, + { + "path": "/home/bersabel/.bb/plugins/environment-git-worktree/host-data/worktrees/thr_vv8zgxmczt-1/bb-plugins/.launch/results/replay-visual-review-codex-prototype.json", + "sha256": "16547345efee20bce0a5f962ea9fac13803b24ac756b00e05293b51796cdb45e" + } + ], + "inventoryOmission": true + } + ] +} diff --git a/plugins/playgrounds/evals/launch/run.mjs b/plugins/playgrounds/evals/launch/run.mjs index a7496cb81..e1ac1e0cf 100644 --- a/plugins/playgrounds/evals/launch/run.mjs +++ b/plugins/playgrounds/evals/launch/run.mjs @@ -8,6 +8,7 @@ import { hasInk } from './pixels.mjs'; import { failureScore, providerSummary, resumeMismatch } from './metrics.mjs'; import { renderWindow } from './observations.mjs'; import { proofFixtures } from './fixtures.mjs'; +import { verifyIsolation } from './isolation.mjs'; let interrupted = false; process.on('SIGTERM', () => { interrupted = true; }); @@ -20,7 +21,7 @@ for (let i = 2; i < process.argv.length; i++) { if (!key.startsWith('--') || !process.argv[i+1] || process.argv[i+1].startsWith('--')) throw new Error(`Expected --option value: ${key}`); args[key.slice(2)] = process.argv[++i]; } -for (const key of ['url','host','out','label','plugin-root']) if (!args[key]) throw new Error(`Missing --${key}`); +for (const key of ['url','host','data-dir','out','label','plugin-root']) if (!args[key]) throw new Error(`Missing --${key}`); const base = new URL(args.url); if (!['127.0.0.1','localhost','[::1]'].includes(base.hostname)) throw new Error('Use a loopback isolated dev bb; production URLs are refused.'); const out = resolve(args.out), pluginRoot = resolve(args['plugin-root']); @@ -52,8 +53,9 @@ if (existsSync(manifestPath)) { } else writeFileSync(manifestPath, JSON.stringify(manifest, null, 2)); async function api(path, body, method = body === undefined ? 'GET' : 'POST') { + if (!['GET','HEAD'].includes(method)) await verifyIsolation(base, args['data-dir'], args.host); const response = await fetch(new URL(`/api/v1${path}`, base), { - method, headers: { 'content-type':'application/json' }, body: body === undefined ? undefined : JSON.stringify(body), signal: AbortSignal.timeout(30_000), + method, redirect: 'error', headers: { 'content-type':'application/json' }, body: body === undefined ? undefined : JSON.stringify(body), signal: AbortSignal.timeout(30_000), }); if (!response.ok) throw new Error(`${method} ${path}: ${response.status} ${(await response.text()).slice(0, 500)}`); const text = await response.text(); @@ -170,6 +172,7 @@ function summarize() { // checks the driver, real input dispatch, masking, image decoding, and output diff. const defaultModels = new Map(); const preflightDir = join(out,'preflight',String(Date.now())); mkdirSync(preflightDir,{recursive:true}); +save(join(preflightDir,'server-identity.json'), await verifyIsolation(base, args['data-dir'], args.host)); await api('/projects/proj_personal'); const plugins = await api('/plugins'); save(join(preflightDir,'plugins.json'),plugins); if (!JSON.stringify(plugins).includes('playgrounds')) throw new Error('Preflight: Playgrounds is not installed');