feat(aterm)!: make the launch sound opt-in #1424

Closed
coilyco-ops wants to merge 2 commits from aos/claude/zc49-creature-gentle into main
Owner

Kai wants the sound off. --silent and ATERM_SILENT become --sound
and ATERM_SOUND, and a window is quiet unless one of them asks.

Why a default rather than an env var

ATERM_SILENT=1 in a shell profile would have covered a typed aterm
and nothing else. The generated .app wrapper harvests exactly PATH
from a login shell (bundle_contents.go), and a Finder launch carries
none of the caller's environment, so every Dock and Spotlight launch would
have kept chiming. Two ways in, and only a default reaches both.

Not a removal

The samples still ship, just aterm-sounds still renders them, and the
timbre still travels on the session card, so --sound is a full restore
rather than a rebuild. The contract test still asserts every timbre has a
sample. What changed is which way the switch points.

One test refactor this forced

soundWanted took stdout and the opt-in together, and the suite runs off
a terminal, so the positive case was unassertable through it: the old test
read as proving --silent won when a pipe would have returned false
anyway. The opt-in splits into soundAsked, which is testable anywhere,
and soundWanted stays the terminal gate over it. Both are now covered in
both directions rather than one of them passing for the wrong reason.

Verification

  • go test ./... green, just aterm-contract green.
  • pre-commit run --all-files green.
  • A real --dry-run --json: the default plan carries no --sound, and
    --sound puts it in the session argv.

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

Kai wants the sound off. `--silent` and `ATERM_SILENT` become `--sound` and `ATERM_SOUND`, and a window is quiet unless one of them asks. ## Why a default rather than an env var `ATERM_SILENT=1` in a shell profile would have covered a typed `aterm` and nothing else. The generated `.app` wrapper harvests exactly `PATH` from a login shell (`bundle_contents.go`), and a Finder launch carries none of the caller's environment, so every Dock and Spotlight launch would have kept chiming. Two ways in, and only a default reaches both. ## Not a removal The samples still ship, `just aterm-sounds` still renders them, and the timbre still travels on the session card, so `--sound` is a full restore rather than a rebuild. The contract test still asserts every timbre has a sample. What changed is which way the switch points. ## One test refactor this forced `soundWanted` took stdout and the opt-in together, and the suite runs off a terminal, so the positive case was unassertable through it: the old test read as proving `--silent` won when a pipe would have returned false anyway. The opt-in splits into `soundAsked`, which is testable anywhere, and `soundWanted` stays the terminal gate over it. Both are now covered in both directions rather than one of them passing for the wrong reason. ## Verification - `go test ./...` green, `just aterm-contract` green. - `pre-commit run --all-files` green. - A real `--dry-run --json`: the default plan carries no `--sound`, and `--sound` puts it in the session argv. Co-authored-by: Kai Siren <coilysiren@gmail.com> Co-authored-by: Claude <noreply@anthropic.com> Agent-Role: frontend
feat(aterm): soften the glare rolloff so the creature keeps its shading
All checks were successful
ci / aos-cli-tests (pull_request) Successful in 34s
ci / gate (pull_request) Successful in 54s
38b5e2664f
Kai on the first cut: it hit the legibility goal and lost a lot of the
creature's visual quality. She is right, and the mechanism is not a bug in
the tuning. Fading highlights without fading midtones compresses the
gradient between them, so a rolloff always pays for legibility with
shading. Depth only decides how much.

knee 0.46 and depth 0.58 altered 28% of the art, which is the flat belly
and dulled palette wood she saw. knee 0.62 and depth 0.30 alters 16%,
touching the specular pops and leaving the midtones. Frontend measures
4.29:1 from the shipped code path against 3.48:1 untouched, so most of the
gain survives at a bit over half the cost.

## What was put in front of her

Four points on the curve rendered full size over real session text, with
what each costs: untouched, the shipped cut, this one, and a uniform dim
at 15%. She picked this one.

The uniform dim is worth recording rather than discarding. Presence is a
blend toward the window background, so lowering it preserves every ratio
inside the art exactly and spends brightness instead of fidelity: 15%
reaches 4.0:1 altering nothing. It is the option that cannot damage the
art, and docs/aterm-creature.md now carries it as the standing exit if the
16% still reads as flattening on a real screen.

## A target I set and should not have

The first cut aimed at WCAG AA 4.5:1. Kai asked for slightly clearer text
rather than a standard, and the extra legibility past her ask is what the
art paid for. The knee is now set against what she can see rather than
against a number I chose for her.

## Verification

- `go test ./...` green. The tests read the constants rather than literal
  numbers, so retuning did not need one of them rewritten, which is why a
  retune is a two-line diff.
- `pre-commit run --all-files` green.
- Re-measured from the plate the real binary wrote, not the prototype.
- The doc claim of "above 4.5:1 after" was true of the old numbers and is
  now corrected rather than left standing.

Co-authored-by: Kai Siren <coilysiren@gmail.com>
Co-authored-by: Claude <noreply@anthropic.com>
Agent-Role: frontend
feat(aterm)!: make the launch sound opt-in
All checks were successful
ci / aos-cli-tests (pull_request) Successful in 34s
ci / gate (pull_request) Successful in 55s
f5aa2c0bed
Kai wants the sound off. `--silent` and `ATERM_SILENT` become `--sound`
and `ATERM_SOUND`, and a window is quiet unless one of them asks.

## Why a default rather than an env var

`ATERM_SILENT=1` in a shell profile would have covered a typed `aterm`
and nothing else. The generated `.app` wrapper harvests exactly `PATH`
from a login shell (`bundle_contents.go`), and a Finder launch carries
none of the caller's environment, so every Dock and Spotlight launch would
have kept chiming. Two ways in, and only a default reaches both.

## Not a removal

The samples still ship, `just aterm-sounds` still renders them, and the
timbre still travels on the session card, so `--sound` is a full restore
rather than a rebuild. The contract test still asserts every timbre has a
sample. What changed is which way the switch points.

## One test refactor this forced

`soundWanted` took stdout and the opt-in together, and the suite runs off
a terminal, so the positive case was unassertable through it: the old test
read as proving `--silent` won when a pipe would have returned false
anyway. The opt-in splits into `soundAsked`, which is testable anywhere,
and `soundWanted` stays the terminal gate over it. Both are now covered in
both directions rather than one of them passing for the wrong reason.

## Verification

- `go test ./...` green, `just aterm-contract` green.
- `pre-commit run --all-files` green.
- A real `--dry-run --json`: the default plan carries no `--sound`, and
  `--sound` puts it in the session argv.

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

Superseded by #1425, which is the same commit cut fresh from main.

This branch was reused from the gentle-rolloff work, so once #1422 squash-merged it sat behind main by its own squashed commit and the merge refused. Cherry-picking onto a fresh branch was the fix that needed no force-push. Closing this one rather than updating it, since the replacement is already green.

Superseded by #1425, which is the same commit cut fresh from main. This branch was reused from the gentle-rolloff work, so once #1422 squash-merged it sat behind main by its own squashed commit and the merge refused. Cherry-picking onto a fresh branch was the fix that needed no force-push. Closing this one rather than updating it, since the replacement is already green.
coilyco-ops closed this pull request 2026-08-29 21:05:03 +00:00
All checks were successful
ci / aos-cli-tests (pull_request) Successful in 34s
ci / gate (pull_request) Successful in 55s

Pull request closed

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!1424
No description provided.