{"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-1ddea0c638e0614d", "name": "Possibly dead Python function: do_OPTIONS", "shortDescription": {"text": "Possibly dead Python function: do_OPTIONS"}, "fullDescription": {"text": "No callers detected by AST scan in this repo. Could be exported for external callers or a framework handler."}, "properties": {"scanner": "scanner-primary", "layer": "software", "severity": "low", "confidence": 1.0}}, {"id": "scanner-60e9491acbcf52f6", "name": "Possibly dead Python function: do_GET", "shortDescription": {"text": "Possibly dead Python function: do_GET"}, "fullDescription": {"text": "No callers detected by AST scan in this repo. Could be exported for external callers or a framework handler."}, "properties": {"scanner": "scanner-primary", "layer": "software", "severity": "low", "confidence": 1.0}}, {"id": "scanner-ab31818ee6d5e497", "name": "Possibly dead Python function: do_POST", "shortDescription": {"text": "Possibly dead Python function: do_POST"}, "fullDescription": {"text": "No callers detected by AST scan in this repo. Could be exported for external callers or a framework handler."}, "properties": {"scanner": "scanner-primary", "layer": "software", "severity": "low", "confidence": 1.0}}, {"id": "scanner-1bae25dfc5ea6516", "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-41e7b1441d69d1b9", "name": "TODO/FIXME marker in shipping code \u2014 app/tests/gui/boolean-dialog.spec.js:189", "shortDescription": {"text": "TODO/FIXME marker in shipping code \u2014 app/tests/gui/boolean-dialog.spec.js:189"}, "fullDescription": {"text": "Track in /reviews or /issues, not as a code comment that rots.\n\nWhy: Drift control \u2014 shouldn't be the same as Quality TODO scanner.\nRule id: fq.todo-marker"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-7f16f5eb1d6b84e0", "name": "Stray `console.log` in TS/JS \u2014 app/tests/gui/sketch-snap-click-bug.spec.js:88", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 app/tests/gui/sketch-snap-click-bug.spec.js:88"}, "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-7dc262abe71ab6f2", "name": "Stray `console.log` in TS/JS \u2014 app/static/pkg/wasm_bridge.js:329", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 app/static/pkg/wasm_bridge.js:329"}, "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-8fcf29b738543cc9", "name": "Stray `console.log` in TS/JS \u2014 app/src/lib/ui/Toolbar.svelte:154", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 app/src/lib/ui/Toolbar.svelte:154"}, "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-539d6e8bf241da8e", "name": "Stray `console.log` in TS/JS \u2014 app/src/lib/viewport/CadModel.svelte:165", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 app/src/lib/viewport/CadModel.svelte:165"}, "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-4663f90abfd6d4e9", "name": "Stray `console.log` in TS/JS \u2014 app/src/lib/engine/store.svelte.js:781", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 app/src/lib/engine/store.svelte.js:781"}, "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-9b0ad586dd71a9cd", "name": "Stray `console.log` in TS/JS \u2014 app/src/lib/engine/worker.js:49", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 app/src/lib/engine/worker.js: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-c6e4b90fd43b5257", "name": "Stray `console.log` in TS/JS \u2014 app/src/lib/engine/logger.js:77", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 app/src/lib/engine/logger.js:77"}, "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-9a5d48fba75fb981", "name": "TODO/FIXME marker in shipping code \u2014 crates/slvs-patch/slvs-0.6.0/solvespace/src/platform/html/filemanagerui.js:7", "shortDescription": {"text": "TODO/FIXME marker in shipping code \u2014 crates/slvs-patch/slvs-0.6.0/solvespace/src/platform/html/filemanagerui.js:7"}, "fullDescription": {"text": "Track in /reviews or /issues, not as a code comment that rots.\n\nWhy: Drift control \u2014 shouldn't be the same as Quality TODO scanner.\nRule id: fq.todo-marker"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-fa523b86b29f8ae9", "name": "Stray `console.log` in TS/JS \u2014 crates/slvs-patch/slvs-0.6.0/solvespace/src/platform/html/filemanagerui.js:286", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 crates/slvs-patch/slvs-0.6.0/solvespace/src/platform/html/filemanagerui.js:286"}, "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-787da11fa7f77d98", "name": "TODO/FIXME marker in shipping code \u2014 crates/slvs-patch/slvs-0.6.0/solvespace/src/platform/html/solvespaceui.js:426", "shortDescription": {"text": "TODO/FIXME marker in shipping code \u2014 crates/slvs-patch/slvs-0.6.0/solvespace/src/platform/html/solvespaceui.js:426"}, "fullDescription": {"text": "Track in /reviews or /issues, not as a code comment that rots.\n\nWhy: Drift control \u2014 shouldn't be the same as Quality TODO scanner.\nRule id: fq.todo-marker"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-f69c1884aaddd562", "name": "Stray `console.log` in TS/JS \u2014 crates/slvs-patch/slvs-0.6.0/solvespace/src/platform/html/solvespaceui.js:554", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 crates/slvs-patch/slvs-0.6.0/solvespace/src/platform/html/solvespaceui.js:554"}, "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-9f1e40b3c5266fb2", "name": "Stray `console.log` in TS/JS \u2014 crates/wasm-bridge/js/bridge.js:14", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 crates/wasm-bridge/js/bridge.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-9eacdcd4ce09680e", "name": "Docker base image is tag-pinned but not digest-pinned: ubuntu:24.04", "shortDescription": {"text": "Docker base image is tag-pinned but not digest-pinned: ubuntu:24.04"}, "fullDescription": {"text": "Container tags can be retagged upstream. Pin production base images to a reviewed digest (`image@sha256:...`) when reproducibility and supply-chain integrity matter."}, "properties": {"scanner": "scanner-primary", "layer": "hardware", "severity": "low", "confidence": 1.0}}, {"id": "scanner-e2f1cddf8cbe14d3", "name": "Dockerfile pipes a remote installer into a shell", "shortDescription": {"text": "Dockerfile pipes a remote installer into a shell"}, "fullDescription": {"text": "Executing downloaded code during image build gives the remote endpoint build-time code execution. Prefer pinned packages or verify downloaded installers by checksum/signature."}, "properties": {"scanner": "scanner-primary", "layer": "hardware", "severity": "high", "confidence": 1.0}}, {"id": "scanner-aa5acaa49eb8315b", "name": "Containers defined but no K8s/orchestration manifest found", "shortDescription": {"text": "Containers defined but no K8s/orchestration manifest found"}, "fullDescription": {"text": "Repo has Dockerfiles/compose but no Kubernetes/Nomad manifests. If the target deployment is K8s, the manifests may live in a separate ops repo."}, "properties": {"scanner": "scanner-primary", "layer": "hardware", "severity": "low", "confidence": 1.0}}, {"id": "scanner-9710c8d059e53154", "name": "No frontend routes/components detected", "shortDescription": {"text": "No frontend routes/components detected"}, "fullDescription": {"text": "No React/Vue/Next routes were found. This is fine for backend-only repos."}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-2319278a5f7cb901", "name": "Insecure pattern 'cors_wildcard' in control-api.py:60", "shortDescription": {"text": "Insecure pattern 'cors_wildcard' in control-api.py:60"}, "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-33c6fa60df75255e", "name": "Insecure pattern 'node_child_process' in app/vite.config.js:1", "shortDescription": {"text": "Insecure pattern 'node_child_process' in app/vite.config.js:1"}, "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-ea2a377f37620910", "name": "Insecure pattern 'direct_innerhtml_assignment' in crates/slvs-patch/slvs-0.6.0/solvespace/src/platform/html/solvespaceui", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in crates/slvs-patch/slvs-0.6.0/solvespace/src/platform/html/solvespaceui.js:525"}, "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-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/upload-pages-artifact@v3 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-b960506b94e498cb", "name": "GitHub Action is tag-pinned rather than SHA-pinned", "shortDescription": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "fullDescription": {"text": "actions/cache@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-86fa5fc4ef8114ac", "name": "Very large file: app/src/lib/sketch/tools.js (1876 lines)", "shortDescription": {"text": "Very large file: app/src/lib/sketch/tools.js (1876 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-20e5460b87e03ed0", "name": "Very large file: app/src/lib/engine/store.svelte.js (4621 lines)", "shortDescription": {"text": "Very large file: app/src/lib/engine/store.svelte.js (4621 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-d2b0d37219811516", "name": "Very large file: crates/yang-rs/tests/yr21_adversary.rs (1400 lines)", "shortDescription": {"text": "Very large file: crates/yang-rs/tests/yr21_adversary.rs (1400 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-9ffc3b5fd7cf1b17", "name": "Very large file: crates/yang-rs/tests/fuzz_curved.rs (1722 lines)", "shortDescription": {"text": "Very large file: crates/yang-rs/tests/fuzz_curved.rs (1722 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-71172e7057df41bf", "name": "Very large file: crates/yang-rs/tests/yr23_cone_hyperbola.rs (1498 lines)", "shortDescription": {"text": "Very large file: crates/yang-rs/tests/yr23_cone_hyperbola.rs (1498 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-3a0a5074b6c869da", "name": "Very large file: crates/yang-rs/tests/yr22_adversary.rs (1769 lines)", "shortDescription": {"text": "Very large file: crates/yang-rs/tests/yr22_adversary.rs (1769 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-7a2741ba6113829b", "name": "Very large file: crates/yang-rs/tests/yr9_stage3_ssi.rs (1491 lines)", "shortDescription": {"text": "Very large file: crates/yang-rs/tests/yr9_stage3_ssi.rs (1491 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-66bdab8cfd0ec18d", "name": "Very large file: crates/yang-rs/tests/yr10_stage4_relocate.rs (1611 lines)", "shortDescription": {"text": "Very large file: crates/yang-rs/tests/yr10_stage4_relocate.rs (1611 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-3394a1033a802810", "name": "Very large file: crates/yang-rs/tests/yr21_cone_ellipse.rs (1585 lines)", "shortDescription": {"text": "Very large file: crates/yang-rs/tests/yr21_cone_ellipse.rs (1585 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-abb5a00e738c69be", "name": "Very large file: crates/yang-rs/src/lib.rs (9902 lines)", "shortDescription": {"text": "Very large file: crates/yang-rs/src/lib.rs (9902 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-83c7bb73710bb7ff", "name": "Very large file: crates/yang-rs/src/stage0.rs (1347 lines)", "shortDescription": {"text": "Very large file: crates/yang-rs/src/stage0.rs (1347 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-cb02821e57f73314", "name": "Very large file: crates/indirect-predicates-sidecar-rs/tests/smoke.rs (1452 lines)", "shortDescription": {"text": "Very large file: crates/indirect-predicates-sidecar-rs/tests/smoke.rs (1452 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-284bc5eb3e2cc7f0", "name": "Very large file: crates/kernel-v2/src/boolean.rs (1770 lines)", "shortDescription": {"text": "Very large file: crates/kernel-v2/src/boolean.rs (1770 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-b732a76061afe416", "name": "Very large file: crates/kernel-v2/src/construct.rs (1928 lines)", "shortDescription": {"text": "Very large file: crates/kernel-v2/src/construct.rs (1928 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-cfab8fab2879f6cc", "name": "Very large file: crates/kernel-v2/src/validate.rs (1211 lines)", "shortDescription": {"text": "Very large file: crates/kernel-v2/src/validate.rs (1211 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-1a3980bf81756734", "name": "Very large file: crates/kernel-v2/src/tessellate.rs (2134 lines)", "shortDescription": {"text": "Very large file: crates/kernel-v2/src/tessellate.rs (2134 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-191e057f54a4c470", "name": "Very large file: crates/kernel-v2/src/adapter.rs (1849 lines)", "shortDescription": {"text": "Very large file: crates/kernel-v2/src/adapter.rs (1849 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-34d62269bf083e54", "name": "Very large file: crates/test-harness/src/workflow.rs (1537 lines)", "shortDescription": {"text": "Very large file: crates/test-harness/src/workflow.rs (1537 lines)"}, "fullDescription": {"text": "Files with >800 lines often hide complexity hotspots and discourage tests."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-41e6e3008e591cab", "name": "Very large file: crates/test-harness/src/oracle.rs (2833 lines)", "shortDescription": {"text": "Very large file: crates/test-harness/src/oracle.rs (2833 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-7077ff53cd823e79", "name": "Very large file: crates/test-harness/src/assay/randomized_runner.rs (1581 lines)", "shortDescription": {"text": "Very large file: crates/test-harness/src/assay/randomized_runner.rs (1581 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-f96bd172c03d9ba9", "name": "Very large file: crates/test-harness/src/assay/strategies_v2.rs (1649 lines)", "shortDescription": {"text": "Very large file: crates/test-harness/src/assay/strategies_v2.rs (1649 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-597918aa931f6245", "name": "Very large file: crates/test-harness/src/assay/gen.rs (4795 lines)", "shortDescription": {"text": "Very large file: crates/test-harness/src/assay/gen.rs (4795 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-1e9e852cbf322e72", "name": "Very large file: crates/waffle-types/src/sketch.rs (1701 lines)", "shortDescription": {"text": "Very large file: crates/waffle-types/src/sketch.rs (1701 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-61f9984abf13b646", "name": "Very large file: crates/waffle-types/src/kernel/mock.rs (2186 lines)", "shortDescription": {"text": "Very large file: crates/waffle-types/src/kernel/mock.rs (2186 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-5d037fc0f57a04a8", "name": "Very large file: crates/cherchi-rs/src/predicates/indirect/generated.rs (11958 lines)", "shortDescription": {"text": "Very large file: crates/cherchi-rs/src/predicates/indirect/generated.rs (11958 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-7003ebbcc43673f0", "name": "Very large file: crates/cherchi-rs/src/labeling/inside_out_adversary_tests.rs (1213 lines)", "shortDescription": {"text": "Very large file: crates/cherchi-rs/src/labeling/inside_out_adversary_tests.rs (1213 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-7118f0cd4f4987ee", "name": "Very large file: crates/cherchi-rs/src/labeling/inside_out.rs (1669 lines)", "shortDescription": {"text": "Very large file: crates/cherchi-rs/src/labeling/inside_out.rs (1669 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-4f5672f00863080d", "name": "Very large file: crates/cherchi-rs/src/arrangements/enforce.rs (2156 lines)", "shortDescription": {"text": "Very large file: crates/cherchi-rs/src/arrangements/enforce.rs (2156 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-b328929ad4125e72", "name": "Very large file: crates/cherchi-rs/src/arrangements/fast_trimesh.rs (2919 lines)", "shortDescription": {"text": "Very large file: crates/cherchi-rs/src/arrangements/fast_trimesh.rs (2919 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-dd545a27efa7d48a", "name": "Very large file: crates/cherchi-rs/src/arrangements/soup.rs (3116 lines)", "shortDescription": {"text": "Very large file: crates/cherchi-rs/src/arrangements/soup.rs (3116 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-ed2b8911f973af6e", "name": "Very large file: crates/cherchi-rs/src/arrangements/aux_structure.rs (1327 lines)", "shortDescription": {"text": "Very large file: crates/cherchi-rs/src/arrangements/aux_structure.rs (1327 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-c969cee14ab92267", "name": "Very large file: crates/ssi-rs/tests/ssi3_adversary.rs (1260 lines)", "shortDescription": {"text": "Very large file: crates/ssi-rs/tests/ssi3_adversary.rs (1260 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-aeb5f5ffeb9bca33", "name": "Very large file: crates/ssi-rs/src/lib.rs (1675 lines)", "shortDescription": {"text": "Very large file: crates/ssi-rs/src/lib.rs (1675 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-c1680ff9b35e8738", "name": "Very large file: crates/sketch-solver/tests/solve_tests.rs (3617 lines)", "shortDescription": {"text": "Very large file: crates/sketch-solver/tests/solve_tests.rs (3617 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-806fc10036b66c23", "name": "Very large file: crates/feature-engine/tests/engine_tests.rs (4335 lines)", "shortDescription": {"text": "Very large file: crates/feature-engine/tests/engine_tests.rs (4335 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-efda194dc3d2461b", "name": "Very large file: crates/feature-engine/src/rebuild.rs (1848 lines)", "shortDescription": {"text": "Very large file: crates/feature-engine/src/rebuild.rs (1848 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-141b30a41e03817b", "name": "No license file detected", "shortDescription": {"text": "No license file detected"}, "fullDescription": {"text": "No LICENSE/COPYING/NOTICE file was found. Generated repositories often omit licensing, which blocks reuse and automated intake."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-3ab5d313dda8e5f9", "name": "Debug logging residue appears in source files", "shortDescription": {"text": "Debug logging residue appears in source files"}, "fullDescription": {"text": "Found 46 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 61 placeholder/mock markers across 20 source files. This often means the repo looks complete while core flows still use generated scaffolding or fake data."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-2d0c7b7ab8f8aacf", "name": "Critical user flow still appears backed by mock or placeholder data", "shortDescription": {"text": "Critical user flow still appears backed by mock or placeholder data"}, "fullDescription": {"text": "A payment/auth/admin/order/billing-style flow contains mock, fake, TODO, dummy, or placeholder markers in runtime source. In the Fable corpus this is a high-leverage completeness smell: the app can look finished while the money, identity, or tenant flow is still scaffolded."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-749d4bc1bd66df5f", "name": "Agent instructions exist but release-hardening basics are missing", "shortDescription": {"text": "Agent instructions exist but release-hardening basics are missing"}, "fullDescription": {"text": "AI-coder instruction files were found, but the repo is missing license. Treat this as a contract gap: the agent is guided, but the generated output is not yet guarded by the controls that make it repeatable."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-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-690e1b9bcc68a4c5", "name": "Commented-code block (8 lines) in scripts/auto-waffle/claude-runner.py:223", "shortDescription": {"text": "Commented-code block (8 lines) in scripts/auto-waffle/claude-runner.py:223"}, "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-68a57d49d6420aed", "name": "Network/subprocess call without timeout or try/except \u2014 scripts/auto-waffle/claude-runner.py:65", "shortDescription": {"text": "Network/subprocess call without timeout or try/except \u2014 scripts/auto-waffle/claude-runner.py:65"}, "fullDescription": {"text": "`subprocess.Popen(...)` here lacks both a `timeout=` arg and an enclosing try/except. This is exactly the class of bug that took down our git-clone earlier (HTTP/2 stream cancel surfaced as a fatal). Add a `timeout=` and wrap in try/except, or use a wrapper that retries."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-9469379552cb732b", "name": "`fetch()` without try/.catch or AbortSignal \u2014 worker/github-oauth-proxy/src/index.js:31", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 worker/github-oauth-proxy/src/index.js:31"}, "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-b34845ae20ef4747", "name": "Legacy-named symbol `maxOld` in app/tests/gui/sketch-entity-deletion.spec.js:312", "shortDescription": {"text": "Legacy-named symbol `maxOld` in app/tests/gui/sketch-entity-deletion.spec.js:312"}, "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-5e982699fcbb5952", "name": "Commented-code block (6 lines) in app/tests/gui/sketch-entity-deletion.spec.js:58", "shortDescription": {"text": "Commented-code block (6 lines) in app/tests/gui/sketch-entity-deletion.spec.js:58"}, "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-c9596781fcd84609", "name": "Commented-code block (5 lines) in app/tests/gui/sketch-construction-toggle.spec.js:194", "shortDescription": {"text": "Commented-code block (5 lines) in app/tests/gui/sketch-construction-toggle.spec.js:194"}, "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-5a85991ade85b42e", "name": "Commented-code block (5 lines) in app/tests/gui/extrude-alignment.spec.js:88", "shortDescription": {"text": "Commented-code block (5 lines) in app/tests/gui/extrude-alignment.spec.js:88"}, "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-8f2df15246eba778", "name": "Commented-code block (5 lines) in app/tests/gui/arc-profile-extrude.spec.js:55", "shortDescription": {"text": "Commented-code block (5 lines) in app/tests/gui/arc-profile-extrude.spec.js:55"}, "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-0f51387dfc8d0d15", "name": "`fetch()` without try/.catch or AbortSignal \u2014 app/static/pkg/wasm_bridge.js:590", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/static/pkg/wasm_bridge.js:590"}, "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-d526d167ebf4c8a4", "name": "`fetch()` without try/.catch or AbortSignal \u2014 app/static/pkg/slvs/slvs.js:1", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/static/pkg/slvs/slvs.js:1"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-8dc52338951865fc", "name": "Commented-code block (5 lines) in app/scripts/sync-assay.mjs:1", "shortDescription": {"text": "Commented-code block (5 lines) in app/scripts/sync-assay.mjs:1"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-7b1a5e7f516ab1f9", "name": "Commented-code block (6 lines) in app/src/lib/engine/worker.js:353", "shortDescription": {"text": "Commented-code block (6 lines) in app/src/lib/engine/worker.js:353"}, "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-864549e9f2c04d07", "name": "`fetch()` without try/.catch or AbortSignal \u2014 app/src/lib/engine/worker.js:19", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/src/lib/engine/worker.js:19"}, "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-33322910f650e6af", "name": "`fetch()` without try/.catch or AbortSignal \u2014 app/src/lib/engine/assayCaseApi.js:19", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/src/lib/engine/assayCaseApi.js:19"}, "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-2294e343c5e42148", "name": "`fetch()` without try/.catch or AbortSignal \u2014 app/src/lib/engine/testCaseApi.js:13", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/src/lib/engine/testCaseApi.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-f87013028125d70f", "name": "`fetch()` without try/.catch or AbortSignal \u2014 app/src/lib/storage/github-auth.js:41", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/src/lib/storage/github-auth.js:41"}, "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-88f2726100a20756", "name": "Dangling fetch: GET /api/test-cases (app/tests/gui/test-case-browser.spec.js:48)", "shortDescription": {"text": "Dangling fetch: GET /api/test-cases (app/tests/gui/test-case-browser.spec.js:48)"}, "fullDescription": {"text": "`app/tests/gui/test-case-browser.spec.js:48` calls `GET /api/test-cases` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/test-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-021667edd8631f5b", "name": "Dangling fetch: DELETE /api/test-cases/${id} (app/tests/gui/test-case-browser.spec.js:53)", "shortDescription": {"text": "Dangling fetch: DELETE /api/test-cases/${id} (app/tests/gui/test-case-browser.spec.js:53)"}, "fullDescription": {"text": "`app/tests/gui/test-case-browser.spec.js:53` calls `DELETE /api/test-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: `/test-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-c4aec970d711b0e1", "name": "Dangling fetch: POST /api/test-cases (app/tests/gui/test-case-browser.spec.js:61)", "shortDescription": {"text": "Dangling fetch: POST /api/test-cases (app/tests/gui/test-case-browser.spec.js:61)"}, "fullDescription": {"text": "`app/tests/gui/test-case-browser.spec.js:61` calls `POST /api/test-cases` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/test-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-eff26f9ddf14817b", "name": "Dangling fetch: GET /api/test-cases (app/tests/gui/test-case-browser.spec.js:240)", "shortDescription": {"text": "Dangling fetch: GET /api/test-cases (app/tests/gui/test-case-browser.spec.js:240)"}, "fullDescription": {"text": "`app/tests/gui/test-case-browser.spec.js:240` calls `GET /api/test-cases` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/test-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-14d7895631db6e62", "name": "Dangling fetch: POST /api/test-cases (app/tests/gui/test-case-browser.spec.js:415)", "shortDescription": {"text": "Dangling fetch: POST /api/test-cases (app/tests/gui/test-case-browser.spec.js:415)"}, "fullDescription": {"text": "`app/tests/gui/test-case-browser.spec.js:415` calls `POST /api/test-cases` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/test-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-754dbf9c5cbe8527", "name": "Dangling fetch: GET /api/test-cases (app/tests/gui/test-case-browser.spec.js:433)", "shortDescription": {"text": "Dangling fetch: GET /api/test-cases (app/tests/gui/test-case-browser.spec.js:433)"}, "fullDescription": {"text": "`app/tests/gui/test-case-browser.spec.js:433` calls `GET /api/test-cases` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/test-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-93e1552ed376627d", "name": "Dangling fetch: GET /api/test-cases/api-test (app/tests/gui/test-case-browser.spec.js:441)", "shortDescription": {"text": "Dangling fetch: GET /api/test-cases/api-test (app/tests/gui/test-case-browser.spec.js:441)"}, "fullDescription": {"text": "`app/tests/gui/test-case-browser.spec.js:441` calls `GET /api/test-cases/api-test` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/test-cases/api-test`\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-17fb721a6414ccc9", "name": "Dangling fetch: PATCH /api/test-cases/api-test (app/tests/gui/test-case-browser.spec.js:448)", "shortDescription": {"text": "Dangling fetch: PATCH /api/test-cases/api-test (app/tests/gui/test-case-browser.spec.js:448)"}, "fullDescription": {"text": "`app/tests/gui/test-case-browser.spec.js:448` calls `PATCH /api/test-cases/api-test` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/test-cases/api-test`\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-9bc21a827a946352", "name": "Dangling fetch: DELETE /api/test-cases/api-test (app/tests/gui/test-case-browser.spec.js:459)", "shortDescription": {"text": "Dangling fetch: DELETE /api/test-cases/api-test (app/tests/gui/test-case-browser.spec.js:459)"}, "fullDescription": {"text": "`app/tests/gui/test-case-browser.spec.js:459` calls `DELETE /api/test-cases/api-test` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/test-cases/api-test`\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-711215db44401625", "name": "Dangling fetch: GET /api/test-cases (app/tests/gui/test-case-browser.spec.js:462)", "shortDescription": {"text": "Dangling fetch: GET /api/test-cases (app/tests/gui/test-case-browser.spec.js:462)"}, "fullDescription": {"text": "`app/tests/gui/test-case-browser.spec.js:462` calls `GET /api/test-cases` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/test-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-21f4ef4114e74b37", "name": "Dangling fetch: GET /repos/${this.#owner}/${this.#repo} (app/src/lib/storage/github.js:177)", "shortDescription": {"text": "Dangling fetch: GET /repos/${this.#owner}/${this.#repo} (app/src/lib/storage/github.js:177)"}, "fullDescription": {"text": "`app/src/lib/storage/github.js:177` calls `GET /repos/${this.#owner}/${this.#repo}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:apiCall\nNormalized path used for matching: `/repos/${this.`\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-486205b55e25b0b7", "name": "Dangling fetch: POST /user/repos (app/src/lib/storage/github.js:180)", "shortDescription": {"text": "Dangling fetch: POST /user/repos (app/src/lib/storage/github.js:180)"}, "fullDescription": {"text": "`app/src/lib/storage/github.js:180` calls `POST /user/repos` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:apiCall\nNormalized path used for matching: `/user/repos`\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-48f6c02350c4d34e", "name": "Dangling fetch: GET /repos/${this.#owner}/${this.#repo}/contents/${path} (app/src/lib/storage/github.js:256)", "shortDescription": {"text": "Dangling fetch: GET /repos/${this.#owner}/${this.#repo}/contents/${path} (app/src/lib/storage/github.js:256)"}, "fullDescription": {"text": "`app/src/lib/storage/github.js:256` calls `GET /repos/${this.#owner}/${this.#repo}/contents/${path}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:apiCall\nNormalized path used for matching: `/repos/${this.`\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-d11fa66523fbcc88", "name": "Dangling fetch: PUT /repos/${this.#owner}/${this.#repo}/contents/${path} (app/src/lib/storage/github.js:277)", "shortDescription": {"text": "Dangling fetch: PUT /repos/${this.#owner}/${this.#repo}/contents/${path} (app/src/lib/storage/github.js:277)"}, "fullDescription": {"text": "`app/src/lib/storage/github.js:277` calls `PUT /repos/${this.#owner}/${this.#repo}/contents/${path}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:apiCall\nNormalized path used for matching: `/repos/${this.`\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-5891ad76eb5e0420", "name": "Dangling fetch: PUT /repos/${this.#owner}/${this.#repo}/contents/${path} (app/src/lib/storage/github.js:284)", "shortDescription": {"text": "Dangling fetch: PUT /repos/${this.#owner}/${this.#repo}/contents/${path} (app/src/lib/storage/github.js:284)"}, "fullDescription": {"text": "`app/src/lib/storage/github.js:284` calls `PUT /repos/${this.#owner}/${this.#repo}/contents/${path}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:apiCall\nNormalized path used for matching: `/repos/${this.`\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-9820c374b88eaaaf", "name": "Dangling fetch: DELETE /repos/${this.#owner}/${this.#repo}/contents/${path} (app/src/lib/storage/github.js:301)", "shortDescription": {"text": "Dangling fetch: DELETE /repos/${this.#owner}/${this.#repo}/contents/${path} (app/src/lib/storage/github.js:301)"}, "fullDescription": {"text": "`app/src/lib/storage/github.js:301` calls `DELETE /repos/${this.#owner}/${this.#repo}/contents/${path}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:apiCall\nNormalized path used for matching: `/repos/${this.`\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-be81b65aba1a3c76", "name": "Dangling fetch: GET https://api.github.com/user (app/src/lib/storage/github-auth.js:125)", "shortDescription": {"text": "Dangling fetch: GET https://api.github.com/user (app/src/lib/storage/github-auth.js:125)"}, "fullDescription": {"text": "`app/src/lib/storage/github-auth.js:125` calls `GET https://api.github.com/user` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/api.github.com/user`\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-402a00bf3560a3e7", "name": "Unused endpoint: USE /api/test-cases", "shortDescription": {"text": "Unused endpoint: USE /api/test-cases"}, "fullDescription": {"text": "`app/src/lib/vite-plugins/testCaseApi.js` declares `USE /api/test-cases` 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-f558dedb581583e7", "name": "Unused endpoint: USE /api/assay-cases", "shortDescription": {"text": "Unused endpoint: USE /api/assay-cases"}, "fullDescription": {"text": "`app/src/lib/vite-plugins/testCaseApi.js` declares `USE /api/assay-cases` 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/19288"}, "properties": {"repository": "sequoia-hope/waffle-iron", "repoUrl": "https://github.com/sequoia-hope/waffle-iron", "branch": "main"}, "results": [{"ruleId": "scanner-1ddea0c638e0614d", "level": "note", "message": {"text": "Possibly dead Python function: do_OPTIONS"}, "properties": {"repobilityId": "36491d1f4fa41aef", "scanner": "scanner-primary", "fingerprint": "1ddea0c638e0614d", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "control-api.py:72"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-60e9491acbcf52f6", "level": "note", "message": {"text": "Possibly dead Python function: do_GET"}, "properties": {"repobilityId": "2d943bb45e4f13bd", "scanner": "scanner-primary", "fingerprint": "60e9491acbcf52f6", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "control-api.py:77"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-ab31818ee6d5e497", "level": "note", "message": {"text": "Possibly dead Python function: do_POST"}, "properties": {"repobilityId": "53357410ca9379a9", "scanner": "scanner-primary", "fingerprint": "ab31818ee6d5e497", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "control-api.py:86"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-1bae25dfc5ea6516", "level": "note", "message": {"text": "Possibly dead Python function: log_message"}, "properties": {"repobilityId": "965f3150b4af5b2e", "scanner": "scanner-primary", "fingerprint": "1bae25dfc5ea6516", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "control-api.py:102"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-41e7b1441d69d1b9", "level": "none", "message": {"text": "TODO/FIXME marker in shipping code \u2014 app/tests/gui/boolean-dialog.spec.js:189"}, "properties": {"repobilityId": "0290b16761068048", "scanner": "scanner-primary", "fingerprint": "41e7b1441d69d1b9", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.todo-marker"]}}, {"ruleId": "scanner-7f16f5eb1d6b84e0", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 app/tests/gui/sketch-snap-click-bug.spec.js:88"}, "properties": {"repobilityId": "c6da6b4b8eb131f1", "scanner": "scanner-primary", "fingerprint": "7f16f5eb1d6b84e0", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-7dc262abe71ab6f2", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 app/static/pkg/wasm_bridge.js:329"}, "properties": {"repobilityId": "d39cdc9bbba142e0", "scanner": "scanner-primary", "fingerprint": "7dc262abe71ab6f2", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-8fcf29b738543cc9", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 app/src/lib/ui/Toolbar.svelte:154"}, "properties": {"repobilityId": "bd3c3ac7c0964b24", "scanner": "scanner-primary", "fingerprint": "8fcf29b738543cc9", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-539d6e8bf241da8e", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 app/src/lib/viewport/CadModel.svelte:165"}, "properties": {"repobilityId": "863ab20052f9643b", "scanner": "scanner-primary", "fingerprint": "539d6e8bf241da8e", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-4663f90abfd6d4e9", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 app/src/lib/engine/store.svelte.js:781"}, "properties": {"repobilityId": "85010208dc26f2c9", "scanner": "scanner-primary", "fingerprint": "4663f90abfd6d4e9", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-9b0ad586dd71a9cd", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 app/src/lib/engine/worker.js:49"}, "properties": {"repobilityId": "94dedebc4c12be0d", "scanner": "scanner-primary", "fingerprint": "9b0ad586dd71a9cd", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-c6e4b90fd43b5257", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 app/src/lib/engine/logger.js:77"}, "properties": {"repobilityId": "03d72656135498fc", "scanner": "scanner-primary", "fingerprint": "c6e4b90fd43b5257", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-9a5d48fba75fb981", "level": "none", "message": {"text": "TODO/FIXME marker in shipping code \u2014 crates/slvs-patch/slvs-0.6.0/solvespace/src/platform/html/filemanagerui.js:7"}, "properties": {"repobilityId": "00bc3d147b84725f", "scanner": "scanner-primary", "fingerprint": "9a5d48fba75fb981", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.todo-marker"]}}, {"ruleId": "scanner-fa523b86b29f8ae9", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 crates/slvs-patch/slvs-0.6.0/solvespace/src/platform/html/filemanagerui.js:286"}, "properties": {"repobilityId": "9263f2776f544fe7", "scanner": "scanner-primary", "fingerprint": "fa523b86b29f8ae9", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-787da11fa7f77d98", "level": "none", "message": {"text": "TODO/FIXME marker in shipping code \u2014 crates/slvs-patch/slvs-0.6.0/solvespace/src/platform/html/solvespaceui.js:426"}, "properties": {"repobilityId": "e3287b67b122aee3", "scanner": "scanner-primary", "fingerprint": "787da11fa7f77d98", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.todo-marker"]}}, {"ruleId": "scanner-f69c1884aaddd562", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 crates/slvs-patch/slvs-0.6.0/solvespace/src/platform/html/solvespaceui.js:554"}, "properties": {"repobilityId": "9010f4de24668311", "scanner": "scanner-primary", "fingerprint": "f69c1884aaddd562", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-9f1e40b3c5266fb2", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 crates/wasm-bridge/js/bridge.js:14"}, "properties": {"repobilityId": "8535cfb19105c229", "scanner": "scanner-primary", "fingerprint": "9f1e40b3c5266fb2", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-9eacdcd4ce09680e", "level": "note", "message": {"text": "Docker base image is tag-pinned but not digest-pinned: ubuntu:24.04"}, "properties": {"repobilityId": "67c68a84bf47fa2d", "scanner": "scanner-primary", "fingerprint": "9eacdcd4ce09680e", "layer": "hardware", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "docker", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "Dockerfile"}, "region": {"startLine": 3}}}]}, {"ruleId": "scanner-e2f1cddf8cbe14d3", "level": "error", "message": {"text": "Dockerfile pipes a remote installer into a shell"}, "properties": {"repobilityId": "e54bbec0a96a3101", "scanner": "scanner-primary", "fingerprint": "e2f1cddf8cbe14d3", "layer": "hardware", "severity": "high", "confidence": 1.0, "tags": ["supply-chain", "docker", "remote-installer"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "Dockerfile"}, "region": {"startLine": 39}}}]}, {"ruleId": "scanner-e2f1cddf8cbe14d3", "level": "error", "message": {"text": "Dockerfile pipes a remote installer into a shell"}, "properties": {"repobilityId": "d1053c15d2ae774c", "scanner": "scanner-primary", "fingerprint": "e2f1cddf8cbe14d3", "layer": "hardware", "severity": "high", "confidence": 1.0, "tags": ["supply-chain", "docker", "remote-installer"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "Dockerfile"}, "region": {"startLine": 75}}}]}, {"ruleId": "scanner-e2f1cddf8cbe14d3", "level": "error", "message": {"text": "Dockerfile pipes a remote installer into a shell"}, "properties": {"repobilityId": "0bc7db4ad4bde7ad", "scanner": "scanner-primary", "fingerprint": "e2f1cddf8cbe14d3", "layer": "hardware", "severity": "high", "confidence": 1.0, "tags": ["supply-chain", "docker", "remote-installer"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "Dockerfile"}, "region": {"startLine": 88}}}]}, {"ruleId": "scanner-aa5acaa49eb8315b", "level": "note", "message": {"text": "Containers defined but no K8s/orchestration manifest found"}, "properties": {"repobilityId": "b230ea9b68736081", "scanner": "scanner-primary", "fingerprint": "aa5acaa49eb8315b", "layer": "hardware", "severity": "low", "confidence": 1.0, "tags": ["coverage", "deployment"]}}, {"ruleId": "scanner-9710c8d059e53154", "level": "none", "message": {"text": "No frontend routes/components detected"}, "properties": {"repobilityId": "44ca61485762e494", "scanner": "scanner-primary", "fingerprint": "9710c8d059e53154", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["coverage"]}}, {"ruleId": "scanner-2319278a5f7cb901", "level": "warning", "message": {"text": "Insecure pattern 'cors_wildcard' in control-api.py:60"}, "properties": {"repobilityId": "0ccc653fea714b6b", "scanner": "scanner-primary", "fingerprint": "2319278a5f7cb901", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "cors_wildcard"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "control-api.py"}, "region": {"startLine": 60}}}]}, {"ruleId": "scanner-33c6fa60df75255e", "level": "warning", "message": {"text": "Insecure pattern 'node_child_process' in app/vite.config.js:1"}, "properties": {"repobilityId": "66bc4488893f5f9e", "scanner": "scanner-primary", "fingerprint": "33c6fa60df75255e", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "node_child_process"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "app/vite.config.js"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-ea2a377f37620910", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in crates/slvs-patch/slvs-0.6.0/solvespace/src/platform/html/solvespaceui.js:525"}, "properties": {"repobilityId": "35a60e382d6db18c", "scanner": "scanner-primary", "fingerprint": "ea2a377f37620910", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "crates/slvs-patch/slvs-0.6.0/solvespace/src/platform/html/solvespaceui.js"}, "region": {"startLine": 525}}}]}, {"ruleId": "scanner-28c4a04bd807da0c", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "b70dbcc8f54d72ab", "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": 43}}}]}, {"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": 56}}}]}, {"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-b960506b94e498cb", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "8772ab6f5f6d5248", "scanner": "scanner-primary", "fingerprint": "b960506b94e498cb", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/rust-test.yml"}, "region": {"startLine": 57}}}]}, {"ruleId": "scanner-b960506b94e498cb", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "8772ab6f5f6d5248", "scanner": "scanner-primary", "fingerprint": "b960506b94e498cb", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/rust-test.yml"}, "region": {"startLine": 66}}}]}, {"ruleId": "scanner-86fa5fc4ef8114ac", "level": "note", "message": {"text": "Very large file: app/src/lib/sketch/tools.js (1876 lines)"}, "properties": {"repobilityId": "688e97c8adc053e6", "scanner": "scanner-primary", "fingerprint": "86fa5fc4ef8114ac", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-20e5460b87e03ed0", "level": "note", "message": {"text": "Very large file: app/src/lib/engine/store.svelte.js (4621 lines)"}, "properties": {"repobilityId": "072f00bd3860183d", "scanner": "scanner-primary", "fingerprint": "20e5460b87e03ed0", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-d2b0d37219811516", "level": "note", "message": {"text": "Very large file: crates/yang-rs/tests/yr21_adversary.rs (1400 lines)"}, "properties": {"repobilityId": "c30c0c24f5982bb6", "scanner": "scanner-primary", "fingerprint": "d2b0d37219811516", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-9ffc3b5fd7cf1b17", "level": "note", "message": {"text": "Very large file: crates/yang-rs/tests/fuzz_curved.rs (1722 lines)"}, "properties": {"repobilityId": "856c658e370119c4", "scanner": "scanner-primary", "fingerprint": "9ffc3b5fd7cf1b17", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-71172e7057df41bf", "level": "note", "message": {"text": "Very large file: crates/yang-rs/tests/yr23_cone_hyperbola.rs (1498 lines)"}, "properties": {"repobilityId": "f288a4dd5b6633ae", "scanner": "scanner-primary", "fingerprint": "71172e7057df41bf", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-3a0a5074b6c869da", "level": "note", "message": {"text": "Very large file: crates/yang-rs/tests/yr22_adversary.rs (1769 lines)"}, "properties": {"repobilityId": "a7a67b9906983588", "scanner": "scanner-primary", "fingerprint": "3a0a5074b6c869da", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-7a2741ba6113829b", "level": "note", "message": {"text": "Very large file: crates/yang-rs/tests/yr9_stage3_ssi.rs (1491 lines)"}, "properties": {"repobilityId": "0eb2ef2f9e169e25", "scanner": "scanner-primary", "fingerprint": "7a2741ba6113829b", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-66bdab8cfd0ec18d", "level": "note", "message": {"text": "Very large file: crates/yang-rs/tests/yr10_stage4_relocate.rs (1611 lines)"}, "properties": {"repobilityId": "f4c11f9485d55d05", "scanner": "scanner-primary", "fingerprint": "66bdab8cfd0ec18d", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-3394a1033a802810", "level": "note", "message": {"text": "Very large file: crates/yang-rs/tests/yr21_cone_ellipse.rs (1585 lines)"}, "properties": {"repobilityId": "fa377cd14f55e211", "scanner": "scanner-primary", "fingerprint": "3394a1033a802810", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-abb5a00e738c69be", "level": "note", "message": {"text": "Very large file: crates/yang-rs/src/lib.rs (9902 lines)"}, "properties": {"repobilityId": "f372a4ce48ea166c", "scanner": "scanner-primary", "fingerprint": "abb5a00e738c69be", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-83c7bb73710bb7ff", "level": "note", "message": {"text": "Very large file: crates/yang-rs/src/stage0.rs (1347 lines)"}, "properties": {"repobilityId": "8d9b5d7dc82277cd", "scanner": "scanner-primary", "fingerprint": "83c7bb73710bb7ff", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-cb02821e57f73314", "level": "note", "message": {"text": "Very large file: crates/indirect-predicates-sidecar-rs/tests/smoke.rs (1452 lines)"}, "properties": {"repobilityId": "ecf74fb14335dd14", "scanner": "scanner-primary", "fingerprint": "cb02821e57f73314", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-284bc5eb3e2cc7f0", "level": "note", "message": {"text": "Very large file: crates/kernel-v2/src/boolean.rs (1770 lines)"}, "properties": {"repobilityId": "b9b5268f0e1068cc", "scanner": "scanner-primary", "fingerprint": "284bc5eb3e2cc7f0", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-b732a76061afe416", "level": "note", "message": {"text": "Very large file: crates/kernel-v2/src/construct.rs (1928 lines)"}, "properties": {"repobilityId": "2b24f7f6de9a98c3", "scanner": "scanner-primary", "fingerprint": "b732a76061afe416", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-cfab8fab2879f6cc", "level": "note", "message": {"text": "Very large file: crates/kernel-v2/src/validate.rs (1211 lines)"}, "properties": {"repobilityId": "12b80f8257bc3cc9", "scanner": "scanner-primary", "fingerprint": "cfab8fab2879f6cc", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-1a3980bf81756734", "level": "note", "message": {"text": "Very large file: crates/kernel-v2/src/tessellate.rs (2134 lines)"}, "properties": {"repobilityId": "9007ac7778d46149", "scanner": "scanner-primary", "fingerprint": "1a3980bf81756734", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-191e057f54a4c470", "level": "note", "message": {"text": "Very large file: crates/kernel-v2/src/adapter.rs (1849 lines)"}, "properties": {"repobilityId": "406e7667c9c0a068", "scanner": "scanner-primary", "fingerprint": "191e057f54a4c470", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-34d62269bf083e54", "level": "note", "message": {"text": "Very large file: crates/test-harness/src/workflow.rs (1537 lines)"}, "properties": {"repobilityId": "f91630eba2262dbd", "scanner": "scanner-primary", "fingerprint": "34d62269bf083e54", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-41e6e3008e591cab", "level": "note", "message": {"text": "Very large file: crates/test-harness/src/oracle.rs (2833 lines)"}, "properties": {"repobilityId": "3d21bd3c7ba9325b", "scanner": "scanner-primary", "fingerprint": "41e6e3008e591cab", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-7077ff53cd823e79", "level": "note", "message": {"text": "Very large file: crates/test-harness/src/assay/randomized_runner.rs (1581 lines)"}, "properties": {"repobilityId": "f73c06182ba4312a", "scanner": "scanner-primary", "fingerprint": "7077ff53cd823e79", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-f96bd172c03d9ba9", "level": "note", "message": {"text": "Very large file: crates/test-harness/src/assay/strategies_v2.rs (1649 lines)"}, "properties": {"repobilityId": "1be853837bba4c31", "scanner": "scanner-primary", "fingerprint": "f96bd172c03d9ba9", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-597918aa931f6245", "level": "note", "message": {"text": "Very large file: crates/test-harness/src/assay/gen.rs (4795 lines)"}, "properties": {"repobilityId": "05be51f47bf000c8", "scanner": "scanner-primary", "fingerprint": "597918aa931f6245", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-1e9e852cbf322e72", "level": "note", "message": {"text": "Very large file: crates/waffle-types/src/sketch.rs (1701 lines)"}, "properties": {"repobilityId": "7320d8988ce39145", "scanner": "scanner-primary", "fingerprint": "1e9e852cbf322e72", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-61f9984abf13b646", "level": "note", "message": {"text": "Very large file: crates/waffle-types/src/kernel/mock.rs (2186 lines)"}, "properties": {"repobilityId": "1eeb4d228f6f16ed", "scanner": "scanner-primary", "fingerprint": "61f9984abf13b646", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-5d037fc0f57a04a8", "level": "note", "message": {"text": "Very large file: crates/cherchi-rs/src/predicates/indirect/generated.rs (11958 lines)"}, "properties": {"repobilityId": "5b40fb9e4d29dc22", "scanner": "scanner-primary", "fingerprint": "5d037fc0f57a04a8", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-7003ebbcc43673f0", "level": "note", "message": {"text": "Very large file: crates/cherchi-rs/src/labeling/inside_out_adversary_tests.rs (1213 lines)"}, "properties": {"repobilityId": "f72ebf5b93f4424b", "scanner": "scanner-primary", "fingerprint": "7003ebbcc43673f0", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-7118f0cd4f4987ee", "level": "note", "message": {"text": "Very large file: crates/cherchi-rs/src/labeling/inside_out.rs (1669 lines)"}, "properties": {"repobilityId": "08cc7a83c52b6cee", "scanner": "scanner-primary", "fingerprint": "7118f0cd4f4987ee", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-4f5672f00863080d", "level": "note", "message": {"text": "Very large file: crates/cherchi-rs/src/arrangements/enforce.rs (2156 lines)"}, "properties": {"repobilityId": "d307a7d55cd7c406", "scanner": "scanner-primary", "fingerprint": "4f5672f00863080d", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-b328929ad4125e72", "level": "note", "message": {"text": "Very large file: crates/cherchi-rs/src/arrangements/fast_trimesh.rs (2919 lines)"}, "properties": {"repobilityId": "ef4676ac7d167dcc", "scanner": "scanner-primary", "fingerprint": "b328929ad4125e72", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-dd545a27efa7d48a", "level": "note", "message": {"text": "Very large file: crates/cherchi-rs/src/arrangements/soup.rs (3116 lines)"}, "properties": {"repobilityId": "e0d722088fd934c0", "scanner": "scanner-primary", "fingerprint": "dd545a27efa7d48a", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-ed2b8911f973af6e", "level": "note", "message": {"text": "Very large file: crates/cherchi-rs/src/arrangements/aux_structure.rs (1327 lines)"}, "properties": {"repobilityId": "29a88e361a7076cb", "scanner": "scanner-primary", "fingerprint": "ed2b8911f973af6e", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-c969cee14ab92267", "level": "note", "message": {"text": "Very large file: crates/ssi-rs/tests/ssi3_adversary.rs (1260 lines)"}, "properties": {"repobilityId": "b5ed7cf711cd7c33", "scanner": "scanner-primary", "fingerprint": "c969cee14ab92267", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-aeb5f5ffeb9bca33", "level": "note", "message": {"text": "Very large file: crates/ssi-rs/src/lib.rs (1675 lines)"}, "properties": {"repobilityId": "ef892b6841126bda", "scanner": "scanner-primary", "fingerprint": "aeb5f5ffeb9bca33", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-c1680ff9b35e8738", "level": "note", "message": {"text": "Very large file: crates/sketch-solver/tests/solve_tests.rs (3617 lines)"}, "properties": {"repobilityId": "4a59ed7aa3d68546", "scanner": "scanner-primary", "fingerprint": "c1680ff9b35e8738", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-806fc10036b66c23", "level": "note", "message": {"text": "Very large file: crates/feature-engine/tests/engine_tests.rs (4335 lines)"}, "properties": {"repobilityId": "464f67fca9021778", "scanner": "scanner-primary", "fingerprint": "806fc10036b66c23", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-efda194dc3d2461b", "level": "note", "message": {"text": "Very large file: crates/feature-engine/src/rebuild.rs (1848 lines)"}, "properties": {"repobilityId": "feb38528ae0a3bc2", "scanner": "scanner-primary", "fingerprint": "efda194dc3d2461b", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-141b30a41e03817b", "level": "note", "message": {"text": "No license file detected"}, "properties": {"repobilityId": "25e3877be617f711", "scanner": "scanner-primary", "fingerprint": "141b30a41e03817b", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["license", "repo-hardening", "generated-repo-pattern"]}}, {"ruleId": "scanner-3ab5d313dda8e5f9", "level": "note", "message": {"text": "Debug logging residue appears in source files"}, "properties": {"repobilityId": "4877c07148db9e3b", "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": "6094d8fb219f1b0e", "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": "c379a75cd37f6f69", "scanner": "scanner-primary", "fingerprint": "2d0c7b7ab8f8aacf", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["placeholder", "mock-data", "critical-flow", "generated-repo-pattern"]}}, {"ruleId": "scanner-749d4bc1bd66df5f", "level": "warning", "message": {"text": "Agent instructions exist but release-hardening basics are missing"}, "properties": {"repobilityId": "47ec2f17a5cc722d", "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": "5af8ab2992e4ce84", "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": "9918121853db746a", "scanner": "scanner-primary", "fingerprint": "8424db9c75e04ba4", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["provenance", "git-history", "generated-repo-pattern"]}}, {"ruleId": "scanner-690e1b9bcc68a4c5", "level": "none", "message": {"text": "Commented-code block (8 lines) in scripts/auto-waffle/claude-runner.py:223"}, "properties": {"repobilityId": "43741089f0838878", "scanner": "scanner-primary", "fingerprint": "690e1b9bcc68a4c5", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-68a57d49d6420aed", "level": "warning", "message": {"text": "Network/subprocess call without timeout or try/except \u2014 scripts/auto-waffle/claude-runner.py:65"}, "properties": {"repobilityId": "0706b23532ab9899", "scanner": "scanner-primary", "fingerprint": "68a57d49d6420aed", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-9469379552cb732b", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 worker/github-oauth-proxy/src/index.js:31"}, "properties": {"repobilityId": "7940598905e4a55c", "scanner": "scanner-primary", "fingerprint": "9469379552cb732b", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-b34845ae20ef4747", "level": "note", "message": {"text": "Legacy-named symbol `maxOld` in app/tests/gui/sketch-entity-deletion.spec.js:312"}, "properties": {"repobilityId": "e5d35d91ff9da1ad", "scanner": "scanner-primary", "fingerprint": "b34845ae20ef4747", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-5e982699fcbb5952", "level": "none", "message": {"text": "Commented-code block (6 lines) in app/tests/gui/sketch-entity-deletion.spec.js:58"}, "properties": {"repobilityId": "ef19b9af22936e6e", "scanner": "scanner-primary", "fingerprint": "5e982699fcbb5952", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-c9596781fcd84609", "level": "none", "message": {"text": "Commented-code block (5 lines) in app/tests/gui/sketch-construction-toggle.spec.js:194"}, "properties": {"repobilityId": "f92180e799f4572d", "scanner": "scanner-primary", "fingerprint": "c9596781fcd84609", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-5a85991ade85b42e", "level": "none", "message": {"text": "Commented-code block (5 lines) in app/tests/gui/extrude-alignment.spec.js:88"}, "properties": {"repobilityId": "495cc8b11083aafa", "scanner": "scanner-primary", "fingerprint": "5a85991ade85b42e", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-8f2df15246eba778", "level": "none", "message": {"text": "Commented-code block (5 lines) in app/tests/gui/arc-profile-extrude.spec.js:55"}, "properties": {"repobilityId": "576f6642c79785bf", "scanner": "scanner-primary", "fingerprint": "8f2df15246eba778", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-0f51387dfc8d0d15", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/static/pkg/wasm_bridge.js:590"}, "properties": {"repobilityId": "629febe1f6d9b439", "scanner": "scanner-primary", "fingerprint": "0f51387dfc8d0d15", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-d526d167ebf4c8a4", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/static/pkg/slvs/slvs.js:1"}, "properties": {"repobilityId": "174d3ec27c4fbdb5", "scanner": "scanner-primary", "fingerprint": "d526d167ebf4c8a4", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-8dc52338951865fc", "level": "none", "message": {"text": "Commented-code block (5 lines) in app/scripts/sync-assay.mjs:1"}, "properties": {"repobilityId": "e9ff7b0e55a9839b", "scanner": "scanner-primary", "fingerprint": "8dc52338951865fc", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-7b1a5e7f516ab1f9", "level": "none", "message": {"text": "Commented-code block (6 lines) in app/src/lib/engine/worker.js:353"}, "properties": {"repobilityId": "72ef43402a4a3743", "scanner": "scanner-primary", "fingerprint": "7b1a5e7f516ab1f9", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-864549e9f2c04d07", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/src/lib/engine/worker.js:19"}, "properties": {"repobilityId": "d64fd05f34808fbb", "scanner": "scanner-primary", "fingerprint": "864549e9f2c04d07", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-33322910f650e6af", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/src/lib/engine/assayCaseApi.js:19"}, "properties": {"repobilityId": "2e24ac3d1d219255", "scanner": "scanner-primary", "fingerprint": "33322910f650e6af", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-2294e343c5e42148", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/src/lib/engine/testCaseApi.js:13"}, "properties": {"repobilityId": "9cbe632295712377", "scanner": "scanner-primary", "fingerprint": "2294e343c5e42148", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-f87013028125d70f", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/src/lib/storage/github-auth.js:41"}, "properties": {"repobilityId": "f5e377a988dbd6e5", "scanner": "scanner-primary", "fingerprint": "f87013028125d70f", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-88f2726100a20756", "level": "error", "message": {"text": "Dangling fetch: GET /api/test-cases (app/tests/gui/test-case-browser.spec.js:48)"}, "properties": {"repobilityId": "2d055085c4aa2b4e", "scanner": "scanner-primary", "fingerprint": "88f2726100a20756", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-021667edd8631f5b", "level": "error", "message": {"text": "Dangling fetch: DELETE /api/test-cases/${id} (app/tests/gui/test-case-browser.spec.js:53)"}, "properties": {"repobilityId": "a32bd8b3398010e8", "scanner": "scanner-primary", "fingerprint": "021667edd8631f5b", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-c4aec970d711b0e1", "level": "error", "message": {"text": "Dangling fetch: POST /api/test-cases (app/tests/gui/test-case-browser.spec.js:61)"}, "properties": {"repobilityId": "4bc1abdb78fef592", "scanner": "scanner-primary", "fingerprint": "c4aec970d711b0e1", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-eff26f9ddf14817b", "level": "error", "message": {"text": "Dangling fetch: GET /api/test-cases (app/tests/gui/test-case-browser.spec.js:240)"}, "properties": {"repobilityId": "ba6488f41615e7ca", "scanner": "scanner-primary", "fingerprint": "eff26f9ddf14817b", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-14d7895631db6e62", "level": "error", "message": {"text": "Dangling fetch: POST /api/test-cases (app/tests/gui/test-case-browser.spec.js:415)"}, "properties": {"repobilityId": "bc4cb7975926caa0", "scanner": "scanner-primary", "fingerprint": "14d7895631db6e62", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-754dbf9c5cbe8527", "level": "error", "message": {"text": "Dangling fetch: GET /api/test-cases (app/tests/gui/test-case-browser.spec.js:433)"}, "properties": {"repobilityId": "925a899c9dfc4e74", "scanner": "scanner-primary", "fingerprint": "754dbf9c5cbe8527", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-93e1552ed376627d", "level": "error", "message": {"text": "Dangling fetch: GET /api/test-cases/api-test (app/tests/gui/test-case-browser.spec.js:441)"}, "properties": {"repobilityId": "28bfc518bf52cb2c", "scanner": "scanner-primary", "fingerprint": "93e1552ed376627d", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-17fb721a6414ccc9", "level": "error", "message": {"text": "Dangling fetch: PATCH /api/test-cases/api-test (app/tests/gui/test-case-browser.spec.js:448)"}, "properties": {"repobilityId": "3b7d0c9de0715377", "scanner": "scanner-primary", "fingerprint": "17fb721a6414ccc9", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-9bc21a827a946352", "level": "error", "message": {"text": "Dangling fetch: DELETE /api/test-cases/api-test (app/tests/gui/test-case-browser.spec.js:459)"}, "properties": {"repobilityId": "719129ca846767f6", "scanner": "scanner-primary", "fingerprint": "9bc21a827a946352", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-711215db44401625", "level": "error", "message": {"text": "Dangling fetch: GET /api/test-cases (app/tests/gui/test-case-browser.spec.js:462)"}, "properties": {"repobilityId": "90600e6b01c8e354", "scanner": "scanner-primary", "fingerprint": "711215db44401625", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-21f4ef4114e74b37", "level": "error", "message": {"text": "Dangling fetch: GET /repos/${this.#owner}/${this.#repo} (app/src/lib/storage/github.js:177)"}, "properties": {"repobilityId": "dc3101eb58b3f1a7", "scanner": "scanner-primary", "fingerprint": "21f4ef4114e74b37", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:apiCall"]}}, {"ruleId": "scanner-486205b55e25b0b7", "level": "error", "message": {"text": "Dangling fetch: POST /user/repos (app/src/lib/storage/github.js:180)"}, "properties": {"repobilityId": "18ece2ad57c8ec39", "scanner": "scanner-primary", "fingerprint": "486205b55e25b0b7", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:apiCall"]}}, {"ruleId": "scanner-48f6c02350c4d34e", "level": "error", "message": {"text": "Dangling fetch: GET /repos/${this.#owner}/${this.#repo}/contents/${path} (app/src/lib/storage/github.js:256)"}, "properties": {"repobilityId": "6aa44c37d520d996", "scanner": "scanner-primary", "fingerprint": "48f6c02350c4d34e", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:apiCall"]}}, {"ruleId": "scanner-d11fa66523fbcc88", "level": "error", "message": {"text": "Dangling fetch: PUT /repos/${this.#owner}/${this.#repo}/contents/${path} (app/src/lib/storage/github.js:277)"}, "properties": {"repobilityId": "e8a8430201c2a36f", "scanner": "scanner-primary", "fingerprint": "d11fa66523fbcc88", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:apiCall"]}}, {"ruleId": "scanner-5891ad76eb5e0420", "level": "error", "message": {"text": "Dangling fetch: PUT /repos/${this.#owner}/${this.#repo}/contents/${path} (app/src/lib/storage/github.js:284)"}, "properties": {"repobilityId": "751b6048c381853e", "scanner": "scanner-primary", "fingerprint": "5891ad76eb5e0420", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:apiCall"]}}, {"ruleId": "scanner-9820c374b88eaaaf", "level": "error", "message": {"text": "Dangling fetch: DELETE /repos/${this.#owner}/${this.#repo}/contents/${path} (app/src/lib/storage/github.js:301)"}, "properties": {"repobilityId": "c823495ec7dfa4cb", "scanner": "scanner-primary", "fingerprint": "9820c374b88eaaaf", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:apiCall"]}}, {"ruleId": "scanner-be81b65aba1a3c76", "level": "error", "message": {"text": "Dangling fetch: GET https://api.github.com/user (app/src/lib/storage/github-auth.js:125)"}, "properties": {"repobilityId": "15ce6bb878e7c6d2", "scanner": "scanner-primary", "fingerprint": "be81b65aba1a3c76", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-402a00bf3560a3e7", "level": "note", "message": {"text": "Unused endpoint: USE /api/test-cases"}, "properties": {"repobilityId": "7af3a97672ea2787", "scanner": "scanner-primary", "fingerprint": "402a00bf3560a3e7", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-f558dedb581583e7", "level": "note", "message": {"text": "Unused endpoint: USE /api/assay-cases"}, "properties": {"repobilityId": "b8af176d2178aded", "scanner": "scanner-primary", "fingerprint": "f558dedb581583e7", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}]}]}