Repository Analysis

THU-MAIC/OpenMAIC

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

2.7 Likely human-written View on GitHub

Analysis Overview

This report presents the forensic synthetic code analysis of THU-MAIC/OpenMAIC, a TypeScript project with 19,670 GitHub stars. SynthScan v2.0 examined 347,700 lines of code across 1483 source files, recording 574 pattern matches distributed across 11 syntactic categories. The overall adjusted score of 2.7 places this repository in the Likely human-written band.

The scanner applied 160+ deterministic lexical heuristics, multi-line block detectors, abstract syntax tree depth profilers, and a cross-file Jaccard similarity matrix to construct a statistically normalised synthetic code estimate. All matches are individually weighted by severity coefficient and contextual multiplier before summation, and the resulting headline score is temporally discounted to account for the repository's development history relative to the commercial emergence of large language model coding tooling (November 2022 onward).

2.7
Adjusted Score
2.7
Raw Score
100%
Time Factor
2026-07-14
Last Push
19.7K
Stars
TypeScript
Language
347.7K
Lines of Code
1.5K
Files
574
Pattern Hits
2026-07-14
Scan Date
0.01
HC Hit Rate

What These Metrics Mean

Adjusted Score
Primary synthetic code indicator. Raw score normalised per 1,000 lines of code and multiplied by the temporal discount factor. This is the definitive comparative metric — use it to rank repositories by AI authorship density.
Raw Score
The unmodified sum of all severity-weighted, context-multiplied pattern match scores before temporal discounting. Reflects the absolute signal strength independent of when the repository was last active.
Time Factor
The temporal discount multiplier (0–100%) applied to the raw score. Repositories last updated before ChatGPT's launch (Nov 2022) receive a 5% factor. Full signal is only assigned to repositories active in the post-adoption era (Jan 2024+).
Pattern Hits
Total count of individual pattern matches across all files and categories. A high hit count with a low score may indicate a very large codebase with isolated AI snippets; a low count with a high score indicates dense, concentrated AI signatures.
HC Hit Rate
High+Critical pattern hits per file, averaged across the repository. This orthogonal signal catches repositories where a few files are densely packed with high-severity AI tells — a strong indicator even when the normalised score appears moderate due to codebase size.
Lines of Code / Files
Total lines and files analysed. The scanner examines 94 file extensions. These denominators are used to normalise the score, enabling fair comparison between repositories of vastly different sizes.

Score History

This chart maps the temporal evolution of the adjusted synthetic code score across successive scan runs. An upward trajectory indicates ongoing incorporation of AI-generated code or expanding LLM-assisted scaffolding; a stable or declining trajectory may reflect active human refactoring, code removal, or the adoption of stricter authorship policies. The dashed secondary line (right axis) independently tracks total raw pattern hit count, which can diverge from the normalised score when codebase size changes significantly between scans.

Severity Breakdown

Classifies detected patterns by their diagnostic confidence and structural impact. CRITICAL patterns (coefficient 10) represent definitive synthetic signatures — hallucinated imports, explicit LLM attribution metadata — virtually never produced by human authors. HIGH (5) indicates strong structural tells such as cross-file repetition or cross-linguistic idioms. MEDIUM (2) covers recognisable conversational padding and AI-specific vocabulary. LOW (1) captures subtle indicators like tautological comments and generic boilerplate that require density to carry independent signal.

CRITICAL 8HIGH 2MEDIUM 97LOW 467

Directory Score Breakdown

This horizontal bar chart decomposes the repository's raw synthetic code score by top-level directory, allowing you to pinpoint precisely which modules or components carry the highest AI authorship density. Directories with disproportionately high scores relative to their size warrant targeted manual review: concentrated AI signatures often trace back to mass-generated configuration layers, auto-ported test suites, LLM-scaffolded boilerplate classes, or entire subsystems authored under heavy copilot assistance. Use this view to prioritise your human code-review effort.

Pattern Findings

The scanner identified 574 distinct pattern matches across 11 syntactic categories. Each entry below represents a discrete location in the source code where the engine recorded a statistically significant AI authorship indicator. 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 diagnostic confidence level (CRITICAL / HIGH / MEDIUM / LOW). The Context column identifies whether the match occurred inside executable code, an inline comment, or a string literal — comment-context matches receive a ×1.5 weight because LLMs systematically over-annotate. The ⚡ bolt icon marks clustered matches: three or more patterns within a 10-line window, each receiving an additional ×1.5 density multiplier as dense clusters constitute far stronger evidence of synthetic authorship than isolated hits.

Hyper-Verbose Identifiers305 hits · 316 pts
SeverityFileLineSnippetContext
LOWapp/generation-preview/vocational-mode.ts1export function resolveTaskEngineModeFromOutlineDoneEvent(event: {CODE
LOWapp/generation-preview/components/visualizers.tsx246function StreamingOutlineVisualizer({CODE
LOWapp/generation-preview/components/visualizers.tsx386function AgentGenerationVisualizer() {CODE
LOWapp/api/extract-document/route.ts34function isSelfHostedMinerUProvider(CODE
LOWapp/api/generate/scene-outlines-stream/route.ts100function extractCourseTitleFromComplete(buffer: string): string | null {CODE
LOWapp/api/generate/scene-outlines-stream/route.ts178function normalizeTaskEngineProceduralOutline(CODE
LOWapp/api/generate/scene-outlines-stream/route.ts212function normalizeTaskEngineSlideOutline(outline: SceneOutline): SceneOutline {CODE
LOWapp/api/generate/scene-outlines-stream/route.ts225function normalizeTaskEngineOutline(outline: SceneOutline, requirement: string): SceneOutline {CODE
LOWapp/api/generate/scene-outlines-stream/route.ts245function sanitizeNonTaskEngineOutline(outline: SceneOutline): SceneOutline {CODE
LOWtests/pbl/v2/drain.test.ts50function deterministicPBLSessionId(stageId = STAGE_ID, learnerKey = LEARNER_KEY): string {CODE
LOWtests/ai/openai-provider.test.ts26async function captureInjectedRequestBody(CODE
LOW…mpts/procedural-skill-content-quality-contract.test.ts13function buildProceduralSkillPrompt() {CODE
LOWtests/generation/procedural-skill-content-gates.test.ts28function createProceduralSkillOutline(): SceneOutline {CODE
LOWtests/generation/procedural-skill-routing.test.ts80function createProceduralSkillOutline(): SceneOutline {CODE
LOW…generation/scene-content-route-vocational-gate.test.ts110function createProceduralSkillOutline(): SceneOutline {CODE
LOWtests/store/stage-generation-complete.test.ts89function applyFallbackToStageStore(stageId: string, token: StageSceneLoadToken, scenes: Scene[]) {CODE
LOWcomponents/settings/utils.ts71export function createCustomProviderSettings(CODE
LOWcomponents/scene-renderers/classroom-complete.tsx499export function ClassroomCompletePageConnected() {CODE
LOWcomponents/scene-renderers/pbl/v2/protocol-markers.ts6export function stripEmbeddedDividerMarkers(text: string): string {CODE
LOWcomponents/scene-renderers/pbl/v2/protocol-markers.ts10export function isStandaloneDividerMessage(content: string): boolean {CODE
LOW…onents/scene-renderers/pbl/v2/use-instructor-stream.ts377export function isToleratedReactionStreamError(CODE
LOW…onents/scene-renderers/pbl/v2/use-instructor-stream.ts386export function findMilestoneIdForMicrotask(CODE
LOWcomponents/scene-renderers/pbl/v2/workspace.tsx70function streamStatusForEvaluationKind(kind: unknown): StreamStatus {CODE
LOWcomponents/scene-renderers/pbl/v2/workspace.tsx540function milestoneProgressFraction(milestone: PBLMilestone): number {CODE
LOWcomponents/scene-renderers/pbl/v2/workspace.tsx553export function workspaceActiveMilestoneIndex(project: PBLProjectV2): number {CODE
LOWcomponents/scene-renderers/pbl/v2/submission.tsx111export function isSubmitLockedDuringStream(args: {CODE
LOWcomponents/scene-renderers/pbl/v2/submission.tsx183function appendSubmissionReceiptMessage(CODE
LOWcomponents/scene-renderers/pbl/v2/submission.tsx247export function buildRevisionGuidanceMessage(args: {CODE
LOW…nents/scene-renderers/pbl/v2/scenario-briefing-gate.ts20export function shouldShowScenarioBriefing(project: PBLProjectV2): boolean {CODE
LOWcomponents/scene-renderers/pbl/v2/sidebar.tsx411export function sidebarDefaultExpandedMilestoneIds(project: PBLProjectV2): string[] {CODE
LOWcomponents/scene-renderers/pbl/v2/chat.tsx747function SubmissionEvaluationBubble({CODE
LOWcomponents/scene-renderers/pbl/v2/chat.tsx1399export function handoverForMilestoneEvaluation(CODE
LOWcomponents/scene-renderers/pbl/v2/chat.tsx1409export function streamingEvaluationPreview(text: string): string {CODE
LOWcomponents/scene-renderers/pbl/v2/chat.tsx1419export function stripLeakedToolJsonPreview(text: string): string {CODE
LOWcomponents/scene-renderers/pbl/v2/completion.tsx79export function buildCompletionReportViewModel(project: PBLProjectV2): CompletionReportViewModel {CODE
LOW…s/scene-renderers/pbl/v2/eval-cards/milestone-card.tsx177export function milestoneHandoverCtaState(handover?: PBLHandover): 'hidden' | 'ready' | 'consumed' {CODE
LOW…s/scene-renderers/pbl/v2/eval-cards/milestone-card.tsx182export function stripFinalMilestoneContinueGuidance(text: string): string {CODE
LOWcomponents/chat/use-chat-sessions.ts40function buildQuizResultsForStoreState(CODE
LOWcomponents/whiteboard/whiteboard-canvas.tsx107>(function InteractiveWhiteboardCanvas(CODE
LOWcomponents/edit/MultiTabEditConflictPrompt.tsx31export function MultiTabEditConflictPrompt({CODE
LOWcomponents/edit/scene-timeline.ts12export function supportsNarrationTimeline(CODE
LOWcomponents/edit/surfaces/slide/use-slide-surface.ts318export function useSelectedNonTextElement(): PPTElement | null {CODE
LOWcomponents/edit/ActionsBar/actions-edit.ts115export function setSpeechTextClearAudioById(actions: Action[], id: string, text: string): Action[] {CODE
LOWcomponents/edit/ActionsBar/actions-edit.ts194function setDiscussionOptionalById(CODE
LOWcomponents/edit/ActionsBar/ActionsBar.tsx97function useClearCuePreviewOnUnmount() {CODE
LOWcomponents/audio/speech-button.tsx21export function shouldCancelRecordingOnDisable(args: {CODE
LOWcomponents/roundtable/presentation-speech-overlay.tsx41export function buildPresentationBubbleModel({CODE
LOWcomponents/roundtable/presentation-speech-overlay.tsx388export function PresentationSpeechOverlay({CODE
LOW…r/components/element/VideoElement/BaseVideoElement.tsx22function isLegacySequentialVideoRef(value: string | undefined): boolean {CODE
LOW…er/Editor/Canvas/hooks/useInsertFromCreateSelection.ts16export function useInsertFromCreateSelection(viewportRef: RefObject<HTMLElement | null>) {CODE
LOWcomponents/generation/outlines-editor.tsx1144function InteractiveConfigDisclosure({CODE
LOWcomponents/generation/generation-toolbar.tsx517function formatCompactThinkingValue(value?: string, t?: (key: string) => string) {CODE
LOWpackages/pptxgenjs/src/gen-objects.ts1147export function addPlaceholdersToSlideLayouts(slide: PresSlide): void {CODE
LOWpackages/pptxgenjs/src/gen-xml.ts819function slideObjectRelationsToXml (slide: PresSlide | SlideLayout, defaultRels: Array<{ target: string, type: string }>CODE
LOWpackages/pptxgenjs/src/gen-xml.ts884function genXmlParagraphProperties (textObj: ISlideObject | TextProps, isDefault: boolean): string {CODE
LOWpackages/@openmaic/renderer/src/utils/geometry.ts16export function getElementPercentageGeometry(CODE
LOW…ckages/@openmaic/renderer/src/editing/core/geometry.ts207export function getEditingElementListRange(els: PPTElement[]): ElementRange {CODE
LOWpackages/@openmaic/importer/src1/pptxtojson.js673 function processNestedGroupElements(elements, ws, hs, depth = 0) {CODE
LOW…s/@openmaic/importer/src/serializer/shapeSerializer.ts723function resolveInheritedPlaceholderFill(CODE
LOW…es/@openmaic/importer/src/serializer/textSerializer.ts252function buildMergedParagraphStyle(CODE
245 more matches not shown…
Decorative Section Separators79 hits · 243 pts
SeverityFileLineSnippetContext
MEDIUMapp/page.tsx1234// ─── Classroom Card — clean, minimal style ──────────────────────COMMENT
MEDIUMtests/lib/agent/tools/regenerate-scene-actions.test.ts77 // ── Bug 1 regression: SlideContent shape conversion ──────────────────────────COMMENT
MEDIUMtests/lib/agent/tools/regenerate-scene-actions.test.ts130 // ── Bug 1 & Bug 2: empty generation is surfaced as an error ──────────────────COMMENT
MEDIUMtests/export/classroom-zip.test.ts9// ─── rewriteAudioRefsToIds ────────────────────────────────────COMMENT
MEDIUMtests/export/classroom-zip.test.ts82// ─── actionsToManifest ────────────────────────────────────────COMMENT
MEDIUMtests/export/classroom-zip.test.ts168// ─── Manifest round-trip ──────────────────────────────────────COMMENT
MEDIUMcomponents/scene-renderers/quiz-view.tsx36// ─── Types ──────────────────────────────────────────────────────────────────COMMENT
MEDIUMcomponents/scene-renderers/quiz-view.tsx137// ─── Sub-components ─────────────────────────────────────────────────────────COMMENT
MEDIUMcomponents/scene-renderers/quiz-view.tsx687// ─── 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.tsx12// ─── Avatar with camera overlay ──────────────────────────────────────────────COMMENT
MEDIUMcomponents/edit/AgentsView/AgentRosterPanel.tsx53// ─── Inline editable name ────────────────────────────────────────────────────COMMENT
MEDIUMcomponents/edit/AgentsView/AgentRosterPanel.tsx90// ─── Persona textarea ─────────────────────────────────────────────────────────COMMENT
MEDIUMcomponents/edit/AgentsView/AgentRosterPanel.tsx154// ─── Teacher card ─────────────────────────────────────────────────────────────COMMENT
MEDIUMcomponents/edit/AgentsView/AgentRosterPanel.tsx265// ─── Classmate card ────────────────────────────────────────────────────────────COMMENT
MEDIUMcomponents/edit/AgentsView/AgentRosterPanel.tsx421// ─── Main panel ───────────────────────────────────────────────────────────────COMMENT
MEDIUMcomponents/generation/outlines-editor.tsx429// ────────────────────────────────────────────────────────────────────────────────COMMENT
MEDIUMcomponents/generation/outlines-editor.tsx431// ────────────────────────────────────────────────────────────────────────────────COMMENT
MEDIUMcomponents/generation/outlines-editor.tsx713// ────────────────────────────────────────────────────────────────────────────────COMMENT
MEDIUMcomponents/generation/outlines-editor.tsx715// ────────────────────────────────────────────────────────────────────────────────COMMENT
MEDIUMcomponents/generation/outlines-editor.tsx1502// ────────────────────────────────────────────────────────────────────────────────COMMENT
MEDIUMcomponents/generation/outlines-editor.tsx1504// ────────────────────────────────────────────────────────────────────────────────COMMENT
MEDIUMcomponents/generation/generation-toolbar.tsx52// ─── Constants ───────────────────────────────────────────────COMMENT
MEDIUMcomponents/generation/generation-toolbar.tsx56// ─── Types ───────────────────────────────────────────────────COMMENT
MEDIUMcomponents/generation/generation-toolbar.tsx68// ─── Component ───────────────────────────────────────────────COMMENT
MEDIUMcomponents/generation/generation-toolbar.tsx212 // ─── Pill button helper ─────────────────────────────COMMENT
MEDIUMcomponents/generation/generation-toolbar.tsx742// ─── ModelSettingsPopover (provider + model picker) ─────COMMENT
MEDIUMpackages/pptxgenjs/src/gen-media.ts56 // ──────────── NODE LOCAL FILE ────────────COMMENT
MEDIUMpackages/pptxgenjs/src/gen-media.ts74 // ──────────── NODE HTTP(S) ────────────COMMENT
MEDIUMpackages/pptxgenjs/src/gen-media.ts99 // ──────────── BROWSER ────────────COMMENT
MEDIUM…es/@openmaic/importer/src/serializer/textSerializer.ts1053 // ── 行首 tab/空格缩进折叠 ──────────────────────────────────────────COMMENT
MEDIUMlib/config/token-plan-presets.ts78 // ── Full-set token plan (template) ────────────────────────────────────────COMMENT
MEDIUMlib/config/token-plan-presets.ts129 // ── Vendor token plans (LLM; one key, often spans many models) ────────────COMMENT
MEDIUMlib/pdf/mineru-cloud.ts79// ── API envelope ──────────────────────────────────────────────────────────────COMMENT
MEDIUMlib/pdf/mineru-cloud.ts108// ── Filename sanitization ─────────────────────────────────────────────────────COMMENT
MEDIUMlib/pdf/mineru-cloud.ts122// ── ZIP parsing ───────────────────────────────────────────────────────────────COMMENT
MEDIUMlib/pdf/mineru-cloud.ts232// ── Main entry point ──────────────────────────────────────────────────────────COMMENT
MEDIUMlib/agent/tools/read-scene-content.ts19// ── Deps ─────────────────────────────────────────────────────────────────────COMMENT
MEDIUMlib/agent/tools/read-scene-content.ts28// ── Content projection (model-visible text) ──────────────────────────────────COMMENT
MEDIUMlib/agent/tools/read-scene-content.ts155// ── Params ───────────────────────────────────────────────────────────────────COMMENT
MEDIUMlib/agent/tools/read-scene-content.ts169// ── Details returned to the client ───────────────────────────────────────────COMMENT
MEDIUMlib/agent/tools/read-scene-content.ts182// ── Factory ──────────────────────────────────────────────────────────────────COMMENT
MEDIUMlib/agent/tools/regenerate-scene-actions.ts39// ── Scene context shape (client-sourced, injected via deps) ──────────────────COMMENT
MEDIUMlib/agent/tools/regenerate-scene-actions.ts63// ── Deps injection interface ─────────────────────────────────────────────────COMMENT
MEDIUMlib/agent/tools/regenerate-scene-actions.ts94// ── Content shape conversion ─────────────────────────────────────────────────COMMENT
MEDIUMlib/agent/tools/regenerate-scene-actions.ts132// ── Typebox parameter schema ─────────────────────────────────────────────────COMMENT
MEDIUMlib/agent/tools/regenerate-scene-actions.ts154// ── Details shape returned to the client ────────────────────────────────────COMMENT
MEDIUMlib/agent/tools/regenerate-scene-actions.ts161// ── Factory ──────────────────────────────────────────────────────────────────COMMENT
MEDIUMlib/agent/tools/regenerate-scene-actions.ts200 // ── Build cross-scene context (mirrors route.ts logic) ─────────────COMMENT
MEDIUMlib/agent/tools/regenerate-scene-actions.ts219 // ── Generate actions ───────────────────────────────────────────────COMMENT
MEDIUMlib/agent/tools/regenerate-scene.ts41// ── Existing media → generator RESOURCES (assignedImages + imageMapping) ──────COMMENT
MEDIUMlib/agent/tools/regenerate-scene.ts132// ── Details returned to the client ───────────────────────────────────────────COMMENT
MEDIUMlib/agent/tools/regenerate-scene.ts140// ── Factory ──────────────────────────────────────────────────────────────────COMMENT
MEDIUMlib/agent/tools/regenerate-scene.ts230 // ── Step 1: regenerate slide content in EDIT MODE ──────────────────────COMMENT
MEDIUMlib/agent/tools/regenerate-scene.ts268 // ── Step 2: regenerate actions to match the new content ────────────────COMMENT
MEDIUMlib/agent/tools/edit-interactive-html.ts27// ── Params (trust boundary: only id + edits; html comes from deps) ───────────COMMENT
MEDIUMlib/agent/tools/edit-interactive-html.ts61// ── Details returned to the client ───────────────────────────────────────────COMMENT
MEDIUMlib/agent/tools/edit-interactive-html.ts71// ── Factory ──────────────────────────────────────────────────────────────────COMMENT
19 more matches not shown…
Hallucination Indicators8 hits · 95 pts
SeverityFileLineSnippetContext
CRITICAL…lide-renderer/components/element/ProsemirrorEditor.tsx182 const mark = editorView.current.state.schema.marks.fontname.create({CODE
CRITICAL…lide-renderer/components/element/ProsemirrorEditor.tsx188 const mark = editorView.current.state.schema.marks.fontsize.create({CODE
CRITICAL…lide-renderer/components/element/ProsemirrorEditor.tsx201 const mark = editorView.current.state.schema.marks.fontsize.create({CODE
CRITICAL…lide-renderer/components/element/ProsemirrorEditor.tsx214 const mark = editorView.current.state.schema.marks.fontsize.create({CODE
CRITICAL…lide-renderer/components/element/ProsemirrorEditor.tsx223 const mark = editorView.current.state.schema.marks.forecolor.create({CODE
CRITICAL…lide-renderer/components/element/ProsemirrorEditor.tsx233 const mark = editorView.current.state.schema.marks.backcolor.create({CODE
CRITICAL…lide-renderer/components/element/ProsemirrorEditor.tsx333 const mark = editorView.current.state.schema.marks.link.create({CODE
CRITICAL…lide-renderer/components/element/ProsemirrorEditor.tsx351 const mark = editorView.current.state.schema.marks.link.create({CODE
Structural Annotation Overuse34 hits · 56 pts
SeverityFileLineSnippetContext
LOWapp/generation-preview/page.tsx346 // Step 0: Extract uploaded course material if neededCOMMENT
LOWapp/generation-preview/page.tsx954 // Step 2: Generate content (currentStepIndex is already 2)COMMENT
LOWtests/config/token-plan-apply-persist.test.ts34 // Step 1: apply fills key + baseUrl + type (what applyTokenPlan does).COMMENT
LOWtests/config/token-plan-apply-persist.test.ts49 // Step 2: probe success writes ONLY models (what handleApply does next).COMMENT
LOWlib/pdf/mineru-cloud.ts256 // Step 1: Create batch — request presigned upload URLCOMMENT
LOWlib/pdf/mineru-cloud.ts286 // Step 2: Upload document to presigned URLCOMMENT
LOWlib/pdf/mineru-cloud.ts311 // 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
LOWlib/hooks/use-scene-generator.ts564 // Step 1: content — await this outline's pre-warmed fetch (parallel),COMMENT
LOWlib/hooks/use-scene-generator.ts604 // Step 2: Generate actions + assemble sceneCOMMENT
LOWlib/hooks/use-scene-generator.ts756 // Step 1: ContentCOMMENT
LOWlib/hooks/use-scene-generator.ts776 // Step 2: ActionsCOMMENT
LOWlib/hooks/use-scene-generator.ts804 // Step 3: TTSCOMMENT
LOWlib/orchestration/stateless-generate.ts150 // Step 1: Find the opening `[` if not yet foundCOMMENT
LOWlib/orchestration/stateless-generate.ts161 // Step 2: Check if the array is complete (closing `]` found)COMMENT
LOWlib/orchestration/stateless-generate.ts165 // Step 3: Try incremental parse — jsonrepair first (fixes unescaped quotes), fallback to partial-jsonCOMMENT
LOWlib/orchestration/stateless-generate.ts186 // Step 4: Determine how many items are fully completeCOMMENT
LOWlib/orchestration/stateless-generate.ts200 // Step 5: Emit newly completed itemsCOMMENT
LOWlib/orchestration/stateless-generate.ts234 // Step 6: Stream partial text delta for the trailing itemCOMMENT
LOWlib/orchestration/stateless-generate.ts246 // Step 7: Mark done if array is closedCOMMENT
LOWlib/prompts/templates/slide-content/system.md550#### Step 1: Design the background shape firstCOMMENT
LOWlib/prompts/templates/slide-content/system.md561#### Step 2: Calculate text dimensionsCOMMENT
LOWlib/prompts/templates/slide-content/system.md570#### Step 3: Center the text inside the shapeCOMMENT
LOWlib/generation/scene-builder.ts87 // Step 1: Generate content (with images if available)COMMENT
LOWlib/generation/scene-builder.ts111 // Step 2: Generate ActionsCOMMENT
LOWlib/generation/action-parser.ts47 // Step 1: Strip markdown code fences if presentCOMMENT
LOWlib/generation/action-parser.ts50 // Step 2: Find the JSON array rangeCOMMENT
LOWlib/generation/action-parser.ts61 // Step 3: Parse — try JSON.parse first, then jsonrepair, fallback to partial-jsonCOMMENT
LOWlib/generation/action-parser.ts88 // Step 4: Convert items to Action[]COMMENT
LOWlib/generation/action-parser.ts131 // Step 5: Post-processing — discussion must be the last action, and at most oneCOMMENT
LOWlib/generation/action-parser.ts137 // Step 6: Filter out slide-only actions for non-slide scenes (defense in depth)COMMENT
LOWlib/generation/action-parser.ts147 // Step 7: Filter by allowedActions whitelist (defense in depth for role-based isolation)COMMENT
Fake / Example Data52 hits · 52 pts
SeverityFileLineSnippetContext
LOWtests/video-export/compile.test.ts66 expect(q0.base.kind).toBe('placeholder');CODE
LOWcomponents/whiteboard/whiteboard-canvas.tsx349 key="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.ts1226 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/video-export/compile.ts84 base: { ...scene.base, kind: 'placeholder', reason },CODE
LOWlib/video-export/ir.ts101 kind: z.enum(['slide-snapshot', 'placeholder']),CODE
LOWlib/video-export/passes/timeline.ts133 base: { kind: supported ? 'slide-snapshot' : 'placeholder' },CODE
LOWlib/i18n/locales/ko-KR.json263 "placeholder": "이 슬라이드에 대한 변경 사항을 설명하세요…",CODE
LOWlib/i18n/locales/ko-KR.json295 "placeholder": "이 인터랙티브 페이지의 버그를 설명하세요…"CODE
LOWlib/i18n/locales/ko-KR.json542 "placeholder": "메시지를 입력하세요...",CODE
LOWlib/i18n/locales/ko-KR.json627 "placeholder": "Chat with {{name}} about your progress...",CODE
LOWlib/i18n/locales/ko-KR.json1667 "placeholder": "접근 코드",CODE
LOWlib/i18n/locales/ja-JP.json312 "placeholder": "このスライドの変更内容を入力…",CODE
LOWlib/i18n/locales/ja-JP.json344 "placeholder": "このインタラクティブページの不具合を入力…"CODE
LOWlib/i18n/locales/ja-JP.json542 "placeholder": "メッセージを入力...",CODE
LOWlib/i18n/locales/ja-JP.json627 "placeholder": "{{name}}と進捗について話す...",CODE
LOWlib/i18n/locales/ja-JP.json1667 "placeholder": "アクセスコード",CODE
LOWlib/i18n/locales/zh-CN.json312 "placeholder": "描述对这一页的修改…",CODE
LOWlib/i18n/locales/zh-CN.json322 "placeholder": "描述这个互动页的问题…",CODE
LOWlib/i18n/locales/zh-CN.json542 "placeholder": "输入消息...",CODE
LOWlib/i18n/locales/zh-CN.json627 "placeholder": "和 {{name}} 聊聊你的进度...",CODE
LOWlib/i18n/locales/zh-CN.json1667 "placeholder": "访问码",CODE
LOWlib/i18n/locales/ar-SA.json312 "placeholder": "صف تغييراتك على هذه الشريحة…",CODE
LOWlib/i18n/locales/ar-SA.json344 "placeholder": "صِف الخطأ في هذه الصفحة التفاعلية…"CODE
LOWlib/i18n/locales/ar-SA.json542 "placeholder": "اكتب رسالة...",CODE
LOWlib/i18n/locales/ar-SA.json627 "placeholder": "تحدث مع {{name}} عن تقدمك...",CODE
LOWlib/i18n/locales/ar-SA.json1667 "placeholder": "رمز الوصول",CODE
LOWlib/i18n/locales/pt-BR.json297 "placeholder": "Descreva suas alterações neste slide…",CODE
LOWlib/i18n/locales/pt-BR.json329 "placeholder": "Descreva o bug desta página interativa…"CODE
LOWlib/i18n/locales/pt-BR.json542 "placeholder": "Digite uma mensagem...",CODE
LOWlib/i18n/locales/pt-BR.json627 "placeholder": "Chat with {{name}} about your progress...",CODE
LOWlib/i18n/locales/pt-BR.json1667 "placeholder": "Código de acesso",CODE
LOWlib/i18n/locales/zh-TW.json312 "placeholder": "描述對這一頁的修改…",CODE
LOWlib/i18n/locales/zh-TW.json322 "placeholder": "描述這個互動頁的問題…",CODE
LOWlib/i18n/locales/zh-TW.json527 "placeholder": "輸入訊息...",CODE
LOWlib/i18n/locales/zh-TW.json612 "placeholder": "和 {{name}} 聊聊你的進度...",CODE
LOWlib/i18n/locales/zh-TW.json1652 "placeholder": "課堂碼",CODE
LOWlib/i18n/locales/ru-RU.json312 "placeholder": "Опишите изменения для этого слайда…",CODE
LOWlib/i18n/locales/ru-RU.json344 "placeholder": "Опишите ошибку на этой интерактивной странице…"CODE
LOWlib/i18n/locales/ru-RU.json542 "placeholder": "Введите сообщение...",CODE
LOWlib/i18n/locales/ru-RU.json627 "placeholder": "Обсудите прогресс с {{name}}...",CODE
LOWlib/i18n/locales/ru-RU.json1667 "placeholder": "Код доступа",CODE
LOWlib/i18n/locales/en-US.json312 "placeholder": "Describe your changes to this slide…",CODE
LOWlib/i18n/locales/en-US.json322 "placeholder": "Describe the bug on this interactive page…",CODE
LOWlib/i18n/locales/en-US.json542 "placeholder": "Type a message...",CODE
LOWlib/i18n/locales/en-US.json627 "placeholder": "Chat with {{name}} about your progress...",CODE
LOWlib/i18n/locales/en-US.json1667 "placeholder": "Access code",CODE
Verbosity Indicators31 hits · 52 pts
SeverityFileLineSnippetContext
LOWapp/generation-preview/page.tsx346 // Step 0: Extract uploaded course material if neededCOMMENT
LOWapp/generation-preview/page.tsx954 // Step 2: Generate content (currentStepIndex is already 2)COMMENT
LOWtests/config/token-plan-apply-persist.test.ts34 // Step 1: apply fills key + baseUrl + type (what applyTokenPlan does).COMMENT
LOWtests/config/token-plan-apply-persist.test.ts49 // Step 2: probe success writes ONLY models (what handleApply does next).COMMENT
LOWlib/pdf/mineru-cloud.ts256 // Step 1: Create batch — request presigned upload URLCOMMENT
LOWlib/pdf/mineru-cloud.ts286 // Step 2: Upload document to presigned URLCOMMENT
LOWlib/pdf/mineru-cloud.ts311 // 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
LOWlib/hooks/use-scene-generator.ts564 // Step 1: content — await this outline's pre-warmed fetch (parallel),COMMENT
LOWlib/hooks/use-scene-generator.ts604 // Step 2: Generate actions + assemble sceneCOMMENT
LOWlib/hooks/use-scene-generator.ts756 // Step 1: ContentCOMMENT
LOWlib/hooks/use-scene-generator.ts776 // Step 2: ActionsCOMMENT
LOWlib/hooks/use-scene-generator.ts804 // Step 3: TTSCOMMENT
LOWlib/orchestration/stateless-generate.ts150 // Step 1: Find the opening `[` if not yet foundCOMMENT
LOWlib/orchestration/stateless-generate.ts161 // Step 2: Check if the array is complete (closing `]` found)COMMENT
LOWlib/orchestration/stateless-generate.ts165 // Step 3: Try incremental parse — jsonrepair first (fixes unescaped quotes), fallback to partial-jsonCOMMENT
LOWlib/orchestration/stateless-generate.ts186 // Step 4: Determine how many items are fully completeCOMMENT
LOWlib/orchestration/stateless-generate.ts200 // Step 5: Emit newly completed itemsCOMMENT
LOWlib/orchestration/stateless-generate.ts234 // Step 6: Stream partial text delta for the trailing itemCOMMENT
LOWlib/orchestration/stateless-generate.ts246 // Step 7: Mark done if array is closedCOMMENT
LOWlib/generation/scene-builder.ts87 // Step 1: Generate content (with images if available)COMMENT
LOWlib/generation/scene-builder.ts111 // Step 2: Generate ActionsCOMMENT
LOWlib/generation/action-parser.ts47 // Step 1: Strip markdown code fences if presentCOMMENT
LOWlib/generation/action-parser.ts50 // Step 2: Find the JSON array rangeCOMMENT
LOWlib/generation/action-parser.ts61 // Step 3: Parse — try JSON.parse first, then jsonrepair, fallback to partial-jsonCOMMENT
LOWlib/generation/action-parser.ts88 // Step 4: Convert items to Action[]COMMENT
LOWlib/generation/action-parser.ts131 // Step 5: Post-processing — discussion must be the last action, and at most oneCOMMENT
LOWlib/generation/action-parser.ts137 // Step 6: Filter out slide-only actions for non-slide scenes (defense in depth)COMMENT
LOWlib/generation/action-parser.ts147 // Step 7: Filter by allowedActions whitelist (defense in depth for role-based isolation)COMMENT
Modern AI Meta-Vocabulary16 hits · 44 pts
SeverityFileLineSnippetContext
MEDIUMREADME.md633│ ├── orchestration/ # LangGraph multi-agent orchestration (director graph)CODE
MEDIUMREADME.md633│ ├── orchestration/ # LangGraph multi-agent orchestration (director graph)CODE
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.ts459 // 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
MEDIUMlib/pbl/generate-pbl.ts285 // Run the agentic loopCOMMENT
MEDIUMlib/pbl/v2/agents/evaluator.ts290 // 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.ts167 // The agentic loop. The Planner emits tool calls untilCOMMENT
MEDIUMlib/pbl/v2/operations/completion-stats.ts235 // act, with a goals array of exactly the scaffold's length. A mismatchCOMMENT
MEDIUMlib/pbl/v2/operations/completion-stats.ts317 // alignment gate), still surface the authored act→goal scaffold read-only soCOMMENT
MEDIUMlib/pbl/v2/operations/completion-stats.ts319 // Mutually exclusive with goalCoverage; omitted when the scaffold is empty.COMMENT
MEDIUMlib/pbl/v2/operations/eval-prompts.ts461 // the very same scaffold. This drives the "what you accomplished" credit andCOMMENT
MEDIUMlib/pbl/v2/prompts/planner-single-call-system.md669. **Hints and descriptions GUIDE, never SOLVE — the #1 failure.** A hint or `description` must NEVER contain the literaCODE
Over-Commented Block42 hits · 41 pts
SeverityFileLineSnippetContext
LOWcomponents/stage.tsx101 // releases on unmount / tab close.COMMENT
LOWcomponents/scene-renderers/pbl-renderer.tsx181 readonly sceneId: string;COMMENT
LOWcomponents/scene-renderers/pbl-renderer.tsx201 // blank during native fullscreen. Default to <body> (classroom is anCOMMENT
LOWcomponents/scene-renderers/pbl-renderer.tsx221 // chat. Transient by design: a full page reload ends the streams and resetsCOMMENT
LOWcomponents/scene-renderers/pbl/v2/hero.tsx141 // "What you'll gain" — the Planner's structured `gains` (3-5 readable,COMMENT
LOWcomponents/scene-renderers/pbl/v2/workspace.tsx121 const [taskBusy, setTaskBusy] = useState(false);COMMENT
LOWcomponents/edit/EditChromeRoot.tsx61 // promise-cached no-op in that path; it only does real work if edit modeCOMMENT
LOWcomponents/edit/SlideNavRail/SlideNavRail.tsx61 // latency between move events and the visible width change.COMMENT
LOW…er/Editor/Canvas/hooks/useInsertFromCreateSelection.ts81 const insertElementFromCreateSelection = useCallback(COMMENT
LOWpackages/@openmaic/renderer/src/snapshot/index.ts121 flushSync(() => {COMMENT
LOW…@openmaic/renderer/src/editing/EditableSlideCanvas.tsx221 // is drawn. Instead render an INERT SVG-path blocker that mirrorsCOMMENT
LOW…@openmaic/renderer/src/editing/EditableSlideCanvas.tsx241 // Known gap: endpoint markers (arrow/dot) can paint beyond theCOMMENT
LOW…@openmaic/renderer/src/editing/EditableSlideCanvas.tsx321 strokeWidth={grabCanvas}COMMENT
LOW…@openmaic/renderer/src/editing/EditableSlideCanvas.tsx341 // selection callback is provided, resolve the clickCOMMENT
LOW…s/@openmaic/importer/src/serializer/shapeSerializer.ts341 strokeWidthPx: number,COMMENT
LOW…es/@openmaic/importer/src/serializer/textSerializer.ts1161 // Empty paragraph (no visible runs → renders as a bare <br/>): PowerPointCOMMENT
LOW…es/@openmaic/importer/src/serializer/textSerializer.ts1181 }COMMENT
LOW…es/@openmaic/importer/src/serializer/textSerializer.ts1361 // 已把首行起点定在 marL+indent;槽位只需补满到 marL,所以宽度是 |indent|。COMMENT
LOW…es/@openmaic/importer/src/serializer/textSerializer.ts1381 // 落到 element 左外(slide 3 的 ■ 飞到左侧编号圆上)。在槽位上显式归零切断继承,bulletCOMMENT
LOW…es/@openmaic/importer/src/serializer/textSerializer.ts1421 // paragraphs need no <br/> — the wrapper <div> already has a fixed lineCOMMENT
LOW…es/@openmaic/importer/src/serializer/mathSerializer.ts21import mathmlToLatex from 'mathml-to-latex';COMMENT
LOW…es/@openmaic/importer/src/serializer/mathSerializer.ts281COMMENT
LOWpackages/@openmaic/importer/src/shapes/presets.ts4641 // endpoint = (hc, g20+g17) = (hc, g10)? g20+g17 = (g9+g16)+g17 = g9+g13*5/8+g13*3/8 = g9+g13 = g9+ss*3/4COMMENT
LOW…mporter/src/import-pipeline/transformParsedToSlides.ts961 // formula+defaultValue 更准确——后者会丢掉非默认 adj(典型例子:COMMENT
LOWpackages/@openmaic/storage/src/runtime/browser.ts381 // The compound primary key ['sessionId', 'seq'] makes a ranged read comeCOMMENT
LOWpackages/@openmaic/storage/src/document/browser.ts221 // Normalize stale input forward to the current version — the same migrationCOMMENT
LOWpackages/@openmaic/dsl/test/version.test.ts41 it('is empty today — the runtime line has no unversioned epoch to lift from', () => {COMMENT
LOWpackages/@openmaic/dsl/src/validate.ts281 }COMMENT
LOW.github/workflows/publish-packages.yml1name: Publish @openmaic packagesCOMMENT
LOWlib/types/stage.ts1// Stage and Scene data types.COMMENT
LOWlib/types/action.ts1// Unified Action System.COMMENT
LOWlib/types/action.ts41// The action-category lists are runtime values (plain arrays), so they must beCOMMENT
LOWlib/agent/tools/regenerate-scene-actions.ts101// GeneratedPBLContent { projectConfig }COMMENT
LOWlib/pbl/v2/agents/simulator.ts141 // Established facts of the current beat — the system narrator deliversCOMMENT
LOWlib/pbl/v2/agents/simulator.ts461 microtaskId: ev.microtaskId,COMMENT
LOWlib/pbl/v2/agents/planner-single-call.ts241 }COMMENT
LOWlib/pbl/v2/agents/instructor.ts821 stageSynthesisOwed(args.project, args.milestone, args.microtask),COMMENT
LOWlib/pbl/v2/agents/instructor.ts1481 },COMMENT
LOWlib/pbl/v2/agents/instructor.ts1581 // cleaned. Task-completion ready prompts are injected by the submission flow,COMMENT
LOWlib/pbl/v2/agents/instructor.ts1661 //COMMENT
LOWlib/pbl/v2/operations/proficiency.ts621 // Static batch aggregation is NOT the same maths as the dynamicCOMMENT
LOWlib/hooks/use-canvas-operations.ts181 // Copy selected element data to clipboardCOMMENT
Synthetic Comment Markers2 hits · 15 pts
SeverityFileLineSnippetContext
HIGHlib/types/generation.ts137 // AI-generated media requests (when PDF images are insufficient)COMMENT
HIGHlib/utils/database.ts350 // Version 8: Add generatedAgents table for AI-generated agent profilesCOMMENT
AI Slop Vocabulary2 hits · 6 pts
SeverityFileLineSnippetContext
MEDIUMlib/pbl/v2/agents/planner.ts318 // a BCP-47 locale or a nuanced directive like "中文为主,英文技术术语保留原文".COMMENT
MEDIUMlib/web-search/brave.ts77 // robust to that (and a future) swap; the title text is stripped of tagsCOMMENT
TODO Padding3 hits · 4 pts
SeverityFileLineSnippetContext
LOWcomponents/slide-renderer/Editor/Canvas/index.tsx167 // TODO: implement createTextElement (use _viewportRect + e.pageX/Y + canvasScale)COMMENT
LOWcomponents/slide-renderer/Editor/Canvas/index.tsx244 // TODO: implement insertCustomShapeCOMMENT
LOW…mponents/slide-renderer/Editor/Canvas/hooks/useDrop.ts18 // TODO: implement createTextElementCOMMENT