{"version": "2.1.0", "$schema": "https://json.schemastore.org/sarif-2.1.0.json", "runs": [{"tool": {"driver": {"name": "Repobility", "informationUri": "https://repobility.com", "rules": [{"id": "scanner-7e7a75d83a4cb5da", "name": "Stray `console.log` in TS/JS \u2014 scripts/generateAssetList.js:75", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/generateAssetList.js:75"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-528f7ea45c3d396f", "name": "Stray `console.log` in TS/JS \u2014 qa/specs/05-a11y-audit.spec.ts:43", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 qa/specs/05-a11y-audit.spec.ts:43"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-2b41d542e0ef510e", "name": "Stray `console.log` in TS/JS \u2014 qa/specs/04-rtl-hebrew.spec.ts:86", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 qa/specs/04-rtl-hebrew.spec.ts:86"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-38e04f7b58a50a95", "name": "Stray `console.log` in TS/JS \u2014 qa/specs/01-landing.spec.ts:129", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 qa/specs/01-landing.spec.ts:129"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-e3f7049fd7964dfe", "name": "Icon-only button without accessible name \u2014 src/components/LearningMap.tsx:57", "shortDescription": {"text": "Icon-only button without accessible name \u2014 src/components/LearningMap.tsx:57"}, "fullDescription": {"text": "A `<button>` whose only child is a single glyph or symbol needs `title=` or `aria-label=` so screen readers (and tooltips on hover) work.\n\nWhy: P3 in CHECKLIST.md \u2014 icon-only buttons skipped a title.\nRule id: fq.button.no-label"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-9da4510e6794d288", "name": "Icon-only button without accessible name \u2014 src/components/StatChallenge.tsx:1102", "shortDescription": {"text": "Icon-only button without accessible name \u2014 src/components/StatChallenge.tsx:1102"}, "fullDescription": {"text": "A `<button>` whose only child is a single glyph or symbol needs `title=` or `aria-label=` so screen readers (and tooltips on hover) work.\n\nWhy: P3 in CHECKLIST.md \u2014 icon-only buttons skipped a title.\nRule id: fq.button.no-label"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-70564d9e469a01fb", "name": "Icon-only button without accessible name \u2014 src/components/ModelPicker.tsx:197", "shortDescription": {"text": "Icon-only button without accessible name \u2014 src/components/ModelPicker.tsx:197"}, "fullDescription": {"text": "A `<button>` whose only child is a single glyph or symbol needs `title=` or `aria-label=` so screen readers (and tooltips on hover) work.\n\nWhy: P3 in CHECKLIST.md \u2014 icon-only buttons skipped a title.\nRule id: fq.button.no-label"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-70430d697edccb81", "name": "Stray `console.log` in TS/JS \u2014 src/components/ColorableModel.tsx:42", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/components/ColorableModel.tsx:42"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-a1e38a27990980b0", "name": "Stray `console.log` in TS/JS \u2014 src/components/PaintableAsset.tsx:26", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/components/PaintableAsset.tsx:26"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-b34ffc2b95029a8d", "name": "Icon-only button without accessible name \u2014 src/components/ConceptMapViewer.tsx:57", "shortDescription": {"text": "Icon-only button without accessible name \u2014 src/components/ConceptMapViewer.tsx:57"}, "fullDescription": {"text": "A `<button>` whose only child is a single glyph or symbol needs `title=` or `aria-label=` so screen readers (and tooltips on hover) work.\n\nWhy: P3 in CHECKLIST.md \u2014 icon-only buttons skipped a title.\nRule id: fq.button.no-label"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-64401c5137df7960", "name": "Icon-only button without accessible name \u2014 src/components/LocalLeaderboard.tsx:64", "shortDescription": {"text": "Icon-only button without accessible name \u2014 src/components/LocalLeaderboard.tsx:64"}, "fullDescription": {"text": "A `<button>` whose only child is a single glyph or symbol needs `title=` or `aria-label=` so screen readers (and tooltips on hover) work.\n\nWhy: P3 in CHECKLIST.md \u2014 icon-only buttons skipped a title.\nRule id: fq.button.no-label"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-c488611f9daca2a6", "name": "Stray `console.log` in TS/JS \u2014 tutorials/scripts/01-onboarding.spec.ts:37", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 tutorials/scripts/01-onboarding.spec.ts:37"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-45874b7ebc1a3114", "name": "Stray `console.log` in TS/JS \u2014 public/godot/index.js:442", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 public/godot/index.js:442"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-166dff3c3df6a10e", "name": "ORM models found but no DB engine detected", "shortDescription": {"text": "ORM models found but no DB engine detected"}, "fullDescription": {"text": "The repo defines tables/models but no DB connection string was found. Likely lives in env vars or a config file the scanner didn't read."}, "properties": {"scanner": "scanner-primary", "layer": "data", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-35f5d3f566781f82", "name": "Insecure pattern 'direct_innerhtml_assignment' in gsd-dashboard.html:243", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in gsd-dashboard.html:243"}, "fullDescription": {"text": "Found a known-risky pattern (direct_innerhtml_assignment). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-8a3eccf012ea7a77", "name": "Insecure pattern 'direct_innerhtml_assignment' in tools/patch-godot-index.py:70", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in tools/patch-godot-index.py:70"}, "fullDescription": {"text": "Found a known-risky pattern (direct_innerhtml_assignment). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-7666a71ca25e9e4d", "name": "Insecure pattern 'dangerous_innerhtml' in qa/report/index.html:58", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in qa/report/index.html:58"}, "fullDescription": {"text": "Found a known-risky pattern (dangerous_innerhtml). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-10dd3bd540dfdf84", "name": "Insecure pattern 'direct_innerhtml_assignment' in qa/report/index.html:57", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in qa/report/index.html:57"}, "fullDescription": {"text": "Found a known-risky pattern (direct_innerhtml_assignment). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-96564e91cd66a1bd", "name": "Insecure pattern 'direct_innerhtml_assignment' in src/components/LessonScreen.tsx:1017", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in src/components/LessonScreen.tsx:1017"}, "fullDescription": {"text": "Found a known-risky pattern (direct_innerhtml_assignment). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-6637e6a37946a5a4", "name": "Insecure pattern 'new_function_used' in src/components/CalculatorDrawer.tsx:146", "shortDescription": {"text": "Insecure pattern 'new_function_used' in src/components/CalculatorDrawer.tsx:146"}, "fullDescription": {"text": "Found a known-risky pattern (new_function_used). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-2e2d6eee580b46a1", "name": "Insecure pattern 'direct_innerhtml_assignment' in src/components/CalculatorDrawer.tsx:57", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in src/components/CalculatorDrawer.tsx:57"}, "fullDescription": {"text": "Found a known-risky pattern (direct_innerhtml_assignment). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-d472bd0b26079118", "name": "Insecure pattern 'direct_innerhtml_assignment' in src/components/notebook/OneNoteSurface.tsx:466", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in src/components/notebook/OneNoteSurface.tsx:466"}, "fullDescription": {"text": "Found a known-risky pattern (direct_innerhtml_assignment). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-aeee96595c17b6d6", "name": "Insecure pattern 'direct_innerhtml_assignment' in src/components/notebook/shapes/EquationShape.tsx:153", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in src/components/notebook/shapes/EquationShape.tsx:153"}, "fullDescription": {"text": "Found a known-risky pattern (direct_innerhtml_assignment). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-bb3952cc159ce1a4", "name": "Insecure pattern 'direct_innerhtml_assignment' in src/components/graphs/MeanInteractive.tsx:44", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in src/components/graphs/MeanInteractive.tsx:44"}, "fullDescription": {"text": "Found a known-risky pattern (direct_innerhtml_assignment). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-266571b90fc6d0e1", "name": "Insecure pattern 'direct_innerhtml_assignment' in src/components/graphs/StdDevInteractive.tsx:37", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in src/components/graphs/StdDevInteractive.tsx:37"}, "fullDescription": {"text": "Found a known-risky pattern (direct_innerhtml_assignment). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-7203f54ae24a2883", "name": "Insecure pattern 'direct_innerhtml_assignment' in src/lib/mathRender.tsx:131", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in src/lib/mathRender.tsx:131"}, "fullDescription": {"text": "Found a known-risky pattern (direct_innerhtml_assignment). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-d28350dba6f05828", "name": "Insecure pattern 'direct_innerhtml_assignment' in tutorials/lib/cursor.ts:31", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in tutorials/lib/cursor.ts:31"}, "fullDescription": {"text": "Found a known-risky pattern (direct_innerhtml_assignment). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-ae9830bb6a601c61", "name": "Insecure pattern 'direct_innerhtml_assignment' in public/xmind-replica.html:1205", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in public/xmind-replica.html:1205"}, "fullDescription": {"text": "Found a known-risky pattern (direct_innerhtml_assignment). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-4f01e51646ad6033", "name": "Insecure pattern 'direct_innerhtml_assignment' in public/mindmap.html:1616", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in public/mindmap.html:1616"}, "fullDescription": {"text": "Found a known-risky pattern (direct_innerhtml_assignment). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-35abccba4caa6d81", "name": "Insecure pattern 'direct_innerhtml_assignment' in public/godot/index.js:1", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in public/godot/index.js:1"}, "fullDescription": {"text": "Found a known-risky pattern (direct_innerhtml_assignment). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-7c183b5471d2a79e", "name": "Insecure pattern 'direct_innerhtml_assignment' in public/godot/index.html:131", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in public/godot/index.html:131"}, "fullDescription": {"text": "Found a known-risky pattern (direct_innerhtml_assignment). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-6372cebde0220094", "name": "No auth library detected", "shortDescription": {"text": "No auth library detected"}, "fullDescription": {"text": "The scanner did not find any standard auth library (JWT, OAuth, NextAuth, Auth0, etc.). The repo has auth/admin/session surface indicators, so auth may live in custom code, in a separate service, or be missing."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-a229ea54dced94e5", "name": "GitHub Action is tag-pinned rather than SHA-pinned", "shortDescription": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "fullDescription": {"text": "actions/deploy-pages@v4 can move without a code change in this repo. Pin third-party actions to a reviewed 40-character commit SHA."}, "properties": {"scanner": "scanner-primary", "layer": "cicd", "severity": "low", "confidence": 1.0}}, {"id": "scanner-bd1acc2ea11a05aa", "name": "GitHub Actions workflow grants broad write permissions", "shortDescription": {"text": "GitHub Actions workflow grants broad write permissions"}, "fullDescription": {"text": "CI tokens with write permissions increase blast radius when an action, dependency, or PR workflow is compromised. Prefer job-level least-privilege permissions."}, "properties": {"scanner": "scanner-primary", "layer": "cicd", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-3c09eb0eefa9403c", "name": "Very large file: src/components/LessonVisuals.tsx (1537 lines)", "shortDescription": {"text": "Very large file: src/components/LessonVisuals.tsx (1537 lines)"}, "fullDescription": {"text": "Files with >800 lines often hide complexity hotspots and discourage tests."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-4b006e5107c66fb3", "name": "Very large file: src/components/StatChallenge.tsx (1930 lines)", "shortDescription": {"text": "Very large file: src/components/StatChallenge.tsx (1930 lines)"}, "fullDescription": {"text": "Files with >800 lines often hide complexity hotspots and discourage tests."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-f805db0a9f96d6aa", "name": "Very large file: src/components/ArsenalScreen.tsx (1766 lines)", "shortDescription": {"text": "Very large file: src/components/ArsenalScreen.tsx (1766 lines)"}, "fullDescription": {"text": "Files with >800 lines often hide complexity hotspots and discourage tests."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-19d0c282b347bcf0", "name": "Very large file: src/components/StudyHub.tsx (4484 lines)", "shortDescription": {"text": "Very large file: src/components/StudyHub.tsx (4484 lines)"}, "fullDescription": {"text": "Files with >800 lines often hide complexity hotspots and discourage tests."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-a8689c304a800c91", "name": "Very large file: public/godot/index.js (909 lines)", "shortDescription": {"text": "Very large file: public/godot/index.js (909 lines)"}, "fullDescription": {"text": "Files with >800 lines often hide complexity hotspots and discourage tests."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-6893a6c8b0861585", "name": "Very low test-to-source ratio", "shortDescription": {"text": "Very low test-to-source ratio"}, "fullDescription": {"text": "2 test file(s) for 235 source file(s) (ratio 0.01). Consider adding integration or unit tests for critical paths."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-141b30a41e03817b", "name": "No license file detected", "shortDescription": {"text": "No license file detected"}, "fullDescription": {"text": "No LICENSE/COPYING/NOTICE file was found. Generated repositories often omit licensing, which blocks reuse and automated intake."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-3ab5d313dda8e5f9", "name": "Debug logging residue appears in source files", "shortDescription": {"text": "Debug logging residue appears in source files"}, "fullDescription": {"text": "Found 57 console/debugger/print-style debug statements in non-test source. This is a common fast-generation residue before production cleanup."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-72b2a6250083a784", "name": "Placeholder or mock-heavy implementation detected", "shortDescription": {"text": "Placeholder or mock-heavy implementation detected"}, "fullDescription": {"text": "Found 32 placeholder/mock markers across 14 source files. This often means the repo looks complete while core flows still use generated scaffolding or fake data."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-2d0c7b7ab8f8aacf", "name": "Critical user flow still appears backed by mock or placeholder data", "shortDescription": {"text": "Critical user flow still appears backed by mock or placeholder data"}, "fullDescription": {"text": "A payment/auth/admin/order/billing-style flow contains mock, fake, TODO, dummy, or placeholder markers in runtime source. In the Fable corpus this is a high-leverage completeness smell: the app can look finished while the money, identity, or tenant flow is still scaffolded."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-749d4bc1bd66df5f", "name": "Agent instructions exist but release-hardening basics are missing", "shortDescription": {"text": "Agent instructions exist but release-hardening basics are missing"}, "fullDescription": {"text": "AI-coder instruction files were found, but the repo is missing license. Treat this as a contract gap: the agent is guided, but the generated output is not yet guarded by the controls that make it repeatable."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-cc55229a7a3c078d", "name": "Agent authority lacks a verifier contract: .mcp.json", "shortDescription": {"text": "Agent authority lacks a verifier contract: .mcp.json"}, "fullDescription": {"text": "This agent instruction grants code or shell authority but does not state the verification gate that decides promotion. The recurring safe pattern is: LLM proposes; deterministic tests/build/security checks verify; only verified code promotes."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-a5adf94a905f1096", "name": "Commented-code block (5 lines) in vite.config.ts:12", "shortDescription": {"text": "Commented-code block (5 lines) in vite.config.ts:12"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-4f062a90e77f2f03", "name": "Commented-code block (7 lines) in scripts/build-mindmaps.mjs:1", "shortDescription": {"text": "Commented-code block (7 lines) in scripts/build-mindmaps.mjs:1"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-fd3974329943ee35", "name": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/tripo/generate.mjs:57", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/tripo/generate.mjs:57"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-a92ae92d92c235ed", "name": "Commented-code block (5 lines) in src/App.tsx:75", "shortDescription": {"text": "Commented-code block (5 lines) in src/App.tsx:75"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-f24d4a1c2462d308", "name": "Commented-code block (5 lines) in src/landing/LandingPage.tsx:11", "shortDescription": {"text": "Commented-code block (5 lines) in src/landing/LandingPage.tsx:11"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-9c9b2ebf3395cd84", "name": "Commented-code block (5 lines) in src/landing/three/HeroScene.tsx:7", "shortDescription": {"text": "Commented-code block (5 lines) in src/landing/three/HeroScene.tsx:7"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-84b8ec66aca38d9f", "name": "Commented-code block (5 lines) in src/components/WaffleStackKeyboard.tsx:1", "shortDescription": {"text": "Commented-code block (5 lines) in src/components/WaffleStackKeyboard.tsx:1"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-0bd852efce3df14b", "name": "Commented-code block (5 lines) in src/components/ConceptMapFlow.tsx:19", "shortDescription": {"text": "Commented-code block (5 lines) in src/components/ConceptMapFlow.tsx:19"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-25cc1cfec9f7e8d0", "name": "Commented-code block (5 lines) in src/components/LearningInsights.tsx:1", "shortDescription": {"text": "Commented-code block (5 lines) in src/components/LearningInsights.tsx:1"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-670a88ff2ae21edb", "name": "Commented-code block (5 lines) in src/components/LessonScreen.tsx:71", "shortDescription": {"text": "Commented-code block (5 lines) in src/components/LessonScreen.tsx:71"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-71388b72d876b308", "name": "Commented-code block (5 lines) in src/components/CoachmarkTour.tsx:14", "shortDescription": {"text": "Commented-code block (5 lines) in src/components/CoachmarkTour.tsx:14"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-6d358fe814e2c031", "name": "Commented-code block (10 lines) in src/components/CalculatorDrawer.tsx:7", "shortDescription": {"text": "Commented-code block (10 lines) in src/components/CalculatorDrawer.tsx:7"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-e052dd9ca83c1906", "name": "Commented-code block (6 lines) in src/components/WaffleStackCityGodot.tsx:36", "shortDescription": {"text": "Commented-code block (6 lines) in src/components/WaffleStackCityGodot.tsx:36"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-aacd326c1bd341a9", "name": "Commented-code block (6 lines) in src/components/ArsenalScreen.tsx:62", "shortDescription": {"text": "Commented-code block (6 lines) in src/components/ArsenalScreen.tsx:62"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-2cd1cd1167b069d7", "name": "Commented-code block (8 lines) in src/components/StudyHub.tsx:156", "shortDescription": {"text": "Commented-code block (8 lines) in src/components/StudyHub.tsx:156"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-1d6f87199c740584", "name": "Commented-code block (5 lines) in src/components/PersonalPlanWizard.tsx:80", "shortDescription": {"text": "Commented-code block (5 lines) in src/components/PersonalPlanWizard.tsx:80"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-5cd2dccabf609b10", "name": "Legacy-named symbol `TLDRAW_DOCUMENT_v2` in src/components/notebook/PageNotebook.tsx:49", "shortDescription": {"text": "Legacy-named symbol `TLDRAW_DOCUMENT_v2` in src/components/notebook/PageNotebook.tsx:49"}, "fullDescription": {"text": "Names with suffixes like `_old`, `_v1`, `_deprecated` usually indicate replaced-but-not-removed code (typical AI-coder leftover). Confirm and delete, or rename if it's the active version."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-a90a398dbd7388a9", "name": "Commented-code block (6 lines) in src/components/notebook/shapes/EquationShape.tsx:23", "shortDescription": {"text": "Commented-code block (6 lines) in src/components/notebook/shapes/EquationShape.tsx:23"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-21d5789e388079ea", "name": "Commented-code block (5 lines) in src/components/graphs/SimpsonsParadoxInteractive.tsx:18", "shortDescription": {"text": "Commented-code block (5 lines) in src/components/graphs/SimpsonsParadoxInteractive.tsx:18"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-34a28afddb73dfbb", "name": "Commented-code block (7 lines) in src/store/learningStore.ts:288", "shortDescription": {"text": "Commented-code block (7 lines) in src/store/learningStore.ts:288"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-f91be90b493eabb1", "name": "Commented-code block (6 lines) in src/config/featureUnlocks.ts:48", "shortDescription": {"text": "Commented-code block (6 lines) in src/config/featureUnlocks.ts:48"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-47c3e1631f6c5887", "name": "Commented-code block (5 lines) in tutorials/tour-zoom.config.ts:3", "shortDescription": {"text": "Commented-code block (5 lines) in tutorials/tour-zoom.config.ts:3"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-20fb698b92ae0429", "name": "`fetch()` without try/.catch or AbortSignal \u2014 public/godot/index.js:1", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 public/godot/index.js:1"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-8e047ab7af03962f", "name": "7 env vars used in code but missing from .env.example", "shortDescription": {"text": "7 env vars used in code but missing from .env.example"}, "fullDescription": {"text": "Drift between code and config docs. The first few: `BASE_URL`, `IS_PREACT`, `QA_TEST_PASSWORD`, `TRIPO_API_BASE`, `VITE_BASE_PATH`, `VITE_SUPABASE_ANON_KEY`, `VITE_SUPABASE_URL`. Add them (with a placeholder/comment) to .env.example so onboarding doesn't break."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-0a53fdb19dfdf9a6", "name": "Dangling fetch: POST https://api.resend.com/emails (api/ask-human.ts:80)", "shortDescription": {"text": "Dangling fetch: POST https://api.resend.com/emails (api/ask-human.ts:80)"}, "fullDescription": {"text": "`api/ask-human.ts:80` calls `POST https://api.resend.com/emails` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/api.resend.com/emails`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-f808f8dc92dc77f5", "name": "Dangling fetch: GET /api/taskboard (src/components/MissionControl.tsx:342)", "shortDescription": {"text": "Dangling fetch: GET /api/taskboard (src/components/MissionControl.tsx:342)"}, "fullDescription": {"text": "`src/components/MissionControl.tsx:342` calls `GET /api/taskboard` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/taskboard`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-4b879b7e17961257", "name": "Dangling fetch: POST /api/taskboard (src/components/MissionControl.tsx:356)", "shortDescription": {"text": "Dangling fetch: POST /api/taskboard (src/components/MissionControl.tsx:356)"}, "fullDescription": {"text": "`src/components/MissionControl.tsx:356` calls `POST /api/taskboard` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/taskboard`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-21a9eb12f5d7c535", "name": "Dangling fetch: POST /api/tutor/chat (src/lib/tutorClient.ts:34)", "shortDescription": {"text": "Dangling fetch: POST /api/tutor/chat (src/lib/tutorClient.ts:34)"}, "fullDescription": {"text": "`src/lib/tutorClient.ts:34` calls `POST /api/tutor/chat` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/tutor/chat`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-35c5efd484af544b", "name": "Dangling fetch: POST /api/ask-human (src/lib/helpRequests.ts:202)", "shortDescription": {"text": "Dangling fetch: POST /api/ask-human (src/lib/helpRequests.ts:202)"}, "fullDescription": {"text": "`src/lib/helpRequests.ts:202` calls `POST /api/ask-human` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/ask-human`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-7e3cf08d9f4bd9d2", "name": "Unused endpoint: USE /api/taskboard", "shortDescription": {"text": "Unused endpoint: USE /api/taskboard"}, "fullDescription": {"text": "`vite.config.ts` declares `USE /api/taskboard` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}]}}, "automationDetails": {"id": "repobility/24477"}, "properties": {"repository": "Barakd127/wafflestack-app", "repoUrl": "https://github.com/Barakd127/wafflestack-app", "branch": "main"}, "results": [{"ruleId": "scanner-7e7a75d83a4cb5da", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/generateAssetList.js:75"}, "properties": {"repobilityId": "253764a251dbf77c", "scanner": "scanner-primary", "fingerprint": "7e7a75d83a4cb5da", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-528f7ea45c3d396f", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 qa/specs/05-a11y-audit.spec.ts:43"}, "properties": {"repobilityId": "bdf88bc82416b0e4", "scanner": "scanner-primary", "fingerprint": "528f7ea45c3d396f", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-2b41d542e0ef510e", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 qa/specs/04-rtl-hebrew.spec.ts:86"}, "properties": {"repobilityId": "d28681820526dac4", "scanner": "scanner-primary", "fingerprint": "2b41d542e0ef510e", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-38e04f7b58a50a95", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 qa/specs/01-landing.spec.ts:129"}, "properties": {"repobilityId": "8f10a6937678c893", "scanner": "scanner-primary", "fingerprint": "38e04f7b58a50a95", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-e3f7049fd7964dfe", "level": "note", "message": {"text": "Icon-only button without accessible name \u2014 src/components/LearningMap.tsx:57"}, "properties": {"repobilityId": "f3976feab3827965", "scanner": "scanner-primary", "fingerprint": "e3f7049fd7964dfe", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.button.no-label"]}}, {"ruleId": "scanner-9da4510e6794d288", "level": "note", "message": {"text": "Icon-only button without accessible name \u2014 src/components/StatChallenge.tsx:1102"}, "properties": {"repobilityId": "67576bec728b73b8", "scanner": "scanner-primary", "fingerprint": "9da4510e6794d288", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.button.no-label"]}}, {"ruleId": "scanner-70564d9e469a01fb", "level": "note", "message": {"text": "Icon-only button without accessible name \u2014 src/components/ModelPicker.tsx:197"}, "properties": {"repobilityId": "fd1cea78d0e96a2f", "scanner": "scanner-primary", "fingerprint": "70564d9e469a01fb", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.button.no-label"]}}, {"ruleId": "scanner-70430d697edccb81", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/components/ColorableModel.tsx:42"}, "properties": {"repobilityId": "635f8bdaa94c7bea", "scanner": "scanner-primary", "fingerprint": "70430d697edccb81", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-a1e38a27990980b0", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/components/PaintableAsset.tsx:26"}, "properties": {"repobilityId": "3a1021f0ee2d434b", "scanner": "scanner-primary", "fingerprint": "a1e38a27990980b0", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-b34ffc2b95029a8d", "level": "note", "message": {"text": "Icon-only button without accessible name \u2014 src/components/ConceptMapViewer.tsx:57"}, "properties": {"repobilityId": "6b0540bd8d27055f", "scanner": "scanner-primary", "fingerprint": "b34ffc2b95029a8d", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.button.no-label"]}}, {"ruleId": "scanner-64401c5137df7960", "level": "note", "message": {"text": "Icon-only button without accessible name \u2014 src/components/LocalLeaderboard.tsx:64"}, "properties": {"repobilityId": "39e3261af4d13ca1", "scanner": "scanner-primary", "fingerprint": "64401c5137df7960", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.button.no-label"]}}, {"ruleId": "scanner-c488611f9daca2a6", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 tutorials/scripts/01-onboarding.spec.ts:37"}, "properties": {"repobilityId": "cf5be22ac91003ad", "scanner": "scanner-primary", "fingerprint": "c488611f9daca2a6", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-45874b7ebc1a3114", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 public/godot/index.js:442"}, "properties": {"repobilityId": "e0660e5ba5ebf7b1", "scanner": "scanner-primary", "fingerprint": "45874b7ebc1a3114", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-166dff3c3df6a10e", "level": "warning", "message": {"text": "ORM models found but no DB engine detected"}, "properties": {"repobilityId": "cda36de65e114635", "scanner": "scanner-primary", "fingerprint": "166dff3c3df6a10e", "layer": "data", "severity": "medium", "confidence": 1.0, "tags": ["coverage"]}}, {"ruleId": "scanner-35f5d3f566781f82", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in gsd-dashboard.html:243"}, "properties": {"repobilityId": "b397232158253d09", "scanner": "scanner-primary", "fingerprint": "35f5d3f566781f82", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "gsd-dashboard.html"}, "region": {"startLine": 243}}}]}, {"ruleId": "scanner-8a3eccf012ea7a77", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in tools/patch-godot-index.py:70"}, "properties": {"repobilityId": "9c1e2a5877828d53", "scanner": "scanner-primary", "fingerprint": "8a3eccf012ea7a77", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "tools/patch-godot-index.py"}, "region": {"startLine": 70}}}]}, {"ruleId": "scanner-7666a71ca25e9e4d", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in qa/report/index.html:58"}, "properties": {"repobilityId": "260e63d3f3e7a190", "scanner": "scanner-primary", "fingerprint": "7666a71ca25e9e4d", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "qa/report/index.html"}, "region": {"startLine": 58}}}]}, {"ruleId": "scanner-10dd3bd540dfdf84", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in qa/report/index.html:57"}, "properties": {"repobilityId": "a66d248de8fb35cf", "scanner": "scanner-primary", "fingerprint": "10dd3bd540dfdf84", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "qa/report/index.html"}, "region": {"startLine": 57}}}]}, {"ruleId": "scanner-96564e91cd66a1bd", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in src/components/LessonScreen.tsx:1017"}, "properties": {"repobilityId": "96dbfa2671687663", "scanner": "scanner-primary", "fingerprint": "96564e91cd66a1bd", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/components/LessonScreen.tsx"}, "region": {"startLine": 1017}}}]}, {"ruleId": "scanner-6637e6a37946a5a4", "level": "error", "message": {"text": "Insecure pattern 'new_function_used' in src/components/CalculatorDrawer.tsx:146"}, "properties": {"repobilityId": "824aca120c34d65a", "scanner": "scanner-primary", "fingerprint": "6637e6a37946a5a4", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["owasp", "new_function_used"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/components/CalculatorDrawer.tsx"}, "region": {"startLine": 146}}}]}, {"ruleId": "scanner-2e2d6eee580b46a1", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in src/components/CalculatorDrawer.tsx:57"}, "properties": {"repobilityId": "64251eeced642bc2", "scanner": "scanner-primary", "fingerprint": "2e2d6eee580b46a1", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/components/CalculatorDrawer.tsx"}, "region": {"startLine": 57}}}]}, {"ruleId": "scanner-d472bd0b26079118", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in src/components/notebook/OneNoteSurface.tsx:466"}, "properties": {"repobilityId": "7f9e208c2db00710", "scanner": "scanner-primary", "fingerprint": "d472bd0b26079118", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/components/notebook/OneNoteSurface.tsx"}, "region": {"startLine": 466}}}]}, {"ruleId": "scanner-aeee96595c17b6d6", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in src/components/notebook/shapes/EquationShape.tsx:153"}, "properties": {"repobilityId": "b2f7ca0de93fd004", "scanner": "scanner-primary", "fingerprint": "aeee96595c17b6d6", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/components/notebook/shapes/EquationShape.tsx"}, "region": {"startLine": 153}}}]}, {"ruleId": "scanner-bb3952cc159ce1a4", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in src/components/graphs/MeanInteractive.tsx:44"}, "properties": {"repobilityId": "dcdee47925aa71e7", "scanner": "scanner-primary", "fingerprint": "bb3952cc159ce1a4", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/components/graphs/MeanInteractive.tsx"}, "region": {"startLine": 44}}}]}, {"ruleId": "scanner-266571b90fc6d0e1", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in src/components/graphs/StdDevInteractive.tsx:37"}, "properties": {"repobilityId": "98885d1bf06a6f8a", "scanner": "scanner-primary", "fingerprint": "266571b90fc6d0e1", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/components/graphs/StdDevInteractive.tsx"}, "region": {"startLine": 37}}}]}, {"ruleId": "scanner-7203f54ae24a2883", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in src/lib/mathRender.tsx:131"}, "properties": {"repobilityId": "eb4379b133809a61", "scanner": "scanner-primary", "fingerprint": "7203f54ae24a2883", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/lib/mathRender.tsx"}, "region": {"startLine": 131}}}]}, {"ruleId": "scanner-d28350dba6f05828", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in tutorials/lib/cursor.ts:31"}, "properties": {"repobilityId": "778c7dc6311655ad", "scanner": "scanner-primary", "fingerprint": "d28350dba6f05828", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "tutorials/lib/cursor.ts"}, "region": {"startLine": 31}}}]}, {"ruleId": "scanner-ae9830bb6a601c61", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in public/xmind-replica.html:1205"}, "properties": {"repobilityId": "deabae55d2bc72d5", "scanner": "scanner-primary", "fingerprint": "ae9830bb6a601c61", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "public/xmind-replica.html"}, "region": {"startLine": 1205}}}]}, {"ruleId": "scanner-4f01e51646ad6033", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in public/mindmap.html:1616"}, "properties": {"repobilityId": "824e497474eabbb7", "scanner": "scanner-primary", "fingerprint": "4f01e51646ad6033", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "public/mindmap.html"}, "region": {"startLine": 1616}}}]}, {"ruleId": "scanner-35abccba4caa6d81", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in public/godot/index.js:1"}, "properties": {"repobilityId": "01c5845974f2a257", "scanner": "scanner-primary", "fingerprint": "35abccba4caa6d81", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "public/godot/index.js"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-7c183b5471d2a79e", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in public/godot/index.html:131"}, "properties": {"repobilityId": "13b895ccfc444466", "scanner": "scanner-primary", "fingerprint": "7c183b5471d2a79e", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "public/godot/index.html"}, "region": {"startLine": 131}}}]}, {"ruleId": "scanner-6372cebde0220094", "level": "warning", "message": {"text": "No auth library detected"}, "properties": {"repobilityId": "a5b6035a5bbf8054", "scanner": "scanner-primary", "fingerprint": "6372cebde0220094", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["coverage", "auth"]}}, {"ruleId": "scanner-a229ea54dced94e5", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "6662d662323bd323", "scanner": "scanner-primary", "fingerprint": "a229ea54dced94e5", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/gh-pages.yml"}, "region": {"startLine": 45}}}]}, {"ruleId": "scanner-bd1acc2ea11a05aa", "level": "warning", "message": {"text": "GitHub Actions workflow grants broad write permissions"}, "properties": {"repobilityId": "4cf82543b4b8a202", "scanner": "scanner-primary", "fingerprint": "bd1acc2ea11a05aa", "layer": "cicd", "severity": "medium", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "least-privilege"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/gh-pages.yml"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-3c09eb0eefa9403c", "level": "note", "message": {"text": "Very large file: src/components/LessonVisuals.tsx (1537 lines)"}, "properties": {"repobilityId": "5ab64c8e5ce0745d", "scanner": "scanner-primary", "fingerprint": "3c09eb0eefa9403c", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-4b006e5107c66fb3", "level": "note", "message": {"text": "Very large file: src/components/StatChallenge.tsx (1930 lines)"}, "properties": {"repobilityId": "d471ca81f657a06c", "scanner": "scanner-primary", "fingerprint": "4b006e5107c66fb3", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-f805db0a9f96d6aa", "level": "note", "message": {"text": "Very large file: src/components/ArsenalScreen.tsx (1766 lines)"}, "properties": {"repobilityId": "19528f5e91a4f3ef", "scanner": "scanner-primary", "fingerprint": "f805db0a9f96d6aa", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-19d0c282b347bcf0", "level": "note", "message": {"text": "Very large file: src/components/StudyHub.tsx (4484 lines)"}, "properties": {"repobilityId": "3a7485a7d35f9675", "scanner": "scanner-primary", "fingerprint": "19d0c282b347bcf0", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-a8689c304a800c91", "level": "note", "message": {"text": "Very large file: public/godot/index.js (909 lines)"}, "properties": {"repobilityId": "e7424ecff59166c0", "scanner": "scanner-primary", "fingerprint": "a8689c304a800c91", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-6893a6c8b0861585", "level": "warning", "message": {"text": "Very low test-to-source ratio"}, "properties": {"repobilityId": "54a7de3f06314bf0", "scanner": "scanner-primary", "fingerprint": "6893a6c8b0861585", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["tests", "coverage"]}}, {"ruleId": "scanner-141b30a41e03817b", "level": "note", "message": {"text": "No license file detected"}, "properties": {"repobilityId": "87316d2391cb123e", "scanner": "scanner-primary", "fingerprint": "141b30a41e03817b", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["license", "repo-hardening", "generated-repo-pattern"]}}, {"ruleId": "scanner-3ab5d313dda8e5f9", "level": "note", "message": {"text": "Debug logging residue appears in source files"}, "properties": {"repobilityId": "f79e95a0aef15493", "scanner": "scanner-primary", "fingerprint": "3ab5d313dda8e5f9", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["debug", "cleanup", "repo-hardening", "generated-repo-pattern"]}}, {"ruleId": "scanner-72b2a6250083a784", "level": "warning", "message": {"text": "Placeholder or mock-heavy implementation detected"}, "properties": {"repobilityId": "22aa2a56edf04bf4", "scanner": "scanner-primary", "fingerprint": "72b2a6250083a784", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["placeholder", "mock-data", "incomplete", "generated-repo-pattern"]}}, {"ruleId": "scanner-2d0c7b7ab8f8aacf", "level": "warning", "message": {"text": "Critical user flow still appears backed by mock or placeholder data"}, "properties": {"repobilityId": "3426c2f3badf9002", "scanner": "scanner-primary", "fingerprint": "2d0c7b7ab8f8aacf", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["placeholder", "mock-data", "critical-flow", "generated-repo-pattern"]}}, {"ruleId": "scanner-749d4bc1bd66df5f", "level": "warning", "message": {"text": "Agent instructions exist but release-hardening basics are missing"}, "properties": {"repobilityId": "c4839ce7547ea52a", "scanner": "scanner-primary", "fingerprint": "749d4bc1bd66df5f", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "repo-hardening", "generated-repo-pattern"]}}, {"ruleId": "scanner-cc55229a7a3c078d", "level": "warning", "message": {"text": "Agent authority lacks a verifier contract: .mcp.json"}, "properties": {"repobilityId": "51942fb3d5b8b5b4", "scanner": "scanner-primary", "fingerprint": "cc55229a7a3c078d", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "verification", "mcp_config"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".mcp.json"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-a5adf94a905f1096", "level": "none", "message": {"text": "Commented-code block (5 lines) in vite.config.ts:12"}, "properties": {"repobilityId": "4b963d04778ada29", "scanner": "scanner-primary", "fingerprint": "a5adf94a905f1096", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-4f062a90e77f2f03", "level": "none", "message": {"text": "Commented-code block (7 lines) in scripts/build-mindmaps.mjs:1"}, "properties": {"repobilityId": "8506f94bd6a4c947", "scanner": "scanner-primary", "fingerprint": "4f062a90e77f2f03", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-fd3974329943ee35", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/tripo/generate.mjs:57"}, "properties": {"repobilityId": "50752953e8bd51c6", "scanner": "scanner-primary", "fingerprint": "fd3974329943ee35", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-a92ae92d92c235ed", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/App.tsx:75"}, "properties": {"repobilityId": "77708b17275e9796", "scanner": "scanner-primary", "fingerprint": "a92ae92d92c235ed", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-f24d4a1c2462d308", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/landing/LandingPage.tsx:11"}, "properties": {"repobilityId": "8a6cc759a4ea86b1", "scanner": "scanner-primary", "fingerprint": "f24d4a1c2462d308", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-9c9b2ebf3395cd84", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/landing/three/HeroScene.tsx:7"}, "properties": {"repobilityId": "5f980952d9241ca3", "scanner": "scanner-primary", "fingerprint": "9c9b2ebf3395cd84", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-84b8ec66aca38d9f", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/components/WaffleStackKeyboard.tsx:1"}, "properties": {"repobilityId": "718ab6dc7360e2ec", "scanner": "scanner-primary", "fingerprint": "84b8ec66aca38d9f", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-0bd852efce3df14b", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/components/ConceptMapFlow.tsx:19"}, "properties": {"repobilityId": "18e7b955e8477de2", "scanner": "scanner-primary", "fingerprint": "0bd852efce3df14b", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-25cc1cfec9f7e8d0", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/components/LearningInsights.tsx:1"}, "properties": {"repobilityId": "4d3af256f462a7a6", "scanner": "scanner-primary", "fingerprint": "25cc1cfec9f7e8d0", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-670a88ff2ae21edb", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/components/LessonScreen.tsx:71"}, "properties": {"repobilityId": "75ab5915bdacef2e", "scanner": "scanner-primary", "fingerprint": "670a88ff2ae21edb", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-71388b72d876b308", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/components/CoachmarkTour.tsx:14"}, "properties": {"repobilityId": "e5c555207a17b925", "scanner": "scanner-primary", "fingerprint": "71388b72d876b308", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-6d358fe814e2c031", "level": "none", "message": {"text": "Commented-code block (10 lines) in src/components/CalculatorDrawer.tsx:7"}, "properties": {"repobilityId": "d0aa227c882998be", "scanner": "scanner-primary", "fingerprint": "6d358fe814e2c031", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-e052dd9ca83c1906", "level": "none", "message": {"text": "Commented-code block (6 lines) in src/components/WaffleStackCityGodot.tsx:36"}, "properties": {"repobilityId": "e1519588be4a2fe8", "scanner": "scanner-primary", "fingerprint": "e052dd9ca83c1906", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-aacd326c1bd341a9", "level": "none", "message": {"text": "Commented-code block (6 lines) in src/components/ArsenalScreen.tsx:62"}, "properties": {"repobilityId": "fbaeb08c724718dd", "scanner": "scanner-primary", "fingerprint": "aacd326c1bd341a9", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-2cd1cd1167b069d7", "level": "none", "message": {"text": "Commented-code block (8 lines) in src/components/StudyHub.tsx:156"}, "properties": {"repobilityId": "6c9b807d80de448a", "scanner": "scanner-primary", "fingerprint": "2cd1cd1167b069d7", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-1d6f87199c740584", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/components/PersonalPlanWizard.tsx:80"}, "properties": {"repobilityId": "ec22d537bfe2a15a", "scanner": "scanner-primary", "fingerprint": "1d6f87199c740584", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-5cd2dccabf609b10", "level": "note", "message": {"text": "Legacy-named symbol `TLDRAW_DOCUMENT_v2` in src/components/notebook/PageNotebook.tsx:49"}, "properties": {"repobilityId": "274bfcb428297b57", "scanner": "scanner-primary", "fingerprint": "5cd2dccabf609b10", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-a90a398dbd7388a9", "level": "none", "message": {"text": "Commented-code block (6 lines) in src/components/notebook/shapes/EquationShape.tsx:23"}, "properties": {"repobilityId": "e102597b09393c90", "scanner": "scanner-primary", "fingerprint": "a90a398dbd7388a9", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-21d5789e388079ea", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/components/graphs/SimpsonsParadoxInteractive.tsx:18"}, "properties": {"repobilityId": "a3bc8b1c2721f497", "scanner": "scanner-primary", "fingerprint": "21d5789e388079ea", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-34a28afddb73dfbb", "level": "none", "message": {"text": "Commented-code block (7 lines) in src/store/learningStore.ts:288"}, "properties": {"repobilityId": "90926a33c8f9e365", "scanner": "scanner-primary", "fingerprint": "34a28afddb73dfbb", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-f91be90b493eabb1", "level": "none", "message": {"text": "Commented-code block (6 lines) in src/config/featureUnlocks.ts:48"}, "properties": {"repobilityId": "fa89a05a28582d53", "scanner": "scanner-primary", "fingerprint": "f91be90b493eabb1", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-47c3e1631f6c5887", "level": "none", "message": {"text": "Commented-code block (5 lines) in tutorials/tour-zoom.config.ts:3"}, "properties": {"repobilityId": "b0a9cae78036f7bf", "scanner": "scanner-primary", "fingerprint": "47c3e1631f6c5887", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-20fb698b92ae0429", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 public/godot/index.js:1"}, "properties": {"repobilityId": "3fd3d34796dfb799", "scanner": "scanner-primary", "fingerprint": "20fb698b92ae0429", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-8e047ab7af03962f", "level": "note", "message": {"text": "7 env vars used in code but missing from .env.example"}, "properties": {"repobilityId": "5a0455f6498c27ad", "scanner": "scanner-primary", "fingerprint": "8e047ab7af03962f", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "config-drift"]}}, {"ruleId": "scanner-0a53fdb19dfdf9a6", "level": "error", "message": {"text": "Dangling fetch: POST https://api.resend.com/emails (api/ask-human.ts:80)"}, "properties": {"repobilityId": "e69d91270930d365", "scanner": "scanner-primary", "fingerprint": "0a53fdb19dfdf9a6", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-f808f8dc92dc77f5", "level": "error", "message": {"text": "Dangling fetch: GET /api/taskboard (src/components/MissionControl.tsx:342)"}, "properties": {"repobilityId": "1a770e35826d7155", "scanner": "scanner-primary", "fingerprint": "f808f8dc92dc77f5", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-4b879b7e17961257", "level": "error", "message": {"text": "Dangling fetch: POST /api/taskboard (src/components/MissionControl.tsx:356)"}, "properties": {"repobilityId": "08025745a8725c58", "scanner": "scanner-primary", "fingerprint": "4b879b7e17961257", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-21a9eb12f5d7c535", "level": "error", "message": {"text": "Dangling fetch: POST /api/tutor/chat (src/lib/tutorClient.ts:34)"}, "properties": {"repobilityId": "eaa3f2128997b5e1", "scanner": "scanner-primary", "fingerprint": "21a9eb12f5d7c535", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-35c5efd484af544b", "level": "error", "message": {"text": "Dangling fetch: POST /api/ask-human (src/lib/helpRequests.ts:202)"}, "properties": {"repobilityId": "74648887c90a9ab9", "scanner": "scanner-primary", "fingerprint": "35c5efd484af544b", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-7e3cf08d9f4bd9d2", "level": "note", "message": {"text": "Unused endpoint: USE /api/taskboard"}, "properties": {"repobilityId": "3fc1e4ed85313430", "scanner": "scanner-primary", "fingerprint": "7e3cf08d9f4bd9d2", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}]}]}