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

+4 -4
View File
@@ -196,7 +196,7 @@ func (f *Flock) Triage(ctx context.Context, w Watcher, item string, budgets ...*
}
func (f *Flock) llmTriage(ctx context.Context, w Watcher, item string, budgets ...*Budget) (Triage, error) {
text, err := f.ask(ctx, w, "Sentry", sentrySystem, "ITEM: "+item, budgets...)
text, err := f.ask(ctx, w, "Sentry", systemFor("Sentry", sentrySystem, false), "ITEM: "+item, budgets...)
if err != nil {
return Triage{}, err
}
@@ -256,7 +256,7 @@ func (f *Flock) Execute(ctx context.Context, w Watcher, item string, t Triage, n
return f.reconcile(ctx, w, item, crows, tasks, reports, budgets...)
default:
c := f.pick(nest, 1)[0]
ans, err := f.ask(ctx, w, c, crowSystem, "TASK: "+item, budgets...)
ans, err := f.ask(ctx, w, c, systemFor(c, crowSystem, true), "TASK: "+item, budgets...)
return Outcome{Answer: ans, Crows: []string{c}}, err
}
}
@@ -269,7 +269,7 @@ func (f *Flock) fanOut(ctx context.Context, w Watcher, crows, tasks []string, bu
wg.Add(1)
go func() {
defer wg.Done()
reports[i], errs[i] = f.ask(ctx, w, crows[i], crowSystem, "TASK: "+tasks[i], budgets...)
reports[i], errs[i] = f.ask(ctx, w, crows[i], systemFor(crows[i], crowSystem, true), "TASK: "+tasks[i], budgets...)
}()
}
wg.Wait()
@@ -293,6 +293,6 @@ func (f *Flock) reconcile(ctx context.Context, w Watcher, item string, crows, ta
for i := range reports {
fmt.Fprintf(&sb, "--- %s on %q:\n%s\n\n", crows[i], tasks[i], reports[i])
}
ans, err := f.ask(ctx, w, "Elder", elderSystem, sb.String(), budgets...)
ans, err := f.ask(ctx, w, "Elder", systemFor("Elder", elderSystem, true), sb.String(), budgets...)
return Outcome{Answer: ans, Crows: append(append([]string{}, crows...), "Elder")}, err
}