feat(aterm): decode the whole identity overlay contract (#1251) #1267

Merged
coilyco-ops merged 1 commit from aos/claude/mu55-overlay-contract into main 2026-08-26 06:25:07 +00:00
Member

Closes #1251. Tier 1 of the #1245 dispatch, and the precondition for #1255 and #1256.

What changed

aterm/overlay.go declared 3 of the 11 fields a personality ships and 3 of the 5 a seat ships. Everything else was dropped by a struct that never named it, which JSON decoding does in silence. The struct now names every leaf agent-compose overlay --json ships:

  • seat - adds key and tier
  • personality - adds motif
  • emblem - adds name and emoji
  • form - new, silhouette / geometry / motion
  • sound_mark - new, timbre / contour / pulse

No behavior change. buildTitle still reads emblem.glyph, buildBrand still reads favorite_color, and aterm --dry-run output is byte-identical.

On the dead Color

The issue asked to drop it or use it. Declaring the full contract makes the second option the real one: TestOverlayDecodesEveryShippedField re-encodes each fixture through the struct and compares leaf paths and values against the raw JSON, so color is now a checked contract field rather than decoration, and so is every field added here.

That test was verified against a negative control. Retagging sound_mark to json:\"-\" fails it with six named paths per fixture, so it detects a silent drop rather than only passing.

Why docs/aterm.md is reflowed

docs/aterm.md sat at 120 of 120 lines with docs/ at 40 of 40 files, so no paragraph could land and the documentation-layout hook names splitting as trading one cap for the other. Normalized it to one paragraph per line, the same move agentic-os#1089 made on AGENTS.md. Content is byte-identical under whitespace normalization, asserted before committing: 120 lines to 73, 6,975 of 8,000 chars, and room for the tiers that consume these fields.

Verification

  • just aterm-fmt, just aterm-lint, just aterm-test clean
  • pre-commit run clean on every touched file
  • negative control above
Closes #1251. Tier 1 of the #1245 dispatch, and the precondition for #1255 and #1256. ## What changed `aterm/overlay.go` declared 3 of the 11 fields a personality ships and 3 of the 5 a seat ships. Everything else was dropped by a struct that never named it, which JSON decoding does in silence. The struct now names every leaf `agent-compose overlay --json` ships: * `seat` - adds `key` and `tier` * personality - adds `motif` * `emblem` - adds `name` and `emoji` * `form` - new, `silhouette` / `geometry` / `motion` * `sound_mark` - new, `timbre` / `contour` / `pulse` No behavior change. `buildTitle` still reads `emblem.glyph`, `buildBrand` still reads `favorite_color`, and `aterm --dry-run` output is byte-identical. ## On the dead `Color` The issue asked to drop it or use it. Declaring the full contract makes the second option the real one: `TestOverlayDecodesEveryShippedField` re-encodes each fixture through the struct and compares leaf paths and values against the raw JSON, so `color` is now a checked contract field rather than decoration, and so is every field added here. That test was verified against a negative control. Retagging `sound_mark` to `json:\"-\"` fails it with six named paths per fixture, so it detects a silent drop rather than only passing. ## Why docs/aterm.md is reflowed `docs/aterm.md` sat at 120 of 120 lines with `docs/` at 40 of 40 files, so no paragraph could land and the documentation-layout hook names splitting as trading one cap for the other. Normalized it to one paragraph per line, the same move agentic-os#1089 made on AGENTS.md. Content is byte-identical under whitespace normalization, asserted before committing: 120 lines to 73, 6,975 of 8,000 chars, and room for the tiers that consume these fields. ## Verification * `just aterm-fmt`, `just aterm-lint`, `just aterm-test` clean * `pre-commit run` clean on every touched file * negative control above
feat(aterm): decode the whole identity overlay contract (#1251)
All checks were successful
ci / ward-doctor (pull_request) Successful in 6s
ci / aos-eval-tests (pull_request) Successful in 7s
ci / aos-cli-tests (pull_request) Successful in 26s
ci / gate (pull_request) Successful in 51s
06ba3f372a
agent-compose ships 38 leaf fields in one overlay, 24 of them the sensory
identity spec, and aterm read exactly one of them (emblem.glyph). The rest were
dropped by a struct that never named them, which is silent.

Declare every leaf the overlay ships: seat key and tier, emblem name and emoji,
motif, the whole form object, and the whole sound_mark object. No behavior
changes. Color stops being decoration: the round-trip test re-encodes each
fixture through the struct and fails on any shipped leaf that does not come
back, verified against a negative control that drops sound_mark.

docs/aterm.md was at 120 of 120 lines with docs/ at 40 of 40 files, so no
paragraph could land and a split would only trade one cap for the other.
Normalized it to one paragraph per line, the same move agentic-os#1089 made on
AGENTS.md: 120 lines to 73, byte-identical content, and room for the tiers that
consume these fields.

Closes #1251

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