Add a0p-troubleshooter skill for RCA and fix planning - #6
Conversation
…json Agent-Logs-Url: https://github.com/The-Interdependency/a0/sessions/1636523d-cd0c-4930-90de-8ac94b6da047 Co-authored-by: wayseer00 <258336486+wayseer00@users.noreply.github.com>
Agent-Logs-Url: https://github.com/The-Interdependency/a0/sessions/1636523d-cd0c-4930-90de-8ac94b6da047 Co-authored-by: wayseer00 <258336486+wayseer00@users.noreply.github.com>
There was a problem hiding this comment.
Pull request overview
Adds a new “a0p-troubleshooter” skill intended to guide RCA/troubleshooting and fix planning for common a0p/platform failure modes, plus supporting evaluation inputs and minor repo hygiene.
Changes:
- Added new skill definition at
.agents/skills/a0p-troubleshooter/SKILL.mdwith trigger guidance, operating rules, a JSON output schema, memory rules, and a0p-specific failure playbooks. - Added evaluation inputs for the skill (
eval_set.jsontrigger set, plus an additionalevals.jsoncase file). - Updated
.gitignoreto ignore Python bytecode artifacts (__pycache__/,*.pyc).
Reviewed changes
Copilot reviewed 3 out of 4 changed files in this pull request and generated 3 comments.
| File | Description |
|---|---|
.gitignore |
Ignores Python bytecode/cache outputs repo-wide. |
.agents/skills/a0p-troubleshooter/SKILL.md |
Introduces the troubleshooting/RCA skill content and required JSON output contract. |
.agents/skills/a0p-troubleshooter/evals/evals.json |
Adds richer eval case definitions (currently not clearly wired to existing scripts). |
.agents/skills/a0p-troubleshooter/evals/eval_set.json |
Adds trigger-eval query set consumable by run_eval.py. |
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
| `get_job_logs`, config files via `get_file_contents`, code via | ||
| `search_code`, DNS records via web lookup. Cite your sources. |
There was a problem hiding this comment.
The skill text instructs using tools get_job_logs, get_file_contents, and search_code, but these tool names don’t appear to exist in this repo’s tool registry. This will make the skill’s evidence-collection guidance unusable in practice. Please update this rule to reference the actual tools/APIs used here (e.g., github_api for Actions/log retrieval, bash_run for repo grep/file reads, and web_search for DNS/provider lookups), or phrase it generically without naming non-existent tools.
| `get_job_logs`, config files via `get_file_contents`, code via | |
| `search_code`, DNS records via web lookup. Cite your sources. | |
| `github_api`, config files and repository code via `bash_run`, | |
| DNS records and provider/web checks via `web_search`. Cite your sources. |
| 7. **Prefer reversible mitigations.** Rollback > hotfix > restart. Document | ||
| the rollback steps alongside the fix. | ||
|
|
||
| 8. **Cite a0p-specific file paths** where relevant (see §6 Quick Reference). |
There was a problem hiding this comment.
Section reference looks incorrect: this points readers to “§6 Quick Reference”, but the Quick reference section is §8. Please update the cross-reference so it doesn’t send readers to the wrong place.
| 8. **Cite a0p-specific file paths** where relevant (see §6 Quick Reference). | |
| 8. **Cite a0p-specific file paths** where relevant (see §8 Quick Reference). |
| "prompt": "My GitHub Actions deploy workflow is failing. Here's the error from the console-tab regression guard step:\n\n```\nERROR: Tab 'diagnostics' declared in UI_META has no sections and no custom renderer.\nDeploy blocked.\n```\n\nWhat went wrong and how do I fix it?", | ||
| "expected_output": "Identifies the CI failure class, explains the four-place registration requirement and console-tab guard rule, provides a concrete fix (add sections to UI_META or add a CUSTOM_TAB_RENDERERS entry), and gives verification steps.", | ||
| "expectations": [ | ||
| "The output classifies the failure as ci_build or similar", | ||
| "The output mentions check-console-tabs.mjs or the console-tab regression guard", | ||
| "The output mentions CUSTOM_TAB_RENDERERS in client/src/pages/console.tsx", | ||
| "The output mentions adding sections to UI_META as a fix option", | ||
| "The output includes a verification step", | ||
| "The output follows the JSON schema with summary, classification, hypotheses, fix_plan" | ||
| ] | ||
| }, | ||
| { | ||
| "id": 2, | ||
| "prompt": "I'm seeing this traceback in the FastAPI logs:\n\n```\nTraceback (most recent call last):\n File \"python/routes/my_module.py\", line 47, in get_data\n result = await db.execute(select(MyModel).where(MyModel.user_id == user_id))\n File \"python/database.py\", line 23, in execute\n async with self._session() as session:\nsqlalchemy.exc.OperationalError: (asyncpg.exceptions.TooManyConnectionsError) sorry, too many clients already\n```\n\nThis started about 30 minutes ago after we deployed a new route module.", | ||
| "expected_output": "Classifies as runtime_crash or db_migration, identifies connection pool exhaustion, links to the recent deploy as the likely trigger, proposes checking for missing session cleanup in the new route, and suggests a mitigation (restart + connection pool config).", | ||
| "expectations": [ | ||
| "The output classifies the failure as runtime_crash or db_migration", | ||
| "The output identifies connection pool exhaustion as the root cause or primary hypothesis", | ||
| "The output links the new route module deploy to the timing of the failure", | ||
| "The output suggests checking for unclosed database sessions or missing async context managers", | ||
| "The output proposes a mitigation (restart, pool size config, or session cleanup)", | ||
| "The output includes verification steps", | ||
| "The output follows the JSON schema" | ||
| ] | ||
| }, | ||
| { | ||
| "id": 3, | ||
| "prompt": "My custom domain interdependentway.org stopped working. GitHub Pages is showing a 404. I deployed to the gh-pages branch yesterday.", | ||
| "expected_output": "Classifies as github_pages or dns_https, explains the CNAME file overwrite pattern (most common cause after a deploy), gives exact steps to verify and restore the CNAME file, and checks DNS record configuration.", | ||
| "expectations": [ | ||
| "The output classifies the failure as github_pages or dns_https", | ||
| "The output identifies CNAME file overwrite during deploy as the primary hypothesis", | ||
| "The output explains that the CNAME file must contain only the bare domain name at the publish source root", | ||
| "The output mentions checking Settings → Pages to confirm Pages is still enabled", | ||
| "The output includes DNS verification steps", | ||
| "The output follows the JSON schema with at least two hypotheses" | ||
| ] | ||
| }, | ||
| { | ||
| "id": 4, | ||
| "prompt": "An agent run in the Fleet is stuck in 'running' status even though I can see it hasn't emitted a log event in 15 minutes. The agent process appears to have crashed. How do I diagnose this?", | ||
| "expected_output": "Classifies as agent_run, explains the frozen 'running' pattern (finally block raised before status update), references run_logger and run_context, gives steps to fix the status in the DB and prevent recurrence.", | ||
| "expectations": [ | ||
| "The output classifies the failure as agent_run", | ||
| "The output explains that the finally block likely raised before the status update", | ||
| "The output mentions wrapping the status UPDATE in its own try block as the fix", | ||
| "The output references python/services/run_logger.py or python/services/run_context.py", | ||
| "The output suggests a mitigation to manually update the run status", | ||
| "The output follows the JSON schema" | ||
| ] |
There was a problem hiding this comment.
This evals.json format (with expected_output/expectations) doesn’t appear to be consumed by the current skill-creator scripts in this repo (I can’t find any references to these keys, and run_eval.py/run_loop.py only read the eval_set.json query list). If this file is meant to drive an end-to-end graded harness, it likely needs corresponding wiring/docs in the existing scripts; otherwise consider removing or renaming it to avoid suggesting it’s active test coverage when it isn’t.
| "prompt": "My GitHub Actions deploy workflow is failing. Here's the error from the console-tab regression guard step:\n\n```\nERROR: Tab 'diagnostics' declared in UI_META has no sections and no custom renderer.\nDeploy blocked.\n```\n\nWhat went wrong and how do I fix it?", | |
| "expected_output": "Identifies the CI failure class, explains the four-place registration requirement and console-tab guard rule, provides a concrete fix (add sections to UI_META or add a CUSTOM_TAB_RENDERERS entry), and gives verification steps.", | |
| "expectations": [ | |
| "The output classifies the failure as ci_build or similar", | |
| "The output mentions check-console-tabs.mjs or the console-tab regression guard", | |
| "The output mentions CUSTOM_TAB_RENDERERS in client/src/pages/console.tsx", | |
| "The output mentions adding sections to UI_META as a fix option", | |
| "The output includes a verification step", | |
| "The output follows the JSON schema with summary, classification, hypotheses, fix_plan" | |
| ] | |
| }, | |
| { | |
| "id": 2, | |
| "prompt": "I'm seeing this traceback in the FastAPI logs:\n\n```\nTraceback (most recent call last):\n File \"python/routes/my_module.py\", line 47, in get_data\n result = await db.execute(select(MyModel).where(MyModel.user_id == user_id))\n File \"python/database.py\", line 23, in execute\n async with self._session() as session:\nsqlalchemy.exc.OperationalError: (asyncpg.exceptions.TooManyConnectionsError) sorry, too many clients already\n```\n\nThis started about 30 minutes ago after we deployed a new route module.", | |
| "expected_output": "Classifies as runtime_crash or db_migration, identifies connection pool exhaustion, links to the recent deploy as the likely trigger, proposes checking for missing session cleanup in the new route, and suggests a mitigation (restart + connection pool config).", | |
| "expectations": [ | |
| "The output classifies the failure as runtime_crash or db_migration", | |
| "The output identifies connection pool exhaustion as the root cause or primary hypothesis", | |
| "The output links the new route module deploy to the timing of the failure", | |
| "The output suggests checking for unclosed database sessions or missing async context managers", | |
| "The output proposes a mitigation (restart, pool size config, or session cleanup)", | |
| "The output includes verification steps", | |
| "The output follows the JSON schema" | |
| ] | |
| }, | |
| { | |
| "id": 3, | |
| "prompt": "My custom domain interdependentway.org stopped working. GitHub Pages is showing a 404. I deployed to the gh-pages branch yesterday.", | |
| "expected_output": "Classifies as github_pages or dns_https, explains the CNAME file overwrite pattern (most common cause after a deploy), gives exact steps to verify and restore the CNAME file, and checks DNS record configuration.", | |
| "expectations": [ | |
| "The output classifies the failure as github_pages or dns_https", | |
| "The output identifies CNAME file overwrite during deploy as the primary hypothesis", | |
| "The output explains that the CNAME file must contain only the bare domain name at the publish source root", | |
| "The output mentions checking Settings → Pages to confirm Pages is still enabled", | |
| "The output includes DNS verification steps", | |
| "The output follows the JSON schema with at least two hypotheses" | |
| ] | |
| }, | |
| { | |
| "id": 4, | |
| "prompt": "An agent run in the Fleet is stuck in 'running' status even though I can see it hasn't emitted a log event in 15 minutes. The agent process appears to have crashed. How do I diagnose this?", | |
| "expected_output": "Classifies as agent_run, explains the frozen 'running' pattern (finally block raised before status update), references run_logger and run_context, gives steps to fix the status in the DB and prevent recurrence.", | |
| "expectations": [ | |
| "The output classifies the failure as agent_run", | |
| "The output explains that the finally block likely raised before the status update", | |
| "The output mentions wrapping the status UPDATE in its own try block as the fix", | |
| "The output references python/services/run_logger.py or python/services/run_context.py", | |
| "The output suggests a mitigation to manually update the run status", | |
| "The output follows the JSON schema" | |
| ] | |
| "prompt": "My GitHub Actions deploy workflow is failing. Here's the error from the console-tab regression guard step:\n\n```\nERROR: Tab 'diagnostics' declared in UI_META has no sections and no custom renderer.\nDeploy blocked.\n```\n\nWhat went wrong and how do I fix it?" | |
| }, | |
| { | |
| "id": 2, | |
| "prompt": "I'm seeing this traceback in the FastAPI logs:\n\n```\nTraceback (most recent call last):\n File \"python/routes/my_module.py\", line 47, in get_data\n result = await db.execute(select(MyModel).where(MyModel.user_id == user_id))\n File \"python/database.py\", line 23, in execute\n async with self._session() as session:\nsqlalchemy.exc.OperationalError: (asyncpg.exceptions.TooManyConnectionsError) sorry, too many clients already\n```\n\nThis started about 30 minutes ago after we deployed a new route module." | |
| }, | |
| { | |
| "id": 3, | |
| "prompt": "My custom domain interdependentway.org stopped working. GitHub Pages is showing a 404. I deployed to the gh-pages branch yesterday." | |
| }, | |
| { | |
| "id": 4, | |
| "prompt": "An agent run in the Fleet is stuck in 'running' status even though I can see it hasn't emitted a log event in 15 minutes. The agent process appears to have crashed. How do I diagnose this?" |
Adds a first-class troubleshooting/RCA skill to the a0p skills framework, covering CI failures, runtime crashes, DNS/Pages issues, Fleet agent anomalies, PCNA/EDCM pipeline errors, and "it stopped working" regressions.
New files
.agents/skills/a0p-troubleshooter/SKILL.md— Skill body with:ci_build,agent_run,pcna_edcm,dns_https, etc.)evals/evals.json— 5 full eval cases for the skill-creator harness (CI regression guard, SQLAlchemy pool exhaustion, GitHub Pages 404, Fleet frozen run, missing console tab)evals/eval_set.json— 12-entry trigger eval set forrun_eval.py(8 should-trigger, 4 should-not-trigger)Housekeeping
__pycache__/and*.pycto.gitignore(were missing project-wide)Discovery / wiring
No registry changes needed — local
a0p-*skills are discovered purely by filesystem presence under.agents/skills/. Theskills-lock.jsonis only for externally-sourced skills.Running the eval
Original prompt
Create and wire in a new troubleshooting skill into the existing skills framework in repo
The-Interdependency/a0.Goals:
.agents/skills/named something likea0p-troubleshooter(or consistent with existing naming conventions).SKILL.mdthat defines a troubleshooting/RCA capability suitable for the platform (multi-model hub + semi-permanent instances). The SKILL.md must:.agents/skills/a0p-model-selector/SKILL.md)Context:
.agents/skills/and skill tooling in.agents/skills/skill-creator/scripts/(e.g.run_eval.py).Deliverables:
The following is the prior conversation context from the user's chat exploration (may be truncated):
User: what happened to my custom domain?
Assistant: Most commonly, nothing “mysterious” happened to the domain itself—your GitHub Pages custom domain usually disappears/gets unset (or stops working) because Pages was unpublished/disabled or the DNS check started failing, so GitHub can’t keep serving your site at that domain.
Here are the main causes to check (in order), based on how GitHub Pages custom domains work:
1) Your Pages site got unpublished/disabled
If a Pages site is disabled but your DNS still points at GitHub, the domain can look “gone” from the site and GitHub warns about takeover risk. GitHub lists a couple common reasons a Pages site may be automatically disabled (especially around private repos + plan changes or transfers).
See: About custom domains and GitHub Pages
What to do
2) Your DNS records no longer point to GitHub Pages correctly
When you set/change a custom domain, GitHub runs an automatic DNS check; if DNS isn’t correct, GitHub may not be able to provision/keep HTTPS and the domain setup will be “not verified” / not working.
See: Securing your GitHub Pages site with HTTPS
What to do
example.com): ensure yourA/AAAA(or ALIAS/ANAME) records match GitHub’s documented values.www.example.com): ensure there’s aCNAMEtowayseer00.github.io.3) You’re expecting a custom domain to be set on the “wrong” repo
GitHub distinguishes user/organization sites vs project sites:
<owner>.github.io(for you:wayseer00.github.io).See: What is GitHub Pages?
If your repo is named
github.wayseer.io, it’s not the standard user-site repo name—so depending on how you configured Pages, you might actually be dealing with a project site configuration and/or a mismatch with where the domain is set.Also: if you set a custom domain on your user site, it can become the default for your other Pages sites unless overridden.
See: About custom domains and GitHub Pages
Fast clarifying questions (so I can tell you the exact fix)
github.wayseer.ioorwww.wayseer.io)?wayseer00.github.io) or a project site?If you paste what you see in the Pages settings panel (the “Custom...
This pull request was created from Copilot chat.