{"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-281539b9b82fd376", "name": "`truncate` class without `title=` for hover reveal \u2014 web/src/apps/settings/SettingsApp.tsx:90", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 web/src/apps/settings/SettingsApp.tsx:90"}, "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-c403eac25870ea4f", "name": "`truncate` class without `title=` for hover reveal \u2014 web/src/apps/monitor/MonitorApp.tsx:32", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 web/src/apps/monitor/MonitorApp.tsx:32"}, "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-728fc0fbed9c01d6", "name": "`truncate` class without `title=` for hover reveal \u2014 web/src/apps/connectors/ConnectorDetail.tsx:118", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 web/src/apps/connectors/ConnectorDetail.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-18e95e89abcbcb35", "name": "`truncate` class without `title=` for hover reveal \u2014 web/src/apps/connectors/ConnectorsApp.tsx:112", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 web/src/apps/connectors/ConnectorsApp.tsx:112"}, "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-ad788d59b6abb51a", "name": "`truncate` class without `title=` for hover reveal \u2014 web/src/apps/hooks/HooksApp.tsx:85", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 web/src/apps/hooks/HooksApp.tsx:85"}, "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-269ba1ca833aec59", "name": "`truncate` class without `title=` for hover reveal \u2014 web/src/apps/hooks/HookDetail.tsx:149", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 web/src/apps/hooks/HookDetail.tsx:149"}, "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-ce8634e4edbc5495", "name": "`truncate` class without `title=` for hover reveal \u2014 web/src/apps/market/MarketApp.tsx:62", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 web/src/apps/market/MarketApp.tsx:62"}, "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-6a644e5a424c967f", "name": "`truncate` class without `title=` for hover reveal \u2014 web/src/apps/market/PackageDetail.tsx:87", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 web/src/apps/market/PackageDetail.tsx:87"}, "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-2428649141d964f0", "name": "`truncate` class without `title=` for hover reveal \u2014 web/src/apps/skills/SkillsApp.tsx:114", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 web/src/apps/skills/SkillsApp.tsx:114"}, "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-2d36259531f168f1", "name": "Stray `console.log` in TS/JS \u2014 src/index.ts:38", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/index.ts:38"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-7062d68b5d984c02", "name": "Stray `console.log` in TS/JS \u2014 src/server/static.test.ts:23", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/server/static.test.ts:23"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-9710c8d059e53154", "name": "No frontend routes/components detected", "shortDescription": {"text": "No frontend routes/components detected"}, "fullDescription": {"text": "No React/Vue/Next routes were found. This is fine for backend-only repos."}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-10a2236be120f27f", "name": "Insecure pattern 'exec_used' in src/hooks/executor.ts:48", "shortDescription": {"text": "Insecure pattern 'exec_used' in src/hooks/executor.ts:48"}, "fullDescription": {"text": "Found a known-risky pattern (exec_used). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-61e33bb24ab7b25d", "name": "Insecure pattern 'node_child_process' in src/hooks/executor.ts:1", "shortDescription": {"text": "Insecure pattern 'node_child_process' in src/hooks/executor.ts: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-65ad1dc1cd498500", "name": "Insecure pattern 'node_child_process' in src/secrets/backend.ts:1", "shortDescription": {"text": "Insecure pattern 'node_child_process' in src/secrets/backend.ts: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-6799d7da33d50a16", "name": "Insecure pattern 'exec_used' in src/store/run-store.ts:55", "shortDescription": {"text": "Insecure pattern 'exec_used' in src/store/run-store.ts:55"}, "fullDescription": {"text": "Found a known-risky pattern (exec_used). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "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-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-419d6e54dff69b4b", "name": "`fetch()` without try/.catch or AbortSignal \u2014 web/src/api.ts:15", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 web/src/api.ts:15"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-27343820f92651d7", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/registry/registry.ts:41", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/registry/registry.ts: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-903574da3765d007", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/server/http.test.ts:32", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/server/http.test.ts:32"}, "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-2e512d740d0ee184", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/server/secrets-api.test.ts:75", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/server/secrets-api.test.ts:75"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-0b1fc93ca9e08d48", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/server/sse.test.ts:60", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/server/sse.test.ts:60"}, "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-84d64e685c8f7f10", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/server/runs-api.test.ts:56", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/server/runs-api.test.ts:56"}, "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-e01542d8e2670fc9", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/server/static.test.ts:37", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/server/static.test.ts:37"}, "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-81e8589347f3c4e6", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/server/registry-api.test.ts:74", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/server/registry-api.test.ts:74"}, "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-030b95cf15bbf032", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/server/skills-api.test.ts:38", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/server/skills-api.test.ts:38"}, "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-12a491906f21d96b", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/server/hooks-api.test.ts:47", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/server/hooks-api.test.ts:47"}, "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}}]}}, "automationDetails": {"id": "repobility/21117"}, "properties": {"repository": "TheMVLLAB/ondol", "repoUrl": "https://github.com/TheMVLLAB/ondol", "branch": "main"}, "results": [{"ruleId": "scanner-281539b9b82fd376", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 web/src/apps/settings/SettingsApp.tsx:90"}, "properties": {"repobilityId": "5974577dce2f52e4", "scanner": "scanner-primary", "fingerprint": "281539b9b82fd376", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-c403eac25870ea4f", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 web/src/apps/monitor/MonitorApp.tsx:32"}, "properties": {"repobilityId": "082d03a16630a167", "scanner": "scanner-primary", "fingerprint": "c403eac25870ea4f", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-728fc0fbed9c01d6", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 web/src/apps/connectors/ConnectorDetail.tsx:118"}, "properties": {"repobilityId": "f7061066c9f6e760", "scanner": "scanner-primary", "fingerprint": "728fc0fbed9c01d6", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-18e95e89abcbcb35", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 web/src/apps/connectors/ConnectorsApp.tsx:112"}, "properties": {"repobilityId": "cf57357ddff293ed", "scanner": "scanner-primary", "fingerprint": "18e95e89abcbcb35", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-ad788d59b6abb51a", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 web/src/apps/hooks/HooksApp.tsx:85"}, "properties": {"repobilityId": "ee29828c9b31647c", "scanner": "scanner-primary", "fingerprint": "ad788d59b6abb51a", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-269ba1ca833aec59", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 web/src/apps/hooks/HookDetail.tsx:149"}, "properties": {"repobilityId": "38a2a3d838f4b16d", "scanner": "scanner-primary", "fingerprint": "269ba1ca833aec59", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-ce8634e4edbc5495", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 web/src/apps/market/MarketApp.tsx:62"}, "properties": {"repobilityId": "eb023a030b8985ef", "scanner": "scanner-primary", "fingerprint": "ce8634e4edbc5495", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-6a644e5a424c967f", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 web/src/apps/market/PackageDetail.tsx:87"}, "properties": {"repobilityId": "422958c30ce60909", "scanner": "scanner-primary", "fingerprint": "6a644e5a424c967f", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-2428649141d964f0", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 web/src/apps/skills/SkillsApp.tsx:114"}, "properties": {"repobilityId": "77f36e7c75f58de6", "scanner": "scanner-primary", "fingerprint": "2428649141d964f0", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-2d36259531f168f1", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/index.ts:38"}, "properties": {"repobilityId": "867f5b4f120dafeb", "scanner": "scanner-primary", "fingerprint": "2d36259531f168f1", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-7062d68b5d984c02", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/server/static.test.ts:23"}, "properties": {"repobilityId": "530fcc2b34d4a499", "scanner": "scanner-primary", "fingerprint": "7062d68b5d984c02", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-9710c8d059e53154", "level": "none", "message": {"text": "No frontend routes/components detected"}, "properties": {"repobilityId": "44ca61485762e494", "scanner": "scanner-primary", "fingerprint": "9710c8d059e53154", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["coverage"]}}, {"ruleId": "scanner-10a2236be120f27f", "level": "error", "message": {"text": "Insecure pattern 'exec_used' in src/hooks/executor.ts:48"}, "properties": {"repobilityId": "60fa2fd75bd4124e", "scanner": "scanner-primary", "fingerprint": "10a2236be120f27f", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["owasp", "exec_used"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/hooks/executor.ts"}, "region": {"startLine": 48}}}]}, {"ruleId": "scanner-61e33bb24ab7b25d", "level": "warning", "message": {"text": "Insecure pattern 'node_child_process' in src/hooks/executor.ts:1"}, "properties": {"repobilityId": "81916ba2803ffb3f", "scanner": "scanner-primary", "fingerprint": "61e33bb24ab7b25d", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "node_child_process"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/hooks/executor.ts"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-65ad1dc1cd498500", "level": "warning", "message": {"text": "Insecure pattern 'node_child_process' in src/secrets/backend.ts:1"}, "properties": {"repobilityId": "6f1aed04396b584c", "scanner": "scanner-primary", "fingerprint": "65ad1dc1cd498500", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "node_child_process"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/secrets/backend.ts"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-6799d7da33d50a16", "level": "error", "message": {"text": "Insecure pattern 'exec_used' in src/store/run-store.ts:55"}, "properties": {"repobilityId": "283efe1eca402cee", "scanner": "scanner-primary", "fingerprint": "6799d7da33d50a16", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["owasp", "exec_used"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/store/run-store.ts"}, "region": {"startLine": 55}}}]}, {"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-ea8f3013f588db25", "level": "note", "message": {"text": "Shallow git history limits provenance confidence"}, "properties": {"repobilityId": "ee5252ecdb6129da", "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": "dca899bf7104b2af", "scanner": "scanner-primary", "fingerprint": "8424db9c75e04ba4", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["provenance", "git-history", "generated-repo-pattern"]}}, {"ruleId": "scanner-419d6e54dff69b4b", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 web/src/api.ts:15"}, "properties": {"repobilityId": "55d245243b200a9d", "scanner": "scanner-primary", "fingerprint": "419d6e54dff69b4b", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-27343820f92651d7", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/registry/registry.ts:41"}, "properties": {"repobilityId": "aa003abd048ab5fe", "scanner": "scanner-primary", "fingerprint": "27343820f92651d7", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-903574da3765d007", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/server/http.test.ts:32"}, "properties": {"repobilityId": "2f11bdd324ece826", "scanner": "scanner-primary", "fingerprint": "903574da3765d007", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-2e512d740d0ee184", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/server/secrets-api.test.ts:75"}, "properties": {"repobilityId": "7a927c58c46ce014", "scanner": "scanner-primary", "fingerprint": "2e512d740d0ee184", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-0b1fc93ca9e08d48", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/server/sse.test.ts:60"}, "properties": {"repobilityId": "d41de6da59a58a09", "scanner": "scanner-primary", "fingerprint": "0b1fc93ca9e08d48", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-84d64e685c8f7f10", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/server/runs-api.test.ts:56"}, "properties": {"repobilityId": "de36126a7b852812", "scanner": "scanner-primary", "fingerprint": "84d64e685c8f7f10", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-e01542d8e2670fc9", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/server/static.test.ts:37"}, "properties": {"repobilityId": "4ffb4e66a28f6ad3", "scanner": "scanner-primary", "fingerprint": "e01542d8e2670fc9", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-81e8589347f3c4e6", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/server/registry-api.test.ts:74"}, "properties": {"repobilityId": "545a60702c382bd3", "scanner": "scanner-primary", "fingerprint": "81e8589347f3c4e6", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-030b95cf15bbf032", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/server/skills-api.test.ts:38"}, "properties": {"repobilityId": "e51a1404b9792d34", "scanner": "scanner-primary", "fingerprint": "030b95cf15bbf032", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-12a491906f21d96b", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/server/hooks-api.test.ts:47"}, "properties": {"repobilityId": "f36a2425df71abb6", "scanner": "scanner-primary", "fingerprint": "12a491906f21d96b", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}]}]}