AI Slop Code Risk Monitor

backnotprop/plannotator

SlopCodeMonitor badge for backnotprop/plannotator Adjusted legacy signal; badge bands: 25 / 50 / 75 (different from dashboard bands).

Annotate and review coding agent plans and code diffs visually, share with your team, send feedback to agents with one click.

2.2 Low pattern signal View on GitHub

Open-Source Code Quality, Security and Technical Debt Review

This report summarizes scanner evidence for backnotprop/plannotator, a TypeScript project with 9,792 GitHub stars. SynthScan examined 961,175 lines of code across 3886 source files, recording 1516 pattern matches distributed across 18 syntactic categories. The legacy adjusted pattern signal is 2.2 (Low pattern signal); it is not an authorship estimate.

Use the findings to ask whether maintainers can explain intent, verify dependencies, simplify unnecessary scaffolding, and focus review effort. Risk Payload v1 adds ownership, supply-chain, over-engineering, and review-effort vectors when available. These are prompts for human verification, not probabilities, security findings, or measured maintenance costs.

2.2
Adjusted Signal
2.2
Raw Pattern Score
100%
Time Factor
2026-10-31
Last Push
9.8K
Stars
TypeScript
Language
961.2K
Lines of Code
3.9K
Files
1.5K
Pattern Hits
2026-10-31
Scan Date
0.00
HC Hit Rate

Risk Review · Payload v1

Use each vector to guide manual verification of the underlying findings.

Payload schema: 1.0.0 · Engine: 2.0.0 · Scoring: heuristic-density-v1 · Scan date: 2026-10-31.

Cognitive Ownership Risk 6.9/100 · LOW

Can maintainers explain intent, assumptions, and trade-offs? 1288 finding(s).

Hallucinated Dependency & Supply Chain Risk 0.8/100 · LOW

Are imports declared and package/API names verified? 37 finding(s).

Agent Over-Engineering Ratio 7.5/100 · LOW

Are wrappers, guards, and repeated structures necessary? 1077 finding(s).

PR Review Velocity Impact 10.1/100 · LOW

Which changes need focused human review? 1516 finding(s).

What These Metrics Mean

Adjusted Signal
Legacy pattern score normalized per 1,000 scanned lines and multiplied by the repository-level time factor. It is not an estimate of AI authorship.
Raw Pattern Score
Sum of severity- and context-weighted pattern findings before applying the time factor.
Time Factor
A coarse multiplier based on repository last-push metadata. It does not identify when individual code was written.
Pattern Hits
Count of configured pattern findings. Review each location and surrounding code before acting.
HC Hit Rate
High- and critical-severity findings per scanned file. Severity is a configured detector weight, not proof of a vulnerability or authorship.
Lines / Files
Scan coverage denominators used by the legacy normalized score.

Pattern-Signal History

This chart tracks the legacy adjusted pattern score across scan runs. Changes can reflect source changes, scan coverage, or detector/scoring versions; they do not measure AI adoption or prove that a team refactored code. Compare runs only when their scoring versions are compatible. The dashed line tracks the raw pattern-hit count.

Severity Breakdown

Groups findings by configured severity weight. Severity is not a confidence estimate, security rating, or proof that a package is missing. Verify imports against the project's manifests and inspect each finding in its local design context.

CRITICAL 11HIGH 5MEDIUM 203LOW 1297

Directory Score Breakdown

This horizontal bar chart shows where configured pattern scores accumulate across directories. Treat the bars as locations to inspect, not as evidence of authorship or code quality. Use the file-level findings to decide whether a directory needs a focused ownership, dependency, complexity, or review check.

Pattern Findings

The scanner identified 1516 distinct pattern matches across 18 syntactic categories. Each entry below represents a discrete location in the source code where the engine recorded a detector match to inspect in context. Expand any category row to inspect the individual file paths, line numbers, code snippets, and the lexical context (CODE, COMMENT, or STRING) in which each match was detected.

Reading the findings table: The Severity column indicates the configured finding weight (CRITICAL / HIGH / MEDIUM / LOW). The Context column identifies whether the match occurred inside executable code, an inline comment, or a string literal — legacy comment-context matches receive a ×1.5 score weight. The ⚡ bolt icon marks clustered matches: three or more patterns within a 10-line window, each receiving an additional ×1.5 density multiplier under the legacy scoring model.

Hyper-Verbose Identifiers886 hits · 903 pts
SeverityFileLineSnippetContext
LOWtests/e2e/plan-lazy-chunk-failure.spec.ts129async function expectAppKeptWithFallback(page: Page, pageErrors: string[], message: string, action: string): Promise<voiCODE
LOWtests/e2e/inbox-compose-skill-picker.spec.ts226async function expectEscapeClosesPickerFirst(page: Page): Promise<void> {CODE
LOWtests/helpers/app-html.ts45export async function expectUncompressedLocalPage(pageUrl: string, html: string): Promise<void> {CODE
LOWscripts/install.test.ts4268function extractCmdClaudePluginCommand(): string {CODE
LOWscripts/install.test.ts4306function runWindowsClaudePluginUpdate(CODE
LOWscripts/install.sh1532function isManagedPlannotatorCommand(value) {CODE
LOWpackages/t3-code/reviews.ts24export function lastFinishedAssistantMessage(snapshot: T3ThreadRead, threadId: string): T3ThreadRead["items"][number] | CODE
LOWpackages/ui/webmcp/preference.ts41export function subscribeWebMcpToolsEnabled(listener: () => void): () => void {CODE
LOWpackages/ui/test-setup/commentSubmitKeys.ts60export function describeCommentSubmitKeys(CODE
LOWpackages/ui/test-setup/diagramSvg.ts34export function installInertDiagramSvgParser(): () => void {CODE
LOWpackages/ui/test-setup/bandIntersectionObserver.ts75export function installBandIntersectionObserver(): () => void {CODE
LOWpackages/ui/config/reviewView.ts72export function getPersistedReviewPanelView(): 'sections' | 'tree' | undefined {CODE
LOWpackages/ui/config/reviewView.ts104export function getProviderReviewDefaultDiffType(CODE
LOWpackages/ui/config/reviewView.ts114export function setProviderReviewDefaultDiffType(CODE
LOWpackages/ui/utils/vimHud.ts191export function isVimHudLegendGroupActive(CODE
LOW⚡packages/ui/utils/lookAndFeelAnnouncement.ts86export function planLookAnsweredElsewhere(): boolean | null {CODE
LOW⚡packages/ui/utils/lookAndFeelAnnouncement.ts91export function needsLookAndFeelAnnouncement(): boolean {CODE
LOW⚡packages/ui/utils/lookAndFeelAnnouncement.ts95export function markLookAndFeelChoiceResolved(): void {CODE
LOWpackages/ui/utils/serverSession.ts45export async function noteServerSessionMismatch(res: Response): Promise<boolean> {CODE
LOWpackages/ui/utils/serverSession.ts58export function markServerSessionReplaced(): void {CODE
LOWpackages/ui/utils/reviewAgentInstructions.ts14export function buildReviewAgentInstructions(origin: string): string {CODE
LOWpackages/ui/utils/skillCatalog.ts69export function resetSkillCatalogTransport(): void {CODE
LOWpackages/ui/utils/skillCatalog.ts91export function setSkillCatalogExportRegistration(on: boolean): void {CODE
LOWpackages/ui/utils/skillCatalog.ts187export function resetSkillContentTransport(): void {CODE
LOWpackages/ui/utils/skillCatalog.ts227export async function primeSkillContentsForExport(CODE
LOWpackages/ui/utils/mermaidTheme.ts427export function buildMermaidThemeVariables(CODE
LOWpackages/ui/utils/permissionMode.ts54export function getPermissionModeSettings(): PermissionModeSettings {CODE
LOWpackages/ui/utils/permissionMode.ts67export function savePermissionModeSettings(mode: PermissionMode): void {CODE
LOWpackages/ui/utils/annotateAgentInstructions.ts87export function buildAnnotateAgentInstructions(CODE
LOWpackages/ui/utils/annotateAgentInstructions.ts151export function resolveAnnotateInstructionsSurface(input: {CODE
LOWpackages/ui/utils/vimNavigation.ts89export function createInitialVimSelectionState(): { readonly phase: 'inactive' } {CODE
LOWpackages/ui/utils/vimNavigation.ts111function getPositionAtBlockBoundary(CODE
LOWpackages/ui/utils/vimNavigation.ts269export function createRangeBetweenTextPositions(CODE
LOWpackages/ui/utils/terminalToolsAnnouncement.ts15export function needsTerminalToolsAnnouncement(): boolean {CODE
LOWpackages/ui/utils/terminalToolsAnnouncement.ts19export function markTerminalToolsAnnouncementSeen(): void {CODE
LOWpackages/ui/utils/terminalToolsAnnouncement.ts66export function terminalToolsAnnouncementCanShow(CODE
LOWpackages/ui/utils/domSelection.ts61export function isDocumentKeyboardControl(target: EventTarget | null): boolean {CODE
LOWpackages/ui/utils/diagram-anchor.ts198function sequenceTargetFromElement(svg: Element, el: Element): DiagramTarget | null {CODE
LOWpackages/ui/utils/diagram-anchor-graphviz.ts71export function graphvizTargetFromElement(_svg: Element, el: Element): DiagramTarget | null {CODE
LOWpackages/ui/utils/annotationScope.ts23export function getAnnotationScopePreference(): AnnotationScope | null {CODE
LOWpackages/ui/utils/annotationScope.ts28export function setAnnotationScopePreference(scope: AnnotationScope): void {CODE
LOWpackages/ui/utils/annotationScope.ts86export function groupAnnotationsByDocument(CODE
LOWpackages/ui/utils/annotationScope.ts134export function buildAnnotationDocumentGroups(input: {CODE
LOWpackages/ui/utils/annotationScope.ts164export function resolveInitialAnnotationScope(input: {CODE
LOWpackages/ui/utils/inboxAnnouncement.ts23export function markInboxAnnouncementSeen(): void {CODE
LOWpackages/ui/utils/inboxAnnouncement.ts69export function inboxAnnouncementEligible(state: InboxAnnouncementGateState): boolean {CODE
LOWpackages/ui/utils/annotationHelpers.ts7export function getAnnotationCountBySection(CODE
LOWpackages/ui/utils/planDiffEngine.ts267function substituteQuotedFenceRuns(CODE
LOWpackages/ui/utils/aiProvider.ts46export function hasNonInterruptibleSession(providers: readonly { sessionBridge?: SessionBridgeInfo }[]): boolean {CODE
LOWpackages/ui/utils/aiProvider.ts86export function originHasDedicatedAIProvider(origin: Origin | null | undefined): boolean {CODE
LOWpackages/ui/utils/aiProvider.ts172export function resolveAIModelForProvider(CODE
LOWpackages/ui/utils/aiProvider.ts185export function resolveAIProviderSelection(options: {CODE
LOWpackages/ui/utils/blockTargeting.ts388export function createSemanticTargetRange(target: SemanticTarget): Range | null {CODE
LOWpackages/ui/utils/blockTargeting.ts395export function getSemanticTargetChildren(CODE
LOWpackages/ui/utils/blockTargeting.ts421export function findInitialSemanticTarget(CODE
LOWpackages/ui/utils/blockTargeting.ts500export function resolveSemanticTargetAtPoint(CODE
LOWpackages/ui/utils/askSessionAnnouncement.ts23export function needsAskSessionAnnouncement(): boolean {CODE
LOWpackages/ui/utils/askSessionAnnouncement.ts27export function markAskSessionAnnouncementSeen(): void {CODE
LOWpackages/ui/utils/askSessionAnnouncement.ts38export function askSessionAnnouncementPendingThisLoad(): boolean {CODE
LOWpackages/ui/utils/askSessionAnnouncement.ts97export function askSessionAnnouncementEligible(state: AskSessionAnnouncementGateState): boolean {CODE
826 more matches not shown…
Decorative Section Separators189 hits · 596 pts
SeverityFileLineSnippetContext
MEDIUMtests/never-touch-the-real-inbox.test.ts42// ── 1. The source scan ───────────────────────────────────────────────────────COMMENT
MEDIUMtests/never-touch-the-real-inbox.test.ts153// ── 2. The guards ────────────────────────────────────────────────────────────COMMENT
MEDIUMtests/bench-startup.sh22# ── Helpers ──────────────────────────────────────────────────────────────COMMENT
MEDIUMtests/bench-startup.sh88# ── Main ─────────────────────────────────────────────────────────────────COMMENT
MEDIUMtests/bench-startup.sh97# ── Scenario 1: No plugin (baseline) ─────────────────────────────────COMMENT
MEDIUMtests/bench-startup.sh116# ── Scenario 2: Published npm plugin ─────────────────────────────────COMMENT
MEDIUMtests/bench-startup.sh135# ── Scenario 3: Local optimized plugin ───────────────────────────────COMMENT
MEDIUMtests/bench-startup.sh158# ── Summary ──────────────────────────────────────────────────────────COMMENT
MEDIUM⚡tests/manual/local/test-sessions.sh101# -------------------------------------------------------COMMENT
MEDIUM⚡tests/manual/local/test-sessions.sh103# -------------------------------------------------------COMMENT
MEDIUM⚡tests/manual/local/test-sessions.sh118# -------------------------------------------------------COMMENT
MEDIUM⚡tests/manual/local/test-sessions.sh120# -------------------------------------------------------COMMENT
MEDIUM⚡tests/manual/local/test-sessions.sh127# -------------------------------------------------------COMMENT
MEDIUM⚡tests/manual/local/test-sessions.sh129# -------------------------------------------------------COMMENT
MEDIUM⚡tests/manual/local/test-sessions.sh168# -------------------------------------------------------COMMENT
MEDIUM⚡tests/manual/local/test-sessions.sh170# -------------------------------------------------------COMMENT
MEDIUM⚡tests/manual/local/test-sessions.sh197# -------------------------------------------------------COMMENT
MEDIUM⚡tests/manual/local/test-sessions.sh199# -------------------------------------------------------COMMENT
MEDIUM⚡tests/manual/local/test-sessions.sh226# -------------------------------------------------------COMMENT
MEDIUM⚡tests/manual/local/test-sessions.sh228# -------------------------------------------------------COMMENT
MEDIUM⚡tests/manual/local/test-sessions.sh261# -------------------------------------------------------COMMENT
MEDIUM⚡tests/manual/local/test-sessions.sh263# -------------------------------------------------------COMMENT
MEDIUM⚡tests/manual/local/test-sessions.sh324# -------------------------------------------------------COMMENT
MEDIUM⚡tests/manual/local/test-sessions.sh326# -------------------------------------------------------COMMENT
MEDIUMtests/manual/local/sandbox-opencode.sh1019# =============================================================================COMMENT
MEDIUMtests/manual/local/sandbox-opencode.sh1021# =============================================================================COMMENT
MEDIUM⚡tests/manual/path-detection/setup.sh59# ───────────────────────────────────────────────────COMMENT
MEDIUM⚡tests/manual/path-detection/setup.sh61# ───────────────────────────────────────────────────COMMENT
MEDIUMtests/manual/path-detection/setup.sh115# ───────────────────────────────────────────────────COMMENT
MEDIUMtests/manual/path-detection/setup.sh117# ───────────────────────────────────────────────────COMMENT
MEDIUMtests/manual/path-detection/setup.sh141# ───────────────────────────────────────────────────COMMENT
MEDIUMtests/manual/path-detection/setup.sh143# ───────────────────────────────────────────────────COMMENT
MEDIUMtests/manual/path-detection/setup.sh268# ───────────────────────────────────────────────────COMMENT
MEDIUMtests/manual/path-detection/setup.sh270# ───────────────────────────────────────────────────COMMENT
MEDIUMtests/manual/path-detection/setup.sh351# ───────────────────────────────────────────────────COMMENT
MEDIUMtests/manual/path-detection/setup.sh354# ───────────────────────────────────────────────────COMMENT
MEDIUMpackages/ui/utils/questionAnswers.ts99// ─────────────────────────── Panel + progress ───────────────────────────COMMENT
MEDIUMpackages/inbox/App.tsx3358 // ── The onboarding tour (approval "inbox-onboarding-tour") ──────────────COMMENT
MEDIUMpackages/inbox/decisionMode.test.tsx562// ─────────────────────────────── Review round ───────────────────────────────COMMENT
MEDIUMpackages/inbox/decisionMode.test.tsx831// ─────────────────────────────── Re-review ───────────────────────────────COMMENT
MEDIUMpackages/inbox/soundSettings.test.tsx181// ───────────────────────────── The hook, against a recording AudioContext ─────────────────────────────COMMENT
MEDIUMpackages/inbox/sound.ts25// ───────────────────────────── The sound ─────────────────────────────COMMENT
MEDIUMpackages/inbox/sound.ts111// ───────────────────────────── When it rings ─────────────────────────────COMMENT
MEDIUMpackages/inbox/sound.ts145// ───────────────────────────── Several tabs ─────────────────────────────COMMENT
MEDIUMpackages/inbox/sound.ts222// ───────────────────────────── The hook ─────────────────────────────COMMENT
MEDIUMpackages/inbox/decisions/model.ts309// ─────────────────────────────── Chips ───────────────────────────────COMMENT
MEDIUMpackages/inbox/decisions/model.ts408// ─────────────────────────────── Answers ───────────────────────────────COMMENT
MEDIUMpackages/inbox/components/AttachmentPane.tsx426 // ── Stepping (design record "inbox-attachment-stepping", v2) ──────────────COMMENT
MEDIUMpackages/inbox/components/AttachmentPane.tsx549 // ── Full screen (approval "inbox-one-fullscreen", Drawer) ─────────────────COMMENT
MEDIUMpackages/inbox/components/AttachmentPane.tsx1107 // ── Links inside an attached document (htmlLinks.ts) ─────────────────────COMMENT
MEDIUMpackages/inbox/components/Updates.tsx47// ───────────────────────────── The sidebar button ─────────────────────────────COMMENT
MEDIUMpackages/inbox/components/Updates.tsx126// ───────────────────────────── Dialogs ─────────────────────────────COMMENT
MEDIUMpackages/inbox/components/Updates.tsx502// ───────────────────────────── What's new ─────────────────────────────COMMENT
MEDIUMpackages/inbox/components/Updates.tsx740// ──────────────────────── Checking for updates is failing ────────────────────────COMMENT
MEDIUMpackages/inbox/components/Updates.tsx817// ───────────────────────────── Settings → General ─────────────────────────────COMMENT
MEDIUMpackages/inbox/components/Updates.tsx948// ───────────────────────────── Settings → About ─────────────────────────────COMMENT
MEDIUMpackages/inbox/components/Thread.tsx693 // ── Comments on the text (approval "inbox-message-comments") ──────────────COMMENT
MEDIUMpackages/inbox/components/Thread.tsx1378 // ── Folding (design record "Land", not in this repo) ──────────────────────COMMENT
MEDIUMpackages/inbox/tour/Tour.tsx84// ─────────────────────────── Loading the fixture ───────────────────────────COMMENT
MEDIUMpackages/inbox/tour/Tour.tsx225// ─────────────────────────── The tour bar ───────────────────────────COMMENT
129 more matches not shown…
Over-Commented Block315 hits · 306 pts
SeverityFileLineSnippetContext
LOWbunfig.toml1[install]COMMENT
LOW.gitleaks.toml21# world-readable, so their #key= fragments are not leaked secrets. The regex isCOMMENT
LOWtests/bunfig.toml1# Bun reads only the bunfig.toml in the directory `bun test` runs from, so theCOMMENT
LOWtests/entry-assets.test.ts81 },COMMENT
LOWtests/entry-assets.test.ts161 expect(read('packages/ui/components/DiagramBlock.tsx')).not.toMatch(staticImport('@viz-js/viz'));COMMENT
LOWtests/entry-assets.test.ts221 const eager = [...walk('packages/inbox'), ...walk('apps/inbox')].filter((path) => palette.test(read(path)));COMMENT
LOWtests/entry-assets.test.ts241 // 12 the plan editor loads the runtime lazily by policy, and an eagerCOMMENT
LOWtests/entry-assets.test.ts341 // could reach the same inlined blob through a different import specifier andCOMMENT
LOWtests/bench-startup.sh1#!/usr/bin/env bashCOMMENT
LOWtests/setup/feedback-archive-off.ts41// The Inbox publishes itself over the tailnet when this is on: a contributorCOMMENT
LOWtests/setup/feedback-archive-off.ts61// dropped by hand. A closed loopback port refuses at once ("Couldn't sendCOMMENT
LOWtests/manual/local/test-binary.sh1#!/bin/bashCOMMENT
LOWtests/manual/local/test-sessions.sh1#!/bin/bashCOMMENT
LOWtests/manual/local/test-jj-review.sh1#!/bin/bashCOMMENT
LOWtests/manual/local/sandbox-opencode-isolated.sh1#!/bin/bashCOMMENT
LOWtests/manual/local/test-worktree-review.sh1#!/bin/bashCOMMENT
LOWtests/manual/local/test-bulk-plans.sh1#!/bin/bashCOMMENT
LOWtests/manual/local/sandbox-opencode.sh1#!/bin/bashCOMMENT
LOWtests/manual/local/sandbox-opencode.sh21# --no-git Don't initialize git repo (tests non-git fallback)COMMENT
LOWtests/manual/local/sandbox-gemini.sh1#!/bin/bashCOMMENT
LOWtests/manual/local/test-hook.sh1#!/bin/bashCOMMENT
LOWtests/manual/local/sandbox-pi.sh1#!/bin/bashCOMMENT
LOWtests/manual/local/test-opencode-review.sh1#!/bin/bashCOMMENT
LOWtests/manual/local/test-external-annotations.sh1#!/bin/bashCOMMENT
LOWtests/manual/local/sandbox-codex.sh1#!/bin/bashCOMMENT
LOWtests/manual/local/test-codex-plan-review-e2e.sh1#!/bin/bashCOMMENT
LOWtests/manual/local/test-hook-2.sh1#!/bin/bashCOMMENT
LOWtests/manual/path-detection/setup.sh1#!/bin/bashCOMMENT
LOWtests/manual/path-detection/setup.sh21# │ ├── app/COMMENT
LOWtests/manual/path-detection/run-plan.sh1#!/bin/bashCOMMENT
LOWtests/manual/path-detection/run-annotate-out-of-tree.sh1#!/bin/bashCOMMENT
LOWspec/simulate.sh1#!/usr/bin/env bashCOMMENT
LOWscripts/install.test.ts421 // Config layer (M2): the skipInstall OBJECT is extracted first (awk,COMMENT
LOWscripts/install.test.ts581 test("install.ps1 selects native arm64 binary on ARM64 Windows", () => {COMMENT
LOWscripts/install.test.ts1241COMMENT
LOWscripts/install.test.ts1501 // install.cmdCOMMENT
LOWscripts/install.test.ts1621 expect(cmdScript).toContain('set "MIN_NUM=!MIN_ATTESTED_VERSION:~1!"');COMMENT
LOWscripts/install.test.ts1641 expect(cmdScript).toContain('if not "!TAG_NUM!"=="!TAG_NUM:-=!"');COMMENT
LOWscripts/install.test.ts1681 // to release.yml have no attestations. Running `gh attestation verify`COMMENT
LOWscripts/install.test.ts1901 test("all installers authenticate the api.github.com version-resolution call", () => {COMMENT
LOWscripts/install.test.ts1981COMMENT
LOWscripts/install.test.ts2141 // redirecting a native command's stderr underCOMMENT
LOWscripts/install.test.ts2201// stubbed curl/gh/git PATH. No network, no real agent CLI reachable. TheseCOMMENT
LOWscripts/install.test.ts3561// clone of this repo; installing or updating the plugin copies apps/hook fromCOMMENT
LOWscripts/install.test.ts4481 },COMMENT
LOWscripts/install.sh1#!/bin/bashCOMMENT
LOWscripts/install.sh41 *.*.*.*) return 1 ;;COMMENT
LOWscripts/install.sh61WITH_CALL_FLOW_FLAG=-1COMMENT
LOWscripts/install.sh81# writes nothing to that agent's home; it never removes an integration aCOMMENT
LOWscripts/install.sh461COMMENT
LOWscripts/install.sh481 # dotfiles, direnv) gets a 401 here and would break an install thatCOMMENT
LOWscripts/install.sh921 # Sigstore bundle anonymously and hand it to gh via --bundle. TheCOMMENT
LOWscripts/install.sh1601 fiCOMMENT
LOWscripts/install.sh1641 fiCOMMENT
LOWscripts/install.sh1881 rmdir "$OPENCODE_CACHE_DIR/npm/@plannotator" 2>/dev/null || trueCOMMENT
LOWscripts/install.sh2021}COMMENT
LOWscripts/install.sh2121 run_wizard=1COMMENT
LOWscripts/install.sh2361 echo "Qwen Code ${qwen_version} is older than ${QWEN_MIN_VERSION}, so nothing was installed for it. Update Qwen COMMENT
LOWscripts/install.sh2381# it as `if ! ( ... ); then` suppresses -e the same way. So the fetchCOMMENT
LOWscripts/install.sh2401 # real error is surfaced below so incompatibilities self-diagnose insteadCOMMENT
255 more matches not shown…
Hallucination Indicators11 hits · 125 pts
SeverityFileLineSnippetContext
CRITICALtests/e2e/surface.spec.ts125 try { window.top.webkit.messageHandlers.plannotatorSurface.postMessage({ v: 1, type: 'link', href: 'https://evil.exampCODE
CRITICALapps/opencode-plugin/commands.test.ts148 const logged = deps.client.app.log.mock.calls.map((c: any[]) => c[0]?.message ?? "").join("\n");CODE
CRITICAL⚡apps/opencode-plugin/commands.test.ts185 expect(deps.client.app.log.mock.calls.map((call: any[]) => call[0].message).join("\n")).toContain("does not exist");CODE
CRITICAL⚡apps/opencode-plugin/commands.test.ts187 expect(deps.client.tui.showToast.mock.calls.map((call: any[]) => call[0].body.message).join("\n")).toContain("does nCODE
CRITICAL⚡apps/opencode-plugin/commands.test.ts195 expect(deps.client.app.log.mock.calls.map((call: any[]) => call[0].message).join("\n")).toContain("please review my CODE
CRITICALapps/opencode-plugin/commands.test.ts320 const logged = deps.client.app.log.mock.calls.map(([entry]: [{ message: string }]) => entry.message).join("\n");CODE
CRITICALapps/opencode-plugin/commands.test.ts634 return deps.client.tui.showToast.mock.calls.map((call: any[]) => call[0].body.message);CODE
CRITICALapps/opencode-plugin/cli-bridge.test.ts48 const toasts = () => client.tui.showToast.mock.calls.map(([entry]) => entry.body.message).join("\n");CODE
CRITICALapps/opencode-plugin/cli-bridge.test.ts54 expect(client.app.log.mock.calls.map(([entry]) => entry.message).join("\n")).toContain("Update the Plannotator CLICODE
CRITICALapps/opencode-plugin/cli-bridge.test.ts67 expect(client.app.log.mock.calls.map(([entry]) => entry.message).join("\n")).toContain("Update the Plannotator CLICODE
CRITICALapps/opencode-plugin/cli-bridge.test.ts133 expect(client.app.log.mock.calls.map(([entry]) => entry.message).join("\n")).toContain("update Plannotator to openCODE
Structural Annotation Overuse21 hits · 32 pts
SeverityFileLineSnippetContext
LOW⚡tests/manual/local/test-sessions.sh102# Step 0: BuildCOMMENT
LOW⚡tests/manual/local/test-sessions.sh119# Step 1: Clean slateCOMMENT
LOW⚡tests/manual/local/test-sessions.sh128# Step 2: Launch plan server, validate session file contentCOMMENT
LOW⚡tests/manual/local/test-sessions.sh169# Step 3: Launch review server, validate session file contentCOMMENT
LOW⚡tests/manual/local/test-sessions.sh198# Step 4: Test `plannotator sessions` listingCOMMENT
LOW⚡tests/manual/local/test-sessions.sh227# Step 5: Test `sessions --open`COMMENT
LOW⚡tests/manual/local/test-sessions.sh262# Step 6: Test stale session cleanup (auto + --clean)COMMENT
LOW⚡tests/manual/local/test-sessions.sh325# Step 7: Approve/submit servers, verify session cleanup on exitCOMMENT
LOW.agents/skills/release/SKILL.md14### Step 1: Determine scopeCOMMENT
LOW.agents/skills/release/SKILL.md23### Step 2: Research contributorsCOMMENT
LOW.agents/skills/release/SKILL.md46### Step 3: Write the release notesCOMMENT
LOW.agents/skills/release/SKILL.md112### Step 4: Present for reviewCOMMENT
LOWpackages/inbox/api.ts1157 // Step 2: attachments (by id only), annotations, deleting.COMMENT
LOWpackages/inbox/api.ts1182 // Step 8: New message to a live session of the thread's project.COMMENT
LOWpackages/core/crypto.test.ts37 p: "# Implementation Plan\n\n## Step 1: Add authentication\n\nWe'll use JWT tokens stored in httpOnly cookies.\n\n## SCODE
LOWpackages/server/inbox.ts2166 // Step 8: a polling session is live (New message can reach it) while its poll is held.COMMENT
LOWpackages/server/inbox.ts3368 // Step 8: the live sessions of a thread's project, and New message.COMMENT
LOWpackages/server/inbox.ts3384 // Step 2: attachments by id, annotations, the HTML asset route, deleteCOMMENT
LOW⚡apps/hook/server/index.ts1333 // Step 1: Fast skeleton clone (no checkout, depth 1 — minimal data transfer)COMMENT
LOW⚡apps/hook/server/index.ts1339 // Step 2: Fetch only the PR head ref (targeted, much faster than full fetch)COMMENT
LOW⚡apps/hook/server/index.ts1346 // Step 3: Checkout PR head (critical — if this fails, worktree is empty)COMMENT
Example Usage Blocks22 hits · 32 pts
SeverityFileLineSnippetContext
LOWtests/manual/local/test-binary.sh4# Usage:COMMENT
LOWtests/manual/local/test-sessions.sh4# Usage:COMMENT
LOWtests/manual/local/test-jj-review.sh4# Usage:COMMENT
LOWtests/manual/local/test-loose-list.sh5# Usage:COMMENT
LOWtests/manual/local/sandbox-opencode-isolated.sh4# Usage:COMMENT
LOWtests/manual/local/test-worktree-review.sh4# Usage:COMMENT
LOWtests/manual/local/test-bulk-plans.sh4# Usage:COMMENT
LOWtests/manual/local/sandbox-opencode.sh4# Usage:COMMENT
LOWtests/manual/local/sandbox-gemini.sh4# Usage:COMMENT
LOWtests/manual/local/test-hook.sh4# Usage:COMMENT
LOWtests/manual/local/sandbox-pi.sh4# Usage:COMMENT
LOWtests/manual/local/test-opencode-review.sh4# Usage:COMMENT
LOWtests/manual/local/test-external-annotations.sh4# Usage:COMMENT
LOWtests/manual/local/sandbox-codex.sh4# Usage:COMMENT
LOWtests/manual/local/test-codex-plan-review-e2e.sh8# Usage:COMMENT
LOWtests/manual/local/test-hook-2.sh4# Usage:COMMENT
LOWtests/manual/path-detection/setup.sh4# Usage:COMMENT
LOWtests/manual/path-detection/run-plan.sh4# Usage:COMMENT
LOWtests/manual/path-detection/run-annotate-out-of-tree.sh4# Usage:COMMENT
LOWtests/manual/path-detection/run-annotate-in-tree.sh4# Usage:COMMENT
LOWscripts/opencode2-native-commands-smoke.sh12# Usage:COMMENT
LOWscripts/bitbucket-live-smoke.sh27# Usage:COMMENT
Fake / Example Data24 hits · 28 pts
SeverityFileLineSnippetContext
LOWtests/setup/gh-tripwire.ts20 * absolute path, is caught only by that config and fake-token scrub, not byCOMMENT
LOWtests/setup/gh-tripwire.ts49 * verified for Bun's spawn. There only the config and fake-token scrub protectCOMMENT
LOWtests/setup/gh-tripwire.ts118export const GH_FAKE_TOKEN = "plannotator-test-fake-token";CODE
LOW⚡tests/manual/path-detection/setup.sh66git config user.email "test@test.com"CODE
LOWtests/e2e/inbox-fullscreen-composer.spec.ts211 await expect(replyField()).toHaveAttribute('placeholder', 'Reply to Claude Code…');CODE
LOWtests/e2e/inbox-actions.spec.ts296 await expect(note).toHaveAttribute('placeholder', 'Add a note for Claude Code');CODE
LOWdocs/agent-guides/project-and-development.md197- **Tests never run the real GitHub CLI.** The first bun test preload (`tests/setup/gh-tripwire.ts`, in every bunfig) puCODE
LOW⚡packages/ui/utils/identity.seam.test.ts48 getIdentity: () => 'user@example.com',CODE
LOW⚡packages/ui/utils/identity.seam.test.ts51 return author === 'user@example.com';CODE
LOW⚡packages/ui/utils/identity.seam.test.ts57 expect(isCurrentUser('user@example.com')).toBe(true);CODE
LOW⚡packages/ui/utils/identity.seam.test.ts59 expect(checked).toEqual(['user@example.com', 'other@example.com']);CODE
LOWpackages/ui/components/ComposerTokenTextarea.tsx208 'value' | 'onChange' | 'onKeyDown' | 'onSelect' | 'onScroll' | 'className' | 'placeholder'CODE
LOW…i/components/html-viewer/htmlPinpointProtocol.test.tsx1824 tag: 'input', attrs: [['value', 'hunter2'], ['onfocus', 'steal()'], ['style', 'x'], ['placeholder', 'Password'], [CODE
LOW…i/components/html-viewer/htmlPinpointProtocol.test.tsx1827 expect(context.attrs).toEqual([['placeholder', 'Password']]);CODE
LOWpackages/ui/components/html-viewer/bridge-script.ts3141 var CONTEXT_ATTRS = ['href', 'src', 'alt', 'title', 'type', 'name', 'role', 'placeholder', 'for', 'target', 'rel',CODE
LOWpackages/inbox/feedbackDialog.test.tsx220 expect(dialog.contact().getAttribute('placeholder')).toBe('Email (optional)');CODE
LOWpackages/core/html-anchor.ts127 "href", "src", "alt", "title", "type", "name", "role", "placeholder", "for", "target", "rel",CODE
LOWpackages/shared/pr-bitbucket.test.ts32const TOKEN = "fake-token-never-real-1234567890";CODE
LOWpackages/shared/inbox/search-text.test.ts95 const text = `${'Lorem ipsum dolor sit amet, consectetur adipiscing elit. '.repeat(3)}The relay rate limit is 20 a mCODE
LOWpackages/shared/inbox/search-text.test.ts95 const text = `${'Lorem ipsum dolor sit amet, consectetur adipiscing elit. '.repeat(3)}The relay rate limit is 20 a mCODE
LOWapps/pi-extension/serverReview-bitbucket.test.ts30 fake = startFakeBitbucket({ email: 'ada@example.invalid', token: 'pi-fake-token' });CODE
LOWapps/pi-extension/serverReview-bitbucket.test.ts37 process.env.PLANNOTATOR_BITBUCKET_TOKEN = 'pi-fake-token';CODE
LOWapps/hook/server/bitbucket-review-cli.test.ts22const TOKEN = "fake-token-for-cli-test-0987654321";CODE
LOWapps/hook/server/scrubbed-env-cli.test.ts146 GH_TOKEN: "plannotator-test-fake-token",CODE
AI Slop Vocabulary9 hits · 27 pts
SeverityFileLineSnippetContext
MEDIUMbunfig.toml8# The Claude Code mod's engine-harness tests run under `claude plugin test`COMMENT
MEDIUMtests/manual/local/test-codex-plan-review-e2e.sh2# End-to-end Codex Stop-hook test harness for Plannotator.COMMENT
MEDIUMscripts/test-claude-code-mod.sh2# Run the Claude Code mod's engine-harness tests (`claude plugin test`, ClaudeCOMMENT
MEDIUMscripts/test-claude-code-mod.sh6# apps/hook also holds the CLI and its bun tests, which the harness cannot load.COMMENT
MEDIUMpackages/server/review.ts3066 // Snapshot arg: robust against a future await sneaking inCOMMENT
MEDIUMpackages/server/review.ts3245 // Snapshot args: robust against a future await sneaking inCOMMENT
MEDIUMapps/pi-extension/server/serverReview.ts3025 // Snapshot arg: robust against a future await sneaking inCOMMENT
MEDIUMapps/pi-extension/server/serverReview.ts3185 // Snapshot args: robust against a future await sneaking inCOMMENT
MEDIUMapps/hook/bunfig.toml7# The mod's `claude plugin test` harness tests (see the root bunfig.toml).COMMENT
Verbosity Indicators17 hits · 26 pts
SeverityFileLineSnippetContext
LOW⚡tests/manual/local/test-sessions.sh102# Step 0: BuildCOMMENT
LOW⚡tests/manual/local/test-sessions.sh119# Step 1: Clean slateCOMMENT
LOW⚡tests/manual/local/test-sessions.sh128# Step 2: Launch plan server, validate session file contentCOMMENT
LOW⚡tests/manual/local/test-sessions.sh169# Step 3: Launch review server, validate session file contentCOMMENT
LOW⚡tests/manual/local/test-sessions.sh198# Step 4: Test `plannotator sessions` listingCOMMENT
LOW⚡tests/manual/local/test-sessions.sh227# Step 5: Test `sessions --open`COMMENT
LOW⚡tests/manual/local/test-sessions.sh262# Step 6: Test stale session cleanup (auto + --clean)COMMENT
LOW⚡tests/manual/local/test-sessions.sh325# Step 7: Approve/submit servers, verify session cleanup on exitCOMMENT
LOWpackages/inbox/api.ts1157 // Step 2: attachments (by id only), annotations, deleting.COMMENT
LOWpackages/inbox/api.ts1182 // Step 8: New message to a live session of the thread's project.COMMENT
LOWpackages/core/crypto.test.ts37 p: "# Implementation Plan\n\n## Step 1: Add authentication\n\nWe'll use JWT tokens stored in httpOnly cookies.\n\n## SCODE
LOWpackages/server/inbox.ts2166 // Step 8: a polling session is live (New message can reach it) while its poll is held.COMMENT
LOWpackages/server/inbox.ts3368 // Step 8: the live sessions of a thread's project, and New message.COMMENT
LOWpackages/server/inbox.ts3384 // Step 2: attachments by id, annotations, the HTML asset route, deleteCOMMENT
LOW⚡apps/hook/server/index.ts1333 // Step 1: Fast skeleton clone (no checkout, depth 1 — minimal data transfer)COMMENT
LOW⚡apps/hook/server/index.ts1339 // Step 2: Fetch only the PR head ref (targeted, much faster than full fetch)COMMENT
LOW⚡apps/hook/server/index.ts1346 // Step 3: Checkout PR head (critical — if this fails, worktree is empty)COMMENT
Synthetic Comment Markers4 hits · 25 pts
SeverityFileLineSnippetContext
HIGHtests/e2e/inbox-guides.spec.ts176 await expect(viewer.getByText(/2 sections · 1\/2 reviewed · generated by Claude · sonnet/)).toBeVisible();CODE
HIGHtests/e2e/inbox-guides.spec.ts242 await expect(viewer.getByText(/generated by Claude Code · claude-opus-5/)).toBeVisible();CODE
HIGHdocs/agent-guides/guides-and-shared-ui.md171*Security.* Embedded pages are untrusted author HTML served from the Plannotator server's origin. Inside the annotate suCOMMENT
HIGHpackages/server/html-assets.ts184 // The host's own rule (the Inbox), judged as requested and by where theCOMMENT
Self-Referential Comments3 hits · 9 pts
SeverityFileLineSnippetContext
MEDIUMtests/manual/local/enter-codex-plan-review-sandbox.sh2# Create a fresh isolated Codex + Plannotator sandbox and open a shell inside it.COMMENT
MEDIUMtests/manual/local/sandbox-opencode.sh1837# Create a loader file that re-exports from the source.COMMENT
MEDIUMtests/manual/local/sandbox-gemini.sh99 # Create a temp plan fileCOMMENT
Modern AI Meta-Vocabulary2 hits · 5 pts
SeverityFileLineSnippetContext
MEDIUMdocs/agent-guides/code-review.md667**One chat per session, documents named by path (#1001).** In the plan/annotate editor, Ask AI is ONE chat for the wholeCODE
MEDIUMpackages/ui/HANDOFF.md2578## The law (guardrails for anyone editing `@plannotator/ui`)COMMENT
Cross-Language Confusion (JS/TS)1 hit · 5 pts
SeverityFileLineSnippetContext
HIGHpackages/server/auto-update.ts877 elif [ "$code" -eq 113 ]; thenCODE
Overly Generic Function Names5 hits · 5 pts
SeverityFileLineSnippetContext
LOWpackages/shared/code-nav.test.ts40 expect(classifyMatch("export function handleRequest(", "handleRequest", lang)).toBe("definition");CODE
LOWpackages/shared/code-nav.test.ts96 expect(classifyMatch("def handle_request(self, req):", "handle_request", lang)).toBe("definition");CODE
LOWapps/paste-service/core/handler.ts90export async function handleRequest(CODE
LOWapps/waitlist-service/core/handler.ts29export async function handleRequest(CODE
LOWapps/feedback-service/core/handler.ts80export async function handleRequest(request: Request, deps: HandlerDeps): Promise<Response> {CODE
Deep Nesting3 hits · 3 pts
SeverityFileLineSnippetContext
LOW…or-compound/scripts/extract_exit_plan_mode_outcomes.py199CODE
LOW…or-compound/scripts/extract_exit_plan_mode_outcomes.py368CODE
LOW…or-compound/scripts/extract_exit_plan_mode_outcomes.py464CODE
Excessive Try-Catch Wrapping2 hits · 2 pts
SeverityFileLineSnippetContext
LOWscripts/install.sh981except Exception:CODE
LOWapps/marketing/public/install.sh981except Exception:CODE
Redundant / Tautological Comments1 hit · 2 pts
SeverityFileLineSnippetContext
LOWtests/manual/local/test-binary.sh22# Check if plannotator is installedCOMMENT
Unused Imports1 hit · 1 pts
SeverityFileLineSnippetContext
LOW…or-compound/scripts/extract_exit_plan_mode_outcomes.py29CODE