main
md 329 lines 12.8 KB
Rendered Raw
1 ---
2 name: "external-comms"
3 description: "PAO workflow for scanning, drafting, and presenting community responses with human review gate"
4 domain: "community, communication, workflow"
5 confidence: "low"
6 source: "manual (RFC #426 PAO External Communications)"
7 tools:
8 - name: "github-mcp-server-list_issues"
9 description: "List open issues for scan candidates and lightweight triage"
10 when: "Use for recent open issue scans before thread-level review"
11 - name: "github-mcp-server-issue_read"
12 description: "Read the full issue, comments, and labels before drafting"
13 when: "Use after selecting a candidate so PAO has complete thread context"
14 - name: "github-mcp-server-search_issues"
15 description: "Search for candidate issues or prior squad responses"
16 when: "Use when filtering by keywords, labels, or duplicate response checks"
17 - name: "gh CLI"
18 description: "Fallback for GitHub issue comments and discussions workflows"
19 when: "Use gh issue list/comment and gh api or gh api graphql when MCP coverage is incomplete"
20 ---
21
22 ## Context
23
24 Phase 1 is **draft-only mode**.
25
26 - PAO scans issues and discussions, drafts responses with the humanizer skill, and presents a review table for human approval.
27 - **Human review gate is mandatory** — PAO never posts autonomously.
28 - Every action is logged to `.squad/comms/audit/`.
29 - This workflow is triggered manually only ("PAO, check community") — no automated or Ralph-triggered activation in Phase 1.
30
31 ## Patterns
32
33 ### 1. Scan
34
35 Find unanswered community items with GitHub MCP tools first, or `gh issue list` / `gh api` as fallback for issues and discussions.
36
37 - Include **open** issues and discussions only.
38 - Filter for items with **no squad team response**.
39 - Limit to items created in the last 7 days.
40 - Exclude items labeled `squad:internal` or `wontfix`.
41 - Include discussions **and** issues in the same sweep.
42 - Phase 1 scope is **issues and discussions only** — do not draft PR replies.
43
44 ### Discussion Handling (Phase 1)
45
46 Discussions use the GitHub Discussions API, which differs from issues:
47
48 - **Scan:** `gh api /repos/{owner}/{repo}/discussions --jq '.[] | select(.answer_chosen_at == null)'` to find unanswered discussions
49 - **Categories:** Filter by Q&A and General categories only (skip Announcements, Show and Tell)
50 - **Answers vs comments:** In Q&A discussions, PAO drafts an "answer" (not a comment). The human marks it as accepted answer after posting.
51 - **Phase 1 scope:** Issues and Discussions ONLY. No PR comments.
52
53 ### 2. Classify
54
55 Determine the response type before drafting.
56
57 - Welcome (new contributor)
58 - Troubleshooting (bug/help)
59 - Feature guidance (feature request/how-to)
60 - Redirect (wrong repo/scope)
61 - Acknowledgment (confirmed, no fix)
62 - Closing (resolved)
63 - Technical uncertainty (unknown cause)
64 - Empathetic disagreement (pushback on a decision or design)
65 - Information request (need more reproduction details or context)
66
67 ### Template Selection Guide
68
69 | Signal in Issue/Discussion | → Response Type | Template |
70 |---------------------------|-----------------|----------|
71 | New contributor (0 prior issues) | Welcome | T1 |
72 | Error message, stack trace, "doesn't work" | Troubleshooting | T2 |
73 | "How do I...?", "Can Squad...?", "Is there a way to...?" | Feature Guidance | T3 |
74 | Wrong repo, out of scope for Squad | Redirect | T4 |
75 | Confirmed bug, no fix available yet | Acknowledgment | T5 |
76 | Fix shipped, PR merged that resolves issue | Closing | T6 |
77 | Unclear cause, needs investigation | Technical Uncertainty | T7 |
78 | Author disagrees with a decision or design | Empathetic Disagreement | T8 |
79 | Need more reproduction info or context | Information Request | T9 |
80
81 Use exactly one template as the base draft. Replace placeholders with issue-specific details, then apply the humanizer patterns. If the thread spans multiple signals, choose the highest-risk template and capture the nuance in the thread summary.
82
83 ### Confidence Classification
84
85 | Confidence | Criteria | Example |
86 |-----------|----------|---------|
87 | 🟢 High | Answer exists in Squad docs or FAQ, similar question answered before, no technical ambiguity | "How do I install Squad?" |
88 | 🟡 Medium | Technical answer is sound but involves judgment calls, OR docs exist but don't perfectly match the question, OR tone is tricky | "Can Squad work with Azure DevOps?" (yes, but setup is nuanced) |
89 | 🔴 Needs Review | Technical uncertainty, policy/roadmap question, potential reputational risk, author is frustrated/angry, question about unreleased features | "When will Squad support Claude?" |
90
91 **Auto-escalation rules:**
92 - Any mention of competitors → 🔴
93 - Any mention of pricing/licensing → 🔴
94 - Author has >3 follow-up comments without resolution → 🔴
95 - Question references a closed-wontfix issue → 🔴
96
97 ### 3. Draft
98
99 Use the humanizer skill for every draft.
100
101 - Complete **Thread-Read Verification** before writing.
102 - Read the **full thread**, including all comments, before writing.
103 - Select the matching template from the **Template Selection Guide** and record the template ID in the review notes.
104 - Treat templates as reusable drafting assets: keep the structure, replace placeholders, and only improvise when the thread truly requires it.
105 - Validate the draft against the humanizer anti-patterns.
106 - Flag long threads (`>10` comments) with `⚠️`.
107
108 ### Thread-Read Verification
109
110 Before drafting, PAO MUST verify complete thread coverage:
111
112 1. **Count verification:** Compare API comment count with actually-read comments. If mismatch, abort draft.
113 2. **Deleted comment check:** Use `gh api` timeline to detect deleted comments. If found, flag as ⚠️ in review table.
114 3. **Thread summary:** Include in every draft: "Thread: {N} comments, last activity {date}, {summary of key points}"
115 4. **Long thread flag:** If >10 comments, add ⚠️ to review table and include condensed thread summary
116 5. **Evidence line in review table:** Each draft row includes "Read: {N}/{total} comments" column
117
118 ### 4. Present
119
120 Show drafts for review in this exact format:
121
122 ```text
123 📝 PAO — Community Response Drafts
124 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
125
126 | # | Item | Author | Type | Confidence | Read | Preview |
127 |---|------|--------|------|------------|------|---------|
128 | 1 | Issue #N | @user | Type | 🟢/🟡/🔴 | N/N | "First words..." |
129
130 Confidence: 🟢 High | 🟡 Medium | 🔴 Needs review
131
132 Full drafts below ▼
133 ```
134
135 Each full draft must begin with the thread summary line:
136 `Thread: {N} comments, last activity {date}, {summary of key points}`
137
138 ### 5. Human Action
139
140 Wait for explicit human direction before anything is posted.
141
142 - `pao approve 1 3` — approve drafts 1 and 3
143 - `pao edit 2` — edit draft 2
144 - `pao skip` — skip all
145 - `banana` — freeze all pending (safe word)
146
147 ### Rollback — Bad Post Recovery
148
149 If a posted response turns out to be wrong, inappropriate, or needs correction:
150
151 1. **Delete the comment:**
152 - Issues: `gh api -X DELETE /repos/{owner}/{repo}/issues/comments/{comment_id}`
153 - Discussions: `gh api graphql -f query='mutation { deleteDiscussionComment(input: {id: "{node_id}"}) { comment { id } } }'`
154 2. **Log the deletion:** Write audit entry with action `delete`, include reason and original content
155 3. **Draft replacement** (if needed): PAO drafts a corrected response, goes through normal review cycle
156 4. **Postmortem:** If the error reveals a pattern gap, update humanizer anti-patterns or add a new test case
157
158 **Safe word — `banana`:**
159 - Immediately freezes all pending drafts in the review queue
160 - No new scans or drafts until `pao resume` is issued
161 - Audit entry logged with halter identity and reason
162
163 ### 6. Post
164
165 After approval:
166
167 - Human posts via `gh issue comment` for issues or `gh api` for discussion answers/comments.
168 - PAO helps by preparing the CLI command.
169 - Write the audit entry after the posting action.
170
171 ### 7. Audit
172
173 Log every action.
174
175 - Location: `.squad/comms/audit/{timestamp}.md`
176 - Required fields vary by action — see `.squad/comms/templates/audit-entry.md` Conditional Fields table
177 - Universal required fields: `timestamp`, `action`
178 - All other fields are conditional on the action type
179
180 ## Examples
181
182 These are reusable templates. Keep the structure, replace placeholders, and adjust only where the thread requires it.
183
184 ### Example scan command
185
186 ```bash
187 gh issue list --state open --json number,title,author,labels,comments --limit 20
188 ```
189
190 ### Example review table
191
192 ```text
193 📝 PAO — Community Response Drafts
194 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
195
196 | # | Item | Author | Type | Confidence | Read | Preview |
197 |---|------|--------|------|------------|------|---------|
198 | 1 | Issue #426 | @newdev | Welcome | 🟢 | 1/1 | "Hey @newdev! Welcome to Squad..." |
199 | 2 | Discussion #18 | @builder | Feature guidance | 🟡 | 4/4 | "Great question! Today the CLI..." |
200 | 3 | Issue #431 ⚠️ | @debugger | Technical uncertainty | 🔴 | 12/12 | "Interesting find, @debugger..." |
201
202 Confidence: 🟢 High | 🟡 Medium | 🔴 Needs review
203
204 Full drafts below ▼
205 ```
206
207 ### Example audit entry (post action)
208
209 ```markdown
210 ---
211 timestamp: "2026-03-16T21:30:00Z"
212 action: "post"
213 item_number: 426
214 draft_id: 1
215 reviewer: "@bradygaster"
216 ---
217
218 ## Context (draft, approve, edit, skip, post, delete actions)
219 - Thread depth: 3
220 - Response type: welcome
221 - Confidence: 🟢
222 - Long thread flag: false
223
224 ## Draft Content (draft, edit, post actions)
225 Thread: 3 comments, last activity 2026-03-16, reporter hit a preview-build regression after install.
226
227 Hey @newdev! Welcome to Squad 👋 Thanks for opening this.
228 We reproduced the issue in preview builds and we're checking the regression point now.
229 Let us know if you can share the command you ran right before the failure.
230
231 ## Post Result (post, delete actions)
232 https://github.com/bradygaster/squad/issues/426#issuecomment-123456
233 ```
234
235 ### T1 — Welcome
236
237 ```text
238 Hey {author}! Welcome to Squad 👋 Thanks for opening this.
239 {specific acknowledgment or first answer}
240 Let us know if you have questions — happy to help!
241 ```
242
243 ### T2 — Troubleshooting
244
245 ```text
246 Thanks for the detailed report, {author}!
247 Here's what we think is happening: {explanation}
248 {steps or workaround}
249 Let us know if that helps, or if you're seeing something different.
250 ```
251
252 ### T3 — Feature Guidance
253
254 ```text
255 Great question! {context on current state}
256 {guidance or workaround}
257 We've noted this as a potential improvement — {tracking info if applicable}.
258 ```
259
260 ### T4 — Redirect
261
262 ```text
263 Thanks for reaching out! This one is actually better suited for {correct location}.
264 {brief explanation of why}
265 Feel free to open it there — they'll be able to help!
266 ```
267
268 ### T5 — Acknowledgment
269
270 ```text
271 Good catch, {author}. We've confirmed this is a real issue.
272 {what we know so far}
273 We'll update this thread when we have a fix. Thanks for flagging it!
274 ```
275
276 ### T6 — Closing
277
278 ```text
279 This should be resolved in {version/PR}! 🎉
280 {brief summary of what changed}
281 Thanks for reporting this, {author} — it made Squad better.
282 ```
283
284 ### T7 — Technical Uncertainty
285
286 ```text
287 Interesting find, {author}. We're not 100% sure what's causing this yet.
288 Here's what we've ruled out: {list}
289 We'd love more context if you have it — {specific ask}.
290 We'll dig deeper and update this thread.
291 ```
292
293 ### T8 — Empathetic Disagreement
294
295 ```text
296 We hear you, {author}. That's a fair concern.
297
298 The current design choice was driven by {reason}. We know it's not ideal for every use case.
299
300 {what alternatives exist or what trade-off was made}
301
302 If you have ideas for how to make this work better for your scenario, we'd love to hear them — open a discussion or drop your thoughts here!
303 ```
304
305 ### T9 — Information Request
306
307 ```text
308 Thanks for reporting this, {author}!
309
310 To help us dig into this, could you share:
311 - {specific ask 1}
312 - {specific ask 2}
313 - {specific ask 3, if applicable}
314
315 That context will help us narrow down what's happening. Appreciate it!
316 ```
317
318 ## Anti-Patterns
319
320 - ❌ Posting without human review (NEVER — this is the cardinal rule)
321 - ❌ Drafting without reading full thread (context is everything)
322 - ❌ Ignoring confidence flags (🔴 items need Flight/human review)
323 - ❌ Scanning closed issues (only open items)
324 - ❌ Responding to issues labeled `squad:internal` or `wontfix`
325 - ❌ Skipping audit logging (every action must be recorded)
326 - ❌ Drafting for issues where a squad member already responded (avoid duplicates)
327 - ❌ Drafting pull request responses in Phase 1 (issues/discussions only)
328 - ❌ Treating templates like loose examples instead of reusable drafting assets
329 - ❌ Asking for more info without specific requests