Skip to content

t-141: stage-1 sprite extraction (individual PNGs, no scene/page) - #49

Closed
mahoudeau wants to merge 1 commit into
mainfrom
t-141-sprite-extraction
Closed

t-141: stage-1 sprite extraction (individual PNGs, no scene/page)#49
mahoudeau wants to merge 1 commit into
mainfrom
t-141-sprite-extraction

Conversation

@mahoudeau

Copy link
Copy Markdown
Owner

Stage 1 of the t-59 re-scope (extraction / composition / animation now separate, frozen-output stages). Deliverable per t-141's own Acceptance: individual transparent, native-resolution PNGs + a manifest citing each sprite's exact source — no composed atlas, no scene, no page.

What's here

  • hub/tools/rectify.py — carried over from the (now-discarded) t-59 branch at its round-28 state, including round 27/28's palette-starvation and key-hue-residue fixes. Never lived on main before (t-59's branch was never merged), so this is a fresh add, not a diff.
  • hub/public/office-sample-assets/rectify-manifests/ — the 4 manifests (typing4/desk/tiles/window) citing each sprite's source sheet + region + pitch.
  • hub/public/office-sample-assets/sprites/{agent,desk,tiles,window}/ — 10 individual transparent PNGs + each group's own rectify-report.json (the tool's own output, which is the source citation the Acceptance asks for). sprites/MANIFEST.md indexes the set.

Verified fresh on this branch

  • All 10 PNGs re-derived from the committed manifests + vendored tool: sha256-identical to what's committed.
  • Determinism: re-ran twice, byte-identical.
  • Zero key-adjacent opaque pixels: full pixel sweep (not sampled) across all 10 files.
  • Each group's palette is built from only its own region votes (the Palette Law's per-subject isolation), confirmed by reading rectify.py's own grouping logic.

Disclosed, not silently dropped

  • Two named prop sprites (CRT monitor, wall monitor) have no manifest yet — natural next round.
  • A second, arguably more principled round-28 tool fix exists on a side branch (bettik-t141-palette-law-handoff, commit 58ad5b9) using the accent-exemption mechanism the mission's own Palette Law text names, instead of this branch's palette-size bump. Not merged here since these committed sprites were rectified from the version in this PR; flagged for a future round to diff/swap.
  • Face/hair precision still reads softer than the reference sheets at this native pixel count — a critic judgment call per the Acceptance, not a palette-law violation.

Gate stays critic; parking for review, not self-declared done.


🤖 Generated with Claude Code


Generated by Claude Code

t-59 (the old monolithic office-sample-scene loop) was discarded by the
boss's re-scope and replaced by three stage-separated missions; this is
t-141, stage 1 (sprites only). Its own Acceptance is explicit that the
deliverable is "individual transparent, native-resolution PNGs... No
scene, no animation, no page" — a different shape than what 28 rounds of
t-59 work had been producing (a single composed atlas.png + an
office-sample.html demo page). This commit is that stage-1 deliverable,
built fresh off main (rectify.py never lived on main; t-59's branch was
never merged) rather than carrying over t-59's scene/page files.

Brings over from t-59's branch (discarded mission, reusable tool):
- hub/tools/rectify.py at its round-28 state (commit 0298b16 on
  t-59-office-sample-scene): grid-fit + per-cell-vote + key-to-alpha +
  48px-anchor scaling, plus round 27/28's fixes to build_shared_palette
  (a two-band hue+distance gate against key-color residue in palette
  candidates, not just edge cells).
- The 4 rectify-manifests/ (typing4/desk/tiles/window) citing each
  sprite's exact source sheet + region + pitch, unchanged.

New: hub/public/office-sample-assets/sprites/{agent,desk,tiles,window}/,
10 individual transparent PNGs (idle-anchor, typing-0..3, desk-tidy,
chair, floor-wood, wall-cracked, window-blue-night) + each group's own
rectify-report.json (the tool's own output — source sheet, exact region
box, phase, pitch, sha256 — IS the citation manifest the Acceptance
asks for, not hand-transcribed). sprites/MANIFEST.md indexes the set and
states what's verified.

Verified fresh on this branch, not assumed from t-59's own claims:
- Re-ran all 4 manifests against the vendored tool + committed manifests;
  every one of the 10 output PNGs is sha256-identical to what's
  committed (byte-for-byte, not just visually).
- Determinism: re-ran the typing4 manifest twice, byte-identical both
  times.
- Zero key-adjacent opaque pixels: full pixel sweep (not sampled) over
  all 10 PNGs using the same distance+hue test build_shared_palette
  itself uses (color_dist < 60 OR magenta_hue_score > 40 on any
  fully-opaque pixel) — 0 hits.
- Each rectify-report.json confirms every group (undercut-agent, desk's
  own group, tiles' own group, window's own group) built its palette
  from only its own region votes — THE PALETTE LAW's per-subject
  isolation, read directly off rectify.py's main(), not just asserted.

Disclosed, not silently dropped (sprites/MANIFEST.md's own "NOT yet
covered" section):
- Two named prop sprites — CRT monitor, wall monitor — have no manifest
  yet; the 4 manifests here predate this mission. Next round.
- A second, alternate round-28 tool fix exists on a side branch
  (bettik-t141-palette-law-handoff, commit 58ad5b9): restores
  accent_max_area_frac to its documented 0.01 default (the mechanism the
  mission's own Palette Law text names — "small saturated accents are
  exempted and preserved") plus a freshly-calibrated palette_hue_tolerance
  (25, margin-checked against every disclosed bad-pixel example and every
  real skin/hair/suit color in these sheets), instead of 0298b16's
  palette_size 28->128 bump + a reused (not recalibrated) hue tolerance.
  Both independently verified clean on every mechanical check; not
  merged here since 0298b16's version is what these committed sprites
  were actually rectified from — flagging the alternative for a future
  round to diff and potentially swap in, not silently picking a winner.
- Face/hair precision still reads softer than the reference sheets at
  this native pixel count (both round-28 attempts disclose the same
  gap) — a critic judgment call per this mission's own Acceptance, not
  a palette-law violation.

Gate stays critic; parking for review, not self-declared done.

Copy link
Copy Markdown
Owner Author

Closing as superseded by #50 — a concurrent kassad session (the mission's task-log shows both landed on t-141 around the same few minutes, an accepted same-name-pool race in this repo's own documented pattern). #50 covers the same ground and is a superset:

No quality issue with this PR's own work as far as it went — just redundant with the more complete delivery. Consolidating on one PR so the critic has a single thing to judge.


Generated by Claude Code

@mahoudeau mahoudeau closed this Aug 17, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants