fix(aterm): give each role bundle the window it opens #1304

Merged
coilyco-ops merged 2 commits from aos/claude/kb87-window-identity into main 2026-08-27 03:34:46 +00:00
Owner

Closes #1292.

Kai reported that every agent window reads kitty in the Mission Control row. Confirmed with her that the row shows app names for every app, and that the titlebar still carries the branded title, so this is app identity rather than a title defect.

macOS credits a window to the bundle holding the binary that drew it. aterm called kitty where it lives, so all seven roles' windows belonged to kitty.app.

  • Each bundle now links the terminal in beside its launcher (Contents/MacOS/kitty) and the wrapper opens through that link, falling back to the resolved terminal if the link is gone.
  • LSUIElement is dropped. The window belongs to this bundle now, and an accessory app cannot own the front window.
  • A shell launch prefers the role's installed bundle, so aterm platform from a terminal gets the same identity.
  • Homebrew's cask puts a shell script on PATH; generation follows it to the Mach-O it execs, and refuses a wrapper shape it cannot follow rather than linking a script the window server will not credit.
  • generatedRole skips non-regular files, so the stale scan no longer reads a linked application binary looking for its marker.

Measured on kais-macbook-pro, launching through a generated bundle:

"LSDisplayName"="Angie // Agentic Platform Engineer"
"CFBundleIdentifier"="me.coilysiren.aterm.platform"

Bundles have to be regenerated for this to reach the apps, and the release train has to publish first, so the installed aterm writes it.

Closes #1292. Kai reported that every agent window reads `kitty` in the Mission Control row. Confirmed with her that the row shows app names for every app, and that the titlebar still carries the branded title, so this is app identity rather than a title defect. macOS credits a window to the bundle holding the binary that drew it. aterm called kitty where it lives, so all seven roles' windows belonged to kitty.app. - Each bundle now links the terminal in beside its launcher (`Contents/MacOS/kitty`) and the wrapper opens through that link, falling back to the resolved terminal if the link is gone. - `LSUIElement` is dropped. The window belongs to this bundle now, and an accessory app cannot own the front window. - A shell launch prefers the role's installed bundle, so `aterm platform` from a terminal gets the same identity. - Homebrew's cask puts a shell script on `PATH`; generation follows it to the Mach-O it execs, and refuses a wrapper shape it cannot follow rather than linking a script the window server will not credit. - `generatedRole` skips non-regular files, so the stale scan no longer reads a linked application binary looking for its marker. Measured on kais-macbook-pro, launching through a generated bundle: ``` "LSDisplayName"="Angie // Agentic Platform Engineer" "CFBundleIdentifier"="me.coilysiren.aterm.platform" ``` Bundles have to be regenerated for this to reach the apps, and the release train has to publish first, so the installed `aterm` writes it.
fix(aterm): give each role bundle the window it opens
Some checks failed
ci / aos-eval-tests (pull_request) Successful in 7s
ci / ward-doctor (pull_request) Successful in 6s
ci / aos-cli-tests (pull_request) Failing after 25s
ci / gate (pull_request) Successful in 1m1s
a39d09b7ea
Mission Control, the Dock, and the switcher label a window with the app
that drew it, and every role's window was drawn by kitty where it lives,
so all seven read "kitty". Each bundle now links the terminal in beside
its launcher and opens through that link, which puts the role's name on
those surfaces. A shell launch prefers the role's installed bundle for
the same reason.

LSUIElement goes with it: the window belongs to this bundle now, and an
accessory app cannot own the front window. Homebrew's cask installs a
shell script on PATH, so generation follows it to the binary it execs
rather than linking a script the window server will not credit.

Measured on kais-macbook-pro: a window drawn through the generated
bundle reports LSDisplayName "Angie // Agentic Platform Engineer".

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Co-authored-by: Kai Siren <coilysiren@gmail.com>
Co-authored-by: Claude <noreply@anthropic.com>
Agent-Role: platform
fix(aterm): let every platform cover the bundle terminal lookup
All checks were successful
ci / ward-doctor (pull_request) Successful in 8s
ci / aos-eval-tests (pull_request) Successful in 8s
ci / aos-cli-tests (pull_request) Successful in 31s
ci / gate (pull_request) Successful in 50s
838713ea06
The lookup guarded on darwin, so CI ran the new test against a stub that
returned empty. Only a macOS bundle carries `Contents/MacOS/kitty`, so
the shape is the guard and the platform check bought nothing.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Co-authored-by: Kai Siren <coilysiren@gmail.com>
Co-authored-by: Claude <noreply@anthropic.com>
Agent-Role: platform
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!1304
No description provided.