PlanWright
Code Signals

Platform

Code Signals

Code Signals are automatic, per-diff indicators — blast radius, a risk heatmap, and dependency expansion — that tell you how big and how risky an agent's change is before you read a single line of the diff.

They require no setup and no extra agent tool call. They're computed the moment an agent calls planwright_record_diff, from diff content the audit chain already captures.

What Code Signals are

Concept

Three automatic, per-diff signals that answer the reviewer's first question — how big and how risky is this change — before you open a single file.

Every agent run that calls planwright_record_diff gets its diff parsed into three signals: blast radius (size and shape of the change), a risk heatmap (does it touch sensitive paths), and dependency expansion (did it pull in a new third-party package). Nothing to configure and no extra tool call for the agent to make — the signals are derived from diff content the audit chain already captures.

Blast radius

Signal

Files changed, lines added/deleted, and whether the diff touches schema or a public API.

Four numbers and two flags, computed from the unified diff: files changed, +added/-deleted line counts, whether any touched path matches a migration or schema pattern ("schema: yes/no"), and whether any touched path matches an API pattern ("public API: yes/no"). A five-file, thirty-line docs change and a two-file, four-hundred-line migration both request acceptance the same way — blast radius is what tells them apart at a glance, before you open the diff.

Risk heatmap

Signal

A high/medium/low badge, with reasons, based on whether the diff touches sensitive paths.

The badge only appears when risk is above low — a clean diff shows no badge at all, not a green "low" pill. High-risk paths (auth, billing, payments, migrations, API) turn the badge red; medium-risk paths (a bare schema.ts) turn it amber. The reasons list names which pattern matched, e.g. "high risk · auth, api". A generic default pattern set (auth/billing/payments/migrations/schema/api) is always on, so the signal works from day one with zero setup.

A project can extend the defaults with its own sensitive-path patterns via a risk-patterns.json context file — Planwright proposes one automatically from prior agent-run diffs through the existing doc-suggestion queue, and a human reviews and publishes it like any other context file. The executing agent never supplies its own pattern list.

Dependency expansion

Signal

Flags any brand-new third-party package introduced by the diff.

If a diff adds an import or require for a package not already in package.json, it shows up as "New dependency: X" (or "New dependencies: X, Y" for more than one) directly under the blast radius row. This is the highest-signal line of the three — a new npm package landing in the middle of an unrelated objective is exactly the moment a reviewer should stop and ask why.

Where signals appear

Placement

The same panel renders in the review drawer and inline on every agent run — including while it's still in progress.

Review drawer

Opens when an objective reaches the acceptance or done lane. Signals sit alongside the acceptance-criteria checklist so you can weigh size and risk while you're deciding accept or reject.

Objective detail page

Each agent-run card shows its own signals inline, above the diff/test-result download links — visible the moment record_diff runs, even while the objective is still in_progress. No need to wait for a review to get a sense of what changed.

Agent runs recorded before this feature shipped simply show nothing — not a broken panel or a zero-state placeholder.

Not yet available

Roadmap

Complexity delta is planned but not implemented — the panel omits it silently.

The original scope for Code Signals included a fourth signal, complexity delta, meant to compute asynchronously via a background worker. It hasn't shipped yet. The panel is built to omit any signal that isn't present rather than show a loading spinner or placeholder, so nothing changes in the UI you see today — the row will simply appear once that signal exists.