mirror of
https://github.com/pbakaus/impeccable.git
synced 2026-09-11 21:57:14 +03:00
05ef444b7d2e3889a1f859bd25da138b2b71fec4
43
Commits
| Author | SHA1 | Message | Date | |
|---|---|---|---|---|
|
|
05ef444b7d |
Use GPT Image 2.5 Flare and native transparent assets (#786)
* Use GPT Image 2.5 Flare for image generation Add explicit model selection and cover generation/edit request provenance. Compare 24 comp samples with Image 2 and Sunburst, documenting efficiency gains and the photo-preservation tradeoff. Prepared with AI assistance under maintainer instructions. * Validate native image transparency for asset production Add repeatable cutout, glass, and reference-plate experiments with alpha measurements and compositing evidence. Record fidelity limits and the remaining asset-producer integration work. Prepared with AI assistance under the maintainer instructions. * Add native transparent PNG asset generation Wire background options through generation and edits, preserve alpha, and update asset production to use supported commands with visual cutout checks. Prepared with AI assistance under the maintainer's instructions. * Fix native alpha review findings Validate PNG paths for all background modes, score sparse and partial alpha over the sampled ground, and correct launcher and plate workflow guidance. Prepared with AI assistance under the maintainer's instructions. * Fix launcher paths in comp workflow commands Quote existing launcher filenames for the target shell while retaining multiword command prefixes. Cover relative and absolute paths and actual shell argument parsing. Prepared with AI assistance under the maintainer's instructions. * Remove evaluation artifacts and docs from image PR Keep the PR focused on runtime behavior, source skill instructions, and regression coverage. Preserve evaluation material locally. Prepared with AI assistance under the maintainer's instructions. |
||
|
|
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,
|
||
|
|
cacb2868ac |
No comps outside the state: generate-image refuses .impeccable/mocks/ output while a roll is pending and build-phase has not started
The first paid confirmation sweep showed the failure: models rendered the
three comps first and ran build-phase.mjs start after, so a session cut at
the composition pick carried no state.json and the resumed model followed
the conversation ('translate the comp into HTML now') instead of the
phases. Decision comps (.impeccable/mocks/decision/) are unaffected;
--force-mock overrides.
AI-assisted (Claude).
Co-Authored-By: Claude <noreply@anthropic.com>
|
||
|
|
d9a155be8c |
Gates that cannot be talked past: metric hardening, one start command, uncovered-ink refusal
From a forensics pass over twelve runs and two adversarial passes over the metrics: - comp-diff: detail is signed and penalizes invented energy; regions with structure under 0.3 (or painted regions under 0.45 / added detail over 0.4) are contradicted whatever the mean says; palette ramp tightened; region crops inherit the whole-image best translation so a shifted page is not eight contradicted regions. - hero gate: fails on any contradicted plate/image/text region (chrome and controls keep the one-third allowance), on a capture that is not the comp's frame, on a palette that is not the comp's, and on an organic clip-path drawn inside a raster region's box. - plates gate: scored against the comp crop with overlapping text/chrome painted out (comp-spec plateReference; generate-image uses it too), with a structure floor and an added-detail veto; the real plate passes, noise, mirrors, mosaics, and other regions do not. - comp-spec refuses a regions file that leaves comp ink unnamed. - The direction-choice ping is folded into build-phase.mjs start --direction --kind; the roll writes .impeccable/build/pending.json and context.mjs / detect.mjs report COMP_ROUND_OPEN until the hero gate passes. A code-led config makes start print the contract step and stop. 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> |
||
|
|
f1560cc238 |
Merge pull request #590 from pbakaus/fix/comp-ground-sampling
Fix uncaught ground-color drift on comp-led builds |
||
|
|
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> |
||
|
|
3b87935958 |
Fix: keep raster provenance through the finish-review fix loop (#588)
* Fix: keep raster provenance through the finish-review fix loop Three runs (two harnesses) showed the parent generating production rasters after the producer returned: no exact embedded prompt, no inventory row, orphan files. The asset contract in visualize.md was phase-scoped to the build while new-work.md's fix loop licensed "produce the named assets" with no rules attached. - visualize.md: name the provenance contract, require the exact tool payload, and scope it to the run, fix rounds and rebuilds included. - new-work.md: bind fix/rebuild rasters to the contract, add an embed-prompt --scan step before the verdict round, and extend the FINISH line to carry the condition through long builds. - embed-prompt.mjs: add --scan mode listing rasters missing a prompt (exit 3 when any), reusing the existing read path. AI-assisted change, prepared with Cursor under maintainer direction. Co-authored-by: Cursor <cursoragent@cursor.com> * Add cursor-control-8 comp vs final screenshots for PR evidence AI-assisted change (Cursor), prepared under maintainer direction. Co-authored-by: Cursor <cursoragent@cursor.com> * Add cursor-control-9 comp vs final screenshots for PR evidence AI-assisted change (Cursor), prepared under maintainer direction. Co-authored-by: Cursor <cursoragent@cursor.com> * Address review findings on the provenance gate - Hoist the provenance rule out of the fix disposition into its own paragraph binding rebuild and fix alike, gated before either round's result goes back for review or verdict (Bugbot: rebuild skipped the scan when its fresh review shipped). - A scan-flagged raster gets the record it is missing embedded, exact prompt for produced, origin for sourced/stock/pre-existing; deletion is reserved for abandoned rasters, never scan hits (Bugbot: gate hit non-generated assets on extensions). - Document the scan command with its required directory argument (Greptile: literal command exited before scanning). - Align the FINISH line on the provenance token. AI-assisted change (Cursor), prepared under maintainer direction. Co-authored-by: Cursor <cursoragent@cursor.com> * Remove evidence images from the diff; they live on the pr-evidence branch AI-assisted change (Cursor), prepared under maintainer direction. Co-authored-by: Cursor <cursoragent@cursor.com> --------- 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 |
||
|
|
6129744410 |
Scope the fallback to exit code 2 from starting the script
Bugbot's finding: exit 2 is overloaded, and at --wait it means the question server died, so the unscoped rule would drop a live visual round onto the text channel after a transient daemon loss. The gate now names the serving invocation, which also settles Copilot's exit-code ambiguity, and the display clause reads grammatically. AI-assisted (Claude Fable 5). Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> |
||
|
|
e2421aff43 |
The decision page's fallback is earned by exit code, never predicted
Across every recorded gpt-5.6-sol session, serve-question.mjs was never invoked once: the rule's prose list of fallback environments (headless, CI, an eval worker, a remote shell) let the model match itself against the list and take the structured question tool without running the script, while claude-opus-5 on the identical harness runs the script every time and the page works. The direction is then chosen with no imagery on the table, the catalog challengers are weighed without their art, and the session's own safest candidate wins: measured end to end on the eval harness, this is where bland output enters. The environment list is deleted; the script's own exit 2 is now the only key to the fallback, and the script already prints the rationale and the override at runtime to exactly the sessions that hit it. Same gate on the comp round's approval point: inline image rendering earns the in-harness path, and a text-only surface is not display. One adversarial review pass; its two word-level findings are applied. AI-assisted (Claude Fable 5), prepared for maintainer review. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> |
||
|
|
ac4c3200db |
Surface rounds deal three structures, draw wireframes, and anchor comps on a reference screenshot
- concept-seed --scope surface deals three grounded-list indices (dice-picked, primary leads) instead of one: a single card is not a choice, and the no-lineup rule stays direction-only, where it was written for worlds - serve-question renders a new per-card wireframe field as a layout schematic in the media slot: the code-led channel's visualization, no image generation needed, no card back, no salience weight - generate-image gains --ref (repeatable): routes through the edits endpoint with input images, so an established world's comp inherits identity from a captured screenshot of a real page instead of a prose paraphrase; tested against impeccable.style, where the reference-anchored comp reproduced the live site's chrome and the prose-only comp drifted - new-work rung two rewritten around the dealt hand: lock-in is the approval, a locked comp builds comp-led and discharges the visualize.md three-option round, a locked wireframe builds code-led; visualize.md records the exemption and the reference-image discipline, including the reference-leak caveat (chrome carries, the reference page's content does not) Written with AI assistance (Claude Code). Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> |
||
|
|
53a6947653 |
Close the unnamed-focal-moment gap; unstutter the inverse-failure lead
Cursor's finding was real: gating the density check on a named focal moment let a busy comp pass whenever the direction named none, which is the common case on the lane that produced the busy comps. The second leg reuses the bullet's own distinction: several regions performing the concept at once is the same shout; regions doing their jobs are not. AI-assisted (Claude Fable 5). Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> |
||
|
|
cb305fdca1 |
Two adversarial reviews later, the discipline says half as much
Two independent skeptic passes over the added prose, one hunting oversteer and example bias, one hunting mode and platform damage. What they killed, and why: - The absolute 'never a medium' rule contradicted the file's own imagery-stance fixity two paragraphs up and stripped legitimate guards (an illustration-committed world, a native app screen warding off stock-photo drift). A medium ban now belongs to the committed imagery stance, never to caution, and the rule appears once per reader context instead of five times corpus-wide. - The quoted incident string and the four-example subject list taught the model the exact framings they existed to prevent. Gone; the abstract rule plus the point-at-the-subject check carry it. - 'A first-time visitor learns what this is, why it matters, and what to do' was Persuade anatomy imposed on all four modes. The guard is now mode-neutral: a quieted region keeps its information and stops performing. - 'Calm is what Operate and Read surfaces are for' contradicted operate.md's density affordance. Deleted; modes stay defined in one place. - The focal-moment count now presupposes nothing: it fires only where the direction names a focal moment, and only on same-scale rivalry, so an even, calm field stops reading as a failure. - The decision-comp clause and the mode bullet no longer restate what they can reference. Net: the prose additions drop from roughly 480 words to under 200, with no quoted strings and no example lists. AI-assisted (Claude Fable 5), prepared for maintainer review. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> |
||
|
|
e91c273361 |
The density check cuts competition, never content
Proven necessary by its own demo: the first re-render of the declined moto-forum comp satisfied subject-present and one-dominant-move by deleting the value proposition, leaving a members' index that told a first-time visitor nothing about what this is or why to care. Paul caught it. Quieting a region means it stops performing, not that it leaves; empty is quieter, not calmer. AI-assisted (Claude Fable 5), prepared for maintainer review. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> |
||
|
|
e867487d55 |
Ban fabrications, never media: counter the exclusion-list reflex everywhere prompts are authored
The declined moto-forum comp's prompt read 'no gradients, no rounded SaaS cards, no photography, no fake member counts, no badges, no testimonials': the reflex that rightly bans invented claims swallowed the one medium the subject lives in, and that is exactly how a motorcycle forum got comped with no motorcycles. The lektor prompt's 'no AI imagery', written by an image model, is the same fingerprint. One counterweight, phrased once per authoring surface: the comp discipline's subject-presence check (which the decision comps already bind), the asset producer's own prompt rules (a standalone agent that never reads visualize.md), and new-work's author-assets law (the path a code-led build takes without the comp round). Truth binds claims, not demonstrations; a photo of the subject doing its job is a demonstration. AI-assisted (Claude Fable 5), prepared for maintainer review. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> |
||
|
|
62e90a257f |
Comps are shipped screens: subject present, mode readable, depth over coverage
Factory review evidence (two batches, both lanes): generated comps drift poster-ward. They render the world's atmosphere at high density, drop the surface's subject (a motorcycle forum comped with no motorcycles), and stop reading as screens a product would ship. The existing anti-vignette self-check catches the fully collapsed case but says nothing about density or subject presence, and new-work's "committed all the way" reads as a coverage instruction. Three sibling self-checks in visualize.md's comp discipline, each phrased per mode (Persuade/Operate/Read/Experience) and platform-neutral: the subject appears as the content the regions hold; the mode must be readable from the image alone; commitment is depth, not coverage, with one dominant move per viewport. new-work.md's decision-comp rule gains a clause binding the same checks so the direction round inherits them explicitly. AI-assisted (Claude Fable 5), prepared for maintainer review. 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> |
||
|
|
c70bcbf6b4 |
Direction round: verdict-routed hand, MY PICK card, salience parity, Safer/Bolder registers (#531)
* Route the direction hand by verdict, add the pick card, enforce salience parity The decision round previously rendered every dealt challenger as an equal full card whatever the weighing said, so a world that fused poorly (an underwater world dealt to a flower shop) sat at the same visual weight as the assigned direction, and concept-level fusion had no surviving output. Three changes, all presentation-layer; the dice, the assignment, and the two-axis weighing are untouched: - Verdict routing: the weighing closes with wins / competitive / declined per challenger, decided before any borrowing. Declined challengers render demoted (narrow, quiet, catalog art as a labeled thumb, "Adopt anyway"), reordered to the end of the deck by the page itself, still adoptable, never silently dropped. Donations return as named "raised by" lines on the assigned card: a declined challenger donates ambition and system discipline, never its clothes. - The pick card: one card for the model's top-ranked grounded candidate when the dice assigned another, kicker MY PICK, honest familiarity risk on its face. One card, never a ranked list, never the lead position; the anti-menu rule survives with exactly this carve-out. - Salience parity: a card's imagery weight is capped by the assigned card's. With a text-only assigned card (no image generation in the harness), full-bleed catalog heroes demote to labeled thumbs, so what looks important is the verdict's call, never rendering luck. serve-question payload gains additive fields (verdict, kept, raised); old payloads render unchanged. concept-seed's rendered instructions carry the verdict/donation contract and the pick-card carve-out. Covered by two Playwright tests in the new-work e2e suite (verdict routing + parity). Design exploration and rationale were worked through with the maintainer; research grounding is impeccable.style/research lessons 3-5. AI-assisted change. Co-Authored-By: Claude Code <noreply@anthropic.com> * Add Safer/Bolder re-roll registers to the direction round The re-roll gains the user's steering wheel on the familiar-to-bold axis. The decision page renders two register buttons beside the plain re-roll (payload: reroll: { registers: ["safer", "bolder"] }; booleans still work), the answer carries the chosen register, and concept-seed gains --register. The design constraint that shaped the implementation: a register changes only what a round INSTRUCTS, never what it DEALT. The same key and reroll count reproduce the same deal whatever the register, so the exclusion chain never forks and the reproduction contract holds with no API change. - bolder: the dealt foreign forms become the whole hand, every challenger a full card; the first-dealt challenger leads (assignment by deal order, so the dice still choose). The pick card sits out; the canon stays. - safer: the round's dealt hand is spent unseen and stays excluded; the model presents its remaining conventional grounded candidates (at most three) plus the canon executed against named competitors. This is the one sanctioned lineup of the model's own ranked list, existing only by explicit user request. Works degraded (needs no catalog); bolder degrades to a plain grounded round, disclosed. Registers are user steering, never the model's to pre-select. Covered by a concept-seed unit test (same-deal invariant, validation) and a Playwright test (button, answer field, REGISTER directive). AI-assisted change. Co-Authored-By: Claude Code <noreply@anthropic.com> * Add the execution-contract round: comp-led or code-led, chosen after the direction The build previously went comp-led for everyone, silently: a generated comp led and the build chased it, which produces the boldest compositions and also the measured worst-of-both-worlds failure (ambitious design landed poorly, no motion, fix rounds after). Models already defect from it by quietly skipping comp generation, which is unsanctioned code-led with no contract to catch it. This makes the fork explicit and both paths defection-proof: - Comp-led: the comp is law and non-optional once chosen; visualize.md and the comp-is-king build phases run as today. - Code-led: no comp of this page, skipped by contract rather than drift. The QUALITY BAR boards still calibrate finish, and the ambition moves into the written direction contract (FIRST VIEWPORT plus a named signature interaction and motion grammar), audited by the finish reviewer in behavior. Not a discount on commitment. Placement: a second round on the same open table, right after the direction lands. Sketches stay in the direction round (they pick the world); comps are what code-led skips (they bind the composition). The chosen world sets the default lead; the user flips freely; a standing preference recorded in PRODUCT.md skips the round on later surfaces; with no image generation there is no fork, code-led is the only path. Mechanism: serve-question gains payload-level followup: true, which keeps the detached server alive after a pick (exactly like re-roll), swaps the page to the loading hand instead of goodbye, marks the answer with followup: true so --wait keeps the table, and prints a FOLLOWUP OPEN directive telling the agent to deliver the next round via --update. Covered by a Playwright test driving the full two-round flow. AI-assisted change. Co-Authored-By: Claude Code <noreply@anthropic.com> * fix: address PR review bot findings - Degraded safer register no longer contradicts itself (greptile, Copilot, cursor): the degraded template previously said "the assigned index is suspended; the user picks" and then emitted ASSIGNED INDEX, the mandatory build instruction, and the restated footer anyway. The degraded safer path now suppresses the assignment machinery entirely, matching the non-degraded safer round, and restates the user-picks behavior for truncated readers instead. - A declined card's declared sketch no longer renders a full media face (Copilot): the renderer ignores sketch slots on declined cards outright, so a stray sketch cannot buy back the salience the verdict took away. - Bolder rounds no longer carry the generic weighing instruction (cursor): it measures against the assigned grounded direction, which the bolder register suspends; a leader-relative variant weighs the fused challengers against the first-dealt leader instead. All three pinned by new assertions in tests/concept-seed.test.mjs and tests/new-work-e2e.test.mjs. AI-assisted change. Co-Authored-By: Claude Code <noreply@anthropic.com> * fix: followup never arms the loading hand in blocking serve mode cursor[bot] caught a client/server disagreement: the page interpolated its FOLLOWUP constant from the payload alone, so a followup: true payload served in blocking mode (no --start) would leave the browser on a loading hand that nothing resolves, since a blocking server exits on any pick and has no update channel. The page constant is now armed only when the server is detached, blocking rounds get the goodbye screen as before, and new-work.md states that followup belongs only on a detached round; blocking and structured-tool channels run the build-path round as its own second question. Pinned in tests/serve-question.test.mjs. AI-assisted change. Co-Authored-By: Claude Code <noreply@anthropic.com> * Add card-kind choice telemetry and the bolder routing disambiguation The choice ping previously fired only when a dealt catalog challenger won, so pick-share and canon-share had no denominator and the decision page's new spectrum could not be measured. The ping now fires once per resolved attended round on API-dealt rolls: --kind names which card class won (assigned / pick / challenger / canon), --chosen carries the catalog id only when a dealt challenger won, and --register rides along when the round came from a steered hand. Grounded candidates' names never leave the machine (the ping carries the kind alone), the legacy id-only shape stays valid, and DO_NOT_TRACK / IMPECCABLE_NO_TELEMETRY still disable the ping entirely. The seed's TELEMETRY block teaches the new invocation. Also the naming-collision guard: "bolder" said while a direction round is open routes to the Bolder hand register, never the bolder refinement command; one line each in bolder.md and new-work.md. The /api/chosen field additions land in a sister impeccable-site PR; the API ignores unknown fields meanwhile, so this is safe to ship first. AI-assisted change. Co-Authored-By: Claude Code <noreply@anthropic.com> * fix: ping test survives a DO_NOT_TRACK shell cursor[bot]: the pingChosen unit test cleared only IMPECCABLE_NO_TELEMETRY, so a developer shell with DO_NOT_TRACK set failed the success-path assertions. The test now clears both, restores prior values in finally, and passes under DO_NOT_TRACK=1. AI-assisted change. Co-Authored-By: Claude Code <noreply@anthropic.com> --------- Co-authored-by: Claude Code <noreply@anthropic.com> |
||
|
|
b1c5707fde |
Cross-harness, cross-OS: boot-time tool detection and native-first image gen
context.mjs now probes cwebp/sips/magick/ffmpeg once (which/where per OS) and prints IMAGE_TOOLS, replacing macOS-specific prose; the IMAGE_GEN_AVAILABLE directive leads with the harness-native tool so a present OpenAI key stops reading as an instruction to bill it; and the sandboxed board-start guidance sheds codex vocabulary. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> |
||
|
|
b89b4c41d3 |
Trim the spawn tax: no agent-def reads, long waits, one converter probe
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> |
||
|
|
08c2323b51 |
Rebuild without asking, spawn the producer always, read the comp as a system
Three lessons from the Tortuga containment-map run. The first rebuild directive now executes immediately, informing the user instead of asking permission to fix a failure; consultation waits for a second rebuild verdict or user-approved content at risk. The asset producer spawns on every subagent-capable run even when produce looks empty, because its manifest is the independent check on the inventory's media and the skipped spawn marks every all-CSS failure to date. And the inventory now opens by reading the comp as a design system (component grammar, corners, line weights, elevation, type ramp), because the sections the comp does not show get built from that record, and without it the fallback is the stock kit: square boxes, 1px grids, bentos, hard shadows. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> |
||
|
|
7b202c3223 |
Textures are raster by name alone
The condensation pass folded the old textures-are-raster-by-default sentence into the medium gate's lighting-and-depth clause, and the next codex run drove straight through the gap: woven cotton as 'layered CSS textures', a black nylon band as plain CSS, and a physical evidence-tag CTA as CSS shapes, so the produce bucket stayed empty and the asset producer was never called. The gate now names textures explicitly, woven cloth, paper grain, fabric, leather, brushed metal, with no depth argument owed, and calls 'layered CSS textures' what it is: not a medium. Co-Authored-By: Claude Fable 5 <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> |
||
|
|
38d2c393dc |
Prove the hero before building past it
The Tortuga run showed the finish machinery working end to end, roll, challengers, approved comp, honest labels, independent reviewer, an earned rebuild verdict at the user checkpoint, and still cost the user a full build to learn the hero undersold the comp: a glyph storm at a tenth of the approved density under type half as compressed. Both misses were visible the moment the first viewport rendered. Two cheap gates front-load that discovery. The build section gains a hero checkpoint: capture the first viewport and set it beside the comp's before any later section, judging scale and density as quantities. The inventory gains the same quantitative discipline: field and texture regions record density and coverage, and TYPE rows name the compression class and render one headline word against the comp before anything is built on the face. 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> |
||
|
|
f8a34335cb |
Let the surface own the sketch and comp aspect
A landscape frame was the silent default at every generation site, which is a composition error before the build starts for native apps and mobile-first surfaces. The sketch frame, the asset producer's single-sketch contract, and the comp instruction now state it: portrait at device viewport when the surface is a phone screen, landscape for desktop web. The decision page adapts in kind: portrait art overrides the 16/10 slot with its own exact ratio so nothing crops, and the deck narrows so portrait cards line up side by side. The --schema guidance tells the model the page handles either. 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> |
||
|
|
bb07a7519b |
Record the approved comp in its prompt sidecar
The surface brief was the only carrier of which comp got approved, and eval transcripts show models routinely skip writing it, leaving the choice unrecoverable. The comp's .json prompt sidecar already travels with the mocks folder across sessions and machines, so the approval now gets marked there too. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> |
||
|
|
430d74a12b |
The stack is the user's decision, and code is a medium of ambition
Two field observations. Greenfield projects with no framework never got asked what to build on: the interview covered product truth and banned aesthetic questions, and the model silently picked a scaffold the user never chose. Init now asks once, static HTML, a named framework, or a delegated choice plus any deploy constraint, and records the outcome under a new optional Stack section, including the delegation itself, so later work knows the choice was offered. And the medium guidance named raster a dozen times while naming WebGL once, so models never reached for vector or GPU code unprompted. The affinity now runs both ways at the decision point: precise geometry, shape systems, diagrams, expressive motion, shaders, and anything interactive are vector and GPU territory, where a raster flattens what should move, scale, and respond. The sketchy-SVG ban states its own scope: it bans SVG imitating pictures, never SVG doing geometry. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> |
||
|
|
fa1177ed9c |
Ship native subagent definitions for GitHub Copilot and Cursor
The github and cursor providers previously received only the generated
degraded/ inline fallbacks. Both harnesses support real custom subagents,
so the build now emits them from the same skill/agents/ source:
- GitHub Copilot: .github/agents/impeccable-<role>.agent.md with portable
frontmatter only (name + description; omitting tools grants all tools,
and Copilot has no documented model/effort/max-turns equivalents).
- Cursor: .cursor/agents/impeccable-<role>.md with name, description,
model: inherit, is_background: false, and readonly derived from the
agent's tool list (true only for the finish reviewer, which declares
neither Write nor Edit). effort/max-turns are skipped because Cursor's
effort option requires an explicit model id.
Agent bodies now also resolve {{scripts_path}} and strip rule markers in
the shared agentFormat pipeline, which fixes the previously unresolved
placeholder in the emitted Claude asset-producer agent.
The CLI installer places agents per scope: project installs write
<repo>/.github/agents/ and <repo>/.cursor/agents/; user-level installs
write ~/.copilot/agents/ (Copilot's user dir, not ~/.github/) and
~/.cursor/agents/, overwriting stale impeccable-* copies. Because
Copilot lets user-level agents shadow same-named project ones, a project
install warns when shadowing copies exist; Cursor gives project agents
precedence, so no warning there.
new-work.md and visualize.md extend their harness-naming clauses with
the Cursor and Copilot invocations. The degraded/ fallbacks keep
shipping for surfaces where the model still fails to delegate.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
|
||
|
|
47b875a7e3 |
One prompt carrier across every harness: embed-prompt.mjs
The prompt behind a generated image was recorded three different ways, a sidecar in the eval harness, nothing in the skill's API tool, nothing for native tools, so intent survived or vanished depending on where you ran. One dependency-free script now embeds the prompt inside the image itself, PNG tEXt or JPEG COM with a sidecar fallback for other formats, idempotent, and reads it back from any impeccable-generated file. The API tool embeds automatically; the prose directs every native-tool generation through it; copies between machines and harnesses keep their intent. Comps meanwhile are declared the build thread's own work, never delegated, and the comp-skeleton guidance now asks for the surface's actual regions instead of prescribing navs onto pages that have none. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> |
||
|
|
39532a65a2 |
Comps are pages not vignettes, and the prompt travels with the asset
Two findings from the first human-validated probe. The comps rendered as scene vignettes because the generation prompts led with the world's atmosphere; the model painted the fish market instead of the fish market's website. The comp guidance now demands the page's literal skeleton in the prompt, nav and its items, headline block, sections in order, footer, with a self-check: a render that could hang as a poster is not a comp. And generation context is part of the asset: the thread that wrote a prompt knows what the image contains and why, so build- critical imagery prefers the build thread, and subagent-produced assets must carry their prompts, via the tool's new sidecar or the manifest, read by the builder before composing. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> |
||
|
|
8b6324d1b9 |
View every image by its workspace-relative path
A sandboxed harness rejected view_image on an absolute path to a mock the model had itself just produced under .impeccable/mocks/, killing the run. The relative-path rule existed only for downloaded quality-bar cards; it now covers every image the flow produces or references, in the comp round and in the asset producer's comparison step. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> |
||
|
|
d89ee5f87c |
Deal every card the same hand: anatomy, sketches, and the standing door
The decision page compared unlike things: the grounded direction was a wall of text beside curated catalog art, the catalog art read as a promise of the build, the weighing silently shrank the challenger set, and the standing exit hid in the footer under the cards it must not soften. Every card now shares one anatomy (thesis, palette chips, material tags, first viewport, case, risk), every dealt challenger is presented with the weighing written on it rather than applied to it, the catalog image rides picture-in-picture as labeled inspiration with the lightbox a click away, and canonCard renders the category standard as one honest, subordinate card. When image generation exists, each card declares a sketch slot the page polls: serve first, generate after, through one shared deliberately unfinished frame, so the comparison stays about direction instead of rendering luck. The asset producer takes the batch when subagents exist; the chosen sketch returns in ANSWER to seed at most one comp probe, and the comp round still renders its full set. 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> |
||
|
|
916b0a1fdf |
Generate degraded-mode fallback references from the subagent definitions
Harnesses with no subagent capability now run each role inline from the
same single source. The build emits reference/degraded/<role>.md for every
agent in skill/agents/ (role name is the agent name minus the impeccable-
prefix), stripping frontmatter and prepending the inline-substitution
preamble. These pass through the same provider-block compilation and
placeholder replacement as ordinary reference files, so <codex> blocks and
{{placeholders}} resolve per target, and they land in the committed harness
dirs on build:release like every reference file.
Repoint the three capability-first fallback sites in the prose at the
generated files: new-work.md reviewer and documenter fallbacks, and
visualize.md asset-producer fallback.
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> |
||
|
|
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> |
||
|
|
91d310696d |
Canonicalize the visualize flow; put the added prose on a diet
codex.md becomes visualize.md and loads for every harness with any image generation, native or the API fallback: after the direction locks, three distinct compositional comps are rendered and put before the user for approval, in-harness when it can display images, otherwise on the decision page. Three is the number; one comp invites rubber-stamping, and this approval round has repeatedly produced the most compositional and ambitious work, so new-work now marks it never-skipped. The codex-only subagent stays as a codex note. The recent rule additions are tightened by a third: the asset and imagery bullets merge into one, the canon exit loses its restatements, the DESIGN.md-rule and chosen-card and ceiling clauses each shed their second clause saying the first clause again. Same laws, fewer words; prose that grows without bound recreates the attention gravity it was written to fight. Dist rebuild still deferred; the release-gate campaign reads the pinned dist. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> |