@quickchatai/pi-quickreview 0.0.0-stage → 1.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +23 -0
- package/README.md +75 -2
- package/assets/agents/pass-abstraction.md +64 -0
- package/assets/agents/pass-ask-human.md +134 -0
- package/assets/agents/pass-backcompat.md +67 -0
- package/assets/agents/pass-baseline.md +61 -0
- package/assets/agents/pass-behaviour-delta.md +64 -0
- package/assets/agents/pass-bounds.md +36 -0
- package/assets/agents/pass-claims.md +31 -0
- package/assets/agents/pass-concurrency.md +168 -0
- package/assets/agents/pass-consistency.md +57 -0
- package/assets/agents/pass-contracts.md +30 -0
- package/assets/agents/pass-data-safety.md +54 -0
- package/assets/agents/pass-deferred.md +35 -0
- package/assets/agents/pass-delivery.md +37 -0
- package/assets/agents/pass-duplication.md +60 -0
- package/assets/agents/pass-intent.md +63 -0
- package/assets/agents/pass-lint-conformance.md +46 -0
- package/assets/agents/pass-maintainability.md +67 -0
- package/assets/agents/pass-placement.md +68 -0
- package/assets/agents/pass-prod-risk.md +24 -0
- package/assets/agents/pass-rollout.md +32 -0
- package/assets/agents/pass-roundtrip.md +46 -0
- package/assets/agents/pass-security.md +31 -0
- package/assets/agents/pass-simplicity.md +68 -0
- package/assets/agents/pass-statelessness.md +27 -0
- package/assets/agents/pass-style.md +37 -0
- package/assets/agents/pass-sweep.md +57 -0
- package/assets/agents/pass-tests.md +58 -0
- package/assets/agents/pass-ui.md +23 -0
- package/assets/agents/pass-validate.md +50 -0
- package/assets/agents/pass-widened.md +46 -0
- package/assets/agents/scan/pass-scan.md +86 -0
- package/assets/config.example.toml +1067 -0
- package/assets/deploy/reviewer/AGENTS.override.md +12 -0
- package/assets/profiles/default/README.md +21 -0
- package/assets/profiles/default/addenda/.gitkeep +0 -0
- package/assets/profiles/default/profile.toml +17 -0
- package/assets/profiles/example-django/README.md +21 -0
- package/assets/profiles/example-django/addenda/10-migration-discipline.md +13 -0
- package/assets/profiles/example-django/addenda/20-new-column-nullability.md +12 -0
- package/assets/profiles/example-django/addenda/30-test-doctrine.md +12 -0
- package/assets/profiles/example-django/addenda/40-orm-usage.md +19 -0
- package/assets/profiles/example-django/addenda/50-declared-shape.md +10 -0
- package/assets/profiles/example-django/addenda/60-config-placement.md +14 -0
- package/assets/profiles/example-django/heuristics.toml +24 -0
- package/assets/profiles/example-django/profile.toml +9 -0
- package/assets/profiles/fast/README.md +24 -0
- package/assets/profiles/fast/profile.toml +59 -0
- package/assets/profiles/minimal/README.md +17 -0
- package/assets/profiles/minimal/addenda/.gitkeep +0 -0
- package/assets/profiles/minimal/profile.toml +8 -0
- package/assets/profiles/snappy/README.md +24 -0
- package/assets/profiles/snappy/addenda/10-race-as-question.md +6 -0
- package/assets/profiles/snappy/profile.toml +46 -0
- package/assets/prompts/companion-day-open.md +46 -0
- package/assets/prompts/companion-first-run.md +104 -0
- package/assets/prompts/companion.md +821 -0
- package/assets/prompts/conversation-system.md +117 -0
- package/assets/prompts/eod-sweep.md +120 -0
- package/assets/prompts/onboarding.md +74 -0
- package/assets/prompts/pass-common.md +52 -0
- package/assets/prompts/pass-quality-common.md +22 -0
- package/assets/prompts/round-first.md +874 -0
- package/assets/prompts/round-follow-up.md +991 -0
- package/assets/prompts/round-re-review.md +889 -0
- package/assets/prompts/round-recheck.md +196 -0
- package/assets/prompts/round-staleness.md +856 -0
- package/assets/schemas/review-result.v1.json +391 -0
- package/assets/schemas/scan-result.v1.json +421 -0
- package/assets/schemas/version.v1.json +57 -0
- package/assets/seed-manifest.json +19 -0
- package/assets/seeds/agents/pass-baseline.md +61 -0
- package/assets/seeds/agents/pass-contracts.md +30 -0
- package/assets/seeds/agents/pass-data-safety.md +54 -0
- package/assets/seeds/agents/pass-delivery.md +37 -0
- package/assets/seeds/agents/pass-prod-risk.md +24 -0
- package/assets/seeds/agents/pass-security.md +31 -0
- package/assets/seeds/agents/pass-statelessness.md +27 -0
- package/assets/seeds/agents/pass-ui.md +23 -0
- package/assets/seeds/agents/pass-validate.md +50 -0
- package/assets/seeds/prompts/conversation-system.md +117 -0
- package/assets/seeds/prompts/eod-sweep.md +120 -0
- package/assets/seeds/prompts/pass-common.md +52 -0
- package/dist/extensions/bash-guard.d.ts +467 -0
- package/dist/extensions/bash-guard.d.ts.map +1 -0
- package/dist/extensions/bash-guard.js +3058 -0
- package/dist/extensions/bash-guard.js.map +1 -0
- package/dist/extensions/finding-clusters.d.ts +33 -0
- package/dist/extensions/finding-clusters.d.ts.map +1 -0
- package/dist/extensions/finding-clusters.js +218 -0
- package/dist/extensions/finding-clusters.js.map +1 -0
- package/dist/extensions/ledger-pin.d.ts +76 -0
- package/dist/extensions/ledger-pin.d.ts.map +1 -0
- package/dist/extensions/ledger-pin.js +331 -0
- package/dist/extensions/ledger-pin.js.map +1 -0
- package/dist/extensions/lens.d.ts +43 -0
- package/dist/extensions/lens.d.ts.map +1 -0
- package/dist/extensions/lens.js +150 -0
- package/dist/extensions/lens.js.map +1 -0
- package/dist/extensions/pi-tool.d.ts +22 -0
- package/dist/extensions/pi-tool.d.ts.map +1 -0
- package/dist/extensions/pi-tool.js +20 -0
- package/dist/extensions/pi-tool.js.map +1 -0
- package/dist/extensions/quickreview.d.ts +21 -0
- package/dist/extensions/quickreview.d.ts.map +1 -0
- package/dist/extensions/quickreview.js +132 -0
- package/dist/extensions/quickreview.js.map +1 -0
- package/dist/src/anchors.d.ts +54 -0
- package/dist/src/anchors.d.ts.map +1 -0
- package/dist/src/anchors.js +127 -0
- package/dist/src/anchors.js.map +1 -0
- package/dist/src/assetroot.d.ts +16 -0
- package/dist/src/assetroot.d.ts.map +1 -0
- package/dist/src/assetroot.js +77 -0
- package/dist/src/assetroot.js.map +1 -0
- package/dist/src/authwatch.d.ts +61 -0
- package/dist/src/authwatch.d.ts.map +1 -0
- package/dist/src/authwatch.js +210 -0
- package/dist/src/authwatch.js.map +1 -0
- package/dist/src/budget.d.ts +15 -0
- package/dist/src/budget.d.ts.map +1 -0
- package/dist/src/budget.js +32 -0
- package/dist/src/budget.js.map +1 -0
- package/dist/src/casebudget.d.ts +3 -0
- package/dist/src/casebudget.d.ts.map +1 -0
- package/dist/src/casebudget.js +3 -0
- package/dist/src/casebudget.js.map +1 -0
- package/dist/src/cigate.d.ts +116 -0
- package/dist/src/cigate.d.ts.map +1 -0
- package/dist/src/cigate.js +176 -0
- package/dist/src/cigate.js.map +1 -0
- package/dist/src/codespan.d.ts +46 -0
- package/dist/src/codespan.d.ts.map +1 -0
- package/dist/src/codespan.js +75 -0
- package/dist/src/codespan.js.map +1 -0
- package/dist/src/contextpack.d.ts +56 -0
- package/dist/src/contextpack.d.ts.map +1 -0
- package/dist/src/contextpack.js +195 -0
- package/dist/src/contextpack.js.map +1 -0
- package/dist/src/contract.d.ts +8 -0
- package/dist/src/contract.d.ts.map +1 -0
- package/dist/src/contract.js +21 -0
- package/dist/src/contract.js.map +1 -0
- package/dist/src/coverage.d.ts +32 -0
- package/dist/src/coverage.d.ts.map +1 -0
- package/dist/src/coverage.js +85 -0
- package/dist/src/coverage.js.map +1 -0
- package/dist/src/datafence.d.ts +19 -0
- package/dist/src/datafence.d.ts.map +1 -0
- package/dist/src/datafence.js +60 -0
- package/dist/src/datafence.js.map +1 -0
- package/dist/src/dedup.d.ts +65 -0
- package/dist/src/dedup.d.ts.map +1 -0
- package/dist/src/dedup.js +459 -0
- package/dist/src/dedup.js.map +1 -0
- package/dist/src/depsources.d.ts +304 -0
- package/dist/src/depsources.d.ts.map +1 -0
- package/dist/src/depsources.js +3367 -0
- package/dist/src/depsources.js.map +1 -0
- package/dist/src/diffinput.d.ts +10 -0
- package/dist/src/diffinput.d.ts.map +1 -0
- package/dist/src/diffinput.js +172 -0
- package/dist/src/diffinput.js.map +1 -0
- package/dist/src/doubtwords.d.ts +10 -0
- package/dist/src/doubtwords.d.ts.map +1 -0
- package/dist/src/doubtwords.js +13 -0
- package/dist/src/doubtwords.js.map +1 -0
- package/dist/src/ecosystem.d.ts +148 -0
- package/dist/src/ecosystem.d.ts.map +1 -0
- package/dist/src/ecosystem.js +338 -0
- package/dist/src/ecosystem.js.map +1 -0
- package/dist/src/engine/agentdir.d.ts +5 -0
- package/dist/src/engine/agentdir.d.ts.map +1 -0
- package/dist/src/engine/agentdir.js +21 -0
- package/dist/src/engine/agentdir.js.map +1 -0
- package/dist/src/engine/auth.d.ts +214 -0
- package/dist/src/engine/auth.d.ts.map +1 -0
- package/dist/src/engine/auth.js +374 -0
- package/dist/src/engine/auth.js.map +1 -0
- package/dist/src/engine/budget.d.ts +60 -0
- package/dist/src/engine/budget.d.ts.map +1 -0
- package/dist/src/engine/budget.js +113 -0
- package/dist/src/engine/budget.js.map +1 -0
- package/dist/src/engine/capfd.d.ts +6 -0
- package/dist/src/engine/capfd.d.ts.map +1 -0
- package/dist/src/engine/capfd.js +21 -0
- package/dist/src/engine/capfd.js.map +1 -0
- package/dist/src/engine/caseout.d.ts +66 -0
- package/dist/src/engine/caseout.d.ts.map +1 -0
- package/dist/src/engine/caseout.js +107 -0
- package/dist/src/engine/caseout.js.map +1 -0
- package/dist/src/engine/context.d.ts +57 -0
- package/dist/src/engine/context.d.ts.map +1 -0
- package/dist/src/engine/context.js +212 -0
- package/dist/src/engine/context.js.map +1 -0
- package/dist/src/engine/envmap.d.ts +13 -0
- package/dist/src/engine/envmap.d.ts.map +1 -0
- package/dist/src/engine/envmap.js +372 -0
- package/dist/src/engine/envmap.js.map +1 -0
- package/dist/src/engine/extfiles.d.ts +7 -0
- package/dist/src/engine/extfiles.d.ts.map +1 -0
- package/dist/src/engine/extfiles.js +23 -0
- package/dist/src/engine/extfiles.js.map +1 -0
- package/dist/src/engine/keyroute.d.ts +21 -0
- package/dist/src/engine/keyroute.d.ts.map +1 -0
- package/dist/src/engine/keyroute.js +58 -0
- package/dist/src/engine/keyroute.js.map +1 -0
- package/dist/src/engine/lens/cache-group.d.ts +20 -0
- package/dist/src/engine/lens/cache-group.d.ts.map +1 -0
- package/dist/src/engine/lens/cache-group.js +31 -0
- package/dist/src/engine/lens/cache-group.js.map +1 -0
- package/dist/src/engine/lens/cache-run.d.ts +65 -0
- package/dist/src/engine/lens/cache-run.d.ts.map +1 -0
- package/dist/src/engine/lens/cache-run.js +159 -0
- package/dist/src/engine/lens/cache-run.js.map +1 -0
- package/dist/src/engine/lens/deadline.d.ts +54 -0
- package/dist/src/engine/lens/deadline.d.ts.map +1 -0
- package/dist/src/engine/lens/deadline.js +111 -0
- package/dist/src/engine/lens/deadline.js.map +1 -0
- package/dist/src/engine/lens/engine-tools.d.ts +13 -0
- package/dist/src/engine/lens/engine-tools.d.ts.map +1 -0
- package/dist/src/engine/lens/engine-tools.js +37 -0
- package/dist/src/engine/lens/engine-tools.js.map +1 -0
- package/dist/src/engine/lens/env.d.ts +23 -0
- package/dist/src/engine/lens/env.d.ts.map +1 -0
- package/dist/src/engine/lens/env.js +42 -0
- package/dist/src/engine/lens/env.js.map +1 -0
- package/dist/src/engine/lens/launch-plan.d.ts +63 -0
- package/dist/src/engine/lens/launch-plan.d.ts.map +1 -0
- package/dist/src/engine/lens/launch-plan.js +203 -0
- package/dist/src/engine/lens/launch-plan.js.map +1 -0
- package/dist/src/engine/lens/leaf-cache.d.ts +22 -0
- package/dist/src/engine/lens/leaf-cache.d.ts.map +1 -0
- package/dist/src/engine/lens/leaf-cache.js +115 -0
- package/dist/src/engine/lens/leaf-cache.js.map +1 -0
- package/dist/src/engine/lens/permits.d.ts +14 -0
- package/dist/src/engine/lens/permits.d.ts.map +1 -0
- package/dist/src/engine/lens/permits.js +18 -0
- package/dist/src/engine/lens/permits.js.map +1 -0
- package/dist/src/engine/lens/registry.d.ts +55 -0
- package/dist/src/engine/lens/registry.d.ts.map +1 -0
- package/dist/src/engine/lens/registry.js +140 -0
- package/dist/src/engine/lens/registry.js.map +1 -0
- package/dist/src/engine/lens/round-lens.d.ts +16 -0
- package/dist/src/engine/lens/round-lens.d.ts.map +1 -0
- package/dist/src/engine/lens/round-lens.js +46 -0
- package/dist/src/engine/lens/round-lens.js.map +1 -0
- package/dist/src/engine/lens/runlens.d.ts +103 -0
- package/dist/src/engine/lens/runlens.d.ts.map +1 -0
- package/dist/src/engine/lens/runlens.js +538 -0
- package/dist/src/engine/lens/runlens.js.map +1 -0
- package/dist/src/engine/lens/section.d.ts +19 -0
- package/dist/src/engine/lens/section.d.ts.map +1 -0
- package/dist/src/engine/lens/section.js +40 -0
- package/dist/src/engine/lens/section.js.map +1 -0
- package/dist/src/engine/lens/semaphore.d.ts +13 -0
- package/dist/src/engine/lens/semaphore.d.ts.map +1 -0
- package/dist/src/engine/lens/semaphore.js +44 -0
- package/dist/src/engine/lens/semaphore.js.map +1 -0
- package/dist/src/engine/lens/tool.d.ts +34 -0
- package/dist/src/engine/lens/tool.d.ts.map +1 -0
- package/dist/src/engine/lens/tool.js +345 -0
- package/dist/src/engine/lens/tool.js.map +1 -0
- package/dist/src/engine/lens/wave.d.ts +63 -0
- package/dist/src/engine/lens/wave.d.ts.map +1 -0
- package/dist/src/engine/lens/wave.js +95 -0
- package/dist/src/engine/lens/wave.js.map +1 -0
- package/dist/src/engine/livesessions.d.ts +21 -0
- package/dist/src/engine/livesessions.d.ts.map +1 -0
- package/dist/src/engine/livesessions.js +57 -0
- package/dist/src/engine/livesessions.js.map +1 -0
- package/dist/src/engine/livewire.d.ts +18 -0
- package/dist/src/engine/livewire.d.ts.map +1 -0
- package/dist/src/engine/livewire.js +31 -0
- package/dist/src/engine/livewire.js.map +1 -0
- package/dist/src/engine/openable.d.ts +37 -0
- package/dist/src/engine/openable.d.ts.map +1 -0
- package/dist/src/engine/openable.js +120 -0
- package/dist/src/engine/openable.js.map +1 -0
- package/dist/src/engine/pisdk.d.ts +226 -0
- package/dist/src/engine/pisdk.d.ts.map +1 -0
- package/dist/src/engine/pisdk.js +552 -0
- package/dist/src/engine/pisdk.js.map +1 -0
- package/dist/src/engine/port.d.ts +144 -0
- package/dist/src/engine/port.d.ts.map +1 -0
- package/dist/src/engine/port.js +16 -0
- package/dist/src/engine/port.js.map +1 -0
- package/dist/src/engine/prompts.d.ts +159 -0
- package/dist/src/engine/prompts.d.ts.map +1 -0
- package/dist/src/engine/prompts.js +339 -0
- package/dist/src/engine/prompts.js.map +1 -0
- package/dist/src/engine/render.d.ts +10 -0
- package/dist/src/engine/render.d.ts.map +1 -0
- package/dist/src/engine/render.js +23 -0
- package/dist/src/engine/render.js.map +1 -0
- package/dist/src/engine/reviewruntime.d.ts +13 -0
- package/dist/src/engine/reviewruntime.d.ts.map +1 -0
- package/dist/src/engine/reviewruntime.js +35 -0
- package/dist/src/engine/reviewruntime.js.map +1 -0
- package/dist/src/engine/reviewsdk.d.ts +75 -0
- package/dist/src/engine/reviewsdk.d.ts.map +1 -0
- package/dist/src/engine/reviewsdk.js +180 -0
- package/dist/src/engine/reviewsdk.js.map +1 -0
- package/dist/src/engine/round.d.ts +166 -0
- package/dist/src/engine/round.d.ts.map +1 -0
- package/dist/src/engine/round.js +543 -0
- package/dist/src/engine/round.js.map +1 -0
- package/dist/src/engine/roundagents.d.ts +17 -0
- package/dist/src/engine/roundagents.d.ts.map +1 -0
- package/dist/src/engine/roundagents.js +49 -0
- package/dist/src/engine/roundagents.js.map +1 -0
- package/dist/src/engine/roundevents.d.ts +110 -0
- package/dist/src/engine/roundevents.d.ts.map +1 -0
- package/dist/src/engine/roundevents.js +276 -0
- package/dist/src/engine/roundevents.js.map +1 -0
- package/dist/src/engine/roundsdk.d.ts +33 -0
- package/dist/src/engine/roundsdk.d.ts.map +1 -0
- package/dist/src/engine/roundsdk.js +76 -0
- package/dist/src/engine/roundsdk.js.map +1 -0
- package/dist/src/engine/sdkruntime.d.ts +23 -0
- package/dist/src/engine/sdkruntime.d.ts.map +1 -0
- package/dist/src/engine/sdkruntime.js +340 -0
- package/dist/src/engine/sdkruntime.js.map +1 -0
- package/dist/src/engine/select.d.ts +16 -0
- package/dist/src/engine/select.d.ts.map +1 -0
- package/dist/src/engine/select.js +32 -0
- package/dist/src/engine/select.js.map +1 -0
- package/dist/src/engine/sessionwrap.d.ts +4 -0
- package/dist/src/engine/sessionwrap.d.ts.map +1 -0
- package/dist/src/engine/sessionwrap.js +31 -0
- package/dist/src/engine/sessionwrap.js.map +1 -0
- package/dist/src/engine/toolfence.d.ts +90 -0
- package/dist/src/engine/toolfence.d.ts.map +1 -0
- package/dist/src/engine/toolfence.js +378 -0
- package/dist/src/engine/toolfence.js.map +1 -0
- package/dist/src/engine/tooluid.d.ts +128 -0
- package/dist/src/engine/tooluid.d.ts.map +1 -0
- package/dist/src/engine/tooluid.js +401 -0
- package/dist/src/engine/tooluid.js.map +1 -0
- package/dist/src/envstrip.d.ts +10 -0
- package/dist/src/envstrip.d.ts.map +1 -0
- package/dist/src/envstrip.js +15 -0
- package/dist/src/envstrip.js.map +1 -0
- package/dist/src/escalationprompt.d.ts +22 -0
- package/dist/src/escalationprompt.d.ts.map +1 -0
- package/dist/src/escalationprompt.js +54 -0
- package/dist/src/escalationprompt.js.map +1 -0
- package/dist/src/execfn.d.ts +29 -0
- package/dist/src/execfn.d.ts.map +1 -0
- package/dist/src/execfn.js +55 -0
- package/dist/src/execfn.js.map +1 -0
- package/dist/src/finding-chain.d.ts +40 -0
- package/dist/src/finding-chain.d.ts.map +1 -0
- package/dist/src/finding-chain.js +76 -0
- package/dist/src/finding-chain.js.map +1 -0
- package/dist/src/finding-row.d.ts +24 -0
- package/dist/src/finding-row.d.ts.map +1 -0
- package/dist/src/finding-row.js +26 -0
- package/dist/src/finding-row.js.map +1 -0
- package/dist/src/findingkey.d.ts +99 -0
- package/dist/src/findingkey.d.ts.map +1 -0
- package/dist/src/findingkey.js +210 -0
- package/dist/src/findingkey.js.map +1 -0
- package/dist/src/findingsrecord.d.ts +175 -0
- package/dist/src/findingsrecord.d.ts.map +1 -0
- package/dist/src/findingsrecord.js +410 -0
- package/dist/src/findingsrecord.js.map +1 -0
- package/dist/src/followup-mode.d.ts +4 -0
- package/dist/src/followup-mode.d.ts.map +1 -0
- package/dist/src/followup-mode.js +6 -0
- package/dist/src/followup-mode.js.map +1 -0
- package/dist/src/gate.d.ts +199 -0
- package/dist/src/gate.d.ts.map +1 -0
- package/dist/src/gate.js +315 -0
- package/dist/src/gate.js.map +1 -0
- package/dist/src/ghcred.d.ts +58 -0
- package/dist/src/ghcred.d.ts.map +1 -0
- package/dist/src/ghcred.js +139 -0
- package/dist/src/ghcred.js.map +1 -0
- package/dist/src/githubAuth.d.ts +32 -0
- package/dist/src/githubAuth.d.ts.map +1 -0
- package/dist/src/githubAuth.js +116 -0
- package/dist/src/githubAuth.js.map +1 -0
- package/dist/src/githubcore.d.ts +20 -0
- package/dist/src/githubcore.d.ts.map +1 -0
- package/dist/src/githubcore.js +20 -0
- package/dist/src/githubcore.js.map +1 -0
- package/dist/src/glob.d.ts +11 -0
- package/dist/src/glob.d.ts.map +1 -0
- package/dist/src/glob.js +69 -0
- package/dist/src/glob.js.map +1 -0
- package/dist/src/guards.d.ts +93 -0
- package/dist/src/guards.d.ts.map +1 -0
- package/dist/src/guards.js +306 -0
- package/dist/src/guards.js.map +1 -0
- package/dist/src/heartbeat.d.ts +29 -0
- package/dist/src/heartbeat.d.ts.map +1 -0
- package/dist/src/heartbeat.js +87 -0
- package/dist/src/heartbeat.js.map +1 -0
- package/dist/src/heuristics.d.ts +247 -0
- package/dist/src/heuristics.d.ts.map +1 -0
- package/dist/src/heuristics.js +927 -0
- package/dist/src/heuristics.js.map +1 -0
- package/dist/src/homes.d.ts +181 -0
- package/dist/src/homes.d.ts.map +1 -0
- package/dist/src/homes.js +242 -0
- package/dist/src/homes.js.map +1 -0
- package/dist/src/hunkheader.d.ts +11 -0
- package/dist/src/hunkheader.d.ts.map +1 -0
- package/dist/src/hunkheader.js +18 -0
- package/dist/src/hunkheader.js.map +1 -0
- package/dist/src/include.d.ts +435 -0
- package/dist/src/include.d.ts.map +1 -0
- package/dist/src/include.js +1692 -0
- package/dist/src/include.js.map +1 -0
- package/dist/src/launchvocab.d.ts +36 -0
- package/dist/src/launchvocab.d.ts.map +1 -0
- package/dist/src/launchvocab.js +59 -0
- package/dist/src/launchvocab.js.map +1 -0
- package/dist/src/ledgercarry.d.ts +24 -0
- package/dist/src/ledgercarry.d.ts.map +1 -0
- package/dist/src/ledgercarry.js +109 -0
- package/dist/src/ledgercarry.js.map +1 -0
- package/dist/src/lensids.d.ts +7 -0
- package/dist/src/lensids.d.ts.map +1 -0
- package/dist/src/lensids.js +53 -0
- package/dist/src/lensids.js.map +1 -0
- package/dist/src/lensplanning.d.ts +8 -0
- package/dist/src/lensplanning.d.ts.map +1 -0
- package/dist/src/lensplanning.js +126 -0
- package/dist/src/lensplanning.js.map +1 -0
- package/dist/src/lensresult.d.ts +94 -0
- package/dist/src/lensresult.d.ts.map +1 -0
- package/dist/src/lensresult.js +162 -0
- package/dist/src/lensresult.js.map +1 -0
- package/dist/src/lenstuning.d.ts +97 -0
- package/dist/src/lenstuning.d.ts.map +1 -0
- package/dist/src/lenstuning.js +326 -0
- package/dist/src/lenstuning.js.map +1 -0
- package/dist/src/lintconfig.d.ts +31 -0
- package/dist/src/lintconfig.d.ts.map +1 -0
- package/dist/src/lintconfig.js +543 -0
- package/dist/src/lintconfig.js.map +1 -0
- package/dist/src/live/events.d.ts +188 -0
- package/dist/src/live/events.d.ts.map +1 -0
- package/dist/src/live/events.js +136 -0
- package/dist/src/live/events.js.map +1 -0
- package/dist/src/live/writer.d.ts +54 -0
- package/dist/src/live/writer.d.ts.map +1 -0
- package/dist/src/live/writer.js +516 -0
- package/dist/src/live/writer.js.map +1 -0
- package/dist/src/localreview.d.ts +128 -0
- package/dist/src/localreview.d.ts.map +1 -0
- package/dist/src/localreview.js +426 -0
- package/dist/src/localreview.js.map +1 -0
- package/dist/src/loosenedtests.d.ts +13 -0
- package/dist/src/loosenedtests.d.ts.map +1 -0
- package/dist/src/loosenedtests.js +188 -0
- package/dist/src/loosenedtests.js.map +1 -0
- package/dist/src/memoryport.d.ts +264 -0
- package/dist/src/memoryport.d.ts.map +1 -0
- package/dist/src/memoryport.js +445 -0
- package/dist/src/memoryport.js.map +1 -0
- package/dist/src/migrations.d.ts +106 -0
- package/dist/src/migrations.d.ts.map +1 -0
- package/dist/src/migrations.js +373 -0
- package/dist/src/migrations.js.map +1 -0
- package/dist/src/oneshot.d.ts +12 -0
- package/dist/src/oneshot.d.ts.map +1 -0
- package/dist/src/oneshot.js +8 -0
- package/dist/src/oneshot.js.map +1 -0
- package/dist/src/packing.d.ts +11 -0
- package/dist/src/packing.d.ts.map +1 -0
- package/dist/src/packing.js +31 -0
- package/dist/src/packing.js.map +1 -0
- package/dist/src/passes.d.ts +16 -0
- package/dist/src/passes.d.ts.map +1 -0
- package/dist/src/passes.js +104 -0
- package/dist/src/passes.js.map +1 -0
- package/dist/src/passtasks.d.ts +68 -0
- package/dist/src/passtasks.d.ts.map +1 -0
- package/dist/src/passtasks.js +360 -0
- package/dist/src/passtasks.js.map +1 -0
- package/dist/src/pathinside.d.ts +5 -0
- package/dist/src/pathinside.d.ts.map +1 -0
- package/dist/src/pathinside.js +9 -0
- package/dist/src/pathinside.js.map +1 -0
- package/dist/src/pibuiltins.d.ts +36 -0
- package/dist/src/pibuiltins.d.ts.map +1 -0
- package/dist/src/pibuiltins.js +83 -0
- package/dist/src/pibuiltins.js.map +1 -0
- package/dist/src/plankey.d.ts +4 -0
- package/dist/src/plankey.d.ts.map +1 -0
- package/dist/src/plankey.js +10 -0
- package/dist/src/plankey.js.map +1 -0
- package/dist/src/planner.d.ts +375 -0
- package/dist/src/planner.d.ts.map +1 -0
- package/dist/src/planner.js +722 -0
- package/dist/src/planner.js.map +1 -0
- package/dist/src/plugin/args.d.ts +19 -0
- package/dist/src/plugin/args.d.ts.map +1 -0
- package/dist/src/plugin/args.js +107 -0
- package/dist/src/plugin/args.js.map +1 -0
- package/dist/src/plugin/index.d.ts +3 -0
- package/dist/src/plugin/index.d.ts.map +1 -0
- package/dist/src/plugin/index.js +14 -0
- package/dist/src/plugin/index.js.map +1 -0
- package/dist/src/plugin/login.d.ts +39 -0
- package/dist/src/plugin/login.d.ts.map +1 -0
- package/dist/src/plugin/login.js +73 -0
- package/dist/src/plugin/login.js.map +1 -0
- package/dist/src/plugin/review.d.ts +27 -0
- package/dist/src/plugin/review.d.ts.map +1 -0
- package/dist/src/plugin/review.js +298 -0
- package/dist/src/plugin/review.js.map +1 -0
- package/dist/src/plugin/runner.d.ts +6 -0
- package/dist/src/plugin/runner.d.ts.map +1 -0
- package/dist/src/plugin/runner.js +65 -0
- package/dist/src/plugin/runner.js.map +1 -0
- package/dist/src/plugin/scan.d.ts +79 -0
- package/dist/src/plugin/scan.d.ts.map +1 -0
- package/dist/src/plugin/scan.js +348 -0
- package/dist/src/plugin/scan.js.map +1 -0
- package/dist/src/plugin/session.d.ts +56 -0
- package/dist/src/plugin/session.d.ts.map +1 -0
- package/dist/src/plugin/session.js +2 -0
- package/dist/src/plugin/session.js.map +1 -0
- package/dist/src/plugin/setup.d.ts +19 -0
- package/dist/src/plugin/setup.d.ts.map +1 -0
- package/dist/src/plugin/setup.js +142 -0
- package/dist/src/plugin/setup.js.map +1 -0
- package/dist/src/plugin/versiongate.d.ts +26 -0
- package/dist/src/plugin/versiongate.d.ts.map +1 -0
- package/dist/src/plugin/versiongate.js +83 -0
- package/dist/src/plugin/versiongate.js.map +1 -0
- package/dist/src/postingkey.d.ts +8 -0
- package/dist/src/postingkey.d.ts.map +1 -0
- package/dist/src/postingkey.js +25 -0
- package/dist/src/postingkey.js.map +1 -0
- package/dist/src/postingpolicy.d.ts +108 -0
- package/dist/src/postingpolicy.d.ts.map +1 -0
- package/dist/src/postingpolicy.js +341 -0
- package/dist/src/postingpolicy.js.map +1 -0
- package/dist/src/pr-identity.d.ts +3 -0
- package/dist/src/pr-identity.d.ts.map +1 -0
- package/dist/src/pr-identity.js +9 -0
- package/dist/src/pr-identity.js.map +1 -0
- package/dist/src/prdelta.d.ts +181 -0
- package/dist/src/prdelta.d.ts.map +1 -0
- package/dist/src/prdelta.js +501 -0
- package/dist/src/prdelta.js.map +1 -0
- package/dist/src/pricing.d.ts +94 -0
- package/dist/src/pricing.d.ts.map +1 -0
- package/dist/src/pricing.js +209 -0
- package/dist/src/pricing.js.map +1 -0
- package/dist/src/priorfindings.d.ts +167 -0
- package/dist/src/priorfindings.d.ts.map +1 -0
- package/dist/src/priorfindings.js +445 -0
- package/dist/src/priorfindings.js.map +1 -0
- package/dist/src/priortasks.d.ts +31 -0
- package/dist/src/priortasks.d.ts.map +1 -0
- package/dist/src/priortasks.js +119 -0
- package/dist/src/priortasks.js.map +1 -0
- package/dist/src/profilelookup.d.ts +59 -0
- package/dist/src/profilelookup.d.ts.map +1 -0
- package/dist/src/profilelookup.js +98 -0
- package/dist/src/profilelookup.js.map +1 -0
- package/dist/src/profileoverrides.d.ts +91 -0
- package/dist/src/profileoverrides.d.ts.map +1 -0
- package/dist/src/profileoverrides.js +313 -0
- package/dist/src/profileoverrides.js.map +1 -0
- package/dist/src/profiles.d.ts +144 -0
- package/dist/src/profiles.d.ts.map +1 -0
- package/dist/src/profiles.js +604 -0
- package/dist/src/profiles.js.map +1 -0
- package/dist/src/promptdoc.d.ts +3 -0
- package/dist/src/promptdoc.d.ts.map +1 -0
- package/dist/src/promptdoc.js +18 -0
- package/dist/src/promptdoc.js.map +1 -0
- package/dist/src/prtarget.d.ts +70 -0
- package/dist/src/prtarget.d.ts.map +1 -0
- package/dist/src/prtarget.js +181 -0
- package/dist/src/prtarget.js.map +1 -0
- package/dist/src/recheckorder.d.ts +32 -0
- package/dist/src/recheckorder.d.ts.map +1 -0
- package/dist/src/recheckorder.js +5 -0
- package/dist/src/recheckorder.js.map +1 -0
- package/dist/src/reviewapi.d.ts +207 -0
- package/dist/src/reviewapi.d.ts.map +1 -0
- package/dist/src/reviewapi.js +939 -0
- package/dist/src/reviewapi.js.map +1 -0
- package/dist/src/reviewbotfindings.d.ts +33 -0
- package/dist/src/reviewbotfindings.d.ts.map +1 -0
- package/dist/src/reviewbotfindings.js +80 -0
- package/dist/src/reviewbotfindings.js.map +1 -0
- package/dist/src/reviewconfig.d.ts +741 -0
- package/dist/src/reviewconfig.d.ts.map +1 -0
- package/dist/src/reviewconfig.js +797 -0
- package/dist/src/reviewconfig.js.map +1 -0
- package/dist/src/reviewdelta.d.ts +51 -0
- package/dist/src/reviewdelta.d.ts.map +1 -0
- package/dist/src/reviewdelta.js +119 -0
- package/dist/src/reviewdelta.js.map +1 -0
- package/dist/src/reviewdest.d.ts +86 -0
- package/dist/src/reviewdest.d.ts.map +1 -0
- package/dist/src/reviewdest.js +142 -0
- package/dist/src/reviewdest.js.map +1 -0
- package/dist/src/reviewerstub.d.ts +12 -0
- package/dist/src/reviewerstub.d.ts.map +1 -0
- package/dist/src/reviewerstub.js +28 -0
- package/dist/src/reviewerstub.js.map +1 -0
- package/dist/src/reviewhost.d.ts +58 -0
- package/dist/src/reviewhost.d.ts.map +1 -0
- package/dist/src/reviewhost.js +135 -0
- package/dist/src/reviewhost.js.map +1 -0
- package/dist/src/reviewpost.d.ts +79 -0
- package/dist/src/reviewpost.d.ts.map +1 -0
- package/dist/src/reviewpost.js +233 -0
- package/dist/src/reviewpost.js.map +1 -0
- package/dist/src/reviewrender.d.ts +154 -0
- package/dist/src/reviewrender.d.ts.map +1 -0
- package/dist/src/reviewrender.js +480 -0
- package/dist/src/reviewrender.js.map +1 -0
- package/dist/src/reviewstate.d.ts +62 -0
- package/dist/src/reviewstate.d.ts.map +1 -0
- package/dist/src/reviewstate.js +167 -0
- package/dist/src/reviewstate.js.map +1 -0
- package/dist/src/reviewstore.d.ts +17 -0
- package/dist/src/reviewstore.d.ts.map +1 -0
- package/dist/src/reviewstore.js +105 -0
- package/dist/src/reviewstore.js.map +1 -0
- package/dist/src/round-progress.d.ts +120 -0
- package/dist/src/round-progress.d.ts.map +1 -0
- package/dist/src/round-progress.js +172 -0
- package/dist/src/round-progress.js.map +1 -0
- package/dist/src/round-stage-deadlines.d.ts +12 -0
- package/dist/src/round-stage-deadlines.d.ts.map +1 -0
- package/dist/src/round-stage-deadlines.js +10 -0
- package/dist/src/round-stage-deadlines.js.map +1 -0
- package/dist/src/session-command.d.ts +19 -0
- package/dist/src/session-command.d.ts.map +1 -0
- package/dist/src/session-command.js +20 -0
- package/dist/src/session-command.js.map +1 -0
- package/dist/src/settledread.d.ts +61 -0
- package/dist/src/settledread.d.ts.map +1 -0
- package/dist/src/settledread.js +135 -0
- package/dist/src/settledread.js.map +1 -0
- package/dist/src/severity.d.ts +167 -0
- package/dist/src/severity.d.ts.map +1 -0
- package/dist/src/severity.js +364 -0
- package/dist/src/severity.js.map +1 -0
- package/dist/src/severityrank.d.ts +8 -0
- package/dist/src/severityrank.d.ts.map +1 -0
- package/dist/src/severityrank.js +16 -0
- package/dist/src/severityrank.js.map +1 -0
- package/dist/src/standing-review.d.ts +45 -0
- package/dist/src/standing-review.d.ts.map +1 -0
- package/dist/src/standing-review.js +43 -0
- package/dist/src/standing-review.js.map +1 -0
- package/dist/src/storerows.d.ts +225 -0
- package/dist/src/storerows.d.ts.map +1 -0
- package/dist/src/storerows.js +7 -0
- package/dist/src/storerows.js.map +1 -0
- package/dist/src/styleguide.d.ts +25 -0
- package/dist/src/styleguide.d.ts.map +1 -0
- package/dist/src/styleguide.js +272 -0
- package/dist/src/styleguide.js.map +1 -0
- package/dist/src/sweepstatus.d.ts +42 -0
- package/dist/src/sweepstatus.d.ts.map +1 -0
- package/dist/src/sweepstatus.js +97 -0
- package/dist/src/sweepstatus.js.map +1 -0
- package/dist/src/templates.d.ts +243 -0
- package/dist/src/templates.d.ts.map +1 -0
- package/dist/src/templates.js +847 -0
- package/dist/src/templates.js.map +1 -0
- package/dist/src/types.d.ts +639 -0
- package/dist/src/types.d.ts.map +1 -0
- package/dist/src/types.js +90 -0
- package/dist/src/types.js.map +1 -0
- package/dist/src/unifieddiff.d.ts +22 -0
- package/dist/src/unifieddiff.d.ts.map +1 -0
- package/dist/src/unifieddiff.js +176 -0
- package/dist/src/unifieddiff.js.map +1 -0
- package/dist/src/yieldloop.d.ts +2 -0
- package/dist/src/yieldloop.d.ts.map +1 -0
- package/dist/src/yieldloop.js +14 -0
- package/dist/src/yieldloop.js.map +1 -0
- package/package.json +60 -4
package/LICENSE
ADDED
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Quickchat AI
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
|
22
|
+
|
|
23
|
+
|
package/README.md
CHANGED
|
@@ -1,3 +1,76 @@
|
|
|
1
|
-
#
|
|
1
|
+
# QuickReview for pi
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
The QuickReview code reviewer as a pi package: the same review core the
|
|
4
|
+
QuickReview bot runs, in your own pi session.
|
|
5
|
+
|
|
6
|
+
```sh
|
|
7
|
+
pi install npm:@quickchatai/pi-quickreview
|
|
8
|
+
```
|
|
9
|
+
|
|
10
|
+
## Commands
|
|
11
|
+
|
|
12
|
+
- `/review` reviews the current branch against its base. `/review 123` (or a
|
|
13
|
+
pull request URL) reviews a PR, and `/review --uncommitted` the uncommitted
|
|
14
|
+
tree. `--preview` shows the plan and the price without running anything.
|
|
15
|
+
The result is shown in the session, saved as markdown and JSON, or posted
|
|
16
|
+
to the PR as a comment-only review (`--to pr`); pi asks each time, unless
|
|
17
|
+
you keep an answer as the repo's default.
|
|
18
|
+
- `/scan` scans the whole repo for defects, priced first and started only on
|
|
19
|
+
your yes. It runs the `qcr` CLI on your machine; `--sandbox docker` runs it
|
|
20
|
+
in the scan sandbox instead.
|
|
21
|
+
- `/selfimprove` scans the repo, then hands the findings to this session's
|
|
22
|
+
agent with a fix loop: triage, fix with tests, review, and a re-scan of
|
|
23
|
+
what changed.
|
|
24
|
+
- `/qcr-setup` checks the pi version, the login, git, GitHub access for PR
|
|
25
|
+
targets and the `qcr` CLI, and offers to install `qcr`
|
|
26
|
+
(`npm i -g @quickchatai/quickreview`).
|
|
27
|
+
|
|
28
|
+
## Which pi
|
|
29
|
+
|
|
30
|
+
The package declares `^1.4.0` for pi (`peerDependencies`): pi 1.4.0 and any
|
|
31
|
+
later 1.x. At load the plugin reads the running pi's version, and outside
|
|
32
|
+
that range it registers no command at all and says why, once. A review
|
|
33
|
+
engine written against one pi's SDK never half-runs on another. Only pi
|
|
34
|
+
versions the plugin's offline canaries ran on belong in the range.
|
|
35
|
+
|
|
36
|
+
The `qcr` CLI (`@quickchatai/quickreview`) and the QuickReview image pin pi
|
|
37
|
+
exactly instead; `qcr pi` starts that pinned pi with this plugin preloaded.
|
|
38
|
+
|
|
39
|
+
## What it needs
|
|
40
|
+
|
|
41
|
+
- pi in the range above.
|
|
42
|
+
- A pi login for the review's models (`/login` in pi). The review borrows
|
|
43
|
+
it: pi refreshes it when needed, and the review only ever reads a copy.
|
|
44
|
+
An API key for another provider is not used in its place: with no login
|
|
45
|
+
for the review's provider, `/review` stops and names `/login`.
|
|
46
|
+
- For a PR: the App when a qcr install configures one, else `GITHUB_TOKEN`,
|
|
47
|
+
`GH_TOKEN` or `gh auth login`, in that order.
|
|
48
|
+
- For posting (`--to pr`): a qcr config with `dry_run = false`. The shipped
|
|
49
|
+
defaults keep `dry_run` on, and then `/review` refuses to post and says so.
|
|
50
|
+
|
|
51
|
+
## What it never does
|
|
52
|
+
|
|
53
|
+
- The review never writes to your checkout: it reads the tree as it is.
|
|
54
|
+
(`/selfimprove`'s fixes are made by your own session's agent, under your
|
|
55
|
+
pi's own tools and permissions, not by the review.)
|
|
56
|
+
- The review never runs your code, tests or app: it reads code and CI.
|
|
57
|
+
- It never posts unless you choose `--to pr`, and then it posts one
|
|
58
|
+
comment-only review through the same mutation gate the bot uses. It never
|
|
59
|
+
approves, requests changes or dismisses a review.
|
|
60
|
+
- It never refreshes your login itself, and never hands a token to the
|
|
61
|
+
model's tools.
|
|
62
|
+
- It never gives your session a tool. The review's lens passes run in their
|
|
63
|
+
own sessions, with none of your pi extensions, skills or settings, and
|
|
64
|
+
your session only sees the result.
|
|
65
|
+
- It never sets or flips `dry_run`.
|
|
66
|
+
- It never starts `claude`.
|
|
67
|
+
|
|
68
|
+
## What ships in the package
|
|
69
|
+
|
|
70
|
+
The compiled review core and the plugin (`dist/`), and under `assets/` the
|
|
71
|
+
data the core reads: the agents, prompts and seeds, the schemas, the
|
|
72
|
+
profiles and the shipped config defaults. `assets/` is copied from the
|
|
73
|
+
repository at pack time and checked file by file against its source, so the
|
|
74
|
+
prompts in the package are byte-identical to the ones the bot runs. They sit
|
|
75
|
+
under `assets/`, not at the package root, so pi never offers them as your
|
|
76
|
+
slash commands.
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: pass-abstraction
|
|
3
|
+
description: Abstraction review pass — are the functions, types, interfaces and parameters this change introduces or reshapes drawn at the right level for their job? Mixed levels, leaky or missing abstractions, speculative generality, contracts that do not say what they guarantee. Capped at P2.
|
|
4
|
+
tools: read, bash, grep
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
{{include:prompts/pass-common.md}}
|
|
8
|
+
|
|
9
|
+
# Lens: abstraction level
|
|
10
|
+
|
|
11
|
+
Apply to: the BOUNDARIES this change draws or moves — the functions, classes,
|
|
12
|
+
types, interfaces, parameters and return values it introduces or reshapes —
|
|
13
|
+
judged by whether each sits at the right level of abstraction for its job and
|
|
14
|
+
for the callers that use it. (Where code lives is `pass-placement`; whether
|
|
15
|
+
it could be less code is `pass-simplicity`; this lens asks whether the
|
|
16
|
+
boundaries and contracts are at the right level.)
|
|
17
|
+
|
|
18
|
+
## Anchor on the callers and the repo
|
|
19
|
+
|
|
20
|
+
An abstraction is only wrong in terms of what it costs its users. Every
|
|
21
|
+
finding cites the evidence: the call sites that have to know an internal, the
|
|
22
|
+
flag each caller has to pass, the three places that re-assemble the same
|
|
23
|
+
parameter bundle, the repo's existing abstraction for the same concept that
|
|
24
|
+
this one ignores — file and line.
|
|
25
|
+
|
|
26
|
+
## What to look for
|
|
27
|
+
|
|
28
|
+
- **Mixed levels in one unit.** A function that interleaves high-level
|
|
29
|
+
orchestration (what happens) with low-level mechanics (byte offsets, SQL
|
|
30
|
+
strings, retry arithmetic) so neither reads clearly — name the seam that
|
|
31
|
+
splits them.
|
|
32
|
+
- **Leaky abstractions.** A new interface that exposes its implementation:
|
|
33
|
+
callers receive raw rows, library exceptions, internal ids, or have to call
|
|
34
|
+
methods in a particular order to use it correctly.
|
|
35
|
+
- **Missing abstractions.** The same group of values passed together
|
|
36
|
+
everywhere; a primitive (string, int, dict) standing in for a concept with
|
|
37
|
+
rules; a boolean flag parameter selecting between two behaviours at each
|
|
38
|
+
call site; stringly-typed states where the repo models the concept.
|
|
39
|
+
- **Wrong generality.** Speculative generic machinery — a strategy, registry,
|
|
40
|
+
plugin point, config option — with one implementation and no second in
|
|
41
|
+
sight; or the reverse, a one-off special case bolted on where the repo's
|
|
42
|
+
own pattern is general.
|
|
43
|
+
- **Contracts that do not say what they guarantee.** A signature where
|
|
44
|
+
everything is optional or `any`, a return value whose absence means three
|
|
45
|
+
different things, a function whose name promises a level (a "get") while
|
|
46
|
+
doing work at another (a network call, a write).
|
|
47
|
+
|
|
48
|
+
## Findings give the better boundary
|
|
49
|
+
|
|
50
|
+
A bare "this is at the wrong level" is noise. Name the boundary that fits —
|
|
51
|
+
the function to split out, the type to introduce, the parameter to drop — and
|
|
52
|
+
what it buys the callers you cited. A remedy larger than the PR is a design
|
|
53
|
+
objection, not a merge blocker: say so.
|
|
54
|
+
|
|
55
|
+
{{include:prompts/pass-quality-common.md}}
|
|
56
|
+
|
|
57
|
+
## Severity is capped at P2
|
|
58
|
+
|
|
59
|
+
A misdrawn boundary that works is structural debt: every finding from this
|
|
60
|
+
lens is `P2` at most, and `P2` only when the cited callers are already paying
|
|
61
|
+
for it in this change; otherwise `P3`.
|
|
62
|
+
|
|
63
|
+
`NONE` is the correct output when the change's boundaries fit their job —
|
|
64
|
+
most changes.
|
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: pass-ask-human
|
|
3
|
+
description: Ask-your-human review pass — added on demand when the session suspects a question whose answer lives outside the repo. Every finding is a question addressed to the PR author's AI implementer, telling it to put the question to a person rather than answer it itself. It may block only when it names the failure under the bad answer.
|
|
4
|
+
tools: read, bash, grep
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
{{include:prompts/pass-common.md}}
|
|
8
|
+
|
|
9
|
+
# Lens: ask your human
|
|
10
|
+
|
|
11
|
+
Apply to: **questions this PR raises whose answer is not in the repository** —
|
|
12
|
+
product intent, a decision taken months ago in a conversation nobody wrote
|
|
13
|
+
down, whether this thing should exist at all, and why the change was needed
|
|
14
|
+
when the PR text never says. The addressee of every finding you write is the
|
|
15
|
+
**AI implementer that wrote this PR**, and the instruction to it is always the
|
|
16
|
+
same: *do not answer this yourself; put it to the person you are working for
|
|
17
|
+
and bring their answer back to this thread.*
|
|
18
|
+
|
|
19
|
+
These are questions human reviewers ask and AI reviewers rarely do — for
|
|
20
|
+
example *"Why do we guard this shortcut here and not in the other shortcuts?"*.
|
|
21
|
+
Each is answerable in a sentence by a person who was there, and by nobody else.
|
|
22
|
+
|
|
23
|
+
## The trigger: the answer is NOT in the repo
|
|
24
|
+
|
|
25
|
+
**Ask only what the implementer cannot answer by reading.** It wrote this
|
|
26
|
+
code. It knows why it named something `temp`, why the helper is in that file,
|
|
27
|
+
what the branch is for. Sending it to a human for those is pure noise, and
|
|
28
|
+
round-trip noise is the cost this whole review system is tuned against.
|
|
29
|
+
|
|
30
|
+
You may raise a finding only when the answer lives in one of these three
|
|
31
|
+
places, and you say which:
|
|
32
|
+
|
|
33
|
+
1. **Outside the diff and outside the implementer's own prompt** — product
|
|
34
|
+
intent, a decision made months ago, a conversation it was not in, a
|
|
35
|
+
convention nobody wrote down. The archetype: *"what happened to our
|
|
36
|
+
discussion about reusing the existing validation?"*
|
|
37
|
+
2. **Above the implementation** — should this exist at all, is this the right
|
|
38
|
+
shape for the product, is this component the right thing to be building.
|
|
39
|
+
Questions that challenge the high-level intention rather than the code.
|
|
40
|
+
3. **Why the change was necessary**, when the spec and the PR description do
|
|
41
|
+
not make it clear. (When the PR body DOES say and the diff disagrees with
|
|
42
|
+
it, that is `pass-intent`'s finding, not yours — see the seam below.)
|
|
43
|
+
|
|
44
|
+
Before you emit anything, run the falsifier: **could a careful reader answer
|
|
45
|
+
this from the repository at the pinned sha?** Grep for it. Read the caller,
|
|
46
|
+
the settings module, the sibling implementation, the test, the docs, the
|
|
47
|
+
`CLAUDE.md`/`AGENTS.md` of the reviewed repo. If the answer is there, the
|
|
48
|
+
question is dead — do not emit it, and do not soften it into "worth
|
|
49
|
+
confirming". Say in `evidence` what you searched and what you found, so the
|
|
50
|
+
kill is auditable.
|
|
51
|
+
|
|
52
|
+
`NONE` is a perfectly ordinary output, and on most PRs it is the right one.
|
|
53
|
+
|
|
54
|
+
## The tag: every finding opens with `[ask your human]`
|
|
55
|
+
|
|
56
|
+
The first line of every finding body you return is exactly:
|
|
57
|
+
|
|
58
|
+
```
|
|
59
|
+
[ask your human] <the question, in one sentence>
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
That marker is a routing instruction, not decoration: the reviewed repo's
|
|
63
|
+
agent directives tell the implementer that a comment carrying it must be put
|
|
64
|
+
to a human before it is answered. Never abbreviate it, never translate it,
|
|
65
|
+
never merge it with another tag's wording.
|
|
66
|
+
|
|
67
|
+
**It is NOT the `[check this]` tag and never substitutes for one.**
|
|
68
|
+
`[check this]` means *"a human reviewer should verify this before merge"* and
|
|
69
|
+
its threads are structurally human-resolve-only. Yours means *"implementer:
|
|
70
|
+
go ask, then answer here"* — the author closes the thread once the human's
|
|
71
|
+
answer is in it. Two different addressees, two different tags; do not blur
|
|
72
|
+
them, and never put both on one comment.
|
|
73
|
+
|
|
74
|
+
Write the question the way a colleague would ask it: short, specific, naming
|
|
75
|
+
the thing you are asking about. Then, on the next line, say in one clause
|
|
76
|
+
**what you already checked** so the reader knows this is not laziness — *"not
|
|
77
|
+
in the PR body, and nothing in `app/validation/` matches the shape"*.
|
|
78
|
+
|
|
79
|
+
<!-- RATIFIED named-defect-bar — do not edit; owner only -->
|
|
80
|
+
## Severity: full scale, but a blocker must NAME THE DEFECT
|
|
81
|
+
|
|
82
|
+
This lens may raise a finding at any severity, **but a finding that would post
|
|
83
|
+
as a `[blocker]` must state the concrete failure that follows from the wrong
|
|
84
|
+
answer.** That is the whole bar and it is not negotiable:
|
|
85
|
+
|
|
86
|
+
- **Forbidden**: *"I do not know what you meant here, so I am blocking."*
|
|
87
|
+
Uncertainty is not a defect. A felt doubt with no named consequence is a
|
|
88
|
+
`P3` question at most, whatever it is about.
|
|
89
|
+
- **Allowed**: *"If you meant X, this drops writes during the deploy window —
|
|
90
|
+
and the code reads like you meant X."* That is an ordinary conditional
|
|
91
|
+
finding that happens to be shaped as a question, and it carries the severity
|
|
92
|
+
its named failure deserves.
|
|
93
|
+
|
|
94
|
+
So every `P0`–`P2` finding from this lens contains, in its `detail`: the
|
|
95
|
+
answer you believe was assumed, the **specific** thing that breaks if that
|
|
96
|
+
assumption is wrong, and who or what it breaks for. If you cannot write that
|
|
97
|
+
sentence, you do not have a blocker — you have a question, and a question is
|
|
98
|
+
a fine thing to return.
|
|
99
|
+
|
|
100
|
+
The blocker bar has not moved: this lens blocks on a named failure exactly
|
|
101
|
+
like every other lens, and never on doubt.
|
|
102
|
+
|
|
103
|
+
`pass-validate` enforces this from the other side and will cap you at `P3`
|
|
104
|
+
when the named failure is missing. Do not try to satisfy it with a sentence
|
|
105
|
+
that only sounds specific — an invented mechanism is worse than a question.
|
|
106
|
+
<!-- /RATIFIED named-defect-bar -->
|
|
107
|
+
|
|
108
|
+
## Stay inside your lens
|
|
109
|
+
|
|
110
|
+
- **`pass-intent`** owns the PR **title and body** read against the diff:
|
|
111
|
+
the answer *is* on the page and the diff contradicts it. Yours is the
|
|
112
|
+
opposite case — the answer is nowhere on the page, including where the PR
|
|
113
|
+
text is silent about *why*. If you find yourself quoting the PR body to
|
|
114
|
+
show the diff diverges from it, that is an intent finding; leave it there.
|
|
115
|
+
- A defect you can establish by reading belongs to the lens that owns it, at
|
|
116
|
+
that lens's severity: say the bug as a bug, even where a question would
|
|
117
|
+
feel politer.
|
|
118
|
+
- Placement and shape arguments you can settle from the code belong to
|
|
119
|
+
`pass-placement` / `pass-simplicity`. Bring them here only when the
|
|
120
|
+
deciding fact is a product decision that is not written down anywhere.
|
|
121
|
+
- Ask only questions whose answer you have not already decided: a question
|
|
122
|
+
whose answer is a rewrite you already have in mind is a finding about what
|
|
123
|
+
must hold. The remedy-size rule is unchanged: state what must hold, not
|
|
124
|
+
the rewrite.
|
|
125
|
+
|
|
126
|
+
## Volume is the failure mode
|
|
127
|
+
|
|
128
|
+
A lens whose entire output is questions can produce a wall of threads and
|
|
129
|
+
look busy while achieving nothing: unanswered questions are the common
|
|
130
|
+
outcome. **Two or three questions is a full
|
|
131
|
+
round's output for this lens; more than that means the bar slipped.** Rank
|
|
132
|
+
your candidates and return only the ones whose answer would change what
|
|
133
|
+
happens to this PR — if the answer either way leaves the code as it is, the
|
|
134
|
+
question was never worth a round trip.
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: pass-backcompat
|
|
3
|
+
description: Backward-compatibility review pass — what breaks in the deploy window, when old and new code run together and old clients, in-flight messages, and persisted state are still live? Findings name the protection.
|
|
4
|
+
tools: read, bash, grep
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
{{include:prompts/pass-common.md}}
|
|
8
|
+
|
|
9
|
+
# Lens: backcompat
|
|
10
|
+
|
|
11
|
+
Apply to: the deploy window — the interval right after this change ships in
|
|
12
|
+
which BOTH versions are live at once. Many pods roll one at a time; browsers
|
|
13
|
+
hold yesterday's cached bundle; mobile clients update weeks later; queues
|
|
14
|
+
hold messages enqueued by old code; caches, sessions, and serialized columns
|
|
15
|
+
hold old-shape state. The question is always concrete: *in that window, what
|
|
16
|
+
breaks or silently misbehaves — and what protection does this PR need?*
|
|
17
|
+
|
|
18
|
+
<!-- RATIFIED lens-boundaries — do not edit; owner only -->
|
|
19
|
+
## Boundaries — do not duplicate the other lenses
|
|
20
|
+
|
|
21
|
+
- Migration DDL and its rolling-deploy ordering belong to `pass-data-safety`.
|
|
22
|
+
- General endpoint behaviour changes and rollout widening belong to
|
|
23
|
+
`pass-prod-risk`.
|
|
24
|
+
- In-process state wiped by a restart belongs to `pass-statelessness`.
|
|
25
|
+
- Redelivery/at-least-once semantics belong to `pass-delivery`.
|
|
26
|
+
|
|
27
|
+
This lens owns the VERSION-SKEW mechanics those lenses do not: two versions
|
|
28
|
+
of the code, or a new version against old artifacts, interacting through a
|
|
29
|
+
shared surface. When a concern could anchor in two lenses, anchor it at the
|
|
30
|
+
skew consequence ("an old pod reads this and…") or leave it to the owning
|
|
31
|
+
lens.
|
|
32
|
+
<!-- /RATIFIED lens-boundaries -->
|
|
33
|
+
|
|
34
|
+
What to look for:
|
|
35
|
+
|
|
36
|
+
- a response or request shape change that deployed clients still parse: a
|
|
37
|
+
removed/renamed field, a type change, validation tightened so payloads old
|
|
38
|
+
clients send today start being rejected;
|
|
39
|
+
- a queue/task payload change against in-flight messages, BOTH directions:
|
|
40
|
+
messages enqueued by old code consumed by new (renamed kwargs, new
|
|
41
|
+
required arguments) and enqueued by new code consumed by a still-old
|
|
42
|
+
worker mid-rollout;
|
|
43
|
+
- persisted or serialized state read across versions: cache entries,
|
|
44
|
+
sessions, tokens, JSON/pickled columns — old-shape data hitting new read
|
|
45
|
+
paths, new-shape data hitting old read paths;
|
|
46
|
+
- ordering dependencies on config or feature flags: code that needs a flag,
|
|
47
|
+
setting, or external resource to exist BEFORE the deploy that ships it;
|
|
48
|
+
- removal or rename of an endpoint, template, or asset that a cached
|
|
49
|
+
frontend bundle or an unupdated mobile client still requests;
|
|
50
|
+
- an enum/status value added or removed where old code exhaustively matches
|
|
51
|
+
on the set.
|
|
52
|
+
|
|
53
|
+
<!-- RATIFIED full-severity — do not edit; owner only -->
|
|
54
|
+
## Findings name the protection
|
|
55
|
+
|
|
56
|
+
A skew finding without a remedy direction is half a finding. Name the
|
|
57
|
+
protection that closes the window: tolerant reader (ignore unknown, default
|
|
58
|
+
on absent), additive-then-remove in two deploys, a dual-read window, a flag
|
|
59
|
+
guard, a versioned payload. Severity is the ordinary scale — a break that
|
|
60
|
+
hits routine traffic mid-rollout is a real blocker. Reachability stays
|
|
61
|
+
honest in BOTH directions: a client that no longer exists anywhere is
|
|
62
|
+
`contrived`; skew on a routinely deployed many-pod service is `routine`, not
|
|
63
|
+
theoretical.
|
|
64
|
+
<!-- /RATIFIED full-severity -->
|
|
65
|
+
|
|
66
|
+
`NONE` is the correct output when every shared surface stays shape-stable —
|
|
67
|
+
common on internal-only changes.
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: pass-baseline
|
|
3
|
+
description: Always-on review pass — claimed invariants, correctness, tests, conventions, sibling PRs.
|
|
4
|
+
tools: read, bash, grep, glob
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
{{include:prompts/pass-common.md}}
|
|
8
|
+
|
|
9
|
+
# Lens: baseline (every PR)
|
|
10
|
+
|
|
11
|
+
**Claimed invariant — review the claim, not just the diff.** The PR's
|
|
12
|
+
title/body claim defines the review scope. If it claims a property
|
|
13
|
+
("retry-safe", "no message is dropped", "silences X", "fixes Y"), verify the
|
|
14
|
+
property holds across the *whole mechanism*, not just the changed lines:
|
|
15
|
+
enumerate the cases the claim covers and check each against the code. Two hard
|
|
16
|
+
rules: (a) **"pre-existing" is not a valid demotion** for a failure inside the
|
|
17
|
+
claimed failure class — a known drop path in a "nothing is dropped" PR is
|
|
18
|
+
in-scope by definition and is P1; (b) verify **efficacy**, not just safety —
|
|
19
|
+
confirm the mechanism can actually produce the claimed effect (trace the
|
|
20
|
+
arithmetic, the log levels, the control flow to the promised outcome). For
|
|
21
|
+
heuristic/fallback fixes, ask the root-cause question: *what upstream bug
|
|
22
|
+
creates this state, and where is it fixed?* — P3 question if the PR only
|
|
23
|
+
papers over it.
|
|
24
|
+
|
|
25
|
+
**Correctness** — Does the code do what it claims? Trace the logic. Edge cases
|
|
26
|
+
(empty/null/missing keys, concurrency)? Asynchronous code correct (no missing
|
|
27
|
+
awaits, no blocking calls on async paths)? Database access free of N+1
|
|
28
|
+
queries (a query per row where one query or a join would do)? When the diff
|
|
29
|
+
assembles text from fragments (LLM prompts, templates, user-facing messages),
|
|
30
|
+
**assemble a sample of the final string by reading** (join the literals
|
|
31
|
+
and format calls by hand) and inspect the seams —
|
|
32
|
+
whitespace, newlines, separators. No literal placeholder token may be
|
|
33
|
+
reachable in an outbound message without a guaranteed fallback (remember a
|
|
34
|
+
truthiness check is false on an empty string).
|
|
35
|
+
|
|
36
|
+
**Tests** — New features must have tests, in the shape the repo's existing
|
|
37
|
+
tests already use. Missing tests for a real feature is **P1**. Verify the
|
|
38
|
+
headline regression test actually **exercises the guarded branch**, by
|
|
39
|
+
reading: what value does the assertion compare, and is that value still
|
|
40
|
+
produced when the bug is present? (A helper that returns the key itself for a
|
|
41
|
+
missing translation makes `contains(key)` hold for any broken key.) Say which
|
|
42
|
+
value and why in `evidence`; whether the suite passes comes from CI. If the PR
|
|
43
|
+
edits a prompt, fallback template, or other string that a test pins verbatim
|
|
44
|
+
(an expected-value constant, a golden file, a snapshot), the pinned copy must
|
|
45
|
+
be updated in the same PR.
|
|
46
|
+
|
|
47
|
+
**Conventions** (from the repo's own agent-directive files — AGENTS.md,
|
|
48
|
+
CLAUDE.md and kin — and its contributing guide) — flag violations as **nit**
|
|
49
|
+
unless they cause a bug. Judge against the conventions the repo writes down,
|
|
50
|
+
never against another codebase's habits.
|
|
51
|
+
|
|
52
|
+
**Sibling / template PRs** — If the PR is part of a series ("Phase 2/3",
|
|
53
|
+
"Follow-up to …", or the same template applied to a different integration),
|
|
54
|
+
read the sibling PR's diff and compare. Any divergence in the security or
|
|
55
|
+
correctness contract is suspicious: either the sibling has a bug this PR fixes
|
|
56
|
+
(call it out so the sibling gets patched too), or this PR is regressing a
|
|
57
|
+
check the sibling intentionally got right.
|
|
58
|
+
|
|
59
|
+
**Re-review duty** — when the task string lists prior findings to verify,
|
|
60
|
+
check each **mechanically at the current head** first and report its true
|
|
61
|
+
state (`fixed@sha` with evidence, or still-open) before hunting new findings.
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: pass-behaviour-delta
|
|
3
|
+
description: Base-versus-head behaviour on every modified, rewrapped, replaced or deleted line of non-test code — what the old code did on the paths the PR did not set out to change, and whether the new code still does it.
|
|
4
|
+
tools: read, bash, grep
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
{{include:prompts/pass-common.md}}
|
|
8
|
+
|
|
9
|
+
# Lens: behaviour delta — what the old code did that the new code may not
|
|
10
|
+
|
|
11
|
+
Your task string names your FOCUS FILES. In them the PR does not only add
|
|
12
|
+
code: it MODIFIES, REWRAPS, REPLACES or DELETES lines that already ran. The
|
|
13
|
+
other passes read the PR for what it sets out to do. You read it for what it
|
|
14
|
+
STOPS doing by accident — on the paths the PR was not about.
|
|
15
|
+
|
|
16
|
+
How to work:
|
|
17
|
+
|
|
18
|
+
1. For each focus file, put the base and the head side by side:
|
|
19
|
+
`git -C <worktree> diff <merge-base> <head> -- <file>`, and read the old
|
|
20
|
+
version of each hunk with `git -C <worktree> show <merge-base>:<file>`.
|
|
21
|
+
2. Enumerate. Write ONE line in your notes for EVERY hunk that modifies,
|
|
22
|
+
rewraps, replaces or deletes existing non-test code (pure additions are
|
|
23
|
+
not yours):
|
|
24
|
+
`path:line — base did X on <path the PR did not target> — head: still does / no longer does / does Y`.
|
|
25
|
+
Do not skip a hunk because it looks mechanical. The enumeration is the
|
|
26
|
+
procedure: a hunk you did not write a line for is a hunk you did not check.
|
|
27
|
+
3. Look especially for these shapes:
|
|
28
|
+
- a safeguard that always ran now runs only sometimes — a condition
|
|
29
|
+
added around it, a conjunct dropped from it, a `DISTINCT`, a lock, a
|
|
30
|
+
validation or a retry made conditional;
|
|
31
|
+
- a removed or weakened guard: a deleted type, null, bounds or permission
|
|
32
|
+
check; an `isinstance`/`instanceof` that is gone; a narrowed condition (a
|
|
33
|
+
WIDENED predicate's consumers are `pass-widened`'s);
|
|
34
|
+
- a line rewrapped into a new branch whose value or argument also changed
|
|
35
|
+
(the old fallback replaced in the `else`);
|
|
36
|
+
- a replaced call whose semantics differ in a way the PR does not mention
|
|
37
|
+
(print vs println, a parse with a different precision or locale, a
|
|
38
|
+
hand-written retry replaced by a library call that does not retry);
|
|
39
|
+
- deleted handling: an encoder, a conversion, a `try`/`except` or `catch`
|
|
40
|
+
that turned an error into a value, a cleanup, an event emission;
|
|
41
|
+
- an error that was returned or raised is now logged and ignored, or the
|
|
42
|
+
reverse;
|
|
43
|
+
- a value normalised differently (nil becomes an empty map, an empty
|
|
44
|
+
string becomes absent) so a downstream check reads it differently;
|
|
45
|
+
- a container rewrite that changes order or drops duplicates (a list
|
|
46
|
+
rebuilt through a map or set);
|
|
47
|
+
- the first and the last output: what is emitted on the first call, before
|
|
48
|
+
anything is cached, and what is kept when output is truncated.
|
|
49
|
+
4. For each hunk where head no longer does what base did, follow the old
|
|
50
|
+
behaviour to who relied on it: callers, consumers, tests, the docs the PR
|
|
51
|
+
did not touch.
|
|
52
|
+
|
|
53
|
+
Reporting:
|
|
54
|
+
|
|
55
|
+
- A change the PR title or body states as its intent is not a finding.
|
|
56
|
+
- Report each lost behaviour with both sides — the base line (`<merge-base>`,
|
|
57
|
+
`path:line`) and the head line — the path the PR did not target, and who
|
|
58
|
+
depended on it.
|
|
59
|
+
- Default to a `question` naming the lost behaviour. It is a finding at its
|
|
60
|
+
own severity only when you show the path that now goes wrong is reachable
|
|
61
|
+
in ordinary use (an input any caller sends, a default configuration, the
|
|
62
|
+
first run).
|
|
63
|
+
- `NONE` is the right answer when every enumerated hunk keeps the old
|
|
64
|
+
behaviour on the paths the PR did not target.
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: pass-bounds
|
|
3
|
+
description: Resource and trust bounds pass (sub-lens of security) — loops whose exit another party controls, size checks after allocation, unvalidated remote data, unbounded growth, internal facts leaking out.
|
|
4
|
+
tools: read, bash, grep
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
{{include:prompts/pass-common.md}}
|
|
8
|
+
|
|
9
|
+
# Lens: resource and trust bounds (sub-lens of security)
|
|
10
|
+
|
|
11
|
+
Selected because the diff loops over, reads, allocates or parses data whose
|
|
12
|
+
size or shape another party controls — a remote server or peer, a client
|
|
13
|
+
request, a file on disk, a fetched payload. A faulty peer counts, not only a
|
|
14
|
+
malicious one: a buggy server that repeats a page hangs the client just the
|
|
15
|
+
same.
|
|
16
|
+
|
|
17
|
+
Answer each question for the code the PR adds or changes, with `file:line`
|
|
18
|
+
evidence:
|
|
19
|
+
|
|
20
|
+
1. **Loop termination.** For every loop whose exit depends on another party's
|
|
21
|
+
data (pagination, retry, streaming, cursor following): what happens if that
|
|
22
|
+
party returns the same page forever, a page that never shrinks, a cursor
|
|
23
|
+
that never advances, or a count that is wrong? Is there a bound on
|
|
24
|
+
iterations, on progress, or on total size?
|
|
25
|
+
2. **Size before allocation.** Is every size limit checked BEFORE the data is
|
|
26
|
+
read or allocated — not after the whole file or body is already in memory?
|
|
27
|
+
3. **Shape before use.** Is fetched or user-supplied data validated at runtime
|
|
28
|
+
before it is used as a typed value? A cast is not validation — trace what a
|
|
29
|
+
wrongly shaped payload does to the code that consumes it.
|
|
30
|
+
4. **Growth.** Does any collection grow with peer- or user-controlled input
|
|
31
|
+
and no cap — accumulated pages, cache keys, queued items?
|
|
32
|
+
5. **What leaks out.** Does the change send internal facts to clients —
|
|
33
|
+
hostnames, filesystem paths, environment values, stack traces, internal IDs
|
|
34
|
+
— in responses, headers or error messages?
|
|
35
|
+
|
|
36
|
+
`NONE` when each bound holds.
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: pass-claims
|
|
3
|
+
description: Claim-check pass (sub-lens of intent) — for each checkable claim in the PR title or body (fixes a warning, supports a version, prevents a failure), verifies that the diff actually makes it true, everywhere it applies.
|
|
4
|
+
tools: read, bash, grep
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
{{include:prompts/pass-common.md}}
|
|
8
|
+
|
|
9
|
+
# Lens: claim check (sub-lens of intent)
|
|
10
|
+
|
|
11
|
+
Selected because the PR's title or body makes a checkable claim: it fixes a
|
|
12
|
+
named warning or bug, supports named versions or devices, silences a
|
|
13
|
+
diagnostic, prevents a failure, stays compatible. The question is not whether
|
|
14
|
+
the claim is a good idea. It is whether THIS DIFF makes the claim true.
|
|
15
|
+
|
|
16
|
+
In your notes, one row per claim:
|
|
17
|
+
|
|
18
|
+
1. **The claim**, quoted from the title or body.
|
|
19
|
+
2. **The hunks that implement it** (`file:line`).
|
|
20
|
+
3. **Efficacy.** Does the claimed effect actually result? Trace it: after the
|
|
21
|
+
change, does the named warning still fire — check the types and conversions
|
|
22
|
+
in every rewritten expression, not just its shape; does the named failure
|
|
23
|
+
still happen on the path the PR describes; is a stated constraint ("only
|
|
24
|
+
version N and later", "only when X") ENFORCED in code, or only written
|
|
25
|
+
in the description?
|
|
26
|
+
4. **Coverage.** Does the fix reach every site of the same problem that the
|
|
27
|
+
claim covers, including sites the PR did not touch?
|
|
28
|
+
|
|
29
|
+
A row that fails efficacy or coverage is a finding at full severity — the PR
|
|
30
|
+
ships something other than what it says. A claim the code fully implements
|
|
31
|
+
produces no output. `NONE` when every claim holds.
|