Skip to content

Commit 16338af

Browse files
authored
Merge pull request #122 from PyAutoLabs/feature/community-voice-agent
feat: community conductor (the Ears) — hear + answer user-filed issues
2 parents 0ad08b6 + 0aefbed commit 16338af

10 files changed

Lines changed: 747 additions & 6 deletions

File tree

AGENTS.md

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -103,6 +103,16 @@ humans invoke identically, so behaviour isn't re-derived from prose each time.
103103
the target, consults the sizing faculty and persists Difficulty/Autonomy/
104104
Priority into the header, and emits an `IntakeDecision`. Files a prompt only;
105105
never starts dev (the step *before* `create_issue`/`start_dev`).
106+
- **`agents/conductors/community/`** — the *Ears*: the organism's receptive
107+
language function — it hears the community (user-filed GitHub issues across
108+
every `repos.yaml` repo) and drafts what the organism says back; the human
109+
remains the mouth. Wernicke to the Workspace Agent's Broca/Voice. Two
110+
read-only modes: `scan` (open external issues + awaiting-response ranking —
111+
also the `/wake_up` community sensory leg) and `triage <issue-ref>`
112+
(context-sufficiency signals + clarifying-question seeds). The `/community`
113+
session judges, drafts every outward reply for human approval, and routes
114+
actionable work via `start_dev_for_user`; conversation state stays on
115+
GitHub + `active.md`. Never posts, labels or writes anything.
106116
- **`agents/conductors/feature/`** — the *Growth Agent*: selects the next
107117
PyAutoMind `feature/*` task (or plans a named one), estimates difficulty,
108118
decides phasing, consults PyAutoMemory (and vitals for risky work), and emits
@@ -232,6 +242,7 @@ the `/<verb>` slash commands.
232242
| Verb | Purpose | Entrypoint |
233243
|------|---------|------------|
234244
| `intake` | Conceive a task: turn raw input into a formal, headed PyAutoMind prompt (files it; never starts dev) | `bin/pyauto-brain intake` |
245+
| `community` | The ears — the organism's receptive function: scan/triage user-filed GitHub issues across the repos; drafts stay human-gated, dev work routes via start_dev_for_user (never posts) | `bin/pyauto-brain community` |
235246
| `feature` | Reason over PyAutoMind feature tasks: select, size, phase, plan for start_dev | `bin/pyauto-brain feature` |
236247
| `bug` | The immune system: classify a bug/regression/Heart finding, locate the fix, plan the repair | `bin/pyauto-brain bug` |
237248
| `refactor` | The renewal function: plan behaviour-preserving restructuring — RefactorDecision; default-safe under --auto | `bin/pyauto-brain refactor` |
@@ -269,6 +280,7 @@ the Brain routes it to the right agent; normal usage never says "PyAutoBrain".
269280
| Command | Routes to | Tier |
270281
|---------|-----------|------|
271282
| `/intake` | Intake Agent → files a PyAutoMind prompt (before `start_dev`) | real conductor |
283+
| `/community` | Community Agent → scan/triage user-filed issues → human-approved replies → `start_dev_for_user` | real conductor |
272284
| `/feature` | Feature Agent → `start_dev` | real conductor |
273285
| `/bug` | Bug Agent → `start_dev` (health mode → vitals + Heart issues) | real conductor |
274286
| `/build` | Build Agent → vitals → Heart → PyAutoBuild | real conductor |
Lines changed: 95 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,95 @@
1+
# Community agent
2+
3+
> **Tier: conductor** — a front-door agent you *drive*. The *Ears* — the
4+
> organism's receptive language function: it hears the community (user-filed
5+
> GitHub issues across every repo) and drafts what the organism says back; the
6+
> human remains the mouth. Wernicke to the Workspace Agent's Broca: that
7+
> *Voice* speaks to users through examples and tutorials, this agent
8+
> *comprehends and converses* — it reads an outsider's issue, judges whether
9+
> the context is sufficient, drafts every reply for human approval, and routes
10+
> actionable work into the dev flow. It never posts, labels, edits or releases
11+
> anything itself.
12+
13+
Grown from demonstrated need: user-filed issues were handled ad-hoc (paste the
14+
GitHub link into an agent chat), the `start_dev_for_user` skill already owned
15+
the downstream dev entry, and the founding prompt asked for both a dedicated
16+
listening/communicating agent and a `/wake_up` summary of what the community
17+
is waiting on. Founding prompt:
18+
PyAutoMind `active/community_communication_agent_listen_and_respond.md`
19+
(issue PyAutoBrain#119).
20+
21+
## Modes
22+
23+
Both modes are live, deterministic and **read-only** — they emit surfaces the
24+
`/community` skill session reasons over. The judgment (actionable vs
25+
ask-for-more, the reply prose, the routing call) is the session's; the human
26+
gates every outward message.
27+
28+
| Mode | Surface | Consumed by |
29+
|------|---------|-------------|
30+
| `scan` *(default)* | every `PyAutoMind/repos.yaml` repo → open issues authored by non-self humans (bots filtered), with **awaiting-response** detection (the conversation's last word is not ours) ranked by waiting time | `/community` step 1; the `/wake_up` community sensory leg |
31+
| `triage <issue-ref>` | one issue → context-sufficiency signals (code block, traceback, versions, expected-vs-actual, data pointer), missing-signal clarifying-question seeds, comment tail, route | `/community` steps 2–3 |
32+
33+
```
34+
pyauto-brain community # scan: who is waiting on us?
35+
pyauto-brain community scan --json
36+
pyauto-brain community triage <url | owner/repo#N> [--json]
37+
```
38+
39+
Repo enumeration comes from `PyAutoMind/repos.yaml` (the body map) under
40+
`PYAUTO_ROOT`; the org is searched wholesale, non-org homes individually.
41+
GitHub access is the `gh` CLI — `COMMUNITY_GH` overrides the binary (hermetic
42+
tests), `COMMUNITY_SELF` the self logins (default `Jammy2211`). A failed
43+
search degrades honestly (`degraded:` in the surface), never silently.
44+
45+
## Fundamental principles
46+
47+
- **The conductor hears; the human speaks.** Every outward message — receipt,
48+
clarifying question, plan update, closing note — is drafted in the session
49+
and presented to the human before posting. The CLI itself never mutates
50+
GitHub. Autonomy for community work is `human-required` by design; `--auto`
51+
changes nothing here.
52+
- **Conversation state lives on GitHub + Mind, never here.** Labels
53+
(`needs-info`, `pending-release`) and the issue thread itself are the
54+
conversation's memory; in-flight dev state is the `user-facing: true` entry
55+
in `PyAutoMind/active.md`. The conductor owns no registry, no cache, no
56+
paired repo.
57+
- **Delegate the conversation's dev half.** Actionable issues route into
58+
`/start_dev_for_user`, which already owns the receipt comment, the
59+
clarification gate, the plan comment and the milestone cadence
60+
(~5 milestones for bugs, ~4 for features — see its `reference.md`). This
61+
conductor never re-implements those templates.
62+
- **Stdlib / bash only** — like every conductor, it must never drag the
63+
science stack into the Brain.
64+
65+
## Boundaries
66+
67+
- **vs the Workspace Agent (the Voice)** — split by *direction of speech*. The
68+
Voice is expressive: it plans how the organism speaks to practitioners and
69+
learners through authored examples. The Ears are receptive: they hear what
70+
individual outsiders say back (issues, requests, bug reports) and hold up
71+
the organism's end of the conversation.
72+
- **vs intake** — intake conceives tasks from the *developer's* raw ideas and
73+
files Mind prompts; community converses with an *external reporter* whose
74+
issue already exists on GitHub. When a community conversation yields work,
75+
it routes via `start_dev_for_user` (issue-first), not intake (prompt-first).
76+
- **vs start_dev_for_user** — that skill is the dev-flow entry for one
77+
already-actionable issue. Community is the layer above: discovery (scan),
78+
assessment (triage), the ask-for-more conversation, and the ongoing
79+
reporter-facing updates after routing.
80+
- **vs bug / feature** — they classify and plan the *work*; community manages
81+
the *relationship* with the person who reported it.
82+
- **vs health / hygiene / release** — no verdicts, no upkeep, no releases;
83+
external PRs and review requests are out of scope for v1 (a staged
84+
follow-up recorded here).
85+
86+
## Capability audit — what the modes read
87+
88+
- **GitHub search** (`gh api search/issues`): `org:PyAutoLabs` plus the
89+
non-org homes from `repos.yaml`, `is:issue is:open -author:<self>`, bot
90+
authors post-filtered.
91+
- **Issue comments** (`gh api repos/<o>/<r>/issues/<n>/comments`): last-actor
92+
detection for awaiting-response (capped at 30 issues per scan) and the
93+
triage comment tail.
94+
- **PyAutoMind `repos.yaml`**: the body map, parsed for `github:` homes
95+
(regex, stdlib-only — the Brain takes no yaml dependency).

0 commit comments

Comments
 (0)