feat(aterm): stand the role's creature in the window background #1417

Merged
coilyco-ops merged 1 commit from aos/claude/zc49-creature-background into main 2026-08-29 15:25:44 +00:00
Owner

The seat creatures already ship as aterm/icons and reach only the Dock
tile. Every window now draws its own role's creature behind the session,
so a screen of seven fullscreen kitties reads as seven agents rather than
seven dark rectangles with different hues.

Shape

kitty alpha-blends a background image over the window background and then
draws that background back over the result at background_tint, so one
number decides how much art survives. 0.91 leaves the creature losing to
the session text at a glance and rewarding only a second look, picked
against the real identity card rather than in the abstract.

The art is aterm/icons/<role>.icns read for its largest PNG rather than
a second committed copy. One art file, two consumers, and a re-drawn
creature cannot leave the background stale. No new bytes land in a public
repository for art it already carries.

kitty has no anchor for a background image, so placement is baked: the
512px art is placed once, unresampled, on an otherwise empty 16:10 plate
wide enough that cscaled leaves it a quarter of the window, low and
right of where the card and the session text sit. kitty does every scale
on the GPU, so the shipped 512px stays the only copy of those pixels and
aterm needs no resampler and no new dependency.

The plate caches under ~/Library/Caches/aterm/creature beside the sound
samples, written to a staging name and renamed, since kitty opens a
half-written plate as a blank window.

What cannot stop a window

The background is decoration, so every failure degrades to the flat
window that shipped before this: a role with no committed art, an icns
that will not walk, no cache directory, a cache path carrying glob
metacharacters that kitty would read as a pattern, or an encode that
fails. --no-creature and ATERM_NO_CREATURE are the deliberate off,
matching --no-motion and --silent.

Verification

  • go test ./... green, with coverage for the largest-entry walk, the
    three malformed containers, the plate geometry and its transparent
    opposite corner, cache naming across re-drawn art, the kitty options
    reaching the launch plan, and the flat window passing no image at all.
  • just aterm-contract green against the live roster.
  • pre-commit run --all-files green.
  • The compositing was reproduced from kitty's own bgimage.slang and
    rendered at 16:10 and 16:9 to check the cscaled crop keeps the whole
    creature inside the 8% inset.
  • A real kitty window opened with these exact options and accepted every
    one of them.

Co-authored-by: Kai Siren coilysiren@gmail.com
Co-authored-by: Claude noreply@anthropic.com
Agent-Role: frontend

The seat creatures already ship as `aterm/icons` and reach only the Dock tile. Every window now draws its own role's creature behind the session, so a screen of seven fullscreen kitties reads as seven agents rather than seven dark rectangles with different hues. ## Shape kitty alpha-blends a background image over the window background and then draws that background back over the result at `background_tint`, so one number decides how much art survives. 0.91 leaves the creature losing to the session text at a glance and rewarding only a second look, picked against the real identity card rather than in the abstract. The art is `aterm/icons/<role>.icns` read for its largest PNG rather than a second committed copy. One art file, two consumers, and a re-drawn creature cannot leave the background stale. No new bytes land in a public repository for art it already carries. kitty has no anchor for a background image, so placement is baked: the 512px art is placed once, unresampled, on an otherwise empty 16:10 plate wide enough that `cscaled` leaves it a quarter of the window, low and right of where the card and the session text sit. kitty does every scale on the GPU, so the shipped 512px stays the only copy of those pixels and aterm needs no resampler and no new dependency. The plate caches under `~/Library/Caches/aterm/creature` beside the sound samples, written to a staging name and renamed, since kitty opens a half-written plate as a blank window. ## What cannot stop a window The background is decoration, so every failure degrades to the flat window that shipped before this: a role with no committed art, an icns that will not walk, no cache directory, a cache path carrying glob metacharacters that kitty would read as a pattern, or an encode that fails. `--no-creature` and `ATERM_NO_CREATURE` are the deliberate off, matching `--no-motion` and `--silent`. ## Verification - `go test ./...` green, with coverage for the largest-entry walk, the three malformed containers, the plate geometry and its transparent opposite corner, cache naming across re-drawn art, the kitty options reaching the launch plan, and the flat window passing no image at all. - `just aterm-contract` green against the live roster. - `pre-commit run --all-files` green. - The compositing was reproduced from kitty's own `bgimage.slang` and rendered at 16:10 and 16:9 to check the `cscaled` crop keeps the whole creature inside the 8% inset. - A real kitty window opened with these exact options and accepted every one of them. Co-authored-by: Kai Siren <coilysiren@gmail.com> Co-authored-by: Claude <noreply@anthropic.com> Agent-Role: frontend
feat(aterm): stand the role's creature in the window background
All checks were successful
ci / aos-cli-tests (pull_request) Successful in 30s
ci / gate (pull_request) Successful in 54s
d792b69dc5
The seat creatures already ship as `aterm/icons` and reach only the Dock
tile. Every window now draws its own role's creature behind the session,
so a screen of seven fullscreen kitties reads as seven agents rather than
seven dark rectangles with different hues.

## Shape

kitty alpha-blends a background image over the window background and then
draws that background back over the result at `background_tint`, so one
number decides how much art survives. 0.91 leaves the creature losing to
the session text at a glance and rewarding only a second look, picked
against the real identity card rather than in the abstract.

The art is `aterm/icons/<role>.icns` read for its largest PNG rather than
a second committed copy. One art file, two consumers, and a re-drawn
creature cannot leave the background stale. No new bytes land in a public
repository for art it already carries.

kitty has no anchor for a background image, so placement is baked: the
512px art is placed once, unresampled, on an otherwise empty 16:10 plate
wide enough that `cscaled` leaves it a quarter of the window, low and
right of where the card and the session text sit. kitty does every scale
on the GPU, so the shipped 512px stays the only copy of those pixels and
aterm needs no resampler and no new dependency.

The plate caches under `~/Library/Caches/aterm/creature` beside the sound
samples, written to a staging name and renamed, since kitty opens a
half-written plate as a blank window.

## What cannot stop a window

The background is decoration, so every failure degrades to the flat
window that shipped before this: a role with no committed art, an icns
that will not walk, no cache directory, a cache path carrying glob
metacharacters that kitty would read as a pattern, or an encode that
fails. `--no-creature` and `ATERM_NO_CREATURE` are the deliberate off,
matching `--no-motion` and `--silent`.

## Verification

- `go test ./...` green, with coverage for the largest-entry walk, the
  three malformed containers, the plate geometry and its transparent
  opposite corner, cache naming across re-drawn art, the kitty options
  reaching the launch plan, and the flat window passing no image at all.
- `just aterm-contract` green against the live roster.
- `pre-commit run --all-files` green.
- The compositing was reproduced from kitty's own `bgimage.slang` and
  rendered at 16:10 and 16:9 to check the `cscaled` crop keeps the whole
  creature inside the 8% inset.
- A real kitty window opened with these exact options and accepted every
  one of them.

Co-authored-by: Kai Siren <coilysiren@gmail.com>
Co-authored-by: Claude <noreply@anthropic.com>
Agent-Role: frontend
Sign in to join this conversation.
No reviewers
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set

Reference
coilyco-flight-deck/agentic-os!1417
No description provided.