Round 7: zero-text frames, escaped/curly titles, plan-driven banner crops
Deploy / build (push) Successful in 19s
The consultant's review of the shipped set found two defects, both ours, and both fixed at the source rather than in the output: 1. The banner/thumb crop re-framing detected only the glowing core of the object. Column brightness measures 2-6 levels above the background on dark glass, so it boxed 8 % of the frame for an object group spanning 35 %+. The detector is now a background-plane deviation plus the largest connected components (`plan_banner_crops.py`, detector in `probe_band_crop.py`), 0 % false-positive on the frame's own negative space, stable across thresholds. The crop plan is frozen as `banner-plan.json` and consumed by the renderer; a thin subject is centred at 53.5 % of the banner width with the shortfall filled by the art's own edge pixels, one row at a time (a single averaged fill left a visible tonal step, tried and rejected). Measured on the delivered 72: 0 clipped, silhouette median 47.0 %, centre median 53.5 % (`verify_banner_crops.py`). 2. `art-meta.json` pinned two slugs to the hand-accepted sample frames — the very frames that carried the HUD readouts — which also kept them out of the crop plan. Pins removed. Prompt side: 9 frames still printed glyphs at the consultant's bar (>=12 px and >=2 characters). Every offending noun is measured and now asserted against: a literal `marked at 28` printed "28"; `storefront kiosk` printed "PRINATA"; `voucher card` printed "Voucher"; `market booths` printed "10MARKET"; `glass button` printed "OC"; `gateway pylon` printed "GATELY". 50 forbidden words, 0 hits across 72 captions, and all 9 frames re-rendered clean. Also: YAML escapes are honoured in the frontmatter reader and straight quotes become curly ones (the ZH cards shipped a literal backslash), the evidence line is capped at 65 characters, and the light theme gives dark artwork a hairline border plus a soft shadow (consultant option A) so it reads as a dark display case instead of a black slab. OCR gate at the consultant's bar: 72/72 frames clean (16 carry sub-threshold single glyphs, exempt as geometry noise).
No files matched your search
@@ -123,8 +123,63 @@ Everything below is measured, not planned. A fresh session needs no other contex
|
||||
7. **Delivery shipped 2026-10-19** (`327d516` → Gitea `main`, deploy green): 72 EN + 72 ZH cards, 144 banner files, 144 thumbs rendered into `public/`; the 144 v1 PNGs deleted; 288 frontmatter fields migrated; the two components fixed. `npm run build` → **251 pages**, 216 distinct image references, **0 missing, 0 stale `.png`**; live assertions afterwards: EN card 200 `image/jpeg`, ZH card 200 (did not exist before), banner WebP 200, thumbs 200 from both listings, v1 `.png` 404, and the ZH listing's thumbs resolve from the base slug (the old helper would have 404'd every one of them). The repo also carries the art inputs — `scripts/og-gen/metaphors.json`, `captions/<slug>.json` (72), a refreshed `prompts_catalog.json` with 72 distinct entries, via `scripts/og-gen/sync_prompts_catalog.py --check`.
|
||||
8. **Art weight: 13.4 MB → 15.4 MB (+2.0 MB), and it buys 72 ZH cards that did not exist before.** Per file: EN card 67 KB JPEG (v1 was 71 KB PNG), banner 40 KB JPEG + 30 KB WebP, thumb 7 KB WebP.
|
||||
|
||||
**Two observations for the owner** (not defects, both open):
|
||||
- The hero banner carries no text overlay, so the art's left 60 % negative space reads as dark band on a dark page; on `your-disk-full-alert-is-lying` the subject occupies ~29 % of the banner width. A banner-side crop toward the subject (the card already scales the art 116 %) would roughly double its presence. Not applied — it changes the framing the consultant accepted in round 4.
|
||||
**Round-6 — the consultant's review of the shipped set (2026-10-19).** Two defects were
|
||||
real and both were ours, not the model's:
|
||||
|
||||
1. **ZH cards shipped a literal `\` escape** — `你的\"磁盘将满\"告警在说谎`. The renderer's
|
||||
frontmatter parser stripped only the outer quotes and left YAML's `\"` in the string.
|
||||
Fixed by unescaping YAML escapes and converting straight quotes to “ ” pairwise.
|
||||
2. **The artwork carried HUD readouts after all** — the consultant read `60%`, `100%` and
|
||||
`00%` off `your-disk-full-alert-is-lying`, plus a `10` and a ruler line on
|
||||
`that-dying-ssd-…`. Root cause: the shared style block inherited from the accepted
|
||||
samples (`technical blueprint vector lines`, `status indicator lights`) and the
|
||||
background's `blueprint grid crosshairs and delicate vector coordinate lines`, plus one
|
||||
metaphor that literally said "percentage gauge". **The first delivery's own claim that
|
||||
the art was text-clean was wrong**: the gate flagged `00%`@0.84 at the old bar and it
|
||||
was classified as geometry noise. The gate now runs the consultant's bar (glyph box
|
||||
≥ 12 px **and** ≥ 2 alphanumeric/percent characters; single glyphs exempt) and
|
||||
`build_captions.py` asserts a `FORBIDDEN` word list so blueprint/gauge/label language
|
||||
cannot return. Three pilot frames re-rendered at the fixed prompt: **0 OCR hits each**
|
||||
(was `SSD` 66 px, `IDENESLOES` 92 px, `00%` 15 px), then all 72 regenerated.
|
||||
|
||||
Rulings adopted: banner/thumb **reframing** (option B — subject targeted at 45–50 % of the
|
||||
banner width, thumbs cut from the banner; measured 45–47 % for 5 of 8 sampled frames,
|
||||
35–44 % for two, ~14 % for one genuinely slender subject — widening the caption `bbox` does
|
||||
not enlarge the subject, measured), light-theme **hairline + soft shadow** (option A), and
|
||||
the evidence line capped at 65 characters. Cards are unchanged apart from the quote fix.
|
||||
Style is unchanged (option: keep the realistic 3D machinery look).
|
||||
**Round-6b — the banner crop algorithm, rewritten after review (2026-10-19).** The
|
||||
consultant looked at the probe sheet and found the detection box on the glassware frame
|
||||
covered only the local highlight. Correct, and the cause was structural, not a threshold:
|
||||
|
||||
| attempt | measured |
|
||||
|---|---|
|
||||
| column mean (what shipped in round 6) | dark glass sits 2–6 levels above background → boxed the glow only: 8 % of the frame for an object group spanning 35 %+ |
|
||||
| per-row background sample + global threshold | a left-margin sample cannot describe a horizontal gradient → 39 % on one frame, 69 % on the next |
|
||||
| **deviation from an estimated background plane + connected component** (now) | downsample 16×, median-filter the object away, upsample; `|L−bg| > 16 or |∇| > 10`; 3×3 opening kills the grid lines; 31 px closing bridges the object's own dark gaps; union of components within 10 % of the largest. Stable across thresholds 8–20, 0.0 % false-positive on the left margin |
|
||||
|
||||
The closing kernel mattered: at 9 px two frames split into components and the largest one
|
||||
boxed a sliver (4.2 % and 5.9 % of frame width for ~39 % objects). Zoom is computed on the
|
||||
**silhouette** (target 47 % of banner width, centre 53.5 %), the detected box is padded 4 %
|
||||
first, and the window is no longer clamped into the scaled frame — clamping is what glued a
|
||||
thin subject to the right edge. Shortfall is filled by extending the canvas with the art's
|
||||
own edge pixels **one row at a time** (a single averaged fill was tried and left a visible
|
||||
tonal step down the right edge).
|
||||
|
||||
Detection lives in Python (`C:/AI/ideogram4/plan_banner_crops.py` → `out/banner-plan.json`,
|
||||
frozen into the repo by `sync_prompts_catalog.py`, consumed by `render_from_art.mjs`), and
|
||||
`verify_banner_crops.py` re-detects the subject **on the finished banners** rather than
|
||||
trusting the plan. Measured on the delivered set: **72 banners, 0 clipped, silhouette median
|
||||
47.0 %, centre median 53.5 %** (two outliers reported: `hello-world` 64 % — the focal cursor
|
||||
is small but its platform spans the frame; `my-backup-was-using-someone-elses-api-quota` 25 %).
|
||||
|
||||
Also fixed here: `art-meta.json` no longer pins `docker-reported-exit-0-the-oom-killer-disagreed`
|
||||
and `running-production-infrastructure-solo` to `sample_oom_169_00001_.png` /
|
||||
`sample_prod_169_00001_.png` — **those two frames were the HUD-carrying ones the consultant
|
||||
flagged**, and the pins also kept those slugs out of the crop plan.
|
||||
|
||||
**Two observations for the owner** (both now decided by the consultant's round-5 ruling):
|
||||
- The hero banner's dead black left half is fixed by the renderer's reframing (above); what remains is that a genuinely slender subject (a thin cylinder) still reads small — that is the base frame's composition, and widening the caption `bbox` was measured not to change it.
|
||||
- Several frames are intentionally very dark; at full banner width the subject can read as small.
|
||||
|
||||
**Three decisions still open** (asked of the consultant in round 4 §二; the owner may simply pick the defaults):
|
||||
|
||||
|
Before Width: | Height: | Size: 49 KiB After Width: | Height: | Size: 57 KiB |
|
Before Width: | Height: | Size: 38 KiB After Width: | Height: | Size: 42 KiB |
|
Before Width: | Height: | Size: 37 KiB After Width: | Height: | Size: 48 KiB |
|
Before Width: | Height: | Size: 23 KiB After Width: | Height: | Size: 32 KiB |
|
Before Width: | Height: | Size: 39 KiB After Width: | Height: | Size: 46 KiB |
|
Before Width: | Height: | Size: 28 KiB After Width: | Height: | Size: 30 KiB |
|
Before Width: | Height: | Size: 41 KiB After Width: | Height: | Size: 40 KiB |
|
Before Width: | Height: | Size: 31 KiB After Width: | Height: | Size: 27 KiB |
|
Before Width: | Height: | Size: 47 KiB After Width: | Height: | Size: 53 KiB |
|
Before Width: | Height: | Size: 27 KiB After Width: | Height: | Size: 26 KiB |
|
Before Width: | Height: | Size: 36 KiB After Width: | Height: | Size: 54 KiB |
|
Before Width: | Height: | Size: 29 KiB After Width: | Height: | Size: 42 KiB |
|
Before Width: | Height: | Size: 35 KiB After Width: | Height: | Size: 53 KiB |
|
Before Width: | Height: | Size: 27 KiB After Width: | Height: | Size: 38 KiB |
|
Before Width: | Height: | Size: 43 KiB After Width: | Height: | Size: 84 KiB |
|
Before Width: | Height: | Size: 38 KiB After Width: | Height: | Size: 69 KiB |
|
Before Width: | Height: | Size: 22 KiB After Width: | Height: | Size: 44 KiB |
|
Before Width: | Height: | Size: 17 KiB After Width: | Height: | Size: 33 KiB |
|
Before Width: | Height: | Size: 48 KiB After Width: | Height: | Size: 83 KiB |
|
Before Width: | Height: | Size: 41 KiB After Width: | Height: | Size: 72 KiB |
|
Before Width: | Height: | Size: 63 KiB After Width: | Height: | Size: 73 KiB |
|
Before Width: | Height: | Size: 56 KiB After Width: | Height: | Size: 62 KiB |
|
Before Width: | Height: | Size: 41 KiB After Width: | Height: | Size: 57 KiB |
|
Before Width: | Height: | Size: 26 KiB After Width: | Height: | Size: 32 KiB |
|
Before Width: | Height: | Size: 47 KiB After Width: | Height: | Size: 51 KiB |
|
Before Width: | Height: | Size: 31 KiB After Width: | Height: | Size: 27 KiB |
|
Before Width: | Height: | Size: 36 KiB After Width: | Height: | Size: 59 KiB |
|
Before Width: | Height: | Size: 25 KiB After Width: | Height: | Size: 43 KiB |
|
Before Width: | Height: | Size: 47 KiB After Width: | Height: | Size: 55 KiB |
|
Before Width: | Height: | Size: 41 KiB After Width: | Height: | Size: 36 KiB |
|
Before Width: | Height: | Size: 45 KiB After Width: | Height: | Size: 80 KiB |
|
Before Width: | Height: | Size: 41 KiB After Width: | Height: | Size: 66 KiB |
|
Before Width: | Height: | Size: 36 KiB After Width: | Height: | Size: 47 KiB |
|
Before Width: | Height: | Size: 29 KiB After Width: | Height: | Size: 31 KiB |
|
Before Width: | Height: | Size: 24 KiB After Width: | Height: | Size: 45 KiB |
|
Before Width: | Height: | Size: 16 KiB After Width: | Height: | Size: 32 KiB |
|
Before Width: | Height: | Size: 27 KiB After Width: | Height: | Size: 42 KiB |
|
Before Width: | Height: | Size: 24 KiB After Width: | Height: | Size: 34 KiB |
|
Before Width: | Height: | Size: 40 KiB After Width: | Height: | Size: 51 KiB |
|
Before Width: | Height: | Size: 33 KiB After Width: | Height: | Size: 40 KiB |
|
Before Width: | Height: | Size: 38 KiB After Width: | Height: | Size: 71 KiB |
|
Before Width: | Height: | Size: 32 KiB After Width: | Height: | Size: 52 KiB |
|
Before Width: | Height: | Size: 48 KiB After Width: | Height: | Size: 54 KiB |
|
Before Width: | Height: | Size: 38 KiB After Width: | Height: | Size: 39 KiB |
|
Before Width: | Height: | Size: 54 KiB After Width: | Height: | Size: 68 KiB |
|
Before Width: | Height: | Size: 41 KiB After Width: | Height: | Size: 45 KiB |
|
Before Width: | Height: | Size: 36 KiB After Width: | Height: | Size: 58 KiB |
|
Before Width: | Height: | Size: 33 KiB After Width: | Height: | Size: 45 KiB |
|
Before Width: | Height: | Size: 41 KiB After Width: | Height: | Size: 59 KiB |
|
Before Width: | Height: | Size: 30 KiB After Width: | Height: | Size: 46 KiB |
|
Before Width: | Height: | Size: 46 KiB After Width: | Height: | Size: 57 KiB |
|
Before Width: | Height: | Size: 34 KiB After Width: | Height: | Size: 44 KiB |
|
Before Width: | Height: | Size: 51 KiB After Width: | Height: | Size: 80 KiB |
|
Before Width: | Height: | Size: 40 KiB After Width: | Height: | Size: 69 KiB |
|
Before Width: | Height: | Size: 33 KiB After Width: | Height: | Size: 60 KiB |
|
Before Width: | Height: | Size: 23 KiB After Width: | Height: | Size: 40 KiB |
|
Before Width: | Height: | Size: 29 KiB After Width: | Height: | Size: 43 KiB |
|
Before Width: | Height: | Size: 19 KiB After Width: | Height: | Size: 22 KiB |
|
Before Width: | Height: | Size: 46 KiB After Width: | Height: | Size: 52 KiB |
|
Before Width: | Height: | Size: 39 KiB After Width: | Height: | Size: 41 KiB |
|
Before Width: | Height: | Size: 28 KiB After Width: | Height: | Size: 51 KiB |
|
Before Width: | Height: | Size: 18 KiB After Width: | Height: | Size: 31 KiB |
|
Before Width: | Height: | Size: 33 KiB After Width: | Height: | Size: 55 KiB |
|
Before Width: | Height: | Size: 22 KiB After Width: | Height: | Size: 32 KiB |
|
Before Width: | Height: | Size: 41 KiB After Width: | Height: | Size: 74 KiB |
|
Before Width: | Height: | Size: 35 KiB After Width: | Height: | Size: 61 KiB |
|
Before Width: | Height: | Size: 37 KiB After Width: | Height: | Size: 41 KiB |
|
Before Width: | Height: | Size: 25 KiB After Width: | Height: | Size: 26 KiB |
|
Before Width: | Height: | Size: 31 KiB After Width: | Height: | Size: 44 KiB |
|
Before Width: | Height: | Size: 20 KiB After Width: | Height: | Size: 27 KiB |
|
Before Width: | Height: | Size: 40 KiB After Width: | Height: | Size: 53 KiB |
|
Before Width: | Height: | Size: 30 KiB After Width: | Height: | Size: 32 KiB |
|
Before Width: | Height: | Size: 35 KiB After Width: | Height: | Size: 47 KiB |
|
Before Width: | Height: | Size: 22 KiB After Width: | Height: | Size: 29 KiB |
|
Before Width: | Height: | Size: 47 KiB After Width: | Height: | Size: 72 KiB |
|
Before Width: | Height: | Size: 37 KiB After Width: | Height: | Size: 61 KiB |
|
Before Width: | Height: | Size: 39 KiB After Width: | Height: | Size: 70 KiB |
|
Before Width: | Height: | Size: 28 KiB After Width: | Height: | Size: 47 KiB |
|
Before Width: | Height: | Size: 48 KiB After Width: | Height: | Size: 58 KiB |
|
Before Width: | Height: | Size: 45 KiB After Width: | Height: | Size: 53 KiB |
|
Before Width: | Height: | Size: 27 KiB After Width: | Height: | Size: 41 KiB |
|
Before Width: | Height: | Size: 19 KiB After Width: | Height: | Size: 25 KiB |
|
Before Width: | Height: | Size: 39 KiB After Width: | Height: | Size: 45 KiB |
|
Before Width: | Height: | Size: 30 KiB After Width: | Height: | Size: 28 KiB |
|
Before Width: | Height: | Size: 33 KiB After Width: | Height: | Size: 60 KiB |
|
Before Width: | Height: | Size: 28 KiB After Width: | Height: | Size: 40 KiB |
|
Before Width: | Height: | Size: 39 KiB After Width: | Height: | Size: 38 KiB |
|
Before Width: | Height: | Size: 33 KiB After Width: | Height: | Size: 25 KiB |
|
Before Width: | Height: | Size: 53 KiB After Width: | Height: | Size: 88 KiB |
|
Before Width: | Height: | Size: 47 KiB After Width: | Height: | Size: 76 KiB |
|
Before Width: | Height: | Size: 36 KiB After Width: | Height: | Size: 41 KiB |
|
Before Width: | Height: | Size: 26 KiB After Width: | Height: | Size: 24 KiB |
|
Before Width: | Height: | Size: 36 KiB After Width: | Height: | Size: 47 KiB |
|
Before Width: | Height: | Size: 29 KiB After Width: | Height: | Size: 34 KiB |
|
Before Width: | Height: | Size: 42 KiB After Width: | Height: | Size: 74 KiB |
|
Before Width: | Height: | Size: 33 KiB After Width: | Height: | Size: 65 KiB |
|
Before Width: | Height: | Size: 38 KiB After Width: | Height: | Size: 61 KiB |
|
Before Width: | Height: | Size: 27 KiB After Width: | Height: | Size: 45 KiB |
|
Before Width: | Height: | Size: 46 KiB After Width: | Height: | Size: 67 KiB |