feat(aterm): draw the identity card from form.geometry, animated on form.motion (#1255) #1276
No reviewers
Labels
No labels
burndown-2026-06
burndown-2026-08
autonomy
async-consult
autonomy
epic
autonomy
headless
autonomy
live-collab
coherence-core
priority
P0
priority
P1
priority
P2
priority
P3
priority
P4
qa-fixture
role/devrel
role/eval
role/exec
role/frontend
role/gamedev
role/human
role/platform
role/qa
role/sysadmin
role/tpm
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set
Reference
coilyco-flight-deck/agentic-os!1276
Loading…
Reference in a new issue
No description provided.
Delete branch "aos/claude/mu55-identity-card"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Closes #1255. Tier 2 of the #1245 dispatch, built on #1251.
What the window opens with
Left figure is
interlocking-lines, the grapnel. Right isstacked-rounds, the cairn. Both in their own personality color, both with the emoji beside the glyph, and the card printed by the_sessionstage before it starts the harness.The figure is generated, not drawn
The issue's insistence is the important part, so the plotter reads the grammar rather than matching the ten shipped values.
form.geometryis<arrangement>-<shape>: the arrangement becomes a field predicate over the grid, the shape becomes the glyph, and terminal cells being twice as tall as wide is handled once in the offset.That means a value nobody has shipped composes today.
radial-arcsis a real picture, and it is not the fallback picture, which the tests assert. An unknown word draws something rather than leaving a role with a blank card.motifpicks a sparse background stipple from a hashed palette, so a new motif also gets a texture without a table entry.emblem.emojijoins the glyph in the legend.The motion
Nine distinct
form.motionvalues ship and none had been animated. Each is a reveal order over the figure's own cells:spinningby angle,settlingdownward,pullingupward,unfoldingoutward,bracinginward,scanningacross,severingon the diagonal,titratingupward in stepsglowinghas nothing to reveal in order, so it arrives dim and brightens in placeTen frames over 400 ms, cursor-up between them, both personalities advancing under their own motion in lockstep. Verified inside a pty: 9 cursor-up frames, 287 truecolor sequences, the grapnel arriving from the bottom and the cairn from the top, which is
pullingagainstsettling.The no-animation escape
Off for
--no-motion, off forATERM_NO_MOTION, and off whenever stdout is not a character device. Measured: 0 frames when piped, 9 in a pty.How the card reaches the window
_sessiongrew--card <base64 json>, built bybuildLaunchPlanand carried in the terminal argv alongside--hold. The launcher cannot draw it, because the window is the child.parseSessionArgsnow returns asessionOptionsrather than two positional returns, which is what made room for--cardand--no-motionwithout another bare bool.--dry-runrenders the finished card as well, since a dry run that cannot show it cannot answer whether the identity looks right.One thing the issue asked for that is not there
The session id.
_sessionruns beforeaos _native-shadow, which is what assigns the id, so at card time it does not exist. The card names the lease state instead (leased session shadow/unleased, this window shares the canonical checkout), and the shadow prints its own id a moment later. Reordering to get the id would mean drawing the card after the harness has the screen, which defeats the point.Verification
just aterm-fmt,just aterm-lint,just aterm-testclean;uv run pytest724 passed;pre-commit run --all-filescleancard_test.go: every geometry the fixture ships draws inside the grid with no blank ink and no two alike, an unshipped geometry composes and is distinct from the fallback, six motions produce at least four distinct orders and drop no cells, the card round-trips launcher to session stage with its geometry intact, the card grows with progress, motion is off for each of the three escapes, and a malformed card is refusedaterm tpm --dry-runfor a second role's figuresDocs
Nothing added to
docs/aterm.md: it is at 7,995 of 8,000 chars withdocs/at 40 of 40 files, so there is no room for the walkthrough this earns.docs/FEATURES.mdcarries the one-line boundary change. Recorded as the second instance on #1274, which holds the decision.