mirror of
https://github.com/paperclipai/paperclip.git
synced 2026-11-04 11:01:16 +01:00
docs(skills): add standalone test-audit workflow (#16211)
## Thinking Path > - Paperclip is the open source app people use to manage AI agents for work. > - Repository skills guide agents through engineering work. > - Test gardening must preserve useful regression coverage while reducing repeated work. > - Contributors need a local procedure for evidence, validation, and delivery. > - This pull request adds a standalone test-audit skill with a short entry point and focused guides. > - The procedure supports focused cleanups and coordinated audits without requiring an external skill checkout. ## Linked Issues or Issue Description **Issue type** Missing documentation. **Where is the issue?** The repository has no standalone `.agents/skills/test-audit/` procedure on master. **What's wrong?** Test audits need consistent rules for retaining contracts, proving removal safety, recording cost evidence, and tracking stacked delivery. **Suggested fix** Add a self-contained skill with candidate evidence, validation, campaign, and Paperclip delivery guides. Preserve upstream attribution. Related audit work: Refs #15978, Refs #16022, Refs #16197. The duplicate search found no standalone skill PR. This docs change does not duplicate planned core features in ROADMAP.md. ## What Changed - Add a short test-audit entry point and agent metadata. - Require contract and keeper evidence before removing tests. Apply an authoring gate to added or changed tests. - Define targeted and exhaustive campaign modes, a second review of redundant layers, and full keeper dependency checks. - Document matched baselines, intended-failure controls, selection checks, honest cost claims, and current-head delivery gates. - Add Paperclip commands and invariants. Retain OpenClaw attribution and its MIT notice. ## Verification - The skill frontmatter validator passed with cached PyYAML. - Agent metadata YAML parsed. The default prompt names `$test-audit`. - All eight relative Markdown links resolve. All seven delivery files matched the reviewed source. - `git diff --check` passed. The PR contains only seven Markdown/YAML skill files. - An independent scenario review checked the campaign completion and coverage rules. - Local application typecheck, full Vitest, and build were not run for this documentation-only change. Fresh current-head CI passed: 55 successful checks and two expected skips on `1a9af8ffacd532882f0a01bac8ab3f5063ab9cd9`. - E2E shard 8/8 was interrupted after its assertions passed. A single same-head job retry passed. The interruption cause was not exposed. - Greptile reviewed the current head at 5/5 with no actionable findings. There are no review threads. The PR has no merge conflicts and remains open as requested. ## Risks - Low runtime risk. This PR changes contributor instructions only. - Agents can misapply audit evidence. The skill requires valid keepers and preservation proof, rejects keeper cycles, and makes incomplete audits explicit. - CI routing can change. The guide requires readers to inspect current repository files. > For core feature work, check [`ROADMAP.md`](ROADMAP.md) first and discuss it in `#dev` before opening the PR. Feature PRs that overlap with planned core work may need to be redirected — check the roadmap first. See `CONTRIBUTING.md`. ## Model Used OpenAI Codex based on GPT-6 wrote and tightened the skill. Its exact deployment model ID and context-window size are unavailable. Independent scenario review and PR delivery used OpenAI `gpt-6.1-sol`, with reasoning, repository inspection, and tool execution. The context-window size was not exposed. ## Checklist - [x] I have included a thinking path that traces from project context to this change - [x] I have specified the model used (with version and capability details) - [x] I have checked ROADMAP.md and confirmed this PR does not duplicate planned core work - [x] I have searched GitHub for duplicate or related PRs and linked them above - [x] I have either (a) linked existing issues with `Fixes: #` / `Closes #` / `Refs #` OR (b) described the issue in-PR following the relevant issue template - [x] I have not referenced internal/instance-local Paperclip issues or links (only public GitHub `#NNN` / `github.com/paperclipai/paperclip` URLs) - [x] My branch name describes the change (e.g. `docs/...`, `fix/...`) and contains no internal Paperclip ticket id or instance-derived details - [x] I have run tests locally and they pass - [x] I have added or updated tests where applicable - [x] I have updated relevant documentation to reflect my changes - [x] I have considered and documented any risks above - [x] All Paperclip CI gates are green - [x] Greptile is 5/5 with no open P2s, recommendations, or follow-ups - [x] I will address all Greptile and reviewer comments before requesting merge Co-authored-by: Paperclip <noreply@paperclip.ing>
This commit is contained in:
1 parent
db65a0863e
commit
393d1c4108
7 files changed
+444
No files matched your search
@@ -0,0 +1,98 @@
|
||||
# Coordinating a test-gardening campaign
|
||||
|
||||
Use this guide for a broad sweep or multiple PRs. Apply the decision and
|
||||
preservation rules in [SKILL.md](SKILL.md) to every batch.
|
||||
|
||||
## 1. Define the audit boundary
|
||||
|
||||
From the request, establish scope, desired benefit, time budget, target branch,
|
||||
and delivery authority. Pin the base revision and inspect CI routing and cost
|
||||
data, including setup/import overhead. Choose one mode:
|
||||
|
||||
- **Targeted sweep:** investigate promising owners or expensive repeated work.
|
||||
Report the examined area and exclusions; do not claim subsystem completeness.
|
||||
- **Exhaustive audit:** inventory every in-scope test file and scenario, including
|
||||
colocated, shared-package, browser, and dedicated-lane coverage. Assign each to
|
||||
one owner and record its baseline as passed, failed, blocked, or unrun.
|
||||
|
||||
For an exhaustive claim, every declaration needs a decision and evidence;
|
||||
classify table rows separately when their contracts differ. Missing baseline
|
||||
results or unread tests leave the audit partial. Existing matching-revision CI
|
||||
can supply results; a targeted sweep does not require a full-repository census.
|
||||
Reserve time for preservation checks and reporting; an unfinished validation
|
||||
leaves an unvalidated local patch, not a PR-ready result.
|
||||
|
||||
## 2. Assign owners and record decisions
|
||||
|
||||
Split work by protected production behavior, including tests across directories.
|
||||
When delegation is authorized, assign each worker an isolated checkout, owner,
|
||||
prior findings, model if specified, and discovery/edit/publication authority.
|
||||
Tell workers to preserve others' changes. One coordinator owns shared fixtures,
|
||||
routing, and integration. Do not edit a checkout with active test runs.
|
||||
|
||||
Keep one ledger: candidate, contract, retain/repair/consolidate/delete/defer,
|
||||
reason, keeper, baseline, validation, and branch/PR status. Record reviewed areas
|
||||
with no safe removals too. Discovery stays read-only until ownership is clear;
|
||||
qualified edits need no additional user-approval round within existing authority.
|
||||
|
||||
## 3. Plan removal of redundant layers
|
||||
|
||||
Before editing a broad batch, review the ledger a second time by contract and
|
||||
boundary. Look for suites that replay the same behavior through wrappers,
|
||||
mocked collaborators, or provider-specific copies of a shared implementation.
|
||||
Individual cases can look reasonable while the entire layer is redundant.
|
||||
|
||||
Produce a compact layer plan: retired suites, retained owner per contract,
|
||||
unique assertions to transfer, affected routing/commands, validation controls,
|
||||
and any unused fixtures or production seams. Prefer a boundary that reaches
|
||||
the responsible code; preserve distinct transport, lifecycle, and permission
|
||||
risks. If no whole layer qualifies, record that and proceed with justified
|
||||
case-level changes. Large deletions are not a requirement.
|
||||
|
||||
The coordinator reconciles keeper dependencies across all batches before
|
||||
cutover. Follow each chain to surviving proof; reject cycles and recheck keepers
|
||||
another batch modifies or excludes from routing. A batch is ready when every
|
||||
retired contract has retained proof or retirement evidence. Production-seam
|
||||
removal still needs separate caller evidence.
|
||||
|
||||
## 4. Cut over and verify preservation
|
||||
|
||||
Move unique assertions first, apply one coherent batch, and update selection
|
||||
and ownership references. Follow [validation.md](references/validation.md) for
|
||||
baselines, controls, restoration, and cost claims. Serialize heavy database or
|
||||
process runs when host capacity is shared; clean up only owned resources.
|
||||
|
||||
Review the combined diff against the layer plan. For broad or consequential
|
||||
batches, use independent preservation review when delegation is available and
|
||||
authorized; otherwise disclose that limitation. Resolve each finding with
|
||||
source evidence or restored coverage and validate repaired assertions with an
|
||||
intended-failure control. No batch is complete with an unresolved coverage gap.
|
||||
|
||||
An exhaustive audit requires a decision for every declaration, a completed and
|
||||
classified baseline for every file, and passing preservation proof for each
|
||||
removal. Diagnosed pre-existing defects may remain as explicit follow-ups;
|
||||
unresolved setup failures or unread tests leave the audit partial. If time
|
||||
expires first, report the remaining inventory and validation status.
|
||||
|
||||
## 5. Deliver and integrate
|
||||
|
||||
Prefer a few coherent PRs to one PR per trivial deletion. For a stack, record
|
||||
each PR's head SHA, base branch/SHA, unique diff, and intended final target.
|
||||
After a parent is squash-merged, discover its actual merge SHA and replay only
|
||||
the child's unique change if necessary. Inspect the resulting PR diff for
|
||||
accidentally reintroduced parent commits or files.
|
||||
|
||||
Resolve integration conflicts by reading new contracts on the target branch.
|
||||
If a deleted file gained a regression, preserve that regression at an appropriate
|
||||
owner; do not blindly accept the deletion or restore the entire old suite.
|
||||
|
||||
For authorized merges, use checks and reviews tied to the current PR head,
|
||||
inspect unresolved findings, and respect the repository's merge policy. A
|
||||
previous green head does not validate a changed head.
|
||||
|
||||
A PR marked “merged” into an intermediate stack branch is not necessarily
|
||||
landed in the intended integration branch. Verify the full parent chain and
|
||||
final diff inclusion before reporting the campaign landed. Preserve or clean
|
||||
up branches/worktrees according to the user's instructions and retain needed
|
||||
evidence before cleanup. Report delivery separately from audit completeness;
|
||||
stop new discovery when the user asks to wrap up.
|
||||
@@ -0,0 +1,34 @@
|
||||
# Attribution
|
||||
|
||||
Paperclip's test-audit skill is inspired by the organization and audit principles
|
||||
of OpenClaw's [test-audit skill](https://github.com/openclaw/openclaw/tree/main/.agents/skills/test-audit),
|
||||
consulted on 2026-10-13. It uses the short entry point, separate campaign guide,
|
||||
and focused references pattern, with independently written Paperclip procedures
|
||||
and lessons from our test-gardening work. It has no execution or documentation
|
||||
dependency on an OpenClaw checkout or another installed skill.
|
||||
|
||||
The upstream license is retained below for the adapted material.
|
||||
|
||||
```text
|
||||
MIT License
|
||||
|
||||
Copyright (c) 2026 OpenClaw Foundation
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in all
|
||||
copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
SOFTWARE.
|
||||
```
|
||||
@@ -0,0 +1,78 @@
|
||||
---
|
||||
name: test-audit
|
||||
description: >
|
||||
Garden the test suite by finding and removing redundant, vacuous, or
|
||||
implementation-coupled tests while preserving useful regression coverage.
|
||||
Use for test audits, test pruning, duplicate coverage, or reducing CI test
|
||||
cost. Supports focused cleanups and coordinated audit campaigns.
|
||||
---
|
||||
|
||||
# Test Audit
|
||||
|
||||
Reduce execution and maintenance cost while preserving meaningful failure
|
||||
detection. Investigate aggressively; delete only with evidence. Retaining an
|
||||
area after review is a valid result. This skill is self-contained; upstream
|
||||
attribution is in [NOTICE.md](NOTICE.md).
|
||||
|
||||
## Choose the scope
|
||||
|
||||
- Focused cleanup: follow this entry point and read the
|
||||
[candidate evidence guide](references/audit.md) before editing.
|
||||
- Multiple owners, agents, or PRs: also read [CAMPAIGN.md](CAMPAIGN.md). Declare
|
||||
whether the work is a targeted sweep or an exhaustive subsystem audit.
|
||||
- Validation and cost claims: read [references/validation.md](references/validation.md).
|
||||
- Paperclip commands, invariants, and delivery: read
|
||||
[references/paperclip.md](references/paperclip.md) alongside repository instructions.
|
||||
|
||||
## Decision gate
|
||||
|
||||
For every proposed removal, answer:
|
||||
|
||||
1. Which observable contract and plausible regression do the assertions cover?
|
||||
2. Which retained file/case detects that regression through the responsible
|
||||
production code? Otherwise, why is the assertion vacuous or contract retired?
|
||||
3. Does this candidate uniquely cover a transport, permission, lifecycle,
|
||||
storage boundary, platform, default, or other independent failure mode?
|
||||
4. What improves: executions, fixtures, processes, maintenance, or runtime?
|
||||
|
||||
Prefer the smallest test that reaches the code responsible for the contract.
|
||||
A broader suite is not automatically stronger proof. Similarity, size, slowness,
|
||||
or suspected AI authorship alone never justify deletion.
|
||||
|
||||
## Prevent new duplication
|
||||
|
||||
Apply this gate to tests added or changed during gardening:
|
||||
|
||||
- Name the regression that existing proof misses. Extend an appropriate owner
|
||||
or table before adding another suite; another layer needs a distinct risk.
|
||||
- Exercise the responsible production behavior. Do not add a mock that supplies
|
||||
the result being asserted or a production hook solely for convenient testing.
|
||||
- Check observable outcomes that survive behavior-preserving refactors. A
|
||||
negative case must reach its named guard with otherwise valid inputs.
|
||||
|
||||
## Focused workflow
|
||||
|
||||
1. **Inspect:** pin the base; read candidates, keepers, fixtures, production
|
||||
callers, history, and CI routing. Preserve unrelated work.
|
||||
2. **Plan:** mark retain, repair, consolidate, delete, or defer. Name remaining
|
||||
proof and assertions to move; look for redundant suites as well as cases.
|
||||
3. **Prove:** establish the affected baseline locally or from matching-revision
|
||||
CI. Diagnose failures before treating them as cleanup candidates.
|
||||
4. **Edit:** move unique assertions first, then retire duplicates and unused
|
||||
support. Production-seam deletion needs its own caller/contract evidence.
|
||||
5. **Validate:** run keepers and affected siblings, verify selection, and apply
|
||||
the validation guide's intended-failure controls where needed.
|
||||
6. **Review:** reconcile deleted contracts with retained proof. Publish or merge
|
||||
only within the task's authorization.
|
||||
|
||||
## Completion and reporting
|
||||
|
||||
Report removals and keepers, retained/deferred candidates, checks and limitations,
|
||||
distinct cases versus repeated executions, and test/support versus production
|
||||
LOC. Count documentation separately. Label cost evidence as measured, estimated,
|
||||
or historical; a proven simplification does not require a measurable speedup.
|
||||
|
||||
State the actual endpoint: findings, validated local patch, published PR,
|
||||
intermediate merge, or landed in the intended target. Stop at the requested
|
||||
scope/time limit or completed delivery, not a deletion quota. For another pass,
|
||||
refresh the base and prior findings; revisit retained tests only with new evidence.
|
||||
@@ -0,0 +1,4 @@
|
||||
interface:
|
||||
display_name: "Test Audit"
|
||||
short_description: "Prune redundant tests while preserving useful coverage"
|
||||
default_prompt: "Use $test-audit to garden this test suite and remove well-supported redundancy while preserving meaningful regression coverage."
|
||||
@@ -0,0 +1,72 @@
|
||||
# Candidate evidence and retention
|
||||
|
||||
Use this reference before deleting or consolidating tests.
|
||||
|
||||
## Search for waste, then inspect the contract
|
||||
|
||||
| Candidate pattern | What to establish before changing it |
|
||||
| --- | --- |
|
||||
| Several tests repeat one assertion through the same production path | A retained case has equivalent inputs, failure sensitivity, and relevant setup. |
|
||||
| A test file only imports another test file | The real owner is selected in the same required runs; the alias adds no setup, configuration, or separate entry point. Check both CI and documented commands. |
|
||||
| A large table repeats equivalent rows | Preserve rows that exercise different branches, boundary values, error classes, platforms, or defaults. |
|
||||
| A bulk fixture creates many interchangeable records | Establish that the count does not cross batching, pagination, concurrency, or transaction thresholds. Retain mixed outcomes and persisted state assertions. |
|
||||
| Assertions copy lists, exports, strings, or source shapes | Determine whether the list or shape is an independent public, packaging, generated, or architecture contract. |
|
||||
| Mocks implement the behavior being asserted | Find a test that exercises the responsible production behavior; otherwise repair or relocate this proof before removing it. |
|
||||
| Fixtures fabricate receipts, ordering, or persisted state | Verify that the responsible production path creates that evidence; fixture-supplied outcomes cannot prove it does. |
|
||||
| A negative case passes for an unrelated reason | Reach the named guard with otherwise valid inputs. Fix useful coverage rather than discarding it as waste. |
|
||||
| A test-only export, reset hook, or wrapper becomes unused | Search runtime callers, package exports, generated callers, supported integrations, and history. File location alone does not make it dead production code. |
|
||||
|
||||
Also inspect self-comparisons, assertions with expected values derived from the
|
||||
subject, probes with no checks, and names that promise more than the body tests.
|
||||
Explicitly assertion-free smoke tests can still protect module loading or
|
||||
execution; identify that purpose before deleting them.
|
||||
|
||||
## Reasons to retain apparently similar tests
|
||||
|
||||
Two tests can use the same payload while protecting different failure modes:
|
||||
|
||||
- Authorization and tenant isolation at separate exposed entry points.
|
||||
- Direct API versus SDK/MCP transport, including serialization and errors.
|
||||
- Initial execution versus replay, recovery, restart, or concurrent access.
|
||||
- In-memory return values versus committed database state or rollback.
|
||||
- Default-off behavior versus explicit opt-in; missing versus invalid input.
|
||||
- Platform behavior, published package exports, migrations, generated-language
|
||||
compatibility, or intentional prompt/protocol bytes.
|
||||
- Browser interaction, reconnect, pagination, lost responses, attachment
|
||||
persistence, or visible ordering absent from lower-level coverage.
|
||||
|
||||
Keep a static check when it is an independent and appropriate guard of a
|
||||
contract. Implementation-shaped checks that fail on a harmless identifier
|
||||
rename deserve scrutiny; this does not make all source inspection disposable.
|
||||
Likewise, a slow integration test can be the only meaningful proof of a
|
||||
transaction or lifecycle. Cost helps rank investigation, not determine truth.
|
||||
|
||||
## Evidence before editing
|
||||
|
||||
Read the candidate's full body and parameter rows, setup/teardown, production
|
||||
owner, real callers, proposed keeper, configuration, and relevant history.
|
||||
Look for why the test was introduced and regressions added since. Inspect the
|
||||
dependency's actual contract when a claim depends on library behavior.
|
||||
|
||||
Use a compact table or PR notes:
|
||||
|
||||
| Candidate | Decision and reason | Contract/regression | Keeper or retirement evidence | Validation and benefit |
|
||||
| --- | --- | --- | --- | --- |
|
||||
| File and case/rows | Retain / repair / consolidate / delete / defer | Observable failure detected | Exact file/case, or evidence the contract no longer exists | Commands/control, cost or maintenance reduction, limitations |
|
||||
|
||||
For consolidation, list unique assertions to move. The keeper must actually
|
||||
exercise them with valid fixtures; adding an assertion that cannot fail is
|
||||
not coverage preservation. If setup or the selected test project differs,
|
||||
explain why it does not change the protected contract.
|
||||
|
||||
## Two useful distinctions
|
||||
|
||||
- An import-only alias and its directly selected owner may duplicate execution.
|
||||
An identical-looking alias importing a package suite absent from the default
|
||||
run may be the only entry point and must stay until routing is repaired.
|
||||
- Repeated successful records in a bulk route fixture may be reducible while
|
||||
retaining mixed failures and persisted outcomes. The same reduction would
|
||||
invalidate a test whose record count exercises a batch or pagination limit.
|
||||
|
||||
If evidence is missing, defer that candidate and keep working on independent
|
||||
ones. Audit-only findings do not become permission to delete tests elsewhere.
|
||||
@@ -0,0 +1,71 @@
|
||||
# Paperclip integration
|
||||
|
||||
This reference adapts the standalone workflow to this repository. Read root
|
||||
and scoped `AGENTS.md` and their required product/development documents. Resolve
|
||||
paths below from the repository root and inspect current contents; counts and
|
||||
shard layouts evolve.
|
||||
|
||||
## Discovery and test selection
|
||||
|
||||
- `package.json`, `vitest.config.ts`, and package-local Vitest configurations
|
||||
describe the test projects and commands.
|
||||
- `scripts/run-vitest-stable.mjs` selects and runs the default suites. Inspect
|
||||
its supported dry-run/mode/shard flags before constructing routing checks.
|
||||
- `.github/workflows/pr.yml` identifies the PR workflow; follow its reusable
|
||||
workflow references to the actual lanes and shard matrix.
|
||||
- `scripts/general-server-shard.mjs` and the general-server, serialized, and
|
||||
E2E duration JSON files under `scripts/` provide routing and historical cost
|
||||
clues. Read each manifest's provenance; a file's weight is not per-case time.
|
||||
- Search tests colocated with production modules as well as `__tests__/`.
|
||||
Some acceptance files import other suites. Verify both direct selection and
|
||||
aliases, including package suites outside the default project list.
|
||||
|
||||
Example focused command, replacing the example path with the actual owner:
|
||||
|
||||
```sh
|
||||
pnpm --filter @paperclipai/server exec vitest run src/services/OWNER.test.ts
|
||||
```
|
||||
|
||||
`pnpm test` is the normal Vitest entry point. Browser and release-smoke suites
|
||||
are opt-in; run them when affected or explicitly verifying those flows.
|
||||
Follow repository requirements for a PR-ready handoff, including the full
|
||||
typecheck/test/build checks when required; identify local versus CI execution
|
||||
and report anything unrun. Do not rerun the entire repository on every audit
|
||||
heartbeat. Test removals do not excuse required checks.
|
||||
|
||||
## Contracts deserving special care
|
||||
|
||||
Preserve company isolation, board/agent authorization, atomic checkout,
|
||||
single-assignee rules, approval gates, budget hard stops, and mutation activity
|
||||
logging. Persistence, idempotency, cancellation, concurrency, recovery, and
|
||||
ordering often have separate owners even when test names look similar.
|
||||
|
||||
Distinguish first-party Telemetry, opt-in OpenTelemetry observability, and the
|
||||
local run log by their paths as defined in `AGENTS.md`. A pruning task is not
|
||||
permission to remove privacy, endpoint gating, or event-contract coverage.
|
||||
|
||||
## Environment and delivery
|
||||
|
||||
Database-backed tests may start real embedded Postgres even though development
|
||||
can use PGlite. Check the actual fixture. An isolated install with scripts
|
||||
disabled may need documented dependency setup before its binaries work.
|
||||
Resource exhaustion must not be interpreted as a tested product failure or a
|
||||
passing control. Coordinate heavy runs and clean up only owned resources.
|
||||
|
||||
Follow existing branch/worktree conventions and protect unrelated working-tree
|
||||
edits. New repository audit plans/receipts belong in
|
||||
`doc/plans/YYYY-MM-DD-<scope>-test-audit.md`. Prefer one concise receipt per
|
||||
coherent batch or campaign. For Paperclip issue work, follow the issue's artifact
|
||||
and work-product requirements rather than relying only on local paths.
|
||||
|
||||
When publishing is authorized, fill every section of
|
||||
`.github/PULL_REQUEST_TEMPLATE.md`, including exact model information that is
|
||||
actually known; do not fabricate context-window details. Use an accurate PR
|
||||
title consistent with current repository policy. A deletion-only cleanup may
|
||||
be a refactor and does not need a token added test to satisfy a title heuristic.
|
||||
|
||||
When merging is authorized, verify current-head CI and fresh repository review
|
||||
results, inspect review threads and edited bot summaries, and resolve genuine
|
||||
findings. After a stack merge, verify inclusion in the intended final branch
|
||||
as described in [CAMPAIGN.md](../CAMPAIGN.md). No fixed check count or old
|
||||
review score substitutes for inspecting the current requirements.
|
||||
@@ -0,0 +1,87 @@
|
||||
# Preservation, cost, and evidence
|
||||
|
||||
## Prove the retained behavior
|
||||
|
||||
Pin baseline and candidate revisions and record the actual command, project,
|
||||
filters, environment differences, and pass/fail/skip counts. Prefer focused
|
||||
owner and affected sibling runs. A zero-test run, setup error, or fully skipped
|
||||
suite is not a successful baseline. Use recent CI only when its revision and
|
||||
test selection support the claim being made.
|
||||
|
||||
For straightforward exact duplicates, compare all assertions, fixtures,
|
||||
configuration, and selection. For assertion migration, weaker-to-stronger
|
||||
coverage substitution, security/persistence boundaries, or uncertain failure
|
||||
sensitivity, use a deliberate control:
|
||||
|
||||
1. Run the keeper normally and observe it passing.
|
||||
2. In an isolated, idle checkout, temporarily introduce the specific plausible
|
||||
production regression the keeper is meant to detect, or revert the relevant
|
||||
fix. Keep unrelated guards and fixtures valid.
|
||||
3. Verify the expected case fails at the intended assertion. A timeout, missing
|
||||
dependency, unrelated rejection, or initialization failure is not proof.
|
||||
4. Restore the exact pre-control bytes in a guaranteed cleanup step. Check the
|
||||
diff/hash and run the same selected case successfully again.
|
||||
5. Run the affected candidate owners without that narrow name filter before
|
||||
calling the complete owner suite green.
|
||||
|
||||
Never mutate a checkout with active tests, commit a temporary mutation, or
|
||||
overwrite someone else's source changes during restoration. Do not add a
|
||||
permanent replacement test solely to justify removing an obvious duplicate.
|
||||
|
||||
## Verify what actually runs
|
||||
|
||||
Inspect the real runner entry point, include/exclude rules, package projects,
|
||||
shard routing, dedicated CI lanes, and documented focused commands. A test
|
||||
existing on disk does not guarantee that it executes in the required run.
|
||||
The required invocations are the affected CI lanes and supported developer
|
||||
commands for the audit's scope. Redirecting a documented alias command to its
|
||||
owner is valid when the configuration and protected contracts remain equivalent;
|
||||
preservation does not require retaining an obsolete filename indefinitely.
|
||||
|
||||
When removing test-import aliases, prove that the retained owners remain
|
||||
selected with the intended multiplicity in each required invocation. Update
|
||||
explicit commands and ownership inventories. Use dry-run routing to inspect
|
||||
selection and an actual focused run to confirm execution where import caching
|
||||
or collector behavior makes listing ambiguous. Intentional runs on different
|
||||
platforms/configurations are separate contracts, not duplicate registrations.
|
||||
|
||||
## Measure the benefit honestly
|
||||
|
||||
Keep these quantities separate:
|
||||
|
||||
| Quantity | Interpretation |
|
||||
| --- | --- |
|
||||
| Deleted source declarations / expanded table cases | Change in test code or case inventory. |
|
||||
| Avoided registrations / suite invocations | Repeated execution eliminated; may remove no unique contract. |
|
||||
| Test/support LOC | Maintenance reduction, not a runtime estimate. Report additions and net change. |
|
||||
| Production LOC | Runtime code changed, with its own justification; do not combine it with test LOC. |
|
||||
| Historical manifest weight | Scheduling estimate at its recorded revision/date, often including setup/import cost. |
|
||||
| Case time / owner suite time / process time | Different scopes; compare like with like. |
|
||||
| Shard time / workflow critical path | Scheduling and parallelism effects; summing suite savings does not predict elapsed CI savings. |
|
||||
|
||||
Use bounded matched baseline/candidate runs when a quantified runtime claim is
|
||||
important. Keep environment and configuration comparable, alternate order when
|
||||
practical, and disclose sample count and variation. Inspect neighboring suites
|
||||
for host-wide drift. A faster unrelated shard is not deletion evidence; a slower
|
||||
whole suite does not establish that removing a duplicate caused a regression.
|
||||
|
||||
Logs that only print slow cases provide censored observations: an absent case
|
||||
is below the reporting threshold, not zero milliseconds. A passing retry is
|
||||
validation evidence, not a fair speed comparison with the failed attempt.
|
||||
Report uncertain speed effects as inconclusive and keep structural benefits
|
||||
separate. Do not demand significance testing for every safe maintenance edit.
|
||||
|
||||
## Failures and durable reporting
|
||||
|
||||
Classify failures before acting: product assertion, test defect, setup/dependency,
|
||||
host capacity, or CI infrastructure. Fix relevant defects or report the blocker;
|
||||
do not weaken assertions, increase budgets, skip suites, or erase a failing
|
||||
baseline to obtain a green audit. Retry a demonstrated transient problem within
|
||||
a stated bound; a recurring failure needs investigation.
|
||||
|
||||
Use PR notes for small changes. For a campaign, keep a compact dated receipt
|
||||
with revisions, decisions, keepers, commands, results, controls, measurements,
|
||||
and limitations. Link accessible CI runs/artifacts when they support claims.
|
||||
Temporary paths and hashes alone do not make evidence durably inspectable.
|
||||
Do not generate large evidence dossiers for trivial deletions or store raw
|
||||
logs containing secrets. State precisely which broad checks remain unrun.
|
||||
Reference in new issue
Block a user