Skip to content

docs(agents): add change scope guidance for agent-authored work - #3

Merged
NoahHendrickson merged 2 commits into
customfrom
claude/frontend-only-guidance-069dc6
Jul 25, 2026
Merged

docs(agents): add change scope guidance for agent-authored work#3
NoahHendrickson merged 2 commits into
customfrom
claude/frontend-only-guidance-069dc6

Conversation

@NoahHendrickson

Copy link
Copy Markdown
Owner

What Changed

Adds a Change Scope section to the top of AGENTS.md (which CLAUDE.md symlinks to), covering how agents should size and bound their changes:

  • Default to the smallest change that satisfies the request
  • No unrequested features, settings, flags, or abstractions
  • Restyling must not alter behavior
  • Reaching apps/server, packages/contracts, or migrations requires explicit intent and confirmation
  • Prefer fixing over rewriting, deleting over adding
  • No mixing unrelated fixes

Why

CONTRIBUTING.md already sets these expectations, but only for human contributors — agents don't read it. AGENTS.md is the file that actually gets loaded into context, so the policy had no effect on agent-authored work.

Framed as scope discipline rather than a literal "frontend only" rule. Real work here does legitimately cross layers (thread snoozing in pingdotgg#4311 touched server, contracts, migrations, and both clients); a hard frontend-only rule would either be ignored or push agents into faking backend-dependent behavior in the UI. Requiring explicit intent before crossing into server/contracts gets the intended outcome without blocking valid full-stack work.

UI Changes

N/A — documentation only.

Checklist

  • This PR is small and focused
  • I explained what changed and why
  • I included before/after screenshots for any UI changes — N/A
  • I included a video for animation/interaction changes — N/A

Follow-up

packages/client-runtime is not currently in the explicit-intent tier. It holds shared client state (thread reducers, commands), so a change framed as "frontend" there shifts behavior on web and mobile simultaneously. Worth deciding whether it belongs alongside server/contracts.

🤖 Generated with Claude Code

Codifies the scope discipline CONTRIBUTING.md already asks of human
contributors, in the file agents actually read. Defaults to the smallest
change, bars unrequested functionality, and requires explicit intent
before a frontend task reaches server, contracts, or migrations.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
@cursor

cursor Bot commented Jul 25, 2026

Copy link
Copy Markdown

Bugbot is not enabled for your account, so this pull request was not reviewed.

Enable Bugbot in the Cursor dashboard to get automatic reviews on future PRs.

@github-actions github-actions Bot added vouch:trusted PR author is trusted by repo permissions or the VOUCHED list. size:XS labels Jul 25, 2026
@NoahHendrickson
NoahHendrickson changed the base branch from main to custom July 25, 2026 20:09
Picks up the ci-runners fork customization. This branch predates it, so its
ci.yml still requests blacksmith-* labels that this fork cannot schedule --
PR #3's jobs sat QUEUED for two hours with no runner assigned.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
@NoahHendrickson
NoahHendrickson merged commit 27bfe90 into custom Jul 25, 2026
10 checks passed
@NoahHendrickson
NoahHendrickson deleted the claude/frontend-only-guidance-069dc6 branch July 25, 2026 21:42
NoahHendrickson added a commit that referenced this pull request Jul 26, 2026
Review finding #3 / handoff doc §6.5: the override ran after
shellEnvironment.installIntoProcess, which shells out and can be slow,
while Chromium spawns helper processes on its own timeline — so an
early helper could capture the default user-data directory before the
fork-owned override landed. Observed at runtime as a GPU helper argv
carrying the default --user-data-dir while the main process used
t3code-fork. Moving the override ahead of the shell-out shrinks the
race window to the in-memory service resolutions.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
NoahHendrickson added a commit that referenced this pull request Jul 28, 2026
…t, named port

Review round 1 (PR #32). The two blocking items and the decided ones:

Guard rewritten so it can actually fail (review #1, #6a). Source
assertions now run against the extracted fork:begin/end hunks and pin the
subscription's input expressions and the derived port — the reviewer's
mutation table (threadId: null, devServerPort = null, = 5173) now fails
the suite, replayed and confirmed. The meta component is asserted on
rendered output (attribute presence/absence, sr-only copy and ordering,
and the `> svg` direct-child contract the stylesheet depends on — wrapping
the icon now fails). CSS is read through cssRules.ts, so a
behaviour-identical declaration swap passes where it used to fail.

Manifest cost paragraph corrected (review #2): upstream's v1 row already
makes this exact per-row subscription unconditionally, so v2 gaining it is
parity, not a new class of cost. The per-environment multiplier (M
environments → M streams, each host polling) is now disclosed instead of
hidden behind "N rows share one stream". The lsof-fallback degradation
(probe failure → terminal: null everywhere → pulse permanently off,
silently) and the 1MiB truncation flicker are recorded as known
limitations next to the external-shell one (review #5).

The port is named, "dev server" dropped (review #3, #4): the row tooltip
now carries `localhost:<port>` (+n overflow), v1's exact copy, and the
accessible text says "Server listening on port N" — what the scanner
actually knows — placed after the branch name so identity precedes
transient state (review #6c).

Slim rows no longer subscribe (Cursor review): the hook input is gated on
variant === "card", so settled/snoozed rows pass null and skip the
subscription instead of retaining the scanner for rows that cannot pulse.

The repaint cost of animating a non-compositing property is now a stated
yes in the stylesheet rather than an accident (review #6d). Globe2Icon
imports as its own fenced statement because the phosphor guard parses
upstream's import braces and a fence inside them reads as a binding.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:XS vouch:trusted PR author is trusted by repo permissions or the VOUCHED list.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant