mirror of
https://github.com/pbakaus/impeccable.git
synced 2026-09-21 02:26:31 +03:00
codex/release-signed-bundle-cli
24
Commits
| Author | SHA1 | Message | Date | |
|---|---|---|---|---|
|
|
e2ff625b63 |
The Rust engine: one binary replaces every script and the JS detector, fully open (#714)
* Add oracle harness: verb goldens and function-level vectors
Records stdout/stderr/exit/files for every impeccable verb over a fixed
corpus and replays them against an alternate implementation. Adds a loader
hook that captures per-function call vectors from the pure engine modules.
Prepared with AI assistance (Claude Code).
* Oracle: hook, hook-before-edit, hook-admin cases and goldens
Prepared with AI assistance (Claude Code).
* Add docs/CLI-CONTRACT.md: observable behavior of every impeccable verb
Prepared with AI assistance (Claude Code).
* Oracle: context/doctor/pin/surface-brief/critique/palette/embed/signals/csp/seed/genimg/question cases and goldens
Prepared with AI assistance (Claude Code).
* Oracle: live-mode cases and goldens (roots, inject, wrap, insert, accept, session, manual edits, daemon)
Prepared with AI assistance (Claude Code).
* Oracle: mask the binary path before HOME; export launcher env to the binary
Prepared with AI assistance (Claude Code).
* detect: set process.exitCode instead of exiting after the final write
process.exit() right after a large piped stdout write truncated JSON output
at the pipe buffer boundary; found by the oracle harness. Re-record the six
directory-scan goldens that had captured the truncation.
Prepared with AI assistance (Claude Code).
* Oracle: normalize the hook-admin command in both runtimes' forms and audit chars
Prepared with AI assistance (Claude Code).
* Skill text: invoke the impeccable launcher instead of node scripts
Every `node {{scripts_path}}/<name>.mjs` becomes `{{scripts_path}}/impeccable <verb>`
(context-signals -> signals, hook-admin -> hooks). Setup step 1 drops Node, points
Windows shells without sh at impeccable.cmd, and says the launcher runs a
self-contained binary. allowed-tools follows.
Prepared with AI assistance (Claude Code).
* Scripts dir: replace the Node scripts with the impeccable launcher
skill/scripts keeps command-metadata.json and the page JS; every .mjs entry
point, lib/, and live/ are gone (the binary owns those verbs). Adds the POSIX
launcher, impeccable.cmd, VERSION (copied from the new root ENGINE_VERSION),
scripts/fetch-engine.mjs (bun run fetch:engine) to pull the pinned binary
into skill/scripts/bin/<os>-<arch>/, and gitignores that bin dir.
Prepared with AI assistance (Claude Code).
* Build: ship the launcher instead of bundling the JS engine
readSourceFiles no longer copies cli/engine into the skill; the scripts
payload is the launcher (executable bit preserved through dist, plugin/, and
universal.zip), impeccable.cmd, VERSION (synced from ENGINE_VERSION on every
build), the page JS, and command-metadata.json. Hook manifests call
`<scripts>/impeccable hook` behind an existence guard (Codex adds a
commandWindows sibling calling impeccable.cmd; Cursor runs hook-before-edit;
GitHub keeps the git rev-parse form; Grok mirrors Claude); the Node probe and
systemMessage notice are gone. build:release fetches the pinned engine for
every target (lenient) and stages bin/<os-arch>/ into the dist skill copies
after root harness dirs and plugin/ were synced, so git-delivered trees stay
launcher-only. The detection-rule count check reads the vendored
extension/detector/antipatterns.json and is skipped when absent.
build:browser is a stub; the codex prefix rewrite leaves
`{{scripts_path}}/impeccable` alone.
Prepared with AI assistance (Claude Code).
* CLI: turn the impeccable npm package into a platform-binary shim
cli/engine, cli/lib, and cli/bin/commands are gone; their behavior lives in
the engine binary. cli/bin/cli.js now resolves the binary from IMPECCABLE_BIN,
the @impeccable/cli-<os>-<arch> optional dependency (templates under
cli/platform-packages/, published by the engine release), the
~/.impeccable/bin/<version>/ cache, or a checksum-verified download, and
execs it. package.json drops the engine dependencies and the library
exports; puppeteer moves to devDependencies for the icon scripts.
README.npm.md describes the shim.
Prepared with AI assistance (Claude Code).
* Tests: gate behavior on the oracle and the engine binary
Unit tests of the deleted Node scripts and the JS detector are removed;
their behavior is pinned by tests/oracle goldens (frozen JS behavior plus
reviewed deltas) and the engine's own tests. tests/oracle.test.mjs replays
the corpus against the binary (IMPECCABLE_BIN or skill/scripts/bin/<target>/,
via tests/lib/engine-bin.mjs) and skips cleanly without one; the framework
fixture sweep drives live-inject, live-wrap, and detect-csp through the
binary the same way. record.mjs learns --bin. The function-level vectors
under tests/oracle/vectors/calls are committed as the frozen snapshot they
can no longer be regenerated from. Suites: core trimmed to build and
transformer tests, oracle added to the default run, detector/live reduced to
packaging and reference checks, the live-e2e helper tests move to the opt-in
live-e2e lane pending its retarget, cli-remote-e2e is an empty placeholder.
Prepared with AI assistance (Claude Code).
* Docs: describe the launcher, the engine pin, and the oracle gate
CLAUDE.md gains an Engine binary section (launcher lookup order, ENGINE_VERSION,
untracked binaries, how tests get one, the oracle as behavior gate, what stays
JavaScript) and drops the Node-script and JS-detector descriptions; the CLI
and detection-rule sections point at the shim and the engine repo. README.md
states the skill needs no runtime and lists the launcher-based hook commands;
AGENTS.md follows. CLI-CONTRACT.md's intro notes the scripts it quotes are
the recorded source, not the tree.
Prepared with AI assistance (Claude Code).
* Tests: tighten the hook command guard assertion
Prepared with AI assistance (Claude Code).
* Oracle: re-golden 46 cases for the engine's own command names; record them in DELTAS.md
Prepared with AI assistance (Claude Code).
* Build: ship launcher-only release zips by default
IMPECCABLE_BUNDLE_ENGINE=1 opts in to staging the engine binaries into the
dist skill copies. Bundling every target into every provider copy put
dist/universal.zip near 340 MB, past the 25 MB Cloudflare Pages file cap
that impeccable install downloads through.
Prepared with AI assistance (Claude Code).
* Tests: drive the live-e2e orchestrator through the engine binary
The session, fake-agent loop, steer test, and manual-edit probe spawn
<binary> <verb> (live-server, live, live-inject, live-wrap, live-insert,
live-accept, live-poll, live-complete) resolved by tests/lib/engine-bin.mjs
instead of node skill/scripts/live-*.mjs; the completion typing the agent
imported from the deleted live/completion.mjs is a small local helper. The
live-e2e helper unit tests move back into the default live suite (the steer
loop skips without a binary).
Prepared with AI assistance (Claude Code).
* Tests: run new-work-e2e through the engine's serve-question and generate-image verbs
Prepared with AI assistance (Claude Code).
* Tests: point the skill-behavior harness at the launcher and engine binary
The bash tool exports IMPECCABLE_BIN so the staged skill's launcher runs
without a download; scenarios assert on 'impeccable context' instead of
context.mjs and skip without a binary.
Prepared with AI assistance (Claude Code).
* Tests: note what plugin-e2e validates before and after the generated-output sync
Prepared with AI assistance (Claude Code).
* Oracle: record the engine's 'wasm-unsafe-eval' CSP meta patch as a reviewed delta
Prepared with AI assistance (Claude Code).
* Rebase reconciliation: fold main's post-freeze work into the swapped tree
The rebase onto origin/main brought changes whose JS engine halves left the
tree with the swap. This commit reconciles what survives:
- Suite map: register main's comp-fidelity unit tests (build-phase,
comp-diff, font-match, hero-checks) in the core suite and
live-browser-ignores in the live suite.
- Payload guard: the skill scripts payload now allowlists the comp-fidelity
build pipeline (comp-spec/comp-diff/build-phase/font-match and their libs),
the one Node toolchain that has not moved into the engine.
- Drop skill/scripts/live/project-ignores.mjs, lib/live-path-globs.mjs, and
their test: they import hook-lib/live-inject/impeccable-paths, which the
swap deleted, and their consumer (the JS live server) is the engine now.
- skill text: the comp pipeline's calls to engine verbs (generate-image,
embed-prompt) use the launcher spelling.
- Oracle: re-record 17 detect goldens over the fixture set main changed
(oklch #592, color-mix #578, 1D grid #615, the two comp-fidelity rules)
and record the gap in DELTAS.md; those JS rule changes are not yet ported
to the engine, and the goldens pin its current behavior.
bun run test (oracle included) and bun run build are green on this tree.
AI-assisted change: implemented with Claude Code.
Co-Authored-By: Claude <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01WaJv2c4oN8wS7Ttq4XRqyx
* Launcher: engine-probe PATH validation, working .cmd download path; CI: drop stale path, add oracle job
Byte-identical copies of the engine repo's launchers (engine main
af7572c): the retired 3.x npm CLI on PATH or in ~/.impeccable/bin is
rejected by the engine-probe handshake instead of hijacking every verb;
impeccable.cmd's download path is rewritten as straight-line goto flow
(the parenthesized blocks expanded %url%/%cached% at parse time, making
it dead code) with certutil sha256 verification and a windows-arm64 ->
x64 asset fallback; the final error points at the release download
instead of npm i -g (npm still serves the 3.x CLI).
ci.yml: the generated-output check no longer diffs the deleted
cli/engine/detect-antipatterns-browser.js, and a new oracle job fetches
the pinned engine (bun run fetch:engine) and replays tests/oracle/
against it. The job is continue-on-error with a loud warning until the
first engine release exists; flipping it to required is a release-time
toggle, documented in the workflow.
Verified here: sh -n on both launcher copies, bun run build green, full
oracle replay against the rebuilt engine binary green (770 pass, 0
fail), and a launcher behavior test proving a fake 3.x CLI on PATH is
skipped while the download + checksum chain completes against a local
file server.
Prepared with AI assistance (Claude Code).
* Oracle: restore detector goldens to post-fix behavior after the engine ports
The Aug 17-31 detector fixes (oklch parsing, color-mix nested hex, 1D grid
pass, comment stripping, root-relative linked stylesheets, URL userinfo
redaction, inert ignore-value refusal) and the comp-fidelity rules
organic-clip-path / buried-raster are ported to the engine. Re-records the
gap-pinning detect goldens from the fixed binary (glow.html included: its
.photo-opaque-grad column now carries the buried-raster finding it was
written for), replays the frozen checkHtmlPatterns call vectors through the
last JS engine state in history (db1462b9^; args untouched, 14 of 101
results moved), and rewrites the DELTAS gap section into the landed-ports
note. Each re-recorded json fixture golden byte-matches that JS state's
output; oracle: 770 pass, 0 fail.
Prepared with AI assistance (Claude Code).
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01WaJv2c4oN8wS7Ttq4XRqyx
* Oracle: pin the Aug 17-31 verb fixes ported to the Rust engine
New cases: hook-session-grok-edit-then-stop (Grok Build camelCase envelope,
end_turn/shutdown/stopHookActive Stop handling,
|
||
|
|
6dd15238c4 |
Close the comp-round gap and make the hero gate teach
concept-seed's choice ping now prints the next mandatory step from the recorded build path (comp-led: build-phase.mjs start --direction <key>), because every run that skipped the comp round did so right after that ping. build-phase gains a comps phase ahead of spec (three sidecar'd comps under .impeccable/mocks/, one approved) and records the approved comp on close. The hero gate lists the worst region crops first with the fix class per verdict, and refuses a third value-only attempt on the same stuck region. Hero instruction is plates first, then the semantic layer. The finish reviewer treats a comp-led build with no closed comps phase as a material finding. AI-assisted (Claude). Co-Authored-By: Claude <noreply@anthropic.com> |
||
|
|
34ef9ac2c4 |
Rewrite the comp-led build around the phase gates; reviewer reads the diff first
new-work.md section 6 becomes the spec / plates / hero / sections / motion / responsive phase list, each closed by build-phase.mjs advance; the reproduction and hero-checkpoint prose that asked the model to compare from memory is gone. visualize.md's inventory, medium gate, and produce sections collapse into the spec and plate mechanism. The finish reviewer takes the state file and comp-diff reports as inputs and starts its fidelity matrix from the measured verdicts. docs/COMP-FIDELITY.md records the design. AI-assisted (Claude). Co-Authored-By: Claude <noreply@anthropic.com> |
||
|
|
e9c62278c1 |
Make the code-led GROUND fallback deterministic, compare like for like
The quality bar leaves the color-authority chain (it arrives as card image paths and never governs composition). With no comp, a color OWN-WORLD names is the target; when it names none, the review states there is no GROUND authority instead of inventing a target. The build side of the numeric comparison now samples the same way each record was taken: patch average against patch average, gradient ends against gradient ends. AI-assisted change (Cursor), prepared under maintainer direction. Co-authored-by: Cursor <cursoragent@cursor.com> |
||
|
|
79c648a9ab |
Resolve bot review: code-led GROUND authority, sampling rules, tolerance
GROUND no longer lapses silently on code-led builds: with no comp to sample, the authority is the colors OWN-WORLD and the quality bar name, and no invented target beyond them. Non-uniform fields get sampling rules (interior pixel, patch average for texture, both ends of a gradient, never an edge), and the numeric comparison gets tolerance semantics so render noise never fails a faithful build. The hunt hint names the dark-ground prior beside the light one. AI-assisted change (Cursor), prepared under maintainer direction. Co-authored-by: Cursor <cursoragent@cursor.com> |
||
|
|
9213bf1511 |
Generalize color sampling beyond the cream-ground case
Accents join the sampled record alongside ground and dominant fields, every recorded color (not only the ground) is compared by number during the build, and the light-ground-only rationale clauses become value-neutral so dark and saturated comps get the same protection. Rule anchor renamed to skill-color-by-number to match its scope. AI-assisted change (Cursor), prepared under maintainer direction. Co-authored-by: Cursor <cursoragent@cursor.com> |
||
|
|
5b7c9e93cb |
Fix uncaught ground-color drift on comp-led builds
Sample the approved comp's ground and dominant-field hexes into the brief (visualize.md), judge the built page's ground by number against that record including the net value under textures (new-work.md), and make GROUND a mandatory fidelity-matrix row beside TYPE and MATERIAL (finish reviewer). Pre-comp palette chips are retired at approval. AI-assisted change (Cursor), prepared under maintainer direction. Co-authored-by: Cursor <cursoragent@cursor.com> |
||
|
|
49d8cbff16 |
Comp-fidelity review discipline + conciseness pass on core references (#586)
* Comp-fidelity review discipline + conciseness pass on core references Process fixes derived from a real Codex session (Hanasaku landing page) where a build drifted wholesale from the approved comp and still shipped under a reviewer pass: - finish reviewer: new Evidence check (check 0) with a fourth disposition, recapture, for malformed screenshots; a review on invalid evidence binds nothing and owes a full re-review, not a verdict pass - finish reviewer: verdict passes exit scoring mode when recaptures fail check 0 or when the packet carries user-supplied screenshots that contradict a prior verdict (those force a fresh full review); a ship earned in a verdict pass covers the scored fixes, not the whole surface - new-work: capture-validity rules (settle entrance motion, capture from document top, comp comparison at comp dimensions, open every file once before sending); user's actual viewport joins the inspected sizes - new-work: hero checkpoint now writes .impeccable/review/hero-repro.png and the reviewer verifies it exists under Persistence - new-work: comp authority is explicit (only the user can downgrade it); handoff reports the verdict at its actual scope; user evidence reopens a full review; documenter re-runs when fixes land after documentation - craft-floor: Refuse entry for geometric masks approximating organic photographic contours (the circular-cutout failure) - editorial conciseness pass over new-work.md, visualize.md, and both agent files: tighter sentences, no dropped rules, all rule markers and mechanical tokens preserved Assisted-by: Claude Code * fix: define the ship disposition in new-work's action paragraph Copilot review finding: the paragraph claimed exactly four disposition words but defined only recapture, rebuild, and fix. Assisted-by: Claude Code * fix: rebuild returns get a full review; recapture return shape in preamble Cursor Bugbot findings: - a return following a rebuild directive is now a fresh full review on both sides of the contract, never a verdict pass, so a wholesale rebuild cannot earn a scoped ship on the directive alone - the turn-ceiling preamble now names the recapture return shape instead of contradicting it with "the five sections" Assisted-by: Claude Code * fix: absent required captures fail the evidence check Greptile finding: a packet with no desktop.png/mobile.png (or missing native device-class captures) routed to the missing-input notice and could still reach ship. A required capture that is absent now fails check 0 exactly like a malformed one and forces recapture; the missing-input allowance in the preamble excludes captures. Assisted-by: Claude Code * fix: user-viewport capture is a required, named input to the review Greptile finding: the evidence gate hard-coded web requirements to desktop.png and mobile.png, so a reported user viewport could join the inspected set and still ship uncaptured. The parent now saves it as user-<width>.png and names every inspected viewport required in the packet; check 0's required set includes every brief-named capture. Assisted-by: Claude Code |
||
|
|
19786e7a22 |
Native leg for the verify-and-review pipeline (#546)
* Give the verify-and-review pipeline a native leg The build-verify-review loop assumed a browser end to end while the comp side of the system was already platform-aware: new-work.md, visualize.md, and the asset producer all comp a native app portrait at its device viewport, and then the verification steps asked for desktop and mobile browser screenshots of it. Concretely: - new-work.md step 7 ordered detect.mjs on every hookless build with no platform guard. routing.md declares the detector web-only and the design hook skips native projects, so a native build was always hookless and always ordered to run an HTML rule engine over Swift/Kotlin/RN code. The playbook now guards it: web-only, and on native the reviewer's floor check is the named slop gate. - The inspection round and the SKILL.src.md batched-round principle named desktop and mobile as the only viewports. Both now map per platform: web keeps desktop and mobile; native inspects the shipped device classes per OS, captured from the simulator or emulator. - ios.md and android.md carried no verification guidance at all, so nothing told a native run how to produce the screenshots the evidence chain depends on. Each gains a Verifying the build section: simctl / adb capture commands, dark-appearance and type-scale checks, and the simulator-vs-hardware honesty line. - The finish reviewer judged native builds blind: it never runs context.mjs and its packet carried no platform guidance. On native the packet now includes the platform reference path(s) and a no-detector-ran line, and the reviewer's Input Contract says to judge in the platform's conventions. Assisted-by: Claude Code * fix: address PR review bot findings - greptile: carry the capture's device selector through the state-changing verification commands (simctl appearance, adb uimode and font_scale); unqualified forms fail with several targets attached - Copilot: align new-work.md's cross-reference with the actual heading (Verifying the build) - Copilot: give the finish reviewer's Input Contract the native filename example new-work.md establishes (phone.png / tablet.png, suffixed per OS on adaptive) Assisted-by: Claude Code * fix: identify simulators by UDID, not display name greptile follow-up: display names can collide across booted simulators, so the capture and appearance commands now both key on the UDID from simctl list devices booted. Assisted-by: Claude Code |
||
|
|
045865918a |
Held for review: agent placeholder substitution, reviewer recapture contract, base-directory script form (#544)
* Resolve {{scripts_path}} in the agent bodies Codex ships
Three code paths emit an agent body: the degraded fallback reference, the
.toml nested inside the skill for Codex, and the native agent file. Only the
nested .toml skipped placeholder substitution and rule-marker stripping, so
the codex and .agents dists shipped `node {{scripts_path}}/embed-prompt.mjs`
verbatim in the asset producer, and every caller had to substitute the token
itself at load time.
All three now render through renderAgentBody(), and the new regression test
asserts a runnable embed-prompt command on each emitted surface plus a
synthetic agent proving markers and placeholders resolve in the nested .toml.
Prepared by an AI agent (Claude Code) under pbakaus's instruction.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
* Give the finish reviewer's screenshots one fixed address
The Input Contract asked for "desktop and mobile screenshot paths captured by
the parent" and named none, so each session invented a filename and the
verdict pass went looking for a recapture that was never written there. Two
reviewer passes burned on that in the eval runs.
The parent now captures and recaptures to .impeccable/review/desktop.png and
.impeccable/review/mobile.png, and the reviewer reads those two first,
treating a brief-named path as the fallback for a parent that wrote elsewhere.
Prepared by an AI agent (Claude Code) under pbakaus's instruction.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
* Lead Setup with the base directory the runtime reports
The rendered claude and codex skills opened with
`node .claude/skills/impeccable/scripts/context.mjs`, a project-relative path
that resolves in this repo and in nothing a user installs: a personal or
plugin install puts the scripts outside the project entirely. The working form
was already in the text, parenthesized, after the one that fails.
Setup now leads with `node <skill-base-dir>/scripts/context.mjs` and says once
that the base directory resolves every scripts-path command in the skill and
its references, leaving the project-relative path as the fallback for runtimes
that report no base directory.
Prepared by an AI agent (Claude Code) under pbakaus's instruction.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
* Answer the Copilot review: brittle model assertion, missing review dir
Assert that {{model}} resolved rather than that it resolved to "GPT", which
belongs to PROVIDER_PLACEHOLDERS and can change without touching what the test
guards. And have the parent create .impeccable/review/ when the harness does
not, so a fresh project's first capture has somewhere to land.
Prepared by an AI agent (Claude Code) under pbakaus's instruction.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
* Make the review-screenshot contract directory-based, not web-viewport-named
Two amendments to the recapture contract from review feedback:
1. The canonical location is the directory .impeccable/review/, one file
per captured viewport; desktop.png and mobile.png are the web case,
not the contract. Baking web-viewport names into the reviewer's spec
would have hardened a web assumption into paths that a native
(ios/android/adaptive) build cannot honestly write.
2. Precedence restored to explicit-beats-convention: paths the calling
brief names are authoritative when the files exist; the canonical
directory is where the reviewer looks when the brief names none or a
named path is missing. This avoids stale canonical files from an
earlier run silently winning over fresh explicit paths. The observed
failure (the verdict round inventing a round-stamped filename) stays
fixed: recapture happens over the same files, and invented filenames
are still called out as pointing at nothing.
Assisted-by: Claude Code
---------
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
|
||
|
|
dbff0880e6 |
Decision page: full-fidelity comps, raise cycler, declined sizing, canon order, full card anatomy (#545)
* Polish the decision page: raise cycler, declined height, canon order, full card anatomy Field feedback from the first real rolls of the verdict-routed hand: - Several raises stacked on the assigned card blew it out of proportion. More than one raise now renders as a compact cycler: one visible, a counter, click or Enter advances. A single raise stays inline. - Declined cards inherited the row's stretch alignment, so a narrow card stood at the tallest contender's height, a strange stilt beside the hand. They now size to their content. - Deck order becomes a gradient of standing: contenders, then the canon, then declined dead last. The canon between full alternates and the demoted row reads as the familiar door rather than the last resort after the rejects. - Root cause of bare-bones challenger and canon cards in the field: the --schema example only gave the assigned card palette, materials, and risk, and models author payloads by imitating the example, so the "same anatomy on every card" instruction lost to it every time. The example now carries full anatomy on every card and the schema note says a card with no palette chips is an authoring gap, not a data gap. AI-assisted change. Co-Authored-By: Claude Code <noreply@anthropic.com> * Decision cards carry full-fidelity comps instead of sketches Field verdict on the sketch contract: the sketches came back too simple to inform the choice, and generation takes the same time at any fidelity, so the deliberately-unfinished frame paid comp cost for sketch quality. The decision card's image is now that direction's north-star comp, produced under visualize.md's comp discipline (structure-led prompt, real name and content, no invented commercial claims), saved under .impeccable/mocks/ with its prompt sidecar. Fairness between cards comes from equal fidelity in each card's own grammar rather than shared unfinishedness. The chosen card's comp is never spent by the choice: on a comp-led build it enters the comp round as compositional option one (visualize.md now generates two variations beside it; a round arriving with no decision comp still renders all three), and on a code-led build it returns at the finish review as the critique reference. Produce order still front-loads a re-roll's spend onto the cards read first. serve-question keeps the sketch field's wire name for payload compatibility; docs, schema paths, shimmer labels, and the answer directive (CHOSEN COMP) speak comp. AI-assisted change. Co-Authored-By: Claude Code <noreply@anthropic.com> * fix: address PR review bot findings on the comp round - Producer still forced sketches (cursor, high): the asset producer's Decision Sketches contract still mandated deliberately unfinished matte sketches, so the parallel path would keep shipping sketch-era images. The section is now Decision Comps: full-fidelity north-star comp, structure-led prompt, equal commitment across siblings, no invented claims, sidecar written. - Mocks collided with the approval check (cursor, high): decision comps now live under .impeccable/mocks/decision/, visualize.md scopes the no-approval finding to comp-round output, new-work.md states the unchosen hand implies no approval, and the code-led finish packet names the chosen decision comp as the critique reference in the approved-comp slot. - Raise cycler announces (greptile, both P1s): a visually hidden aria-live region reads out the newly active raise and its position on advance; initial render stays quiet. - Declined width in the vertical deck (cursor, medium): align-self: flex-start shrank declined cards to content width in the portrait column layout, where the cross axis is horizontal; they stretch there and keep content height in the row layout. AI-assisted change. Co-Authored-By: Claude Code <noreply@anthropic.com> * fix: raise cycler tooltip and label name both input modes Copilot: the tooltip said Click while the control also answers Enter and Space; the title and a new aria-label now say activate/press Enter. AI-assisted change. Co-Authored-By: Claude Code <noreply@anthropic.com> * fix: finish reviewer exempts decision comps from the approval check cursor[bot] follow-through: the reviewer's Persistence check still treated any comps under .impeccable/mocks/ as approval-gated, and the reviewer never reads visualize.md by design, so code-led and spent-hand rounds could draw a false skipped-approval finding. The check now scopes to comp-round comps, exempts .impeccable/mocks/decision/ as the direction round's dealt hand, and defines how a code-led build's decision comp is judged in the approved-comp slot: the critique reference, under the no-approved-comp fidelity rules plus what the image dared that the build did not. AI-assisted change. Co-Authored-By: Claude Code <noreply@anthropic.com> * fix: the critique reference is its own reviewer input, not the approved-comp slot cursor[bot]: passing the code-led decision comp through the approved-comp slot dragged in that slot's obligations (inventory-first reading, the fidelity matrix, Truth's shipped-asset demand for every image-native region), which contradicts code-led's premise. The input contract now names it a separate labeled critique-reference input that nothing binding "the approved comp" touches, and Fidelity defines its treatment where the no-approved-comp rules live: provocation, not spec; no matrix, citations, or asset obligations; its dares enter material_fixes as ordinary fixes. AI-assisted change. Co-Authored-By: Claude Code <noreply@anthropic.com> --------- Co-authored-by: Claude Code <noreply@anthropic.com> |
||
|
|
827dfeb95e |
The primary action is signature material, not chrome
The Tortuga comp dissolves the Install CTA's edge into the storm's particles; the build shipped a plain rectangle with four decorative dots, and neither the builder nor the reviewer's rebuild findings named it. The inventory now gives the primary action its own row and medium, naming the shrink-to-border-trick failure as the compliance-token version of commitment, and the reviewer's fidelity matrix lists the primary action's treatment among the salient elements, with a physically-worked CTA rendered as a plain rectangle scored contradicted. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> |
||
|
|
861682eebb |
Give the finish reviewer and documenter craft-floor authority
Codex's own post-mortem of the second hamster-wheel session: it loaded the kicker ban, shipped five kickers anyway, and then the reviewer and documenter 'compounded it by accepting, and even canonizing, the invented label style'. Nothing downstream of the builder ever re-read the floor. The reviewer gains check 6, Floor: read craft-floor.md (now the one skill reference it may read, passed in its inputs) and hold the screenshots against the Refuse list; a banned element is a material fix even when it matches nothing in the comp, because fidelity cannot authorize what the floor refuses. The documenter gains the mirror rule: a floor refusal lands in its not-canonized line as a carried defect, never in DESIGN.md as a rule future surfaces inherit. Also updates the live-reference contract test to match the applier's condensed no-server sentence, which still carries the same guarantee. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> |
||
|
|
28af30eff0 |
Condense the grown skill files and harden the reviewer's verdict
Three subagent audits reviewed the files that grew through the last rounds of patches. Their honest verdict: dense, not bloated; roughly 430 words of true redundancy came out with no rule lost, and every cut they flagged as removing compliance pressure was skipped. Highlights: approval recording now has one owner in visualize.md, the asset producer's crop ban went from three statements to the deliberate pair, its two transparency passages carried contradictory defaults (resolved toward true alpha first), and the 450-word medium-gate wall split into three paragraphs at zero cost. The producer also gained a mode-seam sentence so a sketch run cannot return an asset manifest. The reviewer's verdict is no longer soft: a derived disposition line (rebuild / fix / ship) opens every return, computed from the matrix rather than felt, recomputed after the verdict pass, and never softenable by the parent, who must report it verbatim. The second hamster-wheel run showed the parent inventing 'PASS WITH FIXES' over a matrix with MATERIAL contradicted on the focal element. Two additions from the same session's evidence: hard offset shadows outside a neobrutalist world join the craft floor's refusals (codex invents them without fail), and hookless harnesses must run detect.mjs once before the finish review, because codex has no hooks and the detector otherwise never sees the build at all. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> |
||
|
|
e54fd13a33 |
Close the line-art loophole and widen the rebuild directive
The second codex hamster-wheel run read the medium gate and still assigned a shaded, perspectived technical illustration to 'Authored SVG geometry': the world was an instruction booklet, so the affinity clause's 'diagrams' blessed the downgrade, and the page shipped as flat clipart against an illustration-grade comp. The gate now says style does not move the boundary: perspective, shading, figure drawing, or dense mechanical detail is illustration however line-drawn it looks, and authored SVG ends where drawing skill begins. The craft floor's sketchy-SVG rule carries the same sentence. The reviewer in that run built an honest matrix, MATERIAL contradicted on the focal element, and still emitted it as a fixable item the parent answered with CSS. The rebuild directive now fires when MATERIAL is contradicted on the focal element, not only when TYPE falls with it, and every asset-requiring fix must say 'produce: <region>' so it cannot be answered as a style tweak. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> |
||
|
|
4432b92bbb |
Harden the comp-to-build translation after the hamster-wheel failure
A codex greenfield build produced an excellent approved comp and then an abysmal page, and the reviewer approved it. The failure chain: the implementation inventory downgraded a photographic hero to 'silhouette in SVG' and sculpted panels to 'material finish: CSS'; the builder read 'no photography on hand' as a license to avoid photographic rendering; QA looked at one full-page thumbnail; the reviewer was spawned with the builder's forked history and then scored fix claims instead of pixels; and the output contract had no way to say 'rejected'. The fixes, stage by stage: - The inventory's medium column gets a gate: a human figure, product object, machinery, or lit material is raster whatever the stack, and such regions are regenerated cleanly at asset resolution with the comp and its embedded prompt as reference. Never cropped from the comp, whose effective resolution is reference grade; the asset producer's direct bucket closes the same hole. Dropping an image-native region is a user decision at the approval point. - Generated imagery is a material, not a claim: evidence rules bind assertions, never render fidelity. - The build thread's inspection becomes a region-by-region side-by-side against the comp at legible scale, never one full-page thumbnail. - The reviewer spawns fresh, never with forked history (fork_turns: 0 in codex), and gains a rejection lane: when TYPE, MATERIAL, and the focal element are all contradicted, the first material fix is a rebuild directive the parent surfaces to the user instead of patching. Verdict passes score recaptures only; the parent's fix narration is not evidence. - The verdict-loop ceiling softens: two rounds ends an unattended run, but an attended session puts the open-items table in front of the user and lets them fund another round; any round that resolves nothing stops the loop. - Comp approval joins the roll as skip-proof: question-tool errors fall back to the decision page, delegation is recorded in the brief and the sidecar and disclosed up front, and the reviewer treats comps with no recorded pick as a material finding. - Craft floor: system display faces (Impact, Arial Black) as an own-world display voice and unicode glyphs standing in for icon systems are named failures. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> |
||
|
|
c4d22bb9dc |
TYPE and MATERIAL do not lapse when no comp exists
The failed gallery batch bound its seed, ran the reviewer, and still shipped CSS bevels imitating enamel: the matrix's material row was defined against the approved comp, and comp-less runs left it with no reference. The rows now fall back to the contract's OWN-WORLD and the world's real materials, with faked physicality contradicted on its face; imitation material is the single most reliable mark of machine-made design. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> |
||
|
|
6a7d75b6fe |
Bound the finish by verdict, not by count, and teach the matrix medium and type
The hard stop landed one step early: one review, one batched fix, one recapture, then done, with nobody ever judging whether the fixes reached the quality the findings named. A recapture measures positions; the model then presented mechanical confirmation as artistic success over a page whose display face, material, and hero legibility had all drifted from the approved comp. The finish now ends on a verdict: the recaptured screenshots go back to the same reviewer, which scores every material fix resolved, partial, or unresolved and names at most three regressions the batch introduced, no new hunt. Partial and unresolved fixes earn exactly one more round; two rounds is the ceiling, the second verdict ends the work whatever it says, and the final verdict table goes to the user as it stands, open items included. Three blindnesses from the same run close alongside. The matrix gains two mandatory rows: TYPE, where a display face of a different character is contradicted however the layout matches, and MATERIAL, where flat CSS standing in for painted, textured, or dimensional artwork is contradicted regardless of placement. And the Truth check now requires every produced asset visibly present in the screenshots, because a paper texture at 0.16 opacity is a compliance token, not a shipped material. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> |
||
|
|
f482d9405e |
Teach the reading-heavy subagents to write before the ceiling lands
Raising the reviewer's turn budget did not change its fate, only its reading: 43 tool uses instead of 22, still reaped mid-read with nothing written, because the SDK ends a run at max-turns without warning and the model never feels the deadline. The definitions now carry the deadline themselves: reading is an allowance, batch Reads per turn, take the decisive inputs first, sample instead of walking the tree, and write by mid-budget, naming what went unread. A review built from what you saw beats a perfect review that never arrives. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> |
||
|
|
c9213835e7 |
Review fidelity against the comp itself, not the builder's summary of it
A codex run turned an approved comp into a related second art direction and the finish reviewer passed it: the review anchored on the direction contract, a lossy abstraction the builder wrote, and every element that abstraction dropped passed silently. Four changes close that chain. The reviewer inventories the comp's salient elements before reading the contract and classifies each one (match, adaptation, missing, contradicted, added without approval), with adaptations citing the answer, brief, accessibility need, or product truth that forced them, and fidelity failures outranking craft in material_fixes. The visualize inventory gate records compositional commitments alongside asset media, since the 150-word contract cannot carry them. The north-star allowance now says what it permits: translation, never recomposition. And the finish sequence recaptures the same viewports once after the fix batch, so what the documenter records is what actually shipped. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> |
||
|
|
9e4990765f |
Give the reading-heavy subagents turn budgets that survive their inputs
A finish review reads the artifact, two full-page screenshots, the approved comp, the quality-bar cards, and the contract before it may write a word; at max-turns 12 the SDK reaps it mid-read and the parent receives the opening sentence as the whole review. Observed twice in a row (spawn and respawn) on the first real subagent run. The documenter reads at least as much, and the asset producer pays per asset. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> |
||
|
|
bb57be4243 |
Documenter subagent, reviewer handoff contract, asset gate
From the paired Opus and Codex manual-run analyses. DESIGN.md moves to the end of the flow and into a shipped documenter subagent that derives the system from the built artifact: a rulebook written before the build gets defended against reality, and a half-stable DESIGN.md hands the design-system detector an unstable target that buries the build in noise and invites laundering. The finish reviewer gains the handoff that failed three times live: the parent captures desktop and mobile screenshots and passes paths, the reviewer never attempts to render and names missing inputs in one line, the parent verifies the five-section return and respawns once on empty. Fidelity against the approved comp joins its checks; the card keeps commitment only. The comp ingredient inventory becomes a written gate with raster-by-default materials and no gradient-as-texture, comps persist under .impeccable/mocks, the degraded seed names the sandboxed-exec cause, and the finish line is explicit: a clean detector pass is not finished. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> |
||
|
|
253f8e510c |
Concept machinery: survive truncation, builds, and loud briefs
The release-gate audit traced four ways the roll's output was defeated downstream of a perfectly healthy seed. Gemini's harness keeps only the tail of tool output, so the header-only ASSIGNED INDEX never reached the model in 18 of 18 samples; the seed now restates the assignment and key at the end of its output. Astro strips frontmatter comments, so half the anthropic contracts vanished from built artifacts; the contract now must survive the production build as an HTML comment in emitted markup. A brief that paints its own picture (the album named Soft Cathedrals) converged every arm regardless of assigned index; its literal reading now joins the rut with at most one candidate. And Opus under 4.0.1 skipped the seed 42% of the time while hand-authoring plausible contracts; the finish reviewer now verifies FORM carries a corroborable seed key before any craft point. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> |
||
|
|
0bbb63b62a |
Ship the finish reviewer as a named subagent; ungate the asset producer
The eb686f36 session read the separate-reviewer rule and spawned nothing: an unnamed "separate agent" is an improvisation prompt, not an affordance. The skill now ships impeccable-finish-reviewer next to the asset producer: persistence first, ceiling against the card and comp second, contract promise by promise, truth; ordered material fixes back to the parent, no editing, no second detector. new-work names it so the finish step invokes a thing that exists. The asset producer was gated providers: codex, so Claude Code never shipped it; the gate is removed and its two codex-only workflow lines made provider-neutral with codex blocks. Dist rebuild still deferred for the running campaign. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> |