Sample report, built from a synthetic month of sessions. Run friskme on your own

$ friskme scan --since 30d

What your Claude Code and Codex sessions were for

// 40 sessions in 5 projects, 2026-10-16 → 2026-11-11. Generated on this machine by friskme 0.4.0.

Overview

sessions
40 with a prompt you typed
agents
Claude Code31 · 77.5% · $16.40 Codex9 · 22.5% · $7.83
prompts
55
tool calls
283 (33 failed)
tokens
51.3M incl. cache and subagents
list price
$24.23 API equivalent
projects
payments-api13 storefront-web13 data-pipeline9 docs-site4 infra1
models
claude-opus-5-534.8M gpt-5.510.1M claude-sonnet-5-56.4M
work type
fix bug30.0% build feature27.5% review code15.0% docs/writing10.0% debug/investigate7.5% refactor7.5% other2.5%

// Tokens count each API response once, including subagent runs. Dollars are API list-price equivalent (Anthropic rates as of 2026-11-03, OpenAI rates as of 2026-11-11); on a subscription you do not pay this.

Intents

// Labeled by haiku from each session's prompts and tool sequence, then merged into intents. Counts and shares computed locally. Bars are share of all 40 sessions. 0 sessions unlabeled.

27.5% Fix failing and flaky tests 11 ▁▆▆▃█

Repairing broken, failing, and flaky test suites across checkout, tax, ledger, login, exports, and ingest.

agents
Claude Code8 Codex3
tools
Bash:package_manager19 Edit:ts12 Read:ts9 exec_command:other8 Bash:other7
projects
storefront-web6 data-pipeline4 payments-api1
labels
Fix Canadian tax rounding test1 Fix cart spec failing after merge1 Fix failing address checkout spec1 Fix failing filters spec suite1 Fix failing login spec suite1 Fix failing schedule test suite1 Fix failing test in test_exports.py1 Fix failing test in test_ingest.py1
weekly
10-12=0 10-19=3 10-26=3 11-02=1 11-09=4

CI is red on main. Fix the failing test in tests/test_exports.py

CI is red on main. Fix the failing test in tests/test_ingest.py

The src/auth/login.spec.ts suite fails locally, figure out why and fix it

// 11 of 40 sessions. 18.6M tokens, $9.00 at API list-price equivalent (Anthropic rates as of 2026-11-03, OpenAI rates as of 2026-11-11).

15.0% Payments API endpoints 6 █▁█▅▅

Building and validating REST endpoints for refunds, coupons, disputes, customers, payouts, and webhooks.

agents
Claude Code4 Codex2
tools
Write:go12 apply_patch:go8 Read:go8 exec_command:file_ops6 Bash:other4
projects
payments-api6
labels
Add list and create endpoints for refunds1 Add paginated coupons GET endpoint1 Add paginated GET /v1/disputes endpoint1 Add POST /v1/customers with validation1 Add POST /v1/payouts with validation1 Add webhook CRUD endpoints1
weekly
10-12=2 10-19=0 10-26=2 11-02=1 11-09=1

Add a GET /v1/disputes endpoint with pagination, following the pattern in the invoices handler

Add a POST /v1/customers route with request validation and tests

We need CRUD endpoints for refunds. Start with list and create.

// 6 of 40 sessions. 9.2M tokens, $5.04 at API list-price equivalent (Anthropic rates as of 2026-11-03, OpenAI rates as of 2026-11-11).

15.0% Reviewing pull requests 6 ▁▅█▁▁

Doing first-pass and risk-focused reviews of teammates' pull requests.

agents
Claude Code4 Codex2
tools
mcp:github30 Read:ts8 exec_command:file_ops4
projects
payments-api4 storefront-web2
labels
First-pass review of PR 4211 First-pass review of pull request 4271 Review PR 412 for risks1 Review PR 418 for risky changes1 Review PR 433 for error handling1 Review PR 440 for risky changes1
weekly
10-12=0 10-19=2 10-26=4 11-02=0 11-09=0

Can you review #433? Focus on error handling and tests.

Do a first-pass review of pull request 427

Review PR #440 and leave comments on anything risky

// 6 of 40 sessions. 5.3M tokens, $2.25 at API list-price equivalent (Anthropic rates as of 2026-11-03, OpenAI rates as of 2026-11-11).

10.0% Database schema migrations and backfills 4 ▁████

Adding archived_at columns and backfilling region data on existing tables.

agents
Claude Code3 Codex1
tools
Bash:other9 Edit:py3 exec_command:other3 Read:py3 Write:py3
projects
data-pipeline4
labels
Add archived_at column migration for accounts1 Add archived_at column migration for invoices1 Backfill events.region from accounts1 Backfill orders.region from accounts1
weekly
10-12=0 10-19=1 10-26=1 11-02=1 11-09=1

Write an alembic migration that adds a accounts.archived_at column with an index

Add a migration to backfill orders.region from the accounts table

Write an alembic migration that adds a invoices.archived_at column with an index

// 4 of 40 sessions. 3.3M tokens, $2.04 at API list-price equivalent (Anthropic rates as of 2026-11-03, OpenAI rates as of 2026-11-11).

10.0% Design system component migration 4 ▁▁▃█▁

Moving storefront components onto the design-system Button and upgrading the @acme/ui package.

agents
Claude Code4
tools
Bash:package_manager12 Edit:json9 Edit:tsx6 Read:tsx6 Edit:css3
projects
storefront-web4
labels
Move CartDrawer to design-system Button1 Move ProductCard to design-system Button1 Move SearchBar to design-system Button1 Upgrade @acme/ui to v4 and fix build1
weekly
10-12=0 10-19=0 10-26=1 11-02=3 11-09=0

Upgrade @acme/ui to v4 and get the build green again

Refactor CartDrawer to use the new design-system Button and remove the old styles

Refactor SearchBar to use the new design-system Button and remove the old styles

// 4 of 40 sessions. 9.4M tokens, $3.50 at API list-price equivalent (Anthropic rates as of 2026-11-03, OpenAI rates as of 2026-11-11).

10.0% Writing and updating docs 4 ▅▁█▁▅

Writing getting-started guides and updating the auth configuration guide.

agents
Claude Code4
tools
Bash:package_manager4 Edit:md4 Grep4 Read:md4
projects
docs-site4
labels
Update auth guide for new config format1 Write billing getting-started docs page1 Write deploy getting-started page1 Write webhooks getting-started docs page1
weekly
10-12=1 10-19=0 10-26=2 11-02=0 11-09=1

Write a getting-started page for webhooks

Update the auth guide for the new config format

Write a getting-started page for billing

// 4 of 40 sessions. 1.4M tokens, $0.45 at API list-price equivalent (Anthropic rates as of 2026-11-03, OpenAI rates as of 2026-11-11).

7.5% Investigate slow and broken systems 3 ▁▅▁█▁

Diagnosing infrastructure behavior, webhook timeouts, and slow nightly jobs.

agents
Claude Code2 Codex1
tools
Bash:infra4 exec_command:infra2 apply_patch:tf1 Bash:file_ops1 Bash:package_manager1
projects
data-pipeline1 infra1 payments-api1
labels
Explain Terraform recreation of NAT gateway1 Find cause of staging webhook timeouts1 Investigate slow nightly export job1
weekly
10-12=0 10-19=1 10-26=0 11-02=2 11-09=0

Payments webhooks are timing out in staging. Find out why.

Why does terraform plan want to recreate the staging NAT gateway?

Look into why the nightly export job is slow

// 3 of 40 sessions. 3.0M tokens, $1.46 at API list-price equivalent (Anthropic rates as of 2026-11-03, OpenAI rates as of 2026-11-11).

5.0% Exploring dark mode and rate limiting 2 ▁█▁▁█

Prototyping a storefront dark mode toggle and sketching a public API rate limiter.

agents
Claude Code2
tools
Bash:package_manager2 Grep2 Read:md2
projects
payments-api1 storefront-web1
labels
Prototype dark mode toggle for storefront1 Sketch public API rate limiter1
weekly
10-12=0 10-19=1 10-26=0 11-02=0 11-09=1

Prototype a dark mode toggle for the storefront

Sketch a rate limiter for the public API

// 2 of 40 sessions. 1.1M tokens, $0.49 at API list-price equivalent (Anthropic rates as of 2026-11-03, OpenAI rates as of 2026-11-11).

Repeated workflows

// Draft skills are written to disk, never installed. Read one before copying it to ~/.claude/skills/.

Reviewing pull requests

// 6 sessions with a tool mix at cosine ≥ 0.8 to the most typical one (mean 0.94).

mcp:github → mcp:github → Read:ts → Read:ts → mcp:github ×3

wrote skills/reviewing-pull-requests/SKILL.md

show SKILL.md
---
name: pr-first-pass-risk-review
description: "Runs a fast, risk-focused first-pass review of a teammate's pull request, covering metadata, the diff, high-risk changed code, test coverage, and a prioritized findings report."
---

<!-- Draft generated by friskme from 6 sessions of "Reviewing pull requests" on 2026-11-12. Review and edit before installing to ~/.claude/skills/pr-first-pass-risk-review/SKILL.md. -->

# pr-first-pass-risk-review

Runs a fast, risk-focused first-pass review of a teammate's pull request, covering metadata, the diff, high-risk changed code, test coverage, and a prioritized findings report.

## When to use

Use when the user asks for a first-pass, risk-focused, or focused (e.g., error handling or tests) review of a pull request by number or link, with or without asking for review comments. Do not use for authoring or fixing the PR.

## Steps

1. Fetch the PR once: title, description, base and head refs, author, linked issue, changed-file list, and the full diff. Use a single batched call where the available tool allows it instead of several metadata calls.
2. Triage changed files by risk before reading code. Rank higher: authentication and authorization, money or amount handling, persistence and migrations, external API calls, webhooks, config and secrets handling, and error-handling paths. Rank lower: docs, snapshots, generated files, and pure formatting.
3. Read the high-risk changed files in one pass, and open only the direct callers, types, or tests needed to confirm behavior. Do not re-read a file you already have in context.
4. Check each high-risk change for common defects: currency or unit mistakes (rounding, cents vs. units), non-idempotent retries, unhandled promise rejections or thrown exceptions, swallowed or over-broad catches, missing input validation at trust boundaries, missing authz checks, sensitive data in logs, race conditions, and breaking changes to public APIs or schemas.
5. Check test coverage for the changed behavior. Flag missing tests for error paths and edge cases. If the user named a focus area such as error handling or tests, examine that area first and in depth.
6. Record each finding with file, line reference, severity (blocking, should-fix, or nit), and a one-line reason. Drop speculative findings you cannot tie to a specific line of the diff.
7. If the user asked for review comments, submit all of them together as one batched review rather than one call per comment, and keep only findings that are real risks. If comments were not requested, present the drafts in the reply and do not post them.
8. Finish with a short summary: an overall verdict, the top risks, and what you did not verify (for example, tests you did not run or runtime behavior you could not check).

## Notes

Sessions showed the same loop repeated: two metadata calls, two single-file reads, then three separate review or comment calls, roughly seven tool calls each time. Batch the metadata and diff fetch at the start and submit comments in one review at the end to cut round-trips. Reads were also split across file-read and shell-based file tools depending on the session; choose the one already connected and use it consistently. Do not claim tests pass unless they were run. Do not post comments on someone else's PR unless the user asked for them. Avoid copying PR numbers, repo names, or paths into the skill; use the current PR's details only in the reply.

Writing and updating docs

// 4 sessions with a tool mix at cosine ≥ 0.8 to the most typical one (mean 1.00).

Read:md → Grep → Edit:md → Bash:package_manager

wrote skills/writing-and-updating-docs/SKILL.md

show SKILL.md
---
name: write-or-update-docs-pages
description: "Writes new getting-started docs pages or updates existing guide sections (such as auth or config guides) in a docs site by matching sibling page conventions, verifying names in the codebase, and running one docs build check."
---

<!-- Draft generated by friskme from 4 sessions of "Writing and updating docs" on 2026-11-12. Review and edit before installing to ~/.claude/skills/write-or-update-docs-pages/SKILL.md. -->

# write-or-update-docs-pages

Writes new getting-started docs pages or updates existing guide sections (such as auth or config guides) in a docs site by matching sibling page conventions, verifying names in the codebase, and running one docs build check.

## When to use

Use when asked to write a getting-started page for a feature or to update a configuration or auth guide for a changed format. Use it for markdown docs work in a docs-site repository.

## Steps

1. Read the closest existing page first: a sibling getting-started page for new pages, or the guide being updated for edits. Note its frontmatter, heading levels, code-fence style, and section order so the new content matches.
2. Grep the codebase for the feature's exact identifiers (config keys, env var names, endpoints, CLI flags, function names) before writing any example. Do not write names from memory.
3. For a new getting-started page, create it from the sibling's structure: title, one-paragraph purpose, prerequisites, numbered setup steps, one minimal working example, and links to next steps.
4. For an update to an existing guide, grep for the old format's keys or headings to find every affected location, then edit only those sections and leave unrelated content untouched.
5. Keep every code sample consistent with the verified names and the current config format. Use obvious placeholders such as <YOUR_API_KEY> for secrets and never paste real values.
6. If the docs site uses a navigation file, sidebar, or index, add or update the entry for any new page so it is reachable.
7. Run the project's docs build, lint, or link-check script once through the package manager. Fix only the errors it reports, then rerun it once if needed.
8. Finish with a short summary listing the files changed, what was verified against the code, and anything you could not confirm.

## Notes

The sampled sessions were uniform (Read, Grep, Edit, one package-manager call) with zero errors, so the efficient path is short: read the reference page, grep for exact names, edit, and run one build check. Avoid re-reading files you already have and avoid repeated builds. The main risk in this work is inventing config keys or examples without grepping first, which produces wrong docs that only surface later. Keep the steps generic and do not hard-code project-specific page names, paths, or secrets into the skill.

Fix failing and flaky tests

// 4 sessions with a tool mix at cosine ≥ 0.8 to the most typical one (mean 0.99).

Bash:package_manager → Read:ts → Grep → Read:ts → Edit:ts → Bash:package_manager → Bash:package_manager

wrote skills/fix-failing-and-flaky-tests/SKILL.md

show SKILL.md
---
name: fix-failing-and-flaky-tests
description: "Diagnoses and repairs a failing or flaky test file or suite by reproducing the failure, reading the spec and the code under test, making the smallest correct fix, and verifying with the file and then the full suite."
---

<!-- Draft generated by friskme from 4 sessions of "Fix failing and flaky tests" on 2026-11-12. Review and edit before installing to ~/.claude/skills/fix-failing-and-flaky-tests/SKILL.md. -->

# fix-failing-and-flaky-tests

Diagnoses and repairs a failing or flaky test file or suite by reproducing the failure, reading the spec and the code under test, making the smallest correct fix, and verifying with the file and then the full suite.

## When to use

Use when a named spec file or test suite fails locally or in CI, when a test started failing after a merge or rebase, or when a test passes and fails intermittently. Apply it to any module area such as checkout, cart, auth, search, tax, ledger, exports, or ingest.

## Steps

1. Detect the package manager and test runner from lockfiles and package.json scripts before running anything. Use the project's own test script rather than guessing a command.
2. Reproduce the failure by running only the failing spec file, with its name passed as an argument. Capture the first assertion or error message and the stack frame that points into project code.
3. Classify the failure before editing: a deterministic assertion mismatch, a missing or changed import or fixture, a shared-state or ordering dependency, a timing or async race, or an environment difference such as timezone, locale, or env vars. Check `git log` or recent diffs on the spec and the module it covers when the failure began after a merge.
4. Read the spec and the code under test together. Decide whether the regression is in the source (the behavior changed unintentionally) or in the test (the expectation is stale). Do not weaken or delete an assertion to make it pass unless the new behavior is clearly intended; if it is intended, update the expectation and say so.
5. Make the smallest edit that fixes the root cause. For flaky tests, remove the nondeterminism: await real promises instead of sleeping, inject or freeze clocks and random seeds, reset shared mocks and state in beforeEach or afterEach, and avoid depending on test execution order.
6. Re-run the single spec file several times (for example 3 to 5 runs) to confirm the fix is stable. For suspected flakiness, run it under the same conditions that failed before, such as a single worker or random order, to confirm the race is gone.
7. Run the full suite once to catch regressions the fix may have caused in neighboring specs or shared helpers. If unrelated tests fail, check whether they were already failing on the base branch before changing them.
8. Report back concisely: the root cause, the files changed, the command used to verify, and any remaining known-failing or skipped tests, without claiming the suite is green unless the full run actually passed.

## Notes

Every sample session hit one tool error and then re-ran commands, which suggests the first test invocation used the wrong runner, flags, or working directory. Step 1 and step 2 prevent this by reading the scripts first and running a single file with the correct invocation. The sessions also followed a fixed read-grep-read-edit cycle and then ran the whole suite as an afterthought; step 3 asks for failure classification and merge history up front so the edit targets the cause rather than the symptom. Flaky-test work is easy to "fix" by retrying or by loosening assertions, which hides real bugs; step 4 and step 5 require a root-cause decision and removal of nondeterminism instead. Running only the one file after an edit can miss breakage in shared helpers, so step 7 requires the full suite and a base-branch comparison for unrelated failures. Keep fixes out of unrelated files, and never paste secrets, tokens, or machine-specific paths into test code or reports.

Payments API endpoints

// 4 sessions with a tool mix at cosine ≥ 0.8 to the most typical one (mean 1.00).

Read:go → Read:go → Write:go → Write:go → Edit:go → Write:go → Bash:other → Read:yaml → Edit:yaml

wrote skills/payments-api-endpoints/SKILL.md

show SKILL.md
---
name: payments-api-endpoints
description: "Adds or extends REST endpoints for payments resources (refunds, coupons, disputes, customers, payouts, webhooks) with request validation, tests, and matching OpenAPI spec updates, following the conventions already in the repo."
---

<!-- Draft generated by friskme from 4 sessions of "Payments API endpoints" on 2026-11-12. Review and edit before installing to ~/.claude/skills/payments-api-endpoints/SKILL.md. -->

# payments-api-endpoints

Adds or extends REST endpoints for payments resources (refunds, coupons, disputes, customers, payouts, webhooks) with request validation, tests, and matching OpenAPI spec updates, following the conventions already in the repo.

## When to use

Use when asked to add a route, CRUD operations, or validation for a payments resource in a payments API codebase, including follow-ups asking to document it in the OpenAPI spec. Use it for list/create/get/update/delete work on existing payment-domain resources.

## Steps

1. Read one existing sibling resource end to end (handler, request types, validation, and its test file) before writing anything, so the new code matches the project's naming, error shape, and routing style.
2. Read the router or route registration file to find where the new route group is mounted and any middleware (auth, idempotency, versioning) that applies under the version prefix.
3. Write each new Go source file in full in a single pass: handler, request/response types, and validation. Avoid writing a file and then patching it with multiple follow-up edits.
4. Validate request bodies at the boundary: required fields, types, enum values, currency and amount constraints (integers in minor units, positive where required), and ID formats. Return the same validation error structure the sibling handlers use.
5. Register the route in the router under the correct versioned path and method, reusing the existing middleware chain rather than adding new wiring.
6. Write table-driven tests covering the happy path, each validation failure, not-found or conflict cases, and the response shape. Put them alongside the sibling tests and reuse their helpers and fixtures.
7. Run the package build and its tests once (for example go build ./... and go test on the touched packages) and fix any failures in the same pass before moving on.
8. Update the OpenAPI spec in the same change: add the path, method, parameters, request and response schemas, and error responses that mirror the implementation. Reuse existing component schemas and refs instead of duplicating them.
9. Confirm the spec and the code agree on field names, required flags, status codes, and paths, then summarize the endpoints added and any assumptions made about domain rules.

## Notes

The sessions show no tool errors or interrupts, but they reveal a predictable pattern worth optimizing. The OpenAPI update was requested as a follow-up in every session, so the skill includes it up front instead of waiting to be asked. Go files were written, rewritten, and then patched with an Edit, which suggests the first draft was incomplete; drafting each file completely before writing avoids that churn. Validation and the build/test run happen only at the end, so a single verification pass catches problems early rather than after several rounds. Resource-specific names, paths, and secrets were intentionally left out; the agent should take them from the existing codebase at runtime.

Waste

kinditemstokenslist price
failing loops411.7M$4.74
repeated commands35.4M$2.28
error streaks1745.1k$0.28
interrupted endings44.5M$2.64
total1214.3M$6.02

// 7 of 40 sessions affected. A failing loop is a tool pattern repeated 3+ times where at least 2 iterations, and at least half, failed. Repeated commands are the same shell command 3+ times (sleep polling excluded). An error streak is 3+ failed calls in a row. Priced from the responses after the first attempt; each response counted once in totals. Deterministic, no model involved.

kindwhatprojectdatetokenscost
interrupted endSession ended right after you interrupted the agentpayments-api Codex2026-10-302.9M$1.93
failing loop[Bash:package_manager → Edit:json] ×9 edit → run → errorstorefront-web Claude Code2026-11-064.6M$1.56
failing loop[Edit:ts → Bash:package_manager] ×8 edit → run → errorstorefront-web Claude Code2026-10-214.5M$1.54
failing loop[apply_patch:go → exec_command:other] ×5 edit → run → errorpayments-api Codex2026-10-302.1M$1.43
repeated commandbun test tax run 8× (7 failed)storefront-web Claude Code2026-10-212.1M$0.79
repeated commandgo test ./internal/ledger run 5× (5 failed)payments-api Codex2026-10-301.1M$0.77
repeated commandnpm run build run 9× (8 failed)storefront-web Claude Code2026-11-062.2M$0.72
interrupted endSession ended right after you interrupted the agentstorefront-web Claude Code2026-11-11566.9k$0.30
error streak4 failed tool calls in a row (Bash:infra)payments-api Claude Code2026-11-06745.1k$0.28
interrupted endSession ended right after you interrupted the agentdata-pipeline Claude Code2026-10-19520.7k$0.22
failing loopBash:infra ×4payments-api Claude Code2026-11-06571.7k$0.21
interrupted endSession ended right after you interrupted the agentpayments-api Claude Code2026-10-21502.5k$0.19

Sensitive data

Rotate: AWS access key, AWS secret key, GitHub token, Slack token. These values appeared in a session, so they were sent to the model provider with the rest of the conversation.

kindtypeconfidencevaluesseensessionswhere
secretAWS access keyhigh111tool output 1
secretAWS secret keyhigh111tool output 1
secretSlack tokenhigh111tool output 1
secretGitHub tokenhigh111tool output 1
personalphonehigh111you typed 1
personalemailmedium111you typed 1

// Scanned 0.0M characters in 640 text blocks: prompts, tool input and output, agent replies and subagents. Detectors: rules (frisk-secrets-1 (derived from gitleaks v8 defaults)). Values are masked; run with --reveal to see them. 0 low-confidence matches are listed in report.json only. Names and places need --pii-model.

show all 6 values
AWS access key AKIA…(20) 1 1 tool output Bash:file_ops 1 2026-11-06
sessionprojectdatewheretimes
2e2358fcpayments-api2026-11-06tool output Bash:file_ops1

// high confidence, detected by rule:aws-access-key. Projects: payments-api. Hover a session id for its claude --resume command.

AWS secret key I874…(40) 1 1 tool output Bash:file_ops 1 2026-11-06
sessionprojectdatewheretimes
2e2358fcpayments-api2026-11-06tool output Bash:file_ops1

// high confidence, detected by rule:aws-secret-key. Projects: payments-api. Hover a session id for its claude --resume command.

GitHub token ghp_…(40) 1 1 tool output exec_command:git 1 2026-11-03
sessionprojectdatewheretimes
6300a65ainfra2026-11-03tool output exec_command:git1

// high confidence, detected by rule:github-pat. Projects: infra. Hover a session id for its claude --resume command.

Slack token xoxb…(55) 1 1 tool output Bash:file_ops 1 2026-11-06
sessionprojectdatewheretimes
2e2358fcpayments-api2026-11-06tool output Bash:file_ops1

// high confidence, detected by rule:slack-bot-token. Projects: payments-api. Hover a session id for its claude --resume command.

phone ••••42 1 1 you typed 1 2026-11-06
sessionprojectdatewheretimes
2e2358fcpayments-api2026-11-06you typed1

// high confidence, detected by rule:phone. Projects: payments-api. Hover a session id for its claude --resume command.

email d•••@a•••.io 1 1 you typed 1 2026-11-06
sessionprojectdatewheretimes
2e2358fcpayments-api2026-11-06you typed1

// medium confidence, detected by rule:email. Projects: payments-api. Hover a session id for its claude --resume command.

Method and caveats