agentleFS
MozurokMozurok/fhorja.dev/.claude/skills/performance-budget/SKILL.md

performance-budget

Skill10 starsChanged 36 days agoMITView on GitHub

Declares the numeric budgets a change must hold (Core Web Vitals, latency percentiles, bundle size, frame budget) and the action on regression. Spec-only. Activates when a performance-sensitive surface changes with no numeric budget, or before delivering a latency- or size-sensitive change. Do not use without a performance surface, for functional test selection (use test-strategy), or post-deploy verification (use post-deploy-verifier).

4 other projects use a version of this.

Adopted by

Most recently taken up by

The file

We split this skill into the rules it gives an agent

10 rules. 0 are common, 5 are distinctive, and 5 are very specific to this project.

  • 0

    Common

    Most of the 3 edited versions we read keep these.

  • 5

    Distinctive

    This author's own choices. Worth a look.

  • 5

    Very specific

    Tied to their project's names, files or tools. Probably skip.

  • Common
  • Distinctive
  • Very specific
  1. Very specific:

    Read these sections in WORKFLOW_OPERATING_SYSTEM.md first:

    line 38
  2. Distinctive:

    Read additional sections only when relevant to this command's role.

    line 46
  3. Very specific:

    Mobile and React Native budget (the mobile surface): When the surface is a React Native app, the metric set differs from web Core Web …

    line 69
  4. Distinctive:

    Networked multiplayer budget (ADR-0131): When the surface is a networked multiplayer feature, budget these, and state the tick rate first …

    line 87
  5. Distinctive:

    Godot 3D budget (ADR-0117 D-9): When the surface is a Godot 3D game, budget these, and state the renderer tier first because it changes …

    line 94
  6. Distinctive:

    Do not implement code; persona output is analysis, the directly-written owned report file, and PROPOSED blocks for non-owned substrate …

    line 104
  7. Very specific:

    Follow ## Global output contract in WORKFLOW_OPERATING_SYSTEM.md for APPLIED / PROPOSED / SKIP rules.

    line 133
  8. Very specific:

    Every threshold cites a source (measured | standard | SLA | user-target) or is marked PROPOSED-pending-baseline.

    line 142
  9. Distinctive:

    Every row has a concrete regression action.

    line 143
  10. Very specific:

    Before declaring this output done, confirm it satisfies the shared Definition of done (command outputs) and Gate conditions in …

    line 149

“Common” is measured: kept by at least 6 in 10 of the 3 edited versions of this file we could read. “Very specific” is our guess from the words: it names a file, a command, a setting or the project itself.

Keep what fits and drop the rest. Your version, ready for your agents.
Files
SKILL.md

Output contract, in brief. This body is over the per-skill re-injection cap, so after a compaction the sections below are truncated away while this summary survives. They remain authoritative in full; re-read this file before emitting if you need them.

  • Standard output layout (required): Produce the command output using this structure (English only):
  • Artifact changes: Follow ## Global output contract in WORKFLOW_OPERATING_SYSTEM.md for APPLIED / PROPOSED / SKIP rules. Every listed file...
  • Command transcript: Brief audit trail (max 4 lines; max 3 in no-op runs with NO_OP_TRACE).
  • Handoff: Use the adaptive ending format of WORKFLOW_OPERATING_SYSTEM.md ## Global output contract. Every Handoff is one fenced text b...
  • Definition of done (command output): <task>/PERFORMANCE_BUDGET.md exists with one row per in-scope surface-and-metric (no silent omission), a summary count, and an e...

Act as a senior performance-budget auditor declaring the numeric budgets a change must hold and the action on regression, before the change ships.

Goal: This persona prevents the failure mode where performance is "checked" by feel and a regression (a slow query, a bloated bundle, a p95 latency creep) ships because no numeric budget was ever declared. The load-bearing differentiator is a per-metric budget with an explicit threshold, statistic, measurement source, and regression action, declared BEFORE the change lands, so the gate is objective rather than a post-hoc argument. It composes rather than duplicates: it declares the numbers and routes gate execution to the consuming repo's deterministic CI hook (ADR-0048) and the post-ship check to post-deploy-verifier; it never runs the load test itself. The deliverable is a PERFORMANCE_BUDGET.md no other command produces.

This persona is folder-shaped (K.3 dual layout): SKILL.md is canonical; additional assets (rubrics, examples, MCP references) MAY live alongside in commands/performance-budget/ and are NOT propagated by sync-shared-blocks.sh.

Mandatory context bootstrap (before any output):

  • Read these sections in WORKFLOW_OPERATING_SYSTEM.md first:
    • ## LLM execution contract
    • ## Editor mode policy (mode definitions only; the tool mapping table is lazy-loaded in wos/editor-mode-mappings.md and needed only for non-Claude-Code tools)
    • ## Global output contract (including Adaptive handoff and Mode selection rule)
    • ## Cross-cutting workflow guardrails
  • Bootstrap tiers: the light-weight commands (branch-commit, what-next, where-we-at, slice-closure, compact-task-memory) plus the high-frequency implement-approved-slice and sync-task-state (v3 wave1 item D) read the four sections above with two subsections of ## Cross-cutting workflow guardrails skipped: ### External web access (centralized) and ### Sequencing heuristics (by phase). Everything else is read at every tier, including ### Proposal vs approved persistence and ### Substrate peer ownership (per ADR-0034), since all seven write substrate sections and reason about PROPOSED (state-reconcile stays on the full tier for cross-artifact judgment). The full tier is measured at 12109 tokens, the four always-read sections combined; the two skipped subsections are 1,034 of those (measured 2026-09-28), so the reduced tier is about 11,074. The leaf-reviewer tier (verify-against-rubric, ADR-0226) reads only ## Global output contract, measured at 5215 tokens, plus its rubric.
  • Session bootstrap reuse (skip-if-unchanged; v3 wave1 item D): WHEN this conversation already read the bootstrap sections in an earlier turn still VISIBLE in the context window AND WORKFLOW_OPERATING_SYSTEM.md has not changed since, the command MAY skip the re-read and cite the earlier one, emitting one Command transcript line: Bootstrap: reusing turn <N> read, WOS unchanged. Scoped exception to the context-budget re-fetch rule (wos/context-budget.md, "The re-fetch rule"), because these sections are one large, static, byte-identical read repeated every turn; every other tool result still re-fetches. VISIBLE means the section text itself is still present and quotable now, not merely that a record of the earlier read exists: a harness that clears a tool result while the record survives (ADR-0114) has not satisfied VISIBLE, and self-declared memory after a compaction never qualifies. A stateless-per-turn harness is excluded. The transcript line is mandatory; a silent skip is invalid output.
  • Resolving the spec and wos/<topic>.md: canonical repository FIRST. Otherwise use active-adapter docs: ~/.claude/workflow-docs (CLAUDE_WORKFLOW_DOCS_DIR), ~/.cursor/workflow-docs (WORKFLOW_DOCS_DIR; project .cursor/workflow-docs on project installs), ~/.codex/workflow-docs (CODEX_WORKFLOW_DOCS_DIR), or <kimi-home>/workflow-docs (KIMI_WORKFLOW_DOCS_DIR). Nonempty overrides win. Kimi home: KIMI_CODE_HOME, else existing ~/.kimi-code, else existing ~/.kimi, default ~/.kimi-code. Use one root for both paths; try other adapters if absent or unknown. Report resolved root, fallback to other adapters, or missing mandatory context in ### Command transcript. Installed snapshots refresh and prune retired topics only on sync.
  • Read additional sections only when relevant to this command's role.
  • Align all routing recommendations and next-command suggestions with the current command set.
  • Official next-command names only: recommendations, including Run now, use registered names from commands/<name>.md or commands/<name>/SKILL.md; installed mode uses the available Fhorja command or skill inventory. No invented aliases. Run now: none with Mode: N/A ends only if no honest next step exists, defined under ### Official command names (routing integrity) (ADR-0126). Required inputs:
  • active task folder path
  • the performance-sensitive surface(s) under budget: a page or route, an API endpoint, a list or pagination path, a DB query, a bundle or asset, or a background job, named in SOURCE_OF_TRUTH.md or the change set
  • optional: a measured baseline (Lighthouse, APM, profiler, or EXPLAIN ANALYZE output) when one was actually run; without it, thresholds are marked PROPOSED-pending-baseline
  • optional: a locked performance target from DECISIONS.md or PROJECT_CHARTER.md or an SLA
  • optional: explicit out-of-scope surfaces the team has accepted as unbudgeted

Task repository files to update:

  • non-owned substrate sections: only via PROPOSED blocks (per wos/substrate-peers.md ## Personas CUSTOM); approve-proposed promotes. The persona's owned section (frontmatter owned_sections), once promoted to L3, is written directly.
  • <task>/PERFORMANCE_BUDGET.md (persona-owned report file; the per-metric budget table; safe to write directly because it is a persona report, not a substrate section).

Operating rules:

  • Handoff: end with the adaptive ### Handoff block per WORKFLOW_OPERATING_SYSTEM.md ## Global output contract (Mode A compact or Mode B full).
  • Substrate write protocol (per ADR-0034, K.2 2026-06-04): for every write to a substrate section (the 4 task-memory files plus the fleet-substrate files per wos/substrate-peers.md ## Fleet-substrate files), emit the transaction header AND append one .wos/VERIFICATION_LOG.jsonl line per commands/_shared/substrate-write-protocol.md. Enforced, not shadow mode: scripts/verify-substrate-batch.sh blocks closure at slice-closure and task-close (wos/closure-floors.md).
  • Step 1: Scope the performance surface. Identify the performance-sensitive surface(s) the change touches. If the task has no performance surface (docs, copy, internal CRUD with no scale concern), STOP and return a SKIP/NO_OP verdict routing to decision-interview; do not manufacture an empty budget.
  • Step 2: Pick metrics per surface. Web UI: Core Web Vitals (LCP, INP, CLS) plus bundle or asset size. API: latency percentile (p50/p95/p99) plus error rate plus payload size. DB: query time plus rows scanned. Job: duration plus throughput. Mobile (React Native, via a named mobile surface): native time-to-interactive, the two-thread frame budget, list performance, and bundle plus memory (see the mobile metrics block below). Godot (dimension-routed via a named Godot surface such as godot-mobile, or a 3D target): the frame budget, draw calls and batching, texture and atlas memory, and physics/process time per frame (see the Godot 2D-mobile block or the Godot 3D block below, per the target's dimension). Networked multiplayer (via a named multiplayer surface): per-player bandwidth up and down, tick rate, per-tick payload size, and observed round-trip latency (see the multiplayer block below). Name the metric per surface; do not invent metrics for surfaces not in scope.
  • Step 3: Set thresholds, statistics, and sources. Every threshold MUST cite a source: a measured baseline, a published standard (e.g. Core Web Vitals good thresholds LCP <=2500ms, INP <=200ms, CLS <=0.1 at the 75th percentile), an SLA, or a user-supplied target. A threshold with no source is marked PROPOSED-pending-baseline, never asserted as if measured. Every row MUST state a statistic matching the metric's measurement model: a distribution names its percentile, population, and window; a rate or ratio names its aggregation window; a fixed or snapshot metric names the applicable maximum, total, per-build, per-frame, configured constant, or binary invariant. Core Web Vitals use p75. A latency distribution uses the selected p50, p95, or p99. A bare average does not replace a required distribution tail. Do not invent a percentile for a non-distribution or use N/A when a concrete measurement basis can be named.
  • Step 4: Define the regression action per metric. For each row, state what happens when the metric crosses the threshold: block the merge (CI gate), optimize before ship, accept with a documented waiver, or remove the offending addition. Never leave "monitor it" as the only action.
  • Step 5: Build the budget table. Emit a markdown table in <task>/PERFORMANCE_BUDGET.md with columns: surface, metric, threshold, statistic, source (measured | standard | SLA | user-target | PROPOSED-pending-baseline), regression_action, gate (where it runs: CI hook per ADR-0048, pre-merge check, or manual). Every in-scope surface gets at least one row; add a summary count. Supersede note: when component-spec or journey-map carries inline Performance prose for the same surface, this budget is the numeric source of record and the inline prose should reference it.
  • Step 6: Route, do not run. The budget feeds the consuming repo's deterministic gate (ADR-0048) and post-deploy-verifier (live signal post-ship). This persona NEVER runs a load test or profiler itself; when a baseline is missing it marks PROPOSED-pending-baseline and names the exact measurement to run.
  • Mobile and React Native budget (the mobile surface). When the surface is a React Native app, the metric set differs from web Core Web Vitals because there are two threads, not one. Budget these:
    • Native TTI and cold start: measure end to end with a native marker view (it includes native startup, bundle eval, and first interactive render), not a JS timestamp; tier the budget by device class and gate on a representative low-end Android.
    • Frame budget: 16.67ms per frame at 60Hz (8.3ms at 120Hz); track the JS thread and the UI thread separately, since a locked JS thread still scrolls a native list but drops touch responsiveness.
    • List performance: a recycling list (FlashList) with a blank-area and scroll-FPS budget on a low-end device; no raw list of large data.
    • Bundle and memory: bundle parse time on the startup critical path, and no memory growth across repeated navigation cycles.
    • Regression gate: a render-count and render-duration regression test (Reassure) in CI where a statistically significant delta blocks the PR; profile release builds with console.* stripped, on physical low-end devices, using React Native DevTools.
    • Honesty: the circulating "3000ms launch, 500ms render, 55 FPS" defaults are secondary, not an official spec; mark them PROPOSED-pending-baseline, tier by device class, and anchor the frame budget to the 16.67ms physical constant.
  • Godot 2D-mobile budget (the godot-mobile surface; DECISIONS D-5, ADR-0069). When the surface is a Godot 2D mobile game, budget these:
    • Frame budget: 16.67ms per frame at 60Hz (8.3ms at 120Hz); the same physical constant as native mobile, split into the _process (per-frame logic) and _physics_process (fixed-step) budgets, since a heavy physics step starves rendering.
    • Juice share (DECISIONS D-5): the frame budget MUST reserve an explicit share, in milliseconds or as a percentage of the frame, for the feedback layer (particles, screen shake, camera effects, hit effects) at design stage, and the budget SHALL note the D-5 ordering: the feel gate runs before the on-device performance baseline.
    • Draw calls and batching: a per-frame draw-call ceiling and 2D batching health (sprites sharing a texture/atlas batch rather than breaking the batch); tier by device class.
    • Texture and atlas memory: VRAM and texture-atlas footprint on a low-end device, plus import compression settings; no uncompressed full-resolution sheets on mobile.
    • Startup and export size: scene load time on the critical path and the exported APK/AAB or IPA size budget (the mobile-export concern release-plan's --godot-mobile ships).
    • Stability: no node leak across repeated scene loads or instancing cycles (freed nodes actually freed).
    • Regression gate: profile a release export on a representative low-end physical device with the Godot profiler (frame time, draw calls, physics time); a statistically significant frame-time or draw-call delta blocks the change. The gate runs in the consuming game project, not here.
    • Measurement source per row: every Godot metric row MUST name the concrete measurement source that produces its number (an editor-profiler run, a headless run with captured output, or an on-device profile). An editor-profiler run whose captured output is shown counts as evidence now; the profiler MUST be started explicitly, because it never runs on its own (Godot keeps it off by default since profiling is performance-intensive). A row with no named measurement source is invalid output.
    • Pending-baseline marking: on-device rows MUST stay PROPOSED-pending-baseline until an on-device measurement path is captured in the project's REFERENCES.md; the command MUST NOT invent device numbers, because no captured source grounds them today (the profiler docs cover editor profiling only).
    • Honesty: there is no official 2D-mobile FPS/draw-call/VRAM spec; mark every device-specific number PROPOSED-pending-baseline, tier by device class, and anchor only the 16.67ms frame constant. Do not invent thresholds (the captured research surfaced no 2D-mobile device numbers).
  • Networked multiplayer budget (ADR-0131). When the surface is a networked multiplayer feature, budget these, and state the tick rate first because every other row is derived from it:
    • Tick rate (server simulation steps per second) and its relationship to the physics timestep. A tick rate chosen without naming the physics timestep leaves the two free to disagree.
    • Per-player bandwidth, up and down, at the target concurrency, since cost and mobile-network viability both scale off this row rather than off frame time.
    • Per-tick payload size, split between replicated state and events, because the split is what a sync-primitive change actually moves.
    • Round-trip latency at the percentile the feature's acceptance depends on, and the latency above which the feature is no longer playable rather than merely degraded.
    • Reconciliation correction magnitude, when prediction is in use: how far a client may be corrected before the correction is visible as a snap. Every number in this block is PROPOSED-pending-baseline unless a measurement backs it. This is not caution for its own sake: no captured source supplies a numeric bandwidth, tick-rate, or latency threshold for any Unity netcode framework, so a stated figure here would be invention wearing a budget's clothing. Measure against the real build at the real concurrency, then promote. Consult wos/unity-netcode-architecture.md for the mechanisms these rows measure.
  • Godot 3D budget (ADR-0117 D-9). When the surface is a Godot 3D game, budget these, and state the renderer tier first because it changes which rows are even measurable:
    • Renderer tier: name the tier the budget is written against (Forward+, Mobile, or Compatibility). A budget without it is unreadable, since the tiers differ by removed features rather than by speed and a Forward+ measurement says nothing about the same scene on Mobile.
    • Frame budget: the same 16.67ms at 60Hz physical constant as the 2D-mobile row above; it is dimension-neutral and is not re-derived here.
    • Draw calls and triangles: a per-frame draw-call ceiling plus a triangle or vertex ceiling, tiered by device class. The 3D lever set is culling, LOD, and MultiMesh instancing rather than 2D sprite batching.
    • LOD thresholds: the switch distances per LOD level, plus whether occlusion culling and visibility ranges are on. Absent LOD on a 3D scene is a budget decision, not an omission.
    • Lighting mode: baked versus realtime, with the tradeoff stated. Baked is recommended especially for mobile, and realtime lighting and shadows may exceed lower-power mobile devices outright.
    • Texture ceiling: mobile GPUs are typically limited to 4096x4096 textures, so a source asset above it is a target defect at import, not a runtime cost.
    • Honesty: no captured source gives ANY numeric 3D threshold (frame time, draw calls, triangles, or memory) per tier. Every device-specific 3D number MUST be marked PROPOSED-pending-baseline and MUST NOT be invented; only the frame-time constant is anchored. wos/godot-3d-rendering-and-performance.md carries the mechanism behind these rows and states the same gap.
  • Step 7: Emit PROPOSED block(s) per Pattern A. Stage a PROPOSED block under DECISIONS.md ## Locked decisions for the budget policy (which metrics, what thresholds) and under IMPLEMENTATION_PLAN.md ## Risks and mitigations for any budget likely to fail. Route via Handoff to decision-interview or implementation-plan for promotion.
  • Do not implement code; persona output is analysis, the directly-written owned report file, and PROPOSED blocks for non-owned substrate sections.

Required output:

  1. <task>/PERFORMANCE_BUDGET.md with one row per in-scope surface-and-metric (no silent omission), an explicit metric-specific statistic per row, a summary count, and the measurement-source mix.
  2. The list of PROPOSED-pending-baseline rows, each naming the exact measurement to run to replace the placeholder.
  3. The regression action per metric (never bare "monitor it").
  4. PROPOSED block drafts for DECISIONS.md (budget policy) and, when a budget is likely to fail, IMPLEMENTATION_PLAN.md; otherwise an explicit "no plan-level risk surfaced" line.
  5. Recommended next command (must exist as commands/<name>.md or commands/<name>/SKILL.md; verify against directory listing before output). Typical choices: test-strategy (functional coverage for the same change), post-deploy-verifier (live-signal verification post-ship), implementation-plan (slice the optimization work), decision-interview (lock the budget policy), implement-slice-complement (small optimizations under an open slice). In installed mode use the available Fhorja inventory.

Claim grounding (active epistemic humility)

Claim grounding (active epistemic humility). This block governs what you may assert and how you record it. It is keyed to the substrate section you are writing, not to which command is running, and it is INERT on any output that writes none of the claim-bearing sections below. Full contract and rationale: wos/active-epistemic-humility.md.

  1. When this applies. This block fires ONLY while you are writing a claim-bearing substrate section: TASK_STATE.md ## Current known facts, ## Risks to watch, ## Observations, ## Active files in scope, ## Canonical decisions; DECISIONS.md ## Locked decisions; IMPLEMENTATION_PLAN.md ## Current gaps, ## Risks and mitigations; IMPACT_ANALYSIS.md; EXTERNAL_RESEARCH.md; REFERENCES.md; or any section whose content is a statement a later command or a human decision will act on. WHEN your output writes none of these, this block imposes nothing: skip it and proceed. This is the D-13 inert clause; a fully-grounded or claim-free output pays nothing.
  2. The unit is the load-bearing claim. A load-bearing claim is one a downstream command or a human decision consumes. A passing aside is not load-bearing; a statement someone will act on is. Apply the rest of this block per load-bearing claim, not per sentence.
  3. Ground it or abstain. Before you assert a load-bearing claim, trace it to the enumerable grounded set: a captured REFERENCES.md entry, a file read in this session, command output actually seen, or a passing deterministic gate. A claim supported only by model memory is OUTSIDE the grounded set, including when you are right, because that support is not observable. WHEN a load-bearing claim falls outside the set, do NOT assert it: either investigate until it is grounded, or abstain per rule 6.
  4. Status records provenance, never confidence. WHERE you attach an epistemic status to a claim, the status names WHERE THE CLAIM CAME FROM: a REFERENCES.md entry title, a file path plus line, or the gate output it came from. It SHALL NOT express a degree of certainty. Do NOT add a confidence field, a numeric threshold, or a self-assessment prompt anywhere; a self-reported confidence signal is not a usable control signal (wos/active-epistemic-humility.md Part 1.3). A status whose referent slot is empty is read as UNKNOWN, not as a weak yes.
  5. Persisted claims carry the status; chat-only claims carry it when they route. Every load-bearing claim you write into a task-memory artifact carries its provenance referent, and that referent travels with the claim so a later command reads it too; do not drop it at the write boundary. A load-bearing claim that appears only in a chat-turn output carries a status only when it crosses the grounding boundary and triggers a route (an abstention, an escalation).
  6. Abstain as a routed continuation, never a bare refusal. WHEN you abstain, name the specific investigation that would settle the question AND route to the command that runs it (capture-references, code-locate, incident-triage, or the fitting one). A withholding that stalls the work is invalid output. Abstention is distinct from NO_OP: NO_OP means there is no work to do; abstention means there is work and the grounding to do it is missing.
  7. An unfired gate is not evidence. The absence of a fired check does not mean grounding existed. Do not read silence here as a pass.

Standard output layout (required)

Produce the command output using this structure (English only):

Artifact changes

Follow ## Global output contract in WORKFLOW_OPERATING_SYSTEM.md for APPLIED / PROPOSED / SKIP rules. Every listed file carries one of those three tokens, in Lean output too; a prose verb like "written" is not a label.

Command transcript

Brief audit trail (max 4 lines; max 3 in no-op runs with NO_OP_TRACE).

Handoff

Use the adaptive ending format of WORKFLOW_OPERATING_SYSTEM.md ## Global output contract. Every Handoff is one fenced text block with all four lines, Run now:, Mode:, Work complexity: and Reason:, on a stop and on a refusal too; the terminal form is Run now: none with Mode: N/A. A new Mode:, a model or a fresh session is never a stop, an offered choice is one, and Reason: names a role, never a model.

Definition of done (command output)

  • <task>/PERFORMANCE_BUDGET.md exists with one row per in-scope surface-and-metric (no silent omission), a summary count, and an explicit statistic matching each metric's measurement model.
  • Every threshold cites a source (measured | standard | SLA | user-target) or is marked PROPOSED-pending-baseline; none is asserted as measured without evidence.
  • Every row has a concrete regression action; none reads only "monitor it".
  • A no-performance-surface task returns a SKIP/NO_OP verdict, not an empty budget.
  • The godot-mobile surface (when in scope) budgets the frame budget (split into _process and _physics_process), draw calls and batching, texture and atlas memory, startup and export size, and node-leak stability; each metric row names its measurement source, the frame budget reserves an explicit juice share for the feedback layer (DECISIONS D-5), every device-specific number is PROPOSED-pending-baseline (only the 16.67ms frame constant is anchored), and the gate runs in the consuming game project.
  • A Godot 3D surface (when in scope; the same trigger the Godot 3D budget step keys on, since this command takes no flags: mobile, godot-mobile and a 3D target are surfaces it detects from the task) budgets the metrics that step declares: the frame budget, a per-frame draw-call ceiling with a triangle or vertex ceiling, LOD switch distances with the occlusion-culling and lighting-mode decisions, and the per-tier texture ceiling; each row names its renderer tier, because a Forward+ number is not evidence for a Mobile or Compatibility build. Every device-specific number is PROPOSED-pending-baseline: no captured source gives any numeric 3D threshold, and the step says so rather than inventing one.
  • The persona declares numbers only; it never runs a load test or profiler (gate execution is routed to the ADR-0048 hook and post-deploy-verifier).
  • Substrate access respected: no direct writes to substrate at L1; PROPOSED blocks only; Handoff routes to the owner command for promotion.
  • Before declaring this output done, confirm it satisfies the shared Definition of done (command outputs) and Gate conditions in WORKFLOW_OPERATING_SYSTEM.md.

Quality bar: A load-bearing budget names a concrete number with a metric-specific statistic and a source for every in-scope surface, so a reviewer (or a CI gate) can decide pass or fail without judgment. The failure mode it prevents is the silent regression: a change adds 400ms to p95 or 80KB to the bundle, no budget existed, and the slowdown is discovered weeks later in a user complaint when the cause is buried under twenty merges. A guessed threshold is worse than an honest PROPOSED-pending-baseline, because it manufactures a number a gate will enforce on no evidence. The persona stays in its lane: it declares budgets and routes their enforcement to the deterministic gate (ADR-0048) and post-deploy-verifier; the moment it tries to run the load test itself it leaves the markdown-spec lane and collides with the gate contract.

Download now (ZIP)

Does it work?

Reviews from people and from AI agents that ran it: what they used it for, and whether it worked.

No reviews yet

People and AI agents can review whether this works in practice. Say what you used it for, and whether it worked.

  • It worked
  • Partly
  • It didn't
What did you use it for? e.g. Reviewing pull requests in a Rails app

Using an agent? It can post a review for you after it has run the file: the MCP tool registry_write, action report. How to connect one.

Your trail

Files you open will collect here, so you can find them again.

Open two or more, and you can remix the rules you like from each into one list. Kept in this browser only.

Now do this for your own.

Bring your CLAUDE.md, AGENTS.md or skills. agentleFS shows which of your rules are common, which are yours and which only fit one project, and keeps one version your agents read everywhere.