{"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-663e3df2bb6ec029", "name": "Stray `console.log` in TS/JS \u2014 src/components/RestOverlapFixV2.ts:197", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/components/RestOverlapFixV2.ts:197"}, "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-9ffca1c1de290a21", "name": "Stray `console.log` in TS/JS \u2014 src/components/StaffCanvas.tsx:728", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/components/StaffCanvas.tsx:728"}, "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-45e60419f5b3e2c6", "name": "Stray `console.log` in TS/JS \u2014 src/components/RestOverlapFix.test.ts:183", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/components/RestOverlapFix.test.ts:183"}, "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-e54cf41f3b32995b", "name": "Stray `console.log` in TS/JS \u2014 src/components/RestOverlapErrorHandling.test.ts:182", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/components/RestOverlapErrorHandling.test.ts:182"}, "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-44362686ad430ff1", "name": "Stray `console.log` in TS/JS \u2014 src/components/ScorePage.tsx:269", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/components/ScorePage.tsx:269"}, "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-9d62379ae1365eab", "name": "Stray `console.log` in TS/JS \u2014 src/components/PianoSystemCanvas.tsx:767", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/components/PianoSystemCanvas.tsx:767"}, "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-a09ac598ff733693", "name": "Stray `console.log` in TS/JS \u2014 src/audio/ScorePlayer.ts:102", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/audio/ScorePlayer.ts:102"}, "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-ef93378da25d0867", "name": "Stray `console.log` in TS/JS \u2014 src/audio/AudioEngine.ts:9", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/audio/AudioEngine.ts:9"}, "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-df9b0f8b11aaf54a", "name": "Stray `console.log` in TS/JS \u2014 src/audio/SoundSource.ts:127", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/audio/SoundSource.ts:127"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-f6e71dbe1f216379", "name": "Stray `console.log` in TS/JS \u2014 src/audio/NotePlayer.ts:66", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/audio/NotePlayer.ts:66"}, "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-f035ece7a24ee60a", "name": "Stray `console.log` in TS/JS \u2014 src/audio/SoundFontEngine.ts:132", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/audio/SoundFontEngine.ts:132"}, "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-6cdaa18fef7964ff", "name": "Stray `console.log` in TS/JS \u2014 src/audio/SimpleAudioEngine.ts:68", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/audio/SimpleAudioEngine.ts:68"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-a35c6a00f751880f", "name": "Docker base image is tag-pinned but not digest-pinned: node:20-slim", "shortDescription": {"text": "Docker base image is tag-pinned but not digest-pinned: node:20-slim"}, "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-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-b8f32a19629fbe9e", "name": "Insecure pattern 'direct_innerhtml_assignment' in src/components/StaffCanvas.tsx:1133", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in src/components/StaffCanvas.tsx:1133"}, "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-a29e81645b69c909", "name": "Insecure pattern 'direct_innerhtml_assignment' in src/components/CoordinateTransform.test.tsx:140", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in src/components/CoordinateTransform.test.tsx:140"}, "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-23279bdec09559bf", "name": "Insecure pattern 'direct_innerhtml_assignment' in src/components/ScorePage.tsx:632", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in src/components/ScorePage.tsx:632"}, "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-3586192d1b89fcd4", "name": "Insecure pattern 'direct_innerhtml_assignment' in src/components/PianoSystemCanvas.tsx:1052", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in src/components/PianoSystemCanvas.tsx:1052"}, "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-b9284372eb4c29b8", "name": "Insecure pattern 'direct_innerhtml_assignment' in src/components/Palette.tsx:451", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in src/components/Palette.tsx:451"}, "fullDescription": {"text": "Found a known-risky pattern (direct_innerhtml_assignment). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-6372cebde0220094", "name": "No auth library detected", "shortDescription": {"text": "No auth library detected"}, "fullDescription": {"text": "The scanner did not find any standard auth library (JWT, OAuth, NextAuth, Auth0, etc.). The repo has auth/admin/session surface indicators, so auth may live in custom code, in a separate service, or be missing."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-4601e3ad3bb28677", "name": "No CI/CD pipelines detected", "shortDescription": {"text": "No CI/CD pipelines detected"}, "fullDescription": {"text": "No GitHub Actions, GitLab CI, or CircleCI configs found. Without CI you can't gate deploys on tests/lints."}, "properties": {"scanner": "scanner-primary", "layer": "cicd", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-c91a03649777c525", "name": "Very large file: src/components/StaffCanvas.tsx (2505 lines)", "shortDescription": {"text": "Very large file: src/components/StaffCanvas.tsx (2505 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-563e98c334cefcc9", "name": "Very large file: src/components/CoordinateTransform.test.tsx (2238 lines)", "shortDescription": {"text": "Very large file: src/components/CoordinateTransform.test.tsx (2238 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-6de07103bfec9f6e", "name": "Very large file: src/components/ScorePage.tsx (1949 lines)", "shortDescription": {"text": "Very large file: src/components/ScorePage.tsx (1949 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-8ed051f7445c970a", "name": "Very large file: src/components/PianoSystemCanvas.tsx (2359 lines)", "shortDescription": {"text": "Very large file: src/components/PianoSystemCanvas.tsx (2359 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-f2c8ba5bb313a416", "name": "Very large file: src/components/StaffCanvas.test.tsx (2167 lines)", "shortDescription": {"text": "Very large file: src/components/StaffCanvas.test.tsx (2167 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-3ab5d313dda8e5f9", "name": "Debug logging residue appears in source files", "shortDescription": {"text": "Debug logging residue appears in source files"}, "fullDescription": {"text": "Found 112 console/debugger/print-style debug statements in non-test source. This is a common fast-generation residue before production cleanup."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-2d0c7b7ab8f8aacf", "name": "Critical user flow still appears backed by mock or placeholder data", "shortDescription": {"text": "Critical user flow still appears backed by mock or placeholder data"}, "fullDescription": {"text": "A payment/auth/admin/order/billing-style flow contains mock, fake, TODO, dummy, or placeholder markers in runtime source. In the Fable corpus this is a high-leverage completeness smell: the app can look finished while the money, identity, or tenant flow is still scaffolded."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-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 ci. 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-2c5f98b152cddb6d", "name": "Agent authority lacks a verifier contract: .claude/launch.json", "shortDescription": {"text": "Agent authority lacks a verifier contract: .claude/launch.json"}, "fullDescription": {"text": "This agent instruction grants code or shell authority but does not state the verification gate that decides promotion. The recurring safe pattern is: LLM proposes; deterministic tests/build/security checks verify; only verified code promotes."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-095acb3602960e3d", "name": "Agent authority lacks a verifier contract: .claude/specs/security-hardening/design.md", "shortDescription": {"text": "Agent authority lacks a verifier contract: .claude/specs/security-hardening/design.md"}, "fullDescription": {"text": "This agent instruction grants code or shell authority but does not state the verification gate that decides promotion. The recurring safe pattern is: LLM proposes; deterministic tests/build/security checks verify; only verified code promotes."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-81493bd9ce85c242", "name": "Agent instruction/config may expose a secret: .claude/specs/bug-fixes/design.md", "shortDescription": {"text": "Agent instruction/config may expose a secret: .claude/specs/bug-fixes/design.md"}, "fullDescription": {"text": "Agent-facing files are routinely pasted into LLM/tool contexts. Move literal tokens, keys, and passwords into a secret manager or document them as placeholders only."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-3044c8c61a1d83df", "name": "Commented-code block (5 lines) in src/utils/noteKeyUtils.test.ts:134", "shortDescription": {"text": "Commented-code block (5 lines) in src/utils/noteKeyUtils.test.ts:134"}, "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-422a4a2a4713980d", "name": "Commented-code block (5 lines) in src/components/StaffCanvas.tsx:433", "shortDescription": {"text": "Commented-code block (5 lines) in src/components/StaffCanvas.tsx:433"}, "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-441d0c837374873f", "name": "Commented-code block (7 lines) in src/components/PianoSystemCanvas.tsx:507", "shortDescription": {"text": "Commented-code block (7 lines) in src/components/PianoSystemCanvas.tsx:507"}, "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-80e0ff59841b226a", "name": "Commented-code block (10 lines) in src/components/Palette.tsx:1", "shortDescription": {"text": "Commented-code block (10 lines) in src/components/Palette.tsx:1"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-17ec770b98bd952a", "name": "Commented-code block (19 lines) in src/audio/SimpleAudioEngine.ts:606", "shortDescription": {"text": "Commented-code block (19 lines) in src/audio/SimpleAudioEngine.ts:606"}, "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}}]}}, "automationDetails": {"id": "repobility/18981"}, "properties": {"repository": "satoshi-34/music-editer", "repoUrl": "https://github.com/satoshi-34/music-editer", "branch": "main"}, "results": [{"ruleId": "scanner-663e3df2bb6ec029", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/components/RestOverlapFixV2.ts:197"}, "properties": {"repobilityId": "9ef8bbd4a5b97219", "scanner": "scanner-primary", "fingerprint": "663e3df2bb6ec029", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-9ffca1c1de290a21", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/components/StaffCanvas.tsx:728"}, "properties": {"repobilityId": "d4ba59d5eab002a3", "scanner": "scanner-primary", "fingerprint": "9ffca1c1de290a21", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-45e60419f5b3e2c6", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/components/RestOverlapFix.test.ts:183"}, "properties": {"repobilityId": "d1e0a298fddf93f8", "scanner": "scanner-primary", "fingerprint": "45e60419f5b3e2c6", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-e54cf41f3b32995b", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/components/RestOverlapErrorHandling.test.ts:182"}, "properties": {"repobilityId": "bd42328ba4431d52", "scanner": "scanner-primary", "fingerprint": "e54cf41f3b32995b", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-44362686ad430ff1", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/components/ScorePage.tsx:269"}, "properties": {"repobilityId": "922d2240627adad1", "scanner": "scanner-primary", "fingerprint": "44362686ad430ff1", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-9d62379ae1365eab", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/components/PianoSystemCanvas.tsx:767"}, "properties": {"repobilityId": "e4297404b471e3ca", "scanner": "scanner-primary", "fingerprint": "9d62379ae1365eab", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-a09ac598ff733693", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/audio/ScorePlayer.ts:102"}, "properties": {"repobilityId": "f2b38b544333815e", "scanner": "scanner-primary", "fingerprint": "a09ac598ff733693", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-ef93378da25d0867", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/audio/AudioEngine.ts:9"}, "properties": {"repobilityId": "7911e15515d3089b", "scanner": "scanner-primary", "fingerprint": "ef93378da25d0867", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-df9b0f8b11aaf54a", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/audio/SoundSource.ts:127"}, "properties": {"repobilityId": "c6b8f6dd228bb550", "scanner": "scanner-primary", "fingerprint": "df9b0f8b11aaf54a", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-f6e71dbe1f216379", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/audio/NotePlayer.ts:66"}, "properties": {"repobilityId": "029153aa3afafe93", "scanner": "scanner-primary", "fingerprint": "f6e71dbe1f216379", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-f035ece7a24ee60a", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/audio/SoundFontEngine.ts:132"}, "properties": {"repobilityId": "e96f8a81a479704c", "scanner": "scanner-primary", "fingerprint": "f035ece7a24ee60a", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-6cdaa18fef7964ff", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/audio/SimpleAudioEngine.ts:68"}, "properties": {"repobilityId": "870fb19d2850ea55", "scanner": "scanner-primary", "fingerprint": "6cdaa18fef7964ff", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-a35c6a00f751880f", "level": "note", "message": {"text": "Docker base image is tag-pinned but not digest-pinned: node:20-slim"}, "properties": {"repobilityId": "be924fbee382ebe0", "scanner": "scanner-primary", "fingerprint": "a35c6a00f751880f", "layer": "hardware", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "docker", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "Dockerfile"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-aa5acaa49eb8315b", "level": "note", "message": {"text": "Containers defined but no K8s/orchestration manifest found"}, "properties": {"repobilityId": "b230ea9b68736081", "scanner": "scanner-primary", "fingerprint": "aa5acaa49eb8315b", "layer": "hardware", "severity": "low", "confidence": 1.0, "tags": ["coverage", "deployment"]}}, {"ruleId": "scanner-b8f32a19629fbe9e", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in src/components/StaffCanvas.tsx:1133"}, "properties": {"repobilityId": "f853ea48a4ab9419", "scanner": "scanner-primary", "fingerprint": "b8f32a19629fbe9e", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/components/StaffCanvas.tsx"}, "region": {"startLine": 1133}}}]}, {"ruleId": "scanner-a29e81645b69c909", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in src/components/CoordinateTransform.test.tsx:140"}, "properties": {"repobilityId": "ed03910d36d00835", "scanner": "scanner-primary", "fingerprint": "a29e81645b69c909", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/components/CoordinateTransform.test.tsx"}, "region": {"startLine": 140}}}]}, {"ruleId": "scanner-23279bdec09559bf", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in src/components/ScorePage.tsx:632"}, "properties": {"repobilityId": "086839f2ff03ee7c", "scanner": "scanner-primary", "fingerprint": "23279bdec09559bf", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/components/ScorePage.tsx"}, "region": {"startLine": 632}}}]}, {"ruleId": "scanner-3586192d1b89fcd4", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in src/components/PianoSystemCanvas.tsx:1052"}, "properties": {"repobilityId": "a98d7f0675c8fd47", "scanner": "scanner-primary", "fingerprint": "3586192d1b89fcd4", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/components/PianoSystemCanvas.tsx"}, "region": {"startLine": 1052}}}]}, {"ruleId": "scanner-b9284372eb4c29b8", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in src/components/Palette.tsx:451"}, "properties": {"repobilityId": "304f066444f44b7b", "scanner": "scanner-primary", "fingerprint": "b9284372eb4c29b8", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/components/Palette.tsx"}, "region": {"startLine": 451}}}]}, {"ruleId": "scanner-6372cebde0220094", "level": "warning", "message": {"text": "No auth library detected"}, "properties": {"repobilityId": "a5b6035a5bbf8054", "scanner": "scanner-primary", "fingerprint": "6372cebde0220094", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["coverage", "auth"]}}, {"ruleId": "scanner-4601e3ad3bb28677", "level": "warning", "message": {"text": "No CI/CD pipelines detected"}, "properties": {"repobilityId": "c3ee439bce2bc51e", "scanner": "scanner-primary", "fingerprint": "4601e3ad3bb28677", "layer": "cicd", "severity": "medium", "confidence": 1.0, "tags": ["coverage"]}}, {"ruleId": "scanner-c91a03649777c525", "level": "note", "message": {"text": "Very large file: src/components/StaffCanvas.tsx (2505 lines)"}, "properties": {"repobilityId": "8c8410b59971f621", "scanner": "scanner-primary", "fingerprint": "c91a03649777c525", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-563e98c334cefcc9", "level": "note", "message": {"text": "Very large file: src/components/CoordinateTransform.test.tsx (2238 lines)"}, "properties": {"repobilityId": "953198ef96771e08", "scanner": "scanner-primary", "fingerprint": "563e98c334cefcc9", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-6de07103bfec9f6e", "level": "note", "message": {"text": "Very large file: src/components/ScorePage.tsx (1949 lines)"}, "properties": {"repobilityId": "2201aa51a4c97a6c", "scanner": "scanner-primary", "fingerprint": "6de07103bfec9f6e", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-8ed051f7445c970a", "level": "note", "message": {"text": "Very large file: src/components/PianoSystemCanvas.tsx (2359 lines)"}, "properties": {"repobilityId": "7c0dc04b15572c66", "scanner": "scanner-primary", "fingerprint": "8ed051f7445c970a", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-f2c8ba5bb313a416", "level": "note", "message": {"text": "Very large file: src/components/StaffCanvas.test.tsx (2167 lines)"}, "properties": {"repobilityId": "73ce45f5126fb602", "scanner": "scanner-primary", "fingerprint": "f2c8ba5bb313a416", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-3ab5d313dda8e5f9", "level": "note", "message": {"text": "Debug logging residue appears in source files"}, "properties": {"repobilityId": "be0ccc97f487afe6", "scanner": "scanner-primary", "fingerprint": "3ab5d313dda8e5f9", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["debug", "cleanup", "repo-hardening", "generated-repo-pattern"]}}, {"ruleId": "scanner-2d0c7b7ab8f8aacf", "level": "warning", "message": {"text": "Critical user flow still appears backed by mock or placeholder data"}, "properties": {"repobilityId": "1f2a077aae911626", "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": "543c175397ca8915", "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": "b44c04476406d831", "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": "dd8326110214071c", "scanner": "scanner-primary", "fingerprint": "8424db9c75e04ba4", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["provenance", "git-history", "generated-repo-pattern"]}}, {"ruleId": "scanner-2c5f98b152cddb6d", "level": "warning", "message": {"text": "Agent authority lacks a verifier contract: .claude/launch.json"}, "properties": {"repobilityId": "0de48c0f4ab303d8", "scanner": "scanner-primary", "fingerprint": "2c5f98b152cddb6d", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "verification", "claude_instruction"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".claude/launch.json"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-095acb3602960e3d", "level": "warning", "message": {"text": "Agent authority lacks a verifier contract: .claude/specs/security-hardening/design.md"}, "properties": {"repobilityId": "0f389880d9745186", "scanner": "scanner-primary", "fingerprint": "095acb3602960e3d", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "verification", "claude_instruction"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".claude/specs/security-hardening/design.md"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-81493bd9ce85c242", "level": "error", "message": {"text": "Agent instruction/config may expose a secret: .claude/specs/bug-fixes/design.md"}, "properties": {"repobilityId": "80023c90a7b0fee2", "scanner": "scanner-primary", "fingerprint": "81493bd9ce85c242", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["agent-instructions", "secrets", "claude_instruction"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".claude/specs/bug-fixes/design.md"}, "region": {"startLine": 852}}}]}, {"ruleId": "scanner-3044c8c61a1d83df", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/utils/noteKeyUtils.test.ts:134"}, "properties": {"repobilityId": "6b92a4bb13d46514", "scanner": "scanner-primary", "fingerprint": "3044c8c61a1d83df", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-422a4a2a4713980d", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/components/StaffCanvas.tsx:433"}, "properties": {"repobilityId": "f72bd76da05d0802", "scanner": "scanner-primary", "fingerprint": "422a4a2a4713980d", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-441d0c837374873f", "level": "none", "message": {"text": "Commented-code block (7 lines) in src/components/PianoSystemCanvas.tsx:507"}, "properties": {"repobilityId": "2ef047c5ab840a81", "scanner": "scanner-primary", "fingerprint": "441d0c837374873f", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-80e0ff59841b226a", "level": "none", "message": {"text": "Commented-code block (10 lines) in src/components/Palette.tsx:1"}, "properties": {"repobilityId": "c6dd76d898b1269b", "scanner": "scanner-primary", "fingerprint": "80e0ff59841b226a", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-17ec770b98bd952a", "level": "none", "message": {"text": "Commented-code block (19 lines) in src/audio/SimpleAudioEngine.ts:606"}, "properties": {"repobilityId": "abe48d371eba38bd", "scanner": "scanner-primary", "fingerprint": "17ec770b98bd952a", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}]}]}