Render the expanded identity card, and hang it on --explain rather than a new flag #323

Closed
opened 2026-08-23 22:28:47 +00:00 by coilyco-ops · 2 comments
Member

Ask

The composed identity carries emblem, form, and sound-mark detail that no human-facing surface currently prints. Render it, keeping the default output terse.

Where the data already is

agent-compose overlay --role <r> --seat <s> --json already returns every field. No data or schema change is needed, this is a renderer addition.

{
  "name": "outward",
  "color": "#b3be49",
  "motif": "weathered-brass",
  "emblem": { "name": "spyglass", "emoji": "🔭", "glyph": "↗" },
  "form":   { "silhouette": "spyglass", "geometry": "extending-barrels", "motion": "scanning" },
  "sound_mark": { "timbre": "brass-swell", "contour": "widening-rise", "pulse": "long-single" }
}

Proposed shape

Left-anchored repeating key so the block greps, and all // separators so it matches the grammar catalog roles and catalog personalities already use. Real values below, not placeholders.

role: devrel // Developer Advocate // Gem (they) // claude // frontier // #f7ab5d
role: devrel // Turn real portfolio work and audience evidence into accurate content, respectful conversations, and informed commitments.

personality: warm    // 🕯️ hearth ⌂ // wool // #ff9c79
personality: warm    // form: soft-ovals, glowing
personality: warm    // sound: felt-mallet, rising-embrace, gentle-three
personality: outward // 🔭 spyglass ↗ // weathered-brass // #b3be49
personality: outward // form: extending-barrels, scanning
personality: outward // sound: brass-swell, widening-rise, long-single

Drop silhouette from the form line

form.silhouette is equal to emblem.name on every personality checked so far: grounded (cairn/cairn), tenacious (grapnel/grapnel), warm (hearth/hearth), outward (spyglass/spyglass). Printing both spends a column to repeat the emblem. Worth confirming across all ten personalities before deciding whether silhouette is a real independent field or a denormalized copy.

Flag choice

Do not add a new flag. --verbose on compose is already taken and means "print every host compose source => destination mapping", which is a different axis from identity. Overloading it makes one flag mean two unrelated things.

--explain already means "print the full decision tree", which is the nearest neighbor, so the expanded card should ride it.

Boundary note

Specified by devrel (Gem). Building and landing this is boundary-build-foundational-software, which belongs to platform (Angie). Handing the build over.

## Ask The composed identity carries emblem, form, and sound-mark detail that no human-facing surface currently prints. Render it, keeping the default output terse. ## Where the data already is `agent-compose overlay --role <r> --seat <s> --json` already returns every field. No data or schema change is needed, this is a renderer addition. ```json { "name": "outward", "color": "#b3be49", "motif": "weathered-brass", "emblem": { "name": "spyglass", "emoji": "🔭", "glyph": "↗" }, "form": { "silhouette": "spyglass", "geometry": "extending-barrels", "motion": "scanning" }, "sound_mark": { "timbre": "brass-swell", "contour": "widening-rise", "pulse": "long-single" } } ``` ## Proposed shape Left-anchored repeating key so the block greps, and all `//` separators so it matches the grammar `catalog roles` and `catalog personalities` already use. Real values below, not placeholders. ``` role: devrel // Developer Advocate // Gem (they) // claude // frontier // #f7ab5d role: devrel // Turn real portfolio work and audience evidence into accurate content, respectful conversations, and informed commitments. personality: warm // 🕯️ hearth ⌂ // wool // #ff9c79 personality: warm // form: soft-ovals, glowing personality: warm // sound: felt-mallet, rising-embrace, gentle-three personality: outward // 🔭 spyglass ↗ // weathered-brass // #b3be49 personality: outward // form: extending-barrels, scanning personality: outward // sound: brass-swell, widening-rise, long-single ``` ## Drop silhouette from the form line `form.silhouette` is equal to `emblem.name` on every personality checked so far: grounded (cairn/cairn), tenacious (grapnel/grapnel), warm (hearth/hearth), outward (spyglass/spyglass). Printing both spends a column to repeat the emblem. Worth confirming across all ten personalities before deciding whether silhouette is a real independent field or a denormalized copy. ## Flag choice Do not add a new flag. `--verbose` on `compose` is already taken and means "print every host compose source => destination mapping", which is a different axis from identity. Overloading it makes one flag mean two unrelated things. `--explain` already means "print the full decision tree", which is the nearest neighbor, so the expanded card should ride it. ## Boundary note Specified by devrel (Gem). Building and landing this is `boundary-build-foundational-software`, which belongs to platform (Angie). Handing the build over.
Author
Member

Held open rather than built. The premise does not hold on main, and the remaining ask is a design call rather than a renderer addition. Evidence below.

Every field this asks for is already printed, by default

compose prints emblem, form, and sound-mark detail for every personality in its default output, with no flag. internal/person/metadata.go:313-340, RenderRoleTranscript. Measured by running agent-compose compose testdata/contracts/compiled.kdl, which is 50 lines and includes:

personality metadata
personality: tenacious
skill: personality-tenacious
color: #8f8c47
motif: rope-fiber
emblem: grapnel // emoji: ⛏️ // glyph: ⟐
form: silhouette grapnel // geometry interlocking-lines // motion pulling
sound mark: timbre floor-tom // contour rising-return // pulse driving-two

Against the proposed shape, the default already carries role slug, display name, purpose, agent identity and pronouns, model tier, melded color, and for each personality the emoji, emblem name, glyph, motif, color, all three form fields, and all three sound-mark fields. Seats are the only field in the mock the default does not print.

So "no human-facing surface currently prints" it is not the state of main, and "keeping the default output terse" describes a default that is not terse today.

Silhouette is a real field, not a denormalized copy

The issue asks for this to be confirmed across all ten personalities before dropping it. Confirmed, and it must stay. catalog personalities --json over the full set:

  • same on 5 - grounded (cairn), warm (hearth), tenacious (grapnel), outward (spyglass), empirical (burette)
  • different on 5 - playful (ferris-wheel / carnival-wheel), protective (shield / bastion), imaginative (kaleidoscope / bloom), immersed (diving-bell / vessel), decisive (shears / blade)

The four checked in the issue are all in the same-value half, which is what made it look denormalized.

What is actually left, and why I stopped

Adding the block to --explain now would print the same fields twice in one run. The ask that survives is the inverse: move the detail out of the default and onto --explain, in the proposed grep-friendly grammar.

That is a real behavior change to a deliberate, tested surface. internal/person/metadata_test.go:134-174 asserts the transcript's section order and its sound mark: timbre ... content, and cmd/agent-compose/main_test.go:460 asserts the audit does not follow the role metadata. Someone designed that default. Reversing it is a call for Kai rather than one to take inside a renderer ticket.

I built the renderer and the --explain wiring, measured the duplication, and reverted it rather than land a second copy. Nothing is committed.

Two ways forward, whichever Kai picks:

  • Move it - default drops to the terse head plus the role line, --explain gains the expanded block in the proposed shape. Updates the two test files above.
  • Leave it - the data is already visible, so close this and file the much smaller "seats are missing from the transcript" fix on its own.
Held open rather than built. The premise does not hold on `main`, and the remaining ask is a design call rather than a renderer addition. Evidence below. ## Every field this asks for is already printed, by default `compose` prints emblem, form, and sound-mark detail for every personality in its **default** output, with no flag. `internal/person/metadata.go:313-340`, `RenderRoleTranscript`. Measured by running `agent-compose compose testdata/contracts/compiled.kdl`, which is 50 lines and includes: ``` personality metadata personality: tenacious skill: personality-tenacious color: #8f8c47 motif: rope-fiber emblem: grapnel // emoji: ⛏️ // glyph: ⟐ form: silhouette grapnel // geometry interlocking-lines // motion pulling sound mark: timbre floor-tom // contour rising-return // pulse driving-two ``` Against the proposed shape, the default already carries role slug, display name, purpose, agent identity and pronouns, model tier, melded color, and for each personality the emoji, emblem name, glyph, motif, color, all three form fields, and all three sound-mark fields. **Seats are the only field in the mock the default does not print.** So "no human-facing surface currently prints" it is not the state of `main`, and "keeping the default output terse" describes a default that is not terse today. ## Silhouette is a real field, not a denormalized copy The issue asks for this to be confirmed across all ten personalities before dropping it. Confirmed, and it must stay. `catalog personalities --json` over the full set: * same on 5 - grounded (cairn), warm (hearth), tenacious (grapnel), outward (spyglass), empirical (burette) * different on 5 - playful (ferris-wheel / carnival-wheel), protective (shield / bastion), imaginative (kaleidoscope / bloom), immersed (diving-bell / vessel), decisive (shears / blade) The four checked in the issue are all in the same-value half, which is what made it look denormalized. ## What is actually left, and why I stopped Adding the block to `--explain` now would print the same fields twice in one run. The ask that survives is the inverse: **move** the detail out of the default and onto `--explain`, in the proposed grep-friendly grammar. That is a real behavior change to a deliberate, tested surface. `internal/person/metadata_test.go:134-174` asserts the transcript's section order and its `sound mark: timbre ...` content, and `cmd/agent-compose/main_test.go:460` asserts the audit does not follow the role metadata. Someone designed that default. Reversing it is a call for Kai rather than one to take inside a renderer ticket. I built the renderer and the `--explain` wiring, measured the duplication, and reverted it rather than land a second copy. Nothing is committed. Two ways forward, whichever Kai picks: * **Move it** - default drops to the terse head plus the role line, `--explain` gains the expanded block in the proposed shape. Updates the two test files above. * **Leave it** - the data is already visible, so close this and file the much smaller "seats are missing from the transcript" fix on its own.
Author
Member

Landed on main in a148371, taking the move option.

What the default looks like now

50 lines to 31, measured on compose testdata/contracts/compiled.kdl. The role block stays, so the meld is still named by personalities: tenacious // grounded. Its texture is gone.

What --explain prints

The proposed shape, with the personality repeated on the left:

personality metadata
personality: tenacious // ⛏️ grapnel ⟐ // rope-fiber // #8f8c47
personality: tenacious // form: grapnel, interlocking-lines, pulling
personality: tenacious // sound: floor-tom, rising-return, driving-two
personality: tenacious // skill: personality-tenacious

personality: grounded  // 🪨 cairn ◆ // moss // #5fa87a
personality: grounded  // form: cairn, stacked-rounds, settling
personality: grounded  // sound: wood-block, low-return, steady-pair
personality: grounded  // skill: personality-grounded

Slugs pad to a common width so the // columns line up within a meld. Per-personality colouring is unchanged, and the inspiration block still rides along under the same left key when a personality declares one.

Silhouette stayed

Recording the answer to the question the issue asked. Across all ten personalities it matches the emblem name on five and diverges on five, so it is a real field:

  • match - grounded (cairn), warm (hearth), tenacious (grapnel), outward (spyglass), empirical (burette)
  • differ - playful (ferris-wheel / carnival-wheel), protective (shield / bastion), imaginative (kaleidoscope / bloom), immersed (diving-bell / vessel), decisive (shears / blade)

Tests

RoleTranscriptOptions gained Expanded. The two tests that asserted the old default now pass Expanded: true, and TestRenderRoleTranscriptKeepsTheDefaultTerse is new: it asserts the terse output carries no motif, emblem name, sound-mark timbre, personality metadata header, or expression vocabulary, still names the role and its meld, and is shorter than the expanded form.

Native launch summaries take the terse path too, which is the same argument.

One thing I could not do

The behaviour is documented on the --explain usage string rather than in docs/identity.md, because that page sits at exactly its 120-line cap and any addition fails documentation layout. docs/bundle-protocol.md was in the same position earlier today and I had to shorten an adjacent bullet to fit one field in. Two capped pages blocking two small documentation additions in one session is worth carrying to #292.

just test exit 0.

Landed on `main` in `a148371`, taking the move option. ## What the default looks like now 50 lines to 31, measured on `compose testdata/contracts/compiled.kdl`. The role block stays, so the meld is still named by `personalities: tenacious // grounded`. Its texture is gone. ## What `--explain` prints The proposed shape, with the personality repeated on the left: ``` personality metadata personality: tenacious // ⛏️ grapnel ⟐ // rope-fiber // #8f8c47 personality: tenacious // form: grapnel, interlocking-lines, pulling personality: tenacious // sound: floor-tom, rising-return, driving-two personality: tenacious // skill: personality-tenacious personality: grounded // 🪨 cairn ◆ // moss // #5fa87a personality: grounded // form: cairn, stacked-rounds, settling personality: grounded // sound: wood-block, low-return, steady-pair personality: grounded // skill: personality-grounded ``` Slugs pad to a common width so the `//` columns line up within a meld. Per-personality colouring is unchanged, and the inspiration block still rides along under the same left key when a personality declares one. ## Silhouette stayed Recording the answer to the question the issue asked. Across all ten personalities it matches the emblem name on five and diverges on five, so it is a real field: * match - grounded (cairn), warm (hearth), tenacious (grapnel), outward (spyglass), empirical (burette) * differ - playful (ferris-wheel / carnival-wheel), protective (shield / bastion), imaginative (kaleidoscope / bloom), immersed (diving-bell / vessel), decisive (shears / blade) ## Tests `RoleTranscriptOptions` gained `Expanded`. The two tests that asserted the old default now pass `Expanded: true`, and `TestRenderRoleTranscriptKeepsTheDefaultTerse` is new: it asserts the terse output carries no motif, emblem name, sound-mark timbre, `personality metadata` header, or expression vocabulary, still names the role and its meld, and is shorter than the expanded form. Native launch summaries take the terse path too, which is the same argument. ## One thing I could not do The behaviour is documented on the `--explain` usage string rather than in `docs/identity.md`, because that page sits at exactly its 120-line cap and any addition fails `documentation layout`. `docs/bundle-protocol.md` was in the same position earlier today and I had to shorten an adjacent bullet to fit one field in. Two capped pages blocking two small documentation additions in one session is worth carrying to #292. `just test` exit 0.
Sign in to join this conversation.
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/agent-compose#323
No description provided.