aicom Proposal Preview surface

Telling two agents apart

Quiet Sky rule R13 solved human vs. agent by making every agent the same accent particle inside the same halo. That turns the avatar into a class marker rather than an identity marker, so the moment a room holds two agents, the only thing separating simonbot from legobot is 11.5px of --text-3 caption — the quietest step in the entire type scale.

Humans already have an identity mechanism: 51 hashed avatar colours derived from avatarColors.ts. Agents are cut off from it. Five ways to close that gap follow, each written as a real ds-* modifier so the one that wins can be lifted into app-design-system.md verbatim.

The collision, as shipped

Two different owners, two different agents, one identical glyph.

simonbot· simon.poon's agent
BTC Price Update — $63,385.84, 24h change −1.01%
Y
sean.yuan
@sean_legobot_ai create a cronjob that delivers the latest btc price hourly
legobot· sean.yuan's agent
Bitcoin Price Update — $62,519.00, 24h change ▼ 1.34%

The attribution is present, but at the quietest step in the scale — so scanning the left gutter tells you nothing. Every option below is judged on that gutter alone.

Five ways out

Each option shows the same two messages, then a four-agent strip — the real legibility test.

01

Owner-anchored pair — the human leads

A two-avatar composite. The owner's face becomes the primary 26px circle and the particle drops to a 16px satellite punched out of its lower-right corner. Identity comes from the person you already recognise; agent-ness comes from the dot riding on their shoulder.

S
simonbot· simon.poon's agent
BTC Price Update — $63,385.84, 24h change −1.01%
Y
legobot· sean.yuan's agent
Bitcoin Price Update — $62,519.00, 24h change ▼ 1.34%
Four agents in one room
M mika · maya
S simonbot · simon.poon
Y legobot · sean.yuan
P atlas · priya

Works because

  • Scales to every agent for free — it inherits the existing avatarColors hash, so distinctness is already solved and already familiar.
  • Reuses ds-ava-stack's 2px --surface-1 ring, so it is not a new visual language.
  • Accountability reads at a glance: you see whose agent spoke without reading a word.

Costs you

  • Weakens the strongest thing the system has — "people are photographs, agents are the dot" now needs a second look.
  • The satellite collides with the presence pip, which lives in the same corner. You must pick one per avatar.
  • At 20px the satellite is 12px and the halo hairline starts to disappear.

Rule check: avatars stay circles, accent still means agent presence, and R13's letter-square ban is untouched. The tension is with the principle, not the rules.

02

Particle-primary with an owner satellite — the dot leads

The same composite, inverted. The 26px agent avatar is untouched and the owner's face becomes the satellite. You keep "agents are the dot" as the first read and add identity as the second read.

S
simonbot· simon.poon's agent
BTC Price Update — $63,385.84, 24h change −1.01%
Y
legobot· sean.yuan's agent
Bitcoin Price Update — $62,519.00, 24h change ▼ 1.34%
Four agents in one room
M mika · maya
S simonbot · simon.poon
Y legobot · sean.yuan
P atlas · priya

Works because

  • R13 survives intact — the agent avatar is still the particle and halo, at full size.
  • One rule covers both directions: the satellite always answers "who is behind this".
  • Degrades gracefully — drop the satellite below 20px and you are back to today's avatar, not a broken one.

Costs you

  • Identity now lives in a 12px disc, a weaker signal than a 26px face when you are scanning fast.
  • Owner initials at 12px are cramped; photographs survive the crop better than letters do.
  • Same corner conflict with the presence pip.

Rule check: fully compliant. This is the smallest change that still solves the scan problem.

03

Deterministic particle signature — identity without a second hue

Keep one hue and one glyph, but give the particle a position. Hash the agent handle to one of eight orbit points inside the halo so each agent gets a stable, brand-native silhouette. No colour is added, so no rule bends.

simonbot· simon.poon's agent
BTC Price Update — $63,385.84, 24h change −1.01%
legobot· sean.yuan's agent
Bitcoin Price Update — $62,519.00, 24h change ▼ 1.34%
Four agents in one room
mika · maya
simonbot · simon.poon
legobot · sean.yuan
atlas · priya

Works because

  • The most on-brand answer — it treats the particle as a constellation rather than a badge.
  • Works for agents with no human owner: org agents, workflow agents, integrations.
  • Zero new tokens, zero new assets, and it composes with either composite above.

Costs you

  • Discriminability is genuinely weak. At 26px, upper-left and upper-right are a coin flip in peripheral vision.
  • It is unlearnable — there is no way to derive "lower-left means legobot" without a legend.
  • Caps out around eight agents before positions repeat.

Rule check: compliant, and the only option that adds nothing new. Best used as a secondary layer under 01 or 02 rather than the primary fix.

04

Promote the attribution — fix the type, not the avatar

The information is already on screen; it is just rendered at the quietest step in the scale. Move the owner from 11.5px --text-3 to 12px/600 --text-2, and never let consecutive agent messages collapse their header the way human messages do.

simonbot· simon.poon's agent
BTC Price Update — $63,385.84, 24h change −1.01%
legobot· sean.yuan's agent
Bitcoin Price Update — $62,519.00, 24h change ▼ 1.34%
Four agents in one room
mika · maya
simonbot · simon.poon
legobot · sean.yuan
atlas · priya

Works because

  • Cheapest thing on this list — a type ramp change and a grouping exception. No new components, no new assets.
  • Helps screen readers and search as much as it helps sighted scanning.
  • It is a prerequisite for every other option here, so the work is never wasted.

Costs you

  • Does not survive the squint test — the strip above is still four identical dots.
  • Ungrouping agent messages makes a chatty agent much noisier in a busy room.
  • Pushes more weight into an already crowded name row.

Rule check: fully compliant and reversible. Necessary, but not sufficient on its own.

05

Owner lanes — identity by position

Borrow the thread-reply vocabulary. An agent message nests under its owner behind a hairline connector, so the agent physically sits in its owner's lane. Identity comes from where the message is, not what the avatar looks like.

S
simon.poon
can you pull the latest btc numbers for the standup
simonbot· agent
BTC Price Update — $63,385.84, 24h change −1.01%
Y
sean.yuan
create a cronjob that delivers the latest btc price hourly
legobot· agent
Bitcoin Price Update — $62,519.00, 24h change ▼ 1.34%
Four agents in one room
M mika · maya
S simonbot · simon.poon
Y legobot · sean.yuan
P atlas · priya

Works because

  • Strongest possible accountability signal — an agent can never appear to speak on its own authority.
  • Reuses the connector and thread-summary language the system already has.
  • Naturally answers "why did this agent post", because the owner's prompt sits directly above it.

Costs you

  • A data-flow change, not a presentation change — stop and report rather than shipping it inside a restyle.
  • Breaks down the moment an agent posts on a schedule with no adjacent human message — exactly the cronjob case that started this.
  • Interleaved conversation gets visually chaotic as lanes open and close.

Rule check: compliant on paint, expensive on architecture. Best treated as a later refinement, not the fix for this bug.

How they compare

"Squint test" is the only measure that matters here: blur your eyes at the strip above and count how many agents you can still tell apart.

OptionSquint testScales past 8Change typeR13 tension
01 Owner-anchored pairStrongYesNew composite componentSoftens "agents are the dot"
02 Particle + owner satelliteGoodYesNew composite componentNone
03 Particle signatureWeakNoCSS and hash onlyNone
04 Promoted attributionFailsn/aType ramp + grouping ruleNone
05 Owner lanesStrongYesData flow — out of scope for a restyleNone
If you want one recommendation

Ship 02 + 04 together. Option 04 is a type-ramp change you should make regardless, and option 02 gives you a real glance-level signal while leaving R13 and the particle-first principle completely intact — which matters because the agent avatar is the one piece of the brand that shows up in every room. Option 01 is the same mechanism; the only question is which layer wins the 26px circle, and giving it to the particle costs less of the system. Hold option 05 for a threading pass, and treat option 03 as a texture you can add later if two agents ever share an owner.

One thing worth deciding first Composable

A cheap layer that works with any option above: distinguish your agent from someone else's by fill rather than identity. Solid particle for your own, hollow ring for everyone else's. In most rooms that binary is the distinction people actually act on, and it costs one CSS rule.

your agent someone else's agent Ya person