feat(person): give exec and ai a personality each owns, closing the last emphasis collision #299

Merged
coilysiren merged 1 commit from aos/claude/personality-catalog-gaps into main 2026-08-17 17:55:01 +00:00
Member

The create half of the catalog refactor. Delete stayed empty, because #296 separated the merge candidates instead.

The defect

Exec and ai owned no personality uniquely:

  • exec - curious 3x, grounded 2x, decisive 2x
  • ai - curious 3x, meticulous 3x, skeptical 2x

Every slot shared, so neither role could take a distinct static emphasis without taking one from ops or qa. Six roles solved cleanly and these two forced a compromise.

The change

validateCorePersonalityMelds caps a core role at exactly three personalities, so this is a swap, not an addition. Both roles gave up curious, which they shared with engineer and which neither was best served by.

  • outward (exec, #b3be49) - checks the local answer against the world outside it, thinks in opportunity cost. Exec already owns boundary-seek-external-validation and nothing in the catalog expressed it.
  • empirical (ai, #2ed1aa) - produces the measurement rather than reasoning toward the answer. States the criterion before running, freezes the other variables, keeps the raw result. Curious explores, skeptical doubts someone else's claim, meticulous checks parts. None of them was measurement discipline, which is most of what role-ai actually asks for.

Dropping curious is a charter improvement in both cases, not only a distinctness fix.

Colors

Searched the terminal-legible band internal/color enforces, constrained to the catalog's own chroma and lightness range so the new pair stays in family, then picked the pair whose weakest separation from the existing sixteen is largest. The unconstrained optimum was a neon lime and a neon mint, which scored better and looked nothing like the palette.

Both land 0.11 or better from every existing color. The catalog's own closest pair is 0.045.

Result

The emphasis assignment now solves completely:

  • engineer to tenacious, director to bold, qa to candid, ops to reflective
  • design to playful, exec to outward, creator to warm, ai to empirical

All eight distinct, all at usage 1, minimum separation 0.1099 against 0.0726 before. No role is left without a personality it alone owns.

Prose follows the post-#296 rules. Content-word cosine puts both new bodies at 0.224 from their nearest neighbour, under the catalog's worst pair of 0.253. Mean across all 153 pairs is 0.1168, unchanged from the 16-personality 0.1153, so the additions did not dilute.

What this does not fix

The role favorite colors. Measured on the real color.Favorite output, not an approximation:

  • mean separation 0.1405 to 0.1458
  • minimum 0.0334 to 0.0347, effectively flat

Pairs shuffled rather than improved. design/ai went 0.047 to 0.121, but qa/ai went 0.063 to 0.035 and is now the closest pair, because both roles meld meticulous and skeptical, which are the catalog's two nearest colors at 0.045 apart. Averaging three colors where two nearly coincide lands in the same place whatever the third is.

That is the centroid, not the roster, and no personality edit reaches it. It belongs to color.Favorite.

Test change

TestValidateCoreBoundariesRejectsUnbalancedRoster/overused_personality pushed curious to a fourth role to trip the cap. Curious is now used once, so the fixture uses meticulous, which still sits at three. The assertion is unchanged.

go build ./..., go test ./..., and pre-commit run --all-files pass. docs/FEATURES.md, docs/personality.md, and docs/person-contract.md carried a hardcoded count of sixteen, and docs/role-briefings.md used exec's real meld as its example. All four updated.

The create half of the catalog refactor. Delete stayed empty, because #296 separated the merge candidates instead. ## The defect Exec and ai owned no personality uniquely: * exec - curious 3x, grounded 2x, decisive 2x * ai - curious 3x, meticulous 3x, skeptical 2x Every slot shared, so neither role could take a distinct static emphasis without taking one from ops or qa. Six roles solved cleanly and these two forced a compromise. ## The change `validateCorePersonalityMelds` caps a core role at exactly three personalities, so this is a swap, not an addition. Both roles gave up **curious**, which they shared with engineer and which neither was best served by. * **outward** (exec, `#b3be49`) - checks the local answer against the world outside it, thinks in opportunity cost. Exec already owns `boundary-seek-external-validation` and nothing in the catalog expressed it. * **empirical** (ai, `#2ed1aa`) - produces the measurement rather than reasoning toward the answer. States the criterion before running, freezes the other variables, keeps the raw result. Curious explores, skeptical doubts someone else's claim, meticulous checks parts. None of them was measurement discipline, which is most of what `role-ai` actually asks for. Dropping curious is a charter improvement in both cases, not only a distinctness fix. ## Colors Searched the terminal-legible band `internal/color` enforces, constrained to the catalog's own chroma and lightness range so the new pair stays in family, then picked the pair whose weakest separation from the existing sixteen is largest. The unconstrained optimum was a neon lime and a neon mint, which scored better and looked nothing like the palette. Both land 0.11 or better from every existing color. The catalog's own closest pair is 0.045. ## Result The emphasis assignment now solves completely: * engineer to tenacious, director to bold, qa to candid, ops to reflective * design to playful, exec to **outward**, creator to warm, ai to **empirical** All eight distinct, all at usage 1, minimum separation **0.1099** against 0.0726 before. No role is left without a personality it alone owns. Prose follows the post-#296 rules. Content-word cosine puts both new bodies at 0.224 from their nearest neighbour, under the catalog's worst pair of 0.253. Mean across all 153 pairs is 0.1168, unchanged from the 16-personality 0.1153, so the additions did not dilute. ## What this does not fix **The role favorite colors.** Measured on the real `color.Favorite` output, not an approximation: * mean separation 0.1405 to **0.1458** * minimum 0.0334 to **0.0347**, effectively flat Pairs shuffled rather than improved. design/ai went 0.047 to 0.121, but qa/ai went 0.063 to **0.035** and is now the closest pair, because both roles meld meticulous and skeptical, which are the catalog's two nearest colors at 0.045 apart. Averaging three colors where two nearly coincide lands in the same place whatever the third is. That is the centroid, not the roster, and no personality edit reaches it. It belongs to `color.Favorite`. ## Test change `TestValidateCoreBoundariesRejectsUnbalancedRoster/overused_personality` pushed curious to a fourth role to trip the cap. Curious is now used once, so the fixture uses meticulous, which still sits at three. The assertion is unchanged. `go build ./...`, `go test ./...`, and `pre-commit run --all-files` pass. `docs/FEATURES.md`, `docs/personality.md`, and `docs/person-contract.md` carried a hardcoded count of sixteen, and `docs/role-briefings.md` used exec's real meld as its example. All four updated.
feat(person): give exec and ai a personality each owns, closing the last emphasis collision
All checks were successful
ci / test (pull_request) Successful in 49s
45fd7f57a8
Exec and ai owned no personality uniquely. Every one of exec's three (curious
3x, grounded 2x, decisive 2x) and ai's three (curious 3x, meticulous 3x,
skeptical 2x) was shared with another role, so neither could take a distinct
static emphasis without stealing one from ops or qa. That is the catalog defect
the emphasis assignment exposed.

Add two personalities and swap each in for curious, which both roles carried
and neither was best served by. A core role is capped at exactly three
personalities by validateCorePersonalityMelds, so this is a swap rather than an
addition, and dropping curious is a charter improvement in both cases rather
than only a distinctness fix.

* outward (exec, #b3be49) - checks the local answer against the world outside
  it, and thinks in opportunity cost. Exec already owns
  boundary-seek-external-validation and no personality expressed it.
* empirical (ai, #2ed1aa) - produces the measurement instead of reasoning
  toward the answer. Freezes the variable, states the criterion first, keeps
  the raw result. Curious explores, skeptical doubts, meticulous is exact, and
  none of them was measurement discipline.

Colors come from a search of the terminal-legible band constrained to the
catalog's own chroma and lightness range, picking the pair whose weakest
separation from the existing sixteen is largest. Both land at 0.11 or better,
against a catalog whose own closest pair is 0.045.

The emphasis assignment now solves completely: all eight emphases distinct, all
at usage 1, minimum separation 0.1099 against 0.0726 before, and no role left
without a personality it alone owns.

Prose follows the post-#296 rules. Content-word cosine puts both new bodies at
0.224 from their nearest neighbour, under the catalog's worst pair of 0.253.

This does not fix the role favorite colors, and it cannot. Mean separation
moves 0.1405 to 0.1458 while the minimum stays flat at 0.0334 to 0.0347, with
qa and ai now the closest pair because both meld meticulous and skeptical, the
catalog's two nearest colors. Averaging three colors where two nearly coincide
lands in the same place whatever the third is. That belongs to color.Favorite.

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>
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/agent-compose!299
No description provided.