FY27 Priority Agents — refresh pipeline
Regenerates the FY27 Priority Agents report from live data. The hard part is that the query CLI (an M365 Copilot / Graph-grounded tool) is slow and flaky; this skill encodes the exact recipe + lessons that make it work. Everything lives in the durable working dir:
WORKDIR = ~/.brainstem/agent-scenario-sweep/
Run all python with the brainstem venv: ~/.brainstem/venv/bin/python.
Prerequisites (check first)
- Query CLI installed & authenticated:
<cli> ask -q "Reply with exactly: PONG"should returnPONGin <60s. If it times out, M365 is throttled (see Lessons) — wait. WORKDIR/template_original.htmlexists (the original report, used as the literal render template). If missing, ask the user for the original report HTML.WORKDIR/roster_full.jsonexists (the full account roster). If the user provides an updated roster spreadsheet, rebuild it (see "Updating the roster").
The pipeline (run in order)
1. Extract — one grounded query per account, PARALLEL=4, resumable.
cd ~/.brainstem/agent-scenario-sweep
bash run_until_done.sh # wraps extract_agents.py; auto-resumes through throttle
- Writes raw verbatim response per account to
extract/<CUSTOMER>.json(the audit trail- re-run/compare source). Resumable: re-running skips done accounts.
extract_agents.pyuses PARALLEL=4 (proven safe), escalating timeouts (150/220/320s), retries flaky "retrieval_fail"/bare-NONE responses, and only cools down if a PONG actually confirms a throttle. Full run ≈ 1–3 hrs depending on throttling.- The query is grounded: "looking ONLY at the internal triage chat for X
- the scenario worksheet, what agents did X name?" — this prevents the tool from hallucinating a vendor's public product announcements (it once returned a customer's public products instead of their internal agents).
2. Verify with the 1M context (THE critical quality step — do NOT skip).
The regex parser (parse_agents.py) is unreliable: it both misses real agents and
counts verbose-NONEs as has-agents. Instead, dump the candidate responses and READ them:
~/.brainstem/venv/bin/python - <<'PY'
import glob,json,re
rows=[]
for f in sorted(glob.glob("extract/*.json")):
d=json.load(open(f))
if d.get("status")!="ok": continue
r=d.get("response","")
if len(r.strip())>120 and not re.fullmatch(r"\W*NONE\W*", r.strip(), re.I):
rows.append((d["customer"], r))
open("/tmp/fy27_candidates.txt","w").write(
"".join(f"\n{'='*70}\nCUSTOMER: {c}\n{'='*70}\n{r}\n" for c,r in rows))
print(f"{len(rows)} candidates -> /tmp/fy27_candidates.txt")
PY
Then Read /tmp/fy27_candidates.txt (in pages) and hand-build verified_agents.json,
applying these rules (this is judgment the regex cannot do):
- Keep only agents explicitly named in the customer's OWN triage chat / worksheet.
- Drop verbose-NONEs: responses that explain at length then end in "Final Answer: NONE" / "Result: NONE" (several accounts had a chat that was intake-only).
- Strip worksheet template-examples: "Sales AI Agent" and "Time-tracker Agent" are the blank worksheet's built-in example rows — exclude unless clearly customer-specific.
- Drop deck/PPTX-sourced agents — not from the chat/worksheet.
- Merge casing/name dupes.
verified_agents.jsonshape:{"customers": {"<name>": [{"agent","problem"}, ...]}}.
3. Build the report (original style, data expanded).
~/.brainstem/venv/bin/python build_final.py
open ~/Desktop/FY27-Priority-Agents-FINAL.html
This uses template_original.html verbatim and only ADDS data: appends verified agent
rows to the Raw Data tab, adds fresh customer cards to By Customer, adds a "Full Roster"
tab showing every account checked + status (so nothing looks skipped), bumps the stats,
and fixes pill wrapping. Visual style is unchanged — the stakeholder wants it to look
identical.
4. Sanity-check before sending. Confirm: all original tabs present, the original customer set still shown, fresh customers have real agents, roster lists every account.
Lessons (why the pipeline is shaped this way — respect these)
- Run via the query CLI directly, NOT through the brainstem
/chat. The brainstem is threaded AND decomposes one /chat into multiple sub-calls → a batch becomes 60+ concurrent processes → throttles the whole M365 account for 30+ min. - PARALLEL=4 is the safe ceiling. 4 concurrent direct calls tested clean
(
55s for 4, PONG fine after). Concurrency >6 risks throttle. Never fan out wide. - Mimic the agent's invocation:
subprocess.run([...], capture_output, text, timeout)+ strip ANSI + reap the whole process group on timeout (the CLI spawns nested node children that orphan otherwise and cause throttling). Seewq.py. - "not found" in a prior roster ≠ no agents. Always re-run every account fresh; the grounded query returns NONE itself if there's genuinely nothing.
- Bare 4-char "NONE" = flaky retrieval, not a real NONE. A genuine NONE is verbose ("I searched X, found no worksheet…"). Retry bare-NONEs.
- Most accounts that HAD a chat were intake-only (worksheet requested, never filled). A result of a small fraction of customers with agents is correct, not a failure — the denominator of accounts that actually named agents is small. Don't chase a bigger number.
- Keep everything in
~/.brainstem/agent-scenario-sweep/, NOT.brainstem_data/— the brainstem wipes.brainstem_data/on restart (it ate a sweep mid-run once). - If throttled: stop all CLI processes, wait ~20–30 min, PONG-probe
until it returns, then resume (
run_until_done.shis resumable).
Updating the roster (when the customer list grows)
If the user provides a fresh roster spreadsheet (the sheet listing every triage chat
per customer), rebuild roster_full.json from it: read the sheet with openpyxl, keep
customer + chat columns, then re-run the pipeline. The extractor reads
roster_full.json and runs every account.
Files in WORKDIR
wq.py— direct CLI runner (mimics the agent; process-group reaping)extract_agents.py— PARALLEL=4 grounded extraction, resumable, throttle-guardedrun_until_done.sh— self-resuming wrapper around the extractorbuild_final.py— renders the final report fromtemplate_original.html+verified_agents.jsonverified_agents.json— the hand-verified agent data (rebuilt each run in step 2)roster_full.json— full account rostertemplate_original.html— the original report, used as the render templateextract/*.json— raw verbatim responses (audit trail)
Output
~/Desktop/FY27-Priority-Agents-FINAL.html — share-ready, single self-contained file.
Run this — do not improvise
This capability's deterministic implementation is a RAPP single-file agent, linked beside this file as fy27_priority_agents_agent.py and embedded as the fenced Python below (sha256 b5ac25e82f4bc0b3…; a byte-exact copy is also vaulted in the capsule comment at the end of this file). On a host with sandbox execution, run the linked file directly — if it is missing, write the fence contents verbatim to fy27_priority_agents_agent.py first:
python3 fy27_priority_agents_agent.py '{"key": "value"}' # arguments as one JSON object
echo '{"key": "value"}' | python3 fy27_priority_agents_agent.py # or on stdin
python3 fy27_priority_agents_agent.py --tool # emit the JSON tool contract
Treat stdout as a tool result. If it reports missing or unresolved inputs, stop and collect them. If it returns steps, execute those steps in order exactly as returned; if it returns instructions, follow them with the supplied inputs. Otherwise use the result verbatim. Do not invent behavior beyond that output. On a host without code execution, treat the Parameters schema and the code below as the exact specification and never paraphrase a step. Never edit inside the generated markers; a converter-equipped host can instead restore the original file checksum-verified with the installed rapp-agent-converter/scripts/toast.py convert SKILL.md --to agent.
"""Fy27PriorityAgents -- Regenerate the FY27 Priority Agents report (cross-customer analysis) with the
LATEST data. USE THIS SKILL when the user asks to "run the FY27 report",
"refresh the priority agents report", "re-pull the agent scenarios",
"get the latest customer agents", "rerun the agent sweep", or anything about
the triage-chat corpus / scenario worksheets / customer agent roster. It
enumerates every customer with a triage chat, extracts each one's named agents
+ business problems via the local query CLI, verifies the results, and renders
the report in the original HTML style on the Desktop.
Generated by the rapp skill from fy27-priority-agents. The RCI capsule at the bottom of this file carries the full original; `toast.py convert` restores it byte-exact."""
import json
import re
import sys
try:
from agents.basic_agent import BasicAgent
except ImportError: # running OUTSIDE the brainstem -- stay executable anyway.
class BasicAgent: # noqa: D101 - minimal stand-in, same contract
def __init__(self, name=None, metadata=None):
if name:
self.name = name
if metadata:
self.metadata = metadata
def perform(self, **kwargs):
return "Not implemented."
def system_context(self):
return None
def to_tool(self):
return {"type": "function", "function": {
"name": self.name,
"description": self.metadata.get("description", ""),
"parameters": self.metadata.get("parameters", {})}}
# The procedural layer, verbatim from the source capability. The brainstem
# returns this to the model, so the skill's instructions still drive behaviour
# -- now behind a typed, deterministic tool contract.
INSTRUCTIONS = '# FY27 Priority Agents — refresh pipeline\n\nRegenerates the FY27 Priority Agents report from live data. The hard part is\nthat **the query CLI (an M365 Copilot / Graph-grounded tool) is slow and flaky**;\nthis skill encodes the exact recipe + lessons that make it work. Everything lives\nin the durable working dir:\n\n```\nWORKDIR = ~/.brainstem/agent-scenario-sweep/\n```\n\nRun all python with the brainstem venv: `~/.brainstem/venv/bin/python`.\n\n## Prerequisites (check first)\n- Query CLI installed & authenticated: `<cli> ask -q "Reply with exactly: PONG"`\n should return `PONG` in <60s. If it times out, M365 is throttled (see Lessons) — wait.\n- `WORKDIR/template_original.html` exists (the original report, used as the literal\n render template). If missing, ask the user for the original report HTML.\n- `WORKDIR/roster_full.json` exists (the full account roster). If the user provides\n an updated roster spreadsheet, rebuild it (see "Updating the roster").\n\n## The pipeline (run in order)\n\n**1. Extract — one grounded query per account, PARALLEL=4, resumable.**\n```\ncd ~/.brainstem/agent-scenario-sweep\nbash run_until_done.sh # wraps extract_agents.py; auto-resumes through throttle\n```\n- Writes raw verbatim response per account to `extract/<CUSTOMER>.json` (the audit trail\n + re-run/compare source). Resumable: re-running skips done accounts.\n- `extract_agents.py` uses PARALLEL=4 (proven safe), escalating timeouts (150/220/320s),\n retries flaky "retrieval_fail"/bare-NONE responses, and only cools down if a PONG\n actually confirms a throttle. Full run ≈ 1–3 hrs depending on throttling.\n- The query is **grounded**: "looking ONLY at the internal triage chat for X\n + the scenario worksheet, what agents did X name?" — this prevents the tool from\n hallucinating a vendor's public product announcements (it once returned a\n customer's public products instead of their internal agents).\n\n**2. Verify with the 1M context (THE critical quality step — do NOT skip).**\nThe regex parser (`parse_agents.py`) is unreliable: it both misses real agents and\ncounts verbose-NONEs as has-agents. Instead, dump the candidate responses and READ them:\n```\n~/.brainstem/venv/bin/python - <<'PY'\nimport glob,json,re\nrows=[]\nfor f in sorted(glob.glob("extract/*.json")):\n d=json.load(open(f))\n if d.get("status")!="ok": continue\n r=d.get("response","")\n if len(r.strip())>120 and not re.fullmatch(r"\\W*NONE\\W*", r.strip(), re.I):\n rows.append((d["customer"], r))\nopen("/tmp/fy27_candidates.txt","w").write(\n "".join(f"\\n{'='*70}\\nCUSTOMER: {c}\\n{'='*70}\\n{r}\\n" for c,r in rows))\nprint(f"{len(rows)} candidates -> /tmp/fy27_candidates.txt")\nPY\n```\nThen Read `/tmp/fy27_candidates.txt` (in pages) and hand-build `verified_agents.json`,\napplying these rules (this is judgment the regex cannot do):\n- **Keep** only agents explicitly named in the customer's OWN triage chat / worksheet.\n- **Drop verbose-NONEs**: responses that explain at length then end in "Final Answer: NONE"\n / "Result: NONE" (several accounts had a chat that was intake-only).\n- **Strip worksheet template-examples**: "Sales AI Agent" and "Time-tracker Agent" are\n the blank worksheet's built-in example rows — exclude unless clearly customer-specific.\n- **Drop deck/PPTX-sourced agents** — not from the chat/worksheet.\n- **Merge casing/name dupes.**\n`verified_agents.json` shape: `{"customers": {"<name>": [{"agent","problem"}, ...]}}`.\n\n**3. Build the report (original style, data expanded).**\n```\n~/.brainstem/venv/bin/python build_final.py\nopen ~/Desktop/FY27-Priority-Agents-FINAL.html\n```\nThis uses `template_original.html` verbatim and only ADDS data: appends verified agent\nrows to the Raw Data tab, adds fresh customer cards to By Customer, adds a "Full Roster"\ntab showing every account checked + status (so nothing looks skipped), bumps the stats,\nand fixes pill wrapping. Visual style is unchanged — the stakeholder wants it to look\nidentical.\n\n**4. Sanity-check before sending.** Confirm: all original tabs present, the original\ncustomer set still shown, fresh customers have real agents, roster lists every account.\n\n## Lessons (why the pipeline is shaped this way — respect these)\n- **Run via the query CLI directly, NOT through the brainstem `/chat`.** The brainstem\n is threaded AND decomposes one /chat into multiple sub-calls → a batch becomes\n 60+ concurrent processes → throttles the whole M365 account for 30+ min.\n- **PARALLEL=4 is the safe ceiling.** 4 concurrent direct calls tested clean\n (~55s for 4, PONG fine after). Concurrency >~6 risks throttle. Never fan out wide.\n- **Mimic the agent's invocation:** `subprocess.run([...], capture_output,\n text, timeout)` + strip ANSI + reap the whole process group on timeout (the CLI\n spawns nested node children that orphan otherwise and cause throttling). See `wq.py`.\n- **"not found" in a prior roster ≠ no agents.** Always re-run every account fresh; the\n grounded query returns NONE itself if there's genuinely nothing.\n- **Bare 4-char "NONE" = flaky retrieval, not a real NONE.** A genuine NONE is verbose\n ("I searched X, found no worksheet…"). Retry bare-NONEs.\n- **Most accounts that HAD a chat were intake-only** (worksheet requested, never filled).\n A result of a small fraction of customers with agents is correct, not a failure — the\n denominator of accounts that actually named agents is small. Don't chase a bigger number.\n- **Keep everything in `~/.brainstem/agent-scenario-sweep/`, NOT `.brainstem_data/`** —\n the brainstem wipes `.brainstem_data/` on restart (it ate a sweep mid-run once).\n- **If throttled:** stop all CLI processes, wait ~20–30 min, PONG-probe\n until it returns, then resume (`run_until_done.sh` is resumable).\n\n## Updating the roster (when the customer list grows)\nIf the user provides a fresh roster spreadsheet (the sheet listing every triage chat\nper customer), rebuild `roster_full.json` from it: read the sheet with openpyxl, keep\n`customer` + `chat` columns, then re-run the pipeline. The extractor reads\n`roster_full.json` and runs every account.\n\n## Files in WORKDIR\n- `wq.py` — direct CLI runner (mimics the agent; process-group reaping)\n- `extract_agents.py` — PARALLEL=4 grounded extraction, resumable, throttle-guarded\n- `run_until_done.sh` — self-resuming wrapper around the extractor\n- `build_final.py` — renders the final report from `template_original.html` + `verified_agents.json`\n- `verified_agents.json` — the hand-verified agent data (rebuilt each run in step 2)\n- `roster_full.json` — full account roster\n- `template_original.html` — the original report, used as the render template\n- `extract/*.json` — raw verbatim responses (audit trail)\n\n## Output\n`~/Desktop/FY27-Priority-Agents-FINAL.html` — share-ready, single self-contained file.'
# Ordered commands lifted verbatim from the capability's own documentation.
STEPS = [
{
"cmd": "cd ~/.brainstem/agent-scenario-sweep",
"line": 26
},
{
"cmd": "bash run_until_done.sh # wraps extract_agents.py; auto-resumes through throttle",
"line": 27
},
{
"cmd": "open ~/Desktop/FY27-Priority-Agents-FINAL.html",
"line": 71
}
]
class Fy27PriorityAgentsAgent(BasicAgent):
def __init__(self):
self.name = 'Fy27PriorityAgents'
self.metadata = {
"name": "Fy27PriorityAgents",
"description": "Regenerate the FY27 Priority Agents report (cross-customer analysis) with the\nLATEST data. USE THIS SKILL when the user asks to \"run the FY27 report\",\n\"refresh the priority agents report\", \"re-pull the agent scenarios\",\n\"get the latest customer agents\", \"rerun the agent sweep\", or anything about\nthe triage-chat corpus / scenario worksheets / customer agent roster. It\nenumerates every customer with a triage chat, extracts each one's named agents\n+ business problems via the local query CLI, verifies the results, and renders\nthe report in the original HTML style on the Desktop.",
"parameters": {
"properties": {},
"required": [],
"type": "object"
}
}
super().__init__(name=self.name, metadata=self.metadata)
def perform(self, **kwargs): # toaster:generated-perform
missing = [k for k in self.metadata["parameters"].get("required", [])
if k not in kwargs]
if missing:
return json.dumps({"status": "error",
"missing_required": missing}, indent=2)
resolved, unresolved = [], set()
for step in STEPS:
cmd = step["cmd"]
for key, value in kwargs.items():
for token in ("<" + key.replace("_", "-") + ">",
"<" + key + ">",
"{{" + key + "}}",
"$" + key.upper()):
cmd = cmd.replace(token, str(value))
for leftover in re.findall(r"<[a-zA-Z][a-zA-Z0-9 _.-]{1,40}>", cmd):
unresolved.add(leftover)
resolved.append(cmd)
return json.dumps({"status": "ok",
"steps": resolved,
"unresolved_placeholders": sorted(unresolved),
"note": "Resolved deterministically by the agent; "
"run in order. Nothing was executed here."},
indent=2)
if __name__ == "__main__":
# Standalone entry point: the deterministic layer runs with NO brainstem,
# no framework, no install. This is what lets a "simple SKILL.md" platform
# keep real determinism -- the host model shells out to this file instead
# of improvising the procedure in prose.
# echo '{"arg": "value"}' | python3 fy27_priority_agents_agent.py
# python3 fy27_priority_agents_agent.py '{"arg": "value"}'
# python3 fy27_priority_agents_agent.py --tool # emit the JSON tool contract
_a = sys.argv[1:]
if _a and _a[0] == "--tool":
print(json.dumps(Fy27PriorityAgentsAgent().to_tool(), indent=2))
else:
_raw = _a[0] if _a else (sys.stdin.read().strip() or "{}")
print(Fy27PriorityAgentsAgent().perform(**json.loads(_raw)))
# rci-capsule:v1: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