AI Slop Code Risk Monitor

DIYgod/RSSHub

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

🧡 Everything is RSSible

0.7 Low pattern signal View on GitHub

Open-Source Code Quality, Security and Technical Debt Review

This report summarizes scanner evidence for DIYgod/RSSHub, a TypeScript project with 46,734 GitHub stars. SynthScan examined 522,159 lines of code across 7153 source files, recording 130 pattern matches distributed across 8 syntactic categories. The legacy adjusted pattern signal is 0.7 (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.

0.7
Adjusted Signal
0.7
Raw Pattern Score
100%
Time Factor
2026-10-31
Last Push
46.7K
Stars
TypeScript
Language
522.2K
Lines of Code
7.2K
Files
130
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 1.0/100 · LOW

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

Hallucinated Dependency & Supply Chain Risk 2.7/100 · LOW

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

Agent Over-Engineering Ratio 0.6/100 · LOW

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

PR Review Velocity Impact 3.6/100 · LOW

Which changes need focused human review? 130 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 28HIGH 0MEDIUM 1LOW 101

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 130 distinct pattern matches across 8 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.

Hallucination Indicators28 hits · 280 pts
SeverityFileLineSnippetContext
CRITICALlib/routes/konghq/blog-posts.ts45 const posts: Array<DataItem & { link: string }> = nextData.props.pageProps.cardsPaged.cards.map((item) => {CODE
CRITICALlib/routes/apple/podcast.ts109 image: header.contextAction.podcastOffer.artwork.template.replace(/\{w\}x\{h\}(?:\{c\}|bb)\.\{f\}/, '3000x3000bbCODE
CRITICALlib/routes/civitai/user.ts80 const list = article.result.data.json.items.map((item) => ({CODE
CRITICALlib/routes/thepaper/utils.tsx92 ChannelIdToName: (nodeId, nextData) => nextData.props.appProps.menu.channelList.find((c) => c.nodeId.toString() === CODE
CRITICALlib/routes/thepaper/utils.tsx93 ListIdToName: (listId, nextData) => nextData.props.appProps.menu.channelList.flatMap((c) => c.childNodeList || []).fCODE
CRITICALlib/routes/futunn/video.ts38 const items = response.data.data.videoList.list.map((item) => ({CODE
CRITICALlib/routes/futunn/live.ts73 const items = response.data.data.data.news.map((item) => {CODE
CRITICALlib/routes/bilibili/mall-new.ts44 const type = response.data.data.vo.cateTabs.find((item) => item.cateType === response.data.data.vo.currentCateType).CODE
CRITICALlib/routes/sustainabilitymag/articles.ts122 const list: Array<DataItem & { link: string }> = results.data.paginatedWidget.articles.results.map((item) => ({CODE
CRITICALlib/routes/youtube/community.tsx71 (tab) => tab.tabRenderer.endpoint.commandMetadata.webCommandMetadata.url.endsWith('/posts') || tab.tabRenderer.eCODE
CRITICALlib/routes/taptap/common/review.ts76 description: review.moment.review.contents.text + (review.moment.review.contents.images ? review.moment.reviCODE
CRITICALlib/routes/gocn/news.ts43 const items = response.data.data.articlePageList.list.map((item) => ({CODE
CRITICALlib/routes/github/star.ts65 const data = response.data.data.repository.stargazers.edges.toReversed();CODE
CRITICALlib/routes/github/discussions.ts113 const categoryItem = response.data.data.repository.discussionCategories.nodes.find((item) => item.name === categCODE
CRITICALlib/routes/github/discussions.ts147 const data = response.data.data.repository.discussions.nodes.filter((item) => (closed === null ? item : item.closed CODE
CRITICALlib/routes/xiaoyuzhou/podcast.ts75 > = pageData.props.pageProps.podcast.episodes.map((item) => {CODE
CRITICALlib/routes/wired/tag.ts100 tags: preloadedState.transformed.article.tagCloud.tags.map((t: { tag: string }) => t.tag),CODE
CRITICALlib/routes/houxu/index.tsx46 <p>{raw(item.object.last.link.description.replaceAll('\r\n', '<br>'))}</p>CODE
CRITICALlib/routes/theverge/index.ts87 return b.images.map((i) => `<figure><img src="${i.image.thumbnails.horizontal.url.split('?', 1)[0]}" alt="${CODE
CRITICALlib/routes/theverge/index.ts108 return `<figure><img src="${b.leftImage.thumbnails.horizontal.url.split('?', 1)[0]}" alt="${b.leftImage.alt}CODE
CRITICALlib/routes/theverge/index.ts115 return `<div><figure><img src="${product.image.thumbnails.horizontal.url.split('?', 1)[0]}" alt="${product.iCODE
CRITICALlib/routes/theverge/index.ts142 const node = nextData.props.pageProps.hydration.responses.find((x) => x.operationName === 'PostLayoutQueCODE
CRITICALlib/routes/nikkei/asia/index.ts42 const list = response.data.data.getLatestHeadlines.items.map((item) => ({ ...item, link: new URL(item.path, 'https:/CODE
CRITICALlib/routes/zcool/top.ts44 const list = data.props.pageProps.listResult.data.map((item) => ({CODE
CRITICALlib/routes/zcool/user.ts86 image: data.props.pageProps.userInfo.avatar.includes('?x-oss-process') ? data.props.pageProps.userInfo.avatar.spCODE
CRITICALlib/routes/matters/latest.ts58 const item = response.data.viewer.recommendation.feed.edges.map(({ node }) => parseItem(node));CODE
CRITICALlib/routes/gov/zhengce/govall.ts184 const list = response.result.data.middle.list.filter((item) => item.url).map((item) => normalizeSearchItem(item));CODE
CRITICALlib/routes/afr/navigation.ts54 const list = response.data.pageByNavigationPath.page.latestStoriesConnection.edges.map(({ node }) => ({CODE
Hyper-Verbose Identifiers58 hits · 61 pts
SeverityFileLineSnippetContext
LOWscripts/workflow/format-description.ts122function remarkLiftClosingDirective() {CODE
LOWlib/routes/zju/sis/index.ts63async function enrichNewsItemWithDetails(item: DataItem, refererUrl: string): Promise<DataItem> {CODE
LOWlib/routes/zju/math/index.ts57async function enrichNewsItemWithDetails(item: NewsItem, refererUrl: string): Promise<DataItem> {CODE
LOWlib/routes/pixiv/novel-api/content/utils.ts8export function convertPixivProtocolExtended(caption: string): string {CODE
LOWlib/routes/syosetu/utils.ts20export async function fetchChapterPublicationDates(novelUrl: string): Promise<Map<string, Date>> {CODE
LOWlib/routes/wikipedia/current-events.ts28function parseCurrentEventsTemplate(wikitext: string): string | null {CODE
LOWlib/routes/sdo/ff14risingstones/api.ts39export async function getNoviceNetworkRecruitDetail(recruitID: number) {CODE
LOWlib/routes/sdo/ff14risingstones/api.ts57export async function getFreeCompanyRecruitDetail(recruitID: number) {CODE
LOWlib/routes/bilibili/video.ts174async function fetchVideoListFromBrowser(uid: string): Promise<VideoListData> {CODE
LOWlib/routes/jimmyspa/news.ts96function convertHtmlDateToStandardFormat(htmlContent: string): Date | undefined {CODE
LOWlib/routes/jiangnan/jwc.ts11async function getOptionalPublicationDate(link: string): Promise<Date | undefined> {CODE
LOW⚡lib/routes/medium/graphql.ts104async function getWebInlineRecommendedFeedQuery(user, cookie, pagingLimit = 20, getBrowser?: GetMediumBrowser): Promise<CODE
LOW⚡lib/routes/medium/graphql.ts108async function getWebInlineTopicFeedQuery(user, tagSlug, cookie, pagingLimit = 20, getBrowser?: GetMediumBrowser): PromiCODE
LOW⚡lib/routes/medium/graphql.ts112async function getUserCatalogMainContentQuery(user, catalogId, cookie, pagingLimit = 20) {CODE
LOWlib/routes/medium/graphql.ts155function newWebInlineRecommendedFeedQuery(pagingLimit = 5) {CODE
LOWlib/routes/medium/graphql.ts192function newWebInlineTopicFeedQuery(tagSlug, pagingLimit = 5) {CODE
LOWlib/routes/medium/graphql.ts231function newUserCatalogMainContentQuery(catalogId, pagingLimit = 20) {CODE
LOWlib/routes/the/index.ts132function extractFromMaterialBlocks($: CheerioAPI, pageUrl: string): DataItem[] {CODE
LOWlib/routes/youtube/api/subtitles.ts58function createSrtAttachmentFromSrt(srt: string): Array<{ url: string; mime_type: string; title: string }> {CODE
LOWlib/routes/misskey/utils.tsx109async function getUserTimelineByUsername(username, site, { withRenotes = false, mediaOnly = false }) {CODE
LOWlib/routes/github/comments.ts388function renderGraphqlTimelineItem(item: GraphqlTimelineItem, issue: GraphqlIssue, user: string, repo: string): DataItemCODE
LOWlib/routes/dailypush/utils.ts278export async function enhanceItemsWithSummaries(context: BrowserContext, items: ArticleItem[]): Promise<DataItem[]> {CODE
LOWlib/routes/whu/rsgis.ts16function requiresArticleAuthentication($: CheerioAPI) {CODE
LOWlib/routes/whu/swrh.ts24function requiresArticleAuthentication($: CheerioAPI) {CODE
LOWlib/routes/windsurf/changelog.ts19function parseLegacyPublicationDate(value: string | undefined) {CODE
LOWlib/routes/rumble/channel.ts63function parseStructuredVideoObject($: CheerioAPI): RumbleVideoObject | undefined {CODE
LOWlib/routes/mrdx/utils.ts1function getElementChildrenInnerText(element) {CODE
LOWlib/routes/sohu/mobile.ts122function extractPlateBlockNewsLists(jsonData: any) {CODE
LOWlib/routes/linkedin/utils.ts46function parseParamsToSearchParams(params, map) {CODE
LOWlib/routes/linkedin/utils.ts161function parseRelativeShorthandDate(shorthand) {CODE
LOWlib/routes/gov/moa/moa.ts256async function getLatestDataArticleDetail(id) {CODE
LOWeslint-plugins/anti-slop/shared/function-parameters.ts13export function functionParameterTypeAnnotation(parameter: FunctionParameter): ESTree.TSTypeAnnotation | null | undefineCODE
LOWeslint-plugins/anti-slop/shared/function-parameters.ts27export function functionParameterBindingName(parameter: FunctionParameter, sourceCode: SourceCode): string {CODE
LOWeslint-plugins/anti-slop/shared/reflect-method.ts13export function isGlobalReflectMethodCall(sourceCode: SourceCode, callee: ESTree.Expression, methodName: string): booleaCODE
LOW⚡eslint-plugins/anti-slop/shared/dictionary-types.ts81function isEffectivelyEmptyTypeLiteral(type: ESTree.TSTypeLiteral): boolean {CODE
LOW⚡eslint-plugins/anti-slop/shared/dictionary-types.ts85function isEffectivelyEmptyInterface(declarations: readonly ESTree.TSInterfaceDeclaration[]): boolean {CODE
LOW⚡eslint-plugins/anti-slop/shared/dictionary-types.ts91function resolvedSubstitutionArgument(type: ESTree.TSType, base: TypeAliasEnvironment, resolving: ReadonlySet<string> = CODE
LOWeslint-plugins/anti-slop/shared/dictionary-types.ts197export function classifyUnsafeDictionaryValue(valueType: ESTree.TSType, environment: TypeEnvironment): UnsafeDictionary CODE
LOWeslint-plugins/anti-slop/shared/dictionary-types.ts304function isPopulatedObjectExpression(expression: ESTree.Expression): boolean {CODE
LOWeslint-plugins/anti-slop/shared/dictionary-types.ts312export function isKnownEvidenceExpression(expression: ESTree.Expression): boolean {CODE
LOW…lint-plugins/anti-slop/shared/type-alias-resolution.ts89export function createTypeAliasEnvironment(program: ESTree.Program, visitorKeys: VisitorKeys): TypeAliasEnvironment {CODE
LOW…nt-plugins/anti-slop/shared/lexical-type-parameters.ts9function collectInferTypeParameterNames(node: ESTree.Node, visitorKeys: VisitorKeys, names: Set<string>): void {CODE
LOW…nt-plugins/anti-slop/shared/lexical-type-parameters.ts26export function lexicalTypeParameterNames(node: ESTree.Node, visitorKeys: VisitorKeys): ReadonlySet<string> {CODE
LOWeslint-plugins/anti-slop/rules/no-widen-then-assert.ts12function unwrapExpressionParentheses(expression: ESTree.Expression): ESTree.Expression {CODE
LOWeslint-plugins/anti-slop/rules/no-widen-then-assert.ts107function isDefinitelyNarrowerRecordType(type: ESTree.TSType): boolean {CODE
LOWeslint-plugins/anti-slop/rules/no-widen-then-assert.ts133function resolvedVariableForIdentifier(CODE
LOW…-plugins/anti-slop/rules/no-chained-type-assertions.ts6function isTypeAssertionExpression(node: ESTree.Node): node is TypeAssertionExpression {CODE
LOW…-plugins/anti-slop/rules/no-chained-type-assertions.ts10function unwrapParenthesizedExpression(expression: ESTree.Expression): ESTree.Expression {CODE
LOW…-plugins/anti-slop/rules/no-chained-type-assertions.ts23function isOutermostAssertionInChain(node: TypeAssertionExpression): boolean {CODE
LOW…-plugins/anti-slop/rules/no-chained-type-assertions.ts35function isForbiddenAssertionChain(node: TypeAssertionExpression): boolean {CODE
LOW…int-plugins/anti-slop/rules/no-known-value-widening.ts84function hasKnownCallArgumentEvidence(sourceCode: SourceCode, expression: ESTree.Expression, environment: TypeEnvironmenCODE
LOW…int-plugins/anti-slop/rules/no-known-value-widening.ts114function typePredicateSubjectIndex(sourceCode: SourceCode, owner: FunctionExpression): number | null {CODE
LOW…int-plugins/anti-slop/rules/no-known-value-widening.ts159function isDictionaryAccumulatorTarget(destination: WideningTarget): boolean {CODE
LOW…/anti-slop/rules/no-conditional-empty-object-spread.ts16function isConditionalEmptyObjectSpread(node: ESTree.Expression): boolean {CODE
LOW…t-plugins/anti-slop/rules/no-unsafe-dictionary-type.ts55function isInsideTypeAliasDeclaration(node: ESTree.Node): boolean {CODE
LOW…t-plugins/anti-slop/rules/no-unsafe-dictionary-type.ts70function isInsideTypeParameterConstraint(node: ESTree.TSType): boolean {CODE
LOW…lop/rules/require-safety-comment-for-type-assertion.ts29function hasSafetyJustificationBefore(sourceCode: SourceCode, owner: ESTree.Node, assertion: TypeAssertion, pattern: RegCODE
LOW…nt-plugins/anti-slop/rules/no-shape-in-symbol-names.ts6function containsForbiddenSymbolName(name: string): boolean {CODE
Over-Commented Block28 hits · 28 pts
SeverityFileLineSnippetContext
LOWwrangler.toml41# KV namespace for caching (auto-provisioned on first deploy)COMMENT
LOW.github/workflows/codeql.yml1# For most projects, this workflow file will not need changing; you simply needCOMMENT
LOW.github/workflows/codeql.yml61COMMENT
LOWlib/shims/dotenv-config.ts1// No-op shim for dotenv/config in Cloudflare WorkersCOMMENT
LOWlib/routes/chnmuseum/xwzt.ts41 });COMMENT
LOWlib/routes/pixiv/token.ts41 // expireTime = result.expires_in;COMMENT
LOWlib/routes/pixiv/token.ts61// tickTokenStarted = true;COMMENT
LOWlib/routes/pixiv/novel-api/content/utils.ts81 content = contentCOMMENT
LOWlib/routes/twitter/api/web-api/utils.ts121 ? Object.fromEntries(COMMENT
LOWlib/routes/twitter/api/web-api/utils.ts201 // if (newCookie) {COMMENT
LOWlib/routes/twitter/api/mobile-api/token.ts1// import { config } from '@/config';COMMENT
LOWlib/routes/twitter/api/mobile-api/token.ts21 // phoneOrEmail,COMMENT
LOWlib/routes/picnob.info/user.ts41};COMMENT
LOWlib/routes/picnob.info/user.ts61// default:COMMENT
LOWlib/routes/picnob.info/user.ts81COMMENT
LOWlib/routes/picnob.info/user.ts101 // const status = await ofetch<Status[]>(`${baseUrl}/api/v1/pulls/${requestHash}/status`, {COMMENT
LOWlib/routes/picnob.info/user.ts121 // 'x-api-key': INSTALKER_BACK_API_KEY,COMMENT
LOWlib/routes/picnob.info/user.ts141 // author: item.account_name,COMMENT
LOWlib/routes/bilibili/ranking.ts21// 7 variety https://api.bilibili.com/pgc/season/rank/web/list?day=3&season_type=7&web_location=333.934&w_rid=&wts=COMMENT
LOWlib/routes/1point3acres/offer.tsx61COMMENT
LOWlib/routes/1point3acres/offer.tsx81 // );COMMENT
LOWlib/routes/nature/news-and-comment.ts1// example usage: `/nature/news-and-comment/ng`COMMENT
LOWlib/routes/nature/research.ts1// example usage: `/nature/research/ng`COMMENT
LOWlib/routes/nature/cover.ts1import { load } from 'cheerio';COMMENT
LOWlib/routes/wechat/tgchannel.ts81 // 第 1 个元素: <i><b>${emoji(标注消息来源于什么 slave,这里是表示微信的💬)}</b></i>COMMENT
LOWlib/routes/phoronix/index.ts201 const dateNode = categorySelector.get(0)?.nextSibling;COMMENT
LOWlib/routes/jike/utils.ts101COMMENT
LOWlib/routes/gov/general/general.ts1import { load } from 'cheerio';COMMENT
Overly Generic Function Names7 hits · 7 pts
SeverityFileLineSnippetContext
LOWlib/routes/letterboxd/utils.ts25export async function getData(username: string, title: string) {CODE
LOWlib/routes/oreno3d/main.tsx72async function getData(response) {CODE
LOWlib/routes/szse/notice.ts12function getData(content: string, option: 'title' | 'url'): string | undefined {CODE
LOWlib/routes/moyukik/event.ts25async function getData(url: string) {CODE
LOWlib/routes/cbre/research.ts37function handleRequest(route) {CODE
LOWlib/routes/cgtn/podcast.ts7async function getData(category, id) {CODE
LOWlib/routes/nber/common.tsx19async function getData(url: string): Promise<WorkingPaper[]> {CODE
Verbosity Indicators3 hits · 4 pts
SeverityFileLineSnippetContext
LOWlib/routes/perplexity/blog.ts75 // Step 1: Extract featured article using data-framer-name attributeCOMMENT
LOWlib/routes/perplexity/blog.ts89 // Step 2: Extract regular articles using data-framer-name="Article Card"COMMENT
LOWlib/routes/perplexity/blog.ts124 // Step 3: Fetch detail pages for items missing pubDate (e.g., featured article)COMMENT
Structural Annotation Overuse3 hits · 4 pts
SeverityFileLineSnippetContext
LOWlib/routes/perplexity/blog.ts75 // Step 1: Extract featured article using data-framer-name attributeCOMMENT
LOWlib/routes/perplexity/blog.ts89 // Step 2: Extract regular articles using data-framer-name="Article Card"COMMENT
LOWlib/routes/perplexity/blog.ts124 // Step 3: Fetch detail pages for items missing pubDate (e.g., featured article)COMMENT
AI Slop Vocabulary1 hit · 3 pts
SeverityFileLineSnippetContext
MEDIUMlib/routes/freecomputerbooks/index.tsx58 // Needing more robust processing if some day more such elements show up.COMMENT
Fake / Example Data2 hits · 2 pts
SeverityFileLineSnippetContext
LOWlib/routes/google/alerts.ts29 params: `[null,[null,null,null,[null,${JSON.stringify(keyword)},"com",[null,"en","US"],null,null,null,0,0],nCODE
LOWlib/routes/mrdx/daily.ts52 // eg: `<a class="foo" daoxiang="foo-bar.htm">Lorem ipsum</a>`COMMENT