{"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-48cd88bfa3a48270", "name": "Possibly dead Python function: fetch_page", "shortDescription": {"text": "Possibly dead Python function: fetch_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-48212d88fd2fff25", "name": "Possibly dead Python function: fetch_and_extract", "shortDescription": {"text": "Possibly dead Python function: fetch_and_extract"}, "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-4fd143f19e10df12", "name": "Possibly dead Python function: is_price_disclosed", "shortDescription": {"text": "Possibly dead Python function: is_price_disclosed"}, "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-3405d9dbd5d13e4c", "name": "Possibly dead Python function: replacer", "shortDescription": {"text": "Possibly dead Python function: replacer"}, "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-04138f74e45ed20e", "name": "Possibly dead Python function: fetch_article_content", "shortDescription": {"text": "Possibly dead Python function: fetch_article_content"}, "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-66259c811a54b89b", "name": "Possibly dead Python function: translate_path", "shortDescription": {"text": "Possibly dead Python function: translate_path"}, "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-5627f8a7b990d863", "name": "Possibly dead Python function: log_message", "shortDescription": {"text": "Possibly dead Python function: log_message"}, "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-e579ddce088d1d53", "name": "Stray `console.log` in TS/JS \u2014 server.js:524", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 server.js:524"}, "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-dbd14df6f58d8ae1", "name": "Stray `console.log` in TS/JS \u2014 scripts/fix_short_batch.js:36", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/fix_short_batch.js:36"}, "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-8eef9efdf88f151e", "name": "Stray `console.log` in TS/JS \u2014 scripts/weekly_refresh.js:14", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/weekly_refresh.js:14"}, "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-82e131cef4847c1c", "name": "Stray `console.log` in TS/JS \u2014 scripts/crawl_biz_playwright.js:136", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/crawl_biz_playwright.js:136"}, "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-963998068e9bf304", "name": "Stray `console.log` in TS/JS \u2014 scripts/gen_qa.js:58", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/gen_qa.js:58"}, "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-e64afb2ef64f92cf", "name": "Stray `console.log` in TS/JS \u2014 scripts/gen_qa_full.js:81", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/gen_qa_full.js:81"}, "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-ccd52932fc4af8d9", "name": "Stray `console.log` in TS/JS \u2014 scripts/import_from_openapi.js:113", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/import_from_openapi.js:113"}, "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-881b016cb139d87b", "name": "Stray `console.log` in TS/JS \u2014 scripts/ocr_image_docs.js:103", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/ocr_image_docs.js:103"}, "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-b03731445c102211", "name": "Stray `console.log` in TS/JS \u2014 scripts/import_excel_products.js:105", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/import_excel_products.js:105"}, "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-b88bbefe8e837bbc", "name": "Stray `console.log` in TS/JS \u2014 scripts/pointer_eval.js:38", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/pointer_eval.js:38"}, "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-1e8d9ce2afc06958", "name": "Stray `console.log` in TS/JS \u2014 scripts/backfill_links.js:86", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/backfill_links.js:86"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-10df2e580154277a", "name": "Stray `console.log` in TS/JS \u2014 scripts/crawl_biz.js:163", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/crawl_biz.js:163"}, "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-25edf42a1a871e32", "name": "Stray `console.log` in TS/JS \u2014 scripts/rechunk_updated.js:22", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/rechunk_updated.js:22"}, "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-7b9603997cbdb2c5", "name": "Stray `console.log` in TS/JS \u2014 scripts/gen_qa_claude.js:89", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/gen_qa_claude.js:89"}, "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-b618661140da8d3d", "name": "Stray `console.log` in TS/JS \u2014 scripts/test_qa_v2.js:92", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/test_qa_v2.js:92"}, "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-227fd5279cfedbe1", "name": "Stray `console.log` in TS/JS \u2014 scripts/gen_qa_v2.js:214", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/gen_qa_v2.js:214"}, "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-0a3ac1af6a0f08f2", "name": "Stray `console.log` in TS/JS \u2014 scripts/regen_qa_guides.js:131", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/regen_qa_guides.js:131"}, "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-c90fcb75826a7781", "name": "Stray `console.log` in TS/JS \u2014 scripts/crawl_item_pages.js:95", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/crawl_item_pages.js:95"}, "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-c6238fc8cd7683dc", "name": "Stray `console.log` in TS/JS \u2014 scripts/ocr_test.js:101", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/ocr_test.js:101"}, "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-937765b147dd2782", "name": "Stray `console.log` in TS/JS \u2014 scripts/token-stats.js:34", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/token-stats.js:34"}, "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-1c919df8e6a36e7e", "name": "Stray `console.log` in TS/JS \u2014 routes/harness.js:80", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 routes/harness.js:80"}, "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-a551e87376e092f3", "name": "Stray `console.log` in TS/JS \u2014 routes/admin.js:548", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 routes/admin.js:548"}, "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-eabb6e0086020297", "name": "Stray `console.log` in TS/JS \u2014 routes/pipeline.js:440", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 routes/pipeline.js:440"}, "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-e741e37e13b4aeba", "name": "Stray `console.log` in TS/JS \u2014 routes/auth.js:138", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 routes/auth.js:138"}, "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-0bc79d1e5a0691a9", "name": "Stray `console.log` in TS/JS \u2014 routes/webhook.js:56", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 routes/webhook.js:56"}, "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-51161e3315103fe5", "name": "Stray `console.log` in TS/JS \u2014 db/schema.js:368", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 db/schema.js:368"}, "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-1004c154a4704664", "name": "Stray `console.log` in TS/JS \u2014 core/experience.js:83", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 core/experience.js:83"}, "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-dee65039ebec1b3a", "name": "Stray `console.log` in TS/JS \u2014 core/evolver.js:94", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 core/evolver.js:94"}, "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-258cd12ec885ec7d", "name": "Stray `console.log` in TS/JS \u2014 core/memory.js:125", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 core/memory.js:125"}, "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-82f65563c318e91a", "name": "Stray `console.log` in TS/JS \u2014 core/agent.js:666", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 core/agent.js:666"}, "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-d1ba0f0637accebb", "name": "Stray `console.log` in TS/JS \u2014 core/dispatcher.js:34", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 core/dispatcher.js:34"}, "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-995d133968a846ab", "name": "Stray `console.log` in TS/JS \u2014 core/profiler.js:96", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 core/profiler.js:96"}, "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-fb0c5a6ca2f7413e", "name": "Stray `console.log` in TS/JS \u2014 core/sms.js:59", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 core/sms.js:59"}, "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-d9c925bdfd681166", "name": "Stray `console.log` in TS/JS \u2014 core/monitor.js:99", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 core/monitor.js:99"}, "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-9edc728191a7fa00", "name": "Stray `console.log` in TS/JS \u2014 core/learner.js:128", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 core/learner.js:128"}, "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-113ffbbddb1d14d7", "name": "Stray `console.log` in TS/JS \u2014 core/skill-registry.js:30", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 core/skill-registry.js:30"}, "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-2a293599d4b5c9e7", "name": "Stray `console.log` in TS/JS \u2014 core/compressor.js:130", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 core/compressor.js:130"}, "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-41ad90e256018935", "name": "Stray `console.log` in TS/JS \u2014 skills/code_runner.js:14", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 skills/code_runner.js:14"}, "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-e014f249cdeafe3f", "name": "Stray `console.log` in TS/JS \u2014 public/admin/workbench-employee.js:543", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 public/admin/workbench-employee.js:543"}, "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-93243008a18fd591", "name": "Stray `console.log` in TS/JS \u2014 knowledge/news_crawler.js:108", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 knowledge/news_crawler.js:108"}, "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-a3e214d4356caef8", "name": "Stray `console.log` in TS/JS \u2014 knowledge/graph_rag.js:199", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 knowledge/graph_rag.js:199"}, "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-3dcd43db3d1efe4f", "name": "Stray `console.log` in TS/JS \u2014 knowledge/vector_index.js:42", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 knowledge/vector_index.js:42"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-f38980744e5b61ff", "name": "Stray `console.log` in TS/JS \u2014 knowledge/search.js:20", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 knowledge/search.js:20"}, "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-38493602bad18b45", "name": "Stray `console.log` in TS/JS \u2014 knowledge/brand_crawl.js:95", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 knowledge/brand_crawl.js:95"}, "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-8c2eaafe21b12780", "name": "Stray `console.log` in TS/JS \u2014 knowledge/build_vectors.js:16", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 knowledge/build_vectors.js:16"}, "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-fdc6e9115d8ae8ad", "name": "Stray `console.log` in TS/JS \u2014 knowledge/deduplicator.js:163", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 knowledge/deduplicator.js:163"}, "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-a558dc9790f6b53b", "name": "Insecure pattern 'direct_innerhtml_assignment' in docs/guan-jthl.html:186", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in docs/guan-jthl.html:186"}, "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-e640c346b1edb7f1", "name": "Insecure pattern 'domparser_html_parse' in docs/guan-jthl.html:144", "shortDescription": {"text": "Insecure pattern 'domparser_html_parse' in docs/guan-jthl.html:144"}, "fullDescription": {"text": "Found a known-risky pattern (domparser_html_parse). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-4cc3543ec83ac95f", "name": "Possible secret in scripts/batch_biz_wiki.py", "shortDescription": {"text": "Possible secret in scripts/batch_biz_wiki.py"}, "fullDescription": {"text": "Detected pattern matching openai_or_anthropic_key. Rotate the credential and move to a secret manager."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "critical", "confidence": 1.0}}, {"id": "scanner-92bbd315bddd03ff", "name": "Insecure pattern 'node_child_process' in scripts/weekly_refresh.js:10", "shortDescription": {"text": "Insecure pattern 'node_child_process' in scripts/weekly_refresh.js:10"}, "fullDescription": {"text": "Found a known-risky pattern (node_child_process). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-423a2bc9f5bc26a0", "name": "Possible secret in scripts/p1_add_warnings.py", "shortDescription": {"text": "Possible secret in scripts/p1_add_warnings.py"}, "fullDescription": {"text": "Detected pattern matching openai_or_anthropic_key. Rotate the credential and move to a secret manager."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "critical", "confidence": 1.0}}, {"id": "scanner-d18ff9d753a8028d", "name": "Insecure pattern 'node_child_process' in scripts/auto-changelog.js:5", "shortDescription": {"text": "Insecure pattern 'node_child_process' in scripts/auto-changelog.js:5"}, "fullDescription": {"text": "Found a known-risky pattern (node_child_process). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-91ccaf1d19019b39", "name": "Possible secret in routes/geo-dashboard.js", "shortDescription": {"text": "Possible secret in routes/geo-dashboard.js"}, "fullDescription": {"text": "Detected pattern matching password_literal. Rotate the credential and move to a secret manager."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "critical", "confidence": 1.0}}, {"id": "scanner-1ab2d6d8d24148d2", "name": "Insecure pattern 'node_child_process' in routes/admin.js:699", "shortDescription": {"text": "Insecure pattern 'node_child_process' in routes/admin.js:699"}, "fullDescription": {"text": "Found a known-risky pattern (node_child_process). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-8712f273911bccda", "name": "Insecure pattern 'node_child_process' in routes/pipeline.js:7", "shortDescription": {"text": "Insecure pattern 'node_child_process' in routes/pipeline.js:7"}, "fullDescription": {"text": "Found a known-risky pattern (node_child_process). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-bca12997c57466f3", "name": "Insecure pattern 'node_child_process' in routes/webhook.js:5", "shortDescription": {"text": "Insecure pattern 'node_child_process' in routes/webhook.js:5"}, "fullDescription": {"text": "Found a known-risky pattern (node_child_process). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-192ab3c65adb9366", "name": "Insecure pattern 'node_child_process' in core/version.js:6", "shortDescription": {"text": "Insecure pattern 'node_child_process' in core/version.js:6"}, "fullDescription": {"text": "Found a known-risky pattern (node_child_process). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-67b793a2a152087d", "name": "Insecure pattern 'node_child_process' in skills/lexiang_classify.js:2", "shortDescription": {"text": "Insecure pattern 'node_child_process' in skills/lexiang_classify.js:2"}, "fullDescription": {"text": "Found a known-risky pattern (node_child_process). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-8a3263ed8c075f8d", "name": "Insecure pattern 'node_child_process' in skills/lexiang_intent.js:2", "shortDescription": {"text": "Insecure pattern 'node_child_process' in skills/lexiang_intent.js:2"}, "fullDescription": {"text": "Found a known-risky pattern (node_child_process). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-c6373e34b68a17b3", "name": "Insecure pattern 'node_child_process' in skills/lexiang_pipeline.js:2", "shortDescription": {"text": "Insecure pattern 'node_child_process' in skills/lexiang_pipeline.js:2"}, "fullDescription": {"text": "Found a known-risky pattern (node_child_process). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-30abe890412c0196", "name": "Insecure pattern 'node_child_process' in skills/lexiang_filter.js:2", "shortDescription": {"text": "Insecure pattern 'node_child_process' in skills/lexiang_filter.js:2"}, "fullDescription": {"text": "Found a known-risky pattern (node_child_process). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-b5157e5713064183", "name": "Insecure pattern 'direct_innerhtml_assignment' in public/changelog.html:150", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in public/changelog.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-d238d3681950d9cb", "name": "Insecure pattern 'direct_innerhtml_assignment' in public/js/portal.js:172", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in public/js/portal.js:172"}, "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-966a7ec4ce8914e2", "name": "Insecure pattern 'direct_innerhtml_assignment' in public/js/app.js:75", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in public/js/app.js:75"}, "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-4978be0ffc1ef4e0", "name": "Insecure pattern 'insert_adjacent_html' in public/js/app.js:254", "shortDescription": {"text": "Insecure pattern 'insert_adjacent_html' in public/js/app.js:254"}, "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-183b9f52aaac3dab", "name": "Insecure pattern 'direct_innerhtml_assignment' in public/js/fullscreen-chat.js:236", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in public/js/fullscreen-chat.js:236"}, "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-71199d00bbb97db4", "name": "Insecure pattern 'insert_adjacent_html' in public/js/fullscreen-chat.js:344", "shortDescription": {"text": "Insecure pattern 'insert_adjacent_html' in public/js/fullscreen-chat.js:344"}, "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-163c3050ae67cfcf", "name": "Insecure pattern 'direct_innerhtml_assignment' in public/admin/workbench-data.js:24", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in public/admin/workbench-data.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-7c53128d93ee8b03", "name": "Insecure pattern 'direct_outerhtml_assignment' in public/admin/workbench-data.js:244", "shortDescription": {"text": "Insecure pattern 'direct_outerhtml_assignment' in public/admin/workbench-data.js:244"}, "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-a40c792855fdb664", "name": "Insecure pattern 'insert_adjacent_html' in public/admin/workbench-data.js:1349", "shortDescription": {"text": "Insecure pattern 'insert_adjacent_html' in public/admin/workbench-data.js:1349"}, "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-ffb3b5505604f186", "name": "Insecure pattern 'document_write' in public/admin/workbench.html:17", "shortDescription": {"text": "Insecure pattern 'document_write' in public/admin/workbench.html:17"}, "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-1865f50ee79e8e79", "name": "Insecure pattern 'direct_innerhtml_assignment' in public/admin/workbench.html:471", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in public/admin/workbench.html:471"}, "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-47bb3962abed30e4", "name": "Insecure pattern 'direct_innerhtml_assignment' in public/admin/workbench-quality.js:528", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in public/admin/workbench-quality.js:528"}, "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-20c070e2a818a2e2", "name": "Insecure pattern 'direct_innerhtml_assignment' in public/admin/workbench-v1.html:1720", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in public/admin/workbench-v1.html:1720"}, "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-10db45282435ef56", "name": "Insecure pattern 'direct_innerhtml_assignment' in public/admin/workbench-geo.js:156", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in public/admin/workbench-geo.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-b5dc5bea2dc2b23e", "name": "Insecure pattern 'insert_adjacent_html' in public/admin/workbench-geo.js:1634", "shortDescription": {"text": "Insecure pattern 'insert_adjacent_html' in public/admin/workbench-geo.js:1634"}, "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-1d189d42f9d0c779", "name": "Insecure pattern 'direct_innerhtml_assignment' in public/admin/ops-lite.html:42", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in public/admin/ops-lite.html:42"}, "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-53e16b2893f975d3", "name": "Insecure pattern 'direct_innerhtml_assignment' in public/admin/workbench-pipeline.js:638", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in public/admin/workbench-pipeline.js:638"}, "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-7e6fbe634bdac790", "name": "Insecure pattern 'direct_innerhtml_assignment' in public/admin/workbench-ops.js:645", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in public/admin/workbench-ops.js:645"}, "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-9a5aeeaef6f3de50", "name": "Insecure pattern 'direct_innerhtml_assignment' in public/admin/workbench-report.js:215", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in public/admin/workbench-report.js:215"}, "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-ecf586662538e45d", "name": "Insecure pattern 'direct_innerhtml_assignment' in public/admin/workbench-ai.js:108", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in public/admin/workbench-ai.js:108"}, "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-ede9eec5d0a5046c", "name": "Insecure pattern 'direct_innerhtml_assignment' in public/admin/workbench-employee.js:15", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in public/admin/workbench-employee.js:15"}, "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-aedcd1a3b5477016", "name": "Insecure pattern 'direct_innerhtml_assignment' in public/admin/index-legacy.html:804", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in public/admin/index-legacy.html:804"}, "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-d091e703f186f6c7", "name": "Insecure pattern 'direct_outerhtml_assignment' in public/admin/index-legacy.html:2838", "shortDescription": {"text": "Insecure pattern 'direct_outerhtml_assignment' in public/admin/index-legacy.html:2838"}, "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-0f5580886336c92e", "name": "Insecure pattern 'insert_adjacent_html' in public/admin/index-legacy.html:3943", "shortDescription": {"text": "Insecure pattern 'insert_adjacent_html' in public/admin/index-legacy.html:3943"}, "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-7c24b2a327941371", "name": "Insecure pattern 'direct_innerhtml_assignment' in public/admin/workbench-pages.js:6", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in public/admin/workbench-pages.js:6"}, "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-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-fe29ed7c37405ff7", "name": "Very large file: scripts/gen_wiki_full.py (3472 lines)", "shortDescription": {"text": "Very large file: scripts/gen_wiki_full.py (3472 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-4ecd7ad01e202b8e", "name": "Very large file: scripts/gen_wiki.py (1563 lines)", "shortDescription": {"text": "Very large file: scripts/gen_wiki.py (1563 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-d1ec8c1aa3f15913", "name": "Very large file: public/js/app.js (4240 lines)", "shortDescription": {"text": "Very large file: public/js/app.js (4240 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-04cddc626d9892fb", "name": "Very large file: public/admin/workbench-data.js (2158 lines)", "shortDescription": {"text": "Very large file: public/admin/workbench-data.js (2158 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-fc402a68e1bd0df5", "name": "Very large file: public/admin/workbench-geo.js (1640 lines)", "shortDescription": {"text": "Very large file: public/admin/workbench-geo.js (1640 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-ae2899df6c964338", "name": "Very large file: public/admin/workbench-pipeline.js (2022 lines)", "shortDescription": {"text": "Very large file: public/admin/workbench-pipeline.js (2022 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-b0234e8696b5d605", "name": "Very large file: public/admin/workbench-ai.js (1530 lines)", "shortDescription": {"text": "Very large file: public/admin/workbench-ai.js (1530 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-1c06b7ca55531bb0", "name": "Very large file: public/admin/workbench-pages.js (3318 lines)", "shortDescription": {"text": "Very large file: public/admin/workbench-pages.js (3318 lines)"}, "fullDescription": {"text": "Files with >800 lines often hide complexity hotspots and discourage tests."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-6893a6c8b0861585", "name": "Very low test-to-source ratio", "shortDescription": {"text": "Very low test-to-source ratio"}, "fullDescription": {"text": "2 test file(s) for 143 source file(s) (ratio 0.01). Consider adding integration or unit tests for critical paths."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-141b30a41e03817b", "name": "No license file detected", "shortDescription": {"text": "No license file detected"}, "fullDescription": {"text": "No LICENSE/COPYING/NOTICE file was found. Generated repositories often omit licensing, which blocks reuse and automated intake."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-faccb9061e9b52a0", "name": "No README detected", "shortDescription": {"text": "No README detected"}, "fullDescription": {"text": "No README file was found. Generated repos without README context are hard to operate, validate, or safely hand off."}, "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 312 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 111 placeholder/mock markers across 22 source files. This often means the repo looks complete while core flows still use generated scaffolding or fake data."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-2d0c7b7ab8f8aacf", "name": "Critical user flow still appears backed by mock or placeholder data", "shortDescription": {"text": "Critical user flow still appears backed by mock or placeholder data"}, "fullDescription": {"text": "A payment/auth/admin/order/billing-style flow contains mock, fake, TODO, dummy, or placeholder markers in runtime source. In the Fable corpus this is a high-leverage completeness smell: the app can look finished while the money, identity, or tenant flow is still scaffolded."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-b9088664ace7f748", "name": "Composite production-readiness gap", "shortDescription": {"text": "Composite production-readiness gap"}, "fullDescription": {"text": "Multiple low-cost hardening controls are missing together: license, ci, 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-749d4bc1bd66df5f", "name": "Agent instructions exist but release-hardening basics are missing", "shortDescription": {"text": "Agent instructions exist but release-hardening basics are missing"}, "fullDescription": {"text": "AI-coder instruction files were found, but the repo is missing license, ci, operator-readme. Treat this as a contract gap: the agent is guided, but the generated output is not yet guarded by the controls that make it repeatable."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-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-bea357a6497a2d5d", "name": "Agent authority lacks a verifier contract: CLAUDE.md", "shortDescription": {"text": "Agent authority lacks a verifier contract: CLAUDE.md"}, "fullDescription": {"text": "This agent instruction grants code or shell authority but does not state the verification gate that decides promotion. The recurring safe pattern is: LLM proposes; deterministic tests/build/security checks verify; only verified code promotes."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-2679282aa1c484b5", "name": "Agent authority lacks a verifier contract: AGENTS.md", "shortDescription": {"text": "Agent authority lacks a verifier contract: AGENTS.md"}, "fullDescription": {"text": "This agent instruction grants code or shell authority but does not state the verification gate that decides promotion. The recurring safe pattern is: LLM proposes; deterministic tests/build/security checks verify; only verified code promotes."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-6a4d00d02bb53bb4", "name": "Agent authority lacks a verifier contract: .claude/skills/lexiang-deploy/SKILL.md", "shortDescription": {"text": "Agent authority lacks a verifier contract: .claude/skills/lexiang-deploy/SKILL.md"}, "fullDescription": {"text": "This agent instruction grants code or shell authority but does not state the verification gate that decides promotion. The recurring safe pattern is: LLM proposes; deterministic tests/build/security checks verify; only verified code promotes."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-3ab6b4273f1b39b9", "name": "Agent authority lacks a verifier contract: .claude/skills/lexiang-ai-flow/SKILL.md", "shortDescription": {"text": "Agent authority lacks a verifier contract: .claude/skills/lexiang-ai-flow/SKILL.md"}, "fullDescription": {"text": "This agent instruction grants code or shell authority but does not state the verification gate that decides promotion. The recurring safe pattern is: LLM proposes; deterministic tests/build/security checks verify; only verified code promotes."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-2573a61d7d023080", "name": "Agent authority lacks a verifier contract: .claude/skills/lexiang-dev/SKILL.md", "shortDescription": {"text": "Agent authority lacks a verifier contract: .claude/skills/lexiang-dev/SKILL.md"}, "fullDescription": {"text": "This agent instruction grants code or shell authority but does not state the verification gate that decides promotion. The recurring safe pattern is: LLM proposes; deterministic tests/build/security checks verify; only verified code promotes."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-b24a7b19b0edeb38", "name": "Agent authority lacks a verifier contract: .claude/skills/lenovo-leai-pc-design/references/component-patterns.md", "shortDescription": {"text": "Agent authority lacks a verifier contract: .claude/skills/lenovo-leai-pc-design/references/component-patterns.md"}, "fullDescription": {"text": "This agent instruction grants code or shell authority but does not state the verification gate that decides promotion. The recurring safe pattern is: LLM proposes; deterministic tests/build/security checks verify; only verified code promotes."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-011b27ccf41ce3da", "name": "Agent authority lacks a verifier contract: .claude/skills/lenovo-leai-pc-design/references/fullscreen-dialog-framework.m", "shortDescription": {"text": "Agent authority lacks a verifier contract: .claude/skills/lenovo-leai-pc-design/references/fullscreen-dialog-framework.md"}, "fullDescription": {"text": "This agent instruction grants code or shell authority but does not state the verification gate that decides promotion. The recurring safe pattern is: LLM proposes; deterministic tests/build/security checks verify; only verified code promotes."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-1469cc7e36533fc8", "name": "Agent authority lacks a verifier contract: .claude/skills/lenovo-leai-pc-design/references/real-pc-dialog-states.md", "shortDescription": {"text": "Agent authority lacks a verifier contract: .claude/skills/lenovo-leai-pc-design/references/real-pc-dialog-states.md"}, "fullDescription": {"text": "This agent instruction grants code or shell authority but does not state the verification gate that decides promotion. The recurring safe pattern is: LLM proposes; deterministic tests/build/security checks verify; only verified code promotes."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-b64e9c7b5bd5dda2", "name": "Agent authority lacks a verifier contract: .claude/skills/lenovo-leai-pc-design/references/pc-design-system.md", "shortDescription": {"text": "Agent authority lacks a verifier contract: .claude/skills/lenovo-leai-pc-design/references/pc-design-system.md"}, "fullDescription": {"text": "This agent instruction grants code or shell authority but does not state the verification gate that decides promotion. The recurring safe pattern is: LLM proposes; deterministic tests/build/security checks verify; only verified code promotes."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-83b8844b61d5baf7", "name": "Agent authority lacks a verifier contract: .claude/skills/lenovo-leai-pc-design/references/layout-rules.md", "shortDescription": {"text": "Agent authority lacks a verifier contract: .claude/skills/lenovo-leai-pc-design/references/layout-rules.md"}, "fullDescription": {"text": "This agent instruction grants code or shell authority but does not state the verification gate that decides promotion. The recurring safe pattern is: LLM proposes; deterministic tests/build/security checks verify; only verified code promotes."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-e725d2ab884fbd49", "name": "Multiple root agent instruction files without precedence", "shortDescription": {"text": "Multiple root agent instruction files without precedence"}, "fullDescription": {"text": "The repo has multiple top-level AI-coder instruction files. Without precedence rules, different agents may follow different policies."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-b2745820179edf4a", "name": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/weekly_refresh.js:75", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/weekly_refresh.js:75"}, "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-f926ec445d98a70d", "name": "Legacy-named symbol `deleteOld` in scripts/gen_qa.js:49", "shortDescription": {"text": "Legacy-named symbol `deleteOld` in scripts/gen_qa.js:49"}, "fullDescription": {"text": "Names with suffixes like `_old`, `_v1`, `_deprecated` usually indicate replaced-but-not-removed code (typical AI-coder leftover). Confirm and delete, or rename if it's the active version."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-e024167e59be8b43", "name": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/gen_qa.js:11", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/gen_qa.js:11"}, "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-3fcf9f23ea380a07", "name": "Legacy-named symbol `deleteOld` in scripts/gen_qa_full.js:66", "shortDescription": {"text": "Legacy-named symbol `deleteOld` in scripts/gen_qa_full.js:66"}, "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-5b4d1a774c4c594e", "name": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/gen_qa_full.js:13", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/gen_qa_full.js:13"}, "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-49e81e8300c2ae42", "name": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/import_from_openapi.js:18", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/import_from_openapi.js:18"}, "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-11883162f2d7f67e", "name": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/ocr_image_docs.js:20", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/ocr_image_docs.js:20"}, "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-66814ac20b844285", "name": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/crawl_biz.js:17", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/crawl_biz.js:17"}, "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-486b163b8f3d688b", "name": "Legacy-named symbol `deleteOld` in scripts/gen_qa_claude.js:75", "shortDescription": {"text": "Legacy-named symbol `deleteOld` in scripts/gen_qa_claude.js:75"}, "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-73e8380513514319", "name": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/gen_qa_claude.js:15", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/gen_qa_claude.js:15"}, "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-82ac8ae51084a50e", "name": "Legacy-named symbol `\u4ecegen_qa_v2` in scripts/test_qa_v2.js:6", "shortDescription": {"text": "Legacy-named symbol `\u4ecegen_qa_v2` in scripts/test_qa_v2.js:6"}, "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-78412649ec1c6a06", "name": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/gen_qa_v2.js:167", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/gen_qa_v2.js:167"}, "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-e3118ccd9f4bbe76", "name": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/regen_qa_guides.js:72", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/regen_qa_guides.js:72"}, "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-e203de7ad10abc45", "name": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/ocr_test.js:18", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/ocr_test.js:18"}, "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-410e662b68523b24", "name": "Legacy-named symbol `navOld` in routes/product_detail_images.js:32", "shortDescription": {"text": "Legacy-named symbol `navOld` in routes/product_detail_images.js:32"}, "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-74700dfbd5d5fe2a", "name": "`fetch()` without try/.catch or AbortSignal \u2014 core/memory.js:44", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 core/memory.js:44"}, "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-1b4023b4c4adc329", "name": "`fetch()` without try/.catch or AbortSignal \u2014 core/profiler.js:14", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 core/profiler.js:14"}, "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-8a21184cec01db34", "name": "`fetch()` without try/.catch or AbortSignal \u2014 core/compressor.js:49", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 core/compressor.js:49"}, "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-fbca9d8ec84fd70a", "name": "Legacy-named symbol `fuzzyOld` in skills/pipeline_update_rules.js:70", "shortDescription": {"text": "Legacy-named symbol `fuzzyOld` in skills/pipeline_update_rules.js:70"}, "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-c31062507cb3dca9", "name": "`fetch()` without try/.catch or AbortSignal \u2014 public/js/app.js:1133", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 public/js/app.js:1133"}, "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-6dbddca314a729eb", "name": "`fetch()` without try/.catch or AbortSignal \u2014 public/admin/workbench-data.js:1395", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 public/admin/workbench-data.js:1395"}, "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-6f6dc5fe3dd4062f", "name": "`fetch()` without try/.catch or AbortSignal \u2014 public/admin/workbench-geo.js:197", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 public/admin/workbench-geo.js:197"}, "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-eeb452512b8afb30", "name": "`fetch()` without try/.catch or AbortSignal \u2014 public/admin/workbench-ai.js:955", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 public/admin/workbench-ai.js:955"}, "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-50ae843ab0a86454", "name": "`fetch()` without try/.catch or AbortSignal \u2014 knowledge/ingest.js:85", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 knowledge/ingest.js:85"}, "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-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:\nscripts/enrich_brand_news.py:extract_body, scripts/crawl_brand_full.py:extract_body\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-fb88c9ecb42e410c", "name": "Dangling fetch: POST https://open.feishu.cn/open-apis/auth/v3/tenant_access_token/internal (scripts/weekly_refresh.js:68", "shortDescription": {"text": "Dangling fetch: POST https://open.feishu.cn/open-apis/auth/v3/tenant_access_token/internal (scripts/weekly_refresh.js:68)"}, "fullDescription": {"text": "`scripts/weekly_refresh.js:68` calls `POST https://open.feishu.cn/open-apis/auth/v3/tenant_access_token/internal` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/open.feishu.cn/open-apis/auth/v3/tenant_access_token/internal`\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-5699b90c8e0e44f1", "name": "Dangling fetch: POST https://open.feishu.cn/open-apis/im/v1/messages?receive_id_type=${rcvType} (scripts/weekly_refresh.", "shortDescription": {"text": "Dangling fetch: POST https://open.feishu.cn/open-apis/im/v1/messages?receive_id_type=${rcvType} (scripts/weekly_refresh.js:75)"}, "fullDescription": {"text": "`scripts/weekly_refresh.js:75` calls `POST https://open.feishu.cn/open-apis/im/v1/messages?receive_id_type=${rcvType}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/open.feishu.cn/open-apis/im/v1/messages`\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-46f9b70261f78559", "name": "Dangling fetch: POST https://dashscope.aliyuncs.com/compatible-mode/v1/chat/completions (scripts/gen_qa.js:11)", "shortDescription": {"text": "Dangling fetch: POST https://dashscope.aliyuncs.com/compatible-mode/v1/chat/completions (scripts/gen_qa.js:11)"}, "fullDescription": {"text": "`scripts/gen_qa.js:11` calls `POST https://dashscope.aliyuncs.com/compatible-mode/v1/chat/completions` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/dashscope.aliyuncs.com/compatible-mode/v1/chat/completions`\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-4d138b808a55f138", "name": "Dangling fetch: POST https://dashscope.aliyuncs.com/compatible-mode/v1/chat/completions (scripts/gen_qa_full.js:13)", "shortDescription": {"text": "Dangling fetch: POST https://dashscope.aliyuncs.com/compatible-mode/v1/chat/completions (scripts/gen_qa_full.js:13)"}, "fullDescription": {"text": "`scripts/gen_qa_full.js:13` calls `POST https://dashscope.aliyuncs.com/compatible-mode/v1/chat/completions` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/dashscope.aliyuncs.com/compatible-mode/v1/chat/completions`\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-1b38603fd2afd669", "name": "Dangling fetch: POST https://dashscope.aliyuncs.com/compatible-mode/v1/chat/completions (scripts/ocr_image_docs.js:20)", "shortDescription": {"text": "Dangling fetch: POST https://dashscope.aliyuncs.com/compatible-mode/v1/chat/completions (scripts/ocr_image_docs.js:20)"}, "fullDescription": {"text": "`scripts/ocr_image_docs.js:20` calls `POST https://dashscope.aliyuncs.com/compatible-mode/v1/chat/completions` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/dashscope.aliyuncs.com/compatible-mode/v1/chat/completions`\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-b50101bd7ae203db", "name": "Dangling fetch: POST https://dashscope.aliyuncs.com/compatible-mode/v1/chat/completions (scripts/ocr_image_docs.js:66)", "shortDescription": {"text": "Dangling fetch: POST https://dashscope.aliyuncs.com/compatible-mode/v1/chat/completions (scripts/ocr_image_docs.js:66)"}, "fullDescription": {"text": "`scripts/ocr_image_docs.js:66` calls `POST https://dashscope.aliyuncs.com/compatible-mode/v1/chat/completions` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/dashscope.aliyuncs.com/compatible-mode/v1/chat/completions`\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-2c02314c688a5cf4", "name": "Dangling fetch: POST https://dashscope.aliyuncs.com/compatible-mode/v1/chat/completions (scripts/test_qa_v2.js:99)", "shortDescription": {"text": "Dangling fetch: POST https://dashscope.aliyuncs.com/compatible-mode/v1/chat/completions (scripts/test_qa_v2.js:99)"}, "fullDescription": {"text": "`scripts/test_qa_v2.js:99` calls `POST https://dashscope.aliyuncs.com/compatible-mode/v1/chat/completions` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/dashscope.aliyuncs.com/compatible-mode/v1/chat/completions`\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-5fa600a67dd1821d", "name": "Dangling fetch: POST https://dashscope.aliyuncs.com/compatible-mode/v1/chat/completions (scripts/gen_qa_v2.js:167)", "shortDescription": {"text": "Dangling fetch: POST https://dashscope.aliyuncs.com/compatible-mode/v1/chat/completions (scripts/gen_qa_v2.js:167)"}, "fullDescription": {"text": "`scripts/gen_qa_v2.js:167` calls `POST https://dashscope.aliyuncs.com/compatible-mode/v1/chat/completions` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/dashscope.aliyuncs.com/compatible-mode/v1/chat/completions`\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-d94ca4ee342dc706", "name": "Dangling fetch: POST https://dashscope.aliyuncs.com/compatible-mode/v1/chat/completions (scripts/regen_qa_guides.js:72)", "shortDescription": {"text": "Dangling fetch: POST https://dashscope.aliyuncs.com/compatible-mode/v1/chat/completions (scripts/regen_qa_guides.js:72)"}, "fullDescription": {"text": "`scripts/regen_qa_guides.js:72` calls `POST https://dashscope.aliyuncs.com/compatible-mode/v1/chat/completions` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/dashscope.aliyuncs.com/compatible-mode/v1/chat/completions`\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-dd56fa3b0ecfc350", "name": "Dangling fetch: POST https://dashscope.aliyuncs.com/compatible-mode/v1/chat/completions (scripts/ocr_test.js:18)", "shortDescription": {"text": "Dangling fetch: POST https://dashscope.aliyuncs.com/compatible-mode/v1/chat/completions (scripts/ocr_test.js:18)"}, "fullDescription": {"text": "`scripts/ocr_test.js:18` calls `POST https://dashscope.aliyuncs.com/compatible-mode/v1/chat/completions` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/dashscope.aliyuncs.com/compatible-mode/v1/chat/completions`\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-8d6e0b91f4c9b1d5", "name": "Dangling fetch: POST https://dashscope.aliyuncs.com/compatible-mode/v1/chat/completions (scripts/ocr_test.js:50)", "shortDescription": {"text": "Dangling fetch: POST https://dashscope.aliyuncs.com/compatible-mode/v1/chat/completions (scripts/ocr_test.js:50)"}, "fullDescription": {"text": "`scripts/ocr_test.js:50` calls `POST https://dashscope.aliyuncs.com/compatible-mode/v1/chat/completions` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/dashscope.aliyuncs.com/compatible-mode/v1/chat/completions`\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-86eea686b71a716b", "name": "Dangling fetch: GET /api/product/${encodeURIComponent(sku)}/detail-images (public/js/app.js:95)", "shortDescription": {"text": "Dangling fetch: GET /api/product/${encodeURIComponent(sku)}/detail-images (public/js/app.js:95)"}, "fullDescription": {"text": "`public/js/app.js:95` calls `GET /api/product/${encodeURIComponent(sku)}/detail-images` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/product/<p>/detail-images`\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-ef58201b48d98749", "name": "Dangling fetch: POST /api/chat/quick (public/js/app.js:752)", "shortDescription": {"text": "Dangling fetch: POST /api/chat/quick (public/js/app.js:752)"}, "fullDescription": {"text": "`public/js/app.js:752` calls `POST /api/chat/quick` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/chat/quick`\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-4606ade96ce5badf", "name": "Dangling fetch: GET /api/auth/me (public/js/app.js:1101)", "shortDescription": {"text": "Dangling fetch: GET /api/auth/me (public/js/app.js:1101)"}, "fullDescription": {"text": "`public/js/app.js:1101` calls `GET /api/auth/me` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/auth/me`\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-5ac682f90aacffa7", "name": "Dangling fetch: POST /api/auth/send-code (public/js/app.js:1133)", "shortDescription": {"text": "Dangling fetch: POST /api/auth/send-code (public/js/app.js:1133)"}, "fullDescription": {"text": "`public/js/app.js:1133` calls `POST /api/auth/send-code` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/auth/send-code`\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-2e79758af87725c5", "name": "Dangling fetch: POST /api/auth/login (public/js/app.js:1143)", "shortDescription": {"text": "Dangling fetch: POST /api/auth/login (public/js/app.js:1143)"}, "fullDescription": {"text": "`public/js/app.js:1143` calls `POST /api/auth/login` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/auth/login`\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-9b1deb009e6474e7", "name": "Dangling fetch: POST /api/auth/logout (public/js/app.js:1155)", "shortDescription": {"text": "Dangling fetch: POST /api/auth/logout (public/js/app.js:1155)"}, "fullDescription": {"text": "`public/js/app.js:1155` calls `POST /api/auth/logout` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/auth/logout`\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-5ce054ec1b3b4c61", "name": "Dangling fetch: POST /api/chat/stream (public/js/app.js:1265)", "shortDescription": {"text": "Dangling fetch: POST /api/chat/stream (public/js/app.js:1265)"}, "fullDescription": {"text": "`public/js/app.js:1265` calls `POST /api/chat/stream` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/chat/stream`\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-4b131c441181f109", "name": "Dangling fetch: GET /api/stores/geocode?address=${encodeURIComponent(address)} (public/js/app.js:2645)", "shortDescription": {"text": "Dangling fetch: GET /api/stores/geocode?address=${encodeURIComponent(address)} (public/js/app.js:2645)"}, "fullDescription": {"text": "`public/js/app.js:2645` calls `GET /api/stores/geocode?address=${encodeURIComponent(address)}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/stores/geocode`\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-beae99ac9ac44c05", "name": "Dangling fetch: GET /api/stores/nearby?lat=${encodeURIComponent(geo.lat)}&lng=${encodeURIComponent(geo.lng)} (public/js/", "shortDescription": {"text": "Dangling fetch: GET /api/stores/nearby?lat=${encodeURIComponent(geo.lat)}&lng=${encodeURIComponent(geo.lng)} (public/js/app.js:2647)"}, "fullDescription": {"text": "`public/js/app.js:2647` calls `GET /api/stores/nearby?lat=${encodeURIComponent(geo.lat)}&lng=${encodeURIComponent(geo.lng)}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/stores/nearby`\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-17c76407e032a956", "name": "Dangling fetch: GET /api/leai/auth (public/js/app.js:2999)", "shortDescription": {"text": "Dangling fetch: GET /api/leai/auth (public/js/app.js:2999)"}, "fullDescription": {"text": "`public/js/app.js:2999` calls `GET /api/leai/auth` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/leai/auth`\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-867915db269199f5", "name": "Dangling fetch: POST /api/leai/chat (public/js/app.js:3006)", "shortDescription": {"text": "Dangling fetch: POST /api/leai/chat (public/js/app.js:3006)"}, "fullDescription": {"text": "`public/js/app.js:3006` calls `POST /api/leai/chat` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/leai/chat`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-9be6d19a323b579d", "name": "Dangling fetch: POST /api/chat/quick (public/js/app.js:3221)", "shortDescription": {"text": "Dangling fetch: POST /api/chat/quick (public/js/app.js:3221)"}, "fullDescription": {"text": "`public/js/app.js:3221` calls `POST /api/chat/quick` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/chat/quick`\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-bb7ca96d3eee762a", "name": "Dangling fetch: POST /api/chat/stream (public/js/app.js:4071)", "shortDescription": {"text": "Dangling fetch: POST /api/chat/stream (public/js/app.js:4071)"}, "fullDescription": {"text": "`public/js/app.js:4071` calls `POST /api/chat/stream` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/chat/stream`\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-0bc19402b8dc63b5", "name": "Dangling fetch: POST /api/chat/stream (public/js/fullscreen-chat.js:297)", "shortDescription": {"text": "Dangling fetch: POST /api/chat/stream (public/js/fullscreen-chat.js:297)"}, "fullDescription": {"text": "`public/js/fullscreen-chat.js:297` calls `POST /api/chat/stream` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/chat/stream`\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-0148468599c8528f", "name": "Dangling fetch: GET /api/harness/skills/grouped (public/admin/workbench-data.js:4)", "shortDescription": {"text": "Dangling fetch: GET /api/harness/skills/grouped (public/admin/workbench-data.js:4)"}, "fullDescription": {"text": "`public/admin/workbench-data.js:4` calls `GET /api/harness/skills/grouped` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/harness/skills/grouped`\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-4746fbbacc6a502e", "name": "Dangling fetch: PATCH /api/admin/skills/${name} (public/admin/workbench-data.js:32)", "shortDescription": {"text": "Dangling fetch: PATCH /api/admin/skills/${name} (public/admin/workbench-data.js:32)"}, "fullDescription": {"text": "`public/admin/workbench-data.js:32` calls `PATCH /api/admin/skills/${name}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/admin/skills/<p>`\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-0a24ec6984e0aab2", "name": "Dangling fetch: GET /api/harness/roles (public/admin/workbench-data.js:41)", "shortDescription": {"text": "Dangling fetch: GET /api/harness/roles (public/admin/workbench-data.js:41)"}, "fullDescription": {"text": "`public/admin/workbench-data.js:41` calls `GET /api/harness/roles` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/harness/roles`\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-aaf02c4fc6048461", "name": "Dangling fetch: GET /health (public/admin/workbench-data.js:72)", "shortDescription": {"text": "Dangling fetch: GET /health (public/admin/workbench-data.js:72)"}, "fullDescription": {"text": "`public/admin/workbench-data.js:72` calls `GET /health` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/health`\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-cf7016f19208d576", "name": "Dangling fetch: GET /api/admin/stats (public/admin/workbench-data.js:114)", "shortDescription": {"text": "Dangling fetch: GET /api/admin/stats (public/admin/workbench-data.js:114)"}, "fullDescription": {"text": "`public/admin/workbench-data.js:114` calls `GET /api/admin/stats` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/admin/stats`\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-b7f40134d500c7f4", "name": "Dangling fetch: POST /api/knowledge/upload (public/admin/workbench-data.js:180)", "shortDescription": {"text": "Dangling fetch: POST /api/knowledge/upload (public/admin/workbench-data.js:180)"}, "fullDescription": {"text": "`public/admin/workbench-data.js:180` calls `POST /api/knowledge/upload` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/knowledge/upload`\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-2d083a5b247abe08", "name": "Dangling fetch: POST /api/admin/manual-qa (public/admin/workbench-data.js:206)", "shortDescription": {"text": "Dangling fetch: POST /api/admin/manual-qa (public/admin/workbench-data.js:206)"}, "fullDescription": {"text": "`public/admin/workbench-data.js:206` calls `POST /api/admin/manual-qa` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/admin/manual-qa`\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-feaf1804e5de4d74", "name": "Dangling fetch: GET /api/admin/conversations?limit=50 (public/admin/workbench-data.js:297)", "shortDescription": {"text": "Dangling fetch: GET /api/admin/conversations?limit=50 (public/admin/workbench-data.js:297)"}, "fullDescription": {"text": "`public/admin/workbench-data.js:297` calls `GET /api/admin/conversations?limit=50` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/admin/conversations`\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-d82d36b5cac8d6f6", "name": "Dangling fetch: GET /api/admin/conversations/${convId} (public/admin/workbench-data.js:319)", "shortDescription": {"text": "Dangling fetch: GET /api/admin/conversations/${convId} (public/admin/workbench-data.js:319)"}, "fullDescription": {"text": "`public/admin/workbench-data.js:319` calls `GET /api/admin/conversations/${convId}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/admin/conversations/<p>`\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-0722335d775b7f15", "name": "Dangling fetch: GET /api/admin/query-analysis (public/admin/workbench-data.js:342)", "shortDescription": {"text": "Dangling fetch: GET /api/admin/query-analysis (public/admin/workbench-data.js:342)"}, "fullDescription": {"text": "`public/admin/workbench-data.js:342` calls `GET /api/admin/query-analysis` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/admin/query-analysis`\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-7e73663c975a66c4", "name": "Dangling fetch: POST /api/harness/chat (public/admin/workbench-data.js:395)", "shortDescription": {"text": "Dangling fetch: POST /api/harness/chat (public/admin/workbench-data.js:395)"}, "fullDescription": {"text": "`public/admin/workbench-data.js:395` calls `POST /api/harness/chat` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/harness/chat`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-b89e4b847d6e632d", "name": "Dangling fetch: GET /api/admin/staff/stats (public/admin/workbench-data.js:419)", "shortDescription": {"text": "Dangling fetch: GET /api/admin/staff/stats (public/admin/workbench-data.js:419)"}, "fullDescription": {"text": "`public/admin/workbench-data.js:419` calls `GET /api/admin/staff/stats` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/admin/staff/stats`\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-3080cb166cbb579e", "name": "Dangling fetch: GET /api/admin/user-profiles (public/admin/workbench-data.js:460)", "shortDescription": {"text": "Dangling fetch: GET /api/admin/user-profiles (public/admin/workbench-data.js:460)"}, "fullDescription": {"text": "`public/admin/workbench-data.js:460` calls `GET /api/admin/user-profiles` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/admin/user-profiles`\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-6fcaaa034337f907", "name": "Dangling fetch: GET /api/admin/users (public/admin/workbench-data.js:478)", "shortDescription": {"text": "Dangling fetch: GET /api/admin/users (public/admin/workbench-data.js:478)"}, "fullDescription": {"text": "`public/admin/workbench-data.js:478` calls `GET /api/admin/users` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/admin/users`\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-fb3032069e2cbfbd", "name": "Dangling fetch: POST /api/admin/users (public/admin/workbench-data.js:492)", "shortDescription": {"text": "Dangling fetch: POST /api/admin/users (public/admin/workbench-data.js:492)"}, "fullDescription": {"text": "`public/admin/workbench-data.js:492` calls `POST /api/admin/users` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/admin/users`\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-522202bd158247eb", "name": "Dangling fetch: DELETE /api/admin/users/${id} (public/admin/workbench-data.js:498)", "shortDescription": {"text": "Dangling fetch: DELETE /api/admin/users/${id} (public/admin/workbench-data.js:498)"}, "fullDescription": {"text": "`public/admin/workbench-data.js:498` calls `DELETE /api/admin/users/${id}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/admin/users/<p>`\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-85320390ee207876", "name": "Dangling fetch: GET /api/admin/personas (public/admin/workbench-data.js:505)", "shortDescription": {"text": "Dangling fetch: GET /api/admin/personas (public/admin/workbench-data.js:505)"}, "fullDescription": {"text": "`public/admin/workbench-data.js:505` calls `GET /api/admin/personas` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/admin/personas`\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-1986a61daed36b8a", "name": "Dangling fetch: POST /api/admin/personas (public/admin/workbench-data.js:529)", "shortDescription": {"text": "Dangling fetch: POST /api/admin/personas (public/admin/workbench-data.js:529)"}, "fullDescription": {"text": "`public/admin/workbench-data.js:529` calls `POST /api/admin/personas` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/admin/personas`\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-af9aa7cb5c5914aa", "name": "Dangling fetch: PUT /api/admin/personas/${id}/activate (public/admin/workbench-data.js:534)", "shortDescription": {"text": "Dangling fetch: PUT /api/admin/personas/${id}/activate (public/admin/workbench-data.js:534)"}, "fullDescription": {"text": "`public/admin/workbench-data.js:534` calls `PUT /api/admin/personas/${id}/activate` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/admin/personas/<p>/activate`\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-c77a597945b227ec", "name": "Dangling fetch: DELETE /api/admin/personas/${id} (public/admin/workbench-data.js:538)", "shortDescription": {"text": "Dangling fetch: DELETE /api/admin/personas/${id} (public/admin/workbench-data.js:538)"}, "fullDescription": {"text": "`public/admin/workbench-data.js:538` calls `DELETE /api/admin/personas/${id}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/admin/personas/<p>`\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-235354cb2b057ca5", "name": "Dangling fetch: GET /api/admin/metrics (public/admin/workbench-data.js:544)", "shortDescription": {"text": "Dangling fetch: GET /api/admin/metrics (public/admin/workbench-data.js:544)"}, "fullDescription": {"text": "`public/admin/workbench-data.js:544` calls `GET /api/admin/metrics` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/admin/metrics`\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-b907102bcc235901", "name": "Dangling fetch: POST /api/admin/metrics/collect (public/admin/workbench-data.js:572)", "shortDescription": {"text": "Dangling fetch: POST /api/admin/metrics/collect (public/admin/workbench-data.js:572)"}, "fullDescription": {"text": "`public/admin/workbench-data.js:572` calls `POST /api/admin/metrics/collect` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/admin/metrics/collect`\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-c78a94638dcbaeec", "name": "Dangling fetch: GET /api/admin/evolution-notes (public/admin/workbench-data.js:580)", "shortDescription": {"text": "Dangling fetch: GET /api/admin/evolution-notes (public/admin/workbench-data.js:580)"}, "fullDescription": {"text": "`public/admin/workbench-data.js:580` calls `GET /api/admin/evolution-notes` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/admin/evolution-notes`\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-53b55411a1784519", "name": "Dangling fetch: GET /api/admin/reflections?limit=10 (public/admin/workbench-data.js:580)", "shortDescription": {"text": "Dangling fetch: GET /api/admin/reflections?limit=10 (public/admin/workbench-data.js:580)"}, "fullDescription": {"text": "`public/admin/workbench-data.js:580` calls `GET /api/admin/reflections?limit=10` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/admin/reflections`\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-57645a7ad3e8cfe7", "name": "Dangling fetch: GET /api/admin/learning-status (public/admin/workbench-data.js:580)", "shortDescription": {"text": "Dangling fetch: GET /api/admin/learning-status (public/admin/workbench-data.js:580)"}, "fullDescription": {"text": "`public/admin/workbench-data.js:580` calls `GET /api/admin/learning-status` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/admin/learning-status`\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-837d5b1dece3879a", "name": "Dangling fetch: POST /api/admin/run-evolution (public/admin/workbench-data.js:619)", "shortDescription": {"text": "Dangling fetch: POST /api/admin/run-evolution (public/admin/workbench-data.js:619)"}, "fullDescription": {"text": "`public/admin/workbench-data.js:619` calls `POST /api/admin/run-evolution` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/admin/run-evolution`\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-f8c88d1b38ade5cf", "name": "Dangling fetch: POST /api/admin/run-learning (public/admin/workbench-data.js:623)", "shortDescription": {"text": "Dangling fetch: POST /api/admin/run-learning (public/admin/workbench-data.js:623)"}, "fullDescription": {"text": "`public/admin/workbench-data.js:623` calls `POST /api/admin/run-learning` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/admin/run-learning`\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-7fc89c901b0c72e9", "name": "Dangling fetch: GET /api/admin/regression-cases (public/admin/workbench-data.js:630)", "shortDescription": {"text": "Dangling fetch: GET /api/admin/regression-cases (public/admin/workbench-data.js:630)"}, "fullDescription": {"text": "`public/admin/workbench-data.js:630` calls `GET /api/admin/regression-cases` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/admin/regression-cases`\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-bd339f5cded03f51", "name": "Dangling fetch: POST /api/admin/regression-cases (public/admin/workbench-data.js:646)", "shortDescription": {"text": "Dangling fetch: POST /api/admin/regression-cases (public/admin/workbench-data.js:646)"}, "fullDescription": {"text": "`public/admin/workbench-data.js:646` calls `POST /api/admin/regression-cases` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/admin/regression-cases`\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-7f8740148da7aa90", "name": "Dangling fetch: DELETE /api/admin/regression-cases/${id} (public/admin/workbench-data.js:652)", "shortDescription": {"text": "Dangling fetch: DELETE /api/admin/regression-cases/${id} (public/admin/workbench-data.js:652)"}, "fullDescription": {"text": "`public/admin/workbench-data.js:652` calls `DELETE /api/admin/regression-cases/${id}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/admin/regression-cases/<p>`\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-dd97ddd390c622d7", "name": "Dangling fetch: POST /api/admin/regression-cases/run (public/admin/workbench-data.js:656)", "shortDescription": {"text": "Dangling fetch: POST /api/admin/regression-cases/run (public/admin/workbench-data.js:656)"}, "fullDescription": {"text": "`public/admin/workbench-data.js:656` calls `POST /api/admin/regression-cases/run` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/admin/regression-cases/run`\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-9b0565187f701ad6", "name": "Dangling fetch: POST /api/admin/pages (public/admin/workbench-data.js:1035)", "shortDescription": {"text": "Dangling fetch: POST /api/admin/pages (public/admin/workbench-data.js:1035)"}, "fullDescription": {"text": "`public/admin/workbench-data.js:1035` calls `POST /api/admin/pages` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/admin/pages`\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-e148dafcc6fe8093", "name": "Dangling fetch: POST /api/harness/chat (public/admin/workbench-data.js:1086)", "shortDescription": {"text": "Dangling fetch: POST /api/harness/chat (public/admin/workbench-data.js:1086)"}, "fullDescription": {"text": "`public/admin/workbench-data.js:1086` calls `POST /api/harness/chat` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/harness/chat`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-c81faa34165faa72", "name": "Dangling fetch: GET /api/admin/bot-config (public/admin/workbench-data.js:1175)", "shortDescription": {"text": "Dangling fetch: GET /api/admin/bot-config (public/admin/workbench-data.js:1175)"}, "fullDescription": {"text": "`public/admin/workbench-data.js:1175` calls `GET /api/admin/bot-config` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/admin/bot-config`\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-ac2a59e7f9a292d6", "name": "Dangling fetch: PUT /api/admin/bot-config (public/admin/workbench-data.js:1213)", "shortDescription": {"text": "Dangling fetch: PUT /api/admin/bot-config (public/admin/workbench-data.js:1213)"}, "fullDescription": {"text": "`public/admin/workbench-data.js:1213` calls `PUT /api/admin/bot-config` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/admin/bot-config`\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-e347836faf162b03", "name": "Dangling fetch: GET /api/admin/logs?limit=50 (public/admin/workbench-data.js:1222)", "shortDescription": {"text": "Dangling fetch: GET /api/admin/logs?limit=50 (public/admin/workbench-data.js:1222)"}, "fullDescription": {"text": "`public/admin/workbench-data.js:1222` calls `GET /api/admin/logs?limit=50` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/admin/logs`\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-e28158be426ec009", "name": "Dangling fetch: GET /api/admin/product-categories (public/admin/workbench-data.js:1250)", "shortDescription": {"text": "Dangling fetch: GET /api/admin/product-categories (public/admin/workbench-data.js:1250)"}, "fullDescription": {"text": "`public/admin/workbench-data.js:1250` calls `GET /api/admin/product-categories` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/admin/product-categories`\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-1f7b93c65d755086", "name": "Dangling fetch: GET /api/admin/products/stats (public/admin/workbench-data.js:1251)", "shortDescription": {"text": "Dangling fetch: GET /api/admin/products/stats (public/admin/workbench-data.js:1251)"}, "fullDescription": {"text": "`public/admin/workbench-data.js:1251` calls `GET /api/admin/products/stats` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/admin/products/stats`\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-c4e2e66ab5b7e335", "name": "Dangling fetch: GET /api/admin/products/${editId} (public/admin/workbench-data.js:1317)", "shortDescription": {"text": "Dangling fetch: GET /api/admin/products/${editId} (public/admin/workbench-data.js:1317)"}, "fullDescription": {"text": "`public/admin/workbench-data.js:1317` calls `GET /api/admin/products/${editId}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/admin/products/<p>`\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-bc86e0d6bd024f03", "name": "Dangling fetch: DELETE /api/admin/products/${id} (public/admin/workbench-data.js:1377)", "shortDescription": {"text": "Dangling fetch: DELETE /api/admin/products/${id} (public/admin/workbench-data.js:1377)"}, "fullDescription": {"text": "`public/admin/workbench-data.js:1377` calls `DELETE /api/admin/products/${id}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/admin/products/<p>`\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-aaf1960ac5e81f1e", "name": "Dangling fetch: GET /api/admin/product-categories (public/admin/workbench-data.js:1386)", "shortDescription": {"text": "Dangling fetch: GET /api/admin/product-categories (public/admin/workbench-data.js:1386)"}, "fullDescription": {"text": "`public/admin/workbench-data.js:1386` calls `GET /api/admin/product-categories` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/admin/product-categories`\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-55852bf94bb32c40", "name": "Dangling fetch: GET /api/admin/products/category-counts (public/admin/workbench-data.js:1395)", "shortDescription": {"text": "Dangling fetch: GET /api/admin/products/category-counts (public/admin/workbench-data.js:1395)"}, "fullDescription": {"text": "`public/admin/workbench-data.js:1395` calls `GET /api/admin/products/category-counts` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/admin/products/category-counts`\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-e07c94438a7d62c0", "name": "Dangling fetch: POST /api/admin/product-categories (public/admin/workbench-data.js:1415)", "shortDescription": {"text": "Dangling fetch: POST /api/admin/product-categories (public/admin/workbench-data.js:1415)"}, "fullDescription": {"text": "`public/admin/workbench-data.js:1415` calls `POST /api/admin/product-categories` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/admin/product-categories`\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-6f7fc3cb45e76af4", "name": "Dangling fetch: DELETE /api/admin/product-categories/${id} (public/admin/workbench-data.js:1423)", "shortDescription": {"text": "Dangling fetch: DELETE /api/admin/product-categories/${id} (public/admin/workbench-data.js:1423)"}, "fullDescription": {"text": "`public/admin/workbench-data.js:1423` calls `DELETE /api/admin/product-categories/${id}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/admin/product-categories/<p>`\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-b09cab0069fa3099", "name": "Dangling fetch: GET /api/admin/marketing-tasks (public/admin/workbench-data.js:1432)", "shortDescription": {"text": "Dangling fetch: GET /api/admin/marketing-tasks (public/admin/workbench-data.js:1432)"}, "fullDescription": {"text": "`public/admin/workbench-data.js:1432` calls `GET /api/admin/marketing-tasks` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/admin/marketing-tasks`\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-3498b6f5aa1b9be8", "name": "Dangling fetch: GET /api/admin/marketing-tasks (public/admin/workbench-data.js:1494)", "shortDescription": {"text": "Dangling fetch: GET /api/admin/marketing-tasks (public/admin/workbench-data.js:1494)"}, "fullDescription": {"text": "`public/admin/workbench-data.js:1494` calls `GET /api/admin/marketing-tasks` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/admin/marketing-tasks`\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-d9885cd33d3156b9", "name": "Dangling fetch: PUT /api/admin/marketing-tasks/${id}/execute (public/admin/workbench-data.js:1530)", "shortDescription": {"text": "Dangling fetch: PUT /api/admin/marketing-tasks/${id}/execute (public/admin/workbench-data.js:1530)"}, "fullDescription": {"text": "`public/admin/workbench-data.js:1530` calls `PUT /api/admin/marketing-tasks/${id}/execute` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/admin/marketing-tasks/<p>/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-0668986096a44399", "name": "Dangling fetch: DELETE /api/admin/marketing-tasks/${id} (public/admin/workbench-data.js:1538)", "shortDescription": {"text": "Dangling fetch: DELETE /api/admin/marketing-tasks/${id} (public/admin/workbench-data.js:1538)"}, "fullDescription": {"text": "`public/admin/workbench-data.js:1538` calls `DELETE /api/admin/marketing-tasks/${id}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/admin/marketing-tasks/<p>`\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-ae5431b3da4162d9", "name": "Dangling fetch: GET /api/admin/stats (public/admin/workbench-data.js:1546)", "shortDescription": {"text": "Dangling fetch: GET /api/admin/stats (public/admin/workbench-data.js:1546)"}, "fullDescription": {"text": "`public/admin/workbench-data.js:1546` calls `GET /api/admin/stats` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/admin/stats`\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-a9c635a840f888c5", "name": "Dangling fetch: GET /api/admin/experiments (public/admin/workbench-data.js:1601)", "shortDescription": {"text": "Dangling fetch: GET /api/admin/experiments (public/admin/workbench-data.js:1601)"}, "fullDescription": {"text": "`public/admin/workbench-data.js:1601` calls `GET /api/admin/experiments` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/admin/experiments`\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-416b466481bfa42d", "name": "Dangling fetch: PUT /api/admin/experiments/${id}/status (public/admin/workbench-data.js:1635)", "shortDescription": {"text": "Dangling fetch: PUT /api/admin/experiments/${id}/status (public/admin/workbench-data.js:1635)"}, "fullDescription": {"text": "`public/admin/workbench-data.js:1635` calls `PUT /api/admin/experiments/${id}/status` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/admin/experiments/<p>/status`\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-6ba05816da476760", "name": "Dangling fetch: POST /api/admin/experiments (public/admin/workbench-data.js:1666)", "shortDescription": {"text": "Dangling fetch: POST /api/admin/experiments (public/admin/workbench-data.js:1666)"}, "fullDescription": {"text": "`public/admin/workbench-data.js:1666` calls `POST /api/admin/experiments` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/admin/experiments`\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-878c1db1576daf3b", "name": "Dangling fetch: POST /api/admin/backup (public/admin/workbench-data.js:1679)", "shortDescription": {"text": "Dangling fetch: POST /api/admin/backup (public/admin/workbench-data.js:1679)"}, "fullDescription": {"text": "`public/admin/workbench-data.js:1679` calls `POST /api/admin/backup` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/admin/backup`\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-c359b758a7644db3", "name": "Dangling fetch: POST /api/admin/restart (public/admin/workbench-data.js:1688)", "shortDescription": {"text": "Dangling fetch: POST /api/admin/restart (public/admin/workbench-data.js:1688)"}, "fullDescription": {"text": "`public/admin/workbench-data.js:1688` calls `POST /api/admin/restart` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/admin/restart`\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-8b7c6412df6c1b9b", "name": "Dangling fetch: GET /api/lenovo/support/articles (public/admin/workbench-data.js:1701)", "shortDescription": {"text": "Dangling fetch: GET /api/lenovo/support/articles (public/admin/workbench-data.js:1701)"}, "fullDescription": {"text": "`public/admin/workbench-data.js:1701` calls `GET /api/lenovo/support/articles` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/lenovo/support/articles`\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-805e2c39fefbb1be", "name": "Dangling fetch: GET /api/lenovo/support/drivers?keyword=${encodeURIComponent(kw)} (public/admin/workbench-data.js:1726)", "shortDescription": {"text": "Dangling fetch: GET /api/lenovo/support/drivers?keyword=${encodeURIComponent(kw)} (public/admin/workbench-data.js:1726)"}, "fullDescription": {"text": "`public/admin/workbench-data.js:1726` calls `GET /api/lenovo/support/drivers?keyword=${encodeURIComponent(kw)}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/lenovo/support/drivers`\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-0793f5fd07db3cda", "name": "Dangling fetch: GET /api/lenovo/user/order/list (public/admin/workbench-data.js:1746)", "shortDescription": {"text": "Dangling fetch: GET /api/lenovo/user/order/list (public/admin/workbench-data.js:1746)"}, "fullDescription": {"text": "`public/admin/workbench-data.js:1746` calls `GET /api/lenovo/user/order/list` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/lenovo/user/order/list`\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-c787f07c06e0b80e", "name": "Dangling fetch: GET /api/stores/geocode?address=${encodeURIComponent(address)} (public/admin/workbench-data.js:1772)", "shortDescription": {"text": "Dangling fetch: GET /api/stores/geocode?address=${encodeURIComponent(address)} (public/admin/workbench-data.js:1772)"}, "fullDescription": {"text": "`public/admin/workbench-data.js:1772` calls `GET /api/stores/geocode?address=${encodeURIComponent(address)}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/stores/geocode`\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-b1660844bf697ccd", "name": "Dangling fetch: GET /api/stores/nearby?lat=${geo.lat}&lng=${geo.lng} (public/admin/workbench-data.js:1776)", "shortDescription": {"text": "Dangling fetch: GET /api/stores/nearby?lat=${geo.lat}&lng=${geo.lng} (public/admin/workbench-data.js:1776)"}, "fullDescription": {"text": "`public/admin/workbench-data.js:1776` calls `GET /api/stores/nearby?lat=${geo.lat}&lng=${geo.lng}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/stores/nearby`\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-1c2e88d42bc6e2c4", "name": "Dangling fetch: GET /aiadmin/proxy/old/cdashboard/dashboard/channel (public/admin/workbench-data.js:1921)", "shortDescription": {"text": "Dangling fetch: GET /aiadmin/proxy/old/cdashboard/dashboard/channel (public/admin/workbench-data.js:1921)"}, "fullDescription": {"text": "`public/admin/workbench-data.js:1921` calls `GET /aiadmin/proxy/old/cdashboard/dashboard/channel` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/aiadmin/proxy/old/cdashboard/dashboard/channel`\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-9a72280f01076c7a", "name": "Dangling fetch: GET /aiadmin/proxy/old/cdashboard/dashboard/area (public/admin/workbench-data.js:1922)", "shortDescription": {"text": "Dangling fetch: GET /aiadmin/proxy/old/cdashboard/dashboard/area (public/admin/workbench-data.js:1922)"}, "fullDescription": {"text": "`public/admin/workbench-data.js:1922` calls `GET /aiadmin/proxy/old/cdashboard/dashboard/area` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/aiadmin/proxy/old/cdashboard/dashboard/area`\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-d60bb5ab6420a7ea", "name": "Dangling fetch: POST /aiadmin/proxy/new/smart/touch/transformer/list (public/admin/workbench-data.js:2037)", "shortDescription": {"text": "Dangling fetch: POST /aiadmin/proxy/new/smart/touch/transformer/list (public/admin/workbench-data.js:2037)"}, "fullDescription": {"text": "`public/admin/workbench-data.js:2037` calls `POST /aiadmin/proxy/new/smart/touch/transformer/list` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/aiadmin/proxy/new/smart/touch/transformer/list`\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-8e3703dfc2a55386", "name": "Dangling fetch: GET /aiadmin/proxy/new/smart/touch/user/tag/group/all (public/admin/workbench-data.js:2064)", "shortDescription": {"text": "Dangling fetch: GET /aiadmin/proxy/new/smart/touch/user/tag/group/all (public/admin/workbench-data.js:2064)"}, "fullDescription": {"text": "`public/admin/workbench-data.js:2064` calls `GET /aiadmin/proxy/new/smart/touch/user/tag/group/all` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/aiadmin/proxy/new/smart/touch/user/tag/group/all`\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-77ba8c911af3c1da", "name": "Dangling fetch: GET /aiadmin/proxy/new/smart/touch/user/tag/profile/all (public/admin/workbench-data.js:2075)", "shortDescription": {"text": "Dangling fetch: GET /aiadmin/proxy/new/smart/touch/user/tag/profile/all (public/admin/workbench-data.js:2075)"}, "fullDescription": {"text": "`public/admin/workbench-data.js:2075` calls `GET /aiadmin/proxy/new/smart/touch/user/tag/profile/all` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/aiadmin/proxy/new/smart/touch/user/tag/profile/all`\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-81a17e45f7793dc9", "name": "Dangling fetch: GET /aiadmin/proxy/new/smart/touch/material/event/list (public/admin/workbench-data.js:2081)", "shortDescription": {"text": "Dangling fetch: GET /aiadmin/proxy/new/smart/touch/material/event/list (public/admin/workbench-data.js:2081)"}, "fullDescription": {"text": "`public/admin/workbench-data.js:2081` calls `GET /aiadmin/proxy/new/smart/touch/material/event/list` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/aiadmin/proxy/new/smart/touch/material/event/list`\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-c0ee255ad1d6056b", "name": "Dangling fetch: POST /api/geo-dashboard/sites (public/admin/workbench-geo.js:505)", "shortDescription": {"text": "Dangling fetch: POST /api/geo-dashboard/sites (public/admin/workbench-geo.js:505)"}, "fullDescription": {"text": "`public/admin/workbench-geo.js:505` calls `POST /api/geo-dashboard/sites` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/geo-dashboard/sites`\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-d324fc9423a9a951", "name": "Dangling fetch: POST /api/geo-dashboard/sites (public/admin/workbench-geo.js:853)", "shortDescription": {"text": "Dangling fetch: POST /api/geo-dashboard/sites (public/admin/workbench-geo.js:853)"}, "fullDescription": {"text": "`public/admin/workbench-geo.js:853` calls `POST /api/geo-dashboard/sites` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/geo-dashboard/sites`\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-9b6dad968faca74c", "name": "Dangling fetch: POST /api/geo-dashboard/summary (public/admin/workbench-geo.js:1293)", "shortDescription": {"text": "Dangling fetch: POST /api/geo-dashboard/summary (public/admin/workbench-geo.js:1293)"}, "fullDescription": {"text": "`public/admin/workbench-geo.js:1293` calls `POST /api/geo-dashboard/summary` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/geo-dashboard/summary`\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-dbfab65113d2d110", "name": "Dangling fetch: GET /api/pipeline/stats/history (public/admin/workbench-pipeline.js:815)", "shortDescription": {"text": "Dangling fetch: GET /api/pipeline/stats/history (public/admin/workbench-pipeline.js:815)"}, "fullDescription": {"text": "`public/admin/workbench-pipeline.js:815` calls `GET /api/pipeline/stats/history` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/pipeline/stats/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-6fe925aa7b268d20", "name": "Dangling fetch: POST /api/pipeline/classify (public/admin/workbench-pipeline.js:1261)", "shortDescription": {"text": "Dangling fetch: POST /api/pipeline/classify (public/admin/workbench-pipeline.js:1261)"}, "fullDescription": {"text": "`public/admin/workbench-pipeline.js:1261` calls `POST /api/pipeline/classify` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/pipeline/classify`\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-2e28b7cd1d602b8a", "name": "Dangling fetch: POST /api/pipeline/stats (public/admin/workbench-pipeline.js:1791)", "shortDescription": {"text": "Dangling fetch: POST /api/pipeline/stats (public/admin/workbench-pipeline.js:1791)"}, "fullDescription": {"text": "`public/admin/workbench-pipeline.js:1791` calls `POST /api/pipeline/stats` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/pipeline/stats`\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-508b1d8879cdb547", "name": "Dangling fetch: GET /api/pipeline/stats/history (public/admin/workbench-pipeline.js:1816)", "shortDescription": {"text": "Dangling fetch: GET /api/pipeline/stats/history (public/admin/workbench-pipeline.js:1816)"}, "fullDescription": {"text": "`public/admin/workbench-pipeline.js:1816` calls `GET /api/pipeline/stats/history` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/pipeline/stats/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-a75d6bb61b9fee7a", "name": "Dangling fetch: POST /api/pipeline/filter (public/admin/workbench-pipeline.js:1844)", "shortDescription": {"text": "Dangling fetch: POST /api/pipeline/filter (public/admin/workbench-pipeline.js:1844)"}, "fullDescription": {"text": "`public/admin/workbench-pipeline.js:1844` calls `POST /api/pipeline/filter` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/pipeline/filter`\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-a46de599af7ccae3", "name": "Dangling fetch: GET /health (public/admin/workbench-pipeline.js:1867)", "shortDescription": {"text": "Dangling fetch: GET /health (public/admin/workbench-pipeline.js:1867)"}, "fullDescription": {"text": "`public/admin/workbench-pipeline.js:1867` calls `GET /health` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/health`\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-60b31876460e01bf", "name": "Dangling fetch: GET /api/pipeline/stats/history (public/admin/workbench-pipeline.js:1872)", "shortDescription": {"text": "Dangling fetch: GET /api/pipeline/stats/history (public/admin/workbench-pipeline.js:1872)"}, "fullDescription": {"text": "`public/admin/workbench-pipeline.js:1872` calls `GET /api/pipeline/stats/history` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/pipeline/stats/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-b8bcb15bf3cbe370", "name": "Dangling fetch: GET /api/pipeline/pipeline/status (public/admin/workbench-pipeline.js:1894)", "shortDescription": {"text": "Dangling fetch: GET /api/pipeline/pipeline/status (public/admin/workbench-pipeline.js:1894)"}, "fullDescription": {"text": "`public/admin/workbench-pipeline.js:1894` calls `GET /api/pipeline/pipeline/status` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/pipeline/pipeline/status`\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-c25d132584e409f5", "name": "Dangling fetch: GET /api/pipeline/pipeline/status (public/admin/workbench-pipeline.js:1977)", "shortDescription": {"text": "Dangling fetch: GET /api/pipeline/pipeline/status (public/admin/workbench-pipeline.js:1977)"}, "fullDescription": {"text": "`public/admin/workbench-pipeline.js:1977` calls `GET /api/pipeline/pipeline/status` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/pipeline/pipeline/status`\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-6a094887038e8e85", "name": "Dangling fetch: GET /api/pipeline/classify/rules/status (public/admin/workbench-ai.js:1017)", "shortDescription": {"text": "Dangling fetch: GET /api/pipeline/classify/rules/status (public/admin/workbench-ai.js:1017)"}, "fullDescription": {"text": "`public/admin/workbench-ai.js:1017` calls `GET /api/pipeline/classify/rules/status` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/pipeline/classify/rules/status`\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-d23ba1cc017324a8", "name": "Dangling fetch: POST /api/harness/upload (public/admin/workbench-ai.js:1138)", "shortDescription": {"text": "Dangling fetch: POST /api/harness/upload (public/admin/workbench-ai.js:1138)"}, "fullDescription": {"text": "`public/admin/workbench-ai.js:1138` calls `POST /api/harness/upload` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/harness/upload`\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-11f34f35552cb900", "name": "Dangling fetch: POST /api/harness/chat (public/admin/workbench-ai.js:1273)", "shortDescription": {"text": "Dangling fetch: POST /api/harness/chat (public/admin/workbench-ai.js:1273)"}, "fullDescription": {"text": "`public/admin/workbench-ai.js:1273` calls `POST /api/harness/chat` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/harness/chat`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-6eb452fbfb454d20", "name": "Unused endpoint: USE /api/auth", "shortDescription": {"text": "Unused endpoint: USE /api/auth"}, "fullDescription": {"text": "`server.js` declares `USE /api/auth` 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-2b92dc87a4256298", "name": "Unused endpoint: USE /api/chat", "shortDescription": {"text": "Unused endpoint: USE /api/chat"}, "fullDescription": {"text": "`server.js` declares `USE /api/chat` 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-0c1b6ce2fd726244", "name": "Unused endpoint: USE /api/knowledge", "shortDescription": {"text": "Unused endpoint: USE /api/knowledge"}, "fullDescription": {"text": "`server.js` declares `USE /api/knowledge` 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.js` 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-d93a530ce10d47d9", "name": "Unused endpoint: USE /api/admin", "shortDescription": {"text": "Unused endpoint: USE /api/admin"}, "fullDescription": {"text": "`server.js` declares `USE /api/admin` 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-87e11545febd55d7", "name": "Unused endpoint: USE /api/harness", "shortDescription": {"text": "Unused endpoint: USE /api/harness"}, "fullDescription": {"text": "`server.js` declares `USE /api/harness` 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-d66296d3e9e372b1", "name": "Unused endpoint: USE /api/uploader", "shortDescription": {"text": "Unused endpoint: USE /api/uploader"}, "fullDescription": {"text": "`server.js` declares `USE /api/uploader` 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-ed2d81decc862c7e", "name": "Unused endpoint: USE /api/log", "shortDescription": {"text": "Unused endpoint: USE /api/log"}, "fullDescription": {"text": "`server.js` declares `USE /api/log` 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-c08702293d844bd1", "name": "Unused endpoint: USE /api/stores", "shortDescription": {"text": "Unused endpoint: USE /api/stores"}, "fullDescription": {"text": "`server.js` declares `USE /api/stores` 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-85c03a8f1fcf9833", "name": "Unused endpoint: USE /api/leai", "shortDescription": {"text": "Unused endpoint: USE /api/leai"}, "fullDescription": {"text": "`server.js` declares `USE /api/leai` 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-052a95a96096ee74", "name": "Unused endpoint: USE /api/lenovo", "shortDescription": {"text": "Unused endpoint: USE /api/lenovo"}, "fullDescription": {"text": "`server.js` declares `USE /api/lenovo` 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-fcd53ad325a9d3dc", "name": "Unused endpoint: USE /api/product", "shortDescription": {"text": "Unused endpoint: USE /api/product"}, "fullDescription": {"text": "`server.js` declares `USE /api/product` 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-778e714e4eb10d56", "name": "Unused endpoint: USE /api/pointer", "shortDescription": {"text": "Unused endpoint: USE /api/pointer"}, "fullDescription": {"text": "`server.js` declares `USE /api/pointer` 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-ccd9c54d68b606cd", "name": "Unused endpoint: USE /api/webhook", "shortDescription": {"text": "Unused endpoint: USE /api/webhook"}, "fullDescription": {"text": "`server.js` declares `USE /api/webhook` 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-f1042343658b154b", "name": "Unused endpoint: USE /api/geo-dashboard", "shortDescription": {"text": "Unused endpoint: USE /api/geo-dashboard"}, "fullDescription": {"text": "`server.js` declares `USE /api/geo-dashboard` 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-0ab055a45f0b96b6", "name": "Unused endpoint: USE /api/pipeline", "shortDescription": {"text": "Unused endpoint: USE /api/pipeline"}, "fullDescription": {"text": "`server.js` declares `USE /api/pipeline` 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-1241aa6b5313a19c", "name": "Unused endpoint: USE /api/supplier", "shortDescription": {"text": "Unused endpoint: USE /api/supplier"}, "fullDescription": {"text": "`server.js` declares `USE /api/supplier` 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-433aa78bbf1b1b38", "name": "Unused endpoint: USE /api/site", "shortDescription": {"text": "Unused endpoint: USE /api/site"}, "fullDescription": {"text": "`server.js` declares `USE /api/site` 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-f02a079c69b52f2d", "name": "Unused endpoint: USE /", "shortDescription": {"text": "Unused endpoint: USE /"}, "fullDescription": {"text": "`server.js` declares `USE /` 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-0b073e1ce89cd5d6", "name": "Unused endpoint: GET /api/resolve-link", "shortDescription": {"text": "Unused endpoint: GET /api/resolve-link"}, "fullDescription": {"text": "`server.js` declares `GET /api/resolve-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-01258407184f4a16", "name": "Unused endpoint: GET /api/preview", "shortDescription": {"text": "Unused endpoint: GET /api/preview"}, "fullDescription": {"text": "`server.js` declares `GET /api/preview` 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-953ec1a0ee6df50d", "name": "Unused endpoint: GET /admin", "shortDescription": {"text": "Unused endpoint: GET /admin"}, "fullDescription": {"text": "`server.js` declares `GET /admin` 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-ea381293048ee5bb", "name": "Unused endpoint: GET /admin/*path", "shortDescription": {"text": "Unused endpoint: GET /admin/*path"}, "fullDescription": {"text": "`server.js` declares `GET /admin/*path` 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-5a48d567f9a47748", "name": "Unused endpoint: GET /share/:token", "shortDescription": {"text": "Unused endpoint: GET /share/:token"}, "fullDescription": {"text": "`server.js` declares `GET /share/:token` 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-0d5cb937537dda23", "name": "Unused endpoint: GET /api/config/seckill", "shortDescription": {"text": "Unused endpoint: GET /api/config/seckill"}, "fullDescription": {"text": "`server.js` declares `GET /api/config/seckill` 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-26e8db1d9b20052e", "name": "Unused endpoint: GET /*path", "shortDescription": {"text": "Unused endpoint: GET /*path"}, "fullDescription": {"text": "`server.js` declares `GET /*path` 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-a846e488671d9de0", "name": "Unused endpoint: GET /sse/connect", "shortDescription": {"text": "Unused endpoint: GET /sse/connect"}, "fullDescription": {"text": "`routes/harness.js` declares `GET /sse/connect` 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-53de5639cc2dab16", "name": "Unused endpoint: GET /sse/heartbeat", "shortDescription": {"text": "Unused endpoint: GET /sse/heartbeat"}, "fullDescription": {"text": "`routes/harness.js` declares `GET /sse/heartbeat` 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-69d33c0fc71ea49c", "name": "Unused endpoint: POST /sse/say", "shortDescription": {"text": "Unused endpoint: POST /sse/say"}, "fullDescription": {"text": "`routes/harness.js` declares `POST /sse/say` 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-a2d152fcf608bf63", "name": "Unused endpoint: POST /invoke", "shortDescription": {"text": "Unused endpoint: POST /invoke"}, "fullDescription": {"text": "`routes/harness.js` declares `POST /invoke` 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-5c5c6900e4670966", "name": "Unused endpoint: GET /skills", "shortDescription": {"text": "Unused endpoint: GET /skills"}, "fullDescription": {"text": "`routes/harness.js` declares `GET /skills` 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-a8d5dae0cdec796b", "name": "Unused endpoint: GET /skills/grouped", "shortDescription": {"text": "Unused endpoint: GET /skills/grouped"}, "fullDescription": {"text": "`routes/harness.js` declares `GET /skills/grouped` 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-55ad86cb4ea2ba6f", "name": "Unused endpoint: GET /schema/:name", "shortDescription": {"text": "Unused endpoint: GET /schema/:name"}, "fullDescription": {"text": "`routes/harness.js` declares `GET /schema/:name` 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-29e0ed54344aaa81", "name": "Unused endpoint: GET /menu", "shortDescription": {"text": "Unused endpoint: GET /menu"}, "fullDescription": {"text": "`routes/harness.js` declares `GET /menu` 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-88a29b8a5c158e5b", "name": "Unused endpoint: GET /roles", "shortDescription": {"text": "Unused endpoint: GET /roles"}, "fullDescription": {"text": "`routes/harness.js` declares `GET /roles` 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-078b3f8a9311d56a", "name": "Unused endpoint: POST /roles", "shortDescription": {"text": "Unused endpoint: POST /roles"}, "fullDescription": {"text": "`routes/harness.js` declares `POST /roles` 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-7fdfc82c420ca9d9", "name": "Unused endpoint: PUT /roles/:id", "shortDescription": {"text": "Unused endpoint: PUT /roles/:id"}, "fullDescription": {"text": "`routes/harness.js` declares `PUT /roles/:id` 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-93376b252532bd39", "name": "Unused endpoint: DELETE /roles/:id", "shortDescription": {"text": "Unused endpoint: DELETE /roles/:id"}, "fullDescription": {"text": "`routes/harness.js` declares `DELETE /roles/:id` 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-4fb87392101d76be", "name": "Unused endpoint: GET /user-roles/:userId", "shortDescription": {"text": "Unused endpoint: GET /user-roles/:userId"}, "fullDescription": {"text": "`routes/harness.js` declares `GET /user-roles/:userId` 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-40edc21394709b48", "name": "Unused endpoint: PUT /user-roles/:userId", "shortDescription": {"text": "Unused endpoint: PUT /user-roles/:userId"}, "fullDescription": {"text": "`routes/harness.js` declares `PUT /user-roles/:userId` 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-cff8da5fbc19c76d", "name": "Unused endpoint: POST /chat", "shortDescription": {"text": "Unused endpoint: POST /chat"}, "fullDescription": {"text": "`routes/harness.js` declares `POST /chat` 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-6236b283b79811b8", "name": "Unused endpoint: POST /upload", "shortDescription": {"text": "Unused endpoint: POST /upload"}, "fullDescription": {"text": "`routes/harness.js` declares `POST /upload` 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-60a1950be5ddd3c9", "name": "Unused endpoint: GET /:sku/detail-images", "shortDescription": {"text": "Unused endpoint: GET /:sku/detail-images"}, "fullDescription": {"text": "`routes/product_detail_images.js` declares `GET /:sku/detail-images` 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-7a009b1a56794f45", "name": "Unused endpoint: POST /", "shortDescription": {"text": "Unused endpoint: POST /"}, "fullDescription": {"text": "`routes/log.js` declares `POST /` 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-5baa8971ebe192a1", "name": "Unused endpoint: GET /", "shortDescription": {"text": "Unused endpoint: GET /"}, "fullDescription": {"text": "`routes/knowledge.js` declares `GET /` 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-84499d0707daf6ec", "name": "Unused endpoint: GET /public-search", "shortDescription": {"text": "Unused endpoint: GET /public-search"}, "fullDescription": {"text": "`routes/knowledge.js` declares `GET /public-search` 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-ca5756175765b49d", "name": "Unused endpoint: GET /:id", "shortDescription": {"text": "Unused endpoint: GET /:id"}, "fullDescription": {"text": "`routes/knowledge.js` declares `GET /:id` 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-6b1bc1790eb7bfec", "name": "Unused endpoint: POST /url", "shortDescription": {"text": "Unused endpoint: POST /url"}, "fullDescription": {"text": "`routes/knowledge.js` declares `POST /url` 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-8d1748e6a7a3f228", "name": "Unused endpoint: POST /text", "shortDescription": {"text": "Unused endpoint: POST /text"}, "fullDescription": {"text": "`routes/knowledge.js` declares `POST /text` 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-ffd1d386cc2ba872", "name": "Unused endpoint: POST /crawl", "shortDescription": {"text": "Unused endpoint: POST /crawl"}, "fullDescription": {"text": "`routes/knowledge.js` declares `POST /crawl` 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/19585"}, "properties": {"repository": "shuitian23-bot/lexiang-workbench", "repoUrl": "https://github.com/shuitian23-bot/lexiang-workbench", "branch": "main"}, "results": [{"ruleId": "scanner-48cd88bfa3a48270", "level": "note", "message": {"text": "Possibly dead Python function: fetch_page"}, "properties": {"repobilityId": "0704d92b65df389c", "scanner": "scanner-primary", "fingerprint": "48cd88bfa3a48270", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "scripts/crawl_brand_news.py:12"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-48212d88fd2fff25", "level": "note", "message": {"text": "Possibly dead Python function: fetch_and_extract"}, "properties": {"repobilityId": "6f4c5f3b257e10a6", "scanner": "scanner-primary", "fingerprint": "48212d88fd2fff25", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "scripts/enrich_brand_news.py:58"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-4fd143f19e10df12", "level": "note", "message": {"text": "Possibly dead Python function: is_price_disclosed"}, "properties": {"repobilityId": "8ac4ca8997cb7b13", "scanner": "scanner-primary", "fingerprint": "4fd143f19e10df12", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "scripts/gen_wiki_full.py:43"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-3405d9dbd5d13e4c", "level": "note", "message": {"text": "Possibly dead Python function: replacer"}, "properties": {"repobilityId": "4c6d041d83cc4187", "scanner": "scanner-primary", "fingerprint": "3405d9dbd5d13e4c", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "scripts/gen_wiki_full.py:720"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-04138f74e45ed20e", "level": "note", "message": {"text": "Possibly dead Python function: fetch_article_content"}, "properties": {"repobilityId": "833a3def08a7ac11", "scanner": "scanner-primary", "fingerprint": "04138f74e45ed20e", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "scripts/crawl_brand_full.py:75"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-66259c811a54b89b", "level": "note", "message": {"text": "Possibly dead Python function: translate_path"}, "properties": {"repobilityId": "84ebe394cbed3b93", "scanner": "scanner-primary", "fingerprint": "66259c811a54b89b", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "public/admin/local-preview-server.py:82"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-5627f8a7b990d863", "level": "note", "message": {"text": "Possibly dead Python function: log_message"}, "properties": {"repobilityId": "965f3150b4af5b2e", "scanner": "scanner-primary", "fingerprint": "5627f8a7b990d863", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "public/admin/local-preview-server.py:111"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-e579ddce088d1d53", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 server.js:524"}, "properties": {"repobilityId": "a9deebb5fdc93edc", "scanner": "scanner-primary", "fingerprint": "e579ddce088d1d53", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-dbd14df6f58d8ae1", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/fix_short_batch.js:36"}, "properties": {"repobilityId": "5ae559d2c3a23312", "scanner": "scanner-primary", "fingerprint": "dbd14df6f58d8ae1", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-8eef9efdf88f151e", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/weekly_refresh.js:14"}, "properties": {"repobilityId": "c7a5a38970ffed73", "scanner": "scanner-primary", "fingerprint": "8eef9efdf88f151e", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-82e131cef4847c1c", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/crawl_biz_playwright.js:136"}, "properties": {"repobilityId": "e0311ce448fd898d", "scanner": "scanner-primary", "fingerprint": "82e131cef4847c1c", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-963998068e9bf304", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/gen_qa.js:58"}, "properties": {"repobilityId": "cfd7dabac0f95491", "scanner": "scanner-primary", "fingerprint": "963998068e9bf304", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-e64afb2ef64f92cf", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/gen_qa_full.js:81"}, "properties": {"repobilityId": "9906e28658550b50", "scanner": "scanner-primary", "fingerprint": "e64afb2ef64f92cf", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-ccd52932fc4af8d9", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/import_from_openapi.js:113"}, "properties": {"repobilityId": "ee1a75117dab5a95", "scanner": "scanner-primary", "fingerprint": "ccd52932fc4af8d9", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-881b016cb139d87b", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/ocr_image_docs.js:103"}, "properties": {"repobilityId": "54638e94f7e1ae37", "scanner": "scanner-primary", "fingerprint": "881b016cb139d87b", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-b03731445c102211", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/import_excel_products.js:105"}, "properties": {"repobilityId": "c27af99264445e25", "scanner": "scanner-primary", "fingerprint": "b03731445c102211", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-b88bbefe8e837bbc", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/pointer_eval.js:38"}, "properties": {"repobilityId": "f1d287e7f63eb7db", "scanner": "scanner-primary", "fingerprint": "b88bbefe8e837bbc", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-1e8d9ce2afc06958", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/backfill_links.js:86"}, "properties": {"repobilityId": "4f4fb99570d05ab8", "scanner": "scanner-primary", "fingerprint": "1e8d9ce2afc06958", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-10df2e580154277a", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/crawl_biz.js:163"}, "properties": {"repobilityId": "afe41909e6e44527", "scanner": "scanner-primary", "fingerprint": "10df2e580154277a", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-25edf42a1a871e32", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/rechunk_updated.js:22"}, "properties": {"repobilityId": "2a27e7690ecef608", "scanner": "scanner-primary", "fingerprint": "25edf42a1a871e32", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-7b9603997cbdb2c5", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/gen_qa_claude.js:89"}, "properties": {"repobilityId": "4829578c35c85cf8", "scanner": "scanner-primary", "fingerprint": "7b9603997cbdb2c5", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-b618661140da8d3d", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/test_qa_v2.js:92"}, "properties": {"repobilityId": "d7eddb36820668d0", "scanner": "scanner-primary", "fingerprint": "b618661140da8d3d", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-227fd5279cfedbe1", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/gen_qa_v2.js:214"}, "properties": {"repobilityId": "b5bb852d9dd90511", "scanner": "scanner-primary", "fingerprint": "227fd5279cfedbe1", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-0a3ac1af6a0f08f2", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/regen_qa_guides.js:131"}, "properties": {"repobilityId": "3236d009b8dc67f4", "scanner": "scanner-primary", "fingerprint": "0a3ac1af6a0f08f2", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-c90fcb75826a7781", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/crawl_item_pages.js:95"}, "properties": {"repobilityId": "3d8aed531de823c0", "scanner": "scanner-primary", "fingerprint": "c90fcb75826a7781", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-c6238fc8cd7683dc", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/ocr_test.js:101"}, "properties": {"repobilityId": "55f9c7c0ab98370c", "scanner": "scanner-primary", "fingerprint": "c6238fc8cd7683dc", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-937765b147dd2782", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/token-stats.js:34"}, "properties": {"repobilityId": "1139276e7a34b996", "scanner": "scanner-primary", "fingerprint": "937765b147dd2782", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-1c919df8e6a36e7e", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 routes/harness.js:80"}, "properties": {"repobilityId": "e64e27c56ece9b8b", "scanner": "scanner-primary", "fingerprint": "1c919df8e6a36e7e", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-a551e87376e092f3", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 routes/admin.js:548"}, "properties": {"repobilityId": "fcae94c7533b330a", "scanner": "scanner-primary", "fingerprint": "a551e87376e092f3", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-eabb6e0086020297", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 routes/pipeline.js:440"}, "properties": {"repobilityId": "6c7d2f8f2f73ce11", "scanner": "scanner-primary", "fingerprint": "eabb6e0086020297", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-e741e37e13b4aeba", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 routes/auth.js:138"}, "properties": {"repobilityId": "31aebca995c361a9", "scanner": "scanner-primary", "fingerprint": "e741e37e13b4aeba", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-0bc79d1e5a0691a9", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 routes/webhook.js:56"}, "properties": {"repobilityId": "6e26ef509a6da672", "scanner": "scanner-primary", "fingerprint": "0bc79d1e5a0691a9", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-51161e3315103fe5", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 db/schema.js:368"}, "properties": {"repobilityId": "e699872791d48889", "scanner": "scanner-primary", "fingerprint": "51161e3315103fe5", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-1004c154a4704664", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 core/experience.js:83"}, "properties": {"repobilityId": "a78002e06ec340d1", "scanner": "scanner-primary", "fingerprint": "1004c154a4704664", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-dee65039ebec1b3a", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 core/evolver.js:94"}, "properties": {"repobilityId": "883a25bcaaa2fabd", "scanner": "scanner-primary", "fingerprint": "dee65039ebec1b3a", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-258cd12ec885ec7d", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 core/memory.js:125"}, "properties": {"repobilityId": "2f4f05a4eff987ab", "scanner": "scanner-primary", "fingerprint": "258cd12ec885ec7d", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-82f65563c318e91a", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 core/agent.js:666"}, "properties": {"repobilityId": "9ca04a11acce3261", "scanner": "scanner-primary", "fingerprint": "82f65563c318e91a", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-d1ba0f0637accebb", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 core/dispatcher.js:34"}, "properties": {"repobilityId": "8ddc87fef7b5fc10", "scanner": "scanner-primary", "fingerprint": "d1ba0f0637accebb", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-995d133968a846ab", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 core/profiler.js:96"}, "properties": {"repobilityId": "8d832dcc550e5006", "scanner": "scanner-primary", "fingerprint": "995d133968a846ab", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-fb0c5a6ca2f7413e", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 core/sms.js:59"}, "properties": {"repobilityId": "bdc1d3d9607051ff", "scanner": "scanner-primary", "fingerprint": "fb0c5a6ca2f7413e", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-d9c925bdfd681166", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 core/monitor.js:99"}, "properties": {"repobilityId": "b59e652ef94db99d", "scanner": "scanner-primary", "fingerprint": "d9c925bdfd681166", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-9edc728191a7fa00", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 core/learner.js:128"}, "properties": {"repobilityId": "2dcd13e8c177c46a", "scanner": "scanner-primary", "fingerprint": "9edc728191a7fa00", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-113ffbbddb1d14d7", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 core/skill-registry.js:30"}, "properties": {"repobilityId": "804a5e382cbbe55d", "scanner": "scanner-primary", "fingerprint": "113ffbbddb1d14d7", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-2a293599d4b5c9e7", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 core/compressor.js:130"}, "properties": {"repobilityId": "42ed158629602c3e", "scanner": "scanner-primary", "fingerprint": "2a293599d4b5c9e7", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-41ad90e256018935", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 skills/code_runner.js:14"}, "properties": {"repobilityId": "8f127156c6b4b63d", "scanner": "scanner-primary", "fingerprint": "41ad90e256018935", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-e014f249cdeafe3f", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 public/admin/workbench-employee.js:543"}, "properties": {"repobilityId": "e0727764b7bd2f92", "scanner": "scanner-primary", "fingerprint": "e014f249cdeafe3f", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-93243008a18fd591", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 knowledge/news_crawler.js:108"}, "properties": {"repobilityId": "ed8c1d84b7d597a9", "scanner": "scanner-primary", "fingerprint": "93243008a18fd591", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-a3e214d4356caef8", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 knowledge/graph_rag.js:199"}, "properties": {"repobilityId": "aa44bd5bf5fa1115", "scanner": "scanner-primary", "fingerprint": "a3e214d4356caef8", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-3dcd43db3d1efe4f", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 knowledge/vector_index.js:42"}, "properties": {"repobilityId": "1c6a117de8634172", "scanner": "scanner-primary", "fingerprint": "3dcd43db3d1efe4f", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-f38980744e5b61ff", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 knowledge/search.js:20"}, "properties": {"repobilityId": "656561ed54a4988c", "scanner": "scanner-primary", "fingerprint": "f38980744e5b61ff", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-38493602bad18b45", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 knowledge/brand_crawl.js:95"}, "properties": {"repobilityId": "7dfb53c74a80201c", "scanner": "scanner-primary", "fingerprint": "38493602bad18b45", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-8c2eaafe21b12780", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 knowledge/build_vectors.js:16"}, "properties": {"repobilityId": "fd54fdf25b4bdd05", "scanner": "scanner-primary", "fingerprint": "8c2eaafe21b12780", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-fdc6e9115d8ae8ad", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 knowledge/deduplicator.js:163"}, "properties": {"repobilityId": "05d7070acac92d9e", "scanner": "scanner-primary", "fingerprint": "fdc6e9115d8ae8ad", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-a558dc9790f6b53b", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in docs/guan-jthl.html:186"}, "properties": {"repobilityId": "c8205798cfdf5c56", "scanner": "scanner-primary", "fingerprint": "a558dc9790f6b53b", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "docs/guan-jthl.html"}, "region": {"startLine": 186}}}]}, {"ruleId": "scanner-e640c346b1edb7f1", "level": "warning", "message": {"text": "Insecure pattern 'domparser_html_parse' in docs/guan-jthl.html:144"}, "properties": {"repobilityId": "ac7383f1569a718d", "scanner": "scanner-primary", "fingerprint": "e640c346b1edb7f1", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "domparser_html_parse"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "docs/guan-jthl.html"}, "region": {"startLine": 144}}}]}, {"ruleId": "scanner-4cc3543ec83ac95f", "level": "error", "message": {"text": "Possible secret in scripts/batch_biz_wiki.py"}, "properties": {"repobilityId": "294f756ce30fab91", "scanner": "scanner-primary", "fingerprint": "4cc3543ec83ac95f", "layer": "security", "severity": "critical", "confidence": 1.0, "tags": ["secrets"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "scripts/batch_biz_wiki.py"}, "region": {"startLine": 29}}}]}, {"ruleId": "scanner-92bbd315bddd03ff", "level": "warning", "message": {"text": "Insecure pattern 'node_child_process' in scripts/weekly_refresh.js:10"}, "properties": {"repobilityId": "220182a1f5b7902f", "scanner": "scanner-primary", "fingerprint": "92bbd315bddd03ff", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "node_child_process"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "scripts/weekly_refresh.js"}, "region": {"startLine": 10}}}]}, {"ruleId": "scanner-423a2bc9f5bc26a0", "level": "error", "message": {"text": "Possible secret in scripts/p1_add_warnings.py"}, "properties": {"repobilityId": "a35daf4d37637d1c", "scanner": "scanner-primary", "fingerprint": "423a2bc9f5bc26a0", "layer": "security", "severity": "critical", "confidence": 1.0, "tags": ["secrets"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "scripts/p1_add_warnings.py"}, "region": {"startLine": 7}}}]}, {"ruleId": "scanner-423a2bc9f5bc26a0", "level": "error", "message": {"text": "Possible secret in scripts/p1_add_warnings.py"}, "properties": {"repobilityId": "b74d7486472e1810", "scanner": "scanner-primary", "fingerprint": "423a2bc9f5bc26a0", "layer": "security", "severity": "critical", "confidence": 1.0, "tags": ["secrets"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "scripts/p1_add_warnings.py"}, "region": {"startLine": 7}}}]}, {"ruleId": "scanner-d18ff9d753a8028d", "level": "warning", "message": {"text": "Insecure pattern 'node_child_process' in scripts/auto-changelog.js:5"}, "properties": {"repobilityId": "16dbb84e85598892", "scanner": "scanner-primary", "fingerprint": "d18ff9d753a8028d", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "node_child_process"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "scripts/auto-changelog.js"}, "region": {"startLine": 5}}}]}, {"ruleId": "scanner-91ccaf1d19019b39", "level": "error", "message": {"text": "Possible secret in routes/geo-dashboard.js"}, "properties": {"repobilityId": "f8b1e36ef1a15913", "scanner": "scanner-primary", "fingerprint": "91ccaf1d19019b39", "layer": "security", "severity": "critical", "confidence": 1.0, "tags": ["secrets"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "routes/geo-dashboard.js"}, "region": {"startLine": 6}}}]}, {"ruleId": "scanner-1ab2d6d8d24148d2", "level": "warning", "message": {"text": "Insecure pattern 'node_child_process' in routes/admin.js:699"}, "properties": {"repobilityId": "c405260635c5f080", "scanner": "scanner-primary", "fingerprint": "1ab2d6d8d24148d2", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "node_child_process"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "routes/admin.js"}, "region": {"startLine": 699}}}]}, {"ruleId": "scanner-8712f273911bccda", "level": "warning", "message": {"text": "Insecure pattern 'node_child_process' in routes/pipeline.js:7"}, "properties": {"repobilityId": "4af68ade56be4402", "scanner": "scanner-primary", "fingerprint": "8712f273911bccda", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "node_child_process"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "routes/pipeline.js"}, "region": {"startLine": 7}}}]}, {"ruleId": "scanner-bca12997c57466f3", "level": "warning", "message": {"text": "Insecure pattern 'node_child_process' in routes/webhook.js:5"}, "properties": {"repobilityId": "bdd3c1c5c7d705f2", "scanner": "scanner-primary", "fingerprint": "bca12997c57466f3", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "node_child_process"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "routes/webhook.js"}, "region": {"startLine": 5}}}]}, {"ruleId": "scanner-192ab3c65adb9366", "level": "warning", "message": {"text": "Insecure pattern 'node_child_process' in core/version.js:6"}, "properties": {"repobilityId": "b7657e7a487e2ea6", "scanner": "scanner-primary", "fingerprint": "192ab3c65adb9366", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "node_child_process"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "core/version.js"}, "region": {"startLine": 6}}}]}, {"ruleId": "scanner-67b793a2a152087d", "level": "warning", "message": {"text": "Insecure pattern 'node_child_process' in skills/lexiang_classify.js:2"}, "properties": {"repobilityId": "b95f0ee0d387b1ab", "scanner": "scanner-primary", "fingerprint": "67b793a2a152087d", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "node_child_process"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "skills/lexiang_classify.js"}, "region": {"startLine": 2}}}]}, {"ruleId": "scanner-8a3263ed8c075f8d", "level": "warning", "message": {"text": "Insecure pattern 'node_child_process' in skills/lexiang_intent.js:2"}, "properties": {"repobilityId": "23ea42b69ae78fd1", "scanner": "scanner-primary", "fingerprint": "8a3263ed8c075f8d", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "node_child_process"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "skills/lexiang_intent.js"}, "region": {"startLine": 2}}}]}, {"ruleId": "scanner-c6373e34b68a17b3", "level": "warning", "message": {"text": "Insecure pattern 'node_child_process' in skills/lexiang_pipeline.js:2"}, "properties": {"repobilityId": "90cdfc8efee72089", "scanner": "scanner-primary", "fingerprint": "c6373e34b68a17b3", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "node_child_process"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "skills/lexiang_pipeline.js"}, "region": {"startLine": 2}}}]}, {"ruleId": "scanner-30abe890412c0196", "level": "warning", "message": {"text": "Insecure pattern 'node_child_process' in skills/lexiang_filter.js:2"}, "properties": {"repobilityId": "65d90ace19624a4d", "scanner": "scanner-primary", "fingerprint": "30abe890412c0196", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "node_child_process"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "skills/lexiang_filter.js"}, "region": {"startLine": 2}}}]}, {"ruleId": "scanner-b5157e5713064183", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in public/changelog.html:150"}, "properties": {"repobilityId": "a54ac13b626bbe31", "scanner": "scanner-primary", "fingerprint": "b5157e5713064183", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "public/changelog.html"}, "region": {"startLine": 150}}}]}, {"ruleId": "scanner-d238d3681950d9cb", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in public/js/portal.js:172"}, "properties": {"repobilityId": "b27f03543d732015", "scanner": "scanner-primary", "fingerprint": "d238d3681950d9cb", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "public/js/portal.js"}, "region": {"startLine": 172}}}]}, {"ruleId": "scanner-966a7ec4ce8914e2", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in public/js/app.js:75"}, "properties": {"repobilityId": "20ef8ff0d2135a46", "scanner": "scanner-primary", "fingerprint": "966a7ec4ce8914e2", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "public/js/app.js"}, "region": {"startLine": 75}}}]}, {"ruleId": "scanner-4978be0ffc1ef4e0", "level": "warning", "message": {"text": "Insecure pattern 'insert_adjacent_html' in public/js/app.js:254"}, "properties": {"repobilityId": "078d8b132772047a", "scanner": "scanner-primary", "fingerprint": "4978be0ffc1ef4e0", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "insert_adjacent_html"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "public/js/app.js"}, "region": {"startLine": 254}}}]}, {"ruleId": "scanner-183b9f52aaac3dab", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in public/js/fullscreen-chat.js:236"}, "properties": {"repobilityId": "edca4cf8535a7a11", "scanner": "scanner-primary", "fingerprint": "183b9f52aaac3dab", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "public/js/fullscreen-chat.js"}, "region": {"startLine": 236}}}]}, {"ruleId": "scanner-71199d00bbb97db4", "level": "warning", "message": {"text": "Insecure pattern 'insert_adjacent_html' in public/js/fullscreen-chat.js:344"}, "properties": {"repobilityId": "ecdb0763f9562fa6", "scanner": "scanner-primary", "fingerprint": "71199d00bbb97db4", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "insert_adjacent_html"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "public/js/fullscreen-chat.js"}, "region": {"startLine": 344}}}]}, {"ruleId": "scanner-163c3050ae67cfcf", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in public/admin/workbench-data.js:24"}, "properties": {"repobilityId": "992f982ffa89246f", "scanner": "scanner-primary", "fingerprint": "163c3050ae67cfcf", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "public/admin/workbench-data.js"}, "region": {"startLine": 24}}}]}, {"ruleId": "scanner-7c53128d93ee8b03", "level": "warning", "message": {"text": "Insecure pattern 'direct_outerhtml_assignment' in public/admin/workbench-data.js:244"}, "properties": {"repobilityId": "c78d7eb55ac0fdbf", "scanner": "scanner-primary", "fingerprint": "7c53128d93ee8b03", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_outerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "public/admin/workbench-data.js"}, "region": {"startLine": 244}}}]}, {"ruleId": "scanner-a40c792855fdb664", "level": "warning", "message": {"text": "Insecure pattern 'insert_adjacent_html' in public/admin/workbench-data.js:1349"}, "properties": {"repobilityId": "45390e3fb841c775", "scanner": "scanner-primary", "fingerprint": "a40c792855fdb664", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "insert_adjacent_html"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "public/admin/workbench-data.js"}, "region": {"startLine": 1349}}}]}, {"ruleId": "scanner-ffb3b5505604f186", "level": "note", "message": {"text": "Insecure pattern 'document_write' in public/admin/workbench.html:17"}, "properties": {"repobilityId": "e455bda71b22ab00", "scanner": "scanner-primary", "fingerprint": "ffb3b5505604f186", "layer": "security", "severity": "low", "confidence": 1.0, "tags": ["owasp", "document_write"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "public/admin/workbench.html"}, "region": {"startLine": 17}}}]}, {"ruleId": "scanner-1865f50ee79e8e79", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in public/admin/workbench.html:471"}, "properties": {"repobilityId": "b8d44a66da99e1d9", "scanner": "scanner-primary", "fingerprint": "1865f50ee79e8e79", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "public/admin/workbench.html"}, "region": {"startLine": 471}}}]}, {"ruleId": "scanner-47bb3962abed30e4", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in public/admin/workbench-quality.js:528"}, "properties": {"repobilityId": "3bf42846275a2cbe", "scanner": "scanner-primary", "fingerprint": "47bb3962abed30e4", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "public/admin/workbench-quality.js"}, "region": {"startLine": 528}}}]}, {"ruleId": "scanner-20c070e2a818a2e2", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in public/admin/workbench-v1.html:1720"}, "properties": {"repobilityId": "b236a3ea92fedbdf", "scanner": "scanner-primary", "fingerprint": "20c070e2a818a2e2", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "public/admin/workbench-v1.html"}, "region": {"startLine": 1720}}}]}, {"ruleId": "scanner-10db45282435ef56", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in public/admin/workbench-geo.js:156"}, "properties": {"repobilityId": "5fa1993e5c3c3c35", "scanner": "scanner-primary", "fingerprint": "10db45282435ef56", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "public/admin/workbench-geo.js"}, "region": {"startLine": 156}}}]}, {"ruleId": "scanner-b5dc5bea2dc2b23e", "level": "warning", "message": {"text": "Insecure pattern 'insert_adjacent_html' in public/admin/workbench-geo.js:1634"}, "properties": {"repobilityId": "942a9cf95224dd24", "scanner": "scanner-primary", "fingerprint": "b5dc5bea2dc2b23e", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "insert_adjacent_html"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "public/admin/workbench-geo.js"}, "region": {"startLine": 1634}}}]}, {"ruleId": "scanner-1d189d42f9d0c779", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in public/admin/ops-lite.html:42"}, "properties": {"repobilityId": "ef934ece0e776fbd", "scanner": "scanner-primary", "fingerprint": "1d189d42f9d0c779", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "public/admin/ops-lite.html"}, "region": {"startLine": 42}}}]}, {"ruleId": "scanner-53e16b2893f975d3", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in public/admin/workbench-pipeline.js:638"}, "properties": {"repobilityId": "90052e5a46248bc8", "scanner": "scanner-primary", "fingerprint": "53e16b2893f975d3", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "public/admin/workbench-pipeline.js"}, "region": {"startLine": 638}}}]}, {"ruleId": "scanner-7e6fbe634bdac790", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in public/admin/workbench-ops.js:645"}, "properties": {"repobilityId": "5cd3274846aeef8c", "scanner": "scanner-primary", "fingerprint": "7e6fbe634bdac790", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "public/admin/workbench-ops.js"}, "region": {"startLine": 645}}}]}, {"ruleId": "scanner-9a5aeeaef6f3de50", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in public/admin/workbench-report.js:215"}, "properties": {"repobilityId": "ebac3e3d187be864", "scanner": "scanner-primary", "fingerprint": "9a5aeeaef6f3de50", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "public/admin/workbench-report.js"}, "region": {"startLine": 215}}}]}, {"ruleId": "scanner-ecf586662538e45d", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in public/admin/workbench-ai.js:108"}, "properties": {"repobilityId": "a1e0bc7239604d1c", "scanner": "scanner-primary", "fingerprint": "ecf586662538e45d", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "public/admin/workbench-ai.js"}, "region": {"startLine": 108}}}]}, {"ruleId": "scanner-ede9eec5d0a5046c", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in public/admin/workbench-employee.js:15"}, "properties": {"repobilityId": "4b449df3b46d1925", "scanner": "scanner-primary", "fingerprint": "ede9eec5d0a5046c", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "public/admin/workbench-employee.js"}, "region": {"startLine": 15}}}]}, {"ruleId": "scanner-aedcd1a3b5477016", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in public/admin/index-legacy.html:804"}, "properties": {"repobilityId": "2028bb1d460e2eb7", "scanner": "scanner-primary", "fingerprint": "aedcd1a3b5477016", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "public/admin/index-legacy.html"}, "region": {"startLine": 804}}}]}, {"ruleId": "scanner-d091e703f186f6c7", "level": "warning", "message": {"text": "Insecure pattern 'direct_outerhtml_assignment' in public/admin/index-legacy.html:2838"}, "properties": {"repobilityId": "e1c6ed8f8b3334c1", "scanner": "scanner-primary", "fingerprint": "d091e703f186f6c7", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_outerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "public/admin/index-legacy.html"}, "region": {"startLine": 2838}}}]}, {"ruleId": "scanner-0f5580886336c92e", "level": "warning", "message": {"text": "Insecure pattern 'insert_adjacent_html' in public/admin/index-legacy.html:3943"}, "properties": {"repobilityId": "402aad35d97bdc75", "scanner": "scanner-primary", "fingerprint": "0f5580886336c92e", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "insert_adjacent_html"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "public/admin/index-legacy.html"}, "region": {"startLine": 3943}}}]}, {"ruleId": "scanner-7c24b2a327941371", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in public/admin/workbench-pages.js:6"}, "properties": {"repobilityId": "eb2b3418e5f7b6b1", "scanner": "scanner-primary", "fingerprint": "7c24b2a327941371", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "public/admin/workbench-pages.js"}, "region": {"startLine": 6}}}]}, {"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-fe29ed7c37405ff7", "level": "note", "message": {"text": "Very large file: scripts/gen_wiki_full.py (3472 lines)"}, "properties": {"repobilityId": "600044c0309868ba", "scanner": "scanner-primary", "fingerprint": "fe29ed7c37405ff7", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-4ecd7ad01e202b8e", "level": "note", "message": {"text": "Very large file: scripts/gen_wiki.py (1563 lines)"}, "properties": {"repobilityId": "b8e1c907a5bef56c", "scanner": "scanner-primary", "fingerprint": "4ecd7ad01e202b8e", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-d1ec8c1aa3f15913", "level": "note", "message": {"text": "Very large file: public/js/app.js (4240 lines)"}, "properties": {"repobilityId": "95bc23e2f7df6e1a", "scanner": "scanner-primary", "fingerprint": "d1ec8c1aa3f15913", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-04cddc626d9892fb", "level": "note", "message": {"text": "Very large file: public/admin/workbench-data.js (2158 lines)"}, "properties": {"repobilityId": "12e4336dfb9574ab", "scanner": "scanner-primary", "fingerprint": "04cddc626d9892fb", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-fc402a68e1bd0df5", "level": "note", "message": {"text": "Very large file: public/admin/workbench-geo.js (1640 lines)"}, "properties": {"repobilityId": "8cc094f970b392ca", "scanner": "scanner-primary", "fingerprint": "fc402a68e1bd0df5", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-ae2899df6c964338", "level": "note", "message": {"text": "Very large file: public/admin/workbench-pipeline.js (2022 lines)"}, "properties": {"repobilityId": "91eeb1c64e14c036", "scanner": "scanner-primary", "fingerprint": "ae2899df6c964338", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-b0234e8696b5d605", "level": "note", "message": {"text": "Very large file: public/admin/workbench-ai.js (1530 lines)"}, "properties": {"repobilityId": "2c01c461fda0285b", "scanner": "scanner-primary", "fingerprint": "b0234e8696b5d605", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-1c06b7ca55531bb0", "level": "note", "message": {"text": "Very large file: public/admin/workbench-pages.js (3318 lines)"}, "properties": {"repobilityId": "c02d89c37a690a54", "scanner": "scanner-primary", "fingerprint": "1c06b7ca55531bb0", "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": "dae722549e9de35a", "scanner": "scanner-primary", "fingerprint": "141b30a41e03817b", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["license", "repo-hardening", "generated-repo-pattern"]}}, {"ruleId": "scanner-faccb9061e9b52a0", "level": "note", "message": {"text": "No README detected"}, "properties": {"repobilityId": "8fe25ba3ddabdcf3", "scanner": "scanner-primary", "fingerprint": "faccb9061e9b52a0", "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": "ffc592a8a5e9b953", "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": "531add5a279f1e90", "scanner": "scanner-primary", "fingerprint": "72b2a6250083a784", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["placeholder", "mock-data", "incomplete", "generated-repo-pattern"]}}, {"ruleId": "scanner-2d0c7b7ab8f8aacf", "level": "warning", "message": {"text": "Critical user flow still appears backed by mock or placeholder data"}, "properties": {"repobilityId": "eaeb23076c564b09", "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": "426021daf254772d", "scanner": "scanner-primary", "fingerprint": "b9088664ace7f748", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["production-readiness", "repo-hardening", "generated-repo-pattern"]}}, {"ruleId": "scanner-749d4bc1bd66df5f", "level": "warning", "message": {"text": "Agent instructions exist but release-hardening basics are missing"}, "properties": {"repobilityId": "e874b66850c3f71f", "scanner": "scanner-primary", "fingerprint": "749d4bc1bd66df5f", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "repo-hardening", "generated-repo-pattern"]}}, {"ruleId": "scanner-ea8f3013f588db25", "level": "note", "message": {"text": "Shallow git history limits provenance confidence"}, "properties": {"repobilityId": "05a61655d8b8411d", "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": "1c4216055f22e9ba", "scanner": "scanner-primary", "fingerprint": "8424db9c75e04ba4", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["provenance", "git-history", "generated-repo-pattern"]}}, {"ruleId": "scanner-bea357a6497a2d5d", "level": "warning", "message": {"text": "Agent authority lacks a verifier contract: CLAUDE.md"}, "properties": {"repobilityId": "aae72df3934829ac", "scanner": "scanner-primary", "fingerprint": "bea357a6497a2d5d", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "verification", "claude_instruction"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "CLAUDE.md"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-2679282aa1c484b5", "level": "warning", "message": {"text": "Agent authority lacks a verifier contract: AGENTS.md"}, "properties": {"repobilityId": "27d579812e6be614", "scanner": "scanner-primary", "fingerprint": "2679282aa1c484b5", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "verification", "agents_md"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "AGENTS.md"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-6a4d00d02bb53bb4", "level": "warning", "message": {"text": "Agent authority lacks a verifier contract: .claude/skills/lexiang-deploy/SKILL.md"}, "properties": {"repobilityId": "d35740538d57b0cd", "scanner": "scanner-primary", "fingerprint": "6a4d00d02bb53bb4", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "verification", "claude_instruction"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".claude/skills/lexiang-deploy/SKILL.md"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-3ab6b4273f1b39b9", "level": "warning", "message": {"text": "Agent authority lacks a verifier contract: .claude/skills/lexiang-ai-flow/SKILL.md"}, "properties": {"repobilityId": "66317f86bf2a1d69", "scanner": "scanner-primary", "fingerprint": "3ab6b4273f1b39b9", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "verification", "claude_instruction"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".claude/skills/lexiang-ai-flow/SKILL.md"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-2573a61d7d023080", "level": "warning", "message": {"text": "Agent authority lacks a verifier contract: .claude/skills/lexiang-dev/SKILL.md"}, "properties": {"repobilityId": "0da56ffa1e6d71bc", "scanner": "scanner-primary", "fingerprint": "2573a61d7d023080", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "verification", "claude_instruction"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".claude/skills/lexiang-dev/SKILL.md"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-b24a7b19b0edeb38", "level": "warning", "message": {"text": "Agent authority lacks a verifier contract: .claude/skills/lenovo-leai-pc-design/references/component-patterns.md"}, "properties": {"repobilityId": "549828f242d78a62", "scanner": "scanner-primary", "fingerprint": "b24a7b19b0edeb38", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "verification", "claude_instruction"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".claude/skills/lenovo-leai-pc-design/references/component-patterns.md"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-011b27ccf41ce3da", "level": "warning", "message": {"text": "Agent authority lacks a verifier contract: .claude/skills/lenovo-leai-pc-design/references/fullscreen-dialog-framework.md"}, "properties": {"repobilityId": "c0d98b17f8919737", "scanner": "scanner-primary", "fingerprint": "011b27ccf41ce3da", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "verification", "claude_instruction"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".claude/skills/lenovo-leai-pc-design/references/fullscreen-dialog-framework.md"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-1469cc7e36533fc8", "level": "warning", "message": {"text": "Agent authority lacks a verifier contract: .claude/skills/lenovo-leai-pc-design/references/real-pc-dialog-states.md"}, "properties": {"repobilityId": "d02abaa992e2741b", "scanner": "scanner-primary", "fingerprint": "1469cc7e36533fc8", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "verification", "claude_instruction"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".claude/skills/lenovo-leai-pc-design/references/real-pc-dialog-states.md"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-b64e9c7b5bd5dda2", "level": "warning", "message": {"text": "Agent authority lacks a verifier contract: .claude/skills/lenovo-leai-pc-design/references/pc-design-system.md"}, "properties": {"repobilityId": "6a8fdf9a2efe585a", "scanner": "scanner-primary", "fingerprint": "b64e9c7b5bd5dda2", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "verification", "claude_instruction"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".claude/skills/lenovo-leai-pc-design/references/pc-design-system.md"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-83b8844b61d5baf7", "level": "warning", "message": {"text": "Agent authority lacks a verifier contract: .claude/skills/lenovo-leai-pc-design/references/layout-rules.md"}, "properties": {"repobilityId": "9f1523b39e33247e", "scanner": "scanner-primary", "fingerprint": "83b8844b61d5baf7", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "verification", "claude_instruction"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".claude/skills/lenovo-leai-pc-design/references/layout-rules.md"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-e725d2ab884fbd49", "level": "note", "message": {"text": "Multiple root agent instruction files without precedence"}, "properties": {"repobilityId": "1953db6c89508d22", "scanner": "scanner-primary", "fingerprint": "e725d2ab884fbd49", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["agent-instructions", "governance"]}}, {"ruleId": "scanner-b2745820179edf4a", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/weekly_refresh.js:75"}, "properties": {"repobilityId": "f276589f89a32fb8", "scanner": "scanner-primary", "fingerprint": "b2745820179edf4a", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-f926ec445d98a70d", "level": "note", "message": {"text": "Legacy-named symbol `deleteOld` in scripts/gen_qa.js:49"}, "properties": {"repobilityId": "d953ba0dbd97e769", "scanner": "scanner-primary", "fingerprint": "f926ec445d98a70d", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-e024167e59be8b43", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/gen_qa.js:11"}, "properties": {"repobilityId": "4d0ee2bbb0d0604b", "scanner": "scanner-primary", "fingerprint": "e024167e59be8b43", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-3fcf9f23ea380a07", "level": "note", "message": {"text": "Legacy-named symbol `deleteOld` in scripts/gen_qa_full.js:66"}, "properties": {"repobilityId": "ca93ceb38ce8d941", "scanner": "scanner-primary", "fingerprint": "3fcf9f23ea380a07", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-5b4d1a774c4c594e", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/gen_qa_full.js:13"}, "properties": {"repobilityId": "5a1ee42573d34129", "scanner": "scanner-primary", "fingerprint": "5b4d1a774c4c594e", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-49e81e8300c2ae42", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/import_from_openapi.js:18"}, "properties": {"repobilityId": "fcfab418932b0ab7", "scanner": "scanner-primary", "fingerprint": "49e81e8300c2ae42", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-11883162f2d7f67e", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/ocr_image_docs.js:20"}, "properties": {"repobilityId": "fb3a3b84a082c7f3", "scanner": "scanner-primary", "fingerprint": "11883162f2d7f67e", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-66814ac20b844285", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/crawl_biz.js:17"}, "properties": {"repobilityId": "df9307443d617ec8", "scanner": "scanner-primary", "fingerprint": "66814ac20b844285", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-486b163b8f3d688b", "level": "note", "message": {"text": "Legacy-named symbol `deleteOld` in scripts/gen_qa_claude.js:75"}, "properties": {"repobilityId": "5bc73bad92ba91ff", "scanner": "scanner-primary", "fingerprint": "486b163b8f3d688b", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-73e8380513514319", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/gen_qa_claude.js:15"}, "properties": {"repobilityId": "4e40f49ee8155cfb", "scanner": "scanner-primary", "fingerprint": "73e8380513514319", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-82ac8ae51084a50e", "level": "note", "message": {"text": "Legacy-named symbol `\u4ecegen_qa_v2` in scripts/test_qa_v2.js:6"}, "properties": {"repobilityId": "52ccc21a77b0bd88", "scanner": "scanner-primary", "fingerprint": "82ac8ae51084a50e", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-78412649ec1c6a06", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/gen_qa_v2.js:167"}, "properties": {"repobilityId": "4ae2cae90f42fd0f", "scanner": "scanner-primary", "fingerprint": "78412649ec1c6a06", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-e3118ccd9f4bbe76", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/regen_qa_guides.js:72"}, "properties": {"repobilityId": "900ca66f3d2fbd18", "scanner": "scanner-primary", "fingerprint": "e3118ccd9f4bbe76", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-e203de7ad10abc45", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/ocr_test.js:18"}, "properties": {"repobilityId": "5adfe6008c5d3392", "scanner": "scanner-primary", "fingerprint": "e203de7ad10abc45", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-410e662b68523b24", "level": "note", "message": {"text": "Legacy-named symbol `navOld` in routes/product_detail_images.js:32"}, "properties": {"repobilityId": "ccd5c369720b241d", "scanner": "scanner-primary", "fingerprint": "410e662b68523b24", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-74700dfbd5d5fe2a", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 core/memory.js:44"}, "properties": {"repobilityId": "c0156e2df2b1e64c", "scanner": "scanner-primary", "fingerprint": "74700dfbd5d5fe2a", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-1b4023b4c4adc329", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 core/profiler.js:14"}, "properties": {"repobilityId": "e6d162ba938c5336", "scanner": "scanner-primary", "fingerprint": "1b4023b4c4adc329", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-8a21184cec01db34", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 core/compressor.js:49"}, "properties": {"repobilityId": "82bf7c656395d661", "scanner": "scanner-primary", "fingerprint": "8a21184cec01db34", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-fbca9d8ec84fd70a", "level": "note", "message": {"text": "Legacy-named symbol `fuzzyOld` in skills/pipeline_update_rules.js:70"}, "properties": {"repobilityId": "d3390fdf945b8832", "scanner": "scanner-primary", "fingerprint": "fbca9d8ec84fd70a", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-c31062507cb3dca9", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 public/js/app.js:1133"}, "properties": {"repobilityId": "41fb395acc5d1519", "scanner": "scanner-primary", "fingerprint": "c31062507cb3dca9", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-6dbddca314a729eb", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 public/admin/workbench-data.js:1395"}, "properties": {"repobilityId": "707f3a266c547827", "scanner": "scanner-primary", "fingerprint": "6dbddca314a729eb", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-6f6dc5fe3dd4062f", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 public/admin/workbench-geo.js:197"}, "properties": {"repobilityId": "c3eae384e0444151", "scanner": "scanner-primary", "fingerprint": "6f6dc5fe3dd4062f", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-eeb452512b8afb30", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 public/admin/workbench-ai.js:955"}, "properties": {"repobilityId": "96096fd2930558e1", "scanner": "scanner-primary", "fingerprint": "eeb452512b8afb30", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-50ae843ab0a86454", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 knowledge/ingest.js:85"}, "properties": {"repobilityId": "006d7ebf27a9e896", "scanner": "scanner-primary", "fingerprint": "50ae843ab0a86454", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-2c04133e54348533", "level": "note", "message": {"text": "Near-duplicate function bodies in 2 places"}, "properties": {"repobilityId": "c069bb63ee07993a", "scanner": "scanner-primary", "fingerprint": "2c04133e54348533", "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": "a451e40c21c03dfd", "scanner": "scanner-primary", "fingerprint": "2c04133e54348533", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-fb88c9ecb42e410c", "level": "error", "message": {"text": "Dangling fetch: POST https://open.feishu.cn/open-apis/auth/v3/tenant_access_token/internal (scripts/weekly_refresh.js:68)"}, "properties": {"repobilityId": "ac2576c9f9edee3d", "scanner": "scanner-primary", "fingerprint": "fb88c9ecb42e410c", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-5699b90c8e0e44f1", "level": "error", "message": {"text": "Dangling fetch: POST https://open.feishu.cn/open-apis/im/v1/messages?receive_id_type=${rcvType} (scripts/weekly_refresh.js:75)"}, "properties": {"repobilityId": "77d561b3714118aa", "scanner": "scanner-primary", "fingerprint": "5699b90c8e0e44f1", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-46f9b70261f78559", "level": "error", "message": {"text": "Dangling fetch: POST https://dashscope.aliyuncs.com/compatible-mode/v1/chat/completions (scripts/gen_qa.js:11)"}, "properties": {"repobilityId": "498a3c25945e8227", "scanner": "scanner-primary", "fingerprint": "46f9b70261f78559", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-4d138b808a55f138", "level": "error", "message": {"text": "Dangling fetch: POST https://dashscope.aliyuncs.com/compatible-mode/v1/chat/completions (scripts/gen_qa_full.js:13)"}, "properties": {"repobilityId": "24ba8df393f7d144", "scanner": "scanner-primary", "fingerprint": "4d138b808a55f138", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-1b38603fd2afd669", "level": "error", "message": {"text": "Dangling fetch: POST https://dashscope.aliyuncs.com/compatible-mode/v1/chat/completions (scripts/ocr_image_docs.js:20)"}, "properties": {"repobilityId": "76316b9b9b30b3e5", "scanner": "scanner-primary", "fingerprint": "1b38603fd2afd669", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-b50101bd7ae203db", "level": "error", "message": {"text": "Dangling fetch: POST https://dashscope.aliyuncs.com/compatible-mode/v1/chat/completions (scripts/ocr_image_docs.js:66)"}, "properties": {"repobilityId": "cb9e2e8699bf26fe", "scanner": "scanner-primary", "fingerprint": "b50101bd7ae203db", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-2c02314c688a5cf4", "level": "error", "message": {"text": "Dangling fetch: POST https://dashscope.aliyuncs.com/compatible-mode/v1/chat/completions (scripts/test_qa_v2.js:99)"}, "properties": {"repobilityId": "2d190bb39e3164da", "scanner": "scanner-primary", "fingerprint": "2c02314c688a5cf4", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-5fa600a67dd1821d", "level": "error", "message": {"text": "Dangling fetch: POST https://dashscope.aliyuncs.com/compatible-mode/v1/chat/completions (scripts/gen_qa_v2.js:167)"}, "properties": {"repobilityId": "dfe15a6b50fdee94", "scanner": "scanner-primary", "fingerprint": "5fa600a67dd1821d", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-d94ca4ee342dc706", "level": "error", "message": {"text": "Dangling fetch: POST https://dashscope.aliyuncs.com/compatible-mode/v1/chat/completions (scripts/regen_qa_guides.js:72)"}, "properties": {"repobilityId": "465ff0f02a2bcc3d", "scanner": "scanner-primary", "fingerprint": "d94ca4ee342dc706", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-dd56fa3b0ecfc350", "level": "error", "message": {"text": "Dangling fetch: POST https://dashscope.aliyuncs.com/compatible-mode/v1/chat/completions (scripts/ocr_test.js:18)"}, "properties": {"repobilityId": "4586365d7b3916b4", "scanner": "scanner-primary", "fingerprint": "dd56fa3b0ecfc350", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-8d6e0b91f4c9b1d5", "level": "error", "message": {"text": "Dangling fetch: POST https://dashscope.aliyuncs.com/compatible-mode/v1/chat/completions (scripts/ocr_test.js:50)"}, "properties": {"repobilityId": "a507a5f23295ac75", "scanner": "scanner-primary", "fingerprint": "8d6e0b91f4c9b1d5", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-86eea686b71a716b", "level": "error", "message": {"text": "Dangling fetch: GET /api/product/${encodeURIComponent(sku)}/detail-images (public/js/app.js:95)"}, "properties": {"repobilityId": "f5f9ccf3f5ee33ad", "scanner": "scanner-primary", "fingerprint": "86eea686b71a716b", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-ef58201b48d98749", "level": "error", "message": {"text": "Dangling fetch: POST /api/chat/quick (public/js/app.js:752)"}, "properties": {"repobilityId": "5257934b70fe6d78", "scanner": "scanner-primary", "fingerprint": "ef58201b48d98749", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-4606ade96ce5badf", "level": "error", "message": {"text": "Dangling fetch: GET /api/auth/me (public/js/app.js:1101)"}, "properties": {"repobilityId": "2a221820a4380945", "scanner": "scanner-primary", "fingerprint": "4606ade96ce5badf", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-5ac682f90aacffa7", "level": "error", "message": {"text": "Dangling fetch: POST /api/auth/send-code (public/js/app.js:1133)"}, "properties": {"repobilityId": "745a1c880a163f2a", "scanner": "scanner-primary", "fingerprint": "5ac682f90aacffa7", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-2e79758af87725c5", "level": "error", "message": {"text": "Dangling fetch: POST /api/auth/login (public/js/app.js:1143)"}, "properties": {"repobilityId": "d21b834d881d390a", "scanner": "scanner-primary", "fingerprint": "2e79758af87725c5", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-9b1deb009e6474e7", "level": "error", "message": {"text": "Dangling fetch: POST /api/auth/logout (public/js/app.js:1155)"}, "properties": {"repobilityId": "c8b359428e67416b", "scanner": "scanner-primary", "fingerprint": "9b1deb009e6474e7", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-5ce054ec1b3b4c61", "level": "error", "message": {"text": "Dangling fetch: POST /api/chat/stream (public/js/app.js:1265)"}, "properties": {"repobilityId": "ffe281e918f75940", "scanner": "scanner-primary", "fingerprint": "5ce054ec1b3b4c61", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-4b131c441181f109", "level": "error", "message": {"text": "Dangling fetch: GET /api/stores/geocode?address=${encodeURIComponent(address)} (public/js/app.js:2645)"}, "properties": {"repobilityId": "346728c50f972675", "scanner": "scanner-primary", "fingerprint": "4b131c441181f109", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-beae99ac9ac44c05", "level": "error", "message": {"text": "Dangling fetch: GET /api/stores/nearby?lat=${encodeURIComponent(geo.lat)}&lng=${encodeURIComponent(geo.lng)} (public/js/app.js:2647)"}, "properties": {"repobilityId": "308e76a1e1706332", "scanner": "scanner-primary", "fingerprint": "beae99ac9ac44c05", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-17c76407e032a956", "level": "error", "message": {"text": "Dangling fetch: GET /api/leai/auth (public/js/app.js:2999)"}, "properties": {"repobilityId": "c4eab96a4f8712a2", "scanner": "scanner-primary", "fingerprint": "17c76407e032a956", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-867915db269199f5", "level": "error", "message": {"text": "Dangling fetch: POST /api/leai/chat (public/js/app.js:3006)"}, "properties": {"repobilityId": "dfab4ec607c0001c", "scanner": "scanner-primary", "fingerprint": "867915db269199f5", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-9be6d19a323b579d", "level": "error", "message": {"text": "Dangling fetch: POST /api/chat/quick (public/js/app.js:3221)"}, "properties": {"repobilityId": "8016eea50f914469", "scanner": "scanner-primary", "fingerprint": "9be6d19a323b579d", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-bb7ca96d3eee762a", "level": "error", "message": {"text": "Dangling fetch: POST /api/chat/stream (public/js/app.js:4071)"}, "properties": {"repobilityId": "0c53fa4ff5445557", "scanner": "scanner-primary", "fingerprint": "bb7ca96d3eee762a", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-0bc19402b8dc63b5", "level": "error", "message": {"text": "Dangling fetch: POST /api/chat/stream (public/js/fullscreen-chat.js:297)"}, "properties": {"repobilityId": "a630053fb5c2ecbf", "scanner": "scanner-primary", "fingerprint": "0bc19402b8dc63b5", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-0148468599c8528f", "level": "error", "message": {"text": "Dangling fetch: GET /api/harness/skills/grouped (public/admin/workbench-data.js:4)"}, "properties": {"repobilityId": "81ba1d8b2a44f6b9", "scanner": "scanner-primary", "fingerprint": "0148468599c8528f", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-4746fbbacc6a502e", "level": "error", "message": {"text": "Dangling fetch: PATCH /api/admin/skills/${name} (public/admin/workbench-data.js:32)"}, "properties": {"repobilityId": "e631022fc3bcc944", "scanner": "scanner-primary", "fingerprint": "4746fbbacc6a502e", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-0a24ec6984e0aab2", "level": "error", "message": {"text": "Dangling fetch: GET /api/harness/roles (public/admin/workbench-data.js:41)"}, "properties": {"repobilityId": "4c27327d68e850cb", "scanner": "scanner-primary", "fingerprint": "0a24ec6984e0aab2", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-aaf02c4fc6048461", "level": "error", "message": {"text": "Dangling fetch: GET /health (public/admin/workbench-data.js:72)"}, "properties": {"repobilityId": "fd25011cdb2e057d", "scanner": "scanner-primary", "fingerprint": "aaf02c4fc6048461", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-cf7016f19208d576", "level": "error", "message": {"text": "Dangling fetch: GET /api/admin/stats (public/admin/workbench-data.js:114)"}, "properties": {"repobilityId": "9e82cf5c678b440e", "scanner": "scanner-primary", "fingerprint": "cf7016f19208d576", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-b7f40134d500c7f4", "level": "error", "message": {"text": "Dangling fetch: POST /api/knowledge/upload (public/admin/workbench-data.js:180)"}, "properties": {"repobilityId": "2ff686503d16c625", "scanner": "scanner-primary", "fingerprint": "b7f40134d500c7f4", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-2d083a5b247abe08", "level": "error", "message": {"text": "Dangling fetch: POST /api/admin/manual-qa (public/admin/workbench-data.js:206)"}, "properties": {"repobilityId": "90e61901a0e0a4dd", "scanner": "scanner-primary", "fingerprint": "2d083a5b247abe08", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-feaf1804e5de4d74", "level": "error", "message": {"text": "Dangling fetch: GET /api/admin/conversations?limit=50 (public/admin/workbench-data.js:297)"}, "properties": {"repobilityId": "3d5f4c3aadeadbf0", "scanner": "scanner-primary", "fingerprint": "feaf1804e5de4d74", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-d82d36b5cac8d6f6", "level": "error", "message": {"text": "Dangling fetch: GET /api/admin/conversations/${convId} (public/admin/workbench-data.js:319)"}, "properties": {"repobilityId": "a5e71bccc8ae6935", "scanner": "scanner-primary", "fingerprint": "d82d36b5cac8d6f6", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-0722335d775b7f15", "level": "error", "message": {"text": "Dangling fetch: GET /api/admin/query-analysis (public/admin/workbench-data.js:342)"}, "properties": {"repobilityId": "e8efc9346363082a", "scanner": "scanner-primary", "fingerprint": "0722335d775b7f15", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-7e73663c975a66c4", "level": "error", "message": {"text": "Dangling fetch: POST /api/harness/chat (public/admin/workbench-data.js:395)"}, "properties": {"repobilityId": "4b756888973973c2", "scanner": "scanner-primary", "fingerprint": "7e73663c975a66c4", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-b89e4b847d6e632d", "level": "error", "message": {"text": "Dangling fetch: GET /api/admin/staff/stats (public/admin/workbench-data.js:419)"}, "properties": {"repobilityId": "053790b88554a891", "scanner": "scanner-primary", "fingerprint": "b89e4b847d6e632d", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-3080cb166cbb579e", "level": "error", "message": {"text": "Dangling fetch: GET /api/admin/user-profiles (public/admin/workbench-data.js:460)"}, "properties": {"repobilityId": "92bd335702a90c6e", "scanner": "scanner-primary", "fingerprint": "3080cb166cbb579e", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-6fcaaa034337f907", "level": "error", "message": {"text": "Dangling fetch: GET /api/admin/users (public/admin/workbench-data.js:478)"}, "properties": {"repobilityId": "d697784514e9e30e", "scanner": "scanner-primary", "fingerprint": "6fcaaa034337f907", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-fb3032069e2cbfbd", "level": "error", "message": {"text": "Dangling fetch: POST /api/admin/users (public/admin/workbench-data.js:492)"}, "properties": {"repobilityId": "6e0b46c3236b7576", "scanner": "scanner-primary", "fingerprint": "fb3032069e2cbfbd", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-522202bd158247eb", "level": "error", "message": {"text": "Dangling fetch: DELETE /api/admin/users/${id} (public/admin/workbench-data.js:498)"}, "properties": {"repobilityId": "9c3663cdf9dabdf4", "scanner": "scanner-primary", "fingerprint": "522202bd158247eb", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-85320390ee207876", "level": "error", "message": {"text": "Dangling fetch: GET /api/admin/personas (public/admin/workbench-data.js:505)"}, "properties": {"repobilityId": "96f9538bac3ea1ac", "scanner": "scanner-primary", "fingerprint": "85320390ee207876", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-1986a61daed36b8a", "level": "error", "message": {"text": "Dangling fetch: POST /api/admin/personas (public/admin/workbench-data.js:529)"}, "properties": {"repobilityId": "07497c09fe019bb5", "scanner": "scanner-primary", "fingerprint": "1986a61daed36b8a", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-af9aa7cb5c5914aa", "level": "error", "message": {"text": "Dangling fetch: PUT /api/admin/personas/${id}/activate (public/admin/workbench-data.js:534)"}, "properties": {"repobilityId": "4a6e35eb3d770c3a", "scanner": "scanner-primary", "fingerprint": "af9aa7cb5c5914aa", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-c77a597945b227ec", "level": "error", "message": {"text": "Dangling fetch: DELETE /api/admin/personas/${id} (public/admin/workbench-data.js:538)"}, "properties": {"repobilityId": "78901004e7df00fa", "scanner": "scanner-primary", "fingerprint": "c77a597945b227ec", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-235354cb2b057ca5", "level": "error", "message": {"text": "Dangling fetch: GET /api/admin/metrics (public/admin/workbench-data.js:544)"}, "properties": {"repobilityId": "80431927ba94083c", "scanner": "scanner-primary", "fingerprint": "235354cb2b057ca5", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-b907102bcc235901", "level": "error", "message": {"text": "Dangling fetch: POST /api/admin/metrics/collect (public/admin/workbench-data.js:572)"}, "properties": {"repobilityId": "b4e294b69d4ab279", "scanner": "scanner-primary", "fingerprint": "b907102bcc235901", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-c78a94638dcbaeec", "level": "error", "message": {"text": "Dangling fetch: GET /api/admin/evolution-notes (public/admin/workbench-data.js:580)"}, "properties": {"repobilityId": "528f016f9891378f", "scanner": "scanner-primary", "fingerprint": "c78a94638dcbaeec", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-53b55411a1784519", "level": "error", "message": {"text": "Dangling fetch: GET /api/admin/reflections?limit=10 (public/admin/workbench-data.js:580)"}, "properties": {"repobilityId": "4598d2ba48532da4", "scanner": "scanner-primary", "fingerprint": "53b55411a1784519", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-57645a7ad3e8cfe7", "level": "error", "message": {"text": "Dangling fetch: GET /api/admin/learning-status (public/admin/workbench-data.js:580)"}, "properties": {"repobilityId": "db531b50ce24b16d", "scanner": "scanner-primary", "fingerprint": "57645a7ad3e8cfe7", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-837d5b1dece3879a", "level": "error", "message": {"text": "Dangling fetch: POST /api/admin/run-evolution (public/admin/workbench-data.js:619)"}, "properties": {"repobilityId": "9b88111c818b9e20", "scanner": "scanner-primary", "fingerprint": "837d5b1dece3879a", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-f8c88d1b38ade5cf", "level": "error", "message": {"text": "Dangling fetch: POST /api/admin/run-learning (public/admin/workbench-data.js:623)"}, "properties": {"repobilityId": "3e2104b558452c81", "scanner": "scanner-primary", "fingerprint": "f8c88d1b38ade5cf", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-7fc89c901b0c72e9", "level": "error", "message": {"text": "Dangling fetch: GET /api/admin/regression-cases (public/admin/workbench-data.js:630)"}, "properties": {"repobilityId": "e984d5756b3d4344", "scanner": "scanner-primary", "fingerprint": "7fc89c901b0c72e9", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-bd339f5cded03f51", "level": "error", "message": {"text": "Dangling fetch: POST /api/admin/regression-cases (public/admin/workbench-data.js:646)"}, "properties": {"repobilityId": "b311b7fe43ff2da0", "scanner": "scanner-primary", "fingerprint": "bd339f5cded03f51", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-7f8740148da7aa90", "level": "error", "message": {"text": "Dangling fetch: DELETE /api/admin/regression-cases/${id} (public/admin/workbench-data.js:652)"}, "properties": {"repobilityId": "5f4e5579e6db6a78", "scanner": "scanner-primary", "fingerprint": "7f8740148da7aa90", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-dd97ddd390c622d7", "level": "error", "message": {"text": "Dangling fetch: POST /api/admin/regression-cases/run (public/admin/workbench-data.js:656)"}, "properties": {"repobilityId": "dc6599b013f5551b", "scanner": "scanner-primary", "fingerprint": "dd97ddd390c622d7", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-9b0565187f701ad6", "level": "error", "message": {"text": "Dangling fetch: POST /api/admin/pages (public/admin/workbench-data.js:1035)"}, "properties": {"repobilityId": "361439008f43b50e", "scanner": "scanner-primary", "fingerprint": "9b0565187f701ad6", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-e148dafcc6fe8093", "level": "error", "message": {"text": "Dangling fetch: POST /api/harness/chat (public/admin/workbench-data.js:1086)"}, "properties": {"repobilityId": "96b82057f2df853d", "scanner": "scanner-primary", "fingerprint": "e148dafcc6fe8093", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-c81faa34165faa72", "level": "error", "message": {"text": "Dangling fetch: GET /api/admin/bot-config (public/admin/workbench-data.js:1175)"}, "properties": {"repobilityId": "f86c1ffa747ac44d", "scanner": "scanner-primary", "fingerprint": "c81faa34165faa72", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-ac2a59e7f9a292d6", "level": "error", "message": {"text": "Dangling fetch: PUT /api/admin/bot-config (public/admin/workbench-data.js:1213)"}, "properties": {"repobilityId": "addda977476f076d", "scanner": "scanner-primary", "fingerprint": "ac2a59e7f9a292d6", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-e347836faf162b03", "level": "error", "message": {"text": "Dangling fetch: GET /api/admin/logs?limit=50 (public/admin/workbench-data.js:1222)"}, "properties": {"repobilityId": "5221769c3aa0a340", "scanner": "scanner-primary", "fingerprint": "e347836faf162b03", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-e28158be426ec009", "level": "error", "message": {"text": "Dangling fetch: GET /api/admin/product-categories (public/admin/workbench-data.js:1250)"}, "properties": {"repobilityId": "f18845521f13a737", "scanner": "scanner-primary", "fingerprint": "e28158be426ec009", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-1f7b93c65d755086", "level": "error", "message": {"text": "Dangling fetch: GET /api/admin/products/stats (public/admin/workbench-data.js:1251)"}, "properties": {"repobilityId": "ee1777d368428677", "scanner": "scanner-primary", "fingerprint": "1f7b93c65d755086", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-c4e2e66ab5b7e335", "level": "error", "message": {"text": "Dangling fetch: GET /api/admin/products/${editId} (public/admin/workbench-data.js:1317)"}, "properties": {"repobilityId": "1d43768f6d24ec62", "scanner": "scanner-primary", "fingerprint": "c4e2e66ab5b7e335", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-bc86e0d6bd024f03", "level": "error", "message": {"text": "Dangling fetch: DELETE /api/admin/products/${id} (public/admin/workbench-data.js:1377)"}, "properties": {"repobilityId": "f8f69e33a6bbc822", "scanner": "scanner-primary", "fingerprint": "bc86e0d6bd024f03", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-aaf1960ac5e81f1e", "level": "error", "message": {"text": "Dangling fetch: GET /api/admin/product-categories (public/admin/workbench-data.js:1386)"}, "properties": {"repobilityId": "da2371cbebe321a1", "scanner": "scanner-primary", "fingerprint": "aaf1960ac5e81f1e", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-55852bf94bb32c40", "level": "error", "message": {"text": "Dangling fetch: GET /api/admin/products/category-counts (public/admin/workbench-data.js:1395)"}, "properties": {"repobilityId": "838320999d21095d", "scanner": "scanner-primary", "fingerprint": "55852bf94bb32c40", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-e07c94438a7d62c0", "level": "error", "message": {"text": "Dangling fetch: POST /api/admin/product-categories (public/admin/workbench-data.js:1415)"}, "properties": {"repobilityId": "e0c1c4a4eaa44e08", "scanner": "scanner-primary", "fingerprint": "e07c94438a7d62c0", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-6f7fc3cb45e76af4", "level": "error", "message": {"text": "Dangling fetch: DELETE /api/admin/product-categories/${id} (public/admin/workbench-data.js:1423)"}, "properties": {"repobilityId": "acc5fa405ce55d42", "scanner": "scanner-primary", "fingerprint": "6f7fc3cb45e76af4", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-b09cab0069fa3099", "level": "error", "message": {"text": "Dangling fetch: GET /api/admin/marketing-tasks (public/admin/workbench-data.js:1432)"}, "properties": {"repobilityId": "2fb57f5c5fefcc1a", "scanner": "scanner-primary", "fingerprint": "b09cab0069fa3099", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-3498b6f5aa1b9be8", "level": "error", "message": {"text": "Dangling fetch: GET /api/admin/marketing-tasks (public/admin/workbench-data.js:1494)"}, "properties": {"repobilityId": "361f48353feb5014", "scanner": "scanner-primary", "fingerprint": "3498b6f5aa1b9be8", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-d9885cd33d3156b9", "level": "error", "message": {"text": "Dangling fetch: PUT /api/admin/marketing-tasks/${id}/execute (public/admin/workbench-data.js:1530)"}, "properties": {"repobilityId": "63a42ee1c0b3f828", "scanner": "scanner-primary", "fingerprint": "d9885cd33d3156b9", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-0668986096a44399", "level": "error", "message": {"text": "Dangling fetch: DELETE /api/admin/marketing-tasks/${id} (public/admin/workbench-data.js:1538)"}, "properties": {"repobilityId": "70039411591d108a", "scanner": "scanner-primary", "fingerprint": "0668986096a44399", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-ae5431b3da4162d9", "level": "error", "message": {"text": "Dangling fetch: GET /api/admin/stats (public/admin/workbench-data.js:1546)"}, "properties": {"repobilityId": "dff240160be02b84", "scanner": "scanner-primary", "fingerprint": "ae5431b3da4162d9", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-a9c635a840f888c5", "level": "error", "message": {"text": "Dangling fetch: GET /api/admin/experiments (public/admin/workbench-data.js:1601)"}, "properties": {"repobilityId": "07448ad3fdc09d60", "scanner": "scanner-primary", "fingerprint": "a9c635a840f888c5", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-416b466481bfa42d", "level": "error", "message": {"text": "Dangling fetch: PUT /api/admin/experiments/${id}/status (public/admin/workbench-data.js:1635)"}, "properties": {"repobilityId": "c3469bc00160c76b", "scanner": "scanner-primary", "fingerprint": "416b466481bfa42d", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-6ba05816da476760", "level": "error", "message": {"text": "Dangling fetch: POST /api/admin/experiments (public/admin/workbench-data.js:1666)"}, "properties": {"repobilityId": "25eea53722d96d45", "scanner": "scanner-primary", "fingerprint": "6ba05816da476760", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-878c1db1576daf3b", "level": "error", "message": {"text": "Dangling fetch: POST /api/admin/backup (public/admin/workbench-data.js:1679)"}, "properties": {"repobilityId": "d002977120ab20ce", "scanner": "scanner-primary", "fingerprint": "878c1db1576daf3b", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-c359b758a7644db3", "level": "error", "message": {"text": "Dangling fetch: POST /api/admin/restart (public/admin/workbench-data.js:1688)"}, "properties": {"repobilityId": "b693f550e6547336", "scanner": "scanner-primary", "fingerprint": "c359b758a7644db3", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-8b7c6412df6c1b9b", "level": "error", "message": {"text": "Dangling fetch: GET /api/lenovo/support/articles (public/admin/workbench-data.js:1701)"}, "properties": {"repobilityId": "46d1eb5f51770fab", "scanner": "scanner-primary", "fingerprint": "8b7c6412df6c1b9b", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-805e2c39fefbb1be", "level": "error", "message": {"text": "Dangling fetch: GET /api/lenovo/support/drivers?keyword=${encodeURIComponent(kw)} (public/admin/workbench-data.js:1726)"}, "properties": {"repobilityId": "9aa2ad5758403428", "scanner": "scanner-primary", "fingerprint": "805e2c39fefbb1be", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-0793f5fd07db3cda", "level": "error", "message": {"text": "Dangling fetch: GET /api/lenovo/user/order/list (public/admin/workbench-data.js:1746)"}, "properties": {"repobilityId": "78b4b1e48686407a", "scanner": "scanner-primary", "fingerprint": "0793f5fd07db3cda", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-c787f07c06e0b80e", "level": "error", "message": {"text": "Dangling fetch: GET /api/stores/geocode?address=${encodeURIComponent(address)} (public/admin/workbench-data.js:1772)"}, "properties": {"repobilityId": "f9902333cde055e9", "scanner": "scanner-primary", "fingerprint": "c787f07c06e0b80e", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-b1660844bf697ccd", "level": "error", "message": {"text": "Dangling fetch: GET /api/stores/nearby?lat=${geo.lat}&lng=${geo.lng} (public/admin/workbench-data.js:1776)"}, "properties": {"repobilityId": "430481e40c4d0ef4", "scanner": "scanner-primary", "fingerprint": "b1660844bf697ccd", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-1c2e88d42bc6e2c4", "level": "error", "message": {"text": "Dangling fetch: GET /aiadmin/proxy/old/cdashboard/dashboard/channel (public/admin/workbench-data.js:1921)"}, "properties": {"repobilityId": "982cb25b75126bb8", "scanner": "scanner-primary", "fingerprint": "1c2e88d42bc6e2c4", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-9a72280f01076c7a", "level": "error", "message": {"text": "Dangling fetch: GET /aiadmin/proxy/old/cdashboard/dashboard/area (public/admin/workbench-data.js:1922)"}, "properties": {"repobilityId": "f9d4cfcc412627ed", "scanner": "scanner-primary", "fingerprint": "9a72280f01076c7a", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-d60bb5ab6420a7ea", "level": "error", "message": {"text": "Dangling fetch: POST /aiadmin/proxy/new/smart/touch/transformer/list (public/admin/workbench-data.js:2037)"}, "properties": {"repobilityId": "e618ee34dc4041d0", "scanner": "scanner-primary", "fingerprint": "d60bb5ab6420a7ea", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-8e3703dfc2a55386", "level": "error", "message": {"text": "Dangling fetch: GET /aiadmin/proxy/new/smart/touch/user/tag/group/all (public/admin/workbench-data.js:2064)"}, "properties": {"repobilityId": "f44f0595452fcf2f", "scanner": "scanner-primary", "fingerprint": "8e3703dfc2a55386", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-77ba8c911af3c1da", "level": "error", "message": {"text": "Dangling fetch: GET /aiadmin/proxy/new/smart/touch/user/tag/profile/all (public/admin/workbench-data.js:2075)"}, "properties": {"repobilityId": "85ccfb5e557b6995", "scanner": "scanner-primary", "fingerprint": "77ba8c911af3c1da", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-81a17e45f7793dc9", "level": "error", "message": {"text": "Dangling fetch: GET /aiadmin/proxy/new/smart/touch/material/event/list (public/admin/workbench-data.js:2081)"}, "properties": {"repobilityId": "ade14ffe5055330f", "scanner": "scanner-primary", "fingerprint": "81a17e45f7793dc9", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-c0ee255ad1d6056b", "level": "error", "message": {"text": "Dangling fetch: POST /api/geo-dashboard/sites (public/admin/workbench-geo.js:505)"}, "properties": {"repobilityId": "863d3cfd3a0b9cd4", "scanner": "scanner-primary", "fingerprint": "c0ee255ad1d6056b", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-d324fc9423a9a951", "level": "error", "message": {"text": "Dangling fetch: POST /api/geo-dashboard/sites (public/admin/workbench-geo.js:853)"}, "properties": {"repobilityId": "6f0fcb8b02f76d26", "scanner": "scanner-primary", "fingerprint": "d324fc9423a9a951", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-9b6dad968faca74c", "level": "error", "message": {"text": "Dangling fetch: POST /api/geo-dashboard/summary (public/admin/workbench-geo.js:1293)"}, "properties": {"repobilityId": "3ff02cc375983a1d", "scanner": "scanner-primary", "fingerprint": "9b6dad968faca74c", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-dbfab65113d2d110", "level": "error", "message": {"text": "Dangling fetch: GET /api/pipeline/stats/history (public/admin/workbench-pipeline.js:815)"}, "properties": {"repobilityId": "c726c0363257a158", "scanner": "scanner-primary", "fingerprint": "dbfab65113d2d110", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-6fe925aa7b268d20", "level": "error", "message": {"text": "Dangling fetch: POST /api/pipeline/classify (public/admin/workbench-pipeline.js:1261)"}, "properties": {"repobilityId": "bab285e40f691c5b", "scanner": "scanner-primary", "fingerprint": "6fe925aa7b268d20", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-2e28b7cd1d602b8a", "level": "error", "message": {"text": "Dangling fetch: POST /api/pipeline/stats (public/admin/workbench-pipeline.js:1791)"}, "properties": {"repobilityId": "4267bfb6d735124c", "scanner": "scanner-primary", "fingerprint": "2e28b7cd1d602b8a", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-508b1d8879cdb547", "level": "error", "message": {"text": "Dangling fetch: GET /api/pipeline/stats/history (public/admin/workbench-pipeline.js:1816)"}, "properties": {"repobilityId": "7ad6e5116e290844", "scanner": "scanner-primary", "fingerprint": "508b1d8879cdb547", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-a75d6bb61b9fee7a", "level": "error", "message": {"text": "Dangling fetch: POST /api/pipeline/filter (public/admin/workbench-pipeline.js:1844)"}, "properties": {"repobilityId": "436684550aed1c74", "scanner": "scanner-primary", "fingerprint": "a75d6bb61b9fee7a", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-a46de599af7ccae3", "level": "error", "message": {"text": "Dangling fetch: GET /health (public/admin/workbench-pipeline.js:1867)"}, "properties": {"repobilityId": "917a7c8875cc253c", "scanner": "scanner-primary", "fingerprint": "a46de599af7ccae3", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-60b31876460e01bf", "level": "error", "message": {"text": "Dangling fetch: GET /api/pipeline/stats/history (public/admin/workbench-pipeline.js:1872)"}, "properties": {"repobilityId": "97c1fb03eb234700", "scanner": "scanner-primary", "fingerprint": "60b31876460e01bf", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-b8bcb15bf3cbe370", "level": "error", "message": {"text": "Dangling fetch: GET /api/pipeline/pipeline/status (public/admin/workbench-pipeline.js:1894)"}, "properties": {"repobilityId": "a125050979e93474", "scanner": "scanner-primary", "fingerprint": "b8bcb15bf3cbe370", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-c25d132584e409f5", "level": "error", "message": {"text": "Dangling fetch: GET /api/pipeline/pipeline/status (public/admin/workbench-pipeline.js:1977)"}, "properties": {"repobilityId": "06b81d2000cb301a", "scanner": "scanner-primary", "fingerprint": "c25d132584e409f5", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-6a094887038e8e85", "level": "error", "message": {"text": "Dangling fetch: GET /api/pipeline/classify/rules/status (public/admin/workbench-ai.js:1017)"}, "properties": {"repobilityId": "42df60ef8a0f9f8d", "scanner": "scanner-primary", "fingerprint": "6a094887038e8e85", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-d23ba1cc017324a8", "level": "error", "message": {"text": "Dangling fetch: POST /api/harness/upload (public/admin/workbench-ai.js:1138)"}, "properties": {"repobilityId": "9521e8d14c0506d8", "scanner": "scanner-primary", "fingerprint": "d23ba1cc017324a8", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-11f34f35552cb900", "level": "error", "message": {"text": "Dangling fetch: POST /api/harness/chat (public/admin/workbench-ai.js:1273)"}, "properties": {"repobilityId": "5f5e9a453db1b48e", "scanner": "scanner-primary", "fingerprint": "11f34f35552cb900", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-6eb452fbfb454d20", "level": "note", "message": {"text": "Unused endpoint: USE /api/auth"}, "properties": {"repobilityId": "166e9dd94854ec87", "scanner": "scanner-primary", "fingerprint": "6eb452fbfb454d20", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-2b92dc87a4256298", "level": "note", "message": {"text": "Unused endpoint: USE /api/chat"}, "properties": {"repobilityId": "b69caf7dde629458", "scanner": "scanner-primary", "fingerprint": "2b92dc87a4256298", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-0c1b6ce2fd726244", "level": "note", "message": {"text": "Unused endpoint: USE /api/knowledge"}, "properties": {"repobilityId": "99fde4ab3800e28f", "scanner": "scanner-primary", "fingerprint": "0c1b6ce2fd726244", "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": "49e469da0d5299b6", "scanner": "scanner-primary", "fingerprint": "bc1b63be5d263466", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-d93a530ce10d47d9", "level": "note", "message": {"text": "Unused endpoint: USE /api/admin"}, "properties": {"repobilityId": "7cf1ce4709c13e8a", "scanner": "scanner-primary", "fingerprint": "d93a530ce10d47d9", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-87e11545febd55d7", "level": "note", "message": {"text": "Unused endpoint: USE /api/harness"}, "properties": {"repobilityId": "8b69eef52806916a", "scanner": "scanner-primary", "fingerprint": "87e11545febd55d7", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-d66296d3e9e372b1", "level": "note", "message": {"text": "Unused endpoint: USE /api/uploader"}, "properties": {"repobilityId": "6c72da1f2cc5003b", "scanner": "scanner-primary", "fingerprint": "d66296d3e9e372b1", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-ed2d81decc862c7e", "level": "note", "message": {"text": "Unused endpoint: USE /api/log"}, "properties": {"repobilityId": "5c9efe7664ae770b", "scanner": "scanner-primary", "fingerprint": "ed2d81decc862c7e", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-c08702293d844bd1", "level": "note", "message": {"text": "Unused endpoint: USE /api/stores"}, "properties": {"repobilityId": "491da7dc8d5988b9", "scanner": "scanner-primary", "fingerprint": "c08702293d844bd1", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-85c03a8f1fcf9833", "level": "note", "message": {"text": "Unused endpoint: USE /api/leai"}, "properties": {"repobilityId": "45b5bbe20232ef73", "scanner": "scanner-primary", "fingerprint": "85c03a8f1fcf9833", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-052a95a96096ee74", "level": "note", "message": {"text": "Unused endpoint: USE /api/lenovo"}, "properties": {"repobilityId": "01128b1ca5cc44f2", "scanner": "scanner-primary", "fingerprint": "052a95a96096ee74", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-fcd53ad325a9d3dc", "level": "note", "message": {"text": "Unused endpoint: USE /api/product"}, "properties": {"repobilityId": "f15670878e7a13e0", "scanner": "scanner-primary", "fingerprint": "fcd53ad325a9d3dc", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-778e714e4eb10d56", "level": "note", "message": {"text": "Unused endpoint: USE /api/pointer"}, "properties": {"repobilityId": "68c60bdd3ce8c70a", "scanner": "scanner-primary", "fingerprint": "778e714e4eb10d56", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-ccd9c54d68b606cd", "level": "note", "message": {"text": "Unused endpoint: USE /api/webhook"}, "properties": {"repobilityId": "c2abf83aae78e6c9", "scanner": "scanner-primary", "fingerprint": "ccd9c54d68b606cd", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-f1042343658b154b", "level": "note", "message": {"text": "Unused endpoint: USE /api/geo-dashboard"}, "properties": {"repobilityId": "f9109f43abd12e18", "scanner": "scanner-primary", "fingerprint": "f1042343658b154b", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-0ab055a45f0b96b6", "level": "note", "message": {"text": "Unused endpoint: USE /api/pipeline"}, "properties": {"repobilityId": "4f477a17fb7d7942", "scanner": "scanner-primary", "fingerprint": "0ab055a45f0b96b6", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-1241aa6b5313a19c", "level": "note", "message": {"text": "Unused endpoint: USE /api/supplier"}, "properties": {"repobilityId": "ff50e6d8fd4b395c", "scanner": "scanner-primary", "fingerprint": "1241aa6b5313a19c", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-433aa78bbf1b1b38", "level": "note", "message": {"text": "Unused endpoint: USE /api/site"}, "properties": {"repobilityId": "5e32df190c2453dc", "scanner": "scanner-primary", "fingerprint": "433aa78bbf1b1b38", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-f02a079c69b52f2d", "level": "note", "message": {"text": "Unused endpoint: USE /"}, "properties": {"repobilityId": "11b055fa2670dbdf", "scanner": "scanner-primary", "fingerprint": "f02a079c69b52f2d", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-0b073e1ce89cd5d6", "level": "note", "message": {"text": "Unused endpoint: GET /api/resolve-link"}, "properties": {"repobilityId": "b2124119e515a077", "scanner": "scanner-primary", "fingerprint": "0b073e1ce89cd5d6", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-01258407184f4a16", "level": "note", "message": {"text": "Unused endpoint: GET /api/preview"}, "properties": {"repobilityId": "230ab765dba92479", "scanner": "scanner-primary", "fingerprint": "01258407184f4a16", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-953ec1a0ee6df50d", "level": "note", "message": {"text": "Unused endpoint: GET /admin"}, "properties": {"repobilityId": "20a301044ef91485", "scanner": "scanner-primary", "fingerprint": "953ec1a0ee6df50d", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-ea381293048ee5bb", "level": "note", "message": {"text": "Unused endpoint: GET /admin/*path"}, "properties": {"repobilityId": "5824e5436d8e996d", "scanner": "scanner-primary", "fingerprint": "ea381293048ee5bb", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-5a48d567f9a47748", "level": "note", "message": {"text": "Unused endpoint: GET /share/:token"}, "properties": {"repobilityId": "178c646a2e3511ee", "scanner": "scanner-primary", "fingerprint": "5a48d567f9a47748", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-0d5cb937537dda23", "level": "note", "message": {"text": "Unused endpoint: GET /api/config/seckill"}, "properties": {"repobilityId": "a63dc17e080c5c1f", "scanner": "scanner-primary", "fingerprint": "0d5cb937537dda23", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-26e8db1d9b20052e", "level": "note", "message": {"text": "Unused endpoint: GET /*path"}, "properties": {"repobilityId": "250b6a6da724d0bd", "scanner": "scanner-primary", "fingerprint": "26e8db1d9b20052e", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-a846e488671d9de0", "level": "note", "message": {"text": "Unused endpoint: GET /sse/connect"}, "properties": {"repobilityId": "b84bf99ac5759a3e", "scanner": "scanner-primary", "fingerprint": "a846e488671d9de0", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-53de5639cc2dab16", "level": "note", "message": {"text": "Unused endpoint: GET /sse/heartbeat"}, "properties": {"repobilityId": "30aacb7170d35478", "scanner": "scanner-primary", "fingerprint": "53de5639cc2dab16", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-69d33c0fc71ea49c", "level": "note", "message": {"text": "Unused endpoint: POST /sse/say"}, "properties": {"repobilityId": "ebda8f70b61976f9", "scanner": "scanner-primary", "fingerprint": "69d33c0fc71ea49c", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-a2d152fcf608bf63", "level": "note", "message": {"text": "Unused endpoint: POST /invoke"}, "properties": {"repobilityId": "09799b7237969b1c", "scanner": "scanner-primary", "fingerprint": "a2d152fcf608bf63", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-5c5c6900e4670966", "level": "note", "message": {"text": "Unused endpoint: GET /skills"}, "properties": {"repobilityId": "044042006c66dfdb", "scanner": "scanner-primary", "fingerprint": "5c5c6900e4670966", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-a8d5dae0cdec796b", "level": "note", "message": {"text": "Unused endpoint: GET /skills/grouped"}, "properties": {"repobilityId": "833101672914d7e4", "scanner": "scanner-primary", "fingerprint": "a8d5dae0cdec796b", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-55ad86cb4ea2ba6f", "level": "note", "message": {"text": "Unused endpoint: GET /schema/:name"}, "properties": {"repobilityId": "4d983ebbf1527e0a", "scanner": "scanner-primary", "fingerprint": "55ad86cb4ea2ba6f", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-29e0ed54344aaa81", "level": "note", "message": {"text": "Unused endpoint: GET /menu"}, "properties": {"repobilityId": "155cf86edd8b0167", "scanner": "scanner-primary", "fingerprint": "29e0ed54344aaa81", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-88a29b8a5c158e5b", "level": "note", "message": {"text": "Unused endpoint: GET /roles"}, "properties": {"repobilityId": "5b773edbe5bf1840", "scanner": "scanner-primary", "fingerprint": "88a29b8a5c158e5b", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-078b3f8a9311d56a", "level": "note", "message": {"text": "Unused endpoint: POST /roles"}, "properties": {"repobilityId": "6edc46888bce8949", "scanner": "scanner-primary", "fingerprint": "078b3f8a9311d56a", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-7fdfc82c420ca9d9", "level": "note", "message": {"text": "Unused endpoint: PUT /roles/:id"}, "properties": {"repobilityId": "b8f0add9d10da202", "scanner": "scanner-primary", "fingerprint": "7fdfc82c420ca9d9", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-93376b252532bd39", "level": "note", "message": {"text": "Unused endpoint: DELETE /roles/:id"}, "properties": {"repobilityId": "484b6e52124060b4", "scanner": "scanner-primary", "fingerprint": "93376b252532bd39", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-4fb87392101d76be", "level": "note", "message": {"text": "Unused endpoint: GET /user-roles/:userId"}, "properties": {"repobilityId": "ed6e86958246d8a4", "scanner": "scanner-primary", "fingerprint": "4fb87392101d76be", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-40edc21394709b48", "level": "note", "message": {"text": "Unused endpoint: PUT /user-roles/:userId"}, "properties": {"repobilityId": "fbebd6bf0e8674f8", "scanner": "scanner-primary", "fingerprint": "40edc21394709b48", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-cff8da5fbc19c76d", "level": "note", "message": {"text": "Unused endpoint: POST /chat"}, "properties": {"repobilityId": "a588263fc9fc724f", "scanner": "scanner-primary", "fingerprint": "cff8da5fbc19c76d", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-6236b283b79811b8", "level": "note", "message": {"text": "Unused endpoint: POST /upload"}, "properties": {"repobilityId": "00635275128eb6c5", "scanner": "scanner-primary", "fingerprint": "6236b283b79811b8", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-60a1950be5ddd3c9", "level": "note", "message": {"text": "Unused endpoint: GET /:sku/detail-images"}, "properties": {"repobilityId": "35c1b04d494c6749", "scanner": "scanner-primary", "fingerprint": "60a1950be5ddd3c9", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-7a009b1a56794f45", "level": "note", "message": {"text": "Unused endpoint: POST /"}, "properties": {"repobilityId": "76e2b4e40bd2eedd", "scanner": "scanner-primary", "fingerprint": "7a009b1a56794f45", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-5baa8971ebe192a1", "level": "note", "message": {"text": "Unused endpoint: GET /"}, "properties": {"repobilityId": "2c2b7c98886f4a0b", "scanner": "scanner-primary", "fingerprint": "5baa8971ebe192a1", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-84499d0707daf6ec", "level": "note", "message": {"text": "Unused endpoint: GET /public-search"}, "properties": {"repobilityId": "61d75e1017f3641a", "scanner": "scanner-primary", "fingerprint": "84499d0707daf6ec", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-ca5756175765b49d", "level": "note", "message": {"text": "Unused endpoint: GET /:id"}, "properties": {"repobilityId": "9153141c44d4ba82", "scanner": "scanner-primary", "fingerprint": "ca5756175765b49d", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-6b1bc1790eb7bfec", "level": "note", "message": {"text": "Unused endpoint: POST /url"}, "properties": {"repobilityId": "5fc671be4316c53c", "scanner": "scanner-primary", "fingerprint": "6b1bc1790eb7bfec", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-8d1748e6a7a3f228", "level": "note", "message": {"text": "Unused endpoint: POST /text"}, "properties": {"repobilityId": "56cb078997a57ccb", "scanner": "scanner-primary", "fingerprint": "8d1748e6a7a3f228", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-ffd1d386cc2ba872", "level": "note", "message": {"text": "Unused endpoint: POST /crawl"}, "properties": {"repobilityId": "b215edcd041f1677", "scanner": "scanner-primary", "fingerprint": "ffd1d386cc2ba872", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}]}]}