Epic D: Assistant crow — Quill, the owner's point of contact #36

Closed
opened 2026-10-28 13:42:44 +00:00 by jacisjake · 1 comment
jacisjake commented 2026-10-28 13:42:44 +00:00 (Migrated from github.com)

Part of: docs/SCOPE.md#S5 Depends on: Epic B (#2), Epic C (#21) — both merged

Objective

The owner gets a point of contact: Quill (assistant crow) is addressable in every nest, answers in character, reads the nest before answering status, relays work to named crows, and brings decisions to the owner as ask_owner instead of deciding alone. After this epic, "ask the assistant" works; today only @Elder is a service role.

Context a stranger needs

  • nestapi.go:31 — serviceRoles = []string{"Elder"}: addressable-but-not-member roles, wired through addressables(). The trigger switch (nestapi.go:187-199) routes record.To == "Elder" to respondElder (nestapi.go:349-385), which is the model to copy: build prompt, systemFor(name, ..., true), Flock.ask with a budget, append the reply as a deliver.
  • Personas live in personas.go (Elder entry at line 136; rosterOrder at 180). Regenerate the sheet: ./crows personas > PERSONAS.md.
  • Names are [decided 2026-10-28]: assistant crow = Quill, COS crow = Boss. Record in CHATROOM_SPEC.md section 13 open question 1.
  • EVENTS.md is the contract: change it before code. Kind table at lines 39-46; ask_owner exists in the spec (CHATROOM_SPEC.md section 4) but not yet in EVENTS.md.
  • nestapi.go:439 comment marks the quarantine/ask_owner loop as future work.
  • Every model call must go through Flock.ask/Flock.classify (CLAUDE.md section 9). Tests use the recording/mock brains from nestapi_test.go / conspiracy_test.go (newRecordServer, promote, serve).

Out of scope for this epic

COS/Quill asking Boss for new crows (Epic E), debate, visible budgets, Sentry watchdog.

Plan of record

  • #38 — D1: Quill persona + service role
  • #39 — D2: Status answers read the nest
  • #40 — D3: Relay: Quill posts requests on the owner's behalf
  • #41 — D4: ask_owner kind + fail-safe resolution

Definition of done

Mock-brain demo: owner posts @Quill where did the launch copy get to and the reply's prompt provably contains the thread's messages; @Quill get Hugin to draft the tagline results in an authored-by-Quill request addressed to Hugin that Hugin answers; an ask_owner can only be resolved by the owner's exact approval phrase.

Part of: docs/SCOPE.md#S5 Depends on: Epic B (#2), Epic C (#21) — both merged ## Objective The owner gets a point of contact: Quill (assistant crow) is addressable in every nest, answers in character, reads the nest before answering status, relays work to named crows, and brings decisions to the owner as `ask_owner` instead of deciding alone. After this epic, "ask the assistant" works; today only @Elder is a service role. ## Context a stranger needs - `nestapi.go:31` — `serviceRoles = []string{"Elder"}`: addressable-but-not-member roles, wired through `addressables()`. The trigger switch (`nestapi.go:187-199`) routes `record.To == "Elder"` to `respondElder` (`nestapi.go:349-385`), which is the model to copy: build prompt, `systemFor(name, ..., true)`, `Flock.ask` with a budget, append the reply as a `deliver`. - Personas live in `personas.go` (Elder entry at line 136; `rosterOrder` at 180). Regenerate the sheet: `./crows personas > PERSONAS.md`. - Names are [decided 2026-10-28]: assistant crow = **Quill**, COS crow = **Boss**. Record in CHATROOM_SPEC.md section 13 open question 1. - `EVENTS.md` is the contract: change it before code. Kind table at lines 39-46; `ask_owner` exists in the spec (CHATROOM_SPEC.md section 4) but not yet in EVENTS.md. - `nestapi.go:439` comment marks the quarantine/ask_owner loop as future work. - Every model call must go through `Flock.ask`/`Flock.classify` (CLAUDE.md section 9). Tests use the recording/mock brains from `nestapi_test.go` / `conspiracy_test.go` (`newRecordServer`, `promote`, `serve`). ## Out of scope for this epic COS/Quill asking Boss for new crows (Epic E), debate, visible budgets, Sentry watchdog. ## Plan of record - [ ] #38 — D1: Quill persona + service role - [ ] #39 — D2: Status answers read the nest - [ ] #40 — D3: Relay: Quill posts requests on the owner's behalf - [ ] #41 — D4: ask_owner kind + fail-safe resolution ## Definition of done Mock-brain demo: owner posts `@Quill where did the launch copy get to` and the reply's prompt provably contains the thread's messages; `@Quill get Hugin to draft the tagline` results in an authored-by-Quill `request` addressed to Hugin that Hugin answers; an `ask_owner` can only be resolved by the owner's exact approval phrase.
jacisjake commented 2026-10-28 15:22:03 +00:00 (Migrated from github.com)

Definition of done met, all by mock-brain tests on main: Quill's status prompt provably carries thread messages (TestQuillPromptContainsNestHistory #39); relay posts a Quill-authored request Hugin answers (TestQuillRelayPostsRequest #40); ask_owner resolves only on the owner's exact phrase (TestAskOwnerOnlyOwnerResolves #41). Plan of record: #38-#41 all Done.

Definition of done met, all by mock-brain tests on main: Quill's status prompt provably carries thread messages (TestQuillPromptContainsNestHistory #39); relay posts a Quill-authored request Hugin answers (TestQuillRelayPostsRequest #40); ask_owner resolves only on the owner's exact phrase (TestAskOwnerOnlyOwnerResolves #41). Plan of record: #38-#41 all Done.
Sign in to join this conversation.