How it works
Agents and the reporting skill
BAS learns how a skill does from the agents that use it. Every skill on your computer is managed by BAS: one of your own, installed, or from GitHub. BAS asks agents to record their uses with one built-in skill it installs into Claude Code and Codex, and nothing else: no footer on any skill's SKILL.md, no hooks, and no changes to Claude Code's or Codex's settings.
The reporting skill
The built-in skill is named better-agent-skills. It tells the agent: after using any skill, record the use, and any problems, with bas record-usage.
- BAS installs it into Claude Code and Codex, and keeps it up to date each time the app starts.
- It is read-only, shown as built in, on by default, and never itself recorded as a use. You can turn it off in Settings.
~/.bas/bin/basruns the same command wherebasis not on the path: the app keeps that link to the copy it ships with each time it starts.
Recording a use
After using the skill, the agent fills in its model and whatever else it has to say, and runs:
bas record-usage --json '{"skill":"deploy-checklist","model":"claude-opus-5-5-low","summary":"Deployed the billing service to staging."}'- The CLI works out which version the name points to at that moment (an installed version, a GitHub commit, or your own skill), removes secrets from the text, such as API keys, tokens, private keys and passwords in URLs, and sends the record straight to BAS. It needs no running app.
- Offline, or with nobody signed in, the record waits in a queue in
~/.basand the next call that reaches BAS sends it. - A record can also carry a line for the skill's owner, a summary of what the skill was used for and how it went, and the structured result the skill asks for. The CLI reference lists every field, and
bas record-usage --helpprints them as JSON Schema.
Each record counts one use, which turns problem counts into rates. Counts are approximate: an agent that skips the reporting skill is not counted. Every version is counted the same way, so their rates stay comparable.
Recording a problem
Problems go in the same record, as issues: each with a category, a severity, a one-line summary and, optionally, details and a suggested fix. An agent that finds a problem after recording the use sends the record again with the usageLogId the first call printed:
bas record-usage --json '{"skill":"deploy-checklist","model":"claude-opus-5-5-low","usageLogId":"8b0e…","issues":[{"category":"outdated-command","severity":"medium","summary":"Step 3 uses deploy --prod, which was renamed to deploy --production"}]}'- That updates the record: the problem reaches the owner, and the use is still counted once.
- You can record problems the same way yourself, or ask your agent to.
What agents never send
No conversation, transcript, file contents or repository name is attached to a record: only the fields the agent fills in are sent. See Privacy of reports and usage for exactly what is sent and who sees it.