fix: reskill prompt addresses team instead of Farnsworth (#147)

Change the Copilot CLI -p argument from addressing Farnsworth directly to 'Team, take a nap and reskill' — the squad agent routes to the right team member via the routing table. - Write reskill prompt to well-known path (.squad/reskill/current-prompt.md) instead of mktemp so the agent can discover it - Add 'take a nap and reskill' trigger phrase to routing.md - Add Reskill Cycle section to Farnsworth's charter - Add test assertions verifying the new prompt pattern Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

Juan Manuel Servera committed May 20, 2026 at 22:57 UTC 2b535c1e44c2c152f11860a2633e876fd4a1d3d0
4 files changed +16 -2
.github/workflows/crawl-and-publish.yml
+2 -2
@@ -740,7 +740,7 @@ jobs:
740 CURRENT_DATETIME=$(date -u +%Y-%m-%dT%H:%M:%SZ)
741 WEEK=$(date -u +%G-W%V)
742 RESKILL_OUTPUT=".squad/reskill/${WEEK}.md"
743 - RESKILL_PROMPT=$(mktemp)
743 + RESKILL_PROMPT=".squad/reskill/current-prompt.md"
744 mkdir -p .squad/skills .squad/reskill data/metrics
745
746 sanitize_agent_output() {
@@ -755,7 +755,7 @@ jobs:
755 # Intentionally rely on Copilot CLI's default model so CI follows the platform-supported default.
756 if command -v copilot >/dev/null 2>&1 && copilot \
757 --agent squad \
758 - -p "Farnsworth, read the file at ${RESKILL_PROMPT} — it contains the reskill retrospective instructions. Follow them exactly and write the report to ${RESKILL_OUTPUT}." \
758 + -p "Team, take a nap and reskill" \
759 -s \
760 --no-ask-user \
761 --allow-tool=read \
.squad/agents/farnsworth/charter.md
+3
@@ -27,3 +27,6 @@ Preferred: auto
27 - **What's important:** Significant projects, tools, or shifts in the ecosystem
28 - **What's trending:** Patterns across categories over multiple weeks
29 - **What's missing:** Gaps in the ecosystem, underserved areas, declining trends
30 +
31 +## Reskill Cycle
32 +When asked to "take a nap and reskill", read the prompt at `.squad/reskill/current-prompt.md` and follow the instructions inside. The prompt contains all context (recent analyses, snapshot hindsight, current wisdom) and the output path.
.squad/routing.md
+6
@@ -30,6 +30,12 @@ How to decide who handles what.
30 3. Members can reassign by removing their label and adding another member's label.
31 4. The `squad` label is the "inbox" — untriaged issues waiting for Lead review.
32
33 +## Trigger Phrases
34 +
35 +| Phrase | Action |
36 +|--------|--------|
37 +| "take a nap and reskill" | Farnsworth reads `.squad/reskill/current-prompt.md` and follows the instructions inside |
38 +
39 ## Rules
40
41 1. **Eager by default** — spawn all agents who could usefully start work, including anticipatory downstream work.
tests/test_pipeline.py
+5
@@ -211,6 +211,11 @@ class WorkflowConfigTests(unittest.TestCase):
211 self.assertIn("trigger-log.txt", reskill_run)
212 self.assertIn("git add .squad/", reskill_run)
213 self.assertIn("data/metrics/", reskill_run)
214 + # Reskill prompt addresses the team, not an individual agent
215 + self.assertIn('"Team, take a nap and reskill"', reskill_run)
216 + self.assertNotIn("Farnsworth, read the file", reskill_run)
217 + # Prompt is written to a well-known path, not a temp file
218 + self.assertIn('RESKILL_PROMPT=".squad/reskill/current-prompt.md"', reskill_run)
219
220 analyze = workflow["jobs"]["analyze"]
221 run_analysis_step = next((s for s in analyze["steps"] if s.get("name") == "Run analysis"), None)