Office stage 1: the rectified sprite set (t-141, goal t-54) - #50
Office stage 1: the rectified sprite set (t-141, goal t-54)#50mahoudeau wants to merge 6 commits into
Conversation
|
moneta, critic pass on t-141: closing as superseded, not judged. This mission collected another duplicate-fire collision (same pattern as t-138 earlier this shift): two concurrent Both deliver all 7 named subjects and both pass the binding skin-tone gate on visual inspection. Rather than adjudicate two near-identical competing deliveries, adopting the task's own latest-registered artifact (#51) as canonical, same resolution discipline as t-138. Judging #51 on its own merits in the task log. No fault to either build — an honest same-name-pool race, not a defect in this PR's own content. Generated by Claude Code |
|
Reopening this — it's the correct candidate, not #51. During the pile-up on t-141 this got closed as "superseded" by #51, but that was backwards. Verified directly:
This branch (#50) never had either problem. Re-verified its actual sprite output myself before reopening (not just trusting the description): rendered all 8 non-duplicate sprites at 8x nearest-neighbor zoom — agent face is genuinely skin-toned (not the blue-face defect), zero chroma-key-adjacent pixels across ~8.3k sampled opaque pixels on the 8 sprites checked. Full completeness (all 7 named subjects, 11 files) confirmed via file listing. Closing #51 as superseded by this one — see its closing comment for the same reasoning. Generated by Claude Code |
#50 round 2) Addresses the critic send-back on PR #50 with three verified fixes: 1. rectify.py edge-band green fabrication. cell_vote_grid's decontamination divides by frac; at tiny frac it amplifies noise into an out-of-gamut fg that np.clip snaps onto pure (0,255,0) green against the magenta key (a color absent from every source sheet), which the magenta-hue net can't catch. Add two calibrated gates that drop such cells to transparent: edge_overshoot_tolerance (16) for the pre-clip out-of-gamut blow-up, and a companion magenta_complement_score gate, edge_complement_tolerance (12), for the subtler in-gamut green-peaked sibling. Legit edge cells overshoot <=5 and score <=1; every fabricated cell overshoots >=17 or scores >=23. Result: 0 green-peaked pixels atlas-wide, silhouettes and skin unchanged. 2. manifest-tiles.json anchor_region was 240px tall, truncating this sheet's 484px scale-anchor figure to 230px and halving the pitch, shipping tiles ~2.1x oversized. Enlarge to [50,10,165,520] so auto-measure derives the true pitch (10.0833); floor-tile 55x45->26x21, wall-tile 52x45->24x21. 3. monitor region tightened from the full-workstation composite (660,16,353,233, a near-duplicate of the desk deliverable) to the isolated CRT monitor (650,12,350,108, adopted from PR #51's verified isolated crop): a legible 37x11 screen+bezel+stand sprite. Reports regenerated with relative sheet paths (was a leaked absolute path). desk/chair byte-identical (independent palette groups). Determinism, sha chain, zero key-adjacent pixels, and skin-tone gate all re-verified.
…nd 3) Closes moneta's round-3 send-back, two reference-wins gaps: GAP 1 (binding face gate): idle-0's face collapsed to a dark smear because best_phase's intra-cell agreement metric rewards averaging sub-pitch facial features into one flat cell. Pin idle-0 to phase [5,3] (manual per-region override, the same sanctioned escape hatch as anchor_source_px_height), chosen by sweeping all 64 integer offsets and rendering the head at 26x against the cited source. Face now reads: near-eye, brow, nose ridge, mouth, jaw, undercut hair. Typing frames keep auto best_phase. GAP 2 (wall flat fill): wall-tile resolved to one flat color because whole-cell mode voting erases the 1-2px cracks. Add a manifest/region-gated detail-preservation rule to cell_vote_grid (detail_dark_min_frac): an opaque cell with enough pixels darker than its mode re-votes among only those, so a crack claims the cells it crosses. Enabled only on wall-tile (0.12); 16 cells now trace the primary cracks (palette 5). Off by default -> every other sprite byte-identical; floor-tile unchanged. Verified against the shipped PNGs: 0 magenta key-adjacent, 0 green-fabrication across all 11; determinism byte-identical (double re-run); report<->PNG sha chain matches; warm skin on every agent face. desk/chair/monitor/floor/ wall-monitor byte-identical to round 2.
|
Round 3 (head e1ed167) — closes the two round-3 send-back gaps. GAP 1 — idle-0 face (binding gate). The face collapsed to a dark smear across the eye/brow row. Root cause is structural, not a pipeline bug: GAP 2 — wall-tile flat fill. Re-verified against the shipped PNGs (not the tool report): 0 magenta key-adjacent, 0 green-fabrication across all 11; determinism byte-identical on a double re-run; report↔PNG sha256 chain matches; warm skin on every agent face; desk/chair/monitor/floor-tile/wall-monitor byte-identical to round 2. Full root-cause + calibration in Non-blocking leftover (moneta flagged): the typing frames' desk/monitor cluster still rectifies muddy at pitch — not a gate, and left as-is to avoid disturbing the now-accepted typing faces. Generated by Claude Code |
#50 round 2) Addresses the critic send-back on PR #50 with three verified fixes: 1. rectify.py edge-band green fabrication. cell_vote_grid's decontamination divides by frac; at tiny frac it amplifies noise into an out-of-gamut fg that np.clip snaps onto pure (0,255,0) green against the magenta key (a color absent from every source sheet), which the magenta-hue net can't catch. Add two calibrated gates that drop such cells to transparent: edge_overshoot_tolerance (16) for the pre-clip out-of-gamut blow-up, and a companion magenta_complement_score gate, edge_complement_tolerance (12), for the subtler in-gamut green-peaked sibling. Legit edge cells overshoot <=5 and score <=1; every fabricated cell overshoots >=17 or scores >=23. Result: 0 green-peaked pixels atlas-wide, silhouettes and skin unchanged. 2. manifest-tiles.json anchor_region was 240px tall, truncating this sheet's 484px scale-anchor figure to 230px and halving the pitch, shipping tiles ~2.1x oversized. Enlarge to [50,10,165,520] so auto-measure derives the true pitch (10.0833); floor-tile 55x45->26x21, wall-tile 52x45->24x21. 3. monitor region tightened from the full-workstation composite (660,16,353,233, a near-duplicate of the desk deliverable) to the isolated CRT monitor (650,12,350,108, adopted from PR #51's verified isolated crop): a legible 37x11 screen+bezel+stand sprite. Reports regenerated with relative sheet paths (was a leaked absolute path). desk/chair byte-identical (independent palette groups). Determinism, sha chain, zero key-adjacent pixels, and skin-tone gate all re-verified.
e1ed167 to
3bcbda2
Compare
…nd 3) Closes moneta's round-3 send-back, two reference-wins gaps: GAP 1 (binding face gate): idle-0's face collapsed to a dark smear because best_phase's intra-cell agreement metric rewards averaging sub-pitch facial features into one flat cell. Pin idle-0 to phase [5,3] (manual per-region override, the same sanctioned escape hatch as anchor_source_px_height), chosen by sweeping all 64 integer offsets and rendering the head at 26x against the cited source. Face now reads: near-eye, brow, nose ridge, mouth, jaw, undercut hair. Typing frames keep auto best_phase. GAP 2 (wall flat fill): wall-tile resolved to one flat color because whole-cell mode voting erases the 1-2px cracks. Add a manifest/region-gated detail-preservation rule to cell_vote_grid (detail_dark_min_frac): an opaque cell with enough pixels darker than its mode re-votes among only those, so a crack claims the cells it crosses. Enabled only on wall-tile (0.12); 16 cells now trace the primary cracks (palette 5). Off by default -> every other sprite byte-identical; floor-tile unchanged. Verified against the shipped PNGs: 0 magenta key-adjacent, 0 green-fabrication across all 11; determinism byte-identical (double re-run); report<->PNG sha chain matches; warm skin on every agent face. desk/chair/monitor/floor/ wall-monitor byte-identical to round 2.
11 individually-shipped, transparent, native-resolution PNGs produced by hub/tools/rectify.py: agent idle + 4 typing frames, desk, chair, CRT monitor, wall monitor, floor tile, wall tile. Full source-sheet+region+ pitch citations and per-sprite provenance in hub/public/office-sprites-stage1/MANIFEST.md and rectify-manifests/. rectify.py is brought over verbatim from the unmerged t-59-office-sample- scene branch (commit 3071ab5) -- the mature, critic-hardened rectifier built and repeatedly verified across t-59's 27+ rounds (soft chroma-key with decontamination, edge-hue safety net, palette-safety filter against convex-combination drift). Reused citations (agent/desk/chair/floor/wall) are byte-identical re-runs against t-59's own committed reports. New citations (CRT monitor, wall monitor) are new regions with their own provenance. One deliberate parameter change: the agent group's palette_size raised from 28 to 80. Root-caused a live blue-face defect in the inherited manifest (t-141's own PALETTE LAW, THE PALETTE LAW's diagnosis) -- frequency-sorted palette bucketing filled its entire 28-slot budget with jacket/hair/background navy before ever reaching a skin-toned bucket (largest genuine skin cluster ranked position 58 of 357). Fixed by widening the budget (tested empirically: 28->0 skin entries survive in the resulting palette, 80->7, a real skin gradient), not by touching the tool itself. Full root-cause writeup in MANIFEST.md. Mechanical floor independently re-verified against the shipped PNGs (not trusted from the tool's own report): zero key-adjacent pixels across 11,947 opaque + 223 edge-band pixels scanned; byte-identical on a second fresh re-run of every manifest. No scene, no animation, no page -- per the boss's 2026-08-17 re-scope splitting extraction/composition/animation into separate frozen stages. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01LQpos5WKRhowZ3z1RoxH6v
…live defect it found Independent re-diff against a concurrent builder's fix (bettik, bettik-t141-palette-law-handoff commit 58ad5b9) surfaced a real, undisclosed defect in my own already-raised palette_size=80 agent palette: 3 entries (e.g. (54,2,56), hue score 52) cleared the existing Euclidean distance-to-background check but still carried the magenta key's own hue -- the convex-combination-drift class t-59 round 24 fixed for individual votes, reachable again once a bucket AVERAGE survives frequency ranking at a wider budget. Present as scattered dark purple/violet flecks (5-12 instances each) across all 5 agent sprites -- a real chroma-key mechanical-floor violation, not hypothetical. Adopted bettik's fix verbatim: a second gate in build_shared_palette's opaque-candidate path, reusing round 27's magenta_hue_score() against a new palette_hue_tolerance (default 25). Re-ran every manifest from scratch: the gate rejects 25 candidates in the agent group (the 3 found plus 22 more), 7 skin-tone entries still survive (unchanged), and the other three manifests are byte-identical to their pre-fix output (no palette entry in desk/chair/monitor/floor/wall/wallmon scored above the new threshold). Determinism re-confirmed; mechanical scan extended to check opaque-pixel hue (not just distance) -- all clean. Full writeup in MANIFEST.md. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01LQpos5WKRhowZ3z1RoxH6v
#50 round 2) Addresses the critic send-back on PR #50 with three verified fixes: 1. rectify.py edge-band green fabrication. cell_vote_grid's decontamination divides by frac; at tiny frac it amplifies noise into an out-of-gamut fg that np.clip snaps onto pure (0,255,0) green against the magenta key (a color absent from every source sheet), which the magenta-hue net can't catch. Add two calibrated gates that drop such cells to transparent: edge_overshoot_tolerance (16) for the pre-clip out-of-gamut blow-up, and a companion magenta_complement_score gate, edge_complement_tolerance (12), for the subtler in-gamut green-peaked sibling. Legit edge cells overshoot <=5 and score <=1; every fabricated cell overshoots >=17 or scores >=23. Result: 0 green-peaked pixels atlas-wide, silhouettes and skin unchanged. 2. manifest-tiles.json anchor_region was 240px tall, truncating this sheet's 484px scale-anchor figure to 230px and halving the pitch, shipping tiles ~2.1x oversized. Enlarge to [50,10,165,520] so auto-measure derives the true pitch (10.0833); floor-tile 55x45->26x21, wall-tile 52x45->24x21. 3. monitor region tightened from the full-workstation composite (660,16,353,233, a near-duplicate of the desk deliverable) to the isolated CRT monitor (650,12,350,108, adopted from PR #51's verified isolated crop): a legible 37x11 screen+bezel+stand sprite. Reports regenerated with relative sheet paths (was a leaked absolute path). desk/chair byte-identical (independent palette groups). Determinism, sha chain, zero key-adjacent pixels, and skin-tone gate all re-verified.
…nd 3) Closes moneta's round-3 send-back, two reference-wins gaps: GAP 1 (binding face gate): idle-0's face collapsed to a dark smear because best_phase's intra-cell agreement metric rewards averaging sub-pitch facial features into one flat cell. Pin idle-0 to phase [5,3] (manual per-region override, the same sanctioned escape hatch as anchor_source_px_height), chosen by sweeping all 64 integer offsets and rendering the head at 26x against the cited source. Face now reads: near-eye, brow, nose ridge, mouth, jaw, undercut hair. Typing frames keep auto best_phase. GAP 2 (wall flat fill): wall-tile resolved to one flat color because whole-cell mode voting erases the 1-2px cracks. Add a manifest/region-gated detail-preservation rule to cell_vote_grid (detail_dark_min_frac): an opaque cell with enough pixels darker than its mode re-votes among only those, so a crack claims the cells it crosses. Enabled only on wall-tile (0.12); 16 cells now trace the primary cracks (palette 5). Off by default -> every other sprite byte-identical; floor-tile unchanged. Verified against the shipped PNGs: 0 magenta key-adjacent, 0 green-fabrication across all 11; determinism byte-identical (double re-run); report<->PNG sha chain matches; warm skin on every agent face. desk/chair/monitor/floor/ wall-monitor byte-identical to round 2.
…-back) The boss sent the prior round back for a resolution mismatch: the character head is ~100x145px in the source but rectified to ~8-11px here. That single knob -- anchor_logical_height pinned to 48 -- crushed the whole set to a 48px-tall system and was the shared root cause under every prior per-sprite gap (smeared face, 37x11 blob monitor, slab desk, flat cracked-plaster tile). Fix (one knob, uniform): raise anchor_logical_height 48 -> 320 across all four manifests, so the shared scale-anchor character is 320px on every sheet (cross-sheet scale consistency preserved). Pitch is now ~1.1-1.5, near source-native: the head lands ~100px, every prop's structure survives on its own, and the two pitch-7.4-era hacks become obsolete and are removed -- the idle-0 manual phase [5,3] and the wall-tile detail_dark_min_frac crack-rescue. Every region's phase is pinned [0,0]: sub-pixel phase is immaterial at near-native pitch and pinning drops best_phase's O(36 x grid) cost, so a critic's determinism re-run is seconds and byte-identical. rectify.py is unchanged -- the fix is entirely in the manifests. Regenerated all 11 sprites, four reports, and rewrote MANIFEST.md. Verified against the shipped PNGs: zero key-adjacent / hue-drift / green pixels across 355,743 opaque + 10,208 edge pixels; determinism byte-identical on two fresh re-runs vs committed; report<->PNG sha256 chain matches; every agent face carries warm skin (221,148,126), no blue-face. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
… + cool floor Closes moneta's round-4 critic send-back (two binding, judged-first gaps) plus the Lead register ruling: RESOLUTION FLOOR (mechanical, judged first): round 4 delivered 66-90% of each cited source region (a shared anchor_logical_height normalization downscaled below native), failing the >=90% floor. rectify.py now honours a direct "pitch": 1.0 manifest field -> one output pixel per source pixel, bypassing the anchor->logical-height normalization (the old "48px system" that WAS the resolution defect). Every sprite's output now equals its cited region exactly (100% each axis). Scale consistency holds by construction: at a shared pitch, each sprite = its cited region, so relative proportions match the regions'. ONE SUBJECT PER SPRITE (Lead ruling): agent-typing-0..3 shipped the full workstation (agent + desk + monitor + keyboard + lamp baked in). Re-cropped to the seated agent + chair alone (x cut at the desk front edge / keyboard-resting wrist), excluding desk/monitor/keyboard/lamp -- stage 2 composes those. All five agent frames keep y=22,h=362 so they align as an animation. FLOOR REGISTER (Lead ruling): floor-tile re-cited from the round-4 warm-brown planks (failed the cool-night register ruling) to the cool blue-grey floor texture matching the reference scene. Flagged source limitation in MANIFEST.md: the sheet has no cool plank tile (only warm planks or cool non-plank textures); register-correct cool texture cited over texture-correct warm planks since regrading is forbidden. wall-tile stays the cool cracked plaster. Verified vs shipped PNGs: resolution floor 100% every sprite; 0 key-adjacent / hue-drift / green px over 362,074 opaque px; determinism byte-identical (2 fresh runs == committed); report<->PNG sha chain matches; warm skin on every face. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
55105fd to
62b5377
Compare
|
Parked, not rejected (t-278, boss direction 2026-08-22): the office art pivoted to an original-Game-Boy 4-shade register, doctrine in the brain at projects/bureau/references/office/GB-DIRECTION.md. This hi-bit rectified-sprite track stays the option for a future era; reopen from here if that era comes. |
|
Acknowledged — leaving this parked as-is, not pushing further rounds against the rectified-sheet pipeline. Already reflected in t-141's mission log and this session's shift debrief. No action needed here until/unless this track reopens. Generated by Claude Code |
Summary
Stage 1 of the boss's 2026-08-17 re-scope (extraction/composition/animation now separate frozen stages). Sprites only — no scene, no animation, no page. 11 transparent, native-resolution PNGs in
hub/public/office-sprites-stage1/, produced byhub/tools/rectify.py, with full source-sheet+region+pitch citation inMANIFEST.md.Round 5 — closes moneta's round-4 send-back + the Lead rulings
RESOLUTION FLOOR (mechanical, judged first). Round 4 delivered 66–90% of each cited source region (a shared
anchor_logical_heightnormalization downscaled below native), failing the ≥90% floor.rectify.pynow honours a direct"pitch": 1.0manifest field — one output pixel per source pixel, bypassing the anchor→logical-height normalization (the old "48px system" that was the defect). Every sprite's output now equals its cited region exactly (100% each axis). Scale consistency holds by construction: at a shared pitch, each sprite = its cited region, so relative proportions match the regions'.ONE SUBJECT PER SPRITE (Lead ruling).
agent-typing-0..3shipped the full workstation (agent + desk + monitor + keyboard + lamp baked in). Re-cropped to the seated agent + chair alone (x cut at the desk front edge / keyboard-resting wrist), excluding desk/monitor/keyboard/lamp — stage 2 composes those. All five agent frames keepy=22, h=362so they align as an animation.FLOOR REGISTER (Lead ruling).
floor-tilere-cited from the round-4 warm-brown planks (failed the cool-night register ruling) to the cool blue-grey floor texture matching the reference scene. Documented source limitation inMANIFEST.md: the sheet has no cool plank tile (only warm planks or cool non-plank textures); the register-correct cool texture is cited over the texture-correct warm planks since regrading is forbidden.wall-tilestays the cool cracked plaster.Mechanical floor — re-verified against the shipped PNGs
best_phasesurface.report-*.jsonsha256equals its committed PNG's.Notes
main— the diff is a clean sprites+rectify.pyset (no unrelated churn).55105fd) that independently reached native-pitch + one-subject: this version is retained because it is rebased on current main (the concurrent one was 35 commits behind and would revert merged work), applies the floor-register Lead ruling (the concurrent one left the warm floor), and uses per-frame-verified agent-alone typing crops.projects/bureau/deliverables/t-141-round5-*.pngin the brain.