AI Slop Code RIsk Monitor

srizzon/git-city

Your GitHub profile as a 3D pixel art building in an interactive city

9.8 Moderate pattern signal View on GitHub

Maintenance and Governance Review

This report summarizes scanner evidence for srizzon/git-city, a TypeScript project with 5,802 GitHub stars. SynthScan examined 237,836 lines of code across 994 source files, recording 823 pattern matches distributed across 6 syntactic categories. The legacy adjusted pattern signal is 9.8 (Moderate 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.

9.8
Adjusted Signal
9.8
Raw Pattern Score
100%
Time Factor
2026-10-09
Last Push
5.8K
Stars
TypeScript
Language
237.8K
Lines of Code
994
Files
823
Pattern Hits
2026-10-12
Scan Date
0.00
HC Hit Rate

Risk Review · v3

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

Cognitive Ownership Risk 1.9/100 · LOW

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

Hallucinated Dependency & Supply Chain Risk 0.0/100 · LOW

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

Agent Over-Engineering Ratio 38.0/100 · MEDIUM

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

PR Review Velocity Impact 38.5/100 · MEDIUM

Which changes need focused human review? 823 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

Run additional scans to build a history of the legacy pattern signal. Score changes are not a measure of AI adoption or code quality.

No multi-scan history yet — run the scanner again to build trend data.

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 0HIGH 0MEDIUM 744LOW 79

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 823 distinct pattern matches across 6 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.

Decorative Section Separators738 hits · 2240 pts
SeverityFileLineSnippetContext
MEDIUMparty/drive.ts44// ─── League city driving ────────────────────────────────────COMMENT
MEDIUMparty/townlive.ts4// ─── Town live tally ────────────────────────────────────────COMMENT
MEDIUMparty/fly.ts5// ─── Tunables ───────────────────────────────────────────────COMMENT
MEDIUMparty/fly.ts21// ─── Bug Invasion boss (live event) ─────────────────────────COMMENT
MEDIUMparty/fly.ts57// ─── Validators ─────────────────────────────────────────────COMMENT
MEDIUMparty/fly.ts77// ─── Types ──────────────────────────────────────────────────COMMENT
MEDIUMparty/fly.ts193// ─── Server ─────────────────────────────────────────────────COMMENT
MEDIUMparty/fly.ts200 // ─── Boss state (live event) ──────────────────────────────COMMENT
MEDIUMparty/smash.ts22// ─── Smash (drive room side) ────────────────────────────────COMMENT
MEDIUMparty/arcade.ts5// ─── Types (inline — party/ can't use @/ alias) ─────────────COMMENT
MEDIUMparty/arcade.ts126// ─── Map config (loaded dynamically from Supabase) ───────────COMMENT
MEDIUMparty/arcade.ts276// ─── Rate limiting ───────────────────────────────────────────COMMENT
MEDIUMparty/arcade.ts298// ─── Game constants ─────────────────────────────────────────COMMENT
MEDIUMparty/arcade.ts304// ─── PX Milestones ──────────────────────────────────────────COMMENT
MEDIUMparty/arcade.ts320// ─── Chat filter ─────────────────────────────────────────────COMMENT
MEDIUMparty/arcade.ts365// ─── Mute tracking ──────────────────────────────────────────COMMENT
MEDIUMparty/arcade.ts372// ─── Server ─────────────────────────────────────────────────COMMENT
MEDIUMparty/arcade.ts390 // ── Game state (10s challenge) ──────────────────────────────COMMENT
MEDIUMparty/arcade.ts396 // ── Load config + restore state ────────────────────────────COMMENT
MEDIUMparty/arcade.ts542 // ── Auth ───────────────────────────────────────────────────COMMENT
MEDIUMparty/arcade.ts592 // ── Connection ─────────────────────────────────────────────COMMENT
MEDIUMparty/arcade.ts680 // ── Messages ───────────────────────────────────────────────COMMENT
MEDIUMparty/arcade.ts858 // ── Game: Start ───────────────────────────────────────────COMMENT
MEDIUMparty/arcade.ts873 // ── Game: Stop ────────────────────────────────────────────COMMENT
MEDIUMparty/arcade.ts894 // ── Score submission (async, always sends result) ─────────COMMENT
MEDIUMparty/arcade.ts1111 // ── Disconnect ─────────────────────────────────────────────COMMENT
MEDIUMparty/arcade.ts1146 // ── HTTP: player count + hot-reload ────────────────────────COMMENT
MEDIUMparty/race.ts31// ─── Town race track ────────────────────────────────────────COMMENT
MEDIUM.claude/skills/gg/kit/src/clock.ts1// ─── Film clock ─────────────────────────────────────────────COMMENT
MEDIUM.claude/skills/gg/kit/src/film.ts1// ─── Film ───────────────────────────────────────────────────COMMENT
MEDIUMpackages/vscode-extension/src/activity/tracker.ts35// ─── State ──────────────────────────────────────────────────────COMMENT
MEDIUMpackages/vscode-extension/src/activity/tracker.ts58// ─── Public API ─────────────────────────────────────────────────COMMENT
MEDIUMpackages/vscode-extension/src/activity/tracker.ts161// ─── State Transitions ─────────────────────────────────────────COMMENT
MEDIUMpackages/vscode-extension/src/activity/tracker.ts182// ─── Event Handling ─────────────────────────────────────────────COMMENT
MEDIUMpackages/vscode-extension/src/activity/tracker.ts272// ─── Idle Timer ─────────────────────────────────────────────────COMMENT
MEDIUMsrc/proxy.ts116 // ── 0. Block bots from API routes ─────────────────────────────────COMMENT
MEDIUMsrc/proxy.ts126 // ── 1. Rate Limit ────────────────────────────────────────────────────COMMENT
MEDIUMsrc/proxy.ts148 // ── 2. Supabase Session Refresh ──────────────────────────────────────COMMENT
MEDIUMsrc/proxy.ts185 // ── 3. Security headers ─────────────────────────────────────────────COMMENT
MEDIUMsrc/proxy.ts191 // ── 3b. Referral capture ────────────────────────────────────────────COMMENT
MEDIUMsrc/proxy.ts205 // ── 4. Attach rate-limit headers so clients can self-throttle ────────COMMENT
MEDIUMsrc/app/arcade/page.tsx336// ─── Room Section ───────────────────────────────────────────COMMENT
MEDIUMsrc/app/arcade/page.tsx371// ─── Room Card ──────────────────────────────────────────────COMMENT
MEDIUMsrc/app/arcade/[slug]/page.tsx247 // ── Client-side prediction ──────────────────────────────────COMMENT
MEDIUMsrc/app/town/[slug]/league-client.tsx197 // ─── Race track ────────────────────────────────────────────COMMENT
MEDIUMsrc/app/town/[slug]/league-client.tsx207 // ─── Editor ────────────────────────────────────────────────COMMENT
MEDIUMsrc/app/town/[slug]/league-client.tsx388 // ─── Drive ─────────────────────────────────────────────────COMMENT
MEDIUMsrc/app/town/[slug]/league-client.tsx657 // ─── Intro ─────────────────────────────────────────────────COMMENT
MEDIUMsrc/app/town/[slug]/league-client.tsx664 // ─── Cover ─────────────────────────────────────────────────COMMENT
MEDIUMsrc/app/town/[slug]/league-client.tsx791 // ─── First steps ───────────────────────────────────────────COMMENT
MEDIUMsrc/app/town/[slug]/league-client.tsx858 // ─── Identity panels (editor) ──────────────────────────────COMMENT
MEDIUMsrc/app/town/[slug]/settings/settings-client.tsx97// ─── Name ────────────────────────────────────────────────────COMMENT
MEDIUMsrc/app/town/[slug]/settings/settings-client.tsx145// ─── Identity ────────────────────────────────────────────────COMMENT
MEDIUMsrc/app/town/[slug]/settings/settings-client.tsx276// ─── Invite link ─────────────────────────────────────────────COMMENT
MEDIUMsrc/app/town/[slug]/settings/settings-client.tsx349// ─── Who can join ────────────────────────────────────────────COMMENT
MEDIUMsrc/app/town/[slug]/settings/settings-client.tsx394// ─── Join requests ───────────────────────────────────────────COMMENT
MEDIUMsrc/app/town/[slug]/settings/settings-client.tsx494// ─── Members ─────────────────────────────────────────────────COMMENT
MEDIUMsrc/app/town/[slug]/settings/settings-client.tsx659// ─── Transfer admin ──────────────────────────────────────────COMMENT
MEDIUMsrc/app/town/[slug]/settings/settings-client.tsx721// ─── Delete ──────────────────────────────────────────────────COMMENT
MEDIUMsrc/app/admin/ads/_components/ad-form-fields.tsx112// ─── Landmark-specific fields ───────────────────────────COMMENT
678 more matches not shown…
Over-Commented Block42 hits · 42 pts
SeverityFileLineSnippetContext
LOWparty/drive.ts41import { SmashRoom } from "./smash";COMMENT
LOWparty/smash.ts21COMMENT
LOW.claude/skills/gg/kit/src/Studio.tsx1"use client";COMMENT
LOW.claude/skills/gg/kit/src/examples/gitcity/EndCard.tsx1"use client";COMMENT
LOWsupabase/config.toml61# If enabled, seeds the database after migrations during a db reset.COMMENT
LOWsupabase/config.toml101# Port to use for the email testing server web interface.COMMENT
LOWsupabase/config.toml161# JWT issuer URL. If not set, defaults to auth.external_url.COMMENT
LOWsupabase/config.toml181COMMENT
LOWsupabase/config.toml201# Number of sign up and sign-in requests that can be made in a 5 minute interval per IP address (excludes anonymous userCOMMENT
LOWsupabase/config.toml221enable_confirmations = falseCOMMENT
LOWsupabase/config.toml241# Uncomment to customize email templateCOMMENT
LOWsupabase/config.toml261COMMENT
LOWsupabase/config.toml401s3_access_key = "env(S3_ACCESS_KEY)"COMMENT
LOW.github/workflows/deploy-staging-migrations.yml1name: Deploy migrations to stagingCOMMENT
LOW.github/workflows/deploy-migrations.yml1name: Deploy migrations to productionCOMMENT
LOW.conductor/settings.toml1#:schema https://conductor.build/schemas/settings.repo.schema.jsonCOMMENT
LOWsrc/app/api/dev/login/route.ts1import { NextResponse } from "next/server";COMMENT
LOWsrc/app/api/cron/refresh-buildings/route.ts21 gifts_sent: 0,COMMENT
LOWsrc/app/api/cron/refresh-buildings/route.ts41// Legacy rows (and year rollovers) have no valid split yet → they take ONE fullCOMMENT
LOWsrc/components/IntroColdOpen.tsx1"use client";COMMENT
LOWsrc/components/BossShareCard.tsx1"use client";COMMENT
LOWsrc/components/BossVictoryScreen.tsx1"use client";COMMENT
LOWsrc/components/EffectsLayer.tsx121// Cosmetics show based on what the camera is LOOKING AT (view frustum + gatherCOMMENT
LOWsrc/components/league/hud/drive/DrivePrompt.tsx1"use client";COMMENT
LOWsrc/components/league/hud/drive/TouchControls.tsx1"use client";COMMENT
LOWsrc/lib/perfMode.ts81 downgradeAutoTier: () => void;COMMENT
LOWsrc/lib/silenceThreeClockWarning.ts1// ─── Silence the THREE.Clock deprecation spam ──────────────────────────────COMMENT
LOWsrc/lib/arcade/engine/sprites.ts1// ─── Cozy People spritesheet format (greyscale + tinting) ───COMMENT
LOWsrc/lib/cosmetics/modelBase.ts1// Single source of truth for where cosmetic GLB models are served from.COMMENT
LOWsrc/lib/trailer/demo/film.ts1// ─── Demo film ──────────────────────────────────────────────COMMENT
LOWsrc/lib/drift/score.ts1// ─── Drift score ────────────────────────────────────────────COMMENT
LOWsrc/lib/drift/scenery.ts1// ─── Drift spot scenery ─────────────────────────────────────COMMENT
LOWsrc/lib/events/schema.ts1// ─── Event config schema + validators ──────────────────────────COMMENT
LOWsrc/lib/league-city/starter.ts1// ─── Starter city ───────────────────────────────────────────COMMENT
LOWsrc/lib/league-city/rivalry-maps.ts1// ─── Claude Code vs Codex maps ──────────────────────────────COMMENT
LOWsrc/lib/league-city/smash.ts1// ─── Smash ──────────────────────────────────────────────────COMMENT
LOWsrc/lib/league-city/race/race.ts1// ─── Races ──────────────────────────────────────────────────COMMENT
LOWsrc/lib/league-city/race/laps.ts1// ─── Lap timing ─────────────────────────────────────────────COMMENT
LOWsrc/lib/league-city/drive/battle.ts1// ─── Drive battle ───────────────────────────────────────────COMMENT
LOWsrc/lib/league-city/drive/bots.ts1// ─── Town bots ──────────────────────────────────────────────COMMENT
LOWsrc/lib/league-city/drive/crown.ts1// ─── Crown Rush ─────────────────────────────────────────────COMMENT
LOWsrc/lib/league-city/editor/state.ts1// ─── League city editor state ───────────────────────────────COMMENT
Hyper-Verbose Identifiers35 hits · 36 pts
SeverityFileLineSnippetContext
LOWsrc/app/admin/email-monitoring/layout.tsx5export default async function AdminEmailMonitoringLayout({ children }: { children: React.ReactNode }) {CODE
LOWsrc/components/EffectsPOC.tsx911function createPreviewWindowTexture(CODE
LOWsrc/components/ThemeSkyFX.tsx338function makeSunsetCirrusDomeTexture(seed = 1, w = 1024, h = 512): THREE.CanvasTexture {CODE
LOWsrc/components/ShopPreview.tsx38function createPreviewWindowTexture(CODE
LOWsrc/lib/items.ts161export async function getOwnedItemsForDevelopers(CODE
LOWsrc/lib/github-api.ts334export async function fetchWeekContributionDays(CODE
LOWsrc/lib/achievements.ts194export async function getAchievementsForDevelopers(CODE
LOW⚡src/lib/himetrica.ts119export function trackDisabledButtonClicked(button_name: string) {CODE
LOW⚡src/lib/himetrica.ts129export function trackEArcadeSurveyStarted() {CODE
LOW⚡src/lib/himetrica.ts133export function trackEArcadeSurveyCompleted() {CODE
LOWsrc/lib/social-links-server.ts11export async function fetchGithubSocialSuggestions(login: string): Promise<SocialLinks> {CODE
LOWsrc/lib/social-links-server.ts46export async function seedSocialLinksFromGithub(developerId: number, login: string): Promise<void> {CODE
LOWsrc/lib/auth-provision.ts42export async function provisionDeveloperOnLogin(CODE
LOWsrc/lib/create-developer.ts14export async function createDeveloperFromGitHub(login: string): Promise<{ id: number; github_login: string }> {CODE
LOWsrc/lib/auth-identity.ts24export function githubLoginsFromIdentities(user: User | null | undefined): string[] {CODE
LOWsrc/lib/leagues/service.ts472export async function getOrCreateInviteToken(viewer: Viewer, league: League): Promise<string> {CODE
LOWsrc/lib/landmarks/welcome-email.ts15export function renderLandmarkWelcomeEmail(landmark: Landmark) {CODE
LOWsrc/lib/notification-senders/league-overtaken.ts33export function renderLeagueOvertakenEmail(d: LeagueOvertakenEmailData, links: EmailLinks) {CODE
LOWsrc/lib/notification-senders/league-overtaken.ts79export async function sendLeagueOvertakenNotification(opts: {CODE
LOWsrc/lib/notification-senders/referral.ts20export function renderReferralJoinedEmail(d: ReferralJoinedData, links: EmailLinks) {CODE
LOWsrc/lib/notification-senders/referral.ts49export function sendReferralJoinedNotification(CODE
LOWsrc/lib/notification-senders/league-joined.ts53export function sendLeagueJoinedNotification(opts: {CODE
LOWsrc/lib/notification-senders/gift.ts63export function sendGiftReceivedNotification(CODE
LOWsrc/lib/notification-senders/streak.ts31export function renderStreakMilestoneEmail(d: StreakMilestoneData, links: EmailLinks) {CODE
LOWsrc/lib/notification-senders/streak.ts69export function sendStreakMilestoneNotification(CODE
LOWsrc/lib/notification-senders/raid.ts69export function sendRaidAlertNotification(CODE
LOWsrc/lib/notification-senders/town-demolished.ts46export function renderTownDemolishedEmail(d: TownDemolishedEmailData, links: EmailLinks) {CODE
LOWsrc/lib/notification-senders/league-invited.ts59export function sendLeagueInvitedNotification(opts: {CODE
LOWsrc/lib/notification-senders/race.ts116export async function sendRacePassedNotification(opts: RacePassedEmailData & { developerId: number }) {CODE
LOWsrc/lib/notification-senders/race.ts135export async function sendRaceChallengeNotification(opts: RaceChallengeEmailData & { developerId: number; fromId: numberCODE
LOWsrc/lib/notification-senders/streak-broken.ts47export function sendStreakBrokenNotification(CODE
LOWsrc/lib/notification-senders/daily-reminder.ts121export async function sendDailyReminderNotification(devId: number, data: DailyReminderData, date: string) {CODE
LOWsrc/lib/notification-senders/league-requests.ts58export function sendJoinRequestNotification(opts: {CODE
LOWsrc/lib/notification-senders/league-requests.ts97export function renderRequestApprovedEmail(d: RequestApprovedEmailData, links: EmailLinks) {CODE
LOWsrc/lib/notification-senders/league-requests.ts122export function sendRequestApprovedNotification(opts: {CODE
AI Slop Vocabulary4 hits · 9 pts
SeverityFileLineSnippetContext
MEDIUMsrc/components/ThemeSkyFX.tsx774 // • 1 sphere draw call = seamless warm horizon glowCOMMENT
MEDIUMsrc/components/ThemeSkyFX.tsx370 draw(0); draw(-w); draw(+w); // seamless wrapCODE
MEDIUMsrc/components/CityCanvas.tsx178 new THREE.Vector3(800, 700, 1000), // WP0: Orbital start (seamless)CODE
MEDIUMsrc/components/CityCanvas.tsx185 new THREE.Vector3(800, 700, 1000), // WP7: Orbital end (seamless)CODE
Modern AI Meta-Vocabulary2 hits · 4 pts
SeverityFileLineSnippetContext
MEDIUMpackage-lock.json3349 "resolved": "https://registry.npmjs.org/@reown/appkit-scaffold-ui/-/appkit-scaffold-ui-1.8.19.tgz",CODE
MEDIUMpackage-lock.json6604 "resolved": "https://registry.npmjs.org/@reown/appkit-scaffold-ui/-/appkit-scaffold-ui-1.7.8.tgz",CODE
Fake / Example Data2 hits · 2 pts
SeverityFileLineSnippetContext
LOWsrc/app/admin/ads/_components/ad-form-fields.tsx162 <input required placeholder="Acme Inc" value={form.brand} onChange={(e) => set("brand", e.target.value)} classNaCODE
LOWsrc/lib/leagues/names.test.ts27 expect(companyLeagueName(" Acme Corp ", "acme")).toBe("Acme Corp");CODE