Agent skill

Codex E2E Trace Validation

by liaohch3 in liaohch3/claude-tap

Runs a real Codex CLI session through claude-tap and produces trace evidence and viewer screenshots for pull requests that touch capture, proxying or the viewer.

MITAuto-check passedTesting & QA

Install Codex E2E Trace Validation

skills CLI
$ npx skills add liaohch3/claude-tap --skill codex-e2e-test -a claude-code

Project install by default; add -g for ~/.claude/skills/.

GitHub CLI
$ gh skill install liaohch3/claude-tap codex-e2e-test --agent claude-code

Project scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).

Manual copy
$ git clone --depth 1 https://github.com/liaohch3/claude-tap.git skills-src && mkdir -p .claude/skills && cp -r skills-src/.agents/skills/codex-e2e-test .claude/skills/codex-e2e-test && rm -rf skills-src

Use ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.

Claude Code skills documentation · loads skills from .claude/skills/

Facts

Skill name
codex-e2e-test
GitHub stars
3.3k
Token cost
~3k tokens
SKILL.md length
744 words
Files
1
Skills in repo
11
Repo updated
First seen
Licence
MIT

At a glance

Runs a real Codex CLI session through claude-tap and produces trace evidence and viewer screenshots for pull requests that touch capture, proxying or the viewer.

  • Works in 5 steps: Prepare an isolated workspace → Start a real Codex session through… → Resume the same Codex session with… → …
  • Validating a pull request that changes capture, proxying or trace ordering in claude-tap
  • SKILL.md covers Prerequisites, Key Difference from Claude E2E, Run a Real Codex E2E Trace and Resume + Multimodal…, plus 4 more sections
  • Calls uv, codex and python3; reaches chatgpt.com and api.openai.com; needs OPENAI_API_KEY

What it does

This skill is a runbook for end-to-end checks of the claude-tap project against the real Codex CLI. It starts claude-tap from local source, connects Codex through OAuth, captures the OpenAI Responses API traffic and produces viewer screenshots that can be attached to a pull request as evidence.

It covers a simple single-tool smoke test, a multi-call run that forces several API requests, and a default flow that resumes a session, forces multiple shell tool calls per turn and attaches an image so the trace includes multimodal content. Codex with OAuth talks to a different upstream than the plain OpenAI API, so the proxy has to be pointed at the right target with the --tap-target option.

When your agent uses it

  • Validating a pull request that changes capture, proxying or trace ordering in claude-tap
  • Checking viewer rendering of content blocks, tool calls, images or token usage
  • Producing screenshot evidence for session or dashboard changes

Example prompts

  • “Run the Codex end-to-end flow for this claude-tap PR and save the viewer screenshots.”
  • “Do a smoke test of my local Codex setup through claude-tap before I open the PR.”
  • “Capture a resumed Codex session with an image attached and show me the trace in the viewer.”

Requirements

  • The codex CLI installed and signed in through OAuth
  • Python dev dependencies installed with uv sync --extra dev
  • Playwright with Chromium installed through uv

Workflow steps

5 steps, taken from the step headings in SKILL.md.

  1. Prepare an isolated workspace
  2. Start a real Codex session through claude-tap
  3. Resume the same Codex session with another real turn
  4. Capture multi-position viewer screenshots
  5. Verify the trace

What it can do on your machine

Read from SKILL.md and the folder at commit 4cc867d. It shows what the files ask for, not the result of running them.

  • Tool permissions

    Pre-approves nothing: there is no allowed-tools line, so your agent's usual permission prompts apply.

    From allowed-tools in the SKILL.md frontmatter.

  • Runs code

    Shell commands in SKILL.md call:

    • uv
    • codex
    • python3
    • npm

    From the folder's file list and the shell code blocks in SKILL.md.

  • Network

    Hosts in commands or code, which the agent is likely to contact:

    • chatgpt.com
    • api.openai.com

    From URLs in SKILL.md, links to its own repository left out.

  • Credentials

    Names these keys or tokens, usually read from environment variables:

    • OPENAI_API_KEY

    From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.

Context cost

Codex E2E Trace Validation loads about 3k tokens when it runs. Until then it costs about 47 tokens; SKILL.md has 744 words of instructions outside code blocks.

Always · name and description, kept in context so the agent knows when to use it
~47
When it runs · the whole SKILL.md, loaded when a task matches
~3k

Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.

Safety

Auto-check passed

The automated check found no risky patterns in SKILL.md.

Automated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); files beside SKILL.md are not scanned.

SKILL.md

The full file from liaohch3/claude-tap at commit 4cc867d, republished under its MIT licence (© liaohch3). 744 words, ~3,015 tokens.

Download SKILL.mdSave it as .claude/skills/codex-e2e-test/SKILL.md (or your agent's skills folder).
name
codex-e2e-test
description
Run PR-grade real Codex E2E validation through claude-tap, including resume turns, multiple tool calls, optional image input, viewer verification, and screenshot evidence.
tags
testing, e2e, codex, responses-api

Codex E2E Test Skill

Run real end-to-end validation that starts claude-tap from local source, connects to the real Codex CLI via OAuth, captures OpenAI Responses API traces, and produces viewer screenshots suitable for PR evidence.

Use this skill for every PR that changes capture, proxying, viewer rendering, session/dashboard behavior, client launch logic, trace ordering, content blocks, tools, token usage, or screenshot/demo assets. If a PR cannot run this flow, state why in the PR and cover the same risk with another real client trace.

Prerequisites

  • codex CLI installed (npm install -g @openai/codex) and authenticated via OAuth
  • Python dev dependencies: uv sync --extra dev
  • Playwright installed: uv run playwright install chromium

Verify OAuth works:

bash
codex exec "say hello" --dangerously-bypass-approvals-and-sandbox

If it fails with token errors, re-authenticate:

bash
codex auth login

Key Difference from Claude E2E

Codex uses the OpenAI Responses API (/v1/responses) instead of Anthropic Messages API. With OAuth authentication, the upstream is https://chatgpt.com/backend-api/codex, not https://api.openai.com.

The proxy must be told the correct target with --tap-target.

Run a Real Codex E2E Trace

Prefer the resume + multimodal flow below for PR evidence. The simple commands are only smoke tests for checking local setup.

Simple (single tool call)
bash
claude-tap --tap-client codex \
  --tap-target https://chatgpt.com/backend-api/codex \
  --tap-output-dir /tmp/codex-e2e \
  --tap-no-open \
  -- exec "say hello" \
  --dangerously-bypass-approvals-and-sandbox
Multi-call (triggers multiple API requests)

Use a task that requires shell tool use — this forces the agent to make multiple Responses API calls (models lookup + actual responses):

bash
claude-tap --tap-client codex \
  --tap-target https://chatgpt.com/backend-api/codex \
  --tap-output-dir /tmp/codex-e2e \
  --tap-no-open \
  -- exec "Read pyproject.toml and tell me the project name and version" \
  --dangerously-bypass-approvals-and-sandbox

Expected: 4+ API calls (2x GET /v1/models + 2x POST /v1/responses).

Resume + Multimodal Content-Block Trace

Use this flow for viewer changes that affect message rendering, content block boundaries, tool call ordering, images, or copy/select behavior. It creates a real Codex session, resumes it at least once, forces multiple shell tool calls per user turn, and attaches an actual image so the trace includes multimodal content. This is the default PR evidence flow.

1. Prepare an isolated workspace
bash
mkdir -p /tmp/claude-tap-real-codex-workspace
printf 'project = "claude-tap-real-codex-e2e"\n' \
  > /tmp/claude-tap-real-codex-workspace/project.toml

Create or copy a small valid PNG into the workspace. If you need a deterministic local image, generate it with Python's standard library:

bash
python3 - <<'PY'
from pathlib import Path
import struct
import zlib

def chunk(kind: bytes, data: bytes) -> bytes:
    return struct.pack(">I", len(data)) + kind + data + struct.pack(">I", zlib.crc32(kind + data) & 0xFFFFFFFF)

width = height = 8
rows = b"".join(b"\x00" + (b"\x2f\x80\xed\xff" * width) for _ in range(height))
png = (
    b"\x89PNG\r\n\x1a\n"
    + chunk(b"IHDR", struct.pack(">IIBBBBB", width, height, 8, 6, 0, 0, 0))
    + chunk(b"IDAT", zlib.compress(rows))
    + chunk(b"IEND", b"")
)
Path("/tmp/claude-tap-real-codex-workspace/input.png").write_bytes(png)
PY
2. Start a real Codex session through claude-tap

Run from the repository, but point Codex at the isolated workspace with -C. The prompt should explicitly require several tool calls so the viewer has enough messages, tool calls, and response blocks to inspect.

bash
uv run claude-tap --tap-client codex \
  --tap-target https://chatgpt.com/backend-api/codex \
  --tap-output-dir /tmp/claude-tap-real-codex-traces \
  --tap-no-open \
  -- exec -C /tmp/claude-tap-real-codex-workspace \
  --image /tmp/claude-tap-real-codex-workspace/input.png \
  --dangerously-bypass-approvals-and-sandbox \
  "Inspect this workspace and the attached image. Use shell tools to run pwd, list files, inspect project.toml, inspect input.png, then write codex_e2e_report.txt with your findings. Keep all writes inside this workspace."
3. Resume the same Codex session with another real turn

Use the session id printed by the first Codex run when possible. Avoid relying on --last on busy maintainer machines because it can resume an unrelated recent Codex session.

bash
uv run claude-tap --tap-client codex \
  --tap-target https://chatgpt.com/backend-api/codex \
  --tap-output-dir /tmp/claude-tap-real-codex-traces \
  --tap-no-open \
  -- exec resume <SESSION_ID_FROM_FIRST_RUN> \
  --image /tmp/claude-tap-real-codex-workspace/input.png \
  --dangerously-bypass-approvals-and-sandbox \
  "Continue the same investigation in /tmp/claude-tap-real-codex-workspace. Use shell tools to read /tmp/claude-tap-real-codex-workspace/codex_e2e_report.txt, compute the byte size of /tmp/claude-tap-real-codex-workspace/input.png, and write /tmp/claude-tap-real-codex-workspace/codex_e2e_followup.txt. Then summarize what changed since the previous turn."
4. Capture multi-position viewer screenshots

Take screenshots at multiple scroll positions, including a deeper position in the same detail pane. Store them under .agents/evidence/pr/<topic>/ and use raw.githubusercontent.com links in the PR body.

bash
mkdir -p .agents/evidence/pr/codex-real-e2e

uv run python - <<'PY'
from pathlib import Path
from playwright.sync_api import sync_playwright

html_files = sorted(Path("/tmp/claude-tap-real-codex-traces").rglob("trace_*.html"))
if not html_files:
    raise SystemExit("No viewer HTML found in /tmp/claude-tap-real-codex-traces")
html = html_files[-1]
out_dir = Path(".agents/evidence/pr/codex-real-e2e")

with sync_playwright() as p:
    browser = p.chromium.launch(headless=True)
    page = browser.new_page(viewport={"width": 1760, "height": 1100}, device_scale_factor=1)
    page.goto(f"file://{html}", wait_until="domcontentloaded", timeout=10000)
    page.wait_for_selector(".sidebar-item", timeout=5000)
    page.evaluate("document.documentElement.setAttribute('data-theme', 'light')")

    # Select the last Responses call so resume context is visible.
    page.evaluate(
        """() => {
          const items = Array.from(document.querySelectorAll('.sidebar-item'));
          const responses = items.filter(item => item.textContent.includes('/v1/responses'));
          (responses.at(-1) || items.at(-1))?.click();
        }"""
    )
    page.wait_for_timeout(300)

    page.evaluate(
        """() => {
          for (const section of document.querySelectorAll('#detail .section')) {
            const title = section.querySelector('.title')?.textContent || '';
            const body = section.querySelector('.section-body');
            const header = section.querySelector('.section-header');
            if (!body || !header) continue;
            const shouldOpen = ['System Prompt', 'Messages', 'Response'].includes(title);
            const isOpen = body.classList.contains('open');
            if (shouldOpen !== isOpen) header.click();
          }
        }"""
    )
    page.wait_for_timeout(200)

    def shot(name: str, scroll_top: int) -> None:
        page.evaluate("y => { const d = document.querySelector('#detail'); if (d) d.scrollTop = y; }", scroll_top)
        page.wait_for_timeout(200)
        page.screenshot(path=str(out_dir / name), full_page=False)

    shot("codex-real-top.png", 0)
    shot("codex-real-mid.png", 700)
    shot("codex-real-deep.png", 1400)

    image_count = page.evaluate(
        """() => {
          const img = document.querySelector('#detail img');
          if (!img) return 0;
          img.scrollIntoView({ block: 'center', inline: 'nearest' });
          return document.querySelectorAll('#detail img').length;
        }"""
    )
    if image_count:
        page.wait_for_timeout(200)
        page.screenshot(path=str(out_dir / "codex-real-image.png"), full_page=False)

    browser.close()
PY

Validate screenshots:

bash
uv run python scripts/check_screenshots.py .agents/evidence/pr/codex-real-e2e
Show full SKILL.md (317 more words)Show less
5. Verify the trace
  • The output directory contains at least two real .jsonl traces and generated .html viewers from claude-tap.
  • The trace includes multiple POST /v1/responses entries with status 200 and non-zero token usage.
  • At least one request contains image content from the --image attachment.
  • The viewer shows Messages and Response sections with multiple content blocks separated cleanly.
  • Tool calls and tool results stay interleaved in the order they happened.
  • Copy buttons still copy the complete logical message/section text, not only one visual content block.
  • Text selection across adjacent content blocks remains possible in the browser.
  • Screenshot evidence includes at least two scroll depths for the same resumed trace, not only the top of the page.
  • If the trace contains image input, screenshot evidence includes the rendered image block or records why the client did not send image content into the API request body.

Taking Viewer Screenshots with Playwright

python
from playwright.sync_api import sync_playwright
import time, glob

html = glob.glob("/tmp/codex-e2e/trace_*.html")[-1]

with sync_playwright() as p:
    browser = p.chromium.launch()
    page = browser.new_page(viewport={"width": 1440, "height": 1000})
    page.goto(f"file://{html}")
    page.wait_for_load_state("networkidle")
    time.sleep(1)

    # Select a Responses call (data-idx matches trace line index)
    page.click('.sidebar-item[data-idx="1"]')
    time.sleep(0.5)

    # Collapse System Prompt, keep Messages open
    page.evaluate("""() => {
        const h = document.querySelectorAll('.section-header')[1];
        const next = h.nextElementSibling;
        if (next && getComputedStyle(next).display !== 'none') h.click();
    }""")

    # Scroll to Messages section
    page.evaluate("""() => {
        document.querySelectorAll('.section-header')[2]
          .scrollIntoView({behavior: 'instant', block: 'start'});
    }""")
    time.sleep(0.3)
    page.screenshot(path="/tmp/codex-e2e/messages.png")

    browser.close()

Verification Checklist

  • Trace .jsonl has ≥2 POST /v1/responses entries
  • Response status is 200 (not 401/502)
  • Token counts are non-zero in Responses calls
  • HTML viewer is generated (trace_*.html)
  • Sidebar shows multiple calls with model name and token counts
  • Messages section shows user message text (verifies #41 fix)
  • Response section shows assistant reply (verifies #40 fix)

Troubleshooting

SymptomCauseFix
WebSocket 502 then HTTP 401Default target api.openai.com rejects ChatGPT OAuth tokensUse --tap-target https://chatgpt.com/backend-api/codex
Missing scopes: api.responses.writeAPI key lacks Responses API accessUse OAuth (codex auth login) instead of OPENAI_API_KEY
Only 1 API callSimple prompt completed in one roundUse a task requiring tool use (file reads, shell commands)
OPENAI_BASE_URL is deprecated warningCodex v0.115+ prefers config.tomlHarmless — proxy still works via env var

Notes

  • Codex with OAuth uses WebSocket first, then falls back to HTTP/SSE when proxied. The fallback is transparent — traces capture the HTTP/SSE path correctly.
  • Each codex exec session also calls GET /v1/models for model discovery.
  • The --dangerously-bypass-approvals-and-sandbox flag is required for non-interactive exec.

© liaohch3, MIT. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file

Files

Just SKILL.md in .agents/skills/codex-e2e-test of liaohch3/claude-tap.

Open the folder on GitHubat commit 4cc867d

Compare with similar skills

Codex E2E Trace Validation next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.

Codex E2E Trace Validation compared with similar skills
SkillStarsUsed inTokensAuto-checkLicenceRepo updated
Codex E2E Trace Validation this skillliaohch3/claude-tap3.3k—~3kAutomated safety check: PassMIT
RStudio Selenium to Playwright Migrationrstudio/rstudio5.1k—~3.6kAutomated safety check: PassCustom licence
Web Application Testinganthropics/skills180k51 repos~966Automated safety check: PassApache-2.0
E2E TestingOpenHands/OpenHands90k—~308Automated safety check: PassMIT
PlaywrightKiln-AI/Kiln5.2k—~1.3kAutomated safety check: PassCustom licence
Mmsp DevPrism-Shadow/model-message-stream-protocol113—~7.2kAutomated safety check: PassApache-2.0

Similar skills

  • Converts RStudio Python Selenium electron tests into TypeScript Playwright tests, checking each against a live RStudio before counting it as migrated.

    5.1k GitHub stars~3.6k tokensUpdated yesterday
    Testing & QAAuto-check passed
  • Web Application Testing

    anthropics/skills

    Official

    Tests local web applications with Python Playwright scripts, checking frontend behavior, capturing screenshots and reading browser console logs.

    180k GitHub starsUsed in 51 repos~966 tokens
    Testing & QAAuto-check passed
  • E2E Testing

    OpenHands/OpenHands

    This skill should be used when the user asks to "add an E2E test", "run live E2E", "run mock-LLM tests", "debug Playwright CI", "test the Docker image", or changes tests/e2e, Playwright configs, E2E…

    90k GitHub stars~308 tokensUpdated today
    Testing & QAAuto-check passed
  • Playwright

    Kiln-AI/Kiln

    Look at Kiln's UI in a real browser, and run its end-to-end tests.

    5.2k GitHub stars~1.3k tokensUpdated today
    Testing & QAAuto-check passed
  • Mmsp Dev

    Prism-Shadow/model-message-stream-protocol

    Fixed workflow for developing MMSP itself — adding or updating model support, and changing its pages.

    113 GitHub stars~7.2k tokensUpdated 3 days ago
    Testing & QAAuto-check passed
  • Test Specialist

    travisjneuman/.claude

    Test-writing patterns for JS/TS, Python, Go, and Rust (unit, integration, E2E, visual regression).

    101 GitHub stars~3.7k tokensUpdated yesterday
    Testing & QAAuto-check passed

More from liaohch3/claude-tap

All 11 skills in this repo
  • Terminal Demo Video Recorder

    liaohch3/claude-tap

    Records a real tmux end-to-end run with asciinema, converts it to a GIF and MP4, and captures trace viewer screenshots with Playwright.

    3.3k GitHub stars~545 tokensUpdated 15 days ago
    Auto-check passed
  • JS-in-HTML Testing

    liaohch3/claude-tap

    Tests JavaScript embedded in an HTML file in two layers: pytest checks of the logic ported to Python, and Playwright runs in a real browser for the DOM.

    3.3k GitHub stars~924 tokensUpdated 15 days ago
    Auto-check passed
  • Runs local checks on maintainer docs for stale review dates, missing manifest paths and plan state drift, matching what the CI workflow enforces.

    3.3k GitHub stars~561 tokensUpdated 15 days ago
    Auto-check passed
  • Playwright Screen Recording

    liaohch3/claude-tap

    Records headless Playwright sessions as .webm videos to show a bug fix working or to give pull request reviewers visual evidence.

    3.3k GitHub stars~714 tokensUpdated 15 days ago
    Auto-check passed
  • PR Preflight Check

    liaohch3/claude-tap

    Runs a single merge-readiness check on a pull request: metadata, GitHub Actions status, local lint, format and test gates, and PR body rules, ending in READY or NOT_READY.

    3.3k GitHub stars~615 tokensUpdated 15 days ago
    Auto-check passed
  • Push and PyPI Release

    liaohch3/claude-tap

    Pushes the current work to GitHub and, when pending commits change code, bumps the version in pyproject.toml so CI publishes a new PyPI release.

    3.3k GitHub stars~509 tokensUpdated 15 days ago
    Auto-check passed

Questions about Codex E2E Trace Validation

What does Codex E2E Trace Validation do?

Runs a real Codex CLI session through claude-tap and produces trace evidence and viewer screenshots for pull requests that touch capture, proxying or the viewer. This skill is a runbook for end-to-end checks of the claude-tap project against the real Codex CLI. It starts claude-tap from local source, connects Codex through OAuth, captures the OpenAI Responses API traffic and produces viewer screenshots that can be attached to a pull request as evidence.

When should I use Codex E2E Trace Validation?

Codex E2E Trace Validation fits situations like: validating a pull request that changes capture, proxying or trace ordering in claude-tap; checking viewer rendering of content blocks, tool calls, images or token usage; producing screenshot evidence for session or dashboard changes.

How do I install Codex E2E Trace Validation in Claude Code?

Run `npx skills add liaohch3/claude-tap --skill codex-e2e-test -a claude-code`. Or copy the skill folder (.agents/skills/codex-e2e-test in liaohch3/claude-tap) into .claude/skills/codex-e2e-test in your project. Claude Code loads it when a task matches its description.

How do I install Codex E2E Trace Validation in Codex?

Run `npx skills add liaohch3/claude-tap --skill codex-e2e-test -a codex`. Or copy the skill folder (.agents/skills/codex-e2e-test in liaohch3/claude-tap) into .agents/skills/codex-e2e-test in your project. Codex loads it when a task matches its description.

Can I use Codex E2E Trace Validation in Cursor, Gemini CLI or GitHub Copilot?

Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add liaohch3/claude-tap --skill codex-e2e-test -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/codex-e2e-test, .gemini/skills/codex-e2e-test, .github/skills/codex-e2e-test and .opencode/skills/codex-e2e-test in your project.

What does Codex E2E Trace Validation need to run?

Going by SKILL.md and its folder, Codex E2E Trace Validation needs the command-line tools its instructions call (uv, codex, python3 and npm) and credentials named OPENAI_API_KEY. Our summary lists: The codex CLI installed and signed in through OAuth; Python dev dependencies installed with uv sync --extra dev; Playwright with Chromium installed through uv.

Does Codex E2E Trace Validation access the network?

SKILL.md names 2 domains. In commands or code: chatgpt.com and api.openai.com; the agent is likely to contact these when it follows the instructions. This is read from the text; nothing was executed.

Is Codex E2E Trace Validation safe to install?

Our automated static check of SKILL.md found no risky patterns, such as piping downloads into a shell, reading credential files or hidden Unicode. It is not a guarantee. Review the folder before installing.

What licence does Codex E2E Trace Validation use?

Codex E2E Trace Validation is published under the MIT licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.

How many tokens does Codex E2E Trace Validation use?

About 3k tokens (SKILL.md is roughly 12k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full.

What are the alternatives to Codex E2E Trace Validation?

Skills that share tags, products or a category with Codex E2E Trace Validation: RStudio Selenium to Playwright Migration (rstudio/rstudio, 5.1k stars), Web Application Testing (anthropics/skills, 180k stars), E2E Testing (OpenHands/OpenHands, 90k stars) and Playwright (Kiln-AI/Kiln, 5.2k stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.

Who maintains Codex E2E Trace Validation?

liaohch3 (a GitHub user) maintains it in liaohch3/claude-tap, which has 3,267 GitHub stars. The repository holds 11 skills in this directory. The repository was last updated on September 22, 2026.

Source: liaohch3/claude-tap on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.