{"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-bead75b0f9233e05", "name": "No API endpoints detected", "shortDescription": {"text": "No API endpoints detected"}, "fullDescription": {"text": "The scanner did not find FastAPI/Flask/Express/NestJS/GraphQL/gRPC routes. If this repo exposes APIs, the framework may be unsupported."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "info", "confidence": 1.0}}, {"id": "scanner-eda3947a197791a7", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/settings/gcal-settings.tsx:375", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/settings/gcal-settings.tsx:375"}, "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-1a9d403880526314", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/today/today-timeline.tsx:110", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/today/today-timeline.tsx:110"}, "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-9d90560266723b7b", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/tasks/task-chip-button.tsx:40", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/tasks/task-chip-button.tsx:40"}, "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-20f6b2340b2a7db3", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/tasks/task-detail-panel.tsx:494", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/tasks/task-detail-panel.tsx:494"}, "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-522a659dfc6ab41e", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/history/day-detail-panel.tsx:128", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/history/day-detail-panel.tsx:128"}, "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-579fae24f56e3880", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/history/week-detail-panel.tsx:186", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/history/week-detail-panel.tsx:186"}, "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-e13f7857be652249", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/inbox/trash-view.tsx:139", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/inbox/trash-view.tsx:139"}, "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-e23349c28989025c", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/inbox/metric-tile.tsx:34", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/inbox/metric-tile.tsx:34"}, "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-b9ab70751a2ec865", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/inbox/pending-view.tsx:119", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/inbox/pending-view.tsx:119"}, "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-b23298ab3f277894", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/calendar/week-view.tsx:283", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/calendar/week-view.tsx:283"}, "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-df7fb47288f553b7", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/today/page.tsx:570", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/today/page.tsx:570"}, "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-1e8a13465c62ff53", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/inbox/page.tsx:987", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/inbox/page.tsx:987"}, "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-166dff3c3df6a10e", "name": "ORM models found but no DB engine detected", "shortDescription": {"text": "ORM models found but no DB engine detected"}, "fullDescription": {"text": "The repo defines tables/models but no DB connection string was found. Likely lives in env vars or a config file the scanner didn't read."}, "properties": {"scanner": "scanner-primary", "layer": "data", "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-6893a6c8b0861585", "name": "Very low test-to-source ratio", "shortDescription": {"text": "Very low test-to-source ratio"}, "fullDescription": {"text": "1 test file(s) for 133 source file(s) (ratio 0.01). 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 23 placeholder/mock markers across 15 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-b9088664ace7f748", "name": "Composite production-readiness gap", "shortDescription": {"text": "Composite production-readiness gap"}, "fullDescription": {"text": "Multiple low-cost hardening controls are missing together: license, ci. Opus verification showed these co-occurring gaps are a better readiness signal than reading each flag in isolation."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-749d4bc1bd66df5f", "name": "Agent instructions exist but release-hardening basics are missing", "shortDescription": {"text": "Agent instructions exist but release-hardening basics are missing"}, "fullDescription": {"text": "AI-coder instruction files were found, but the repo is missing license, 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-809894f4a505475e", "name": "Commented-code block (5 lines) in src/components/layout/realtime-bridge.tsx:6", "shortDescription": {"text": "Commented-code block (5 lines) in src/components/layout/realtime-bridge.tsx:6"}, "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-005b8815b8cb61ab", "name": "Commented-code block (6 lines) in src/components/dashboard/event-month-grid.tsx:187", "shortDescription": {"text": "Commented-code block (6 lines) in src/components/dashboard/event-month-grid.tsx:187"}, "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-4e17e9a66139039f", "name": "Commented-code block (5 lines) in src/components/tasks/task-branch.tsx:226", "shortDescription": {"text": "Commented-code block (5 lines) in src/components/tasks/task-branch.tsx:226"}, "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-9e059bf20c9ac53b", "name": "Commented-code block (5 lines) in src/app/layout.tsx:20", "shortDescription": {"text": "Commented-code block (5 lines) in src/app/layout.tsx:20"}, "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-56664cf7c031cf65", "name": "Commented-code block (9 lines) in src/app/api/jira/webhook/route.ts:6", "shortDescription": {"text": "Commented-code block (9 lines) in src/app/api/jira/webhook/route.ts:6"}, "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-96c727161d989555", "name": "Commented-code block (5 lines) in src/app/api/notion/sync/route.ts:284", "shortDescription": {"text": "Commented-code block (5 lines) in src/app/api/notion/sync/route.ts:284"}, "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-71f1c722a890d142", "name": "Commented-code block (5 lines) in src/app/api/tasks/[id]/purge/route.ts:4", "shortDescription": {"text": "Commented-code block (5 lines) in src/app/api/tasks/[id]/purge/route.ts:4"}, "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-cd0005d2e135d1fb", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/api/gcal/token/route.ts:34", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/api/gcal/token/route.ts:34"}, "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-cb9bb2fe21a14f6b", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/api/gcal/oauth/callback/route.ts:27", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/api/gcal/oauth/callback/route.ts:27"}, "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-aea552bd48cc34b7", "name": "Commented-code block (6 lines) in src/app/api/slack/webhook/route.ts:74", "shortDescription": {"text": "Commented-code block (6 lines) in src/app/api/slack/webhook/route.ts:74"}, "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-18095f5837b51a81", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/api/slack/webhook/route.ts:249", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/api/slack/webhook/route.ts:249"}, "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-1aecb3c1237e21cc", "name": "Commented-code block (5 lines) in src/lib/gcal-events.ts:220", "shortDescription": {"text": "Commented-code block (5 lines) in src/lib/gcal-events.ts:220"}, "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-6a22979984365526", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/gcal-events.ts:60", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/gcal-events.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-d193919b38f307c2", "name": "Commented-code block (9 lines) in src/lib/jira-api.ts:43", "shortDescription": {"text": "Commented-code block (9 lines) in src/lib/jira-api.ts:43"}, "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-b7920000b07ecefa", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/gcal-api.ts:60", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/gcal-api.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}}]}}, "automationDetails": {"id": "repobility/19532"}, "properties": {"repository": "sholivelee-hello/wid", "repoUrl": "https://github.com/sholivelee-hello/wid", "branch": "main"}, "results": [{"ruleId": "scanner-bead75b0f9233e05", "level": "none", "message": {"text": "No API endpoints detected"}, "properties": {"repobilityId": "0f8bb852027c38f8", "scanner": "scanner-primary", "fingerprint": "bead75b0f9233e05", "layer": "api", "severity": "info", "confidence": 1.0, "tags": ["coverage"]}}, {"ruleId": "scanner-eda3947a197791a7", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/settings/gcal-settings.tsx:375"}, "properties": {"repobilityId": "88bd2c54efb6aaaa", "scanner": "scanner-primary", "fingerprint": "eda3947a197791a7", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-1a9d403880526314", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/today/today-timeline.tsx:110"}, "properties": {"repobilityId": "b7a7231d667a5048", "scanner": "scanner-primary", "fingerprint": "1a9d403880526314", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-9d90560266723b7b", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/tasks/task-chip-button.tsx:40"}, "properties": {"repobilityId": "43e8f9aca33caed9", "scanner": "scanner-primary", "fingerprint": "9d90560266723b7b", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-20f6b2340b2a7db3", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/tasks/task-detail-panel.tsx:494"}, "properties": {"repobilityId": "93f469a16e1f0797", "scanner": "scanner-primary", "fingerprint": "20f6b2340b2a7db3", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-522a659dfc6ab41e", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/history/day-detail-panel.tsx:128"}, "properties": {"repobilityId": "11133c41b19ef04c", "scanner": "scanner-primary", "fingerprint": "522a659dfc6ab41e", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-579fae24f56e3880", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/history/week-detail-panel.tsx:186"}, "properties": {"repobilityId": "b44741ef8f8940c3", "scanner": "scanner-primary", "fingerprint": "579fae24f56e3880", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-e13f7857be652249", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/inbox/trash-view.tsx:139"}, "properties": {"repobilityId": "eb867b6c847ec84e", "scanner": "scanner-primary", "fingerprint": "e13f7857be652249", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-e23349c28989025c", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/inbox/metric-tile.tsx:34"}, "properties": {"repobilityId": "6eb1751a2062d95c", "scanner": "scanner-primary", "fingerprint": "e23349c28989025c", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-b9ab70751a2ec865", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/inbox/pending-view.tsx:119"}, "properties": {"repobilityId": "1a1fa302f54e887d", "scanner": "scanner-primary", "fingerprint": "b9ab70751a2ec865", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-b23298ab3f277894", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/calendar/week-view.tsx:283"}, "properties": {"repobilityId": "52b264a7c3409ab4", "scanner": "scanner-primary", "fingerprint": "b23298ab3f277894", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-df7fb47288f553b7", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/today/page.tsx:570"}, "properties": {"repobilityId": "5c97a0bb5cb95c3a", "scanner": "scanner-primary", "fingerprint": "df7fb47288f553b7", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-1e8a13465c62ff53", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/inbox/page.tsx:987"}, "properties": {"repobilityId": "8e5cb3d3dcd49eaa", "scanner": "scanner-primary", "fingerprint": "1e8a13465c62ff53", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-166dff3c3df6a10e", "level": "warning", "message": {"text": "ORM models found but no DB engine detected"}, "properties": {"repobilityId": "cda36de65e114635", "scanner": "scanner-primary", "fingerprint": "166dff3c3df6a10e", "layer": "data", "severity": "medium", "confidence": 1.0, "tags": ["coverage"]}}, {"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-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": "048564e4059b6a7a", "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": "18984a6ece0263d1", "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": "487a5e9da4a13cb4", "scanner": "scanner-primary", "fingerprint": "2d0c7b7ab8f8aacf", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["placeholder", "mock-data", "critical-flow", "generated-repo-pattern"]}}, {"ruleId": "scanner-b9088664ace7f748", "level": "note", "message": {"text": "Composite production-readiness gap"}, "properties": {"repobilityId": "511fc95ca075ae2f", "scanner": "scanner-primary", "fingerprint": "b9088664ace7f748", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["production-readiness", "repo-hardening", "generated-repo-pattern"]}}, {"ruleId": "scanner-749d4bc1bd66df5f", "level": "warning", "message": {"text": "Agent instructions exist but release-hardening basics are missing"}, "properties": {"repobilityId": "71066d874c3c4f3d", "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": "d4bebd7019389859", "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": "59777e4f3d305292", "scanner": "scanner-primary", "fingerprint": "8424db9c75e04ba4", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["provenance", "git-history", "generated-repo-pattern"]}}, {"ruleId": "scanner-809894f4a505475e", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/components/layout/realtime-bridge.tsx:6"}, "properties": {"repobilityId": "dcbef65263de6719", "scanner": "scanner-primary", "fingerprint": "809894f4a505475e", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-005b8815b8cb61ab", "level": "none", "message": {"text": "Commented-code block (6 lines) in src/components/dashboard/event-month-grid.tsx:187"}, "properties": {"repobilityId": "bc06c55ace80f7fa", "scanner": "scanner-primary", "fingerprint": "005b8815b8cb61ab", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-4e17e9a66139039f", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/components/tasks/task-branch.tsx:226"}, "properties": {"repobilityId": "34d51cbf6ff1bc5a", "scanner": "scanner-primary", "fingerprint": "4e17e9a66139039f", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-9e059bf20c9ac53b", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/app/layout.tsx:20"}, "properties": {"repobilityId": "290eeb8115bb1748", "scanner": "scanner-primary", "fingerprint": "9e059bf20c9ac53b", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-56664cf7c031cf65", "level": "none", "message": {"text": "Commented-code block (9 lines) in src/app/api/jira/webhook/route.ts:6"}, "properties": {"repobilityId": "074fdc3492c60fbe", "scanner": "scanner-primary", "fingerprint": "56664cf7c031cf65", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-96c727161d989555", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/app/api/notion/sync/route.ts:284"}, "properties": {"repobilityId": "1ab7c4878a05e8c6", "scanner": "scanner-primary", "fingerprint": "96c727161d989555", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-71f1c722a890d142", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/app/api/tasks/[id]/purge/route.ts:4"}, "properties": {"repobilityId": "23d7f6e9839fa4a0", "scanner": "scanner-primary", "fingerprint": "71f1c722a890d142", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-cd0005d2e135d1fb", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/api/gcal/token/route.ts:34"}, "properties": {"repobilityId": "606f94fda93c33f9", "scanner": "scanner-primary", "fingerprint": "cd0005d2e135d1fb", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-cb9bb2fe21a14f6b", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/api/gcal/oauth/callback/route.ts:27"}, "properties": {"repobilityId": "59f3737a23d493e5", "scanner": "scanner-primary", "fingerprint": "cb9bb2fe21a14f6b", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-aea552bd48cc34b7", "level": "none", "message": {"text": "Commented-code block (6 lines) in src/app/api/slack/webhook/route.ts:74"}, "properties": {"repobilityId": "42ffa55578f7566e", "scanner": "scanner-primary", "fingerprint": "aea552bd48cc34b7", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-18095f5837b51a81", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/api/slack/webhook/route.ts:249"}, "properties": {"repobilityId": "dbf136372a5103c0", "scanner": "scanner-primary", "fingerprint": "18095f5837b51a81", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-1aecb3c1237e21cc", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/lib/gcal-events.ts:220"}, "properties": {"repobilityId": "25353af4be6cd8ae", "scanner": "scanner-primary", "fingerprint": "1aecb3c1237e21cc", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-6a22979984365526", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/gcal-events.ts:60"}, "properties": {"repobilityId": "ad4c5ed2b747a6f3", "scanner": "scanner-primary", "fingerprint": "6a22979984365526", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-d193919b38f307c2", "level": "none", "message": {"text": "Commented-code block (9 lines) in src/lib/jira-api.ts:43"}, "properties": {"repobilityId": "11b27e1b2d24afa5", "scanner": "scanner-primary", "fingerprint": "d193919b38f307c2", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-b7920000b07ecefa", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/gcal-api.ts:60"}, "properties": {"repobilityId": "0b3f9b0e9b8701b6", "scanner": "scanner-primary", "fingerprint": "b7920000b07ecefa", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}]}]}