INDEX.md

September 4, 2026 · View on GitHub

Each package's AGENTS.md is referenced hierarchically through this file. Common rules are in the root AGENTS.md.


Package Rules

PackageAGENTS.mdRole
protocolpackages/protocol/AGENTS.mdWebSocket wire contract shared by relay, dashboard and mcp-server (types only)
agent-corepackages/agent-core/AGENTS.mdDeviceAgent interface design principles
ios-agentpackages/ios-agent/AGENTS.mdmacOS-only simulator control rules
android-agentpackages/android-agent/AGENTS.mdADB-based emulator control rules
audiotap-helperpackages/audiotap-helper/AGENTS.mdshared macOS process-tap helper (iOS capture + Android host-mute)
relaypackages/relay/AGENTS.mdWebSocket relay server rules
dashboardpackages/dashboard/AGENTS.mdVite + React SPA UI rules
clipackages/cli/AGENTS.mdCLI UX rules
mcp-serverpackages/mcp-server/AGENTS.mdMCP server bridging tapflow to LLM agents
flow-runnerpackages/flow-runner/AGENTS.mdDeterministic YAML flow engine (automated QA axis)
test-utilspackages/test-utils/AGENTS.mdTest-only helpers shared across packages (private, never published)

Local Only

DirectoryAGENTS.mdPurpose
playgroundplayground/AGENTS.mdFull-stack local run and integration testing
.work.work/CLAUDE.mdLocal work log conventions (plan/review/compound)
.internal/marketing.internal/marketing/CLAUDE.mdMarketing context — product positioning, copy bank, channel tone guide

Documentation

FileContents
CONTRIBUTING.mdBranch, release, and commit conventions
packages/dashboard/DESIGN.mdDashboard design system — color tokens, typography, elevation, component specs
packages/ios-agent/netprobe/README.mdThe network probe app — what it reports, why the reachability getter and listener are two separate lines, and how to arm layer 2 by hand
packages/ios-agent/ios-netfilter/README.mdThe macOS network-filter system extension — why a content filter and not a transparent proxy, the container app's exit codes, and building it (paid Apple account, notarization, the load-bearing CFBundleVersion bump)
.internal/PRD.mdProduct requirements (local only)
docs/AGENTS.mdVitePress work rules — shiki code blocks, CSS customization notes

Engineering decision & rationale records — contributing/

Committed why behind non-obvious decisions. Read the relevant one before changing the code it describes. Schema and conventions: contributing/README.md.

FiletypeContents
simulator-audio.mdrationaleSimulator audio capture (iOS/Android) — design, whole-sim dynamic tap, sim-volume, rejected approaches
legacy-browser-fallback-ios-only.mdrationaleWhy the JPEG legacy-browser (~5%) fallback exists only on iOS — historical, not a bug
monorepo-project-references.mdrationaleWhy library packages use TS project references — the exports.types→src bug (#345), rejected alternatives
android-sdk-bootstrap.mdrationaleWhy setup android bootstraps a self-contained SDK — Android Studio ≠ SDK, the three fragility causes
runtime-platform-registration.mdrationaleWhy platforms self-register at runtime (AgentRegistry.register) instead of a literal Platform union — the OCP payoff
codec-negotiation.mdrationaleWhy the browser negotiates H.264 capability before the agent streams — the ~95%/5% floor, black-screen prevention
android-rotation.mdrationaleWhy rotation uses wm user-rotation + pinned scrcpy 3.3 — legacy command ignored on API 35+
ios-device-recovery.mdrationaleWhy tapflow start does not pre-boot iOS, and where zombie-simulator recovery lives
agent-keep-awake.mdrationaleWhy the agent holds a caffeinate assertion during a session — idle throttle drops the emulator to ~4-5 fps
relay-heartbeat.mdrationaleWhy the relay runs a ping/pong heartbeat — dead sockets otherwise linger to the TCP timeout
relay-resource-rejection.mdrationaleWhy the relay rejects new sessions above a CPU/RAM threshold, evaluated relay-side
relay-backpressure-frame-drop.mdrationaleWhy the relay silently drops frames on bufferedAmount backpressure — bounds memory
build-status-deletion-decoupling.mdrationaleWhy a build's Done status is decoupled from its delete_after deletion lifetime
relay-tunnel-access.mdrationaleWhy the relay stays inside the agent's network and tunneling is an opt-in plugin
relay-agent-auth.mdrationaleWhy remote agents authenticate with an agent-scope PAT instead of an IP check
relay-secret-loading.mdrationaleWhy the relay loads .env before evaluating its module-singleton config
simkit-internals.mdreferenceSimulatorKit reverse-engineering notes — binary layout, symbols, touch/button injection
measurement.mdreferenceEvery performance metric emitter — how to enable it, its output, what it means
downscale-tuning.mdreferenceEncode-resolution downscale lever — QA fidelity vs decode/bandwidth, recommended default
frame-envelope.mdreferenceFrame envelope wire format (TFFE v1) — 22-byte per-frame timestamp header, magic-byte backward compat
sustainability-carbon-math.mdreferenceCarbon arithmetic behind the Sustainability page — measured session increment, Apple PER inputs, sensitivity, and the comparisons we dropped
streaming-latency-log.mdlogAppend-only glass-to-glass latency log — pipeline analysis, attempts, decisions
android-video-streaming-diagnosis.mddiagnosisAndroid emulator streaming issues traced to root cause, one section per issue
awdl-wifi-latency-diagnosis.mddiagnosisPeriodic Wi-Fi stream hitch traced to AWDL via ICMP ping — method and evidence
workshop-lab-fork-observations.mdreferenceThird-party workshop-lab fork: independent iOS-sim capacity data (~4 seats/32GB) + where our extension seams stop
adversarial-review.mdrulesHow to run the pre-PR review and the cross-cutting design pass — channel design, prompt skeleton, why a cleared list ages with the diff, why a fix falsifies the prose beside it, why the same review costs 4 minutes or 106
test-and-guard-coverage.mdrulesWhat a test or a static check must execute to hold its claim — absence assertions verified only by the mutation that creates the absence, four ways a guard gets bypassed, why the success path gets the first mutation, and the three ways a probe passes for the wrong reason — including the one no mutation can find
security-bumps.mdrulesWhy a security bump is pnpm update before pnpm.overrides — fourteen inert entries measured, why the override key comes from the GHSA advisory and not the Dependabot alert, why the key and its replacement are both capped to one major