Workflow timings
See where everyday checks take time and where failed runs repeat.
Open Timings in your project dashboard. PhaseDrift discovers your project’s commands during setup and captures supported normal runs locally. Keep using your usual lint, format, test and build commands.
Connect capture once
New project setup includes timing capture. For an existing project, choose Connect capture in Timings, or run:
phasedrift timing setupReopen terminals that were already open. Your project’s scripts stay intact. Capture is confirmed by the first actual run; an installed integration alone is not a measurement.
Read the charts
The duration chart shows successful runs, failures and reruns. A rerun is the same command and comparison group following a failed run within 30 minutes. It does not assume why you ran it again.
Daily bars show first runs and reruns. Recent runs include duration and exit status. Choose a command to see its median and slower-tail duration.
Different command recipes, arguments, machines, environments and local/CI runs stay separate. Parent commands and their captured children are not added together. These are command timings; individual test-case timings need runner-specific reports.
Capture alerts
Capture shows changed, removed or possibly renamed commands; unconfirmed or quiet integrations; interrupted runs; storage problems; and repeated slower runs. Missing data stays unknown. Repair the integration or run the changed command normally to confirm capture.
Supported terminal runners include npm, pnpm, yarn, Bun, Make, Just, Rust and common Python/JavaScript check tools. Absolute executable paths, unsupported tools and shells that bypass the activation can bypass capture; the dashboard makes its confirmation state visible.
Capture retains timing, outcome and comparison metadata. It does not save command output or raw arguments, and does not upload timings or invoke cloud analysis. Saved data and queued receipts remain available when a subscription pauses.
Review and configure the project
Your setup agent runs phasedrift timing discover, reads the actual task files, AGENTS instructions, relevant skills and CI, then configures the exact commands with phasedrift timing configure --stdin. The registry stores working directories, categories, reviewed recipe hashes, custom aliases, exclusions and mutating/watch/network characteristics. Discovery never approves execution. Changed recipes lose review status; old history stays available.
Capture includes category, include/exclude and command-review controls plus custom commands. Included, reviewed and actually observed counts stay separate. Select a category to find its timings and inventory. Scheduled check execution is off. Monitoring imports ordinary receipts and checks capture health without running more checks.
Use timing list, timing status, timing verify and timing history to read the same inventory, checker health and retained history through the CLI. History supports days, command, category, limit and cursor filters. Apply the environment from timing env to normal agent/profile-free shell processes and existing pre-commit commands. A representative normal receipt confirms interception; absolute paths and later PATH changes can bypass it. An authorized timing run --command ID executes a reviewed exact argv locally; timing record --stdin records measured external evidence. Neither needs a trial. PhaseDrift 0.4.24 executes an explicit run in the verified invoking Git worktree, including its directory, environment and clean-tree probes. Linked worktrees retain their shared registration and history. Foreign repositories and changed recipes require current review. Prefer formatting check mode and preserve dirty work.
Shared API and local MCP
The loopback API uses /api/health/workflow-timings for the dashboard summary, GET /registry, /status and /history, and protected POST /configure and /record. The API has no execution endpoint. Mutation retains Origin, CSRF, subscription and preview protections. Configuration uses expectedRevision; overrides merge by command ID and a supplied custom list replaces the previous custom list.
A local host can launch the installed CLI with phasedrift mcp --repo /path/to/project. Preserve its existing servers and use the installed CLI executable, not a cloud URL. Read-only tools are phasedrift_checks_discover, phasedrift_checks_list, phasedrift_checks_status, phasedrift_checks_history and phasedrift_checks_environment. Explicitly adding --allow-configure enables phasedrift_checks_configure and phasedrift_checks_record. No MCP tool executes checks, starts CI or calls a provider. The server uses the included runtime and the verified local project tracker.
Configure one reviewed definition using IDs and hashes returned by discovery. This example contains placeholders and is not an executable configuration:
{
"expectedRevision": 1,
"overrides": [{
"id": "<discovered ID>",
"kind": "typecheck",
"enabled": true,
"review": {
"recipeHash": "<current recipe hash>",
"argv": ["bun", "run", "typecheck"],
"provenance": "package.json scripts.typecheck and AGENTS.md",
"mutates": false,
"watch": false,
"network": false
}
}]
}Custom commands use a stable key, name, repository-relative directory, category, exact argv, review source, mutates/watch/network flags and enabled state. Timing receipts use one UUID per invocation; repeated identical receipts deduplicate and conflicts are rejected. Missing finish/result stays unknown. Approved check jobs retain their existing approval and sandbox protections while linking their job UUID to a separate timing group. Explicit or approved receipts do not establish ordinary terminal PATH interception.
Inventory, clean repeats and feedback time
PhaseDrift 0.4.22 adds Code health → Checks. Discovery reads package scripts, literal Make/Just targets, supported Python/Cargo definitions, GitHub Actions run steps, and literal verifier commands in shell fences in AGENTS.md and local skills. Exact package-script references add source provenance to the same check. Dynamic CI expressions, external actions, prose-only instructions and unsupported commands do not provide inventory evidence. Malformed CI produces an incomplete-discovery alert. Discovery never executes a check.
Run phasedrift timing setup after upgrading to enable clean snapshots. A qualifying repeat records a clean Git tree before and after execution, an unchanged exact commit, matching comparison inputs, numeric pass/fail exits, and nonoverlapping runs. At least two eligible runs are required. The rate is repeats disagreeing with the first eligible outcome divided by all repeats. Legacy, dirty, cancelled or incomplete runs remain insufficient. Inspect history for the recorded inputs and provenance.
The session inspector shows Time to first feedback separately for local and explicit CI invocations, using a recorded first edit start and first completed literal verifier with a numeric exit. An incomplete or opaque prefix is labelled Recorded feedback time. Missing edits, completion timestamps, exits or unambiguous order stay Unknown. Remote CI completion is not inferred from local provider calls. Saved change markers annotate timing graphs without claiming causality.
Unconditional native patch and check wrappers stay recognizable when their output formatting uses a conditional. A uniquely owned nested command receipt supplies the check's finish and numeric exit; these intervals remain partial. Multiple, overlapping, contradictory or missing completions stay Unknown. A failed first check still provides feedback, and a later pass does not replace it. Authoritative native command clocks supply the feedback finish when present and consistent; legacy event timestamps remain partial. Literal bun --no-env-file test and bun --no-env-file run checks, plus project-local node_modules/.bin/tsc --noEmit, are recognizable. Arbitrary runtime flags and shell composition remain opaque. Original command and ledger measurements keep their existing definitions.
An explicitly associated workflow receipt can link to the project-owned canonical session actually performing it using PHASEDRIFT_WORKFLOW_SESSION. The tracker validates the session; nearby timestamps never create a link. Eligible linked disagreement appears as a small flaky-check badge. External recorded receipts remain producer assertions. GET /api/health/workflow-timings/inventory exposes the same bounded inventory.