{"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-47a2f1ba6bd4309d", "name": "Stray `console.log` in TS/JS \u2014 gen-pollinations-regen.ts:46", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 gen-pollinations-regen.ts:46"}, "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-579b4365a3352682", "name": "Stray `console.log` in TS/JS \u2014 gen-cdhz-regen.ts:45", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 gen-cdhz-regen.ts:45"}, "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-83c1094b544a16f2", "name": "Stray `console.log` in TS/JS \u2014 gen-suzhou-regen.ts:49", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 gen-suzhou-regen.ts:49"}, "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-3e8afcdec92d2396", "name": "Stray `console.log` in TS/JS \u2014 gen-pollinations-http.ts:49", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 gen-pollinations-http.ts:49"}, "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-a5e0fd99506b18a1", "name": "Stray `console.log` in TS/JS \u2014 gen-primitive-regen.ts:46", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 gen-primitive-regen.ts:46"}, "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-2e4ea6095c11c01e", "name": "Stray `console.log` in TS/JS \u2014 server.js:212", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 server.js:212"}, "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-786fcfdc9a54c727", "name": "Stray `console.log` in TS/JS \u2014 gen-tiny-regen.ts:46", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 gen-tiny-regen.ts:46"}, "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-b84c1ec3466b243a", "name": "Stray `console.log` in TS/JS \u2014 tests/test-agent.js:68", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 tests/test-agent.js:68"}, "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-18a7274f2a4ad1dc", "name": "Stray `console.log` in TS/JS \u2014 tests/test-planner.js:164", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 tests/test-planner.js:164"}, "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-22dff88882f90369", "name": "Stray `console.log` in TS/JS \u2014 tests/test-voices.js:47", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 tests/test-voices.js:47"}, "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-22d47990f3b9bd61", "name": "Stray `console.log` in TS/JS \u2014 tests/test-format.js:105", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 tests/test-format.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-238df443927efd8c", "name": "Stray `console.log` in TS/JS \u2014 tests/test-top3.js:144", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 tests/test-top3.js:144"}, "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-b55e56070f6bbc8c", "name": "Stray `console.log` in TS/JS \u2014 xhs-research/build-voices-extra.js:47", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 xhs-research/build-voices-extra.js:47"}, "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-5391f06a1908b5dd", "name": "Icon-only button without accessible name \u2014 js/legends.js:2321", "shortDescription": {"text": "Icon-only button without accessible name \u2014 js/legends.js:2321"}, "fullDescription": {"text": "A `<button>` whose only child is a single glyph or symbol needs `title=` or `aria-label=` so screen readers (and tooltips on hover) work.\n\nWhy: P3 in CHECKLIST.md \u2014 icon-only buttons skipped a title.\nRule id: fq.button.no-label"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-aa9e911103503645", "name": "Stray `console.log` in TS/JS \u2014 js/stamp.js:27", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 js/stamp.js:27"}, "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-a5124938a83e1f6d", "name": "Stray `console.log` in TS/JS \u2014 scripts/build-agent-data.js:127", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/build-agent-data.js:127"}, "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-fcb760c6c8369ebc", "name": "Stray `console.log` in TS/JS \u2014 scripts/sync-to-miniapp.js:166", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/sync-to-miniapp.js:166"}, "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-3b45c12d904e1661", "name": "Stray `console.log` in TS/JS \u2014 scripts/build-p0-queue.js:64", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/build-p0-queue.js:64"}, "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-7ab6bfe2ec696b0b", "name": "Stray `console.log` in TS/JS \u2014 scripts/audit-bestseason.js:25", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/audit-bestseason.js:25"}, "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-0844f1a0ab78f43f", "name": "Stray `console.log` in TS/JS \u2014 scripts/test-planner.js:59", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/test-planner.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-7c5aba392815b63c", "name": "Stray `console.log` in TS/JS \u2014 scripts/build-p1-queue.js:94", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/build-p1-queue.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-8104e425fa7bbc7d", "name": "Stray `console.log` in TS/JS \u2014 scripts/audit-xhs.js:16", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/audit-xhs.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-3b46a82aceb6553f", "name": "Stray `console.log` in TS/JS \u2014 scripts/build-p3-queue.js:61", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/build-p3-queue.js:61"}, "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-7c632c199ad198cd", "name": "Stray `console.log` in TS/JS \u2014 scripts/build-bj-legends-queue.js:42", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/build-bj-legends-queue.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-92b295a11cd489cb", "name": "Stray `console.log` in TS/JS \u2014 scripts/merge-intra-city-bj.js:61", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/merge-intra-city-bj.js:61"}, "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-63cb53795c533c2e", "name": "Stray `console.log` in TS/JS \u2014 scripts/clean-shared-source.js:52", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/clean-shared-source.js:52"}, "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-da86284afc0de66c", "name": "Stray `console.log` in TS/JS \u2014 scripts/gen-sitemap.js:74", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/gen-sitemap.js:74"}, "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-581f3e9f41ee392a", "name": "Stray `console.log` in TS/JS \u2014 scripts/pollinations-with-limiter.ts:35", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/pollinations-with-limiter.ts:35"}, "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-50ffc2c77f38742a", "name": "Stray `console.log` in TS/JS \u2014 scripts/weekend-go-helper.js:38", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/weekend-go-helper.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-9710c8d059e53154", "name": "No frontend routes/components detected", "shortDescription": {"text": "No frontend routes/components detected"}, "fullDescription": {"text": "No React/Vue/Next routes were found. This is fine for backend-only repos."}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-0248e75df1526448", "name": "Insecure pattern 'node_child_process' in gen-pollinations-regen.ts:2", "shortDescription": {"text": "Insecure pattern 'node_child_process' in gen-pollinations-regen.ts: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-417430dd8b3c21b7", "name": "Insecure pattern 'direct_innerhtml_assignment' in stats.html:320", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in stats.html:320"}, "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-5e296ed3fc8c8cd5", "name": "Insecure pattern 'insert_adjacent_html' in stats.html:211", "shortDescription": {"text": "Insecure pattern 'insert_adjacent_html' in stats.html:211"}, "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-886d14d6185457d9", "name": "Insecure pattern 'node_child_process' in gen-cdhz-regen.ts:2", "shortDescription": {"text": "Insecure pattern 'node_child_process' in gen-cdhz-regen.ts: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-a55b5e6c37adf6e4", "name": "Insecure pattern 'node_child_process' in gen-suzhou-regen.ts:2", "shortDescription": {"text": "Insecure pattern 'node_child_process' in gen-suzhou-regen.ts: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-054dee0686bcec6c", "name": "Insecure pattern 'eval_used' in build-primitive-queue.mjs:10", "shortDescription": {"text": "Insecure pattern 'eval_used' in build-primitive-queue.mjs:10"}, "fullDescription": {"text": "Found a known-risky pattern (eval_used). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-706bd60e743b4202", "name": "Insecure pattern 'node_child_process' in gen-pollinations-http.ts:9", "shortDescription": {"text": "Insecure pattern 'node_child_process' in gen-pollinations-http.ts:9"}, "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-d8aea7e9a289b030", "name": "Insecure pattern 'node_child_process' in gen-primitive-regen.ts:2", "shortDescription": {"text": "Insecure pattern 'node_child_process' in gen-primitive-regen.ts: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-51f665b2377e8fa3", "name": "Insecure pattern 'direct_innerhtml_assignment' in achievements.html:105", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in achievements.html:105"}, "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-533c6b261f8dfd87", "name": "Insecure pattern 'new_function_used' in server.js:33", "shortDescription": {"text": "Insecure pattern 'new_function_used' in server.js:33"}, "fullDescription": {"text": "Found a known-risky pattern (new_function_used). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-2b9e93d5b877e116", "name": "Insecure pattern 'cors_wildcard' in server.js:121", "shortDescription": {"text": "Insecure pattern 'cors_wildcard' in server.js:121"}, "fullDescription": {"text": "Found a known-risky pattern (cors_wildcard). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-3c48f4e20dcf60ce", "name": "Insecure pattern 'node_child_process' in gen-tiny-regen.ts:2", "shortDescription": {"text": "Insecure pattern 'node_child_process' in gen-tiny-regen.ts: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-8a1262ab16e4e82a", "name": "Insecure pattern 'direct_innerhtml_assignment' in js/compare.js:69", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in js/compare.js:69"}, "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-f7f65e6421f7096e", "name": "Insecure pattern 'direct_innerhtml_assignment' in js/legends.js:2002", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in js/legends.js:2002"}, "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-330eb2daffb0924f", "name": "Insecure pattern 'direct_innerhtml_assignment' in js/stamp.js:94", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in js/stamp.js:94"}, "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-faa982f62d1a5a07", "name": "Insecure pattern 'direct_innerhtml_assignment' in js/dest.js:170", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in js/dest.js:170"}, "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-ae37890e2b9d8174", "name": "Insecure pattern 'direct_innerhtml_assignment' in js/cities-dataset.js:165", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in js/cities-dataset.js:165"}, "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-250e88d12ffe8cd3", "name": "Insecure pattern 'direct_innerhtml_assignment' in js/planner.js:507", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in js/planner.js:507"}, "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-2820117c96edabcc", "name": "Insecure pattern 'direct_innerhtml_assignment' in js/app.js:58", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in js/app.js:58"}, "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-4ddb6de28c91a146", "name": "Insecure pattern 'insert_adjacent_html' in js/app.js:1474", "shortDescription": {"text": "Insecure pattern 'insert_adjacent_html' in js/app.js:1474"}, "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-3353177b099350e2", "name": "Insecure pattern 'direct_innerhtml_assignment' in js/seasonal.js:148", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in js/seasonal.js:148"}, "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-3d3963c5b8b9b827", "name": "Insecure pattern 'direct_innerhtml_assignment' in js/top3.js:226", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in js/top3.js:226"}, "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-040b86b25b6dc6c6", "name": "Insecure pattern 'direct_innerhtml_assignment' in js/recent.js:65", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in js/recent.js:65"}, "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-e82f6241c0d28848", "name": "Insecure pattern 'node_child_process' in scripts/weekend-go-helper.js:18", "shortDescription": {"text": "Insecure pattern 'node_child_process' in scripts/weekend-go-helper.js:18"}, "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-6372cebde0220094", "name": "No auth library detected", "shortDescription": {"text": "No auth library detected"}, "fullDescription": {"text": "The scanner did not find any standard auth library (JWT, OAuth, NextAuth, Auth0, etc.). The repo has auth/admin/session surface indicators, so auth may live in custom code, in a separate service, or be missing."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-28c4a04bd807da0c", "name": "GitHub Action is tag-pinned rather than SHA-pinned", "shortDescription": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "fullDescription": {"text": "actions/deploy-pages@v4 can move without a code change in this repo. Pin third-party actions to a reviewed 40-character commit SHA."}, "properties": {"scanner": "scanner-primary", "layer": "cicd", "severity": "low", "confidence": 1.0}}, {"id": "scanner-ad6701f0a8405e22", "name": "GitHub Actions workflow grants broad write permissions", "shortDescription": {"text": "GitHub Actions workflow grants broad write permissions"}, "fullDescription": {"text": "CI tokens with write permissions increase blast radius when an action, dependency, or PR workflow is compromised. Prefer job-level least-privilege permissions."}, "properties": {"scanner": "scanner-primary", "layer": "cicd", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-6b434f78a3de391e", "name": "Very large file: js/legends.js (2517 lines)", "shortDescription": {"text": "Very large file: js/legends.js (2517 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-52d8bdf30c74e825", "name": "Very large file: js/data-beijing-hidden.js (3276 lines)", "shortDescription": {"text": "Very large file: js/data-beijing-hidden.js (3276 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-0395bd26ac2db49c", "name": "Very large file: js/data-beijing-500.js (5118 lines)", "shortDescription": {"text": "Very large file: js/data-beijing-500.js (5118 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-40cbad13ea5cce63", "name": "Very large file: js/xhs-data.js (4815 lines)", "shortDescription": {"text": "Very large file: js/xhs-data.js (4815 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-e8d86cc5dc22767b", "name": "Very large file: js/data-shenzhen.js (5251 lines)", "shortDescription": {"text": "Very large file: js/data-shenzhen.js (5251 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-6b3985bff67c140e", "name": "Very large file: js/data-extra.js (1646 lines)", "shortDescription": {"text": "Very large file: js/data-extra.js (1646 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-25c8b2d95dbe7fa0", "name": "Very large file: js/data-qingdao.js (1147 lines)", "shortDescription": {"text": "Very large file: js/data-qingdao.js (1147 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-485bce4198f96b31", "name": "Very large file: js/xhs-voices.js (5389 lines)", "shortDescription": {"text": "Very large file: js/xhs-voices.js (5389 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-3e12f092889fef8d", "name": "Very large file: js/data-suzhou.js (2002 lines)", "shortDescription": {"text": "Very large file: js/data-suzhou.js (2002 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-17bba15cc63fc208", "name": "Very large file: js/data-extra2.js (1277 lines)", "shortDescription": {"text": "Very large file: js/data-extra2.js (1277 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-b7498aa9d7843030", "name": "Very large file: js/xhs-voices-extra.js (2685 lines)", "shortDescription": {"text": "Very large file: js/xhs-voices-extra.js (2685 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-1ca752f65b4f2335", "name": "Very large file: js/images.js (913 lines)", "shortDescription": {"text": "Very large file: js/images.js (913 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-644cafe845178b7a", "name": "Very large file: js/app.js (1590 lines)", "shortDescription": {"text": "Very large file: js/app.js (1590 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-598ce7c055a055f8", "name": "Very large file: js/data.js (1037 lines)", "shortDescription": {"text": "Very large file: js/data.js (1037 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-2262ba85954dec14", "name": "Very large file: js/data-tianjin.js (1030 lines)", "shortDescription": {"text": "Very large file: js/data-tianjin.js (1030 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-022410ced4b07b92", "name": "Very large file: js/data-weihai.js (2261 lines)", "shortDescription": {"text": "Very large file: js/data-weihai.js (2261 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-b7e43723bafb5ef5", "name": "Very large file: js/data-beijing-tales.js (3252 lines)", "shortDescription": {"text": "Very large file: js/data-beijing-tales.js (3252 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": "6 test file(s) for 96 source file(s) (ratio 0.06). 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 258 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-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, 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": "low", "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, 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-15a2f4b1bd1f3bc8", "name": "`fetch()` without try/.catch or AbortSignal \u2014 sw.js:73", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 sw.js:73"}, "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-391cc3e3b12b7d02", "name": "`fetch()` without try/.catch or AbortSignal \u2014 server.js:135", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 server.js:135"}, "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-ae38d20521d73fb4", "name": "Commented-code block (5 lines) in tests/test-planner.js:1", "shortDescription": {"text": "Commented-code block (5 lines) in tests/test-planner.js:1"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-f3dcb415dad2946e", "name": "`fetch()` without try/.catch or AbortSignal \u2014 api/_lib/agent.js:67", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 api/_lib/agent.js:67"}, "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-c6206aadf4b87733", "name": "Legacy-named symbol `\u70b9\u4e86\u4e24\u676fOld` in js/data-beijing-hidden.js:2992", "shortDescription": {"text": "Legacy-named symbol `\u70b9\u4e86\u4e24\u676fOld` in js/data-beijing-hidden.js:2992"}, "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-d6463539b4829d7b", "name": "Legacy-named symbol `weekendgo_visited_migrated_v2` in js/stamp.js:5", "shortDescription": {"text": "Legacy-named symbol `weekendgo_visited_migrated_v2` in js/stamp.js:5"}, "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-fb89314a55eb887e", "name": "Commented-code block (5 lines) in js/xhs-data.js:1", "shortDescription": {"text": "Commented-code block (5 lines) in js/xhs-data.js:1"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-3eb4f8101d8b5430", "name": "Legacy-named symbol `wg_plans_v1` in js/planner.js:843", "shortDescription": {"text": "Legacy-named symbol `wg_plans_v1` in js/planner.js:843"}, "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-5c542886142642ed", "name": "Legacy-named symbol `wg_theme_v1` in js/theme.js:6", "shortDescription": {"text": "Legacy-named symbol `wg_theme_v1` in js/theme.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-80b613421bd6fd06", "name": "Commented-code block (5 lines) in scripts/sync-to-miniapp.js:206", "shortDescription": {"text": "Commented-code block (5 lines) in scripts/sync-to-miniapp.js:206"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-102be61077835bed", "name": "Commented-code block (5 lines) in scripts/pollinations-with-limiter.ts:8", "shortDescription": {"text": "Commented-code block (5 lines) in scripts/pollinations-with-limiter.ts:8"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-2eafc3188c36bb02", "name": "3 env vars used in code but missing from .env.example", "shortDescription": {"text": "3 env vars used in code but missing from .env.example"}, "fullDescription": {"text": "Drift between code and config docs. The first few: `ANTHROPIC_API_KEY`, `HOME`, `OUT_DIR`. Add them (with a placeholder/comment) to .env.example so onboarding doesn't break."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-49c98f7cedd9c977", "name": "Near-duplicate function bodies in 4 places", "shortDescription": {"text": "Near-duplicate function bodies in 4 places"}, "fullDescription": {"text": "Functions with the same first-5-line body hash:\ngen-chatgpt-suzhou.py:chrome_js_file, gen-chatgpt-suzhou.py:chrome_js, gen-chatgpt-regen.py:chrome_js_file, gen-chatgpt-regen.py:chrome_js\n\nThis is *the* AI-coder failure mode (4\u00d7 more duplication in vibe-coded repos \u2014 see https://jw.hn/ai-code-hygiene). Consolidate or document why they're separate."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-2c04133e54348533", "name": "Near-duplicate function bodies in 2 places", "shortDescription": {"text": "Near-duplicate function bodies in 2 places"}, "fullDescription": {"text": "Functions with the same first-5-line body hash:\ngen-chatgpt-suzhou.py:get_remaining, gen-chatgpt-regen.py:get_remaining\n\nThis is *the* AI-coder failure mode (4\u00d7 more duplication in vibe-coded repos \u2014 see https://jw.hn/ai-code-hygiene). Consolidate or document why they're separate."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-be46ea126aa5d8dc", "name": "Near-duplicate function bodies in 3 places", "shortDescription": {"text": "Near-duplicate function bodies in 3 places"}, "fullDescription": {"text": "Functions with the same first-5-line body hash:\nxhs-research/batch-harvest-playwright-sz.py:log, xhs-research/retry-smart-sz.py:log, xhs-research/batch-harvest-playwright.py:log\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}}]}}, "automationDetails": {"id": "repobility/19456"}, "properties": {"repository": "sherconan/weekend-go", "repoUrl": "https://github.com/sherconan/weekend-go", "branch": "main"}, "results": [{"ruleId": "scanner-47a2f1ba6bd4309d", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 gen-pollinations-regen.ts:46"}, "properties": {"repobilityId": "b9a84a11685aed1b", "scanner": "scanner-primary", "fingerprint": "47a2f1ba6bd4309d", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-579b4365a3352682", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 gen-cdhz-regen.ts:45"}, "properties": {"repobilityId": "d8ec9b139ee0df54", "scanner": "scanner-primary", "fingerprint": "579b4365a3352682", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-83c1094b544a16f2", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 gen-suzhou-regen.ts:49"}, "properties": {"repobilityId": "c834f277f0432561", "scanner": "scanner-primary", "fingerprint": "83c1094b544a16f2", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-3e8afcdec92d2396", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 gen-pollinations-http.ts:49"}, "properties": {"repobilityId": "af141519283ae757", "scanner": "scanner-primary", "fingerprint": "3e8afcdec92d2396", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-a5e0fd99506b18a1", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 gen-primitive-regen.ts:46"}, "properties": {"repobilityId": "58d9d666b50ee1fb", "scanner": "scanner-primary", "fingerprint": "a5e0fd99506b18a1", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-2e4ea6095c11c01e", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 server.js:212"}, "properties": {"repobilityId": "a9deebb5fdc93edc", "scanner": "scanner-primary", "fingerprint": "2e4ea6095c11c01e", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-786fcfdc9a54c727", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 gen-tiny-regen.ts:46"}, "properties": {"repobilityId": "273688f6c8ca163e", "scanner": "scanner-primary", "fingerprint": "786fcfdc9a54c727", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-b84c1ec3466b243a", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 tests/test-agent.js:68"}, "properties": {"repobilityId": "3c3f8480b96961e4", "scanner": "scanner-primary", "fingerprint": "b84c1ec3466b243a", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-18a7274f2a4ad1dc", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 tests/test-planner.js:164"}, "properties": {"repobilityId": "d2a4407dcb78c5d0", "scanner": "scanner-primary", "fingerprint": "18a7274f2a4ad1dc", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-22dff88882f90369", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 tests/test-voices.js:47"}, "properties": {"repobilityId": "455dab4b18e4e976", "scanner": "scanner-primary", "fingerprint": "22dff88882f90369", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-22d47990f3b9bd61", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 tests/test-format.js:105"}, "properties": {"repobilityId": "9859b3a426e91e88", "scanner": "scanner-primary", "fingerprint": "22d47990f3b9bd61", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-238df443927efd8c", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 tests/test-top3.js:144"}, "properties": {"repobilityId": "9297469958d6b54b", "scanner": "scanner-primary", "fingerprint": "238df443927efd8c", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-b55e56070f6bbc8c", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 xhs-research/build-voices-extra.js:47"}, "properties": {"repobilityId": "016f04aefe6f2979", "scanner": "scanner-primary", "fingerprint": "b55e56070f6bbc8c", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-5391f06a1908b5dd", "level": "note", "message": {"text": "Icon-only button without accessible name \u2014 js/legends.js:2321"}, "properties": {"repobilityId": "13f054c9853d3fae", "scanner": "scanner-primary", "fingerprint": "5391f06a1908b5dd", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.button.no-label"]}}, {"ruleId": "scanner-aa9e911103503645", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 js/stamp.js:27"}, "properties": {"repobilityId": "d98187af610ad119", "scanner": "scanner-primary", "fingerprint": "aa9e911103503645", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-a5124938a83e1f6d", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/build-agent-data.js:127"}, "properties": {"repobilityId": "975e486b7bd7d29d", "scanner": "scanner-primary", "fingerprint": "a5124938a83e1f6d", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-fcb760c6c8369ebc", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/sync-to-miniapp.js:166"}, "properties": {"repobilityId": "4c73ac3a710b1a2e", "scanner": "scanner-primary", "fingerprint": "fcb760c6c8369ebc", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-3b45c12d904e1661", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/build-p0-queue.js:64"}, "properties": {"repobilityId": "3c0eeda3e1f103e4", "scanner": "scanner-primary", "fingerprint": "3b45c12d904e1661", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-7ab6bfe2ec696b0b", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/audit-bestseason.js:25"}, "properties": {"repobilityId": "1426cf5c0ab6ab4b", "scanner": "scanner-primary", "fingerprint": "7ab6bfe2ec696b0b", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-0844f1a0ab78f43f", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/test-planner.js:59"}, "properties": {"repobilityId": "46f23f7fe12e77bb", "scanner": "scanner-primary", "fingerprint": "0844f1a0ab78f43f", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-7c5aba392815b63c", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/build-p1-queue.js:94"}, "properties": {"repobilityId": "e050a4f3a934281f", "scanner": "scanner-primary", "fingerprint": "7c5aba392815b63c", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-8104e425fa7bbc7d", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/audit-xhs.js:16"}, "properties": {"repobilityId": "ec815f5ed88c23ac", "scanner": "scanner-primary", "fingerprint": "8104e425fa7bbc7d", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-3b46a82aceb6553f", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/build-p3-queue.js:61"}, "properties": {"repobilityId": "67935acbe217893f", "scanner": "scanner-primary", "fingerprint": "3b46a82aceb6553f", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-7c632c199ad198cd", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/build-bj-legends-queue.js:42"}, "properties": {"repobilityId": "3cae660b91832110", "scanner": "scanner-primary", "fingerprint": "7c632c199ad198cd", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-92b295a11cd489cb", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/merge-intra-city-bj.js:61"}, "properties": {"repobilityId": "4ba385f45e663fea", "scanner": "scanner-primary", "fingerprint": "92b295a11cd489cb", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-63cb53795c533c2e", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/clean-shared-source.js:52"}, "properties": {"repobilityId": "9a023fd79328d272", "scanner": "scanner-primary", "fingerprint": "63cb53795c533c2e", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-da86284afc0de66c", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/gen-sitemap.js:74"}, "properties": {"repobilityId": "3ca2649943600e12", "scanner": "scanner-primary", "fingerprint": "da86284afc0de66c", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-581f3e9f41ee392a", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/pollinations-with-limiter.ts:35"}, "properties": {"repobilityId": "fad01c14f9d18e98", "scanner": "scanner-primary", "fingerprint": "581f3e9f41ee392a", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-50ffc2c77f38742a", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/weekend-go-helper.js:38"}, "properties": {"repobilityId": "8c95ff552e293295", "scanner": "scanner-primary", "fingerprint": "50ffc2c77f38742a", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-9710c8d059e53154", "level": "none", "message": {"text": "No frontend routes/components detected"}, "properties": {"repobilityId": "44ca61485762e494", "scanner": "scanner-primary", "fingerprint": "9710c8d059e53154", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["coverage"]}}, {"ruleId": "scanner-0248e75df1526448", "level": "warning", "message": {"text": "Insecure pattern 'node_child_process' in gen-pollinations-regen.ts:2"}, "properties": {"repobilityId": "f685e782956a5dfe", "scanner": "scanner-primary", "fingerprint": "0248e75df1526448", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "node_child_process"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "gen-pollinations-regen.ts"}, "region": {"startLine": 2}}}]}, {"ruleId": "scanner-417430dd8b3c21b7", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in stats.html:320"}, "properties": {"repobilityId": "132f956cd130d2b4", "scanner": "scanner-primary", "fingerprint": "417430dd8b3c21b7", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "stats.html"}, "region": {"startLine": 320}}}]}, {"ruleId": "scanner-5e296ed3fc8c8cd5", "level": "warning", "message": {"text": "Insecure pattern 'insert_adjacent_html' in stats.html:211"}, "properties": {"repobilityId": "a249f9e9caf18ecc", "scanner": "scanner-primary", "fingerprint": "5e296ed3fc8c8cd5", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "insert_adjacent_html"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "stats.html"}, "region": {"startLine": 211}}}]}, {"ruleId": "scanner-886d14d6185457d9", "level": "warning", "message": {"text": "Insecure pattern 'node_child_process' in gen-cdhz-regen.ts:2"}, "properties": {"repobilityId": "18ae4ed0a9e294fb", "scanner": "scanner-primary", "fingerprint": "886d14d6185457d9", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "node_child_process"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "gen-cdhz-regen.ts"}, "region": {"startLine": 2}}}]}, {"ruleId": "scanner-a55b5e6c37adf6e4", "level": "warning", "message": {"text": "Insecure pattern 'node_child_process' in gen-suzhou-regen.ts:2"}, "properties": {"repobilityId": "993dabc177e615b4", "scanner": "scanner-primary", "fingerprint": "a55b5e6c37adf6e4", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "node_child_process"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "gen-suzhou-regen.ts"}, "region": {"startLine": 2}}}]}, {"ruleId": "scanner-054dee0686bcec6c", "level": "error", "message": {"text": "Insecure pattern 'eval_used' in build-primitive-queue.mjs:10"}, "properties": {"repobilityId": "50b3af975abe829c", "scanner": "scanner-primary", "fingerprint": "054dee0686bcec6c", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["owasp", "eval_used"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "build-primitive-queue.mjs"}, "region": {"startLine": 10}}}]}, {"ruleId": "scanner-706bd60e743b4202", "level": "warning", "message": {"text": "Insecure pattern 'node_child_process' in gen-pollinations-http.ts:9"}, "properties": {"repobilityId": "91ecd4131df2941a", "scanner": "scanner-primary", "fingerprint": "706bd60e743b4202", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "node_child_process"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "gen-pollinations-http.ts"}, "region": {"startLine": 9}}}]}, {"ruleId": "scanner-d8aea7e9a289b030", "level": "warning", "message": {"text": "Insecure pattern 'node_child_process' in gen-primitive-regen.ts:2"}, "properties": {"repobilityId": "9402509c6c643dca", "scanner": "scanner-primary", "fingerprint": "d8aea7e9a289b030", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "node_child_process"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "gen-primitive-regen.ts"}, "region": {"startLine": 2}}}]}, {"ruleId": "scanner-51f665b2377e8fa3", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in achievements.html:105"}, "properties": {"repobilityId": "b218f73adf29b38e", "scanner": "scanner-primary", "fingerprint": "51f665b2377e8fa3", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "achievements.html"}, "region": {"startLine": 105}}}]}, {"ruleId": "scanner-533c6b261f8dfd87", "level": "error", "message": {"text": "Insecure pattern 'new_function_used' in server.js:33"}, "properties": {"repobilityId": "8ec0da493dda7236", "scanner": "scanner-primary", "fingerprint": "533c6b261f8dfd87", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["owasp", "new_function_used"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "server.js"}, "region": {"startLine": 33}}}]}, {"ruleId": "scanner-2b9e93d5b877e116", "level": "warning", "message": {"text": "Insecure pattern 'cors_wildcard' in server.js:121"}, "properties": {"repobilityId": "0d9bca6c0839725e", "scanner": "scanner-primary", "fingerprint": "2b9e93d5b877e116", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "cors_wildcard"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "server.js"}, "region": {"startLine": 121}}}]}, {"ruleId": "scanner-3c48f4e20dcf60ce", "level": "warning", "message": {"text": "Insecure pattern 'node_child_process' in gen-tiny-regen.ts:2"}, "properties": {"repobilityId": "d966f544f89a4ac9", "scanner": "scanner-primary", "fingerprint": "3c48f4e20dcf60ce", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "node_child_process"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "gen-tiny-regen.ts"}, "region": {"startLine": 2}}}]}, {"ruleId": "scanner-8a1262ab16e4e82a", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in js/compare.js:69"}, "properties": {"repobilityId": "1e9cc70602269da8", "scanner": "scanner-primary", "fingerprint": "8a1262ab16e4e82a", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "js/compare.js"}, "region": {"startLine": 69}}}]}, {"ruleId": "scanner-f7f65e6421f7096e", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in js/legends.js:2002"}, "properties": {"repobilityId": "7f3f4f1f1a92db7e", "scanner": "scanner-primary", "fingerprint": "f7f65e6421f7096e", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "js/legends.js"}, "region": {"startLine": 2002}}}]}, {"ruleId": "scanner-330eb2daffb0924f", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in js/stamp.js:94"}, "properties": {"repobilityId": "079d08934281114a", "scanner": "scanner-primary", "fingerprint": "330eb2daffb0924f", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "js/stamp.js"}, "region": {"startLine": 94}}}]}, {"ruleId": "scanner-faa982f62d1a5a07", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in js/dest.js:170"}, "properties": {"repobilityId": "6766a9a169de0550", "scanner": "scanner-primary", "fingerprint": "faa982f62d1a5a07", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "js/dest.js"}, "region": {"startLine": 170}}}]}, {"ruleId": "scanner-ae37890e2b9d8174", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in js/cities-dataset.js:165"}, "properties": {"repobilityId": "891d7e2885aab6da", "scanner": "scanner-primary", "fingerprint": "ae37890e2b9d8174", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "js/cities-dataset.js"}, "region": {"startLine": 165}}}]}, {"ruleId": "scanner-250e88d12ffe8cd3", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in js/planner.js:507"}, "properties": {"repobilityId": "b8103805c677af52", "scanner": "scanner-primary", "fingerprint": "250e88d12ffe8cd3", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "js/planner.js"}, "region": {"startLine": 507}}}]}, {"ruleId": "scanner-2820117c96edabcc", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in js/app.js:58"}, "properties": {"repobilityId": "f12f5fb5c6eb3ec0", "scanner": "scanner-primary", "fingerprint": "2820117c96edabcc", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "js/app.js"}, "region": {"startLine": 58}}}]}, {"ruleId": "scanner-4ddb6de28c91a146", "level": "warning", "message": {"text": "Insecure pattern 'insert_adjacent_html' in js/app.js:1474"}, "properties": {"repobilityId": "578a49a921ae88fa", "scanner": "scanner-primary", "fingerprint": "4ddb6de28c91a146", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "insert_adjacent_html"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "js/app.js"}, "region": {"startLine": 1474}}}]}, {"ruleId": "scanner-3353177b099350e2", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in js/seasonal.js:148"}, "properties": {"repobilityId": "ef459b3fe143d126", "scanner": "scanner-primary", "fingerprint": "3353177b099350e2", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "js/seasonal.js"}, "region": {"startLine": 148}}}]}, {"ruleId": "scanner-3d3963c5b8b9b827", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in js/top3.js:226"}, "properties": {"repobilityId": "94d5081d16ec4c40", "scanner": "scanner-primary", "fingerprint": "3d3963c5b8b9b827", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "js/top3.js"}, "region": {"startLine": 226}}}]}, {"ruleId": "scanner-040b86b25b6dc6c6", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in js/recent.js:65"}, "properties": {"repobilityId": "7dacdf909037b9f2", "scanner": "scanner-primary", "fingerprint": "040b86b25b6dc6c6", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "js/recent.js"}, "region": {"startLine": 65}}}]}, {"ruleId": "scanner-e82f6241c0d28848", "level": "warning", "message": {"text": "Insecure pattern 'node_child_process' in scripts/weekend-go-helper.js:18"}, "properties": {"repobilityId": "5cf9c279a078b810", "scanner": "scanner-primary", "fingerprint": "e82f6241c0d28848", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "node_child_process"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "scripts/weekend-go-helper.js"}, "region": {"startLine": 18}}}]}, {"ruleId": "scanner-6372cebde0220094", "level": "warning", "message": {"text": "No auth library detected"}, "properties": {"repobilityId": "a5b6035a5bbf8054", "scanner": "scanner-primary", "fingerprint": "6372cebde0220094", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["coverage", "auth"]}}, {"ruleId": "scanner-28c4a04bd807da0c", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "419d1ec7943efec2", "scanner": "scanner-primary", "fingerprint": "28c4a04bd807da0c", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/deploy.yml"}, "region": {"startLine": 22}}}]}, {"ruleId": "scanner-ad6701f0a8405e22", "level": "warning", "message": {"text": "GitHub Actions workflow grants broad write permissions"}, "properties": {"repobilityId": "8384c23520d55657", "scanner": "scanner-primary", "fingerprint": "ad6701f0a8405e22", "layer": "cicd", "severity": "medium", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "least-privilege"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/deploy.yml"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-6b434f78a3de391e", "level": "note", "message": {"text": "Very large file: js/legends.js (2517 lines)"}, "properties": {"repobilityId": "ce7b7245c0e39cf3", "scanner": "scanner-primary", "fingerprint": "6b434f78a3de391e", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-52d8bdf30c74e825", "level": "note", "message": {"text": "Very large file: js/data-beijing-hidden.js (3276 lines)"}, "properties": {"repobilityId": "381a44b0dcadaff1", "scanner": "scanner-primary", "fingerprint": "52d8bdf30c74e825", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-0395bd26ac2db49c", "level": "note", "message": {"text": "Very large file: js/data-beijing-500.js (5118 lines)"}, "properties": {"repobilityId": "e453edecaa718794", "scanner": "scanner-primary", "fingerprint": "0395bd26ac2db49c", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-40cbad13ea5cce63", "level": "note", "message": {"text": "Very large file: js/xhs-data.js (4815 lines)"}, "properties": {"repobilityId": "fd02106b909785c8", "scanner": "scanner-primary", "fingerprint": "40cbad13ea5cce63", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-e8d86cc5dc22767b", "level": "note", "message": {"text": "Very large file: js/data-shenzhen.js (5251 lines)"}, "properties": {"repobilityId": "d1b9c2801f03af5f", "scanner": "scanner-primary", "fingerprint": "e8d86cc5dc22767b", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-6b3985bff67c140e", "level": "note", "message": {"text": "Very large file: js/data-extra.js (1646 lines)"}, "properties": {"repobilityId": "afd78a001769e738", "scanner": "scanner-primary", "fingerprint": "6b3985bff67c140e", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-25c8b2d95dbe7fa0", "level": "note", "message": {"text": "Very large file: js/data-qingdao.js (1147 lines)"}, "properties": {"repobilityId": "396539743d12d31b", "scanner": "scanner-primary", "fingerprint": "25c8b2d95dbe7fa0", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-485bce4198f96b31", "level": "note", "message": {"text": "Very large file: js/xhs-voices.js (5389 lines)"}, "properties": {"repobilityId": "0c9eb30ccf721b26", "scanner": "scanner-primary", "fingerprint": "485bce4198f96b31", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-3e12f092889fef8d", "level": "note", "message": {"text": "Very large file: js/data-suzhou.js (2002 lines)"}, "properties": {"repobilityId": "8cf7c47620760599", "scanner": "scanner-primary", "fingerprint": "3e12f092889fef8d", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-17bba15cc63fc208", "level": "note", "message": {"text": "Very large file: js/data-extra2.js (1277 lines)"}, "properties": {"repobilityId": "9267d34b73dc4536", "scanner": "scanner-primary", "fingerprint": "17bba15cc63fc208", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-b7498aa9d7843030", "level": "note", "message": {"text": "Very large file: js/xhs-voices-extra.js (2685 lines)"}, "properties": {"repobilityId": "bf2efde13603bfa0", "scanner": "scanner-primary", "fingerprint": "b7498aa9d7843030", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-1ca752f65b4f2335", "level": "note", "message": {"text": "Very large file: js/images.js (913 lines)"}, "properties": {"repobilityId": "15a108027ce0fb10", "scanner": "scanner-primary", "fingerprint": "1ca752f65b4f2335", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-644cafe845178b7a", "level": "note", "message": {"text": "Very large file: js/app.js (1590 lines)"}, "properties": {"repobilityId": "c38eec27975b7a83", "scanner": "scanner-primary", "fingerprint": "644cafe845178b7a", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-598ce7c055a055f8", "level": "note", "message": {"text": "Very large file: js/data.js (1037 lines)"}, "properties": {"repobilityId": "5d9806214be91e50", "scanner": "scanner-primary", "fingerprint": "598ce7c055a055f8", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-2262ba85954dec14", "level": "note", "message": {"text": "Very large file: js/data-tianjin.js (1030 lines)"}, "properties": {"repobilityId": "e75c385ce11f3b38", "scanner": "scanner-primary", "fingerprint": "2262ba85954dec14", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-022410ced4b07b92", "level": "note", "message": {"text": "Very large file: js/data-weihai.js (2261 lines)"}, "properties": {"repobilityId": "5ccca88f14e75fcf", "scanner": "scanner-primary", "fingerprint": "022410ced4b07b92", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-b7e43723bafb5ef5", "level": "note", "message": {"text": "Very large file: js/data-beijing-tales.js (3252 lines)"}, "properties": {"repobilityId": "93dfd56e254a8bb7", "scanner": "scanner-primary", "fingerprint": "b7e43723bafb5ef5", "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": "f6c9f4baeaab19f7", "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": "03f5f66e0639328d", "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": "bcb404ddfa246036", "scanner": "scanner-primary", "fingerprint": "3ab5d313dda8e5f9", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["debug", "cleanup", "repo-hardening", "generated-repo-pattern"]}}, {"ruleId": "scanner-2d0c7b7ab8f8aacf", "level": "warning", "message": {"text": "Critical user flow still appears backed by mock or placeholder data"}, "properties": {"repobilityId": "f5a8423a6483d187", "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": "note", "message": {"text": "Composite production-readiness gap"}, "properties": {"repobilityId": "ae94b78879d5a0d7", "scanner": "scanner-primary", "fingerprint": "b9088664ace7f748", "layer": "quality", "severity": "low", "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": "47638b7d07890de8", "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": "6fa070b2ce4aa821", "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": "eabf839101268c27", "scanner": "scanner-primary", "fingerprint": "8424db9c75e04ba4", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["provenance", "git-history", "generated-repo-pattern"]}}, {"ruleId": "scanner-15a2f4b1bd1f3bc8", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 sw.js:73"}, "properties": {"repobilityId": "c67477ff4e52f9dd", "scanner": "scanner-primary", "fingerprint": "15a2f4b1bd1f3bc8", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-391cc3e3b12b7d02", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 server.js:135"}, "properties": {"repobilityId": "54c43cb080593ab5", "scanner": "scanner-primary", "fingerprint": "391cc3e3b12b7d02", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-ae38d20521d73fb4", "level": "none", "message": {"text": "Commented-code block (5 lines) in tests/test-planner.js:1"}, "properties": {"repobilityId": "fccbfb0eff2b3488", "scanner": "scanner-primary", "fingerprint": "ae38d20521d73fb4", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-f3dcb415dad2946e", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 api/_lib/agent.js:67"}, "properties": {"repobilityId": "cf707a6a2fd3add5", "scanner": "scanner-primary", "fingerprint": "f3dcb415dad2946e", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-c6206aadf4b87733", "level": "note", "message": {"text": "Legacy-named symbol `\u70b9\u4e86\u4e24\u676fOld` in js/data-beijing-hidden.js:2992"}, "properties": {"repobilityId": "ba3454e5fe24480f", "scanner": "scanner-primary", "fingerprint": "c6206aadf4b87733", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-d6463539b4829d7b", "level": "note", "message": {"text": "Legacy-named symbol `weekendgo_visited_migrated_v2` in js/stamp.js:5"}, "properties": {"repobilityId": "71325c49bfb8e299", "scanner": "scanner-primary", "fingerprint": "d6463539b4829d7b", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-fb89314a55eb887e", "level": "none", "message": {"text": "Commented-code block (5 lines) in js/xhs-data.js:1"}, "properties": {"repobilityId": "d4b8a1068c915643", "scanner": "scanner-primary", "fingerprint": "fb89314a55eb887e", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-3eb4f8101d8b5430", "level": "note", "message": {"text": "Legacy-named symbol `wg_plans_v1` in js/planner.js:843"}, "properties": {"repobilityId": "95a55fc488f2d136", "scanner": "scanner-primary", "fingerprint": "3eb4f8101d8b5430", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-5c542886142642ed", "level": "note", "message": {"text": "Legacy-named symbol `wg_theme_v1` in js/theme.js:6"}, "properties": {"repobilityId": "2230c2d641b32c30", "scanner": "scanner-primary", "fingerprint": "5c542886142642ed", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-80b613421bd6fd06", "level": "none", "message": {"text": "Commented-code block (5 lines) in scripts/sync-to-miniapp.js:206"}, "properties": {"repobilityId": "37da671fbd1f0b1a", "scanner": "scanner-primary", "fingerprint": "80b613421bd6fd06", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-102be61077835bed", "level": "none", "message": {"text": "Commented-code block (5 lines) in scripts/pollinations-with-limiter.ts:8"}, "properties": {"repobilityId": "d5c81806319983c2", "scanner": "scanner-primary", "fingerprint": "102be61077835bed", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-2eafc3188c36bb02", "level": "none", "message": {"text": "3 env vars used in code but missing from .env.example"}, "properties": {"repobilityId": "bd934ba112b02ffa", "scanner": "scanner-primary", "fingerprint": "2eafc3188c36bb02", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "config-drift"]}}, {"ruleId": "scanner-49c98f7cedd9c977", "level": "note", "message": {"text": "Near-duplicate function bodies in 4 places"}, "properties": {"repobilityId": "e0d341e703ec0879", "scanner": "scanner-primary", "fingerprint": "49c98f7cedd9c977", "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": "b70ce859580dabb1", "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": "e84b71af71288f11", "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": "9fd9c7f0bea3c54d", "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": "4b2432613af419cb", "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": "d984d74e18495cfa", "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": "fe928ac37524f149", "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": "bfd9c31b0cf6ae69", "scanner": "scanner-primary", "fingerprint": "2c04133e54348533", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-49c98f7cedd9c977", "level": "note", "message": {"text": "Near-duplicate function bodies in 4 places"}, "properties": {"repobilityId": "3bbcce484a21141c", "scanner": "scanner-primary", "fingerprint": "49c98f7cedd9c977", "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": "3496cc940d6cf85e", "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": "975e21a10b71cd10", "scanner": "scanner-primary", "fingerprint": "2c04133e54348533", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-be46ea126aa5d8dc", "level": "note", "message": {"text": "Near-duplicate function bodies in 3 places"}, "properties": {"repobilityId": "7a3005a27c5e311e", "scanner": "scanner-primary", "fingerprint": "be46ea126aa5d8dc", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-2c04133e54348533", "level": "note", "message": {"text": "Near-duplicate function bodies in 2 places"}, "properties": {"repobilityId": "022dd59a1092dc86", "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": "90d9fa80d48f316c", "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": "9bfb5d78dd7cc0a8", "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": "3da1a8aa19b62046", "scanner": "scanner-primary", "fingerprint": "2c04133e54348533", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}]}]}