AI Slop Code Risk Monitor

THU-MAIC/OpenMAIC

SlopCodeMonitor badge for THU-MAIC/OpenMAIC Adjusted legacy signal; badge bands: 25 / 50 / 75 (different from dashboard bands).

Open Multi-Agent Interactive Classroom — Get an immersive, multi-agent learning experience in just one click

2.4 Low pattern signal View on GitHub

Open-Source Code Quality, Security and Technical Debt Review

This report summarizes scanner evidence for THU-MAIC/OpenMAIC, a TypeScript project with 42,014 GitHub stars. SynthScan examined 903,115 lines of code across 3549 source files, recording 1604 pattern matches distributed across 13 syntactic categories. The legacy adjusted pattern signal is 2.4 (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.4
Adjusted Signal
2.4
Raw Pattern Score
100%
Time Factor
2026-10-31
Last Push
42.0K
Stars
TypeScript
Language
903.1K
Lines of Code
3.5K
Files
1.6K
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 7.6/100 · LOW

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

Hallucinated Dependency & Supply Chain Risk 1.3/100 · LOW

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

Agent Over-Engineering Ratio 8.5/100 · LOW

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

PR Review Velocity Impact 10.8/100 · LOW

Which changes need focused human review? 1604 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 9HIGH 2MEDIUM 180LOW 1413

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 1604 distinct pattern matches across 13 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 Identifiers1090 hits · 1124 pts
SeverityFileLineSnippetContext
LOWinstrumentation.ts243async function validateBootConfiguration(): Promise<void> {CODE
LOWrender-service/test/support/fakes.ts32export function createMemoryArtifactStore(): {CODE
LOWrender-service/src/untrusted-html-csp.ts106function matchesAsciiDoctypePrefix(bytes: Uint8Array, index: number): boolean {CODE
LOWrender-service/src/untrusted-html-csp.ts166export function injectUntrustedHtmlCspBytes(CODE
LOWrender-service/src/resource-profile.ts63function requiredProducerEnvironment(profile: ResourceProfile): Record<string, string> {CODE
LOWrender-service/src/resource-profile.ts78function assertCompatibleEnvironment(profile: ResourceProfile, env: NodeJS.ProcessEnv): void {CODE
LOWrender-service/src/resource-profile.ts141export function validateResourceProfileStartup(CODE
LOWrender-service/src/preview-katex.ts21export function resolveKatexDistDirectory(): string {CODE
LOWrender-service/src/preview-validation.ts32export function invalidSlideCanvasElementError(scene: unknown): string | undefined {CODE
LOWrender-service/src/preview-validation.ts55export function countNonSelfContainedSlideMediaReferences(CODE
LOWrender-service/src/preview-validation.ts133export function findNonSelfContainedInteractiveReferences(html: string): string[] {CODE
LOWrender-service/src/chunk-executor.ts217export function renderChunkInTerminatedProcess(CODE
LOWrender-service/src/chunk-executor.ts280async function readCompositionDimensions(CODE
LOWrender-service/src/preview-renderer.ts137export function injectInteractiveStorageShim(html: string): string {CODE
LOWrender-service/src/preview-renderer.ts417export async function installPreviewRequestGuard(page: Page): Promise<() => void> {CODE
LOWrender-service/src/render-executor.ts128export function buildRenderExecutionMetrics(CODE
LOWapp/workbench/new/page.tsx13export default function WorkbenchNewCompatibilityPage() {CODE
LOWapp/api/parse-pdf/route.ts130async function requestedDocumentProvider(CODE
LOWapp/api/persistence/[...path]/route.ts92function indirectEgressWithinGrace(CODE
LOWapp/api/persistence/[...path]/route.ts501async function handlePersistenceRequestInner(CODE
LOWtests/prosemirror/legacy-inline-math.test.ts30function htmlAfterOneCharacterEdit(html: string): string {CODE
LOW⚡tests/workflows/ci-video-export-contract.test.ts82function assertMainPushVersionGate(workflow: Workflow): void {CODE
LOW⚡tests/workflows/ci-video-export-contract.test.ts92function assertHyperframesLintContract(workflow: Workflow): void {CODE
LOW⚡tests/workflows/ci-video-export-contract.test.ts102function assertHyperframesGateContract(workflow: Workflow): void {CODE
LOWtests/workflows/publish-packages-workflow.test.ts38function assertPublishedVersionHandoff(workflow: Workflow): void {CODE
LOWtests/server/url-guard-unconditional-invariant.test.ts158function findNodeEnvGuardedBodyLines(source: string): Set<number> {CODE
LOWtests/document/mineru-cloud.test.ts145function patchFirstEntryDeclaredSize(zipBuf: Buffer, declared: number): Buffer {CODE
LOWtests/pbl/v2/defensive-leaf-readers.test.ts16function projectWithMalformedOptionalLeaves(): PBLProjectV2 {CODE
LOWtests/pbl/v2/drain.test.ts51function deterministicPBLSessionId(stageId = STAGE_ID, learnerKey = LEARNER_KEY): string {CODE
LOWtests/workbench/draft-conversation-reset.test.ts54function shouldShowWorkbenchEmptyState(input: {CODE
LOWtests/workbench/workspace-material-handover.test.ts448 async function uploadOldThenMaybeHandOver(handOver: boolean) {CODE
LOWtests/ai/openai-provider.test.ts26async function captureInjectedRequestBody(CODE
LOWtests/persistence/_material-library-scenarios.ts288export async function deletedThroughLinkScenario(h: ExtractionHarness): Promise<void> {CODE
LOWtests/persistence/_material-library-scenarios.ts491export async function legacyCopyLibraryToolsScenario(h: ExtractionHarness): Promise<void> {CODE
LOWtests/persistence/_material-library-scenarios.ts529export async function ownerListingWithSessionCopyScenario(h: ExtractionHarness): Promise<void> {CODE
LOWtests/persistence/_material-library-scenarios.ts551export async function sessionListingPaginationScenario(h: ExtractionHarness): Promise<void> {CODE
LOWtests/persistence/_material-library-scenarios.ts627export async function listingDerivedFieldsScenario(h: ExtractionHarness): Promise<void> {CODE
LOWtests/persistence/_material-library-scenarios.ts931export async function mediaLibraryScopeScenario(h: ExtractionHarness): Promise<void> {CODE
LOWtests/persistence/_material-library-scenarios.ts1011export async function releaseRefusedOutputsScenario(h: ExtractionHarness): Promise<void> {CODE
LOWtests/persistence/_material-library-scenarios.ts1380export async function documentImageBudgetScenario(CODE
LOWtests/persistence/_material-library-scenarios.ts1440export async function documentImagesQuotaScenario(h: ExtractionHarness): Promise<void> {CODE
LOWtests/persistence/_material-library-scenarios.ts1696export async function organizeAcrossClaimScenario(h: ExtractionHarness): Promise<void> {CODE
LOWtests/persistence/_material-library-scenarios.ts1723export async function watcherNullExtractionScenario(h: ExtractionHarness): Promise<void> {CODE
LOWtests/persistence/_owner-extraction-scenarios.ts367export async function uploadQueuesExtractionScenario(h: ExtractionHarness): Promise<void> {CODE
LOWtests/persistence/_owner-extraction-scenarios.ts440export async function twoConversationsOneExtractionScenario(h: ExtractionHarness): Promise<void> {CODE
LOWtests/persistence/_owner-extraction-scenarios.ts1032export async function schemaCompatibilityScenario(h: ExtractionHarness): Promise<void> {CODE
LOWtests/persistence/_owner-extraction-scenarios.ts1219export async function cacheCollectorOrderScenario(h: ExtractionHarness): Promise<void> {CODE
LOWtests/persistence/_owner-extraction-scenarios.ts1276export async function sameKeyConcurrentSourcesScenario(h: ExtractionHarness): Promise<void> {CODE
LOWtests/persistence/_owner-extraction-scenarios.ts1325export async function claimIntoSameContentScenario(h: ExtractionHarness): Promise<void> {CODE
LOWtests/persistence/_owner-extraction-scenarios.ts1405export async function failedImageDownloadScenario(h: ExtractionHarness): Promise<void> {CODE
LOWtests/persistence/_owner-extraction-scenarios.ts1460export async function cancelledImageDownloadScenario(h: ExtractionHarness): Promise<void> {CODE
LOWtests/persistence/_owner-extraction-scenarios.ts1576export async function sameBytesOtherMimeScenario(h: ExtractionHarness): Promise<void> {CODE
LOWtests/persistence/_owner-extraction-scenarios.ts1625export async function lostClaimStopsProvidersScenario(h: ExtractionHarness): Promise<void> {CODE
LOWtests/persistence/_owner-extraction-scenarios.ts1771export async function documentServiceUnavailableScenario(h: ExtractionHarness): Promise<void> {CODE
LOWtests/persistence/_owner-material-upgrade-scenarios.ts164export async function assetIdEraWithRowsScenario(h: UpgradeHarness): Promise<void> {CODE
LOWtests/persistence/_owner-material-upgrade-scenarios.ts189export async function preRootsDropRecoveryScenario(h: UpgradeHarness): Promise<void> {CODE
LOWtests/persistence/_owner-claim-scenarios.ts705export async function materialFolderClaimScenario(h: ClaimHarness): Promise<void> {CODE
LOWtests/persistence/_owner-claim-scenarios.ts734export async function unfiledOnlyMaterialClaimScenario(h: ClaimHarness): Promise<void> {CODE
LOWtests/persistence/_owner-claim-scenarios.ts749export async function emptyFoldersOnlyMaterialClaimScenario(h: ClaimHarness): Promise<void> {CODE
LOWtests/persistence/_owner-claim-scenarios.ts769export async function selfReassignMaterialFoldersScenario(h: ClaimHarness): Promise<void> {CODE
1030 more matches not shown…
Decorative Section Separators160 hits · 480 pts
SeverityFileLineSnippetContext
MEDIUMopenmaic.example.yml1# =============================================================================COMMENT
MEDIUMopenmaic.example.yml32# =============================================================================COMMENT
MEDIUMapp/page.tsx448 // ─── Folder handlers ────────────────────────────────────────────────COMMENT
MEDIUMapp/page.tsx1970// ─── Classroom Card — clean, minimal style ──────────────────────COMMENT
MEDIUMtests/workbench/stage-freshness-sync.test.ts105// ── server doubles ──────────────────────────────────────────────────────────COMMENT
MEDIUMtests/workbench/material-library-page.test.ts276// ── Reading and showing ────────────────────────────────────────────────────COMMENT
MEDIUMtests/workbench/material-library-page.test.ts533// ── Staying fresh (option B) on the page ───────────────────────────────────COMMENT
MEDIUMtests/workbench/material-library-page.test.ts683// ── Leaving ────────────────────────────────────────────────────────────────COMMENT
MEDIUMtests/workbench/material-library-page.test.ts697// ── Uploading ──────────────────────────────────────────────────────────────COMMENT
MEDIUMtests/workbench/material-library-page.test.ts848// ── New folder, inline ─────────────────────────────────────────────────────COMMENT
MEDIUMtests/workbench/material-library-page.test.ts1176// ── Folder rows ────────────────────────────────────────────────────────────COMMENT
MEDIUMtests/workbench/material-library-page.test.ts1213// ── Renaming in place ──────────────────────────────────────────────────────COMMENT
MEDIUMtests/workbench/material-library-page.test.ts1666// ── Out of a folder, and the rows' columns (#1835 review §2, §3) ──────────COMMENT
MEDIUMtests/workbench/material-library-page.test.ts1666// ── Out of a folder, and the rows' columns (#1835 review §2, §3) ──────────COMMENT
MEDIUMtests/workbench/material-library-page.test.ts1712// ── The original, and Move to… (#1835 teacher feedback 3, review §6) ──────COMMENT
MEDIUMtests/workbench/material-library-page.test.ts1712// ── The original, and Move to… (#1835 teacher feedback 3, review §6) ──────COMMENT
MEDIUMtests/workbench/material-library-page.test.ts1852// ── Deleting ───────────────────────────────────────────────────────────────COMMENT
MEDIUMtests/workbench/material-library-tree.test.ts19// ── A paging server ────────────────────────────────────────────────────────COMMENT
MEDIUMtests/workbench/material-library-tree.test.ts130// ── The hook, mounted ──────────────────────────────────────────────────────COMMENT
MEDIUMtests/workbench/material-library-tree.test.ts236// ── T1–T3: reading the tree ────────────────────────────────────────────────COMMENT
MEDIUMtests/workbench/material-library-tree.test.ts302// ── T4–T7: refreshing ──────────────────────────────────────────────────────COMMENT
MEDIUMtests/workbench/material-library-tree.test.ts402// ── T8–T10c: the teacher acts while reads are on their way ─────────────────COMMENT
MEDIUMtests/workbench/material-library-tree.test.ts509// ── T11–T12: search ────────────────────────────────────────────────────────COMMENT
MEDIUMtests/workbench/material-library-tree.test.ts562// ── T14–T15: polling and runs ──────────────────────────────────────────────COMMENT
MEDIUMtests/workbench/material-library-tree.test.ts642// ── T16–T19: one refresh per return, nothing real swallowed ────────────────COMMENT
MEDIUMtests/workbench/material-library-tree.test.ts728// ── T20: leaving the page ──────────────────────────────────────────────────COMMENT
MEDIUMtests/workbench/material-library-tree.test.ts751// ── T21–T22: review of R2 ─────────────────────────────────────────────────COMMENT
MEDIUMtests/web-search/claude.test.ts3// ── AI SDK mocks ──────────────────────────────────────────────────────────────COMMENT
MEDIUMtests/web-search/claude.test.ts72 // ── fetch interceptor: allowed_callers injection ──────────────────────────COMMENT
MEDIUMtests/web-search/claude.test.ts155 // ── model + tool selection ─────────────────────────────────────────────────COMMENT
MEDIUMtests/web-search/claude.test.ts232 // ── provider configuration ────────────────────────────────────────────────COMMENT
MEDIUMtests/web-search/claude.test.ts294 // ── result mapping ─────────────────────────────────────────────────────────COMMENT
MEDIUMtests/web-search/claude.test.ts372 // ── errors ─────────────────────────────────────────────────────────────────COMMENT
MEDIUMtests/export/classroom-zip.test.ts12// ─── rewriteAudioRefsToIds ────────────────────────────────────COMMENT
MEDIUMtests/export/classroom-zip.test.ts83// ─── actionsToManifest ────────────────────────────────────────COMMENT
MEDIUMtests/export/classroom-zip.test.ts170// ─── Manifest round-trip ──────────────────────────────────────COMMENT
MEDIUMtests/media/resolve-stored-bytes-equivalence.test.ts92// ─── Frozen @ e1578083 — lib/export/classroom-zip-utils.ts ──────────────────COMMENT
MEDIUMtests/media/resolve-stored-bytes-equivalence.test.ts107// ─── Frozen @ e1578083 — lib/export/use-export-pptx.ts ──────────────────────COMMENT
MEDIUMtests/media/resolve-stored-bytes-equivalence.test.ts194// ─── Frozen @ e1578083 — lib/video-export-app/collect.ts ────────────────────COMMENT
MEDIUMtests/media/resolve-stored-bytes-equivalence.test.ts264// ─── Matrix ─────────────────────────────────────────────────────────────────COMMENT
MEDIUMtests/media/resolve-stored-bytes-equivalence.test.ts396// ─── Recording rig ──────────────────────────────────────────────────────────COMMENT
MEDIUMcomponents/scene-renderers/quiz-view.tsx45// ─── Types ──────────────────────────────────────────────────────────────────COMMENT
MEDIUMcomponents/scene-renderers/quiz-view.tsx141// ─── Sub-components ─────────────────────────────────────────────────────────COMMENT
MEDIUMcomponents/scene-renderers/quiz-view.tsx691// ─── Main Component ─────────────────────────────────────────────────────────COMMENT
MEDIUMcomponents/chat/inline-action-tag.tsx32// ── Style tokens ──────────────────────────────────────────────COMMENT
MEDIUMcomponents/chat/inline-action-tag.tsx47// ── Action config ─────────────────────────────────────────────COMMENT
MEDIUMcomponents/chat/inline-action-tag.tsx83// ── Component ─────────────────────────────────────────────────COMMENT
MEDIUMcomponents/edit/AgentsView/AgentRosterPanel.tsx47// ─── Avatar with camera overlay ──────────────────────────────────────────────COMMENT
MEDIUMcomponents/edit/AgentsView/AgentRosterPanel.tsx86// ─── Inline editable name ────────────────────────────────────────────────────COMMENT
MEDIUMcomponents/edit/AgentsView/AgentRosterPanel.tsx156// ─── Persona textarea ─────────────────────────────────────────────────────────COMMENT
MEDIUMcomponents/edit/AgentsView/AgentRosterPanel.tsx219// ─── Teacher card ─────────────────────────────────────────────────────────────COMMENT
MEDIUMcomponents/edit/AgentsView/AgentRosterPanel.tsx317// ─── Classmate card ────────────────────────────────────────────────────────────COMMENT
MEDIUMcomponents/edit/AgentsView/AgentRosterPanel.tsx475// ─── Main panel ───────────────────────────────────────────────────────────────COMMENT
MEDIUMcomponents/workbench/compose-extras.tsx37// ── Skills (the `/` and composer `+` menus) ──────────────────────────────────COMMENT
MEDIUMcomponents/workbench/compose-extras.tsx256// ── Materials ────────────────────────────────────────────────────────────────COMMENT
MEDIUMcomponents/workbench/chat/tool-presentation.ts125// ── Small helpers ────────────────────────────────────────────────────────────COMMENT
MEDIUMcomponents/workbench/chat/tool-presentation.ts264// ── The rule table ───────────────────────────────────────────────────────────COMMENT
MEDIUMcomponents/workbench/chat/tool-presentation.ts511 // ── The web ──────────────────────────────────────────────────────────────COMMENT
MEDIUMcomponents/workbench/chat/tool-presentation.ts677 // ── The plan ─────────────────────────────────────────────────────────────COMMENT
MEDIUMcomponents/workbench/chat/tool-presentation.ts678 // ── One page ─────────────────────────────────────────────────────────────COMMENT
100 more matches not shown…
Over-Commented Block149 hits · 148 pts
SeverityFileLineSnippetContext
LOWopenmaic.example.yml1# =============================================================================COMMENT
LOWopenmaic.example.yml21# - slots: which provider and model each use of AI gets by default. UsersCOMMENT
LOWopenmaic.example.yml41COMMENT
LOWopenmaic.example.yml61 # Without voices/options.defaultVoice the built-in behavior is unchanged.COMMENT
LOWopenmaic.example.yml81 # apiKey: ${IMAGE_GLM_API_KEY}COMMENT
LOWopenmaic.example.yml101 # accessKeySecret: ${ALIDOCMIND_ACCESS_KEY_SECRET}COMMENT
LOWopenmaic.example.yml121 # model: openai:gpt-5.5COMMENT
LOWdocker-compose.db.yml1# Local development database: `pnpm db:up` / `pnpm db:down`.COMMENT
LOWdocker-compose.yml41 # The address the port above is published on, passed in so the app canCOMMENT
LOWdocker-compose.yml81 test: ['CMD-SHELL', 'pg_isready -U openmaic -d openmaic']COMMENT
LOWinstrumentation.ts21COMMENT
LOWinstrumentation.ts241 * checks in `validateServerConfig`) are not here and never stop the process.COMMENT
LOWinstrumentation.ts261 // MODEL_ROUTES left without openmaic.yml, rather than discovered by theCOMMENT
LOWinstrumentation.ts281 const { resolveAssetPendingTtlMs } = await import('@/lib/persistence/asset-pending-ttl');COMMENT
LOWinstrumentation.ts301 // const { configurePersistenceHooks, configureAssetByteStore } =COMMENT
LOWnext.config.ts21 // sharp's native libvips libraries are loaded via dlopen and are notCOMMENT
LOWrender-service/docker-entrypoint.sh1#!/bin/shCOMMENT
LOWrender-service/scripts/egress-smoke.sh1#!/bin/shCOMMENT
LOWapp/layout.tsx21COMMENT
LOWapp/api/persistence/[...path]/route.ts241 // One identity for all three contracts, resolved server-side by the ownerCOMMENT
LOWtests/persistence/document-asset-references.pg.test.ts481 const stamped = await lifecycle(assetId);COMMENT
LOWtests/lib/chat/pi/prompts.test.ts761 const large = build(50000);COMMENT
LOWtests/media/proxy-media-cache.test.ts581 // …and reads the COMPLETE body, byte-identical.COMMENT
LOWtests/media/resolve-stored-bytes-equivalence.test.ts601 }COMMENT
LOW…ts/media/workbench-video-completion-resolution.test.ts201 expectedMediaRef: undefined,COMMENT
LOWcomponents/stage.tsx101 // The provider is the host boundary. Session state intentionally does notCOMMENT
LOWcomponents/stage.tsx281 // will mount fresh; its engine effect re-inits). Playback→edit mustCOMMENT
LOWcomponents/stage.tsx381 // Deliberately NO transform (translateY) on these layers: the editCOMMENT
LOWcomponents/scene-renderers/classroom-complete.tsx361 const trailItems = TYPE_ORDER.filter((type) => (summary.countsByType[type] ?? 0) > 0).map(COMMENT
LOWcomponents/scene-renderers/classroom-complete.tsx381 // container" both ways, we'd ping-pong between the two layouts (compactCOMMENT
LOWcomponents/scene-renderers/pbl-renderer.tsx81 readonly sceneId: string;COMMENT
LOWcomponents/scene-renderers/pbl-renderer.tsx101 // blank during native fullscreen. Default to <body> (classroom is anCOMMENT
LOWcomponents/scene-renderers/pbl-renderer.tsx121 // chat. Transient by design: a full page reload ends the streams and resetsCOMMENT
LOWcomponents/scene-renderers/pbl/v2/hero.tsx161 };COMMENT
LOWcomponents/scene-renderers/pbl/v2/hero.tsx181 // Instructor mentor. The subtitle is a short fixed tagline (mirroringCOMMENT
LOWcomponents/scene-renderers/pbl/v2/workspace.tsx121 const [taskBusy, setTaskBusy] = useState(false);COMMENT
LOWcomponents/scene-renderers/pbl/v2/chat.tsx241 // wrapup) is fired path-independently by the scenario stage-openerCOMMENT
LOWcomponents/edit/EditChromeRoot.tsx81 // Safety net: the editor chunk (slide + quiz surface registration) isCOMMENT
LOWcomponents/edit/PlaybackChromeRoot.tsx1861 // isDiscussionPaused value (e.g. voice input's onTranscription callbackCOMMENT
LOWcomponents/edit/SlideNavRail/SlideNavRail.tsx61 const insertSceneAfter = useStageStore.use.insertSceneAfter();COMMENT
LOWcomponents/edit/SlideNavRail/SlideNavRail.tsx301 : prefersReducedMotionCOMMENT
LOWcomponents/edit/surfaces/slide/ElementPickLayer.tsx301 // re-shape it — neither fires a window resize, but the portaled box tracksCOMMENT
LOWcomponents/edit/ActionsBar/ActionsBar.tsx1041 const sceneOrder = scene?.order ?? 0;COMMENT
LOWcomponents/workbench/WorkbenchChat.tsx981 replaceDraft('');COMMENT
LOW…ide-renderer/components/element/ImageElement/index.tsx41 const { clipShape, imgPosition } = useClipImage(elementInfo);COMMENT
LOW…er/Editor/Canvas/hooks/useInsertFromCreateSelection.ts81 const insertElementFromCreateSelection = useCallback(COMMENT
LOWpackages/@openmaic/renderer/src/snapshot/index.ts141 completeInlineMath(container);COMMENT
LOWpackages/@openmaic/renderer/src/snapshot/index.ts201 // attribute and renders nothing for an undecoded source), so a video thatCOMMENT
LOWpackages/@openmaic/renderer/src/snapshot/index.ts221 console.debug('[slideToPng] container ready', {COMMENT
LOW…s/@openmaic/importer/src/serializer/shapeSerializer.ts341 tailEnd: LineEndInfo | undefined,COMMENT
LOW…es/@openmaic/importer/src/serializer/textSerializer.ts361 // OOXML spcPct: 100000 = "single spacing" = 1.0× the font's line height.COMMENT
LOW…es/@openmaic/importer/src/serializer/textSerializer.ts1501 // 由 -indent 合成 marL」的情形 marL==|indent|,取值不变、不受影响。COMMENT
LOW…es/@openmaic/importer/src/serializer/textSerializer.ts1561 // paragraphs need no <br/> — the wrapper <div> already has a fixed lineCOMMENT
LOWpackages/@openmaic/importer/src/shapes/presets.ts4641 // center = (g22-g17, g20) = (g22-g17, g20), endpoint = (g22-g17, g20+g17)COMMENT
LOWpackages/@openmaic/importer/src/shapes/presets.ts4661 // endY = (g10-g17)+g17*sin(180°) = g10-g17 = g20COMMENT
LOW…aic/storage/test/agent-session-concurrency-contract.ts141 // This is a result-consistency probe, not a deadlock probe. EveryCOMMENT
LOW…kages/@openmaic/storage/test/pg-asset-store.pg.test.ts1421 // entry row unchanged -- so no EvalPlanQual -- and keeps its ownCOMMENT
LOWpackages/@openmaic/storage/src/asset/collector.ts521 // whole shape of the block below. The blob pass is correct with or withoutCOMMENT
LOWpackages/@openmaic/storage/src/asset/collector.ts581 // pass leaves behind, and this one cannot starve a blob: every blob isCOMMENT
LOWpackages/@openmaic/storage/src/asset/collector.ts981 const stageRow = stage.rows[0];COMMENT
89 more matches not shown…
Fake / Example Data128 hits · 128 pts
SeverityFileLineSnippetContext
LOWtests/classroom/restored-video-resolution.test.ts182 expect(resolution).toEqual({ kind: 'placeholder' });CODE
LOWtests/workbench/material-mention.test.ts778 .getAttribute('placeholder');CODE
LOWtests/workbench/media-lifecycle.test.ts79 expect(resolveMediaRef(binding.sourceRef, binding.task).kind).toBe('placeholder');CODE
LOWtests/hooks/use-slide-background-style.test.ts7 resolution: { kind: 'placeholder' } as { kind: 'placeholder' } | { kind: 'url'; url: string },CODE
LOWtests/hooks/use-slide-background-style.test.ts46 mocks.resolution = { kind: 'placeholder' };CODE
LOWtests/slide-renderer/screen-canvas-renderer.test.ts312 expect(getPlaybackImageState({ kind: 'placeholder' })).toBe('pending');CODE
LOWtests/slide-renderer/use-resolved-image-src.test.ts54 expect(r.resolution).toEqual({ kind: 'placeholder' });CODE
LOWtests/slide-renderer/use-resolved-image-src.test.ts110 expect(r.resolution).toEqual({ kind: 'placeholder' });CODE
LOWtests/slide-renderer/use-resolved-image-src.test.ts122 expect(r.resolution).toEqual({ kind: 'placeholder' });CODE
LOWtests/slide-renderer/use-resolved-image-src.test.ts149 expect(r.resolution).toEqual({ kind: 'placeholder' });CODE
LOWtests/video-export/interactive.test.ts63 base: { kind: 'placeholder', reason: expect.stringContaining('missing') },CODE
LOWtests/video-export/interactive.test.ts91 kind: 'placeholder',CODE
LOWtests/video-export/visuals.test.ts597 base: { kind: 'placeholder' },CODE
LOWtests/export/pptx-scene-placeholders.test.ts351 if (packEntry.kind !== 'placeholder' || standaloneEntry.kind !== 'placeholder') {CODE
LOWtests/export/pptx-scene-placeholders.test.ts365 if (quiz.kind !== 'placeholder') throw new Error('expected placeholder');CODE
LOWtests/export/pptx-scene-placeholders.test.ts510 if (first.kind !== 'placeholder') throw new Error('expected placeholder');CODE
LOWtests/export/pptx-scene-placeholders.test.ts668 if (entry.kind !== 'placeholder') throw new Error('expected placeholder');CODE
LOWtests/export/pptx-scene-placeholders.test.ts763 if (entry.kind !== 'placeholder') throw new Error('expected placeholder');CODE
LOWtests/import/import-media-assets.test.ts461 { id: 'placeholder', type: 'image', src: 'gen_img_waiting' },CODE
LOWtests/agent-runtime/dsl-tools.test.ts509 const rejected = await patch.execute('placeholder', {CODE
LOWtests/media/resolve-media-ref.test.ts121 expected: { kind: 'placeholder' },CODE
LOWtests/media/resolve-media-ref.test.ts141 expected: { kind: 'placeholder' },CODE
LOWtests/media/resolve-media-ref.test.ts188 kind: 'placeholder',CODE
LOWtests/media/resolve-media-ref.test.ts197 { kind: 'placeholder' } as const,CODE
LOWtests/media/media-resolution-surface-matrix.test.ts167 if (resolution.kind === 'pending' || resolution.kind === 'placeholder') return 'skeleton';CODE
LOWtests/media/media-resolution-surface-matrix.test.ts422 expect(markup).not.toContain('placeholder');CODE
LOWcomponents/whiteboard/whiteboard-canvas.tsx366 key="placeholder"CODE
LOWcomponents/slide-renderer/SlideThumbnail.tsx59 media?.resolution.kind === 'pending' || media?.resolution.kind === 'placeholder';CODE
LOWcomponents/slide-renderer/SlideThumbnail.tsx146 if (media?.resolution.kind === 'pending' || media?.resolution.kind === 'placeholder') {CODE
LOW…ide-renderer/components/element/VideoElement/index.tsx71 {resolution.kind === 'pending' || resolution.kind === 'placeholder' ? (CODE
LOW…r/components/element/VideoElement/BaseVideoElement.tsx50 const showSkeleton = resolution.kind === 'pending' || resolution.kind === 'placeholder';CODE
LOW…ide-renderer/components/element/ImageElement/index.tsx158 {resolution.kind === 'pending' || resolution.kind === 'placeholder' ? (CODE
LOW…r/components/element/ImageElement/BaseImageElement.tsx37 const showSkeleton = resolution.kind === 'pending' || resolution.kind === 'placeholder';CODE
LOW…ponents/slide-renderer/Editor/RendererScreenCanvas.tsx43 media?.resolution.kind === 'pending' || media?.resolution.kind === 'placeholder';CODE
LOW…ponents/slide-renderer/Editor/RendererScreenCanvas.tsx193 if (resolution.kind === 'pending' || resolution.kind === 'placeholder') return 'pending';CODE
LOW…ponents/slide-renderer/Editor/RendererScreenCanvas.tsx212 const state = getPlaybackImageState(media?.resolution ?? { kind: 'placeholder' });CODE
LOWpackages/pptxgenjs/types/index.d.ts817 'placeholder' = 'placeholder',CODE
LOWpackages/pptxgenjs/src/gen-objects.ts77 else if (MASTER_OBJECTS[key] && key === 'placeholder') {CODE
LOWpackages/pptxgenjs/src/gen-objects.ts1050 item => item._type === 'placeholder' && item.options && item.options.placeholder && item.options.placeholder === itCODE
LOWpackages/pptxgenjs/src/gen-xml.ts423 strSlideXml += `<p:nvPr>${slideItemObj._type === 'placeholder' ? genXmlPlaceholder(slideItemObj) : genXmlPlaceholderCODE
LOWpackages/pptxgenjs/src/gen-xml.ts1229 else if (slideObj._type === 'placeholder') strSlideXml += `<a:lstStyle>${genXmlParagraphProperties(slideObj, true)}</aCODE
LOWpackages/pptxgenjs/src/core-enums.ts729 'placeholder' = 'placeholder',CODE
LOWpackages/pptxgenjs/src/core-enums.ts738 'placeholder' = 'placeholder',CODE
LOWlib/chat/pi/element-reference.ts1392 'placeholder',CODE
LOWlib/video-export/compile.ts94 scene.base.kind === 'placeholder' && scene.base.reasonCODE
LOWlib/video-export/compile.ts105 base: { ...scene.base, kind: 'placeholder', reason },CODE
LOWlib/video-export/ir.ts121 kind: z.literal('placeholder'),CODE
LOWlib/video-export/passes/interactive.ts54 return { ...timeline, base: { kind: 'placeholder', reason } };CODE
LOWlib/video-export/passes/timeline.ts134 base: { kind: supported ? 'slide-snapshot' : 'placeholder' },CODE
LOWlib/video-export/emit-hyperframes/index.ts292 : scene.base.kind === 'placeholder'CODE
LOWlib/export/pptx-scene-placeholders.ts107 | { kind: 'placeholder'; placeholder: ScenePlaceholder };CODE
LOWlib/export/pptx-scene-placeholders.ts259 kind: 'placeholder',CODE
LOWlib/export/pptx-scene-placeholders.ts286 kind: 'placeholder',CODE
LOWlib/export/pptx-scene-placeholders.ts313 kind: 'placeholder',CODE
LOWlib/export/use-export-pptx.ts568 if (entry.kind === 'placeholder') {CODE
LOWlib/i18n/workbench-locales/ko-KR.json33 "placeholder": "답변을 적어 주세요",CODE
LOWlib/i18n/workbench-locales/ja-JP.json33 "placeholder": "回答を入力",CODE
LOWlib/i18n/workbench-locales/ar-SA.json33 "placeholder": "اكتب إجابتك",CODE
LOWlib/i18n/workbench-locales/pt-BR.json33 "placeholder": "Escreva sua resposta",CODE
LOWlib/i18n/workbench-locales/de-DE.json33 "placeholder": "Schreibe deine Antwort",CODE
68 more matches not shown…
Hallucination Indicators9 hits · 105 pts
SeverityFileLineSnippetContext
CRITICALtests/video-export/video-render-cache.test.ts122 expect(mocks.toast.loading.mock.calls.some(([key]) => key === 'export.videoCompiling')).toBe(CODE
CRITICAL…lide-renderer/components/element/ProsemirrorEditor.tsx179 const mark = editorView.current.state.schema.marks.fontname.create({CODE
CRITICAL…lide-renderer/components/element/ProsemirrorEditor.tsx185 const mark = editorView.current.state.schema.marks.fontsize.create({CODE
CRITICAL…lide-renderer/components/element/ProsemirrorEditor.tsx198 const mark = editorView.current.state.schema.marks.fontsize.create({CODE
CRITICAL⚡…lide-renderer/components/element/ProsemirrorEditor.tsx211 const mark = editorView.current.state.schema.marks.fontsize.create({CODE
CRITICAL⚡…lide-renderer/components/element/ProsemirrorEditor.tsx220 const mark = editorView.current.state.schema.marks.forecolor.create({CODE
CRITICAL⚡…lide-renderer/components/element/ProsemirrorEditor.tsx230 const mark = editorView.current.state.schema.marks.backcolor.create({CODE
CRITICAL…lide-renderer/components/element/ProsemirrorEditor.tsx330 const mark = editorView.current.state.schema.marks.link.create({CODE
CRITICAL…lide-renderer/components/element/ProsemirrorEditor.tsx348 const mark = editorView.current.state.schema.marks.link.create({CODE
Modern AI Meta-Vocabulary17 hits · 45 pts
SeverityFileLineSnippetContext
MEDIUMCHANGELOG.md870- **Video export (MP4)** — Export a lesson as a rendered video: a `VideoTimeline` IR with a pure compile pipeline [#913]CODE
MEDIUMREADME.md50- **2026-09-24** — [v1.1.0](https://github.com/THU-MAIC/OpenMAIC/releases/tag/v1.1.0): agentic classroom chat (ask aboutCODE
MEDIUMtests/pbl/v2/completion-stats.test.ts178 // When the scored coverage is present, the read-only scaffold fallbackCOMMENT
MEDIUMtests/pbl/v2/completion-stats.test.ts218 // The structured review survives as an unscored scaffold.COMMENT
MEDIUMtests/pbl/v2/completion-stats.test.ts845 const p = rpProjectWithGoals(); // scaffold has 2 goals for ms-rpCODE
MEDIUMtests/pbl/v2/planner.test.ts487 // We can't run the full agentic loop without an LLM, but theCOMMENT
MEDIUMtests/pbl/v2/instructor.test.ts728 // resolves '' → intermediate, so the scaffold label + release thresholdCOMMENT
MEDIUMtests/web-search/firecrawl.test.ts26 description: ' ## OpenMAIC\n\nOpen multi-agent interactive classroom. ',CODE
MEDIUMtests/web-search/firecrawl.test.ts75 content: '## OpenMAIC Open multi-agent interactive classroom.',CODE
MEDIUM…c/generation/prompts-pbl/planner-single-call-system.md669. **Hints and descriptions GUIDE, never SOLVE — the #1 failure.** A hint or `description` must NEVER contain the literaCODE
MEDIUMlib/pbl/v2/agents/evaluator.ts296 // scaffold. The guard keeps normal projects completely out of this pathCOMMENT
MEDIUMlib/pbl/v2/agents/instructor.ts477 // During a stage-synthesis checkpoint the scaffold verdict is noise:COMMENT
MEDIUMlib/pbl/v2/agents/planner.ts152 // The agentic loop. The Planner emits tool calls untilCOMMENT
MEDIUMlib/pbl/v2/operations/runtime/completion-stats.ts236 // act, with a goals array of exactly the scaffold's length. A mismatchCOMMENT
MEDIUMlib/pbl/v2/operations/runtime/completion-stats.ts318 // alignment gate), still surface the authored act→goal scaffold read-only soCOMMENT
MEDIUMlib/pbl/v2/operations/runtime/completion-stats.ts320 // Mutually exclusive with goalCoverage; omitted when the scaffold is empty.COMMENT
MEDIUMlib/pbl/v2/operations/runtime/eval-prompts.ts465 // the very same scaffold. This drives the "what you accomplished" credit andCOMMENT
Structural Annotation Overuse23 hits · 40 pts
SeverityFileLineSnippetContext
LOW…@openmaic/generation/templates/slide-content/system.md552#### Step 1: Design the background shape firstCOMMENT
LOW…@openmaic/generation/templates/slide-content/system.md563#### Step 2: Calculate text dimensionsCOMMENT
LOW…@openmaic/generation/templates/slide-content/system.md572#### Step 3: Center the text inside the shapeCOMMENT
LOW⚡packages/@openmaic/generation/src/action-parser.ts48 // Step 1: Strip markdown code fences if presentCOMMENT
LOW⚡packages/@openmaic/generation/src/action-parser.ts51 // Step 2: Find the JSON array rangeCOMMENT
LOWpackages/@openmaic/generation/src/action-parser.ts62 // Step 3: Parse — try JSON.parse first, then jsonrepair, fallback to partial-jsonCOMMENT
LOWpackages/@openmaic/generation/src/action-parser.ts89 // Step 4: Convert items to Action[]COMMENT
LOW⚡packages/@openmaic/generation/src/action-parser.ts132 // Step 5: Post-processing — discussion must be the last action, and at most oneCOMMENT
LOW⚡packages/@openmaic/generation/src/action-parser.ts138 // Step 6: Filter out slide-only actions for non-slide scenes (defense in depth)COMMENT
LOW⚡packages/@openmaic/generation/src/action-parser.ts148 // Step 7: Filter by allowedActions whitelist (defense in depth for role-based isolation)COMMENT
LOWlib/chat/structured-output.ts134 // Step 1: Find the opening `[` if not yet foundCOMMENT
LOW⚡lib/chat/structured-output.ts145 // Step 2: Check if the array is complete (closing `]` found)COMMENT
LOW⚡lib/chat/structured-output.ts149 // Step 3: Try incremental parse — jsonrepair first (fixes unescaped quotes), fallback to partial-jsonCOMMENT
LOWlib/chat/structured-output.ts170 // Step 4: Determine how many items are fully completeCOMMENT
LOWlib/chat/structured-output.ts184 // Step 5: Emit newly completed itemsCOMMENT
LOWlib/chat/structured-output.ts218 // Step 6: Stream partial text delta for the trailing itemCOMMENT
LOWlib/chat/structured-output.ts230 // Step 7: Mark done if array is closedCOMMENT
LOWlib/pdf/mineru-cloud.ts518 // Step 1: Create batch — request presigned upload URLCOMMENT
LOWlib/pdf/mineru-cloud.ts557 // Step 2: Upload document to presigned URLCOMMENT
LOWlib/pdf/mineru-cloud.ts590 // Step 3: Poll for completionCOMMENT
LOWlib/audio/asr-providers.ts44 * // Step 1: Upload audio fileCOMMENT
LOWlib/audio/asr-providers.ts69 * // Step 2: Request transcriptionCOMMENT
LOWlib/audio/asr-providers.ts84 * // Step 3: Poll for completionCOMMENT
Verbosity Indicators20 hits · 35 pts
SeverityFileLineSnippetContext
LOW⚡packages/@openmaic/generation/src/action-parser.ts48 // Step 1: Strip markdown code fences if presentCOMMENT
LOW⚡packages/@openmaic/generation/src/action-parser.ts51 // Step 2: Find the JSON array rangeCOMMENT
LOWpackages/@openmaic/generation/src/action-parser.ts62 // Step 3: Parse — try JSON.parse first, then jsonrepair, fallback to partial-jsonCOMMENT
LOWpackages/@openmaic/generation/src/action-parser.ts89 // Step 4: Convert items to Action[]COMMENT
LOW⚡packages/@openmaic/generation/src/action-parser.ts132 // Step 5: Post-processing — discussion must be the last action, and at most oneCOMMENT
LOW⚡packages/@openmaic/generation/src/action-parser.ts138 // Step 6: Filter out slide-only actions for non-slide scenes (defense in depth)COMMENT
LOW⚡packages/@openmaic/generation/src/action-parser.ts148 // Step 7: Filter by allowedActions whitelist (defense in depth for role-based isolation)COMMENT
LOWlib/chat/structured-output.ts134 // Step 1: Find the opening `[` if not yet foundCOMMENT
LOW⚡lib/chat/structured-output.ts145 // Step 2: Check if the array is complete (closing `]` found)COMMENT
LOW⚡lib/chat/structured-output.ts149 // Step 3: Try incremental parse — jsonrepair first (fixes unescaped quotes), fallback to partial-jsonCOMMENT
LOWlib/chat/structured-output.ts170 // Step 4: Determine how many items are fully completeCOMMENT
LOWlib/chat/structured-output.ts184 // Step 5: Emit newly completed itemsCOMMENT
LOWlib/chat/structured-output.ts218 // Step 6: Stream partial text delta for the trailing itemCOMMENT
LOWlib/chat/structured-output.ts230 // Step 7: Mark done if array is closedCOMMENT
LOWlib/pdf/mineru-cloud.ts518 // Step 1: Create batch — request presigned upload URLCOMMENT
LOWlib/pdf/mineru-cloud.ts557 // Step 2: Upload document to presigned URLCOMMENT
LOWlib/pdf/mineru-cloud.ts590 // Step 3: Poll for completionCOMMENT
LOWlib/audio/asr-providers.ts44 * // Step 1: Upload audio fileCOMMENT
LOWlib/audio/asr-providers.ts69 * // Step 2: Request transcriptionCOMMENT
LOWlib/audio/asr-providers.ts84 * // Step 3: Poll for completionCOMMENT
Synthetic Comment Markers2 hits · 15 pts
SeverityFileLineSnippetContext
HIGHlib/legacy-browser-storage/schema.ts308 // Version 8: Add generatedAgents table for AI-generated agent profilesCOMMENT
HIGHlib/types/generation.ts155 // AI-generated media requests (when PDF images are insufficient)COMMENT
AI Slop Vocabulary2 hits · 6 pts
SeverityFileLineSnippetContext
MEDIUMpackages/@openmaic/generation/src/pbl/planner-core.ts161 // a BCP-47 locale or a nuanced directive like "中文为主,英文技术术语保留原文".COMMENT
MEDIUMlib/web-search/brave.ts80 // robust to that (and a future) swap; the title text is stripped of tagsCOMMENT
TODO Padding2 hits · 3 pts
SeverityFileLineSnippetContext
LOWcomponents/slide-renderer/Editor/Canvas/index.tsx263 // TODO: implement insertCustomShapeCOMMENT
LOW…mponents/slide-renderer/Editor/Canvas/hooks/useDrop.ts18 // TODO: implement createTextElementCOMMENT
Slop Phrases1 hit · 3 pts
SeverityFileLineSnippetContext
MEDIUMlib/model-settings/client.ts282/** Whether the workspace has a language model: the effective `llm` is assigned. */COMMENT
Example Usage Blocks1 hit · 2 pts
SeverityFileLineSnippetContext
LOWscripts/ci-run-parallel.sh5# Usage:COMMENT