Date: 2026-10-13 · Scope: prototype/mind.html, prototype/standard.html, prototype/server.py, prototype/data/ets.sample.json (venue copy) · Inputs: the critique findings, the fixer's claims and skips, the code, and fresh pixels. The fixer's own report (fix-02-mind-standard.md) was not read.
Score for the group as shipped now: 86 / 100. The blocker (reported three times) is fixed; of the 21 major findings (duplicates merged), 20 are fixed and 1 is partial. Of the 32 fixer claims, 28 hold (two items inside claim 30 could not be observed), 3 are partial and the bundle of minors is mostly fixed. The open items are the interim head (decision 5), dock merges that are not reconciled with the final answer or cleared on error, the composition of the standard hero (phone placement, dock-open overlap, facts hairline), and a small coarse-pointer spacing regression.
| Item | Result |
|---|---|
| Port 8777 at start | Free (no orphan to stop) |
| Server | Started by the verifier: uv run --script server.py --pid-file <scratch>/server.pid (uv 74798, python 74801) |
--selftest |
scanner fuzz 400/400 ok · sanitizer ok (3 dropped ids, 3 dropped components; 4-component cap counts 2) · history echo ok · budget ok · history trust ok · digest 38,488 chars · exit 0 |
| HTTP guard matrix (raw sockets, no model calls) | 30 / 30 pass (section 6) |
| Live exchanges | 4 of 4 allowed: mind 1440 two turns in one session, mind 390 one turn, standard dock 1440 one turn. All outcome=ok, 2.5 to 4.2 s total, request ids logged, zero dropped ids or components |
| Everything else | Demo mode (?demo=1) or Playwright route mocks of /api/mind. A context-level route aborted any unmocked /api/mind call; the leak counter stayed 0 in every free script |
| Browser | Chrome for Testing (Playwright 1.64 alpha), headless, GPU on; 1440x900 at 2x and 390x844 at 3x with isMobile and hasTouch (pointer: coarse matched) |
| Pixels | 50 new screenshots (v2-mind-*, v2-standard-*), every one read before judging |
| Console and network | Zero console errors, zero failed requests and zero HTTP 4xx/5xx in every non-mocked context, including Google Fonts and the remote speaker photos. Mocked contexts show only the failures the mocks were built to cause (400, 429, 500, 503 health, client aborts) |
| Shutdown | SIGTERM to python 74801; python and uv both gone, lsof -iTCP:8777 -sTCP:LISTEN empty, pid file removed by the server's finally. No stray Chrome, node or server.py processes |
Two captures were taken during a smooth scroll and show the fixed bars displaced a few pixels (v2-mind-mock-unavailable-1440x900, v2-mind-mock-budget-1440x900, v2-standard-mock-venue-1440x900). This is a capture artifact; the settled re-capture v2-mind-unavailable-settled-1440x900 is the evidence for that state. v2-standard-hover-register-1440 shows the rest state; hover colours were read from computed styles.
| # | Decision | Status | Evidence |
|---|---|---|---|
| 1 | Fork copy per section 3.2 | Out of this group's files; present | All §3.2 strings are present in index.html. Nit: the unavailable door card in mind.html:684 says "Everything laid out — agenda, lineup, venue, tickets." (em dash, as in §3.2) while the fork in index.html:238 uses a colon. Make the two doors identical |
| 2 | Real dates | Landed, with a format gap | Real dates everywhere: mind opener "Austin, May 3–6, 2027."; venue card; standard hero. The standard hero line reads // may 3–6, 2027 · austin, tx (standard.html:340, lowercased at :473), not the decided lockup string // MAY 3-6, 2027 // AUSTIN, TX |
| 3 | Single accent --accent (#C1115A) |
Landed | No #e8a06a or ember literal in mind.html or standard.html. A computed-style scan of every element plus ::before, ::after and ::placeholder (colour, background, borders, outline, shadow, fill, stroke, gradients) found 0 ember values in 12 states: empty, demo answers, live answers, mocks, standard top, footer, dock open, demo merges, live merge, phone. Hovers: .cta and .btn-ink fill rgb(143,12,67); .link-ask hover accent-ink; footer links white with underline; reveal outline 1px rgb(193,17,90); busy dot rgb(193,17,90); realm glow rgba(255,243,232,.35); standard hero ::before is linear-gradient(#fafaf9, #fff) with no radial. Leftover for the orchestrator: shared.css still defines --ets-ember (aliased to raspberry) and --ets-sun: #e8a06a (realm lighting only) |
| 4 | Persona unnamed, sentence case, no exclamation marks, no film quotes | Landed | All four live replies comply, e.g. "Day 2 is Tuesday, May 4, built around AI and data, with parallel breakouts after lunch and an evening reception. Still sample sessions from ETS26." Labels read "ETS27 · the mind" and "the mind" |
| 5 | Mannequin cranium from the nose bridge up | Partial | Interim inline SVG in both routes (mind.html:263-297, standard.html:300-334): matte, soft shallow hollows, faint bridge, clean fog dissolve, no dark sockets, streaks or teeth shapes (v2-mind-head-1440). But the silhouette has parallel vertical sides and a full-width brow band, so at hero scale it reads closer to a capsule or helmet than a display mannequin (v2-standard-top-1440x900). The shader resculpt and baked still are deferred (accepted skip) |
| 6 | No head disc through content | Landed | #head opacity computes to 0 once live (mind.html:53); a 24x24 glyph shows in an opaque top bar (:63-73). No disc in v2-mind-after1-1440x900, v2-mind-after2-1440x900, v2-mind-live-venue-390x844 or any demo shot |
| 7 | Escape link on every component; sample markers kept | Landed | Mind: [ open the map: lineup | agenda | venue | tickets | partners ] and [ open the map ] for text blocks (mind.html:379-388). Dock: [ open page: X ] on sheet components; merged components get // filtered on the page · [ jump there ]. Sample markers on kit heads, section eyebrows, the facts strip and merge bars |
| Finding (duplicates merged) | Severity | Status | Evidence |
|---|---|---|---|
| Phone layout overflows: answers clipped, 726 px page, chips never scroll (3 reports) | Blocker | Fixed | Overflow probe after grid, day 2, partners, tickets and venue answers at 390 (demo) and the live venue answer at 390: scrollWidth 390 and no element outside the viewport. 1440 with a 300-character question: 1440. Chip rows are nowrap with overflow-x: auto (611 px content in a 358 px scroller). mind.html:60, 81-83, 102, 116, 220 |
| Head shows through rendered content as a grey disc (3 reports, decision 6) | Major | Fixed | See decision 6. Thinking is shown by the breathing accent dot and the glyph's think pulse (v2-mind-midstream-1440x900, v2-mind-mock-waiting-1440x900) |
| No per-component link to the standard-page equivalent (3 reports, decision 7) | Major | Fixed | Live: following the agenda link on the day 2 answer landed on /standard.html#panel-d2 with tue 4 selected and only panel-d2 visible (v2-standard-escape-landing-1440x900). #panel-d3 on load selects wed 5; a hashchange to #panel-d2 selects tue 4 |
| Retired ember in hover, reveal and thinking states | Major | Fixed (pages) | See decision 3. The shared.css alias cleanup belongs to the orchestrator |
| Nav wordmark styled as a partner tile | Major | Fixed | .nav .logo: border 0px none, Unbounded 800 with a 900 27; partner chips use .partner (standard.html:35, 122) |
| The mind is absent from the standard hero | Major | Partial | An SVG head now sits at the right third at 1440 (832 to 1355 px) with the 7 s breathe and a bottom mask. Not done: the baked shader still (deferred). New problems: the facts hairline crosses the head (v2-standard-top-1440x900); with the dock open, main gains 440 px of padding, the hero reflows and the head slides under the description and the numerals (v2-standard-dock-open-1440x900); on phones the head sits above the lockup rather than behind it (v2-standard-top-390x844) |
| Mobile menu: REGISTER overprints PARTNERS | Major | Fixed | Rows About 68, Lineup 112, Agenda 156, Venue 200, Partners 244, Register 304, each 44 px, with Register inside the list and the standalone link hidden. aria-controls="navList"; closes on a link and on Escape (focus returns to [ menu ]) (v2-standard-menu-390x844) |
| Hero numerals render at 16 px | Major | Fixed | 89.6 px at 1440 and 48 px at 390, weight 900 |
| New answer lands behind the sticky composer | Major | Fixed | Live turn 2: turn top at 96 px; the answer text sits fully between the top bar (70) and the composer (794). The demo sweep shows the answer visible every time. A wheel during a slow mocked turn left scrollY at 324, so the auto-scroll is skipped as claimed |
| Live regions announce too much and never the state | Major | Fixed | 0 aria-live on both pages and one role=status each. Status reads "Thinking", then the final answer plus a summary (e.g. "… Showing 12 speakers, sample data, 4 follow-up suggestions."), then the error line on failure. aria-busy is true only on the streaming turn |
| No timeout and no way to stop | Major | Fixed | Mind and dock: // one moment at 2.6 s, [ stop ] shown, stop and Escape both end on "Stopped." with send re-enabled. A 20 s hang gives the §4.7 quiet state with a door card, and the health re-probe restores the mind ("The mind is back.") within about 3 s. pagehide abort verified in code only (mind.html:745, standard.html:672) |
| Chips exposed as list items | Major | Fixed | Accessibility tree: group "Suggested questions" containing button "who's speaking" and so on, with no // in the names |
| Composer input has no visible focus indicator | Major | Fixed | .composer:focus-within gives a bottom border of rgb(193,17,90) plus a 0 1px 0 0 accent shadow, in both the mind and the dock (v2-mind-composer-focus-1440) |
| Page loses its only heading after the first question | Major | Fixed | A visually hidden h1 persists, then h2 per question, h3 kit heads and h4 names and titles |
| Dock is a dialog in name only | Major | Fixed | Closed: inert, visibility: hidden. Open: <aside aria-label="Ask the mind"> with no role=dialog and no aria-modal; main gets 440 px of right padding at 1440. Focus returns to the trigger after Escape and to Ask the mind → after [ close ] |
| On a phone the merged answer is hidden behind the sheet | Major | Fixed | After a merge the sheet collapses to a 57 px peek with the caption and [ expand ] (focused); the filtered lineup is visible; expand focuses the input, collapse returns to the peek (v2-standard-dock-peek-390x844) |
On desktop the dock covers merges and [ clear ] |
Major | Fixed | The merge bar's right edge is at 952 px and the dock starts at 1000; [ clear ] is the bar's first child |
| No main landmark; missing headings and lists | Major | Fixed | main#main wraps 6 sections; the hero is labelled by its h1; the lineup is ul > li with 77 h3; sessions are ol > li with 50 h3; venue cards use h3; the skip link reads "Skip to content" and targets #main |
| Sample markers missing | Major | Fixed | Eyebrows read the lineup · sample: ets26 stand-ins, four days · may 3–6 · sample: ets26 program, with thanks to · sample: ets26 partners. Facts read sessions · sample and so on. Merge bars end in · sample. Tickets carry no marker because the fixture marks them real |
| Proxy accepts any Host, Origin and text/plain, with no budget | Major | Fixed | 30/30 guard checks (section 6); budget in code and selftest; non-loopback bind refused without flags |
| Any failed request silently switches to demo answers | Major | Fixed | Live with the server up; ?demo=1 gives offline mode; a 503 boot probe gives offline mode. A runtime 400 resets the conversation (the next payload has 1 message and a new session id). A 429 budget gives the resting copy and a door card. session_full gives the fresh-start copy. A 500 in the dock gives the quiet state |
| A second page-backed component wipes the first | Major | Fixed | A mocked two-component answer left both merge bars in place (lineup 3 speakers, agenda 2 sessions on day 1); the next answer cleared both at the start, as claimed |
Minor and nit findings: see the claims table (row 32) and section 5. Status in short: fixed except the double hairline nit (partial), phone keyboard behaviour (code only, needs real devices) and the cached-prefix figure (not observable with a warm cache).
| # | Claim (abridged) | Status | Evidence |
|---|---|---|---|
| 1 | Phone overflow fixed; 390 stays 390, 1440 stays 1440 | Fixed | Section 3, first row |
| 2 | Head fades to 0; 24 px glyph in an opaque bar; accent dot and glyph pulse | Fixed | #head opacity 0; glyph 24x24; top bar opaque var(--bg) band then fade (v2-mind-topbar-scrolled-390x844 shows content passing cleanly under it); dot rgb(193,17,90); glyph animation think while busy |
| 3 | Escape link on every component; #panel-dN; day selected on load and hashchange |
Fixed | Section 3 |
| 4 | No retired ember; hovers use --accent-ink; halo rgba(255,243,232,.35); peach radial removed |
Fixed | Decision 3 |
| 5 | Interim SVG mannequin in the mind realm and the standard hero, in the slot a still needs | Partial | Decision 5 and the hero row in section 3 |
| 6 | Answer scrolls into view; scroll margin; 8rem padding; skipped after a visitor scroll | Fixed | Section 3 |
| 7 | One status region written three times; aria-busy on the streaming turn only |
Fixed | Section 3. Nit: the summary reads "Showing 1 speakers" for single items |
| 8 | AbortController, 2 s and 20 s states, [ stop ], Escape, pagehide |
Fixed | Section 3; pagehide verified in code only |
| 9 | Chips are buttons in a labelled group; // and > use CSS alt text |
Fixed | Turn heading name "where is it" without >; kit heading without //. Nit: .src::before{content:"// source: " / ""} also hides the word "source:", so screen readers hear the source line without its label |
| 10 | Composer focus-within hairline and shadow | Fixed | Section 3 |
| 11 | Hidden h1, h2 per question, h3 kits, h4 names |
Fixed | Section 3 |
| 12 | Demo only on request or a failed probe; §4.7 quiet state; re-probe; 400 and session_full reset; retry chip; unanswered turn popped | Fixed | Section 3. After two failed asks, the next payload had user,assistant,user with neither failed ask in it. The dock's quiet state has no door card, which is reasonable because the visitor is already on the map |
| 13 | Provisional components reconciled with the final answer; retired or removed on error | Partial | Mind: fixed. Provisional grid, venue and partners became final grid, tickets (still) and choices (still); an error removed the provisional grid; truncated retired it (.comp.retired). Dock: only sheet components are diffed (standard.html:753-760). Page merges are neither reconciled nor cleared. A provisional 3-speaker grid followed by a final 1-speaker grid left the page showing 3 under // showing 3 speakers. An invalid error after a merge left the lineup filtered, and the failed turn still says // filtered on the page · [ jump there ] (v2-standard-mock-error-after-merge-1440x900) |
| 14 | Partner tiles renamed .partner |
Fixed | Section 3 |
| 15 | Hero head at the right third; on phones 60 percent behind the lockup on a white gradient | Partial | Desktop yes. Phone: the head is 243 px wide (62vw) at the top (57 to 259 px); the copy starts at 361 px, so the head sits above the lockup and the gradient covers nothing |
| 16 | Mobile menu rows in flow incl. Register; 44 px; closes on link and Escape; aria-controls |
Fixed | Section 3 |
| 17 | Hero numerals clamp(3rem, 2rem + 4vw, 6rem) |
Fixed | 89.6 px and 48 px |
| 18 | Dock inert when closed, non-modal aside, 440 px padding, focus return | Fixed | Section 3. Side effect: the hero head overlap noted in section 5 |
| 19 | Phone peek bar with [ collapse ] and [ expand ] |
Fixed | Section 3 |
| 20 | [ clear ] leads the merge bar, clear of the dock |
Fixed | Section 3 |
| 21 | Main landmark, labelled hero, lists and headings, skip to content | Fixed | Section 3 |
| 22 | Sample markers on eyebrows, facts and the merge bar | Fixed | Section 3 |
| 23 | Merges clear once per answer; filter, reveal and materialize per §5.6; no duplicate grids; Escape clears then closes | Fixed | Demo and mock runs: speakers and sessions filter in place; venue and tickets reveal with a 2 s 1 px raspberry outline (gone after 2 s); text_block materializes in the sheet; no grid is duplicated in the sheet. The first Escape clears and focuses the input, the second closes and focuses the trigger. Live run (v2-standard-live-merge-1440x900): "who's speaking on day 2" filtered the lineup to 12 with [ clear ] // showing 12 speakers · sample |
| 24 | Host 421, Origin 403, Content-Type 415, Length 411/413, shape 400, remote bind gated | Fixed | Section 6. Nit (code reading, not exercised): ALLOWED_HOSTS.add(f"{host}:{PORT}") (server.py:1006) means --host 0.0.0.0 would answer every real client with 421, so a remote demo has to bind the literal address clients use |
| 25 | Budget 30 turns per 10 min and 80k output tokens per day, 429 with codes | Fixed (code and selftest) | Budget.admit and spend (server.py:491-526); selftest budget: ok; the client maps budget to the resting copy (mock). A live 429 was not exercised |
| 26 | Client assistant turns never trusted; reset notice; session_full |
Fixed | Selftest history trust: ok; live turn 2 reset=False from stored history; an 83-message body returns 400 session_full; the client shows // picking up fresh — … on a reset notice (mock) |
| 27 | At most 4 provisional components; say capped at 320 in stream and final |
Fixed (code and selftest) | server.py:626-638, 313-314; selftest: 6 components become 4, say is 320 characters |
| 28 | Fallback echo keeps blocks after the last fallback marker | Fixed | Selftest history echo: ok. Matches the API rule: thinking, redacted thinking and tool use before the final fallback block are omitted |
| 29 | 20 s socket timeout, strict length parsing, wrapped resolve, --pid-file validated, bind-first O_EXCL pid file unlinked in finally |
Fixed | Stalled client dropped at 20.0 s; 411 and 413 paths; traversal returns 404; --pid-file with no value exits with "needs a value"; a second instance failed at bind (Errno 48) and left the pid file untouched; the pid file was removed on SIGTERM |
| 30 | Heartbeat, top-level cache breakpoint (turn 2 read 19,300, wrote 288), measured prefix 19,327 logged, request id, refusal and reset on the turn line, status and error type only, no Python version, .py never served, MIME map, HEAD |
Fixed, two items unobserved | Live turn 2: cache_read=19300 cache_write=284. req=req_… on all four turns; refusal=- and reset= present; Server: ets27-proto/0.2; /server.py and the .pyc return 404; HEAD returns 200 with an empty body; MIME map in server.py:692-697. Not observed: heartbeat comments on the wire, and prefix_measured (still -, because the 1 h cache was already warm; turn 1 inputs 2 + 19,293 read + 34 written = 19,329, consistent with 19,327). Observation: turn 2's read stopped at the first user message because the surface system note was the last block in turn 1, so tail reuse should start at turn 3 |
| 31 | Venue visitor copy in the digest and both routes; internal note never reaches the model | Fixed | Digest venue lines: "Venue to be announced. Austin, Texas, May 3-6, 2027." and "Hotel block and travel details will be announced with the venue."; none of the 5 fragments of venue.note occurs in the digest; both routes render only the public copy (v2-mind-live-venue-390x844, v2-standard-venue-1440x900) |
| 32 | Minors (notation, nav, cards, composer, opener, phone nits, tabs, no-JS, shortcuts, placeholder, portraits, https, drafts, keyboard, 44 px, recede, sample kit, dock naming) | Mostly fixed | Fixed: five chips without question marks; bracket verbs; lowercase mono except nav; day tabs // mon 3; nav background: #fff with no backdrop filter; cards and tier columns transparent with · early and · standard titles; composer 1px solid; opener Unbounded 300 at 18 px; full tabs pattern (arrows, Home, End, roving tabindex, tabpanel with aria-labelledby); no-JS hrefs and noscript lines (v2-mind-nojs-390x844, v2-standard-nojs-1440x900); / scoped (no modifiers, IME or editable targets) with a [ shortcuts off ] toggle stored in localStorage that persists; dock placeholder rgb(100,99,95); portraits alt="" with no-referrer; 0 http:// URLs in the fixture; drafts from sessionStorage (key removed, nothing sent) and ?q= (stripped, other parameters kept, nothing sent); 44 px coarse-pointer targets; receded turns at 0.74 that return to 1 on hover; session kit · sample; dock trigger and close labels. Partial: the 73 px scroll margin (double hairline remains, section 5); the 44 px change introduced the // spacing regression (section 5). Not verifiable headless: interactive-widget and visualViewport keyboard padding (code present, mind.html:5, 764-768) |
Fixer skips: accepted as recorded. Baked still deferred; shared.css left to the orchestrator; sticky day tabs skipped; phone dock is non-modal by design; done-event telemetry kept; photos not self-hosted; count_tokens replaced by first-turn logging; real-device keyboard; cross-day session lists (rows filter in every panel and only the selected day shows); reveal outlines the section; remote bind not exercised.
| Severity | Issue | Evidence | Suggested fix |
|---|---|---|---|
| Minor | Dock merges are not reconciled with the final answer and not cleared on error (claim 13) | Section 4, row 13 | In the dock's finally: on a failure, call clearMerges(false) and drop the turn's .note elements; on success, if any page-backed final component differs from what was merged, re-run clearMerges and mergeIntoPage from finalAnswer.ui |
| Minor | Opening the dock on desktop pushes the hero copy under the absolutely positioned head | v2-standard-dock-open-1440x900, v2-standard-dock-waiting-1440x900: the head sits behind the description and the numerals |
Hide or fade .hero-head under body.dock-open at 821 px and wider, or position it relative to the padded content box |
| Minor | The facts hairline runs across the hero head | v2-standard-top-1440x900: the rule at about 615 px CSS crosses the forehead |
Stop the rule at the copy column (max-width: 58%) or give the head a higher stacking layer with the fog mask |
| Minor | On phones the hero head sits above the lockup, not behind it (claim 15, design §8) | Section 4, row 15 | Pull the copy up under the head, for example with a negative top margin about equal to the head's lower 40 percent, and keep the white gradient |
| Minor | Standard hero date line is not the decided lockup string (decision 2) | standard.html:340, 473 |
Render // MAY 3-6, 2027 // AUSTIN, TX with .tag--caps, as shared.css reserves it |
| Nit (regression) | On coarse pointers, chips and day tabs lose the space after //: //who's speaking, //mon 3 |
Round-1 mind-empty-390x844 shows // who's speaking?; now v2-mind-empty-390x844, v2-standard-agenda-390x844, v2-standard-dock-expanded-390x844. Cause: display: inline-flex (mind.html:224, standard.html:249) makes ::before a flex item and its trailing space collapses |
Add margin-right: .5ch to .chip::before and .daytab::before, or use gap on the flex chip |
| Nit | The double hairline under the sticky nav persists | Phone: the 73 px scroll margin against a 56 px nav leaves a 17 px band between two rules (v2-standard-dock-peek-390x844, v2-standard-agenda-390x844). Desktop deep-link landing on #panel-dN: rules at 72 and 74 px with a 1 px gap (pixel rows 144 to 149 of v2-standard-escape-landing-1440x900). A nav click lands correctly |
scroll-margin-top: var(--nav-h) on sections, with --nav-h already 56 px under 720 px; have applyHash scroll the section with the same margin |
| Nit | Summary grammar: "Showing 1 speakers" | Mock drift run in the dock; same code in mind (summarize) |
Pluralize on count |
| Nit | The word "source:" is hidden from assistive tech | Section 4, row 9 | Use content: "// " / "" for the slashes and put source: in the DOM text |
| Nit | The door explainer is punctuated differently in the fork and in the mind | Decision 1 | Use one string |
| Nit | --host 0.0.0.0 would answer every remote client with 421 |
Section 4, row 24 | Accept a --public-host value, or add the request's real interface address |
| Pre-existing (not a regression) | Names in speaker grids sit at uneven heights | Round-1 mind-after2-1440x900 and standard-dock-1440x900 show the same |
.sc{align-content:start} |
| Pre-existing (not a regression) | With the dock open on desktop, the nav Register sits under the dock | Round-1 standard-dock-1440x900 shows the same |
Pad the nav .wrap by the dock width under body.dock-open |
GET / → 200 with Server: ets27-proto/0.2 · Host localhost:8777 → 200 · Host evil.example:8777 → 421 · Host 127.0.0.1:9999 → 421 · /server.py → 404 · /__pycache__/server.cpython-314.pyc → 404 · /..%2fbrief/design-direction.md → 404 · /../brief/design-direction.md → 404 · HEAD /mind.html → 200, Content-Length 49135, empty body · fixture served as application/json · .js served as text/javascript · /api/health → 200. POST: foreign Origin → 403 · wrong-port Origin → 403 · foreign Host → 421 · text/plain → 415 · no Content-Type → 415 · chunked with no length → 411 · non-numeric length → 411 · length 0 → 413 · length 300000 → 413 · invalid JSON → 400 · JSON array → 400 · ends with assistant → 400 bad_request · bad mode → 400 · 2001-character message → 400 · 83 messages → 400 session_full · truncated body → 400 · stalled client dropped after 20.0 s. CLI: --pid-file with no value → "--pid-file needs a value"; --host 0.0.0.0 without flags → "a non-loopback --host needs --allow-remote and --token T"; second instance → OSError: [Errno 48] Address already in use, pid file untouched.
Live turn lines (no message text is logged by design):
turn session=mind-b1g5mexf mode=mind turns=1 outcome=ok req=req_011Cfz5Jytpsf5Mkh4CYye4G reset=False in=2 cache_read=19293 cache_write=34 out=250 first_ui=3280ms total=3689ms
turn session=mind-b1g5mexf mode=mind turns=2 outcome=ok req=req_011Cfz5KMwPfNBqe9PTtLvqT reset=False in=4 cache_read=19300 cache_write=284 out=366 total=3889ms
turn session=mind-afzr74uj mode=mind turns=1 outcome=ok req=req_011Cfz5L9WZ98sGUMdv5gk6o reset=False in=2 cache_read=19293 cache_write=32 out=108 total=2482ms
turn session=std-l404snoa mode=standard turns=1 outcome=ok req=req_011Cfz5npyay9cYyzK28QiGe reset=False in=2 cache_read=19293 cache_write=65 out=244 total=4231ms
Improvements confirmed against mind-empty-1440x900, mind-after2-1440x900, mind-empty-390x844, standard-top-1440x900, standard-dock-1440x900 and standard-dock-390x844:
Regressions in areas the fixer did not claim: the coarse-pointer // spacing (nit) and the dock-open hero overlap (minor, a side effect of claim 18). No other regressions found.
Start from 100:
| Deduction | Reason |
|---|---|
| −6 | Decision 5 still interim, and the head reads partly as a capsule or helmet |
| −3 | Dock merges not reconciled or cleared on error |
| −3 | Standard hero composition: phone placement, dock-open overlap, facts rule across the head |
| −2 | Nits and the small spacing regression |
The blocker and 20 of 21 majors are verified fixed from pixels or live behaviour, with zero console or network errors: 86 / 100.
prototype/shots/:
v2-mind-empty-1440x900, v2-mind-empty-390x844, v2-mind-head-1440, v2-mind-composer-focus-1440, v2-mind-midstream-1440x900, v2-mind-after1-1440x900, v2-mind-after2-1440x900, v2-mind-recede-hover-1440x900, v2-mind-live-venue-390x844, v2-mind-demo-grid|day2|partners|tickets|venue-390x844, v2-mind-demo-longq-1440x900, v2-mind-demo-after2-1440x900, v2-mind-topbar-scrolled-390x844, v2-mind-nojs-390x844, v2-mind-mock-reconcile|budget|waiting|unavailable-1440x900, v2-mind-unavailable-settled-1440x900v2-standard-top-1440x900, v2-standard-top-390x844, v2-standard-lineup|agenda|venue|register|partners|footer-1440x900, v2-standard-hover-register-1440, v2-standard-escape-landing-1440x900, v2-standard-dock-open-1440x900, v2-standard-dock-waiting-1440x900, v2-standard-demo-merge-1440x900, v2-standard-demo-merge-agenda-1440x900, v2-standard-demo-reveal-tickets-1440x900, v2-standard-mock-multimerge|venue|error-after-merge|unavailable-1440x900, v2-standard-live-merge-1440x900, v2-standard-menu-390x844, v2-standard-agenda-390x844, v2-standard-footer-390x844, v2-standard-dock-open|peek|expanded-390x844, v2-standard-nojs-1440x900