AI Slop Code Risk Monitor

openclaw/clawhub

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

Skill + Plugin Registry for OpenClaw

3.2 Low pattern signal View on GitHub

Open-Source Code Quality, Security and Technical Debt Review

This report summarizes scanner evidence for openclaw/clawhub, a TypeScript project with 9,542 GitHub stars. SynthScan examined 691,715 lines of code across 1976 source files, recording 2213 pattern matches distributed across 12 syntactic categories. The legacy adjusted pattern signal is 3.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.

3.2
Adjusted Signal
3.2
Raw Pattern Score
100%
Time Factor
2026-10-31
Last Push
9.5K
Stars
TypeScript
Language
691.7K
Lines of Code
2.0K
Files
2.2K
Pattern Hits
2026-10-31
Scan Date
0.01
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 13.8/100 · LOW

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

Hallucinated Dependency & Supply Chain Risk 0.8/100 · LOW

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

Agent Over-Engineering Ratio 13.5/100 · LOW

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

PR Review Velocity Impact 15.4/100 · LOW

Which changes need focused human review? 2213 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 7HIGH 5MEDIUM 9LOW 2192

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 2213 distinct pattern matches across 12 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 Identifiers2124 hits · 1989 pts
SeverityFileLineSnippetContext
LOWemails/plugin-inspector-findings.tsx11export default function PluginInspectorFindingsEmail({CODE
LOWemails/secret-blocked-publish.tsx17export default function SecretBlockedPublishEmail({CODE
LOWserver/convexProxy.ts122export function isConvexProxyMethodAllowed(method: string, env: ProxyEnv) {CODE
LOWserver/convexProxy.ts350function prefetchSkillExportEntries(CODE
LOWserver/convexProxy.ts441function cancelPrefetchWithArchive(CODE
LOWserver/convexProxy.ts535async function readBoundedArchiveManifest(response: Response) {CODE
LOWserver/convexProxy.ts568function parseSkillArchiveManifest(CODE
LOWserver/convexProxy.ts623function parseSkillExportArchiveManifest(CODE
LOWserver/convexProxy.ts683function isSkillExportArchiveEntry(CODE
LOWserver/convexProxy.ts711function isCanonicalConvexStorageUrl(url: URL, expectedStorageOrigin: string) {CODE
LOWserver/convexProxy.ts722function isMergedExportManifestEntry(value: unknown) {CODE
LOWserver/convexProxy.ts757export async function verifySignedArchiveManifest(CODE
LOWserver/convexProxy.ts776export function resolveConvexStorageOrigin(target: string, env: ProxyEnv) {CODE
LOWserver/skillsShMirrorClassification.ts107function hasReusableClassification(CODE
LOWserver/skillsShMirrorClassification.ts184function replayClassificationState(CODE
LOWserver/skillsShMirrorClassification.ts217export function buildSkillsShMirrorReplayRows(CODE
LOWserver/skillsShCatalogSource.ts89function normalizeControlledSupplementIds(values: unknown[]) {CODE
LOWserver/skillsShCatalogSource.ts105export function buildSkillsShMirrorProofSnapshotId(args: {CODE
LOWserver/skillsShCatalogSource.ts159export function parseSkillsShMirrorProofSnapshotId(snapshotId: string) {CODE
LOWserver/skillsShCatalogSource.ts416function normalizeUpstreamScannerStatus(value: string) {CODE
LOWserver/skillsShCatalogSource.ts425export function buildSkillsShMirrorUpstreamScanners(CODE
LOWserver/skillsShCatalogSource.ts509export function skillsShSourceRetryAfterSeconds(error: unknown) {CODE
LOWserver/skillsShCatalogSource.ts515function isRetryableSkillsShHttpStatus(status: number) {CODE
LOWserver/skillsShCatalogSource.ts564function isSkillsShIdentitySegment(value: string) {CODE
LOWserver/skillsShCatalogSource.ts568function normalizeUpstreamSourceType(value: unknown) {CODE
LOWserver/skillsShCatalogSource.ts608function parseExactGitHubRepositoryUrl(value: string) {CODE
LOWserver/skillsShCatalogSource.ts642function repositoryIdentityFromHtml(html: string, expectedOwner: string, expectedRepo: string) {CODE
LOWserver/skillsShCatalogSource.ts688function exactSkillsShIdentityPageUrl(value: string, expectedPath: string) {CODE
LOWserver/skillsShCatalogSource.ts738function parseExactGitHubInstallIdentity(source: string, installUrl: string | null) {CODE
LOWserver/skillsShCatalogSource.ts746export function buildSkillsShMirrorObservation(CODE
LOWserver/skillsShCatalogSource.ts850async function fetchSkillsShIdentityPage(CODE
LOWserver/skillsShCatalogSource.ts1001async function resolveSkillsShMirrorObservation(CODE
LOWserver/skillsShCatalogSource.ts1072function normalizedRepoRelativePath(value: string) {CODE
LOWserver/skillsShCatalogSource.ts1084function githubCommitFromArchiveRedirect(value: string, owner: string, repo: string) {CODE
LOWserver/skillsShCatalogSource.ts1105async function fetchGitHubRepoTreeSnapshot(CODE
LOWserver/skillsShCatalogSource.ts1276export function buildSkillsShMirrorDetail(detail: SkillsShCatalogDetail, maxBytes: number) {CODE
LOWserver/skillsShCatalogSource.ts1422async function fetchSkillsShCatalogPageWithBytes(CODE
LOWserver/skillsShCatalogSource.ts1467export async function measureSkillsShTrendingSource(CODE
LOWserver/skillsShCatalogSource.ts1649function validateSkillsShMirrorProofEvidence(value: unknown): SkillsShMirrorProofEvidence {CODE
LOWserver/skillsShCatalogSource.ts1705function capturedSkillsShCatalogRows(rows: SkillsShCatalogListRow[]) {CODE
LOWserver/skillsShCatalogSource.ts1722function parseSkillsShPageFieldEvidence(html: string) {CODE
LOWserver/skillsShCatalogSource.ts1750function parseSkillsShRscFieldEvidence(rsc: string) {CODE
LOWserver/skillsShCatalogSource.ts1772function exactSkillsShProofMetadataUrl(value: string, expectedPath: string, rsc: boolean) {CODE
LOWserver/skillsShCatalogSource.ts1868export async function measureSkillsShMirrorProofSource(CODE
LOWserver/skillsShCatalogSource.ts2154export async function fetchSkillsShCatalogDetail(CODE
LOWserver/skillsShCatalogSource.ts2172async function fetchSkillsShMirrorDetail(id: string, options: SkillsShFetchOptions = {}) {CODE
LOWserver/skillsShCatalogSource.ts2346export async function fetchSkillsShMirrorControlledBatch(CODE
LOWserver/skillsShCatalogSource.ts2456export function buildSkillsShMirrorControlledObservation(CODE
LOWserver/skillsShCatalogSource.ts2504export function getSkillsShCatalogTestSourcePolicy(env: SkillsShCatalogSourceEnv = process.env) {CODE
LOWserver/skillsShCatalogSource.ts2555export function getSkillsShCatalogProductionSourcePolicy(CODE
LOWserver/skillsShCatalogSource.ts2622export function validateSkillsShCatalogGitHubOwnerProof(CODE
LOWserver/skillsShCatalogSource.ts2672async function authorizeSkillsShCatalogTestRequest(CODE
LOWserver/skillsShCatalogSource.ts2709export async function fetchSkillsShCatalogTestPage(options: {CODE
LOWserver/skillsShCatalogSource.ts2825function createSkillsShFetchOptions(CODE
LOWserver/skillsShCatalogSource.ts2837async function selectSkillsShCatalogTestRows(CODE
LOWserver/skillsShCatalogSource.ts2947export async function captureSkillsShCatalogTestSnapshot(options: {CODE
LOWserver/og/formatOgStats.ts33export function resolveOgDownloadsDisplay(CODE
LOWserver/og/fetchImageDataUrl.ts37export function isSafePublicHttpsOgImageUrl(url: string | null | undefined) {CODE
LOWserver/og/fetchImageDataUrl.ts91export async function fetchPublisherProfileImageDataUrl(url: string | null | undefined) {CODE
LOWserver/og/publisherOgSvg.ts72function normalOfficialTitleMaxWidth(contentWidth: number) {CODE
2064 more matches not shown…
Hallucination Indicators7 hits · 70 pts
SeverityFileLineSnippetContext
CRITICALconvex/maintenance.publishAttempts.test.ts193 expect(ctx.db.get.mock.calls.filter(([id]) => id === "publishAttempts:one")).toHaveLength(1);CODE
CRITICALconvex/packages.public.test.ts14669 expect(ctx.storage.store.mock.calls.some(([value]) => value.type === "application/json")).toBe(CODE
CRITICALconvex/publisherAbuse.test.ts8298 expect(ctx.db.query.mock.calls.filter(([table]) => table === "skillDailyStats")).toHaveLength(CODE
CRITICALconvex/search.test.ts391 ctx.db.query.mock.calls.filter(([table]) => table === "officialPublishers"),CODE
CRITICALconvex/search.test.ts3848 ctx.db.query.mock.calls.filter(([table]) => table === "officialPublishers"),CODE
CRITICALconvex/publishAttempts.test.ts2024 const versionPatch = ctx.db.patch.mock.calls.find(CODE
CRITICALconvex/featuredSelections.runtime.test.ts224 items: ready.report.recommendations.lineup.proposed.map((item) => ({CODE
Structural Annotation Overuse22 hits · 40 pts
SeverityFileLineSnippetContext
LOW.agents/skills/controlling-costs/SKILL.md99### Step 1: List available notifiersCOMMENT
LOW.agents/skills/controlling-costs/SKILL.md108### Step 2: Create monitorsCOMMENT
LOW.agents/skills/vercel-cli/references/integrations.md29# Step 1: list valid category slugsCOMMENT
LOW.agents/skills/vercel-cli/references/integrations.md33# Step 2: filter discover by categoryCOMMENT
LOW⚡.agents/skills/vercel-cli/command/vercel.md9### Step 1: Identify task type from user requestCOMMENT
LOW⚡.agents/skills/vercel-cli/command/vercel.md13### Step 2: Read the reference fileCOMMENT
LOW⚡.agents/skills/vercel-cli/command/vercel.md17### Step 3: Execute taskCOMMENT
LOW.agents/skills/vercel-cli/command/vercel.md29### Step 4: SummarizeCOMMENT
LOW.agents/skills/writing-evals/SKILL.md53### Step 1: Understand the featureCOMMENT
LOW.agents/skills/writing-evals/SKILL.md62### Step 2: Determine eval typeCOMMENT
LOW.agents/skills/writing-evals/SKILL.md75### Step 3: Choose scorersCOMMENT
LOW.agents/skills/writing-evals/SKILL.md91### Step 4: GenerateCOMMENT
LOW⚡.agents/skills/writing-evals/SKILL.md221### Step 1: Check for existing dataCOMMENT
LOW⚡.agents/skills/writing-evals/SKILL.md231### Step 2: Generate test data from codeCOMMENT
LOW⚡.agents/skills/writing-evals/SKILL.md240### Step 3: Cover all categoriesCOMMENT
LOW⚡.agents/skills/axiom-sre/reference/query-patterns.md10// Step 1: Get schema with typesCOMMENT
LOW⚡.agents/skills/axiom-sre/reference/query-patterns.md13// Step 2: Sample raw events to see actual data shape (especially map fields)COMMENT
LOW⚡.agents/skills/axiom-sre/reference/query-patterns.md16// Step 3: Discover values of low-cardinality fields you plan to filter onCOMMENT
LOW⚡.agents/skills/axiom-sre/reference/query-patterns.md21// Step 4: Discover keys inside map[string] columns (getschema won't show these)COMMENT
LOW.agents/skills/spl-to-apl/.meta/DESIGN-NOTES.md43## Step 1: Read the Schema (REQUIRED)COMMENT
LOWconvex/skills.undeleteGate.test.ts981 // Step 1: owner delete must be rejected by the provenance guard.COMMENT
LOWconvex/skills.undeleteGate.test.ts994 // Step 2: owner undelete must also be rejected, because the currentCOMMENT
Fake / Example Data31 hits · 31 pts
SeverityFileLineSnippetContext
LOW.agents/skills/axiom-sre/reference/blocks.md167 "placeholder":{"type":"plain_text","text":"Choose"},CODE
LOW.agents/skills/axiom-sre/reference/blocks.md180 "placeholder":{"type":"plain_text","text":"Select user"},CODE
LOW.agents/skills/axiom-sre/reference/blocks.md189 "placeholder":{"type":"plain_text","text":"Select channel"},CODE
LOW.agents/skills/axiom-sre/reference/blocks.md200 "placeholder":{"type":"plain_text","text":"Select date"}CODE
LOWconvex/securityScan.test.ts5563 vi.stubEnv("SECURITY_SCAN_WORKER_TOKEN", "placeholder");CODE
LOWconvex/securityScan.test.ts5568 leaseToken: "placeholder",CODE
LOWconvex/securityScan.test.ts5586 token: "placeholder",CODE
LOWconvex/securityScan.test.ts5588 leaseToken: "placeholder",CODE
LOWconvex/securityScan.test.ts5607 vi.stubEnv("SECURITY_SCAN_WORKER_TOKEN", "placeholder");CODE
LOWconvex/securityScan.test.ts5626 token: "placeholder",CODE
LOWconvex/securityScan.test.ts5654 vi.stubEnv("SECURITY_SCAN_WORKER_TOKEN", "placeholder");CODE
LOWconvex/securityScan.test.ts5677 token: "placeholder",CODE
LOWconvex/securityScan.test.ts5691 vi.stubEnv("SECURITY_SCAN_WORKER_TOKEN", "placeholder");CODE
LOWconvex/securityScan.test.ts5714 token: "placeholder",CODE
LOWconvex/securityScan.test.ts6703 vi.stubEnv("SECURITY_SCAN_WORKER_TOKEN", "placeholder");CODE
LOWconvex/securityScan.test.ts6726 token: "placeholder",CODE
LOWconvex/securityScan.test.ts6728 leaseToken: "placeholder",CODE
LOWconvex/lib/skillSearchDigest.test.ts434 ownerDisplayName: "John Doe",CODE
LOWconvex/lib/skillSearchDigest.test.ts445 displayName: "John Doe",CODE
LOWscripts/security/run-codex-scan-worker.test.ts1296 leaseToken: "placeholder",CODE
LOWscripts/security/run-codex-scan-worker.test.ts1412 leaseToken: "placeholder",CODE
LOWscripts/skill-cards/run-skill-card-worker.test.ts324 displayName: "Acme Corp",CODE
LOWpackages/clawhub-admin/src/commands/email.test.ts61 recipient: { email: "user@example.com" },CODE
LOWpackages/clawhub-admin/src/commands/email.test.ts94 to: "user@example.com",CODE
LOWpackages/clawhub-admin/src/commands/email.test.ts104 to: "user@example.com",CODE
LOWpackages/clawhub-admin/src/commands/email.test.ts118 recipient: { email: "user@example.com", userId: "users:1", handle: "hansen302" },CODE
LOWpackages/clawhub-admin/src/commands/email.test.ts161 recipient: { email: "user@example.com", handle: "octocat" },CODE
LOWpackages/clawhub-admin/src/commands/email.test.ts168 to: "user@example.com",CODE
LOWpackages/clawhub-admin/src/commands/email.test.ts186 toEmail: "user@example.com",CODE
LOWsrc/routes/-management/ManagedMcpTools.tsx299 ? { kind: auth, header: text("header"), placeholder: text("placeholder") }CODE
LOWsrc/routes/-management/ManagedMcpTools.tsx401 name="placeholder"CODE
Modern AI Meta-Vocabulary7 hits · 18 pts
SeverityFileLineSnippetContext
MEDIUMspecs/local-moderation-fixtures.md54http://localhost:3000/local/local-agentic-risk-demoCODE
MEDIUMspecs/local-moderation-fixtures.md55http://localhost:3000/local/local-agentic-risk-demo/security-auditCODE
MEDIUM.agents/skills/technical-documentation/SKILL.md45## Sub-agent orchestration guidanceCOMMENT
MEDIUM.agents/skills/convex-agent/SKILL.md8# Add an AI agent / RAG backendCOMMENT
MEDIUM.agents/skills/writing-evals/SKILL.md271### eval-scaffold typesCOMMENT
MEDIUM…ents/skills/writing-evals/reference/scorer-patterns.md91## Pattern 4: Set Match (Retrieval / RAG)COMMENT
MEDIUMdocs/security-audits.md324[OWASP Agentic Skills Top 10](https://owasp.org/www-project-agentic-skills-top-10/)CODE
Cross-Language Confusion (JS/TS)3 hits · 15 pts
SeverityFileLineSnippetContext
HIGH…pts/security/skillspector-exception-diagnostic.test.ts35 print(json.dumps(projected))CODE
HIGH…pts/security/skillspector-exception-diagnostic.test.ts101print(json.dumps([m.project_exception(exc) for exc in cases]))CODE
HIGH…pts/security/skillspector-exception-diagnostic.test.ts168print(json.dumps({"trusted":projected,"forged":forged,"other":other,"oversize":oversize,"descriptor":descriptor}))CODE
Empty Error Handlers2 hits · 10 pts
SeverityFileLineSnippetContext
HIGHscripts/security/skillspector_exception_diagnostic.py159except Exception:CODE
HIGHscripts/security/skillspector_exception_diagnostic.py208except Exception:CODE
Over-Commented Block9 hits · 5 pts
SeverityFileLineSnippetContext
LOWconvex/skills.ts12241 //COMMENT
LOWconvex/skills.ts12261 // newer clients where the Owner selector defaulted to the caller'sCOMMENT
LOWconvex/skills.ts13261 } catch {COMMENT
LOWconvex/skills.ts13281 // - skill.hiddenBy === owner: the current hide was owner-initiatedCOMMENT
LOWconvex/skills.ts13301 // falling through to 500.COMMENT
LOWconvex/skills.ts13321 // owner simply fails this check. A security redaction / auto-banCOMMENT
LOWconvex/skills.ts13341 // That means a row can be `moderationStatus="active"` with aCOMMENT
LOWconvex/skills.ts13361 if (!args.deleted && isOwner && !isModeratorOrAdmin) {COMMENT
LOWconvex/lib/skillSlugValidator.ts1import { ConvexError } from "convex/values";COMMENT
Excessive Try-Catch Wrapping4 hits · 5 pts
SeverityFileLineSnippetContext
LOWscripts/security/skillspector_exception_diagnostic.py159 except Exception:CODE
LOWscripts/security/skillspector_exception_diagnostic.py199 except Exception:CODE
LOWscripts/security/skillspector_exception_diagnostic.py208 except Exception:CODE
MEDIUMscripts/security/skillspector_exception_diagnostic.py205def finished():CODE
Verbosity Indicators2 hits · 3 pts
SeverityFileLineSnippetContext
LOWconvex/skills.undeleteGate.test.ts981 // Step 1: owner delete must be rejected by the provenance guard.COMMENT
LOWconvex/skills.undeleteGate.test.ts994 // Step 2: owner undelete must also be rejected, because the currentCOMMENT
Slop Phrases1 hit · 2 pts
SeverityFileLineSnippetContext
MEDIUMsrc/components/SkillCardPreview.tsx41 pattern: /this skill is for demonstration purposes and not for production usage\.?/iu,CODE
Deep Nesting1 hit · 1 pts
SeverityFileLineSnippetContext
LOWscripts/security/skillspector_exception_diagnostic.py109CODE