Audit recent changes to Phoenix's user-facing surfaces (Python clients, TypeScript clients, CLI, REST/GraphQL APIs) and patch the three external-facing agent skills — `phoenix-tracing`, `phoenix-cli`, and `phoenix-evals` — so they stay in sync with what actually shipped. Use this skill whenever a user asks to update those skills, sync the skills with recent changes, audit skill drift, check what client/CLI/API changes need to land in the skills, or mentions "skill freshness", "skill drift", "stale skills", or "are the skills up to date". Also trigger when shipping a notable client/CLI/API change and the user asks "do the skills need updating?". Default window is the last 7 days on `origin/main`; user may override.
73
92%
Does it follow best practices?
Run evals on this skill
Adds up to 20 points to the overall score
Passed
No findings from the security scan
Keep the three external-facing skills — phoenix-tracing, phoenix-cli, phoenix-evals —
truthful about what the Phoenix Python clients, TypeScript clients, CLI, and APIs actually
do today. The output is patches applied to the skill files, not a report. The skill
reads recent commits, identifies what changed in user-facing surfaces, and updates the
relevant SKILL.md and references/*.md files in place.
This is a sibling skill to phoenix-docs-gap-audit. The docs-gap-audit produces a report
about gaps in docs/phoenix/; this skill produces edits to .agents/skills/. Skills are
loaded into agent context every time the user asks a question that triggers them, so a
stale skill teaches every future agent the wrong API. That makes drift here strictly
worse than drift in human-facing docs — humans can sanity-check; agents can't.
.agents/skills/phoenix-tracing/SKILL.md
.agents/skills/phoenix-tracing/references/*.md
.agents/skills/phoenix-cli/SKILL.md
.agents/skills/phoenix-evals/SKILL.md
.agents/skills/phoenix-evals/references/*.mdDo not touch any other skill directory. If a change clearly belongs in a skill outside
these three (e.g. phoenix-server, phoenix-frontend), note it in the run summary and
skip — those skills are internal and have their own owners.
| Source area | Skill |
|---|---|
packages/phoenix-otel/ (Python) | phoenix-tracing |
js/packages/phoenix-otel/ (TS) | phoenix-tracing |
| OpenInference semantic conventions, span attributes, instrumentation patterns | phoenix-tracing |
js/packages/phoenix-cli/ (commands, flags, output JSON shape) | phoenix-cli |
packages/phoenix-evals/ (Python) | phoenix-evals |
js/packages/phoenix-evals/ (TS) | phoenix-evals |
| New evaluators, eval templates, experiment APIs | phoenix-evals |
packages/phoenix-client/ (Python) | depends on what's exposed — see below |
js/packages/phoenix-client/ (TS) | depends on what's exposed — see below |
Server REST/GraphQL (src/phoenix/server/api/) | depends on what's exposed — see below |
The generic clients and the server APIs are cross-cutting. Map them by the feature they expose, not the file they live in:
phoenix-tracingphoenix-evalsphoenix-cliphoenix-cli (JSON shape doc) and
potentially phoenix-tracing (if it's an OpenInference attribute)A single feature can — and often does — span multiple skills. That's fine. Make all the edits; cross-reference between skills only when the user genuinely needs to read both.
Default window is the last 7 days on origin/main. The user may override. Translate
their phrasing into a concrete range before running anything.
Always audit origin/main, not the local main branch. Local main is routinely
stale by dozens of commits — auditing the stale tip silently misses everything that
shipped after the last git pull.
git fetch origin main --quiet
# Default 7-day window
git log --since="7 days ago" origin/main --no-merges --pretty=format:"%h %s" --name-status
# Tag range if the user specified one
git log <prev-tag>..<current-tag> --no-merges --pretty=format:"%h %s" --name-status
# Sanity check
git rev-list --count main..origin/mainSave the raw list. Note the audited SHA in the run summary so a reader can reproduce.
Commit messages lie or under-report. Use them as an index, not a source of truth. Split the list into three buckets:
chore(main): release …), and feature flags (env
vars named *_DANGEROUSLY_*, *_EXPERIMENTAL_*, intentionally undocumented escape
hatches). Feature flags are deliberately kept out of public skills.refactor: prefixes.Group related commits that implement one logical feature across server + SDK + CLI. Audit them as one unit.
Breadth before depth. Enumerate every audit candidate in a flat list before going deep on any one. The goal is a complete sweep, not the single juiciest finding.
For each candidate, in the same one-liner, tag the cross-cutting concept(s) it most likely affects, even if the commit's file path doesn't say so. The four concepts:
Once a candidate is tagged with tracing / evals / cli, you have committed to a
hypothesis: there is potentially a skill edit here. The only way to legitimately drop
the candidate later is to read the diff and find that the change is internal, or
already documented, or genuinely user-irrelevant. "I don't see the relevant package in
the path" is not a sufficient reason.
Only after this tagged list exists do you expand each entry into edits.
For every candidate, open the actual changed files. Commit messages routinely omit:
Read enough of each file to answer:
Do not trust a commit's file path to dictate the skill it belongs to. An evaluator
change often lives in packages/phoenix-client/, not packages/phoenix-evals/. A span
attribute lands in the server or a client, not in phoenix-otel. For every audit
candidate, scan all client/SDK directories — Python and TypeScript, generic client
and topical packages — and map each new symbol to the skill that documents the feature
it exposes, per the source-mapping table. The easiest way to miss a finding is to stop
looking after the first package you find.
Pair each Python change with its TypeScript mirror (and vice versa). Nearly every
user-facing feature ships on both runtimes, usually in the same PR. When you locate a
Python change, grep the TS package equivalent for the same symbol family (same commit
SHA, or within a few commits). If the mirror is there, edit the -typescript.md
reference too. If it's genuinely Python-only or TS-only, say so in the run summary —
that itself is a finding worth noting.
For each finding, decide:
references/<slug>.md file, plus a row in
SKILL.md's reference table and a link in the navigation section.SKILL.md directly.Reference file naming follows the existing patterns inside each skill — match what's already there:
phoenix-tracing/references/: prefix by category (setup-*, instrumentation-*,
span-*, production-*, attributes-*) and suffix by language (-python.md,
-typescript.md).phoenix-evals/references/: prefix by category (evaluators-*, experiments-*,
validation-*, production-*, fundamentals-*) and suffix by language.phoenix-cli: single-file skill — most edits land directly in SKILL.md. Only add
a references/ directory if a topic has grown too large for inline (>40 lines).When deleting a removed feature, remove every reference (cross-links in SKILL.md,
table rows, workflow steps), not just the most obvious one.
Edit the skill files in place. Use Edit for surgical changes; use Write for new
reference files. After each edit:
references/foo.md, also add it to
the navigation tables in SKILL.md. Broken links in a skill make the agent waste
tool calls trying to read missing files.For breaking changes (renames, removals), do the destructive edit and the additive edit in the same pass. Removing the old reference without adding the new one leaves agents flailing; adding the new one without removing the old one leaves them confused about which is current.
After patches are applied, produce a single markdown summary on stdout. The GitHub Actions wrapper reads this to populate the PR body. Do not write it to a file — let it surface as the agent's final message.
# Phoenix Skills Audit — <date range>
**Audited against:** `origin/main` at `<sha>`
**Commits analyzed:** N (M user-facing, K skipped)
## Edits applied
### phoenix-tracing
- `references/instrumentation-auto-python.md` — added section for new auto-instrumentor
shipped in <commit>; example uses `<verified import path>`.
- `SKILL.md` — added row for the new reference file in the Quick Reference table.
### phoenix-cli
- `SKILL.md` — added `px experiment compare` subcommand documentation
(commit `<sha>`); JSON shape grounded in `js/packages/phoenix-cli/src/commands/...`.
- `SKILL.md` — updated `--format` description; default changed in commit `<sha>`.
### phoenix-evals
- `references/evaluators-pre-built.md` — added table row for `<NewEvaluator>` from
commit `<sha>`; inputs/labels/direction verified against `<source file>`.
## Skipped commits
Brief list of commits intentionally excluded (deps, refactors, feature flags, frontend
changes that don't affect the three skills) so a reviewer can confirm nothing was
missed.
## Out-of-scope findings
Optional. If you saw a user-facing change that belongs in a different skill (e.g.
`phoenix-server`, `phoenix-frontend`), note it here so the maintainer knows — but do
not edit those skills.Every edit must be verifiable against the tree at the audited SHA. Skills are read by agents that will not double-check; if you teach them an API that doesn't exist, every downstream task that follows the skill is wrong.
def foo(trace_id: str, *, kind: str = "LLM"),
the skill must say that — not foo(trace_id, kind).python -c "from X import Y"
succeed against this repo right now?index.ts / __init__.py first.When in doubt, read more code. The cost of an extra file read is tiny compared to the cost of poisoning every future agent with a hallucinated API.
Skills are read by agents but reviewed and maintained by humans. Write like the existing docs, not like a release announcement or a model narrating its diff:
phoenix-evals/references/evaluators-pre-built.md — gets a table row per item
(name, inputs, labels, direction), never a section per item. Prose in a catalog
is only for cross-item decision points (faithfulness vs. hallucination) and
short gotcha bullets (an unusual input shape, a surprising score direction, a
breaking change). If a new item genuinely needs pages of explanation, that's a
sign it belongs in its own topical reference file, not inline.create<Name>Evaluator without a snippet for every
evaluator.source is \"agent\" and tool_calls contain a tool_call_id equal
to…") restates the implementation without telling the reader which situation
they're in. Show the resulting output shape (a trace tree, a JSON payload)
when it makes the outcome concrete.| Question | Answer |
|---|---|
Commit message says refactor: — skip? | Read the diff. Refactors often add exports. |
Frontend-only change (js/app/src/) — does it affect any of the three skills? | Almost never. Skip and note in "out-of-scope findings". |
| New env var — feature flag? | Skip. Feature flags (*_DANGEROUSLY_*, *_EXPERIMENTAL_*) stay out of public skills. |
| New env var that controls a public surface? | Update the relevant skill's setup or environment section. |
Server-only change (src/phoenix/server/) — relevant to the three skills? | Only if it changes what a client/CLI sees. A new GraphQL field consumed by the CLI is in scope; an internal server refactor is not. |
| Removed/renamed public symbol? | Edit the skill: remove the old reference, add the new one in the same pass. |
| New evaluator class? | Add a row to the table in phoenix-evals/references/evaluators-pre-built.md — inputs, labels, direction. It's a catalog: no per-evaluator section; at most a short gotcha bullet under "Notes on Specific Evaluators". If the patterns are genuinely new, create a topic-specific reference instead. |
| New CLI subcommand? | Add to the relevant section of phoenix-cli/SKILL.md. Document the JSON shape if the command emits structured output. |
| New OpenInference attribute? | Add to phoenix-tracing/references/attributes-*.md and the relevant span-*.md. |
| Breaking change to an existing skill example? | High priority. Update the example and search the rest of the skill for adjacent uses of the old signature. |
| Feature has no apparent use case from reading the code? | Add the API entry but flag in the run summary that rationale is missing — don't invent motivation. |
| Python-only change — is there a TS mirror? | Check. Most features ship on both runtimes in the same PR; a Python-only change is the exception, not the rule. If confirmed Python-only, call it out in the run summary so someone can chase the TS side. |
SKILL.md links to a references/foo.md that doesn't exist? | Remove the link. Broken cross-links teach nothing and waste tool calls. Don't add a "TODO" flag — just delete. |
Python change lives in packages/phoenix-client/ but conceptually belongs to tracing/evals? | Map it to the conceptual skill. File path is an implementation detail; the skill that documents the feature owns it. |
Before exiting, walk through:
SKILL.md (no orphan files).SKILL.md (no broken cross-links).tracing / evals / cli is either
reflected in the edits, or the run summary states a concrete reason it was
dropped (e.g., "PR #X already self-patched the skill", with the SHA). A tagged
candidate that just disappears is a triage bug — go back and reconcile..agents/skills/phoenix-tracing/, .agents/skills/phoenix-cli/,
or .agents/skills/phoenix-evals/.This skill runs in two contexts:
Manual — a developer asks "audit the skills" or "are the skills up to date". Apply the workflow above end-to-end, edit files, print the run summary, and let the user review the diff before committing.
CI (GitHub Actions) — .github/workflows/claude-skills-audit.yml runs this skill
weekly. The action commits the patches to a branch and opens a PR using the run
summary as the PR body. The skill itself does not commit or push — that's the
workflow's job. Just edit the files and emit the summary.
Arize-ai/phoenix
8ac3caf
If you maintain this skill, you can claim it as your own. Once claimed, you can manage eval scenarios, bundle related skills, attach documentation or rules, and ensure cross-agent compatibility.