{"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-110e5669a8cfc725", "name": "Possibly dead Python function: do_GET", "shortDescription": {"text": "Possibly dead Python function: do_GET"}, "fullDescription": {"text": "No callers detected by AST scan in this repo. Could be exported for external callers or a framework handler."}, "properties": {"scanner": "scanner-primary", "layer": "software", "severity": "low", "confidence": 1.0}}, {"id": "scanner-8d281edcc61a5d19", "name": "Possibly dead Python function: do_POST", "shortDescription": {"text": "Possibly dead Python function: do_POST"}, "fullDescription": {"text": "No callers detected by AST scan in this repo. Could be exported for external callers or a framework handler."}, "properties": {"scanner": "scanner-primary", "layer": "software", "severity": "low", "confidence": 1.0}}, {"id": "scanner-23d9d5c1fbda4aa9", "name": "Possibly dead Python function: do_POST", "shortDescription": {"text": "Possibly dead Python function: do_POST"}, "fullDescription": {"text": "No callers detected by AST scan in this repo. Could be exported for external callers or a framework handler."}, "properties": {"scanner": "scanner-primary", "layer": "software", "severity": "low", "confidence": 1.0}}, {"id": "scanner-25cbf011e12fb8cc", "name": "Possibly dead Python function: do_GET", "shortDescription": {"text": "Possibly dead Python function: do_GET"}, "fullDescription": {"text": "No callers detected by AST scan in this repo. Could be exported for external callers or a framework handler."}, "properties": {"scanner": "scanner-primary", "layer": "software", "severity": "low", "confidence": 1.0}}, {"id": "scanner-212a7c97fdd40581", "name": "Possibly dead Python function: do_POST", "shortDescription": {"text": "Possibly dead Python function: do_POST"}, "fullDescription": {"text": "No callers detected by AST scan in this repo. Could be exported for external callers or a framework handler."}, "properties": {"scanner": "scanner-primary", "layer": "software", "severity": "low", "confidence": 1.0}}, {"id": "scanner-fd862466e270f02d", "name": "Possibly dead Python function: do_GET", "shortDescription": {"text": "Possibly dead Python function: do_GET"}, "fullDescription": {"text": "No callers detected by AST scan in this repo. Could be exported for external callers or a framework handler."}, "properties": {"scanner": "scanner-primary", "layer": "software", "severity": "low", "confidence": 1.0}}, {"id": "scanner-15aeafa345264d62", "name": "Possibly dead Python function: do_POST", "shortDescription": {"text": "Possibly dead Python function: do_POST"}, "fullDescription": {"text": "No callers detected by AST scan in this repo. Could be exported for external callers or a framework handler."}, "properties": {"scanner": "scanner-primary", "layer": "software", "severity": "low", "confidence": 1.0}}, {"id": "scanner-4c36eb1b78308be0", "name": "Possibly dead Python function: do_POST", "shortDescription": {"text": "Possibly dead Python function: do_POST"}, "fullDescription": {"text": "No callers detected by AST scan in this repo. Could be exported for external callers or a framework handler."}, "properties": {"scanner": "scanner-primary", "layer": "software", "severity": "low", "confidence": 1.0}}, {"id": "scanner-746ae7a77c2b5db7", "name": "Possibly dead Python function: do_OPTIONS", "shortDescription": {"text": "Possibly dead Python function: do_OPTIONS"}, "fullDescription": {"text": "No callers detected by AST scan in this repo. Could be exported for external callers or a framework handler."}, "properties": {"scanner": "scanner-primary", "layer": "software", "severity": "low", "confidence": 1.0}}, {"id": "scanner-bc77d677768dc375", "name": "Possibly dead Python function: do_GET", "shortDescription": {"text": "Possibly dead Python function: do_GET"}, "fullDescription": {"text": "No callers detected by AST scan in this repo. Could be exported for external callers or a framework handler."}, "properties": {"scanner": "scanner-primary", "layer": "software", "severity": "low", "confidence": 1.0}}, {"id": "scanner-3fccced44f7a6ca7", "name": "Possibly dead Python function: do_POST", "shortDescription": {"text": "Possibly dead Python function: do_POST"}, "fullDescription": {"text": "No callers detected by AST scan in this repo. Could be exported for external callers or a framework handler."}, "properties": {"scanner": "scanner-primary", "layer": "software", "severity": "low", "confidence": 1.0}}, {"id": "scanner-09d0259700d52902", "name": "Possibly dead Python function: do_GET", "shortDescription": {"text": "Possibly dead Python function: do_GET"}, "fullDescription": {"text": "No callers detected by AST scan in this repo. Could be exported for external callers or a framework handler."}, "properties": {"scanner": "scanner-primary", "layer": "software", "severity": "low", "confidence": 1.0}}, {"id": "scanner-f21ffdb59c2f2b08", "name": "Possibly dead Python function: do_POST", "shortDescription": {"text": "Possibly dead Python function: do_POST"}, "fullDescription": {"text": "No callers detected by AST scan in this repo. Could be exported for external callers or a framework handler."}, "properties": {"scanner": "scanner-primary", "layer": "software", "severity": "low", "confidence": 1.0}}, {"id": "scanner-abf3e32658a3fdf0", "name": "Possibly dead Python function: do_POST", "shortDescription": {"text": "Possibly dead Python function: do_POST"}, "fullDescription": {"text": "No callers detected by AST scan in this repo. Could be exported for external callers or a framework handler."}, "properties": {"scanner": "scanner-primary", "layer": "software", "severity": "low", "confidence": 1.0}}, {"id": "scanner-06fff2f3d314a6fb", "name": "Possibly dead Python function: do_GET", "shortDescription": {"text": "Possibly dead Python function: do_GET"}, "fullDescription": {"text": "No callers detected by AST scan in this repo. Could be exported for external callers or a framework handler."}, "properties": {"scanner": "scanner-primary", "layer": "software", "severity": "low", "confidence": 1.0}}, {"id": "scanner-4ff0a57e389e5abf", "name": "Possibly dead Python function: first_page", "shortDescription": {"text": "Possibly dead Python function: first_page"}, "fullDescription": {"text": "No callers detected by AST scan in this repo. Could be exported for external callers or a framework handler."}, "properties": {"scanner": "scanner-primary", "layer": "software", "severity": "low", "confidence": 1.0}}, {"id": "scanner-130bab8be88d2126", "name": "Possibly dead Python function: later_page", "shortDescription": {"text": "Possibly dead Python function: later_page"}, "fullDescription": {"text": "No callers detected by AST scan in this repo. Could be exported for external callers or a framework handler."}, "properties": {"scanner": "scanner-primary", "layer": "software", "severity": "low", "confidence": 1.0}}, {"id": "scanner-efac71d61daa78bf", "name": "Possibly dead Python function: wrap", "shortDescription": {"text": "Possibly dead Python function: wrap"}, "fullDescription": {"text": "No callers detected by AST scan in this repo. Could be exported for external callers or a framework handler."}, "properties": {"scanner": "scanner-primary", "layer": "software", "severity": "low", "confidence": 1.0}}, {"id": "scanner-c87b8da6937b0ece", "name": "Possibly dead Python function: draw", "shortDescription": {"text": "Possibly dead Python function: draw"}, "fullDescription": {"text": "No callers detected by AST scan in this repo. Could be exported for external callers or a framework handler."}, "properties": {"scanner": "scanner-primary", "layer": "software", "severity": "low", "confidence": 1.0}}, {"id": "scanner-d93828f930cc4c64", "name": "Possibly dead Python function: first_page", "shortDescription": {"text": "Possibly dead Python function: first_page"}, "fullDescription": {"text": "No callers detected by AST scan in this repo. Could be exported for external callers or a framework handler."}, "properties": {"scanner": "scanner-primary", "layer": "software", "severity": "low", "confidence": 1.0}}, {"id": "scanner-cf00db32a52cda97", "name": "Possibly dead Python function: later_page", "shortDescription": {"text": "Possibly dead Python function: later_page"}, "fullDescription": {"text": "No callers detected by AST scan in this repo. Could be exported for external callers or a framework handler."}, "properties": {"scanner": "scanner-primary", "layer": "software", "severity": "low", "confidence": 1.0}}, {"id": "scanner-83a0775e463d8966", "name": "Possibly dead Python function: wrap", "shortDescription": {"text": "Possibly dead Python function: wrap"}, "fullDescription": {"text": "No callers detected by AST scan in this repo. Could be exported for external callers or a framework handler."}, "properties": {"scanner": "scanner-primary", "layer": "software", "severity": "low", "confidence": 1.0}}, {"id": "scanner-4cbef7e84b23d276", "name": "Possibly dead Python function: draw", "shortDescription": {"text": "Possibly dead Python function: draw"}, "fullDescription": {"text": "No callers detected by AST scan in this repo. Could be exported for external callers or a framework handler."}, "properties": {"scanner": "scanner-primary", "layer": "software", "severity": "low", "confidence": 1.0}}, {"id": "scanner-9a102387a8aa793a", "name": "Possibly dead Python function: first_page", "shortDescription": {"text": "Possibly dead Python function: first_page"}, "fullDescription": {"text": "No callers detected by AST scan in this repo. Could be exported for external callers or a framework handler."}, "properties": {"scanner": "scanner-primary", "layer": "software", "severity": "low", "confidence": 1.0}}, {"id": "scanner-658ee834c952f26d", "name": "Possibly dead Python function: later_page", "shortDescription": {"text": "Possibly dead Python function: later_page"}, "fullDescription": {"text": "No callers detected by AST scan in this repo. Could be exported for external callers or a framework handler."}, "properties": {"scanner": "scanner-primary", "layer": "software", "severity": "low", "confidence": 1.0}}, {"id": "scanner-7a75e13df10f69c7", "name": "Possibly dead Python function: wrap", "shortDescription": {"text": "Possibly dead Python function: wrap"}, "fullDescription": {"text": "No callers detected by AST scan in this repo. Could be exported for external callers or a framework handler."}, "properties": {"scanner": "scanner-primary", "layer": "software", "severity": "low", "confidence": 1.0}}, {"id": "scanner-a3f50cb32478e1b2", "name": "Possibly dead Python function: draw", "shortDescription": {"text": "Possibly dead Python function: draw"}, "fullDescription": {"text": "No callers detected by AST scan in this repo. Could be exported for external callers or a framework handler."}, "properties": {"scanner": "scanner-primary", "layer": "software", "severity": "low", "confidence": 1.0}}, {"id": "scanner-e96baad33659c3d7", "name": "Possibly dead Python function: first_page", "shortDescription": {"text": "Possibly dead Python function: first_page"}, "fullDescription": {"text": "No callers detected by AST scan in this repo. Could be exported for external callers or a framework handler."}, "properties": {"scanner": "scanner-primary", "layer": "software", "severity": "low", "confidence": 1.0}}, {"id": "scanner-a23bf179713d6355", "name": "Possibly dead Python function: later_page", "shortDescription": {"text": "Possibly dead Python function: later_page"}, "fullDescription": {"text": "No callers detected by AST scan in this repo. Could be exported for external callers or a framework handler."}, "properties": {"scanner": "scanner-primary", "layer": "software", "severity": "low", "confidence": 1.0}}, {"id": "scanner-828f0a5231ebcc13", "name": "Possibly dead Python function: wrap", "shortDescription": {"text": "Possibly dead Python function: wrap"}, "fullDescription": {"text": "No callers detected by AST scan in this repo. Could be exported for external callers or a framework handler."}, "properties": {"scanner": "scanner-primary", "layer": "software", "severity": "low", "confidence": 1.0}}, {"id": "scanner-a3cedac953e9fdc5", "name": "Stray `console.log` in TS/JS \u2014 textbook-generator.js:552", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 textbook-generator.js:552"}, "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-2316b86af6082dce", "name": "Icon-only button without accessible name \u2014 mypage.js:2137", "shortDescription": {"text": "Icon-only button without accessible name \u2014 mypage.js:2137"}, "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-525673425ab9bca9", "name": "Icon-only button without accessible name \u2014 ceo.js:2047", "shortDescription": {"text": "Icon-only button without accessible name \u2014 ceo.js:2047"}, "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-ce5fca0946ee4fc7", "name": "Icon-only button without accessible name \u2014 pwa.js:46", "shortDescription": {"text": "Icon-only button without accessible name \u2014 pwa.js:46"}, "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-f87ad48561e2cbfa", "name": "Stray `console.log` in TS/JS \u2014 english-exam.js:1676", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 english-exam.js:1676"}, "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-bffa3ad9f3479eb0", "name": "Stray `console.log` in TS/JS \u2014 app.js:3892", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 app.js:3892"}, "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-6be5cc61f85ade12", "name": "Stray `console.log` in TS/JS \u2014 personalized-outreach.js:50", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 personalized-outreach.js:50"}, "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-9b1eb539ebdccaf8", "name": "Stray `console.log` in TS/JS \u2014 payment/app.js:974", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 payment/app.js:974"}, "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-6367dcf49f187583", "name": "Privileged port 20 in use", "shortDescription": {"text": "Privileged port 20 in use"}, "fullDescription": {"text": "Port 20 is privileged (<1024). Make sure the service runs with the right caps or front it with a non-privileged port via a load balancer."}, "properties": {"scanner": "scanner-primary", "layer": "network", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-3fab594c24034be9", "name": "Privileged port 11 in use", "shortDescription": {"text": "Privileged port 11 in use"}, "fullDescription": {"text": "Port 11 is privileged (<1024). Make sure the service runs with the right caps or front it with a non-privileged port via a load balancer."}, "properties": {"scanner": "scanner-primary", "layer": "network", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-aa5acaa49eb8315b", "name": "Containers defined but no K8s/orchestration manifest found", "shortDescription": {"text": "Containers defined but no K8s/orchestration manifest found"}, "fullDescription": {"text": "Repo has Dockerfiles/compose but no Kubernetes/Nomad manifests. If the target deployment is K8s, the manifests may live in a separate ops repo."}, "properties": {"scanner": "scanner-primary", "layer": "hardware", "severity": "low", "confidence": 1.0}}, {"id": "scanner-9710c8d059e53154", "name": "No frontend routes/components detected", "shortDescription": {"text": "No frontend routes/components detected"}, "fullDescription": {"text": "No React/Vue/Next routes were found. This is fine for backend-only repos."}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-03102b83831bdae9", "name": "Insecure pattern 'direct_innerhtml_assignment' in textbook-generator.js:87", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in textbook-generator.js:87"}, "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-c9dea5bf93fd0ddc", "name": "Insecure pattern 'direct_innerhtml_assignment' in university-exam.html:318", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in university-exam.html:318"}, "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-49baaf6eaf5b9f49", "name": "Insecure pattern 'insert_adjacent_html' in university-exam.html:916", "shortDescription": {"text": "Insecure pattern 'insert_adjacent_html' in university-exam.html:916"}, "fullDescription": {"text": "Found a known-risky pattern (insert_adjacent_html). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-077c3575d974e077", "name": "Insecure pattern 'document_write' in mypage.js:3895", "shortDescription": {"text": "Insecure pattern 'document_write' in mypage.js:3895"}, "fullDescription": {"text": "Found a known-risky pattern (document_write). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "low", "confidence": 1.0}}, {"id": "scanner-82ebb9dcb64fdeb4", "name": "Insecure pattern 'direct_innerhtml_assignment' in mypage.js:294", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in mypage.js:294"}, "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-54c19eebaf5dce58", "name": "Insecure pattern 'local_storage_auth_token' in frontend-error-monitor.js:26", "shortDescription": {"text": "Insecure pattern 'local_storage_auth_token' in frontend-error-monitor.js:26"}, "fullDescription": {"text": "Found a known-risky pattern (local_storage_auth_token). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-eb3b25b69e6d2017", "name": "Insecure pattern 'direct_innerhtml_assignment' in exam-prep.js:83", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in exam-prep.js:83"}, "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-18e8fa1cd2dd0304", "name": "Insecure pattern 'direct_innerhtml_assignment' in vocab.js:104", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in vocab.js:104"}, "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-71cc38a6f0cee3c7", "name": "Insecure pattern 'direct_innerhtml_assignment' in social-proof.js:39", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in social-proof.js:39"}, "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-731059368882556e", "name": "Insecure pattern 'direct_innerhtml_assignment' in checkout.js:151", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in checkout.js:151"}, "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-df5171de0c236fe2", "name": "Insecure pattern 'direct_innerhtml_assignment' in alerts.js:71", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in alerts.js:71"}, "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-4f31abef056065ec", "name": "Insecure pattern 'direct_innerhtml_assignment' in learning-brain.js:312", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in learning-brain.js:312"}, "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-1da56f94b5617050", "name": "Insecure pattern 'direct_innerhtml_assignment' in student-upgrade.html:24", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in student-upgrade.html:24"}, "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-4457b4c9764d2c8f", "name": "Insecure pattern 'direct_innerhtml_assignment' in support.html:238", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in support.html:238"}, "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-51c7a95b44f66314", "name": "Insecure pattern 'direct_innerhtml_assignment' in ceo.js:156", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in ceo.js:156"}, "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-c524c4f92f00d25d", "name": "Insecure pattern 'direct_innerhtml_assignment' in lp.html:1102", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in lp.html:1102"}, "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-ff1be268bed52301", "name": "Insecure pattern 'direct_innerhtml_assignment' in material-scan.html:106", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in material-scan.html:106"}, "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-e34885655fd8a78b", "name": "Insecure pattern 'direct_innerhtml_assignment' in referral-program.js:128", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in referral-program.js:128"}, "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-730cfd6d42c74a89", "name": "Insecure pattern 'direct_innerhtml_assignment' in article.html:124", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in article.html:124"}, "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-ab9f9542d8ae98e0", "name": "Insecure pattern 'direct_innerhtml_assignment' in pwa.js:37", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in pwa.js: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-7fac0c1cce918005", "name": "Insecure pattern 'direct_innerhtml_assignment' in checkout-success.html:302", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in checkout-success.html:302"}, "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-d895461a6f8a2009", "name": "Insecure pattern 'direct_innerhtml_assignment' in content-studio.js:44", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in content-studio.js: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-d3fa5d5e32195093", "name": "Insecure pattern 'direct_innerhtml_assignment' in login.html:287", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in login.html:287"}, "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-f4616a239b244ea3", "name": "Insecure pattern 'local_storage_auth_token' in login.html:366", "shortDescription": {"text": "Insecure pattern 'local_storage_auth_token' in login.html:366"}, "fullDescription": {"text": "Found a known-risky pattern (local_storage_auth_token). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-d701e6b4fe48ff9c", "name": "Insecure pattern 'direct_innerhtml_assignment' in index.html:1528", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in index.html:1528"}, "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-4cfdde450fa6f7f5", "name": "Insecure pattern 'direct_innerhtml_assignment' in checkout.html:328", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in checkout.html:328"}, "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-ee85e254324efe5e", "name": "Insecure pattern 'direct_innerhtml_assignment' in english-exam.js:901", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in english-exam.js:901"}, "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-2d342a5c3d0378da", "name": "Insecure pattern 'direct_innerhtml_assignment' in exam-prep.html:113", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in exam-prep.html:113"}, "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-ecf9ec52f1f4c513", "name": "Insecure pattern 'direct_innerhtml_assignment' in safety-school.js:166", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in safety-school.js:166"}, "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-1ee3de2146df36e9", "name": "Insecure pattern 'direct_innerhtml_assignment' in quick-start.js:196", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in quick-start.js:196"}, "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-b0c83a37d5a8372d", "name": "Insecure pattern 'direct_innerhtml_assignment' in ai-tutor-photo.html:147", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in ai-tutor-photo.html:147"}, "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-137b16e34b394143", "name": "Insecure pattern 'direct_innerhtml_assignment' in mock-exam.js:24", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in mock-exam.js:24"}, "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-b0c748e336ec07b8", "name": "Insecure pattern 'document_write' in mypage.html:1765", "shortDescription": {"text": "Insecure pattern 'document_write' in mypage.html:1765"}, "fullDescription": {"text": "Found a known-risky pattern (document_write). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "low", "confidence": 1.0}}, {"id": "scanner-a97838ca5f5838fd", "name": "Insecure pattern 'direct_innerhtml_assignment' in mypage.html:203", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in mypage.html:203"}, "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-0fe10ec55bbaefd1", "name": "Insecure pattern 'direct_innerhtml_assignment' in admin-only.js:32", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in admin-only.js:32"}, "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-05451b3fbea4c3bc", "name": "Insecure pattern 'document_write' in app.js:8953", "shortDescription": {"text": "Insecure pattern 'document_write' in app.js:8953"}, "fullDescription": {"text": "Found a known-risky pattern (document_write). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "low", "confidence": 1.0}}, {"id": "scanner-ccd6de39bca78694", "name": "Insecure pattern 'direct_innerhtml_assignment' in app.js:53", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in app.js:53"}, "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-5a515b1c71fb2350", "name": "Insecure pattern 'direct_outerhtml_assignment' in app.js:8069", "shortDescription": {"text": "Insecure pattern 'direct_outerhtml_assignment' in app.js:8069"}, "fullDescription": {"text": "Found a known-risky pattern (direct_outerhtml_assignment). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-488253e067886e41", "name": "Insecure pattern 'local_storage_auth_token' in app.js:788", "shortDescription": {"text": "Insecure pattern 'local_storage_auth_token' in app.js:788"}, "fullDescription": {"text": "Found a known-risky pattern (local_storage_auth_token). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-aaea532f150bf6b3", "name": "Insecure pattern 'direct_innerhtml_assignment' in ceo.html:1019", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in ceo.html:1019"}, "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-0ad6b4566223b8fb", "name": "Insecure pattern 'direct_outerhtml_assignment' in ceo.html:8403", "shortDescription": {"text": "Insecure pattern 'direct_outerhtml_assignment' in ceo.html:8403"}, "fullDescription": {"text": "Found a known-risky pattern (direct_outerhtml_assignment). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-dabc6163f83530c0", "name": "Insecure pattern 'insert_adjacent_html' in ceo.html:4209", "shortDescription": {"text": "Insecure pattern 'insert_adjacent_html' in ceo.html:4209"}, "fullDescription": {"text": "Found a known-risky pattern (insert_adjacent_html). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-69cfe63c7f32c171", "name": "Insecure pattern 'local_storage_auth_token' in ceo.html:7481", "shortDescription": {"text": "Insecure pattern 'local_storage_auth_token' in ceo.html:7481"}, "fullDescription": {"text": "Found a known-risky pattern (local_storage_auth_token). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-718e5b2d3647b135", "name": "Insecure pattern 'direct_innerhtml_assignment' in auth.html:150", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in auth.html:150"}, "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-bbbd54773f28966a", "name": "Insecure pattern 'local_storage_auth_token' in auth.html:241", "shortDescription": {"text": "Insecure pattern 'local_storage_auth_token' in auth.html:241"}, "fullDescription": {"text": "Found a known-risky pattern (local_storage_auth_token). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-cbf8d39634755d70", "name": "Insecure pattern 'direct_innerhtml_assignment' in demo-features.js:325", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in demo-features.js:325"}, "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-3d85c8110d2f4055", "name": "Insecure pattern 'direct_innerhtml_assignment' in instagram-cta.html:201", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in instagram-cta.html:201"}, "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-5645b8134e586f33", "name": "Insecure pattern 'direct_innerhtml_assignment' in blog.html:136", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in blog.html:136"}, "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-6e37ec924399b67d", "name": "Insecure pattern 'direct_innerhtml_assignment' in referral.html:252", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in referral.html:252"}, "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-3ee5cf6a00a28dd4", "name": "Insecure pattern 'local_storage_auth_token' in analytics.js:33", "shortDescription": {"text": "Insecure pattern 'local_storage_auth_token' in analytics.js:33"}, "fullDescription": {"text": "Found a known-risky pattern (local_storage_auth_token). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-59f8f549f25d6be4", "name": "Insecure pattern 'direct_innerhtml_assignment' in video-ads.js:59", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in video-ads.js:59"}, "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-c20a9d48294bc9df", "name": "Insecure pattern 'direct_innerhtml_assignment' in success-stories.js:199", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in success-stories.js:199"}, "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-e7f36fa4d6c93a3d", "name": "Insecure pattern 'direct_innerhtml_assignment' in personalized-outreach.js:292", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in personalized-outreach.js:292"}, "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-8f45462533847191", "name": "Insecure pattern 'direct_innerhtml_assignment' in dojo-drill.html:289", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in dojo-drill.html:289"}, "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-7ffcabf0e955fd37", "name": "Insecure pattern 'cors_wildcard' in api/register-subscribe.py:493", "shortDescription": {"text": "Insecure pattern 'cors_wildcard' in api/register-subscribe.py:493"}, "fullDescription": {"text": "Found a known-risky pattern (cors_wildcard). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-0927cedc46de0793", "name": "Insecure pattern 'direct_innerhtml_assignment' in payment/chat.html:318", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in payment/chat.html:318"}, "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-4dedae542f038c77", "name": "Insecure pattern 'direct_innerhtml_assignment' in payment/app.js:133", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in payment/app.js:133"}, "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-fc1dc18526a4f027", "name": "Insecure pattern 'direct_innerhtml_assignment' in payment/register.html:442", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in payment/register.html:442"}, "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-4601e3ad3bb28677", "name": "No CI/CD pipelines detected", "shortDescription": {"text": "No CI/CD pipelines detected"}, "fullDescription": {"text": "No GitHub Actions, GitLab CI, or CircleCI configs found. Without CI you can't gate deploys on tests/lints."}, "properties": {"scanner": "scanner-primary", "layer": "cicd", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-53c6e10d2c7a4e9c", "name": "Very large file: textbook-generator.js (1528 lines)", "shortDescription": {"text": "Very large file: textbook-generator.js (1528 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-8cfa6674129140af", "name": "Very large file: mypage.js (5173 lines)", "shortDescription": {"text": "Very large file: mypage.js (5173 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-27e7356504b62e65", "name": "Very large file: ceo.js (2385 lines)", "shortDescription": {"text": "Very large file: ceo.js (2385 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-ab6ee30244b17341", "name": "Very large file: english-exam.js (5524 lines)", "shortDescription": {"text": "Very large file: english-exam.js (5524 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-a97a963d0fab52e4", "name": "Very large file: app.js (10426 lines)", "shortDescription": {"text": "Very large file: app.js (10426 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-c041653820f6b36b", "name": "Very large file: scripts/generate_coaching_guide_v6.py (2554 lines)", "shortDescription": {"text": "Very large file: scripts/generate_coaching_guide_v6.py (2554 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-6759d3915ea8eed5", "name": "Very large file: scripts/generate_coaching_guide_v2.py (1246 lines)", "shortDescription": {"text": "Very large file: scripts/generate_coaching_guide_v2.py (1246 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-7c24111165f20a93", "name": "Very large file: scripts/generate_coaching_guide_v3.py (2055 lines)", "shortDescription": {"text": "Very large file: scripts/generate_coaching_guide_v3.py (2055 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-de4fcea5fae33bfe", "name": "Very large file: scripts/generate_coaching_guide_v4.py (2729 lines)", "shortDescription": {"text": "Very large file: scripts/generate_coaching_guide_v4.py (2729 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-33d0e365b41d8317", "name": "Very large file: payment/app.js (5953 lines)", "shortDescription": {"text": "Very large file: payment/app.js (5953 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": "0 test file(s) for 110 source file(s) (ratio 0.00). 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-01f96f71d9907a8c", "name": "README lacks setup or run instructions", "shortDescription": {"text": "README lacks setup or run instructions"}, "fullDescription": {"text": "A README exists, but it does not contain common install/setup/run markers. This matches a frequent generated-code pattern: UI is present, operational handoff is thin."}, "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 323 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 122 placeholder/mock markers across 17 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-9d79c4077342a7d0", "name": "Runtime service client appears to use placeholder configuration", "shortDescription": {"text": "Runtime service client appears to use placeholder configuration"}, "fullDescription": {"text": "A runtime source file appears to wire Supabase/Firebase/AI/payment-style clients to placeholder URLs, keys, or fallback values. In the Fable corpus this often means the UI/API shape is present while the backend service is not actually configured."}, "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-b9088664ace7f748", "name": "Composite production-readiness gap", "shortDescription": {"text": "Composite production-readiness gap"}, "fullDescription": {"text": "Multiple low-cost hardening controls are missing together: license, ci, tests, operator-readme. Opus verification showed these co-occurring gaps are a better readiness signal than reading each flag in isolation."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-ea8f3013f588db25", "name": "Shallow git history limits provenance confidence", "shortDescription": {"text": "Shallow git history limits provenance confidence"}, "fullDescription": {"text": "The repository is a shallow clone. Origin/evolution analysis cannot distinguish fresh generation, imported legacy code, or long-lived human code with high confidence."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-8424db9c75e04ba4", "name": "Very short observed git history", "shortDescription": {"text": "Very short observed git history"}, "fullDescription": {"text": "The repo has multiple source files but two or fewer visible commits. This is not a failure by itself, but it lowers confidence in evolution-based diagnosis."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-2c2af1fcc95be213", "name": "Commented-code block (5 lines) in textbook-generator.js:424", "shortDescription": {"text": "Commented-code block (5 lines) in textbook-generator.js:424"}, "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-0f1f062be4e721c9", "name": "`fetch()` without try/.catch or AbortSignal \u2014 textbook-generator.js:469", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 textbook-generator.js:469"}, "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-1d7c96681c922f15", "name": "Commented-code block (8 lines) in mypage.js:12", "shortDescription": {"text": "Commented-code block (8 lines) in mypage.js: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-f693b80125491612", "name": "`fetch()` without try/.catch or AbortSignal \u2014 mypage.js:274", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 mypage.js:274"}, "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-eaf1cda3eecb4dfe", "name": "Commented-code block (6 lines) in frontend-error-monitor.js:1", "shortDescription": {"text": "Commented-code block (6 lines) in frontend-error-monitor.js: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-142a1df864f4fcc8", "name": "Commented-code block (8 lines) in plans.js:1", "shortDescription": {"text": "Commented-code block (8 lines) in plans.js: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-cc53efa0fcce0a73", "name": "Commented-code block (7 lines) in checkout.js:340", "shortDescription": {"text": "Commented-code block (7 lines) in checkout.js:340"}, "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-b9fdc14e0cf84079", "name": "Commented-code block (7 lines) in learning-brain.js:46", "shortDescription": {"text": "Commented-code block (7 lines) in learning-brain.js:46"}, "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-2d0a815375e3dbb6", "name": "Commented-code block (6 lines) in ceo.js:49", "shortDescription": {"text": "Commented-code block (6 lines) in ceo.js:49"}, "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-1e7905918be406dc", "name": "`fetch()` without try/.catch or AbortSignal \u2014 ceo.js:1080", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 ceo.js:1080"}, "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-7cd1fd20777d3ad7", "name": "Commented-code block (9 lines) in student-mode.js:1", "shortDescription": {"text": "Commented-code block (9 lines) in student-mode.js: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-ababb5bca99cb771", "name": "Commented-code block (6 lines) in sw.js:8", "shortDescription": {"text": "Commented-code block (6 lines) in sw.js:8"}, "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-b3a26dfd640a58b1", "name": "Commented-code block (6 lines) in past-exams-db.js:1", "shortDescription": {"text": "Commented-code block (6 lines) in past-exams-db.js: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-85db561d0175936b", "name": "Legacy-named symbol `ee_qpref_v1` in english-exam.js:2293", "shortDescription": {"text": "Legacy-named symbol `ee_qpref_v1` in english-exam.js:2293"}, "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-22c87bf171732f6a", "name": "Commented-code block (5 lines) in english-exam.js:1466", "shortDescription": {"text": "Commented-code block (5 lines) in english-exam.js:1466"}, "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-3fc3de089ce414ec", "name": "`fetch()` without try/.catch or AbortSignal \u2014 english-exam.js:725", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 english-exam.js:725"}, "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-4079c134ce0cca38", "name": "Commented-code block (6 lines) in mock-exam.js:539", "shortDescription": {"text": "Commented-code block (6 lines) in mock-exam.js:539"}, "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-d9d1b7ee726e8f8f", "name": "`fetch()` without try/.catch or AbortSignal \u2014 mock-exam.js:292", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 mock-exam.js:292"}, "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-004f806688ca33c5", "name": "Legacy-named symbol `ai_juku_problem_stats_v1` in app.js:8141", "shortDescription": {"text": "Legacy-named symbol `ai_juku_problem_stats_v1` in app.js:8141"}, "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-f0108e0e9823bab3", "name": "Commented-code block (5 lines) in app.js:207", "shortDescription": {"text": "Commented-code block (5 lines) in app.js:207"}, "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-74d5139be8da28ed", "name": "`fetch()` without try/.catch or AbortSignal \u2014 app.js:3522", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app.js:3522"}, "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-152b75a77b2438fe", "name": "`fetch()` without try/.catch or AbortSignal \u2014 auth-guard.js:86", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 auth-guard.js:86"}, "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-401bf7b4c5f90163", "name": "Commented-code block (5 lines) in english-exam-banks.js:1", "shortDescription": {"text": "Commented-code block (5 lines) in english-exam-banks.js: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-04ac72be5ea2c1fc", "name": "Legacy-named symbol `ai_juku_sw_purge_log_v2` in cache-purge.js:48", "shortDescription": {"text": "Legacy-named symbol `ai_juku_sw_purge_log_v2` in cache-purge.js:48"}, "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-38da188c641bac63", "name": "Commented-code block (5 lines) in cache-purge.js:120", "shortDescription": {"text": "Commented-code block (5 lines) in cache-purge.js:120"}, "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-9a65166930f8721a", "name": "Commented-code block (7 lines) in analytics.js:1", "shortDescription": {"text": "Commented-code block (7 lines) in analytics.js: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-ac0b3e4f644e4abd", "name": "`fetch()` without try/.catch or AbortSignal \u2014 personalized-outreach.js:24", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 personalized-outreach.js:24"}, "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-90f031d9047b7e3a", "name": "Commented-code block (6 lines) in api/admin-charge-month-end-execute.py:200", "shortDescription": {"text": "Commented-code block (6 lines) in api/admin-charge-month-end-execute.py:200"}, "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-12d25fde65bef2e3", "name": "Commented-code block (5 lines) in api/register-subscribe.py:302", "shortDescription": {"text": "Commented-code block (5 lines) in api/register-subscribe.py:302"}, "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-79961615a12492c2", "name": "Legacy-named symbol `AI_Coaching_Guide_v2` in scripts/generate_coaching_guide_v6.py:10", "shortDescription": {"text": "Legacy-named symbol `AI_Coaching_Guide_v2` in scripts/generate_coaching_guide_v6.py:10"}, "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-713ac658cbf84076", "name": "Legacy-named symbol `AI_Coaching_Guide_v2` in scripts/generate_coaching_guide_v2.py:10", "shortDescription": {"text": "Legacy-named symbol `AI_Coaching_Guide_v2` in scripts/generate_coaching_guide_v2.py:10"}, "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-6d9f1627d8f58a58", "name": "Legacy-named symbol `AI_Coaching_Guide_v2` in scripts/generate_coaching_guide_v3.py:10", "shortDescription": {"text": "Legacy-named symbol `AI_Coaching_Guide_v2` in scripts/generate_coaching_guide_v3.py:10"}, "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-c8f4eca5814e1493", "name": "Legacy-named symbol `AI_Coaching_Guide_v2` in scripts/generate_coaching_guide_v4.py:10", "shortDescription": {"text": "Legacy-named symbol `AI_Coaching_Guide_v2` in scripts/generate_coaching_guide_v4.py:10"}, "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-7e66f5637ecc7820", "name": "Legacy-named symbol `generate_reels_video_v2` in marketing-assets/generate_reels_video_v2.py:4", "shortDescription": {"text": "Legacy-named symbol `generate_reels_video_v2` in marketing-assets/generate_reels_video_v2.py:4"}, "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-21ffc04fa11e6531", "name": "Network/subprocess call without timeout or try/except \u2014 marketing-assets/generate_reels_video_v2.py:486", "shortDescription": {"text": "Network/subprocess call without timeout or try/except \u2014 marketing-assets/generate_reels_video_v2.py:486"}, "fullDescription": {"text": "`subprocess.run(...)` here lacks both a `timeout=` arg and an enclosing try/except. This is exactly the class of bug that took down our git-clone earlier (HTTP/2 stream cancel surfaced as a fatal). Add a `timeout=` and wrap in try/except, or use a wrapper that retries."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-da8cb397e4ebc413", "name": "Network/subprocess call without timeout or try/except \u2014 marketing-assets/generate_reels_video.py:519", "shortDescription": {"text": "Network/subprocess call without timeout or try/except \u2014 marketing-assets/generate_reels_video.py:519"}, "fullDescription": {"text": "`subprocess.run(...)` here lacks both a `timeout=` arg and an enclosing try/except. This is exactly the class of bug that took down our git-clone earlier (HTTP/2 stream cancel surfaced as a fatal). Add a `timeout=` and wrap in try/except, or use a wrapper that retries."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-52270ff7de69bc17", "name": "Legacy-named symbol `bcc_copy` in payment/app.js:4810", "shortDescription": {"text": "Legacy-named symbol `bcc_copy` in payment/app.js:4810"}, "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-74d9c15e397ec66f", "name": "Commented-code block (6 lines) in payment/app.js:820", "shortDescription": {"text": "Commented-code block (6 lines) in payment/app.js:820"}, "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-ded1a0da2d958c03", "name": "`fetch()` without try/.catch or AbortSignal \u2014 payment/app.js:1019", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 payment/app.js:1019"}, "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: `AUDIT_BASE`, `CHAT_ADMIN_PASSWORD`, `CHAT_SIGNING_SECRET`, `DATABASE_URL`, `KV_REST_API_TOKEN`, `KV_REST_API_URL`, `PUBLIC_BASE_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-02525d39071dd2c7", "name": "Near-duplicate function bodies in 5 places", "shortDescription": {"text": "Near-duplicate function bodies in 5 places"}, "fullDescription": {"text": "Functions with the same first-5-line body hash:\napi/admin-charge-month-end-preview.py:do_GET, api/admin-charge-month-end-execute.py:do_POST, api/registered-customers.py:do_GET, api/admin-charge-history.py:do_GET\n\nThis is *the* AI-coder failure mode (4\u00d7 more duplication in vibe-coded repos \u2014 see https://jw.hn/ai-code-hygiene). Consolidate or document why they're separate."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-2c04133e54348533", "name": "Near-duplicate function bodies in 2 places", "shortDescription": {"text": "Near-duplicate function bodies in 2 places"}, "fullDescription": {"text": "Functions with the same first-5-line body hash:\napi/admin-registration-cancel.py:do_POST, api/admin-charge-reconcile.py:do_POST\n\nThis is *the* AI-coder failure mode (4\u00d7 more duplication in vibe-coded repos \u2014 see https://jw.hn/ai-code-hygiene). Consolidate or document why they're separate."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-49c98f7cedd9c977", "name": "Near-duplicate function bodies in 4 places", "shortDescription": {"text": "Near-duplicate function bodies in 4 places"}, "fullDescription": {"text": "Functions with the same first-5-line body hash:\nscripts/generate_coaching_guide_v6.py:fig_hensachi_trend, scripts/generate_coaching_guide_v2.py:fig_hensachi_trend, scripts/generate_coaching_guide_v3.py:fig_hensachi_trend, scripts/generate_coaching_guide_v4.py:fig_hensachi_trend\n\nThis is *the* AI-coder failure mode (4\u00d7 more duplication in vibe-coded repos \u2014 see https://jw.hn/ai-code-hygiene). Consolidate or document why they're separate."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-be46ea126aa5d8dc", "name": "Near-duplicate function bodies in 3 places", "shortDescription": {"text": "Near-duplicate function bodies in 3 places"}, "fullDescription": {"text": "Functions with the same first-5-line body hash:\nscripts/generate_coaching_guide_v6.py:fig_subject_hensachi, scripts/generate_coaching_guide_v3.py:fig_subject_hensachi, scripts/generate_coaching_guide_v4.py:fig_subject_hensachi\n\nThis is *the* AI-coder failure mode (4\u00d7 more duplication in vibe-coded repos \u2014 see https://jw.hn/ai-code-hygiene). Consolidate or document why they're separate."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-76a2f6818267a9a8", "name": "Near-duplicate function bodies in 8 places", "shortDescription": {"text": "Near-duplicate function bodies in 8 places"}, "fullDescription": {"text": "Functions with the same first-5-line body hash:\nscripts/generate_coaching_guide_v6.py:wrap, scripts/generate_coaching_guide_v6.py:wrap, scripts/generate_coaching_guide_v2.py:wrap, scripts/generate_coaching_guide_v2.py:wrap\n\nThis is *the* AI-coder failure mode (4\u00d7 more duplication in vibe-coded repos \u2014 see https://jw.hn/ai-code-hygiene). Consolidate or document why they're separate."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-3bf81211ff32ed06", "name": "Dangling fetch: GET /api/admin/messages/${encodeURIComponent(id)}/attachment (ceo.js:1936)", "shortDescription": {"text": "Dangling fetch: GET /api/admin/messages/${encodeURIComponent(id)}/attachment (ceo.js:1936)"}, "fullDescription": {"text": "`ceo.js:1936` calls `GET /api/admin/messages/${encodeURIComponent(id)}/attachment` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/admin/messages/<p>/attachment`\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-07d6b2585e7c3de8", "name": "Dangling fetch: POST /api/admin/ai-draft (ceo.js:2062)", "shortDescription": {"text": "Dangling fetch: POST /api/admin/ai-draft (ceo.js:2062)"}, "fullDescription": {"text": "`ceo.js:2062` calls `POST /api/admin/ai-draft` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/admin/ai-draft`\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-a1f6efd183c234f3", "name": "Dangling fetch: GET /api/admin/course-applications?status=pending&limit=100 (ceo.js:2164)", "shortDescription": {"text": "Dangling fetch: GET /api/admin/course-applications?status=pending&limit=100 (ceo.js:2164)"}, "fullDescription": {"text": "`ceo.js:2164` calls `GET /api/admin/course-applications?status=pending&limit=100` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/admin/course-applications`\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-bfc60222c370b989", "name": "Dangling fetch: POST /api/admin/course-applications/${encodeURIComponent(id)}/approve (ceo.js:2205)", "shortDescription": {"text": "Dangling fetch: POST /api/admin/course-applications/${encodeURIComponent(id)}/approve (ceo.js:2205)"}, "fullDescription": {"text": "`ceo.js:2205` calls `POST /api/admin/course-applications/${encodeURIComponent(id)}/approve` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/admin/course-applications/<p>/approve`\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-b0d7ff53203b510d", "name": "Dangling fetch: POST /api/admin/course-applications/${encodeURIComponent(id)}/reject (ceo.js:2227)", "shortDescription": {"text": "Dangling fetch: POST /api/admin/course-applications/${encodeURIComponent(id)}/reject (ceo.js:2227)"}, "fullDescription": {"text": "`ceo.js:2227` calls `POST /api/admin/course-applications/${encodeURIComponent(id)}/reject` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/admin/course-applications/<p>/reject`\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-b34e76d22d2b98a4", "name": "Dangling fetch: GET /api/admin/db/r2-backups?limit=30 (ceo.js:2281)", "shortDescription": {"text": "Dangling fetch: GET /api/admin/db/r2-backups?limit=30 (ceo.js:2281)"}, "fullDescription": {"text": "`ceo.js:2281` calls `GET /api/admin/db/r2-backups?limit=30` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/admin/db/r2-backups`\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-2e36e5f06862094f", "name": "Dangling fetch: POST /api/admin/db/snapshot-to-r2 (ceo.js:2339)", "shortDescription": {"text": "Dangling fetch: POST /api/admin/db/snapshot-to-r2 (ceo.js:2339)"}, "fullDescription": {"text": "`ceo.js:2339` calls `POST /api/admin/db/snapshot-to-r2` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/admin/db/snapshot-to-r2`\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-ab87f861375224c1", "name": "Dangling fetch: GET http://localhost:8080/default_data.json (app.js:9148)", "shortDescription": {"text": "Dangling fetch: GET http://localhost:8080/default_data.json (app.js:9148)"}, "fullDescription": {"text": "`app.js:9148` calls `GET http://localhost:8080/default_data.json` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/http:/localhost:8080/default_data.json`\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-662cd7d12bd8082d", "name": "Dangling fetch: GET http://localhost:8080/default_data.json (personalized-outreach.js:43)", "shortDescription": {"text": "Dangling fetch: GET http://localhost:8080/default_data.json (personalized-outreach.js:43)"}, "fullDescription": {"text": "`personalized-outreach.js:43` calls `GET http://localhost:8080/default_data.json` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/http:/localhost:8080/default_data.json`\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-d2b747e3b1b46bf4", "name": "Dangling fetch: POST /payment/api/admin-update-registration (payment/app.js:672)", "shortDescription": {"text": "Dangling fetch: POST /payment/api/admin-update-registration (payment/app.js:672)"}, "fullDescription": {"text": "`payment/app.js:672` calls `POST /payment/api/admin-update-registration` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/payment/api/admin-update-registration`\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-acc6b1ad412e14d2", "name": "Dangling fetch: GET /payment/api/registered-customers (payment/app.js:1388)", "shortDescription": {"text": "Dangling fetch: GET /payment/api/registered-customers (payment/app.js:1388)"}, "fullDescription": {"text": "`payment/app.js:1388` calls `GET /payment/api/registered-customers` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/payment/api/registered-customers`\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-2bdf777894d7a33d", "name": "Dangling fetch: POST /payment/api/past-due-invoice (payment/app.js:1986)", "shortDescription": {"text": "Dangling fetch: POST /payment/api/past-due-invoice (payment/app.js:1986)"}, "fullDescription": {"text": "`payment/app.js:1986` calls `POST /payment/api/past-due-invoice` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/payment/api/past-due-invoice`\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-9fd325130a24a917", "name": "Dangling fetch: POST /payment/api/past-due-invoice (payment/app.js:2043)", "shortDescription": {"text": "Dangling fetch: POST /payment/api/past-due-invoice (payment/app.js:2043)"}, "fullDescription": {"text": "`payment/app.js:2043` calls `POST /payment/api/past-due-invoice` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/payment/api/past-due-invoice`\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-21accfea17e645fe", "name": "Dangling fetch: GET /payment/api/admin-charge-month-end-preview (payment/app.js:2281)", "shortDescription": {"text": "Dangling fetch: GET /payment/api/admin-charge-month-end-preview (payment/app.js:2281)"}, "fullDescription": {"text": "`payment/app.js:2281` calls `GET /payment/api/admin-charge-month-end-preview` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/payment/api/admin-charge-month-end-preview`\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-4a71765bbe4f6944", "name": "Dangling fetch: POST /payment/api/admin-charge-month-end-execute (payment/app.js:2467)", "shortDescription": {"text": "Dangling fetch: POST /payment/api/admin-charge-month-end-execute (payment/app.js:2467)"}, "fullDescription": {"text": "`payment/app.js:2467` calls `POST /payment/api/admin-charge-month-end-execute` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/payment/api/admin-charge-month-end-execute`\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-0b52548f99074217", "name": "Dangling fetch: POST /payment/api/admin-charge-month-end-execute (payment/app.js:2490)", "shortDescription": {"text": "Dangling fetch: POST /payment/api/admin-charge-month-end-execute (payment/app.js:2490)"}, "fullDescription": {"text": "`payment/app.js:2490` calls `POST /payment/api/admin-charge-month-end-execute` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/payment/api/admin-charge-month-end-execute`\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-d59659bcf6a3a99d", "name": "Dangling fetch: GET /payment/api/admin-charge-history?month=${encodeURIComponent(month)}&type=${encodeURIComponent(type)", "shortDescription": {"text": "Dangling fetch: GET /payment/api/admin-charge-history?month=${encodeURIComponent(month)}&type=${encodeURIComponent(type)} (payment/app.js:2699)"}, "fullDescription": {"text": "`payment/app.js:2699` calls `GET /payment/api/admin-charge-history?month=${encodeURIComponent(month)}&type=${encodeURIComponent(type)}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/payment/api/admin-charge-history`\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-31e0cd1af0ec01f6", "name": "Dangling fetch: POST /payment/api/admin-charge-reconcile (payment/app.js:2875)", "shortDescription": {"text": "Dangling fetch: POST /payment/api/admin-charge-reconcile (payment/app.js:2875)"}, "fullDescription": {"text": "`payment/app.js:2875` calls `POST /payment/api/admin-charge-reconcile` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/payment/api/admin-charge-reconcile`\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-a459c52e65a65bf5", "name": "Dangling fetch: POST /payment/api/admin-charge-reconcile (payment/app.js:2908)", "shortDescription": {"text": "Dangling fetch: POST /payment/api/admin-charge-reconcile (payment/app.js:2908)"}, "fullDescription": {"text": "`payment/app.js:2908` calls `POST /payment/api/admin-charge-reconcile` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/payment/api/admin-charge-reconcile`\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-561f5a150bfd60fe", "name": "Dangling fetch: POST /payment/api/admin-charge-reconcile (payment/app.js:2915)", "shortDescription": {"text": "Dangling fetch: POST /payment/api/admin-charge-reconcile (payment/app.js:2915)"}, "fullDescription": {"text": "`payment/app.js:2915` calls `POST /payment/api/admin-charge-reconcile` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/payment/api/admin-charge-reconcile`\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-42b7fd3a78fa42e5", "name": "Dangling fetch: POST /payment/api/admin-registration-cancel (payment/app.js:2952)", "shortDescription": {"text": "Dangling fetch: POST /payment/api/admin-registration-cancel (payment/app.js:2952)"}, "fullDescription": {"text": "`payment/app.js:2952` calls `POST /payment/api/admin-registration-cancel` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/payment/api/admin-registration-cancel`\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-62711e8a9bc2b871", "name": "Dangling fetch: POST /payment/api/mail-send (payment/app.js:4711)", "shortDescription": {"text": "Dangling fetch: POST /payment/api/mail-send (payment/app.js:4711)"}, "fullDescription": {"text": "`payment/app.js:4711` calls `POST /payment/api/mail-send` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/payment/api/mail-send`\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-cc52a1d461bbc9d4", "name": "Dangling fetch: POST /payment/api/mail-send (payment/app.js:4763)", "shortDescription": {"text": "Dangling fetch: POST /payment/api/mail-send (payment/app.js:4763)"}, "fullDescription": {"text": "`payment/app.js:4763` calls `POST /payment/api/mail-send` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/payment/api/mail-send`\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-4756b4c4da7d2088", "name": "Unused endpoint: GET /api/health", "shortDescription": {"text": "Unused endpoint: GET /api/health"}, "fullDescription": {"text": "`server/main.py` declares `GET /api/health` 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}}, {"id": "scanner-7be37a161f300a6f", "name": "Unused endpoint: GET /api/email/diagnose-public", "shortDescription": {"text": "Unused endpoint: GET /api/email/diagnose-public"}, "fullDescription": {"text": "`server/main.py` declares `GET /api/email/diagnose-public` 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}}, {"id": "scanner-3b37265900e79a8a", "name": "Unused endpoint: GET /api/stats", "shortDescription": {"text": "Unused endpoint: GET /api/stats"}, "fullDescription": {"text": "`server/main.py` declares `GET /api/stats` 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}}, {"id": "scanner-ed6f73e5b9264320", "name": "Unused endpoint: GET /api/student/worksheet/this-week", "shortDescription": {"text": "Unused endpoint: GET /api/student/worksheet/this-week"}, "fullDescription": {"text": "`server/main.py` declares `GET /api/student/worksheet/this-week` 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}}, {"id": "scanner-382019ed7b5577c9", "name": "Unused endpoint: GET /api/student/worksheet/history", "shortDescription": {"text": "Unused endpoint: GET /api/student/worksheet/history"}, "fullDescription": {"text": "`server/main.py` declares `GET /api/student/worksheet/history` 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}}, {"id": "scanner-726ac0e38df4f4a6", "name": "Unused endpoint: POST /api/admin/worksheet/run-weekly-now", "shortDescription": {"text": "Unused endpoint: POST /api/admin/worksheet/run-weekly-now"}, "fullDescription": {"text": "`server/main.py` declares `POST /api/admin/worksheet/run-weekly-now` 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}}, {"id": "scanner-58be4324b6041dca", "name": "Unused endpoint: POST /api/admin/weakness/aggregate-now", "shortDescription": {"text": "Unused endpoint: POST /api/admin/weakness/aggregate-now"}, "fullDescription": {"text": "`server/main.py` declares `POST /api/admin/weakness/aggregate-now` 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}}, {"id": "scanner-0dd434b0dbf56bcb", "name": "Unused endpoint: POST /api/admin/anthropic/credit-monitor-now", "shortDescription": {"text": "Unused endpoint: POST /api/admin/anthropic/credit-monitor-now"}, "fullDescription": {"text": "`server/main.py` declares `POST /api/admin/anthropic/credit-monitor-now` 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}}, {"id": "scanner-50d892491a165a66", "name": "Unused endpoint: GET /api/student/weakness-top3", "shortDescription": {"text": "Unused endpoint: GET /api/student/weakness-top3"}, "fullDescription": {"text": "`server/main.py` declares `GET /api/student/weakness-top3` 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}}, {"id": "scanner-6b5528ec213de807", "name": "Unused endpoint: GET /api/student/weakness-progress", "shortDescription": {"text": "Unused endpoint: GET /api/student/weakness-progress"}, "fullDescription": {"text": "`server/main.py` declares `GET /api/student/weakness-progress` 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}}, {"id": "scanner-4f7ed75ff1bdfa39", "name": "Unused endpoint: PATCH /api/student/profile", "shortDescription": {"text": "Unused endpoint: PATCH /api/student/profile"}, "fullDescription": {"text": "`server/main.py` declares `PATCH /api/student/profile` 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}}, {"id": "scanner-87bd1f7a7332bff1", "name": "Unused endpoint: GET /api/student/lesson-prints", "shortDescription": {"text": "Unused endpoint: GET /api/student/lesson-prints"}, "fullDescription": {"text": "`server/main.py` declares `GET /api/student/lesson-prints` 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}}, {"id": "scanner-a1b02f82324fa21e", "name": "Unused endpoint: GET /api/student/lesson-prints/recommended", "shortDescription": {"text": "Unused endpoint: GET /api/student/lesson-prints/recommended"}, "fullDescription": {"text": "`server/main.py` declares `GET /api/student/lesson-prints/recommended` 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}}, {"id": "scanner-6d34c01bb0674834", "name": "Unused endpoint: GET /api/student/admission-likelihood", "shortDescription": {"text": "Unused endpoint: GET /api/student/admission-likelihood"}, "fullDescription": {"text": "`server/main.py` declares `GET /api/student/admission-likelihood` 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}}, {"id": "scanner-c23f87890090253a", "name": "Unused endpoint: GET /api/student/lesson-prints/by-goal", "shortDescription": {"text": "Unused endpoint: GET /api/student/lesson-prints/by-goal"}, "fullDescription": {"text": "`server/main.py` declares `GET /api/student/lesson-prints/by-goal` 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}}, {"id": "scanner-3658aed8ee08c1c5", "name": "Unused endpoint: POST /api/student/lesson-prints/{print_id}/download", "shortDescription": {"text": "Unused endpoint: POST /api/student/lesson-prints/{print_id}/download"}, "fullDescription": {"text": "`server/main.py` declares `POST /api/student/lesson-prints/{print_id}/download` 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}}, {"id": "scanner-113bd47d46686d8f", "name": "Unused endpoint: POST /api/admin/tts/generate", "shortDescription": {"text": "Unused endpoint: POST /api/admin/tts/generate"}, "fullDescription": {"text": "`server/main.py` declares `POST /api/admin/tts/generate` 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}}, {"id": "scanner-5fe4bf76dc6ae512", "name": "Unused endpoint: POST /api/admin/lesson-prints/sync", "shortDescription": {"text": "Unused endpoint: POST /api/admin/lesson-prints/sync"}, "fullDescription": {"text": "`server/main.py` declares `POST /api/admin/lesson-prints/sync` 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}}, {"id": "scanner-44cd5f37c4456511", "name": "Unused endpoint: GET /api/admin/lesson-prints/stats", "shortDescription": {"text": "Unused endpoint: GET /api/admin/lesson-prints/stats"}, "fullDescription": {"text": "`server/main.py` declares `GET /api/admin/lesson-prints/stats` 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}}, {"id": "scanner-80c11132df09e15a", "name": "Unused endpoint: GET /api/admin/weakness-heatmap", "shortDescription": {"text": "Unused endpoint: GET /api/admin/weakness-heatmap"}, "fullDescription": {"text": "`server/main.py` declares `GET /api/admin/weakness-heatmap` 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}}, {"id": "scanner-caebdddf524440ae", "name": "Unused endpoint: POST /api/admin/monitor/auto-rollback", "shortDescription": {"text": "Unused endpoint: POST /api/admin/monitor/auto-rollback"}, "fullDescription": {"text": "`server/main.py` declares `POST /api/admin/monitor/auto-rollback` 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}}, {"id": "scanner-6698c80e0f00cbad", "name": "Unused endpoint: GET /api/admin/monitor/rollback-history", "shortDescription": {"text": "Unused endpoint: GET /api/admin/monitor/rollback-history"}, "fullDescription": {"text": "`server/main.py` declares `GET /api/admin/monitor/rollback-history` 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}}, {"id": "scanner-57af10732fae5821", "name": "Unused endpoint: POST /api/admin/git/apply-patch", "shortDescription": {"text": "Unused endpoint: POST /api/admin/git/apply-patch"}, "fullDescription": {"text": "`server/main.py` declares `POST /api/admin/git/apply-patch` 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}}, {"id": "scanner-b7260b6781e0494f", "name": "Unused endpoint: POST /api/auth/magic-link", "shortDescription": {"text": "Unused endpoint: POST /api/auth/magic-link"}, "fullDescription": {"text": "`server/main.py` declares `POST /api/auth/magic-link` 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}}, {"id": "scanner-cdf715ac9a05b229", "name": "Unused endpoint: POST /api/auth/verify-code", "shortDescription": {"text": "Unused endpoint: POST /api/auth/verify-code"}, "fullDescription": {"text": "`server/main.py` declares `POST /api/auth/verify-code` 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}}, {"id": "scanner-33a5daa01dd022c8", "name": "Unused endpoint: GET /api/auth/verify", "shortDescription": {"text": "Unused endpoint: GET /api/auth/verify"}, "fullDescription": {"text": "`server/main.py` declares `GET /api/auth/verify` 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}}, {"id": "scanner-bc1b63be5d263466", "name": "Unused endpoint: POST /api/admin/login", "shortDescription": {"text": "Unused endpoint: POST /api/admin/login"}, "fullDescription": {"text": "`server/main.py` declares `POST /api/admin/login` 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}}, {"id": "scanner-061e8d7283dae596", "name": "Unused endpoint: GET /api/admin/verify", "shortDescription": {"text": "Unused endpoint: GET /api/admin/verify"}, "fullDescription": {"text": "`server/main.py` declares `GET /api/admin/verify` 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}}, {"id": "scanner-5f7dca04da2aac9e", "name": "Unused endpoint: GET /api/admin/revenue-timeline", "shortDescription": {"text": "Unused endpoint: GET /api/admin/revenue-timeline"}, "fullDescription": {"text": "`server/main.py` declares `GET /api/admin/revenue-timeline` 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}}, {"id": "scanner-722e2bcf1319e8c3", "name": "Unused endpoint: GET /api/admin/analytics", "shortDescription": {"text": "Unused endpoint: GET /api/admin/analytics"}, "fullDescription": {"text": "`server/main.py` declares `GET /api/admin/analytics` 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}}, {"id": "scanner-6f83d1bc700e4b15", "name": "Unused endpoint: POST /api/admin/textbooks/generate-figure", "shortDescription": {"text": "Unused endpoint: POST /api/admin/textbooks/generate-figure"}, "fullDescription": {"text": "`server/main.py` declares `POST /api/admin/textbooks/generate-figure` 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}}, {"id": "scanner-72e6ff27373df39e", "name": "Unused endpoint: POST /api/admin/dalle/generate", "shortDescription": {"text": "Unused endpoint: POST /api/admin/dalle/generate"}, "fullDescription": {"text": "`server/main.py` declares `POST /api/admin/dalle/generate` 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}}, {"id": "scanner-72bdae1d8700cde0", "name": "Unused endpoint: POST /api/ai/messages", "shortDescription": {"text": "Unused endpoint: POST /api/ai/messages"}, "fullDescription": {"text": "`server/main.py` declares `POST /api/ai/messages` 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}}, {"id": "scanner-e5fa0ca214df4f0e", "name": "Unused endpoint: POST /api/admin/stripe/setup-founder-special", "shortDescription": {"text": "Unused endpoint: POST /api/admin/stripe/setup-founder-special"}, "fullDescription": {"text": "`server/main.py` declares `POST /api/admin/stripe/setup-founder-special` 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}}, {"id": "scanner-b4885f469f31a0c8", "name": "Unused endpoint: POST /api/admin/stripe/setup-all-prices", "shortDescription": {"text": "Unused endpoint: POST /api/admin/stripe/setup-all-prices"}, "fullDescription": {"text": "`server/main.py` declares `POST /api/admin/stripe/setup-all-prices` 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}}, {"id": "scanner-45518d2f49fbfd25", "name": "Unused endpoint: GET /api/admin/stripe/check-prices", "shortDescription": {"text": "Unused endpoint: GET /api/admin/stripe/check-prices"}, "fullDescription": {"text": "`server/main.py` declares `GET /api/admin/stripe/check-prices` 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}}, {"id": "scanner-bd2dd09e8c640740", "name": "Unused endpoint: POST /api/admin/stripe/reconcile", "shortDescription": {"text": "Unused endpoint: POST /api/admin/stripe/reconcile"}, "fullDescription": {"text": "`server/main.py` declares `POST /api/admin/stripe/reconcile` 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}}, {"id": "scanner-871dff6ec685743d", "name": "Unused endpoint: POST /api/admin/stripe/backfill-payments", "shortDescription": {"text": "Unused endpoint: POST /api/admin/stripe/backfill-payments"}, "fullDescription": {"text": "`server/main.py` declares `POST /api/admin/stripe/backfill-payments` 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}}, {"id": "scanner-de1349f620fbe7f2", "name": "Unused endpoint: POST /api/admin/stripe/webhook-events-sync", "shortDescription": {"text": "Unused endpoint: POST /api/admin/stripe/webhook-events-sync"}, "fullDescription": {"text": "`server/main.py` declares `POST /api/admin/stripe/webhook-events-sync` 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}}, {"id": "scanner-41782b98eb853bd9", "name": "Unused endpoint: GET /api/admin/stripe/diagnose-orphan-subs", "shortDescription": {"text": "Unused endpoint: GET /api/admin/stripe/diagnose-orphan-subs"}, "fullDescription": {"text": "`server/main.py` declares `GET /api/admin/stripe/diagnose-orphan-subs` 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}}, {"id": "scanner-afe53193e6a2ec27", "name": "Unused endpoint: GET /api/admin/stripe/diagnose-trialing-leftovers", "shortDescription": {"text": "Unused endpoint: GET /api/admin/stripe/diagnose-trialing-leftovers"}, "fullDescription": {"text": "`server/main.py` declares `GET /api/admin/stripe/diagnose-trialing-leftovers` 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}}, {"id": "scanner-20588b846075a25a", "name": "Unused endpoint: POST /api/admin/marketing/send-ig-carousel", "shortDescription": {"text": "Unused endpoint: POST /api/admin/marketing/send-ig-carousel"}, "fullDescription": {"text": "`server/main.py` declares `POST /api/admin/marketing/send-ig-carousel` 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}}, {"id": "scanner-39dff351d5652a78", "name": "Unused endpoint: POST /api/admin/marketing/generate-student-invite", "shortDescription": {"text": "Unused endpoint: POST /api/admin/marketing/generate-student-invite"}, "fullDescription": {"text": "`server/main.py` declares `POST /api/admin/marketing/generate-student-invite` 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}}, {"id": "scanner-d47318aa80181917", "name": "Unused endpoint: GET /api/marketing/verify-invite", "shortDescription": {"text": "Unused endpoint: GET /api/marketing/verify-invite"}, "fullDescription": {"text": "`server/main.py` declares `GET /api/marketing/verify-invite` 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}}, {"id": "scanner-c7f1d39360f70c11", "name": "Unused endpoint: POST /api/admin/marketing/generate-invite-code", "shortDescription": {"text": "Unused endpoint: POST /api/admin/marketing/generate-invite-code"}, "fullDescription": {"text": "`server/main.py` declares `POST /api/admin/marketing/generate-invite-code` 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}}, {"id": "scanner-a7d43efedd4ab7e1", "name": "Unused endpoint: POST /api/admin/marketing/bulk-invite", "shortDescription": {"text": "Unused endpoint: POST /api/admin/marketing/bulk-invite"}, "fullDescription": {"text": "`server/main.py` declares `POST /api/admin/marketing/bulk-invite` 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}}, {"id": "scanner-8cae51f85f08226a", "name": "Unused endpoint: POST /api/admin/stripe/setup-threads6k-coupon", "shortDescription": {"text": "Unused endpoint: POST /api/admin/stripe/setup-threads6k-coupon"}, "fullDescription": {"text": "`server/main.py` declares `POST /api/admin/stripe/setup-threads6k-coupon` 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}}, {"id": "scanner-73a4b1a072e356ae", "name": "Unused endpoint: POST /api/admin/marketing/send-link-email", "shortDescription": {"text": "Unused endpoint: POST /api/admin/marketing/send-link-email"}, "fullDescription": {"text": "`server/main.py` declares `POST /api/admin/marketing/send-link-email` 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}}, {"id": "scanner-25d7d960ce9e81f8", "name": "Unused endpoint: GET /api/admin/marketing/custom-gpt-announcement-templates", "shortDescription": {"text": "Unused endpoint: GET /api/admin/marketing/custom-gpt-announcement-templates"}, "fullDescription": {"text": "`server/main.py` declares `GET /api/admin/marketing/custom-gpt-announcement-templates` 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}}, {"id": "scanner-2e7ac175b4605df8", "name": "Unused endpoint: GET /api/admin/marketing/custom-gpt-funnel-specs", "shortDescription": {"text": "Unused endpoint: GET /api/admin/marketing/custom-gpt-funnel-specs"}, "fullDescription": {"text": "`server/main.py` declares `GET /api/admin/marketing/custom-gpt-funnel-specs` 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/19515"}, "properties": {"repository": "shock11090304-a11y/ai-juku-system", "repoUrl": "https://github.com/shock11090304-a11y/ai-juku-system", "branch": "main"}, "results": [{"ruleId": "scanner-110e5669a8cfc725", "level": "note", "message": {"text": "Possibly dead Python function: do_GET"}, "properties": {"repobilityId": "2d943bb45e4f13bd", "scanner": "scanner-primary", "fingerprint": "110e5669a8cfc725", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "api/admin-charge-month-end-preview.py:97"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-8d281edcc61a5d19", "level": "note", "message": {"text": "Possibly dead Python function: do_POST"}, "properties": {"repobilityId": "53357410ca9379a9", "scanner": "scanner-primary", "fingerprint": "8d281edcc61a5d19", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "api/stripe-webhook.py:487"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-23d9d5c1fbda4aa9", "level": "note", "message": {"text": "Possibly dead Python function: do_POST"}, "properties": {"repobilityId": "53357410ca9379a9", "scanner": "scanner-primary", "fingerprint": "23d9d5c1fbda4aa9", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "api/admin-charge-month-end-execute.py:166"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-25cbf011e12fb8cc", "level": "note", "message": {"text": "Possibly dead Python function: do_GET"}, "properties": {"repobilityId": "2d943bb45e4f13bd", "scanner": "scanner-primary", "fingerprint": "25cbf011e12fb8cc", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "api/registered-customers.py:81"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-212a7c97fdd40581", "level": "note", "message": {"text": "Possibly dead Python function: do_POST"}, "properties": {"repobilityId": "53357410ca9379a9", "scanner": "scanner-primary", "fingerprint": "212a7c97fdd40581", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "api/mail-send.py:132"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-fd862466e270f02d", "level": "note", "message": {"text": "Possibly dead Python function: do_GET"}, "properties": {"repobilityId": "2d943bb45e4f13bd", "scanner": "scanner-primary", "fingerprint": "fd862466e270f02d", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "api/mail-send.py:224"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-15aeafa345264d62", "level": "note", "message": {"text": "Possibly dead Python function: do_POST"}, "properties": {"repobilityId": "53357410ca9379a9", "scanner": "scanner-primary", "fingerprint": "15aeafa345264d62", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "api/admin-registration-cancel.py:101"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-4c36eb1b78308be0", "level": "note", "message": {"text": "Possibly dead Python function: do_POST"}, "properties": {"repobilityId": "53357410ca9379a9", "scanner": "scanner-primary", "fingerprint": "4c36eb1b78308be0", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "api/register-subscribe.py:331"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-746ae7a77c2b5db7", "level": "note", "message": {"text": "Possibly dead Python function: do_OPTIONS"}, "properties": {"repobilityId": "36491d1f4fa41aef", "scanner": "scanner-primary", "fingerprint": "746ae7a77c2b5db7", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "api/register-subscribe.py:490"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-bc77d677768dc375", "level": "note", "message": {"text": "Possibly dead Python function: do_GET"}, "properties": {"repobilityId": "2d943bb45e4f13bd", "scanner": "scanner-primary", "fingerprint": "bc77d677768dc375", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "api/admin-charge-history.py:115"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-3fccced44f7a6ca7", "level": "note", "message": {"text": "Possibly dead Python function: do_POST"}, "properties": {"repobilityId": "53357410ca9379a9", "scanner": "scanner-primary", "fingerprint": "3fccced44f7a6ca7", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "api/past-due-invoice.py:280"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-09d0259700d52902", "level": "note", "message": {"text": "Possibly dead Python function: do_GET"}, "properties": {"repobilityId": "2d943bb45e4f13bd", "scanner": "scanner-primary", "fingerprint": "09d0259700d52902", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "api/chat.py:230"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-f21ffdb59c2f2b08", "level": "note", "message": {"text": "Possibly dead Python function: do_POST"}, "properties": {"repobilityId": "53357410ca9379a9", "scanner": "scanner-primary", "fingerprint": "f21ffdb59c2f2b08", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "api/chat.py:287"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-abf3e32658a3fdf0", "level": "note", "message": {"text": "Possibly dead Python function: do_POST"}, "properties": {"repobilityId": "53357410ca9379a9", "scanner": "scanner-primary", "fingerprint": "abf3e32658a3fdf0", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "api/admin-charge-reconcile.py:130"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-06fff2f3d314a6fb", "level": "note", "message": {"text": "Possibly dead Python function: do_GET"}, "properties": {"repobilityId": "2d943bb45e4f13bd", "scanner": "scanner-primary", "fingerprint": "06fff2f3d314a6fb", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "api/stripe-charges.py:119"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-4ff0a57e389e5abf", "level": "note", "message": {"text": "Possibly dead Python function: first_page"}, "properties": {"repobilityId": "269e08763fd33c81", "scanner": "scanner-primary", "fingerprint": "4ff0a57e389e5abf", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "scripts/generate_coaching_guide_v6.py:706"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-130bab8be88d2126", "level": "note", "message": {"text": "Possibly dead Python function: later_page"}, "properties": {"repobilityId": "96197140b519726a", "scanner": "scanner-primary", "fingerprint": "130bab8be88d2126", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "scripts/generate_coaching_guide_v6.py:719"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-efac71d61daa78bf", "level": "note", "message": {"text": "Possibly dead Python function: wrap"}, "properties": {"repobilityId": "67bfdfc1acedae4b", "scanner": "scanner-primary", "fingerprint": "efac71d61daa78bf", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "scripts/generate_coaching_guide_v6.py:800"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-c87b8da6937b0ece", "level": "note", "message": {"text": "Possibly dead Python function: draw"}, "properties": {"repobilityId": "53ecb21dcbad2db9", "scanner": "scanner-primary", "fingerprint": "c87b8da6937b0ece", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "scripts/generate_coaching_guide_v6.py:801"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-d93828f930cc4c64", "level": "note", "message": {"text": "Possibly dead Python function: first_page"}, "properties": {"repobilityId": "269e08763fd33c81", "scanner": "scanner-primary", "fingerprint": "d93828f930cc4c64", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "scripts/generate_coaching_guide_v2.py:301"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-cf00db32a52cda97", "level": "note", "message": {"text": "Possibly dead Python function: later_page"}, "properties": {"repobilityId": "96197140b519726a", "scanner": "scanner-primary", "fingerprint": "cf00db32a52cda97", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "scripts/generate_coaching_guide_v2.py:314"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-83a0775e463d8966", "level": "note", "message": {"text": "Possibly dead Python function: wrap"}, "properties": {"repobilityId": "67bfdfc1acedae4b", "scanner": "scanner-primary", "fingerprint": "83a0775e463d8966", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "scripts/generate_coaching_guide_v2.py:395"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-4cbef7e84b23d276", "level": "note", "message": {"text": "Possibly dead Python function: draw"}, "properties": {"repobilityId": "53ecb21dcbad2db9", "scanner": "scanner-primary", "fingerprint": "4cbef7e84b23d276", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "scripts/generate_coaching_guide_v2.py:396"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-9a102387a8aa793a", "level": "note", "message": {"text": "Possibly dead Python function: first_page"}, "properties": {"repobilityId": "269e08763fd33c81", "scanner": "scanner-primary", "fingerprint": "9a102387a8aa793a", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "scripts/generate_coaching_guide_v3.py:697"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-658ee834c952f26d", "level": "note", "message": {"text": "Possibly dead Python function: later_page"}, "properties": {"repobilityId": "96197140b519726a", "scanner": "scanner-primary", "fingerprint": "658ee834c952f26d", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "scripts/generate_coaching_guide_v3.py:710"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-7a75e13df10f69c7", "level": "note", "message": {"text": "Possibly dead Python function: wrap"}, "properties": {"repobilityId": "67bfdfc1acedae4b", "scanner": "scanner-primary", "fingerprint": "7a75e13df10f69c7", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "scripts/generate_coaching_guide_v3.py:791"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-a3f50cb32478e1b2", "level": "note", "message": {"text": "Possibly dead Python function: draw"}, "properties": {"repobilityId": "53ecb21dcbad2db9", "scanner": "scanner-primary", "fingerprint": "a3f50cb32478e1b2", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "scripts/generate_coaching_guide_v3.py:792"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-e96baad33659c3d7", "level": "note", "message": {"text": "Possibly dead Python function: first_page"}, "properties": {"repobilityId": "269e08763fd33c81", "scanner": "scanner-primary", "fingerprint": "e96baad33659c3d7", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "scripts/generate_coaching_guide_v4.py:706"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-a23bf179713d6355", "level": "note", "message": {"text": "Possibly dead Python function: later_page"}, "properties": {"repobilityId": "96197140b519726a", "scanner": "scanner-primary", "fingerprint": "a23bf179713d6355", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "scripts/generate_coaching_guide_v4.py:719"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-828f0a5231ebcc13", "level": "note", "message": {"text": "Possibly dead Python function: wrap"}, "properties": {"repobilityId": "67bfdfc1acedae4b", "scanner": "scanner-primary", "fingerprint": "828f0a5231ebcc13", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "scripts/generate_coaching_guide_v4.py:800"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-a3cedac953e9fdc5", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 textbook-generator.js:552"}, "properties": {"repobilityId": "d48ebc099a15d639", "scanner": "scanner-primary", "fingerprint": "a3cedac953e9fdc5", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-2316b86af6082dce", "level": "note", "message": {"text": "Icon-only button without accessible name \u2014 mypage.js:2137"}, "properties": {"repobilityId": "36bfc940e8f3dc05", "scanner": "scanner-primary", "fingerprint": "2316b86af6082dce", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.button.no-label"]}}, {"ruleId": "scanner-525673425ab9bca9", "level": "note", "message": {"text": "Icon-only button without accessible name \u2014 ceo.js:2047"}, "properties": {"repobilityId": "7b15987742b1905d", "scanner": "scanner-primary", "fingerprint": "525673425ab9bca9", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.button.no-label"]}}, {"ruleId": "scanner-ce5fca0946ee4fc7", "level": "note", "message": {"text": "Icon-only button without accessible name \u2014 pwa.js:46"}, "properties": {"repobilityId": "057841075d3d850f", "scanner": "scanner-primary", "fingerprint": "ce5fca0946ee4fc7", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.button.no-label"]}}, {"ruleId": "scanner-f87ad48561e2cbfa", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 english-exam.js:1676"}, "properties": {"repobilityId": "0f7a3c66d365ccfd", "scanner": "scanner-primary", "fingerprint": "f87ad48561e2cbfa", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-bffa3ad9f3479eb0", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 app.js:3892"}, "properties": {"repobilityId": "59748ac0372fad2e", "scanner": "scanner-primary", "fingerprint": "bffa3ad9f3479eb0", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-6be5cc61f85ade12", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 personalized-outreach.js:50"}, "properties": {"repobilityId": "5a8842ca0757f5d2", "scanner": "scanner-primary", "fingerprint": "6be5cc61f85ade12", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-9b1eb539ebdccaf8", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 payment/app.js:974"}, "properties": {"repobilityId": "3be7dbe9965b6891", "scanner": "scanner-primary", "fingerprint": "9b1eb539ebdccaf8", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-6367dcf49f187583", "level": "warning", "message": {"text": "Privileged port 20 in use"}, "properties": {"repobilityId": "a59f3e53d617e0f8", "scanner": "scanner-primary", "fingerprint": "6367dcf49f187583", "layer": "network", "severity": "medium", "confidence": 1.0, "tags": ["security", "ports"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "render.yaml"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-3fab594c24034be9", "level": "warning", "message": {"text": "Privileged port 11 in use"}, "properties": {"repobilityId": "5b3038c67fabb4c8", "scanner": "scanner-primary", "fingerprint": "3fab594c24034be9", "layer": "network", "severity": "medium", "confidence": 1.0, "tags": ["security", "ports"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "render.yaml"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-aa5acaa49eb8315b", "level": "note", "message": {"text": "Containers defined but no K8s/orchestration manifest found"}, "properties": {"repobilityId": "b230ea9b68736081", "scanner": "scanner-primary", "fingerprint": "aa5acaa49eb8315b", "layer": "hardware", "severity": "low", "confidence": 1.0, "tags": ["coverage", "deployment"]}}, {"ruleId": "scanner-9710c8d059e53154", "level": "none", "message": {"text": "No frontend routes/components detected"}, "properties": {"repobilityId": "44ca61485762e494", "scanner": "scanner-primary", "fingerprint": "9710c8d059e53154", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["coverage"]}}, {"ruleId": "scanner-03102b83831bdae9", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in textbook-generator.js:87"}, "properties": {"repobilityId": "c86cc9070f0a1c3e", "scanner": "scanner-primary", "fingerprint": "03102b83831bdae9", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "textbook-generator.js"}, "region": {"startLine": 87}}}]}, {"ruleId": "scanner-c9dea5bf93fd0ddc", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in university-exam.html:318"}, "properties": {"repobilityId": "efd842fe7ba2a2af", "scanner": "scanner-primary", "fingerprint": "c9dea5bf93fd0ddc", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "university-exam.html"}, "region": {"startLine": 318}}}]}, {"ruleId": "scanner-49baaf6eaf5b9f49", "level": "warning", "message": {"text": "Insecure pattern 'insert_adjacent_html' in university-exam.html:916"}, "properties": {"repobilityId": "633a678713b91f30", "scanner": "scanner-primary", "fingerprint": "49baaf6eaf5b9f49", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "insert_adjacent_html"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "university-exam.html"}, "region": {"startLine": 916}}}]}, {"ruleId": "scanner-077c3575d974e077", "level": "note", "message": {"text": "Insecure pattern 'document_write' in mypage.js:3895"}, "properties": {"repobilityId": "2fafd0200063a699", "scanner": "scanner-primary", "fingerprint": "077c3575d974e077", "layer": "security", "severity": "low", "confidence": 1.0, "tags": ["owasp", "document_write"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "mypage.js"}, "region": {"startLine": 3895}}}]}, {"ruleId": "scanner-82ebb9dcb64fdeb4", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in mypage.js:294"}, "properties": {"repobilityId": "d6ada9c6fa1f9dae", "scanner": "scanner-primary", "fingerprint": "82ebb9dcb64fdeb4", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "mypage.js"}, "region": {"startLine": 294}}}]}, {"ruleId": "scanner-54c19eebaf5dce58", "level": "warning", "message": {"text": "Insecure pattern 'local_storage_auth_token' in frontend-error-monitor.js:26"}, "properties": {"repobilityId": "bddc8e88e027e621", "scanner": "scanner-primary", "fingerprint": "54c19eebaf5dce58", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "local_storage_auth_token"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "frontend-error-monitor.js"}, "region": {"startLine": 26}}}]}, {"ruleId": "scanner-eb3b25b69e6d2017", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in exam-prep.js:83"}, "properties": {"repobilityId": "c9ed4212b98a4e5c", "scanner": "scanner-primary", "fingerprint": "eb3b25b69e6d2017", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "exam-prep.js"}, "region": {"startLine": 83}}}]}, {"ruleId": "scanner-18e8fa1cd2dd0304", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in vocab.js:104"}, "properties": {"repobilityId": "25eb47b19b6b39f8", "scanner": "scanner-primary", "fingerprint": "18e8fa1cd2dd0304", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "vocab.js"}, "region": {"startLine": 104}}}]}, {"ruleId": "scanner-71cc38a6f0cee3c7", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in social-proof.js:39"}, "properties": {"repobilityId": "159c2bc53b7e8145", "scanner": "scanner-primary", "fingerprint": "71cc38a6f0cee3c7", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "social-proof.js"}, "region": {"startLine": 39}}}]}, {"ruleId": "scanner-731059368882556e", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in checkout.js:151"}, "properties": {"repobilityId": "90804d1cbc254ec5", "scanner": "scanner-primary", "fingerprint": "731059368882556e", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "checkout.js"}, "region": {"startLine": 151}}}]}, {"ruleId": "scanner-df5171de0c236fe2", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in alerts.js:71"}, "properties": {"repobilityId": "d137c13f627579a7", "scanner": "scanner-primary", "fingerprint": "df5171de0c236fe2", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "alerts.js"}, "region": {"startLine": 71}}}]}, {"ruleId": "scanner-4f31abef056065ec", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in learning-brain.js:312"}, "properties": {"repobilityId": "cbc76c9bbb92d956", "scanner": "scanner-primary", "fingerprint": "4f31abef056065ec", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "learning-brain.js"}, "region": {"startLine": 312}}}]}, {"ruleId": "scanner-1da56f94b5617050", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in student-upgrade.html:24"}, "properties": {"repobilityId": "8333efb0c6a9c4c7", "scanner": "scanner-primary", "fingerprint": "1da56f94b5617050", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "student-upgrade.html"}, "region": {"startLine": 24}}}]}, {"ruleId": "scanner-4457b4c9764d2c8f", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in support.html:238"}, "properties": {"repobilityId": "5930b34354ed0eb3", "scanner": "scanner-primary", "fingerprint": "4457b4c9764d2c8f", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "support.html"}, "region": {"startLine": 238}}}]}, {"ruleId": "scanner-51c7a95b44f66314", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in ceo.js:156"}, "properties": {"repobilityId": "02dcd1fe35f75cbb", "scanner": "scanner-primary", "fingerprint": "51c7a95b44f66314", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "ceo.js"}, "region": {"startLine": 156}}}]}, {"ruleId": "scanner-c524c4f92f00d25d", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in lp.html:1102"}, "properties": {"repobilityId": "ac4eda95d5fa874c", "scanner": "scanner-primary", "fingerprint": "c524c4f92f00d25d", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "lp.html"}, "region": {"startLine": 1102}}}]}, {"ruleId": "scanner-ff1be268bed52301", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in material-scan.html:106"}, "properties": {"repobilityId": "5859086dfa413e8e", "scanner": "scanner-primary", "fingerprint": "ff1be268bed52301", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "material-scan.html"}, "region": {"startLine": 106}}}]}, {"ruleId": "scanner-e34885655fd8a78b", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in referral-program.js:128"}, "properties": {"repobilityId": "a4c5a7604de6ebcd", "scanner": "scanner-primary", "fingerprint": "e34885655fd8a78b", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "referral-program.js"}, "region": {"startLine": 128}}}]}, {"ruleId": "scanner-730cfd6d42c74a89", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in article.html:124"}, "properties": {"repobilityId": "82d2fd056b716294", "scanner": "scanner-primary", "fingerprint": "730cfd6d42c74a89", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "article.html"}, "region": {"startLine": 124}}}]}, {"ruleId": "scanner-ab9f9542d8ae98e0", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in pwa.js:37"}, "properties": {"repobilityId": "0a8cc0c01f9da61a", "scanner": "scanner-primary", "fingerprint": "ab9f9542d8ae98e0", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "pwa.js"}, "region": {"startLine": 37}}}]}, {"ruleId": "scanner-7fac0c1cce918005", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in checkout-success.html:302"}, "properties": {"repobilityId": "66bb18cdac73dee5", "scanner": "scanner-primary", "fingerprint": "7fac0c1cce918005", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "checkout-success.html"}, "region": {"startLine": 302}}}]}, {"ruleId": "scanner-d895461a6f8a2009", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in content-studio.js:44"}, "properties": {"repobilityId": "4e0aa53a38bc8c8b", "scanner": "scanner-primary", "fingerprint": "d895461a6f8a2009", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "content-studio.js"}, "region": {"startLine": 44}}}]}, {"ruleId": "scanner-d3fa5d5e32195093", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in login.html:287"}, "properties": {"repobilityId": "617b51c994b02988", "scanner": "scanner-primary", "fingerprint": "d3fa5d5e32195093", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "login.html"}, "region": {"startLine": 287}}}]}, {"ruleId": "scanner-f4616a239b244ea3", "level": "warning", "message": {"text": "Insecure pattern 'local_storage_auth_token' in login.html:366"}, "properties": {"repobilityId": "eafd762f754dc2fc", "scanner": "scanner-primary", "fingerprint": "f4616a239b244ea3", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "local_storage_auth_token"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "login.html"}, "region": {"startLine": 366}}}]}, {"ruleId": "scanner-d701e6b4fe48ff9c", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in index.html:1528"}, "properties": {"repobilityId": "f91708437a3a5445", "scanner": "scanner-primary", "fingerprint": "d701e6b4fe48ff9c", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "index.html"}, "region": {"startLine": 1528}}}]}, {"ruleId": "scanner-4cfdde450fa6f7f5", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in checkout.html:328"}, "properties": {"repobilityId": "ba2b0af7d0545273", "scanner": "scanner-primary", "fingerprint": "4cfdde450fa6f7f5", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "checkout.html"}, "region": {"startLine": 328}}}]}, {"ruleId": "scanner-ee85e254324efe5e", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in english-exam.js:901"}, "properties": {"repobilityId": "6a62412cabf0f289", "scanner": "scanner-primary", "fingerprint": "ee85e254324efe5e", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "english-exam.js"}, "region": {"startLine": 901}}}]}, {"ruleId": "scanner-2d342a5c3d0378da", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in exam-prep.html:113"}, "properties": {"repobilityId": "1c934a913d810ad4", "scanner": "scanner-primary", "fingerprint": "2d342a5c3d0378da", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "exam-prep.html"}, "region": {"startLine": 113}}}]}, {"ruleId": "scanner-ecf9ec52f1f4c513", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in safety-school.js:166"}, "properties": {"repobilityId": "45fbb70f4de11f1b", "scanner": "scanner-primary", "fingerprint": "ecf9ec52f1f4c513", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "safety-school.js"}, "region": {"startLine": 166}}}]}, {"ruleId": "scanner-1ee3de2146df36e9", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in quick-start.js:196"}, "properties": {"repobilityId": "6800db913a51ac2d", "scanner": "scanner-primary", "fingerprint": "1ee3de2146df36e9", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "quick-start.js"}, "region": {"startLine": 196}}}]}, {"ruleId": "scanner-b0c83a37d5a8372d", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in ai-tutor-photo.html:147"}, "properties": {"repobilityId": "e4edbf19c569966b", "scanner": "scanner-primary", "fingerprint": "b0c83a37d5a8372d", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "ai-tutor-photo.html"}, "region": {"startLine": 147}}}]}, {"ruleId": "scanner-137b16e34b394143", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in mock-exam.js:24"}, "properties": {"repobilityId": "a3084fff689c98d7", "scanner": "scanner-primary", "fingerprint": "137b16e34b394143", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "mock-exam.js"}, "region": {"startLine": 24}}}]}, {"ruleId": "scanner-b0c748e336ec07b8", "level": "note", "message": {"text": "Insecure pattern 'document_write' in mypage.html:1765"}, "properties": {"repobilityId": "d49f6c61e22edbb5", "scanner": "scanner-primary", "fingerprint": "b0c748e336ec07b8", "layer": "security", "severity": "low", "confidence": 1.0, "tags": ["owasp", "document_write"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "mypage.html"}, "region": {"startLine": 1765}}}]}, {"ruleId": "scanner-a97838ca5f5838fd", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in mypage.html:203"}, "properties": {"repobilityId": "4f475193f388007f", "scanner": "scanner-primary", "fingerprint": "a97838ca5f5838fd", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "mypage.html"}, "region": {"startLine": 203}}}]}, {"ruleId": "scanner-0fe10ec55bbaefd1", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in admin-only.js:32"}, "properties": {"repobilityId": "b16d1381c2f65c88", "scanner": "scanner-primary", "fingerprint": "0fe10ec55bbaefd1", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "admin-only.js"}, "region": {"startLine": 32}}}]}, {"ruleId": "scanner-05451b3fbea4c3bc", "level": "note", "message": {"text": "Insecure pattern 'document_write' in app.js:8953"}, "properties": {"repobilityId": "b744691871c7b3b1", "scanner": "scanner-primary", "fingerprint": "05451b3fbea4c3bc", "layer": "security", "severity": "low", "confidence": 1.0, "tags": ["owasp", "document_write"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "app.js"}, "region": {"startLine": 8953}}}]}, {"ruleId": "scanner-ccd6de39bca78694", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in app.js:53"}, "properties": {"repobilityId": "b6b0c8b85ab66ded", "scanner": "scanner-primary", "fingerprint": "ccd6de39bca78694", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "app.js"}, "region": {"startLine": 53}}}]}, {"ruleId": "scanner-5a515b1c71fb2350", "level": "warning", "message": {"text": "Insecure pattern 'direct_outerhtml_assignment' in app.js:8069"}, "properties": {"repobilityId": "253f788e6fd6e1f1", "scanner": "scanner-primary", "fingerprint": "5a515b1c71fb2350", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_outerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "app.js"}, "region": {"startLine": 8069}}}]}, {"ruleId": "scanner-488253e067886e41", "level": "warning", "message": {"text": "Insecure pattern 'local_storage_auth_token' in app.js:788"}, "properties": {"repobilityId": "b118f202acb2b6f3", "scanner": "scanner-primary", "fingerprint": "488253e067886e41", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "local_storage_auth_token"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "app.js"}, "region": {"startLine": 788}}}]}, {"ruleId": "scanner-aaea532f150bf6b3", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in ceo.html:1019"}, "properties": {"repobilityId": "af481bab29bc0832", "scanner": "scanner-primary", "fingerprint": "aaea532f150bf6b3", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "ceo.html"}, "region": {"startLine": 1019}}}]}, {"ruleId": "scanner-0ad6b4566223b8fb", "level": "warning", "message": {"text": "Insecure pattern 'direct_outerhtml_assignment' in ceo.html:8403"}, "properties": {"repobilityId": "d5a43957bc529961", "scanner": "scanner-primary", "fingerprint": "0ad6b4566223b8fb", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_outerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "ceo.html"}, "region": {"startLine": 8403}}}]}, {"ruleId": "scanner-dabc6163f83530c0", "level": "warning", "message": {"text": "Insecure pattern 'insert_adjacent_html' in ceo.html:4209"}, "properties": {"repobilityId": "ae352b2ad5624fe9", "scanner": "scanner-primary", "fingerprint": "dabc6163f83530c0", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "insert_adjacent_html"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "ceo.html"}, "region": {"startLine": 4209}}}]}, {"ruleId": "scanner-69cfe63c7f32c171", "level": "warning", "message": {"text": "Insecure pattern 'local_storage_auth_token' in ceo.html:7481"}, "properties": {"repobilityId": "6a709358a357b04a", "scanner": "scanner-primary", "fingerprint": "69cfe63c7f32c171", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "local_storage_auth_token"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "ceo.html"}, "region": {"startLine": 7481}}}]}, {"ruleId": "scanner-718e5b2d3647b135", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in auth.html:150"}, "properties": {"repobilityId": "f819e078accb6fef", "scanner": "scanner-primary", "fingerprint": "718e5b2d3647b135", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "auth.html"}, "region": {"startLine": 150}}}]}, {"ruleId": "scanner-bbbd54773f28966a", "level": "warning", "message": {"text": "Insecure pattern 'local_storage_auth_token' in auth.html:241"}, "properties": {"repobilityId": "31c37aa70fe6fe26", "scanner": "scanner-primary", "fingerprint": "bbbd54773f28966a", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "local_storage_auth_token"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "auth.html"}, "region": {"startLine": 241}}}]}, {"ruleId": "scanner-cbf8d39634755d70", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in demo-features.js:325"}, "properties": {"repobilityId": "73446cb8ab6f622e", "scanner": "scanner-primary", "fingerprint": "cbf8d39634755d70", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "demo-features.js"}, "region": {"startLine": 325}}}]}, {"ruleId": "scanner-3d85c8110d2f4055", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in instagram-cta.html:201"}, "properties": {"repobilityId": "8f4e09dfbcc5bc61", "scanner": "scanner-primary", "fingerprint": "3d85c8110d2f4055", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "instagram-cta.html"}, "region": {"startLine": 201}}}]}, {"ruleId": "scanner-5645b8134e586f33", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in blog.html:136"}, "properties": {"repobilityId": "6e3e93af935dd1c7", "scanner": "scanner-primary", "fingerprint": "5645b8134e586f33", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "blog.html"}, "region": {"startLine": 136}}}]}, {"ruleId": "scanner-6e37ec924399b67d", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in referral.html:252"}, "properties": {"repobilityId": "782265f556aa895b", "scanner": "scanner-primary", "fingerprint": "6e37ec924399b67d", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "referral.html"}, "region": {"startLine": 252}}}]}, {"ruleId": "scanner-3ee5cf6a00a28dd4", "level": "warning", "message": {"text": "Insecure pattern 'local_storage_auth_token' in analytics.js:33"}, "properties": {"repobilityId": "806cf19d42b48514", "scanner": "scanner-primary", "fingerprint": "3ee5cf6a00a28dd4", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "local_storage_auth_token"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "analytics.js"}, "region": {"startLine": 33}}}]}, {"ruleId": "scanner-59f8f549f25d6be4", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in video-ads.js:59"}, "properties": {"repobilityId": "f2e39a4ea3f03328", "scanner": "scanner-primary", "fingerprint": "59f8f549f25d6be4", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "video-ads.js"}, "region": {"startLine": 59}}}]}, {"ruleId": "scanner-c20a9d48294bc9df", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in success-stories.js:199"}, "properties": {"repobilityId": "95a0279a1b4637e7", "scanner": "scanner-primary", "fingerprint": "c20a9d48294bc9df", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "success-stories.js"}, "region": {"startLine": 199}}}]}, {"ruleId": "scanner-e7f36fa4d6c93a3d", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in personalized-outreach.js:292"}, "properties": {"repobilityId": "b2f58b753df07de6", "scanner": "scanner-primary", "fingerprint": "e7f36fa4d6c93a3d", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "personalized-outreach.js"}, "region": {"startLine": 292}}}]}, {"ruleId": "scanner-8f45462533847191", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in dojo-drill.html:289"}, "properties": {"repobilityId": "52e784359fe20d9c", "scanner": "scanner-primary", "fingerprint": "8f45462533847191", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "dojo-drill.html"}, "region": {"startLine": 289}}}]}, {"ruleId": "scanner-7ffcabf0e955fd37", "level": "warning", "message": {"text": "Insecure pattern 'cors_wildcard' in api/register-subscribe.py:493"}, "properties": {"repobilityId": "8493a3d682b8745b", "scanner": "scanner-primary", "fingerprint": "7ffcabf0e955fd37", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "cors_wildcard"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "api/register-subscribe.py"}, "region": {"startLine": 493}}}]}, {"ruleId": "scanner-0927cedc46de0793", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in payment/chat.html:318"}, "properties": {"repobilityId": "ae8cd729494aeee0", "scanner": "scanner-primary", "fingerprint": "0927cedc46de0793", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "payment/chat.html"}, "region": {"startLine": 318}}}]}, {"ruleId": "scanner-4dedae542f038c77", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in payment/app.js:133"}, "properties": {"repobilityId": "22ec1e120c31b762", "scanner": "scanner-primary", "fingerprint": "4dedae542f038c77", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "payment/app.js"}, "region": {"startLine": 133}}}]}, {"ruleId": "scanner-fc1dc18526a4f027", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in payment/register.html:442"}, "properties": {"repobilityId": "7a95b91c4d2232f9", "scanner": "scanner-primary", "fingerprint": "fc1dc18526a4f027", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "payment/register.html"}, "region": {"startLine": 442}}}]}, {"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-4601e3ad3bb28677", "level": "warning", "message": {"text": "No CI/CD pipelines detected"}, "properties": {"repobilityId": "c3ee439bce2bc51e", "scanner": "scanner-primary", "fingerprint": "4601e3ad3bb28677", "layer": "cicd", "severity": "medium", "confidence": 1.0, "tags": ["coverage"]}}, {"ruleId": "scanner-53c6e10d2c7a4e9c", "level": "note", "message": {"text": "Very large file: textbook-generator.js (1528 lines)"}, "properties": {"repobilityId": "87b88c63da8a69fe", "scanner": "scanner-primary", "fingerprint": "53c6e10d2c7a4e9c", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-8cfa6674129140af", "level": "note", "message": {"text": "Very large file: mypage.js (5173 lines)"}, "properties": {"repobilityId": "8a3ae670603fd280", "scanner": "scanner-primary", "fingerprint": "8cfa6674129140af", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-27e7356504b62e65", "level": "note", "message": {"text": "Very large file: ceo.js (2385 lines)"}, "properties": {"repobilityId": "2f3cbc56f27521fc", "scanner": "scanner-primary", "fingerprint": "27e7356504b62e65", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-ab6ee30244b17341", "level": "note", "message": {"text": "Very large file: english-exam.js (5524 lines)"}, "properties": {"repobilityId": "0bbe5fa848c997ba", "scanner": "scanner-primary", "fingerprint": "ab6ee30244b17341", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-a97a963d0fab52e4", "level": "note", "message": {"text": "Very large file: app.js (10426 lines)"}, "properties": {"repobilityId": "aa2136e88ad2315e", "scanner": "scanner-primary", "fingerprint": "a97a963d0fab52e4", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-c041653820f6b36b", "level": "note", "message": {"text": "Very large file: scripts/generate_coaching_guide_v6.py (2554 lines)"}, "properties": {"repobilityId": "626df3d5ea0a5d3b", "scanner": "scanner-primary", "fingerprint": "c041653820f6b36b", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-6759d3915ea8eed5", "level": "note", "message": {"text": "Very large file: scripts/generate_coaching_guide_v2.py (1246 lines)"}, "properties": {"repobilityId": "03779c291fd3bcdf", "scanner": "scanner-primary", "fingerprint": "6759d3915ea8eed5", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-7c24111165f20a93", "level": "note", "message": {"text": "Very large file: scripts/generate_coaching_guide_v3.py (2055 lines)"}, "properties": {"repobilityId": "a51a2895c055ffe9", "scanner": "scanner-primary", "fingerprint": "7c24111165f20a93", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-de4fcea5fae33bfe", "level": "note", "message": {"text": "Very large file: scripts/generate_coaching_guide_v4.py (2729 lines)"}, "properties": {"repobilityId": "e6f56ca09ad09f84", "scanner": "scanner-primary", "fingerprint": "de4fcea5fae33bfe", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-33d0e365b41d8317", "level": "note", "message": {"text": "Very large file: payment/app.js (5953 lines)"}, "properties": {"repobilityId": "001f087e4e9122fa", "scanner": "scanner-primary", "fingerprint": "33d0e365b41d8317", "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": "6d5a7e8d3778babe", "scanner": "scanner-primary", "fingerprint": "141b30a41e03817b", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["license", "repo-hardening", "generated-repo-pattern"]}}, {"ruleId": "scanner-01f96f71d9907a8c", "level": "note", "message": {"text": "README lacks setup or run instructions"}, "properties": {"repobilityId": "91846e80d3de10af", "scanner": "scanner-primary", "fingerprint": "01f96f71d9907a8c", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["docs", "readme", "repo-hardening", "generated-repo-pattern"]}}, {"ruleId": "scanner-3ab5d313dda8e5f9", "level": "note", "message": {"text": "Debug logging residue appears in source files"}, "properties": {"repobilityId": "768aec338d4302d4", "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": "ed68538fa68df1c8", "scanner": "scanner-primary", "fingerprint": "72b2a6250083a784", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["placeholder", "mock-data", "incomplete", "generated-repo-pattern"]}}, {"ruleId": "scanner-9d79c4077342a7d0", "level": "warning", "message": {"text": "Runtime service client appears to use placeholder configuration"}, "properties": {"repobilityId": "29a9ffd87c51e283", "scanner": "scanner-primary", "fingerprint": "9d79c4077342a7d0", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["placeholder", "runtime-config", "service-client", "generated-repo-pattern"]}}, {"ruleId": "scanner-2d0c7b7ab8f8aacf", "level": "warning", "message": {"text": "Critical user flow still appears backed by mock or placeholder data"}, "properties": {"repobilityId": "a4016b7a33ab2d41", "scanner": "scanner-primary", "fingerprint": "2d0c7b7ab8f8aacf", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["placeholder", "mock-data", "critical-flow", "generated-repo-pattern"]}}, {"ruleId": "scanner-b9088664ace7f748", "level": "warning", "message": {"text": "Composite production-readiness gap"}, "properties": {"repobilityId": "2775fec744a0ab4d", "scanner": "scanner-primary", "fingerprint": "b9088664ace7f748", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["production-readiness", "repo-hardening", "generated-repo-pattern"]}}, {"ruleId": "scanner-ea8f3013f588db25", "level": "note", "message": {"text": "Shallow git history limits provenance confidence"}, "properties": {"repobilityId": "9ef27ad4cbe4b3ee", "scanner": "scanner-primary", "fingerprint": "ea8f3013f588db25", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["provenance", "git-history", "generated-repo-pattern"]}}, {"ruleId": "scanner-8424db9c75e04ba4", "level": "none", "message": {"text": "Very short observed git history"}, "properties": {"repobilityId": "f4861594175a29a5", "scanner": "scanner-primary", "fingerprint": "8424db9c75e04ba4", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["provenance", "git-history", "generated-repo-pattern"]}}, {"ruleId": "scanner-2c2af1fcc95be213", "level": "none", "message": {"text": "Commented-code block (5 lines) in textbook-generator.js:424"}, "properties": {"repobilityId": "709b1b2c6f68015b", "scanner": "scanner-primary", "fingerprint": "2c2af1fcc95be213", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-0f1f062be4e721c9", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 textbook-generator.js:469"}, "properties": {"repobilityId": "6b1486cf19f3ca7f", "scanner": "scanner-primary", "fingerprint": "0f1f062be4e721c9", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-1d7c96681c922f15", "level": "none", "message": {"text": "Commented-code block (8 lines) in mypage.js:12"}, "properties": {"repobilityId": "463b435ef59f77c5", "scanner": "scanner-primary", "fingerprint": "1d7c96681c922f15", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-f693b80125491612", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 mypage.js:274"}, "properties": {"repobilityId": "05668cea4e307bc5", "scanner": "scanner-primary", "fingerprint": "f693b80125491612", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-eaf1cda3eecb4dfe", "level": "none", "message": {"text": "Commented-code block (6 lines) in frontend-error-monitor.js:1"}, "properties": {"repobilityId": "d9275862b928a2ea", "scanner": "scanner-primary", "fingerprint": "eaf1cda3eecb4dfe", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-142a1df864f4fcc8", "level": "none", "message": {"text": "Commented-code block (8 lines) in plans.js:1"}, "properties": {"repobilityId": "2933fc483affcc39", "scanner": "scanner-primary", "fingerprint": "142a1df864f4fcc8", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-cc53efa0fcce0a73", "level": "none", "message": {"text": "Commented-code block (7 lines) in checkout.js:340"}, "properties": {"repobilityId": "8b5c27f836985c51", "scanner": "scanner-primary", "fingerprint": "cc53efa0fcce0a73", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-b9fdc14e0cf84079", "level": "none", "message": {"text": "Commented-code block (7 lines) in learning-brain.js:46"}, "properties": {"repobilityId": "d79cf766fc54d89b", "scanner": "scanner-primary", "fingerprint": "b9fdc14e0cf84079", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-2d0a815375e3dbb6", "level": "none", "message": {"text": "Commented-code block (6 lines) in ceo.js:49"}, "properties": {"repobilityId": "2cc4418456bbefb9", "scanner": "scanner-primary", "fingerprint": "2d0a815375e3dbb6", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-1e7905918be406dc", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 ceo.js:1080"}, "properties": {"repobilityId": "6e522ccc8dddc8a2", "scanner": "scanner-primary", "fingerprint": "1e7905918be406dc", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-7cd1fd20777d3ad7", "level": "none", "message": {"text": "Commented-code block (9 lines) in student-mode.js:1"}, "properties": {"repobilityId": "94f4375a2329b1b9", "scanner": "scanner-primary", "fingerprint": "7cd1fd20777d3ad7", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-ababb5bca99cb771", "level": "none", "message": {"text": "Commented-code block (6 lines) in sw.js:8"}, "properties": {"repobilityId": "b37b45d20ad6f4c9", "scanner": "scanner-primary", "fingerprint": "ababb5bca99cb771", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-b3a26dfd640a58b1", "level": "none", "message": {"text": "Commented-code block (6 lines) in past-exams-db.js:1"}, "properties": {"repobilityId": "081e3b9f93e0e67d", "scanner": "scanner-primary", "fingerprint": "b3a26dfd640a58b1", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-85db561d0175936b", "level": "note", "message": {"text": "Legacy-named symbol `ee_qpref_v1` in english-exam.js:2293"}, "properties": {"repobilityId": "094a218918e07162", "scanner": "scanner-primary", "fingerprint": "85db561d0175936b", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-22c87bf171732f6a", "level": "none", "message": {"text": "Commented-code block (5 lines) in english-exam.js:1466"}, "properties": {"repobilityId": "8fa01b11003584ec", "scanner": "scanner-primary", "fingerprint": "22c87bf171732f6a", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-3fc3de089ce414ec", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 english-exam.js:725"}, "properties": {"repobilityId": "b3e4d80a45113e0d", "scanner": "scanner-primary", "fingerprint": "3fc3de089ce414ec", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-4079c134ce0cca38", "level": "none", "message": {"text": "Commented-code block (6 lines) in mock-exam.js:539"}, "properties": {"repobilityId": "57427fc7f14c35f5", "scanner": "scanner-primary", "fingerprint": "4079c134ce0cca38", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-d9d1b7ee726e8f8f", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 mock-exam.js:292"}, "properties": {"repobilityId": "987c6d180caf360f", "scanner": "scanner-primary", "fingerprint": "d9d1b7ee726e8f8f", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-004f806688ca33c5", "level": "note", "message": {"text": "Legacy-named symbol `ai_juku_problem_stats_v1` in app.js:8141"}, "properties": {"repobilityId": "3ad353af8bfa66b4", "scanner": "scanner-primary", "fingerprint": "004f806688ca33c5", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-f0108e0e9823bab3", "level": "none", "message": {"text": "Commented-code block (5 lines) in app.js:207"}, "properties": {"repobilityId": "1add5ac2716f3c5c", "scanner": "scanner-primary", "fingerprint": "f0108e0e9823bab3", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-74d5139be8da28ed", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app.js:3522"}, "properties": {"repobilityId": "049235840c2facec", "scanner": "scanner-primary", "fingerprint": "74d5139be8da28ed", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-152b75a77b2438fe", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 auth-guard.js:86"}, "properties": {"repobilityId": "ba1e2e077f5de8d2", "scanner": "scanner-primary", "fingerprint": "152b75a77b2438fe", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-401bf7b4c5f90163", "level": "none", "message": {"text": "Commented-code block (5 lines) in english-exam-banks.js:1"}, "properties": {"repobilityId": "01688b6867f656bc", "scanner": "scanner-primary", "fingerprint": "401bf7b4c5f90163", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-04ac72be5ea2c1fc", "level": "note", "message": {"text": "Legacy-named symbol `ai_juku_sw_purge_log_v2` in cache-purge.js:48"}, "properties": {"repobilityId": "b0e1f2263610f1c4", "scanner": "scanner-primary", "fingerprint": "04ac72be5ea2c1fc", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-38da188c641bac63", "level": "none", "message": {"text": "Commented-code block (5 lines) in cache-purge.js:120"}, "properties": {"repobilityId": "7abeb0800e22182f", "scanner": "scanner-primary", "fingerprint": "38da188c641bac63", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-9a65166930f8721a", "level": "none", "message": {"text": "Commented-code block (7 lines) in analytics.js:1"}, "properties": {"repobilityId": "a9349094a86b7897", "scanner": "scanner-primary", "fingerprint": "9a65166930f8721a", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-ac0b3e4f644e4abd", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 personalized-outreach.js:24"}, "properties": {"repobilityId": "655464adfec3ea8d", "scanner": "scanner-primary", "fingerprint": "ac0b3e4f644e4abd", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-90f031d9047b7e3a", "level": "none", "message": {"text": "Commented-code block (6 lines) in api/admin-charge-month-end-execute.py:200"}, "properties": {"repobilityId": "9c12462854ceb683", "scanner": "scanner-primary", "fingerprint": "90f031d9047b7e3a", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-12d25fde65bef2e3", "level": "none", "message": {"text": "Commented-code block (5 lines) in api/register-subscribe.py:302"}, "properties": {"repobilityId": "fa76cbe493c33f55", "scanner": "scanner-primary", "fingerprint": "12d25fde65bef2e3", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-79961615a12492c2", "level": "note", "message": {"text": "Legacy-named symbol `AI_Coaching_Guide_v2` in scripts/generate_coaching_guide_v6.py:10"}, "properties": {"repobilityId": "3fee5ce4c5a5c203", "scanner": "scanner-primary", "fingerprint": "79961615a12492c2", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-713ac658cbf84076", "level": "note", "message": {"text": "Legacy-named symbol `AI_Coaching_Guide_v2` in scripts/generate_coaching_guide_v2.py:10"}, "properties": {"repobilityId": "fe19a28e90960e32", "scanner": "scanner-primary", "fingerprint": "713ac658cbf84076", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-6d9f1627d8f58a58", "level": "note", "message": {"text": "Legacy-named symbol `AI_Coaching_Guide_v2` in scripts/generate_coaching_guide_v3.py:10"}, "properties": {"repobilityId": "cae40469c2af276c", "scanner": "scanner-primary", "fingerprint": "6d9f1627d8f58a58", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-c8f4eca5814e1493", "level": "note", "message": {"text": "Legacy-named symbol `AI_Coaching_Guide_v2` in scripts/generate_coaching_guide_v4.py:10"}, "properties": {"repobilityId": "d64868f6247887d5", "scanner": "scanner-primary", "fingerprint": "c8f4eca5814e1493", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-7e66f5637ecc7820", "level": "note", "message": {"text": "Legacy-named symbol `generate_reels_video_v2` in marketing-assets/generate_reels_video_v2.py:4"}, "properties": {"repobilityId": "23d0cf1f389f0977", "scanner": "scanner-primary", "fingerprint": "7e66f5637ecc7820", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-21ffc04fa11e6531", "level": "warning", "message": {"text": "Network/subprocess call without timeout or try/except \u2014 marketing-assets/generate_reels_video_v2.py:486"}, "properties": {"repobilityId": "49e7726978925088", "scanner": "scanner-primary", "fingerprint": "21ffc04fa11e6531", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-da8cb397e4ebc413", "level": "warning", "message": {"text": "Network/subprocess call without timeout or try/except \u2014 marketing-assets/generate_reels_video.py:519"}, "properties": {"repobilityId": "d404932ee7c8590c", "scanner": "scanner-primary", "fingerprint": "da8cb397e4ebc413", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-52270ff7de69bc17", "level": "note", "message": {"text": "Legacy-named symbol `bcc_copy` in payment/app.js:4810"}, "properties": {"repobilityId": "61a876d3b31af036", "scanner": "scanner-primary", "fingerprint": "52270ff7de69bc17", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-74d9c15e397ec66f", "level": "none", "message": {"text": "Commented-code block (6 lines) in payment/app.js:820"}, "properties": {"repobilityId": "19e49de52babff65", "scanner": "scanner-primary", "fingerprint": "74d9c15e397ec66f", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-ded1a0da2d958c03", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 payment/app.js:1019"}, "properties": {"repobilityId": "57ec7a9b9ba599b8", "scanner": "scanner-primary", "fingerprint": "ded1a0da2d958c03", "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-02525d39071dd2c7", "level": "note", "message": {"text": "Near-duplicate function bodies in 5 places"}, "properties": {"repobilityId": "99dc741e7d29e4d8", "scanner": "scanner-primary", "fingerprint": "02525d39071dd2c7", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-2c04133e54348533", "level": "note", "message": {"text": "Near-duplicate function bodies in 2 places"}, "properties": {"repobilityId": "5cc532860f33399e", "scanner": "scanner-primary", "fingerprint": "2c04133e54348533", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-49c98f7cedd9c977", "level": "note", "message": {"text": "Near-duplicate function bodies in 4 places"}, "properties": {"repobilityId": "1d6ff91a349e69ba", "scanner": "scanner-primary", "fingerprint": "49c98f7cedd9c977", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-49c98f7cedd9c977", "level": "note", "message": {"text": "Near-duplicate function bodies in 4 places"}, "properties": {"repobilityId": "6350e1aab029b1a8", "scanner": "scanner-primary", "fingerprint": "49c98f7cedd9c977", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-49c98f7cedd9c977", "level": "note", "message": {"text": "Near-duplicate function bodies in 4 places"}, "properties": {"repobilityId": "d4064a6810864589", "scanner": "scanner-primary", "fingerprint": "49c98f7cedd9c977", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-49c98f7cedd9c977", "level": "note", "message": {"text": "Near-duplicate function bodies in 4 places"}, "properties": {"repobilityId": "a4681e2d7fe540af", "scanner": "scanner-primary", "fingerprint": "49c98f7cedd9c977", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-be46ea126aa5d8dc", "level": "note", "message": {"text": "Near-duplicate function bodies in 3 places"}, "properties": {"repobilityId": "3e4ba83ae7653c89", "scanner": "scanner-primary", "fingerprint": "be46ea126aa5d8dc", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-be46ea126aa5d8dc", "level": "note", "message": {"text": "Near-duplicate function bodies in 3 places"}, "properties": {"repobilityId": "5029303890ef28fb", "scanner": "scanner-primary", "fingerprint": "be46ea126aa5d8dc", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-be46ea126aa5d8dc", "level": "note", "message": {"text": "Near-duplicate function bodies in 3 places"}, "properties": {"repobilityId": "5f09711f38d87be2", "scanner": "scanner-primary", "fingerprint": "be46ea126aa5d8dc", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-be46ea126aa5d8dc", "level": "note", "message": {"text": "Near-duplicate function bodies in 3 places"}, "properties": {"repobilityId": "a8ad435b19e434ef", "scanner": "scanner-primary", "fingerprint": "be46ea126aa5d8dc", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-be46ea126aa5d8dc", "level": "note", "message": {"text": "Near-duplicate function bodies in 3 places"}, "properties": {"repobilityId": "9eaa0b7f0e30b68c", "scanner": "scanner-primary", "fingerprint": "be46ea126aa5d8dc", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-be46ea126aa5d8dc", "level": "note", "message": {"text": "Near-duplicate function bodies in 3 places"}, "properties": {"repobilityId": "a0b13e5e62af4ddd", "scanner": "scanner-primary", "fingerprint": "be46ea126aa5d8dc", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-be46ea126aa5d8dc", "level": "note", "message": {"text": "Near-duplicate function bodies in 3 places"}, "properties": {"repobilityId": "674cb54f8e5fac37", "scanner": "scanner-primary", "fingerprint": "be46ea126aa5d8dc", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-be46ea126aa5d8dc", "level": "note", "message": {"text": "Near-duplicate function bodies in 3 places"}, "properties": {"repobilityId": "bf0a58c369513a43", "scanner": "scanner-primary", "fingerprint": "be46ea126aa5d8dc", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-2c04133e54348533", "level": "note", "message": {"text": "Near-duplicate function bodies in 2 places"}, "properties": {"repobilityId": "c718910bb941c994", "scanner": "scanner-primary", "fingerprint": "2c04133e54348533", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-49c98f7cedd9c977", "level": "note", "message": {"text": "Near-duplicate function bodies in 4 places"}, "properties": {"repobilityId": "5084ac2eeaf6c0f6", "scanner": "scanner-primary", "fingerprint": "49c98f7cedd9c977", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-49c98f7cedd9c977", "level": "note", "message": {"text": "Near-duplicate function bodies in 4 places"}, "properties": {"repobilityId": "65b557627721023e", "scanner": "scanner-primary", "fingerprint": "49c98f7cedd9c977", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-76a2f6818267a9a8", "level": "note", "message": {"text": "Near-duplicate function bodies in 8 places"}, "properties": {"repobilityId": "1b7a7732d1c9fb5e", "scanner": "scanner-primary", "fingerprint": "76a2f6818267a9a8", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-76a2f6818267a9a8", "level": "note", "message": {"text": "Near-duplicate function bodies in 8 places"}, "properties": {"repobilityId": "b36276bfcd36e756", "scanner": "scanner-primary", "fingerprint": "76a2f6818267a9a8", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-2c04133e54348533", "level": "note", "message": {"text": "Near-duplicate function bodies in 2 places"}, "properties": {"repobilityId": "02d1b02abe12a016", "scanner": "scanner-primary", "fingerprint": "2c04133e54348533", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-3bf81211ff32ed06", "level": "error", "message": {"text": "Dangling fetch: GET /api/admin/messages/${encodeURIComponent(id)}/attachment (ceo.js:1936)"}, "properties": {"repobilityId": "b9e5b034334d1458", "scanner": "scanner-primary", "fingerprint": "3bf81211ff32ed06", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-07d6b2585e7c3de8", "level": "error", "message": {"text": "Dangling fetch: POST /api/admin/ai-draft (ceo.js:2062)"}, "properties": {"repobilityId": "eba89aa5dfd84df4", "scanner": "scanner-primary", "fingerprint": "07d6b2585e7c3de8", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-a1f6efd183c234f3", "level": "error", "message": {"text": "Dangling fetch: GET /api/admin/course-applications?status=pending&limit=100 (ceo.js:2164)"}, "properties": {"repobilityId": "9c38e2f875723d05", "scanner": "scanner-primary", "fingerprint": "a1f6efd183c234f3", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-bfc60222c370b989", "level": "error", "message": {"text": "Dangling fetch: POST /api/admin/course-applications/${encodeURIComponent(id)}/approve (ceo.js:2205)"}, "properties": {"repobilityId": "5d4a6c7e941eddc6", "scanner": "scanner-primary", "fingerprint": "bfc60222c370b989", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-b0d7ff53203b510d", "level": "error", "message": {"text": "Dangling fetch: POST /api/admin/course-applications/${encodeURIComponent(id)}/reject (ceo.js:2227)"}, "properties": {"repobilityId": "5afcd3fa5f3e3cd2", "scanner": "scanner-primary", "fingerprint": "b0d7ff53203b510d", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-b34e76d22d2b98a4", "level": "error", "message": {"text": "Dangling fetch: GET /api/admin/db/r2-backups?limit=30 (ceo.js:2281)"}, "properties": {"repobilityId": "73cce1a9c09fa810", "scanner": "scanner-primary", "fingerprint": "b34e76d22d2b98a4", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-2e36e5f06862094f", "level": "error", "message": {"text": "Dangling fetch: POST /api/admin/db/snapshot-to-r2 (ceo.js:2339)"}, "properties": {"repobilityId": "28a6eb02c3c0a539", "scanner": "scanner-primary", "fingerprint": "2e36e5f06862094f", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-ab87f861375224c1", "level": "error", "message": {"text": "Dangling fetch: GET http://localhost:8080/default_data.json (app.js:9148)"}, "properties": {"repobilityId": "169c43184fb2fe8e", "scanner": "scanner-primary", "fingerprint": "ab87f861375224c1", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-662cd7d12bd8082d", "level": "error", "message": {"text": "Dangling fetch: GET http://localhost:8080/default_data.json (personalized-outreach.js:43)"}, "properties": {"repobilityId": "7ee8754516290778", "scanner": "scanner-primary", "fingerprint": "662cd7d12bd8082d", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-d2b747e3b1b46bf4", "level": "error", "message": {"text": "Dangling fetch: POST /payment/api/admin-update-registration (payment/app.js:672)"}, "properties": {"repobilityId": "e4f8ec60012cb0b8", "scanner": "scanner-primary", "fingerprint": "d2b747e3b1b46bf4", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-acc6b1ad412e14d2", "level": "error", "message": {"text": "Dangling fetch: GET /payment/api/registered-customers (payment/app.js:1388)"}, "properties": {"repobilityId": "1cb31243cc306565", "scanner": "scanner-primary", "fingerprint": "acc6b1ad412e14d2", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-2bdf777894d7a33d", "level": "error", "message": {"text": "Dangling fetch: POST /payment/api/past-due-invoice (payment/app.js:1986)"}, "properties": {"repobilityId": "8f425949cce957af", "scanner": "scanner-primary", "fingerprint": "2bdf777894d7a33d", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-9fd325130a24a917", "level": "error", "message": {"text": "Dangling fetch: POST /payment/api/past-due-invoice (payment/app.js:2043)"}, "properties": {"repobilityId": "62ccab60d329b54f", "scanner": "scanner-primary", "fingerprint": "9fd325130a24a917", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-21accfea17e645fe", "level": "error", "message": {"text": "Dangling fetch: GET /payment/api/admin-charge-month-end-preview (payment/app.js:2281)"}, "properties": {"repobilityId": "4c998c4b64a17324", "scanner": "scanner-primary", "fingerprint": "21accfea17e645fe", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-4a71765bbe4f6944", "level": "error", "message": {"text": "Dangling fetch: POST /payment/api/admin-charge-month-end-execute (payment/app.js:2467)"}, "properties": {"repobilityId": "2b4e6d9fdf43563a", "scanner": "scanner-primary", "fingerprint": "4a71765bbe4f6944", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-0b52548f99074217", "level": "error", "message": {"text": "Dangling fetch: POST /payment/api/admin-charge-month-end-execute (payment/app.js:2490)"}, "properties": {"repobilityId": "4d4fcc11e4229e62", "scanner": "scanner-primary", "fingerprint": "0b52548f99074217", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-d59659bcf6a3a99d", "level": "error", "message": {"text": "Dangling fetch: GET /payment/api/admin-charge-history?month=${encodeURIComponent(month)}&type=${encodeURIComponent(type)} (payment/app.js:2699)"}, "properties": {"repobilityId": "cef517bc3ea1eb1f", "scanner": "scanner-primary", "fingerprint": "d59659bcf6a3a99d", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-31e0cd1af0ec01f6", "level": "error", "message": {"text": "Dangling fetch: POST /payment/api/admin-charge-reconcile (payment/app.js:2875)"}, "properties": {"repobilityId": "0d5d1d4c7414901a", "scanner": "scanner-primary", "fingerprint": "31e0cd1af0ec01f6", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-a459c52e65a65bf5", "level": "error", "message": {"text": "Dangling fetch: POST /payment/api/admin-charge-reconcile (payment/app.js:2908)"}, "properties": {"repobilityId": "430f1b80a3f2aa0f", "scanner": "scanner-primary", "fingerprint": "a459c52e65a65bf5", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-561f5a150bfd60fe", "level": "error", "message": {"text": "Dangling fetch: POST /payment/api/admin-charge-reconcile (payment/app.js:2915)"}, "properties": {"repobilityId": "b4effa1ad1322e66", "scanner": "scanner-primary", "fingerprint": "561f5a150bfd60fe", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-42b7fd3a78fa42e5", "level": "error", "message": {"text": "Dangling fetch: POST /payment/api/admin-registration-cancel (payment/app.js:2952)"}, "properties": {"repobilityId": "04d056b39f7f6296", "scanner": "scanner-primary", "fingerprint": "42b7fd3a78fa42e5", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-62711e8a9bc2b871", "level": "error", "message": {"text": "Dangling fetch: POST /payment/api/mail-send (payment/app.js:4711)"}, "properties": {"repobilityId": "47d0affdf795344a", "scanner": "scanner-primary", "fingerprint": "62711e8a9bc2b871", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-cc52a1d461bbc9d4", "level": "error", "message": {"text": "Dangling fetch: POST /payment/api/mail-send (payment/app.js:4763)"}, "properties": {"repobilityId": "a9df95cb96086f46", "scanner": "scanner-primary", "fingerprint": "cc52a1d461bbc9d4", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-4756b4c4da7d2088", "level": "note", "message": {"text": "Unused endpoint: GET /api/health"}, "properties": {"repobilityId": "1bea2da995d803d3", "scanner": "scanner-primary", "fingerprint": "4756b4c4da7d2088", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-7be37a161f300a6f", "level": "note", "message": {"text": "Unused endpoint: GET /api/email/diagnose-public"}, "properties": {"repobilityId": "d52abeea73246c8a", "scanner": "scanner-primary", "fingerprint": "7be37a161f300a6f", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-3b37265900e79a8a", "level": "note", "message": {"text": "Unused endpoint: GET /api/stats"}, "properties": {"repobilityId": "00030db2bfc002c2", "scanner": "scanner-primary", "fingerprint": "3b37265900e79a8a", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-ed6f73e5b9264320", "level": "note", "message": {"text": "Unused endpoint: GET /api/student/worksheet/this-week"}, "properties": {"repobilityId": "edcc67c7365d0fd4", "scanner": "scanner-primary", "fingerprint": "ed6f73e5b9264320", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-382019ed7b5577c9", "level": "note", "message": {"text": "Unused endpoint: GET /api/student/worksheet/history"}, "properties": {"repobilityId": "7801036ae2e2b0d6", "scanner": "scanner-primary", "fingerprint": "382019ed7b5577c9", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-726ac0e38df4f4a6", "level": "note", "message": {"text": "Unused endpoint: POST /api/admin/worksheet/run-weekly-now"}, "properties": {"repobilityId": "2cca02669dcdca47", "scanner": "scanner-primary", "fingerprint": "726ac0e38df4f4a6", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-58be4324b6041dca", "level": "note", "message": {"text": "Unused endpoint: POST /api/admin/weakness/aggregate-now"}, "properties": {"repobilityId": "8ff4facbbbd62a1f", "scanner": "scanner-primary", "fingerprint": "58be4324b6041dca", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-0dd434b0dbf56bcb", "level": "note", "message": {"text": "Unused endpoint: POST /api/admin/anthropic/credit-monitor-now"}, "properties": {"repobilityId": "6848021d5ba83fbb", "scanner": "scanner-primary", "fingerprint": "0dd434b0dbf56bcb", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-50d892491a165a66", "level": "note", "message": {"text": "Unused endpoint: GET /api/student/weakness-top3"}, "properties": {"repobilityId": "8bccf27009adb2dc", "scanner": "scanner-primary", "fingerprint": "50d892491a165a66", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-6b5528ec213de807", "level": "note", "message": {"text": "Unused endpoint: GET /api/student/weakness-progress"}, "properties": {"repobilityId": "1e80910da4da0b86", "scanner": "scanner-primary", "fingerprint": "6b5528ec213de807", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-4f7ed75ff1bdfa39", "level": "note", "message": {"text": "Unused endpoint: PATCH /api/student/profile"}, "properties": {"repobilityId": "7850876d2eca878e", "scanner": "scanner-primary", "fingerprint": "4f7ed75ff1bdfa39", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-87bd1f7a7332bff1", "level": "note", "message": {"text": "Unused endpoint: GET /api/student/lesson-prints"}, "properties": {"repobilityId": "2d11b195218c624e", "scanner": "scanner-primary", "fingerprint": "87bd1f7a7332bff1", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-a1b02f82324fa21e", "level": "note", "message": {"text": "Unused endpoint: GET /api/student/lesson-prints/recommended"}, "properties": {"repobilityId": "164dd62f6a77e92b", "scanner": "scanner-primary", "fingerprint": "a1b02f82324fa21e", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-6d34c01bb0674834", "level": "note", "message": {"text": "Unused endpoint: GET /api/student/admission-likelihood"}, "properties": {"repobilityId": "5516b1453da1a822", "scanner": "scanner-primary", "fingerprint": "6d34c01bb0674834", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-c23f87890090253a", "level": "note", "message": {"text": "Unused endpoint: GET /api/student/lesson-prints/by-goal"}, "properties": {"repobilityId": "20b5c9d5bc04036b", "scanner": "scanner-primary", "fingerprint": "c23f87890090253a", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-3658aed8ee08c1c5", "level": "note", "message": {"text": "Unused endpoint: POST /api/student/lesson-prints/{print_id}/download"}, "properties": {"repobilityId": "3d2e580537f5b39a", "scanner": "scanner-primary", "fingerprint": "3658aed8ee08c1c5", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-113bd47d46686d8f", "level": "note", "message": {"text": "Unused endpoint: POST /api/admin/tts/generate"}, "properties": {"repobilityId": "f82bc576de13cd96", "scanner": "scanner-primary", "fingerprint": "113bd47d46686d8f", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-5fe4bf76dc6ae512", "level": "note", "message": {"text": "Unused endpoint: POST /api/admin/lesson-prints/sync"}, "properties": {"repobilityId": "43a4e4421a5bfd8b", "scanner": "scanner-primary", "fingerprint": "5fe4bf76dc6ae512", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-44cd5f37c4456511", "level": "note", "message": {"text": "Unused endpoint: GET /api/admin/lesson-prints/stats"}, "properties": {"repobilityId": "3a437ccc7ef920bd", "scanner": "scanner-primary", "fingerprint": "44cd5f37c4456511", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-80c11132df09e15a", "level": "note", "message": {"text": "Unused endpoint: GET /api/admin/weakness-heatmap"}, "properties": {"repobilityId": "e62d05e87fc85e83", "scanner": "scanner-primary", "fingerprint": "80c11132df09e15a", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-caebdddf524440ae", "level": "note", "message": {"text": "Unused endpoint: POST /api/admin/monitor/auto-rollback"}, "properties": {"repobilityId": "9655a0f5e33bd292", "scanner": "scanner-primary", "fingerprint": "caebdddf524440ae", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-6698c80e0f00cbad", "level": "note", "message": {"text": "Unused endpoint: GET /api/admin/monitor/rollback-history"}, "properties": {"repobilityId": "7ec640fd210659ff", "scanner": "scanner-primary", "fingerprint": "6698c80e0f00cbad", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-57af10732fae5821", "level": "note", "message": {"text": "Unused endpoint: POST /api/admin/git/apply-patch"}, "properties": {"repobilityId": "efcd99b537306239", "scanner": "scanner-primary", "fingerprint": "57af10732fae5821", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-b7260b6781e0494f", "level": "note", "message": {"text": "Unused endpoint: POST /api/auth/magic-link"}, "properties": {"repobilityId": "0624b3d794eff8bd", "scanner": "scanner-primary", "fingerprint": "b7260b6781e0494f", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-cdf715ac9a05b229", "level": "note", "message": {"text": "Unused endpoint: POST /api/auth/verify-code"}, "properties": {"repobilityId": "282103a7bda09701", "scanner": "scanner-primary", "fingerprint": "cdf715ac9a05b229", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-33a5daa01dd022c8", "level": "note", "message": {"text": "Unused endpoint: GET /api/auth/verify"}, "properties": {"repobilityId": "bbf2c18f3e2db681", "scanner": "scanner-primary", "fingerprint": "33a5daa01dd022c8", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-bc1b63be5d263466", "level": "note", "message": {"text": "Unused endpoint: POST /api/admin/login"}, "properties": {"repobilityId": "de6055f3655d3bf0", "scanner": "scanner-primary", "fingerprint": "bc1b63be5d263466", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-061e8d7283dae596", "level": "note", "message": {"text": "Unused endpoint: GET /api/admin/verify"}, "properties": {"repobilityId": "ee7e471a82d8bba4", "scanner": "scanner-primary", "fingerprint": "061e8d7283dae596", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-5f7dca04da2aac9e", "level": "note", "message": {"text": "Unused endpoint: GET /api/admin/revenue-timeline"}, "properties": {"repobilityId": "5cbd2d52357161a2", "scanner": "scanner-primary", "fingerprint": "5f7dca04da2aac9e", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-722e2bcf1319e8c3", "level": "note", "message": {"text": "Unused endpoint: GET /api/admin/analytics"}, "properties": {"repobilityId": "42656eeada893538", "scanner": "scanner-primary", "fingerprint": "722e2bcf1319e8c3", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-6f83d1bc700e4b15", "level": "note", "message": {"text": "Unused endpoint: POST /api/admin/textbooks/generate-figure"}, "properties": {"repobilityId": "22675d21a047ae39", "scanner": "scanner-primary", "fingerprint": "6f83d1bc700e4b15", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-72e6ff27373df39e", "level": "note", "message": {"text": "Unused endpoint: POST /api/admin/dalle/generate"}, "properties": {"repobilityId": "23a334f042c13021", "scanner": "scanner-primary", "fingerprint": "72e6ff27373df39e", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-72bdae1d8700cde0", "level": "note", "message": {"text": "Unused endpoint: POST /api/ai/messages"}, "properties": {"repobilityId": "7bbfce752073d0d1", "scanner": "scanner-primary", "fingerprint": "72bdae1d8700cde0", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-e5fa0ca214df4f0e", "level": "note", "message": {"text": "Unused endpoint: POST /api/admin/stripe/setup-founder-special"}, "properties": {"repobilityId": "2ca1c930c293daa2", "scanner": "scanner-primary", "fingerprint": "e5fa0ca214df4f0e", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-b4885f469f31a0c8", "level": "note", "message": {"text": "Unused endpoint: POST /api/admin/stripe/setup-all-prices"}, "properties": {"repobilityId": "5e69aea7c05dd1c9", "scanner": "scanner-primary", "fingerprint": "b4885f469f31a0c8", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-45518d2f49fbfd25", "level": "note", "message": {"text": "Unused endpoint: GET /api/admin/stripe/check-prices"}, "properties": {"repobilityId": "2979cd2cf73d2b29", "scanner": "scanner-primary", "fingerprint": "45518d2f49fbfd25", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-bd2dd09e8c640740", "level": "note", "message": {"text": "Unused endpoint: POST /api/admin/stripe/reconcile"}, "properties": {"repobilityId": "036f04f7ad4af4ac", "scanner": "scanner-primary", "fingerprint": "bd2dd09e8c640740", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-871dff6ec685743d", "level": "note", "message": {"text": "Unused endpoint: POST /api/admin/stripe/backfill-payments"}, "properties": {"repobilityId": "a1eddb2356fc20ad", "scanner": "scanner-primary", "fingerprint": "871dff6ec685743d", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-de1349f620fbe7f2", "level": "note", "message": {"text": "Unused endpoint: POST /api/admin/stripe/webhook-events-sync"}, "properties": {"repobilityId": "d4aea2bf0ddc0ca7", "scanner": "scanner-primary", "fingerprint": "de1349f620fbe7f2", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-41782b98eb853bd9", "level": "note", "message": {"text": "Unused endpoint: GET /api/admin/stripe/diagnose-orphan-subs"}, "properties": {"repobilityId": "4d4e8bed05fd5421", "scanner": "scanner-primary", "fingerprint": "41782b98eb853bd9", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-afe53193e6a2ec27", "level": "note", "message": {"text": "Unused endpoint: GET /api/admin/stripe/diagnose-trialing-leftovers"}, "properties": {"repobilityId": "ffe9b5c15100d8e3", "scanner": "scanner-primary", "fingerprint": "afe53193e6a2ec27", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-20588b846075a25a", "level": "note", "message": {"text": "Unused endpoint: POST /api/admin/marketing/send-ig-carousel"}, "properties": {"repobilityId": "6cd1fc5365da624f", "scanner": "scanner-primary", "fingerprint": "20588b846075a25a", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-39dff351d5652a78", "level": "note", "message": {"text": "Unused endpoint: POST /api/admin/marketing/generate-student-invite"}, "properties": {"repobilityId": "2e8eea1f754bf7c2", "scanner": "scanner-primary", "fingerprint": "39dff351d5652a78", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-d47318aa80181917", "level": "note", "message": {"text": "Unused endpoint: GET /api/marketing/verify-invite"}, "properties": {"repobilityId": "79e130b72ae94afc", "scanner": "scanner-primary", "fingerprint": "d47318aa80181917", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-c7f1d39360f70c11", "level": "note", "message": {"text": "Unused endpoint: POST /api/admin/marketing/generate-invite-code"}, "properties": {"repobilityId": "9614f0ed687a2fe3", "scanner": "scanner-primary", "fingerprint": "c7f1d39360f70c11", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-a7d43efedd4ab7e1", "level": "note", "message": {"text": "Unused endpoint: POST /api/admin/marketing/bulk-invite"}, "properties": {"repobilityId": "ad585bd018f881aa", "scanner": "scanner-primary", "fingerprint": "a7d43efedd4ab7e1", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-8cae51f85f08226a", "level": "note", "message": {"text": "Unused endpoint: POST /api/admin/stripe/setup-threads6k-coupon"}, "properties": {"repobilityId": "8845dd5c8664a5b3", "scanner": "scanner-primary", "fingerprint": "8cae51f85f08226a", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-73a4b1a072e356ae", "level": "note", "message": {"text": "Unused endpoint: POST /api/admin/marketing/send-link-email"}, "properties": {"repobilityId": "e1bba461b91f71ac", "scanner": "scanner-primary", "fingerprint": "73a4b1a072e356ae", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-25d7d960ce9e81f8", "level": "note", "message": {"text": "Unused endpoint: GET /api/admin/marketing/custom-gpt-announcement-templates"}, "properties": {"repobilityId": "a074025a6874a197", "scanner": "scanner-primary", "fingerprint": "25d7d960ce9e81f8", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-2e7ac175b4605df8", "level": "note", "message": {"text": "Unused endpoint: GET /api/admin/marketing/custom-gpt-funnel-specs"}, "properties": {"repobilityId": "aeae66df611c31b9", "scanner": "scanner-primary", "fingerprint": "2e7ac175b4605df8", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}]}]}