{"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-fb729f87886cb2a1", "name": "`truncate` class without `title=` for hover reveal \u2014 crates/sonata/web/src/picker.tsx:47", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 crates/sonata/web/src/picker.tsx:47"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-32816333c928ae39", "name": "`truncate` class without `title=` for hover reveal \u2014 crates/sonata/web/src/login.tsx:35", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 crates/sonata/web/src/login.tsx:35"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-0b796fd008b0b43c", "name": "`truncate` class without `title=` for hover reveal \u2014 crates/sonata/web/src/result.tsx:21", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 crates/sonata/web/src/result.tsx:21"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-3f3340928f0f070b", "name": "`truncate` class without `title=` for hover reveal \u2014 crates/sonata/web/src/palette.tsx:142", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 crates/sonata/web/src/palette.tsx:142"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-f78a85a38bfacb97", "name": "Icon-only button without accessible name \u2014 crates/sonata/web/src/ui.tsx:82", "shortDescription": {"text": "Icon-only button without accessible name \u2014 crates/sonata/web/src/ui.tsx:82"}, "fullDescription": {"text": "A `<button>` whose only child is a single glyph or symbol needs `title=` or `aria-label=` so screen readers (and tooltips on hover) work.\n\nWhy: P3 in CHECKLIST.md \u2014 icon-only buttons skipped a title.\nRule id: fq.button.no-label"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-32bb7c98acad1a2c", "name": "`truncate` class without `title=` for hover reveal \u2014 crates/sonata/web/src/ui.tsx:175", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 crates/sonata/web/src/ui.tsx:175"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-3f2ec33b28835995", "name": "`truncate` class without `title=` for hover reveal \u2014 crates/sonata/web/src/App.tsx:191", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 crates/sonata/web/src/App.tsx:191"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-b42622f373d2214e", "name": "`truncate` class without `title=` for hover reveal \u2014 crates/sonata/web/src/screens/Ledger.tsx:118", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 crates/sonata/web/src/screens/Ledger.tsx:118"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-73744db7a13ed5aa", "name": "`truncate` class without `title=` for hover reveal \u2014 crates/sonata/web/src/screens/Series.tsx:225", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 crates/sonata/web/src/screens/Series.tsx:225"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-181b3cfaa98b41a9", "name": "`truncate` class without `title=` for hover reveal \u2014 crates/sonata/web/src/screens/Workbench.tsx:280", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 crates/sonata/web/src/screens/Workbench.tsx:280"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-d48727221b9e8802", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 crates/sonata/web/src/screens/Workbench.tsx:448", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 crates/sonata/web/src/screens/Workbench.tsx:448"}, "fullDescription": {"text": "Open XSS surface unless the input is provably trusted. Replace with explicit JSX or sanitize via a vetted library.\n\nWhy: OWASP basics. Already partially flagged by the security analyzer.\nRule id: fq.dangerous-html"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-370da54d9f4334fd", "name": "`truncate` class without `title=` for hover reveal \u2014 crates/sonata/web/src/screens/Signals.tsx:130", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 crates/sonata/web/src/screens/Signals.tsx:130"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-eb684e46f243bce3", "name": "`truncate` class without `title=` for hover reveal \u2014 crates/sonata/web/src/screens/Subjects.tsx:127", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 crates/sonata/web/src/screens/Subjects.tsx:127"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-9372261df11c0339", "name": "Insecure pattern 'direct_innerhtml_assignment' in crates/sonata/web/src/sonata.ts:130", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in crates/sonata/web/src/sonata.ts:130"}, "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-bd36613540c587bb", "name": "Insecure pattern 'dangerous_innerhtml' in crates/sonata/web/src/screens/Workbench.tsx:448", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in crates/sonata/web/src/screens/Workbench.tsx:448"}, "fullDescription": {"text": "Found a known-risky pattern (dangerous_innerhtml). 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-75510f0354d50a2d", "name": "Very large file: crates/devtools/refinery/src/parsed.rs (3571 lines)", "shortDescription": {"text": "Very large file: crates/devtools/refinery/src/parsed.rs (3571 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-259e1e2e04be2df5", "name": "Very large file: crates/devtools/importer/src/direct.rs (9267 lines)", "shortDescription": {"text": "Very large file: crates/devtools/importer/src/direct.rs (9267 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-86b0a38d4655b57b", "name": "Very large file: crates/devtools/harvest/src/main.rs (3015 lines)", "shortDescription": {"text": "Very large file: crates/devtools/harvest/src/main.rs (3015 lines)"}, "fullDescription": {"text": "Files with >800 lines often hide complexity hotspots and discourage tests."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-6893a6c8b0861585", "name": "Very low test-to-source ratio", "shortDescription": {"text": "Very low test-to-source ratio"}, "fullDescription": {"text": "10 test file(s) for 142 source file(s) (ratio 0.07). Consider adding integration or unit tests for critical paths."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-141b30a41e03817b", "name": "No license file detected", "shortDescription": {"text": "No license file detected"}, "fullDescription": {"text": "No LICENSE/COPYING/NOTICE file was found. Generated repositories often omit licensing, which blocks reuse and automated intake."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-72b2a6250083a784", "name": "Placeholder or mock-heavy implementation detected", "shortDescription": {"text": "Placeholder or mock-heavy implementation detected"}, "fullDescription": {"text": "Found 33 placeholder/mock markers across 13 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-f4fac1056f8d2a9d", "name": "`fetch()` without try/.catch or AbortSignal \u2014 crates/sonata/web/src/api.ts:196", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 crates/sonata/web/src/api.ts:196"}, "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-763bc755f79b151b", "name": "Commented-code block (6 lines) in crates/sonata/web/src/screens/Series.tsx:1", "shortDescription": {"text": "Commented-code block (6 lines) in crates/sonata/web/src/screens/Series.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-34bae8da12304c2d", "name": "Commented-code block (6 lines) in crates/sonata/web/src/screens/Subject.tsx:1", "shortDescription": {"text": "Commented-code block (6 lines) in crates/sonata/web/src/screens/Subject.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-2c04133e54348533", "name": "Near-duplicate function bodies in 2 places", "shortDescription": {"text": "Near-duplicate function bodies in 2 places"}, "fullDescription": {"text": "Functions with the same first-5-line body hash:\ncrates/devtools/importer/scripts/parsed_semantic_records.py:write, crates/devtools/importer/scripts/parsed_semantic_records.py:write\n\nThis is *the* AI-coder failure mode (4\u00d7 more duplication in vibe-coded repos \u2014 see https://jw.hn/ai-code-hygiene). Consolidate or document why they're separate."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}]}}, "automationDetails": {"id": "repobility/21229"}, "properties": {"repository": "thornquist/sonata_v2", "repoUrl": "https://github.com/thornquist/sonata_v2", "branch": "main"}, "results": [{"ruleId": "scanner-fb729f87886cb2a1", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 crates/sonata/web/src/picker.tsx:47"}, "properties": {"repobilityId": "3e4873073bcab8ee", "scanner": "scanner-primary", "fingerprint": "fb729f87886cb2a1", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-32816333c928ae39", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 crates/sonata/web/src/login.tsx:35"}, "properties": {"repobilityId": "d075d2fe3f711e09", "scanner": "scanner-primary", "fingerprint": "32816333c928ae39", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-0b796fd008b0b43c", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 crates/sonata/web/src/result.tsx:21"}, "properties": {"repobilityId": "9cd672dedbfc26bb", "scanner": "scanner-primary", "fingerprint": "0b796fd008b0b43c", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-3f3340928f0f070b", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 crates/sonata/web/src/palette.tsx:142"}, "properties": {"repobilityId": "d1581fc6ef82f3fe", "scanner": "scanner-primary", "fingerprint": "3f3340928f0f070b", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-f78a85a38bfacb97", "level": "note", "message": {"text": "Icon-only button without accessible name \u2014 crates/sonata/web/src/ui.tsx:82"}, "properties": {"repobilityId": "90094ab4e03eda89", "scanner": "scanner-primary", "fingerprint": "f78a85a38bfacb97", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.button.no-label"]}}, {"ruleId": "scanner-32bb7c98acad1a2c", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 crates/sonata/web/src/ui.tsx:175"}, "properties": {"repobilityId": "3b3bf8e775a2ca8b", "scanner": "scanner-primary", "fingerprint": "32bb7c98acad1a2c", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-3f2ec33b28835995", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 crates/sonata/web/src/App.tsx:191"}, "properties": {"repobilityId": "586cb53f5a7b352b", "scanner": "scanner-primary", "fingerprint": "3f2ec33b28835995", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-b42622f373d2214e", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 crates/sonata/web/src/screens/Ledger.tsx:118"}, "properties": {"repobilityId": "6e52fc1ff85d1656", "scanner": "scanner-primary", "fingerprint": "b42622f373d2214e", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-73744db7a13ed5aa", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 crates/sonata/web/src/screens/Series.tsx:225"}, "properties": {"repobilityId": "9d72529b9c69acfe", "scanner": "scanner-primary", "fingerprint": "73744db7a13ed5aa", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-181b3cfaa98b41a9", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 crates/sonata/web/src/screens/Workbench.tsx:280"}, "properties": {"repobilityId": "47a1a2bd0bc75ed9", "scanner": "scanner-primary", "fingerprint": "181b3cfaa98b41a9", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-d48727221b9e8802", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 crates/sonata/web/src/screens/Workbench.tsx:448"}, "properties": {"repobilityId": "3463137a4d9074c2", "scanner": "scanner-primary", "fingerprint": "d48727221b9e8802", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-370da54d9f4334fd", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 crates/sonata/web/src/screens/Signals.tsx:130"}, "properties": {"repobilityId": "82a786bf70d67216", "scanner": "scanner-primary", "fingerprint": "370da54d9f4334fd", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-eb684e46f243bce3", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 crates/sonata/web/src/screens/Subjects.tsx:127"}, "properties": {"repobilityId": "53101714b1a164cf", "scanner": "scanner-primary", "fingerprint": "eb684e46f243bce3", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-9372261df11c0339", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in crates/sonata/web/src/sonata.ts:130"}, "properties": {"repobilityId": "69a2db5f31b290f6", "scanner": "scanner-primary", "fingerprint": "9372261df11c0339", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "crates/sonata/web/src/sonata.ts"}, "region": {"startLine": 130}}}]}, {"ruleId": "scanner-bd36613540c587bb", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in crates/sonata/web/src/screens/Workbench.tsx:448"}, "properties": {"repobilityId": "e5211e2948dce732", "scanner": "scanner-primary", "fingerprint": "bd36613540c587bb", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "crates/sonata/web/src/screens/Workbench.tsx"}, "region": {"startLine": 448}}}]}, {"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-75510f0354d50a2d", "level": "note", "message": {"text": "Very large file: crates/devtools/refinery/src/parsed.rs (3571 lines)"}, "properties": {"repobilityId": "9be1a678fd5bf4af", "scanner": "scanner-primary", "fingerprint": "75510f0354d50a2d", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-259e1e2e04be2df5", "level": "note", "message": {"text": "Very large file: crates/devtools/importer/src/direct.rs (9267 lines)"}, "properties": {"repobilityId": "838662e7dadc6a0f", "scanner": "scanner-primary", "fingerprint": "259e1e2e04be2df5", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-86b0a38d4655b57b", "level": "note", "message": {"text": "Very large file: crates/devtools/harvest/src/main.rs (3015 lines)"}, "properties": {"repobilityId": "1c4cd0d0c08412fe", "scanner": "scanner-primary", "fingerprint": "86b0a38d4655b57b", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-6893a6c8b0861585", "level": "warning", "message": {"text": "Very low test-to-source ratio"}, "properties": {"repobilityId": "54a7de3f06314bf0", "scanner": "scanner-primary", "fingerprint": "6893a6c8b0861585", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["tests", "coverage"]}}, {"ruleId": "scanner-141b30a41e03817b", "level": "note", "message": {"text": "No license file detected"}, "properties": {"repobilityId": "a1164b58b0e2147c", "scanner": "scanner-primary", "fingerprint": "141b30a41e03817b", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["license", "repo-hardening", "generated-repo-pattern"]}}, {"ruleId": "scanner-72b2a6250083a784", "level": "warning", "message": {"text": "Placeholder or mock-heavy implementation detected"}, "properties": {"repobilityId": "69747a252a640eb5", "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": "fd4dd6509603966c", "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": "bcf01d0f28432774", "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": "1101404786de842f", "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": "6919cc3c7def7405", "scanner": "scanner-primary", "fingerprint": "8424db9c75e04ba4", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["provenance", "git-history", "generated-repo-pattern"]}}, {"ruleId": "scanner-f4fac1056f8d2a9d", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 crates/sonata/web/src/api.ts:196"}, "properties": {"repobilityId": "d396ad1cfb111feb", "scanner": "scanner-primary", "fingerprint": "f4fac1056f8d2a9d", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-763bc755f79b151b", "level": "none", "message": {"text": "Commented-code block (6 lines) in crates/sonata/web/src/screens/Series.tsx:1"}, "properties": {"repobilityId": "03bb3b13c3411245", "scanner": "scanner-primary", "fingerprint": "763bc755f79b151b", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-34bae8da12304c2d", "level": "none", "message": {"text": "Commented-code block (6 lines) in crates/sonata/web/src/screens/Subject.tsx:1"}, "properties": {"repobilityId": "b529cd68a7fdce8a", "scanner": "scanner-primary", "fingerprint": "34bae8da12304c2d", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-2c04133e54348533", "level": "note", "message": {"text": "Near-duplicate function bodies in 2 places"}, "properties": {"repobilityId": "e3c09f85fca46a99", "scanner": "scanner-primary", "fingerprint": "2c04133e54348533", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-2c04133e54348533", "level": "note", "message": {"text": "Near-duplicate function bodies in 2 places"}, "properties": {"repobilityId": "72fe546ee572e6bd", "scanner": "scanner-primary", "fingerprint": "2c04133e54348533", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}]}]}