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.
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.
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.
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
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_ownerinstead 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 throughaddressables(). The trigger switch (nestapi.go:187-199) routesrecord.To == "Elder"torespondElder(nestapi.go:349-385), which is the model to copy: build prompt,systemFor(name, ..., true),Flock.askwith a budget, append the reply as adeliver.personas.go(Elder entry at line 136;rosterOrderat 180). Regenerate the sheet:./crows personas > PERSONAS.md.EVENTS.mdis the contract: change it before code. Kind table at lines 39-46;ask_ownerexists in the spec (CHATROOM_SPEC.md section 4) but not yet in EVENTS.md.nestapi.go:439comment marks the quarantine/ask_owner loop as future work.Flock.ask/Flock.classify(CLAUDE.md section 9). Tests use the recording/mock brains fromnestapi_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
Definition of done
Mock-brain demo: owner posts
@Quill where did the launch copy get toand the reply's prompt provably contains the thread's messages;@Quill get Hugin to draft the taglineresults in an authored-by-Quillrequestaddressed to Hugin that Hugin answers; anask_ownercan only be resolved by the owner's exact approval phrase.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.