Crow personas and generated banter

- personas.go: backstory, prompt policy and output policy per crow;
  Hugin and Munin grounded in Grimnismal 20 and Gylfaginning 38;
  every working crow also follows a common output policy
- Personas go into each crow's instructions; Sentry keeps JSON-only
- banter.go: retrieve backstory, relationships and recent flock
  memory, then the speaking crow generates one line in character;
  max 2 per list against the list budget, never blocks work,
  unusable lines dropped
- crow.banter event, GET /api/crows, `crows personas` -> PERSONAS.md
- UI: epithets on tiles and messages, banter as quiet asides

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01UQnSw4RRWp8uqpj3nsnnXF
This commit is contained in:
SmokeyandClaude Opus 5.5 committed 2026-10-27 17:31:53 -06:00
1 parent 4499291231
commit 57e9fc2fd2
13 files changed
+824 -8

No files matched your search

+9
View File
@@ -123,6 +123,7 @@ body { margin: 0; background: var(--paper); color: var(--ink); font: 500 17px/1.
.tile.has-pending { background: rgb(155 47 34 / 0.06); }
.tile-text { min-width: 0; }
.tile-name { margin: 0; font: 400 16px/1.15 var(--display); }
.epithet { font: italic 500 14px/1 var(--body); color: var(--muted); }
.update {
margin: 3px 0 0; font: italic 500 14px/1.3 var(--body); color: var(--muted);
white-space: nowrap; overflow: hidden; text-overflow: ellipsis;
@@ -224,6 +225,14 @@ body { margin: 0; background: var(--paper); color: var(--ink); font: 500 17px/1.
.reaction.good, .reaction.auto { color: var(--ink); }
.reaction.bad { color: var(--red); }
/* Banter: a quiet aside between crows, smaller and set in from the work. */
.msg.banter { grid-template-columns: 26px 1fr; gap: 0 10px; padding-top: 4px; padding-bottom: 8px; padding-left: 82px; }
.msg.banter .avatar { width: 26px; height: 24px; margin-top: 1px; }
.banter-line { margin: 0; font-size: 15px; }
.banter-who { display: block; font: 400 13px/1.2 var(--display); color: var(--muted); }
.banter-text { font-style: italic; }
@media (max-width: 759px) { .msg.banter { padding-left: 60px; } }
.msg.system { display: block; padding: 12px 28px; text-align: center; color: var(--muted); font-style: italic; font-size: 15px; }
.msg.system p { margin: 0; }
.msg.system.sparkle p::before {