{"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-020411b92e9293af", "name": "TODO/FIXME marker in shipping code \u2014 apps/dashboard/app/(app)/layout.tsx:104", "shortDescription": {"text": "TODO/FIXME marker in shipping code \u2014 apps/dashboard/app/(app)/layout.tsx:104"}, "fullDescription": {"text": "Track in /reviews or /issues, not as a code comment that rots.\n\nWhy: Drift control \u2014 shouldn't be the same as Quality TODO scanner.\nRule id: fq.todo-marker"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-778e197f0b252508", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/dashboard/app/(app)/settings/sections/team-section.tsx:137", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/dashboard/app/(app)/settings/sections/team-section.tsx:137"}, "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-f67b913a5927c9a3", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/dashboard/app/(app)/viewings/viewings-workspace.tsx:844", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/dashboard/app/(app)/viewings/viewings-workspace.tsx:844"}, "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-213a4a6f1c52ce29", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/dashboard/app/(app)/overview/overview-workspace.tsx:441", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/dashboard/app/(app)/overview/overview-workspace.tsx:441"}, "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-96a1006ca3ad6a13", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/dashboard/app/(app)/approvals/inbox-workspace.tsx:703", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/dashboard/app/(app)/approvals/inbox-workspace.tsx:703"}, "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-02619589e81486b1", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/dashboard/components/shell/sidebar.tsx:70", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/dashboard/components/shell/sidebar.tsx:70"}, "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-83afcc0ff049ceab", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/dashboard/components/shell/topbar.tsx:104", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/dashboard/components/shell/topbar.tsx:104"}, "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-4c663d000eea29d0", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/dashboard/components/shell/account-chip.tsx:72", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/dashboard/components/shell/account-chip.tsx:72"}, "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-892343e9afa3dc22", "name": "TODO/FIXME marker in shipping code \u2014 apps/dashboard/lib/auth/initials.ts:4", "shortDescription": {"text": "TODO/FIXME marker in shipping code \u2014 apps/dashboard/lib/auth/initials.ts:4"}, "fullDescription": {"text": "Track in /reviews or /issues, not as a code comment that rots.\n\nWhy: Drift control \u2014 shouldn't be the same as Quality TODO scanner.\nRule id: fq.todo-marker"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-27924aa79fa4a517", "name": "GitHub Action is tag-pinned rather than SHA-pinned", "shortDescription": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "fullDescription": {"text": "actions/checkout@v4 can move without a code change in this repo. Pin third-party actions to a reviewed 40-character commit SHA."}, "properties": {"scanner": "scanner-primary", "layer": "cicd", "severity": "low", "confidence": 1.0}}, {"id": "scanner-030fece1c10b738d", "name": "Very large file: apps/dashboard/app/(app)/studio/studio-tabs.tsx (1555 lines)", "shortDescription": {"text": "Very large file: apps/dashboard/app/(app)/studio/studio-tabs.tsx (1555 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-c35f0907a24cc335", "name": "Very large file: apps/dashboard/app/(app)/approvals/inbox-workspace.tsx (1863 lines)", "shortDescription": {"text": "Very large file: apps/dashboard/app/(app)/approvals/inbox-workspace.tsx (1863 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": "2 test file(s) for 143 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-ec82f9367de34433", "name": "Node manifest has dependencies but no lockfile: apps/dashboard/package.json", "shortDescription": {"text": "Node manifest has dependencies but no lockfile: apps/dashboard/package.json"}, "fullDescription": {"text": "`package.json` declares dependencies, but no same-directory npm/pnpm/yarn/bun lockfile was found. Generated projects without lockfiles are less reproducible and harder to secure-scan precisely."}, "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 57 placeholder/mock markers across 21 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, lockfile. 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-93bf84e5ca1068c4", "name": "Legacy-named symbol `ad_copy` in packages/db/schema/enums.ts:41", "shortDescription": {"text": "Legacy-named symbol `ad_copy` in packages/db/schema/enums.ts:41"}, "fullDescription": {"text": "Names with suffixes like `_old`, `_v1`, `_deprecated` usually indicate replaced-but-not-removed code (typical AI-coder leftover). Confirm and delete, or rename if it's the active version."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-66286cb20bab3eb2", "name": "Commented-code block (5 lines) in apps/dashboard/next.config.ts:7", "shortDescription": {"text": "Commented-code block (5 lines) in apps/dashboard/next.config.ts:7"}, "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-38abf197723ab265", "name": "Commented-code block (6 lines) in apps/dashboard/app/layout.tsx:47", "shortDescription": {"text": "Commented-code block (6 lines) in apps/dashboard/app/layout.tsx:47"}, "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-f5c9f64ca826d53a", "name": "Commented-code block (7 lines) in apps/dashboard/app/(app)/layout.tsx:91", "shortDescription": {"text": "Commented-code block (7 lines) in apps/dashboard/app/(app)/layout.tsx:91"}, "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-702a56a1025e9252", "name": "Commented-code block (8 lines) in apps/dashboard/app/(app)/settings/preferences-form.tsx:37", "shortDescription": {"text": "Commented-code block (8 lines) in apps/dashboard/app/(app)/settings/preferences-form.tsx:37"}, "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-4daeca50dda1a68c", "name": "Commented-code block (6 lines) in apps/dashboard/components/ui/empty-state.tsx:3", "shortDescription": {"text": "Commented-code block (6 lines) in apps/dashboard/components/ui/empty-state.tsx:3"}, "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-648d64bc4348c4b8", "name": "Commented-code block (6 lines) in apps/dashboard/components/ui/preview-banner.tsx:1", "shortDescription": {"text": "Commented-code block (6 lines) in apps/dashboard/components/ui/preview-banner.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-7666b19ca98b4b0b", "name": "Commented-code block (5 lines) in apps/dashboard/lib/auth/context.ts:106", "shortDescription": {"text": "Commented-code block (5 lines) in apps/dashboard/lib/auth/context.ts:106"}, "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-e5e273b409f6db1d", "name": "Commented-code block (6 lines) in apps/dashboard/lib/auth/initials.ts:3", "shortDescription": {"text": "Commented-code block (6 lines) in apps/dashboard/lib/auth/initials.ts:3"}, "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-918e8ceae92265c8", "name": "Commented-code block (6 lines) in apps/api/src/index.ts:92", "shortDescription": {"text": "Commented-code block (6 lines) in apps/api/src/index.ts:92"}, "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-2cd1a5c149228cfd", "name": "Commented-code block (6 lines) in apps/api/src/middleware/agency-context.ts:67", "shortDescription": {"text": "Commented-code block (6 lines) in apps/api/src/middleware/agency-context.ts:67"}, "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-a415d084c46fbc9c", "name": "Commented-code block (7 lines) in apps/api/src/routes/settings.ts:58", "shortDescription": {"text": "Commented-code block (7 lines) in apps/api/src/routes/settings.ts:58"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-f7439d0cf8596af9", "name": "Commented-code block (5 lines) in apps/api/src/routes/studio-wizard.ts:248", "shortDescription": {"text": "Commented-code block (5 lines) in apps/api/src/routes/studio-wizard.ts:248"}, "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-31c1fa0fcbad5945", "name": "Commented-code block (5 lines) in apps/api/src/routes/admin/agencies.ts:112", "shortDescription": {"text": "Commented-code block (5 lines) in apps/api/src/routes/admin/agencies.ts:112"}, "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/24007"}, "properties": {"repository": "AIVENA-spain/aivena", "repoUrl": "https://github.com/AIVENA-spain/aivena", "branch": "main"}, "results": [{"ruleId": "scanner-020411b92e9293af", "level": "none", "message": {"text": "TODO/FIXME marker in shipping code \u2014 apps/dashboard/app/(app)/layout.tsx:104"}, "properties": {"repobilityId": "fd7ff15eda5a6d28", "scanner": "scanner-primary", "fingerprint": "020411b92e9293af", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.todo-marker"]}}, {"ruleId": "scanner-778e197f0b252508", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/dashboard/app/(app)/settings/sections/team-section.tsx:137"}, "properties": {"repobilityId": "353f3cda9814f51b", "scanner": "scanner-primary", "fingerprint": "778e197f0b252508", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-f67b913a5927c9a3", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/dashboard/app/(app)/viewings/viewings-workspace.tsx:844"}, "properties": {"repobilityId": "4c82d6f7fc39358d", "scanner": "scanner-primary", "fingerprint": "f67b913a5927c9a3", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-213a4a6f1c52ce29", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/dashboard/app/(app)/overview/overview-workspace.tsx:441"}, "properties": {"repobilityId": "6d2e8fe37f4a2ae0", "scanner": "scanner-primary", "fingerprint": "213a4a6f1c52ce29", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-96a1006ca3ad6a13", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/dashboard/app/(app)/approvals/inbox-workspace.tsx:703"}, "properties": {"repobilityId": "e90836396d64fece", "scanner": "scanner-primary", "fingerprint": "96a1006ca3ad6a13", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-02619589e81486b1", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/dashboard/components/shell/sidebar.tsx:70"}, "properties": {"repobilityId": "c030f78557efb9ec", "scanner": "scanner-primary", "fingerprint": "02619589e81486b1", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-83afcc0ff049ceab", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/dashboard/components/shell/topbar.tsx:104"}, "properties": {"repobilityId": "481a0c9cda48c81a", "scanner": "scanner-primary", "fingerprint": "83afcc0ff049ceab", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-4c663d000eea29d0", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/dashboard/components/shell/account-chip.tsx:72"}, "properties": {"repobilityId": "2fa9019d19860ca6", "scanner": "scanner-primary", "fingerprint": "4c663d000eea29d0", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-892343e9afa3dc22", "level": "none", "message": {"text": "TODO/FIXME marker in shipping code \u2014 apps/dashboard/lib/auth/initials.ts:4"}, "properties": {"repobilityId": "7d1c1d7335791be8", "scanner": "scanner-primary", "fingerprint": "892343e9afa3dc22", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.todo-marker"]}}, {"ruleId": "scanner-27924aa79fa4a517", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "ae16880318b99912", "scanner": "scanner-primary", "fingerprint": "27924aa79fa4a517", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/ci.yml"}, "region": {"startLine": 56}}}]}, {"ruleId": "scanner-27924aa79fa4a517", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "989a74409a402368", "scanner": "scanner-primary", "fingerprint": "27924aa79fa4a517", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/ci.yml"}, "region": {"startLine": 59}}}]}, {"ruleId": "scanner-030fece1c10b738d", "level": "note", "message": {"text": "Very large file: apps/dashboard/app/(app)/studio/studio-tabs.tsx (1555 lines)"}, "properties": {"repobilityId": "e1a2dcef3a8d7561", "scanner": "scanner-primary", "fingerprint": "030fece1c10b738d", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-c35f0907a24cc335", "level": "note", "message": {"text": "Very large file: apps/dashboard/app/(app)/approvals/inbox-workspace.tsx (1863 lines)"}, "properties": {"repobilityId": "e5be194caf79b61e", "scanner": "scanner-primary", "fingerprint": "c35f0907a24cc335", "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": "347646c30e199780", "scanner": "scanner-primary", "fingerprint": "141b30a41e03817b", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["license", "repo-hardening", "generated-repo-pattern"]}}, {"ruleId": "scanner-ec82f9367de34433", "level": "note", "message": {"text": "Node manifest has dependencies but no lockfile: apps/dashboard/package.json"}, "properties": {"repobilityId": "4cf5ff15e81d6746", "scanner": "scanner-primary", "fingerprint": "ec82f9367de34433", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["dependency", "lockfile", "reproducibility", "generated-repo-pattern"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "apps/dashboard/package.json"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-72b2a6250083a784", "level": "warning", "message": {"text": "Placeholder or mock-heavy implementation detected"}, "properties": {"repobilityId": "33bc9131cea47538", "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": "247c5e043587656f", "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": "934a80ad124c8a7a", "scanner": "scanner-primary", "fingerprint": "b9088664ace7f748", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["production-readiness", "repo-hardening", "generated-repo-pattern"]}}, {"ruleId": "scanner-93bf84e5ca1068c4", "level": "note", "message": {"text": "Legacy-named symbol `ad_copy` in packages/db/schema/enums.ts:41"}, "properties": {"repobilityId": "e3888125d8a8ee8e", "scanner": "scanner-primary", "fingerprint": "93bf84e5ca1068c4", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-66286cb20bab3eb2", "level": "none", "message": {"text": "Commented-code block (5 lines) in apps/dashboard/next.config.ts:7"}, "properties": {"repobilityId": "f73fed1a249287f4", "scanner": "scanner-primary", "fingerprint": "66286cb20bab3eb2", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-38abf197723ab265", "level": "none", "message": {"text": "Commented-code block (6 lines) in apps/dashboard/app/layout.tsx:47"}, "properties": {"repobilityId": "89c5fe070c13011b", "scanner": "scanner-primary", "fingerprint": "38abf197723ab265", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-f5c9f64ca826d53a", "level": "none", "message": {"text": "Commented-code block (7 lines) in apps/dashboard/app/(app)/layout.tsx:91"}, "properties": {"repobilityId": "feca78c7f0a661c4", "scanner": "scanner-primary", "fingerprint": "f5c9f64ca826d53a", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-702a56a1025e9252", "level": "none", "message": {"text": "Commented-code block (8 lines) in apps/dashboard/app/(app)/settings/preferences-form.tsx:37"}, "properties": {"repobilityId": "69ebca374263daae", "scanner": "scanner-primary", "fingerprint": "702a56a1025e9252", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-4daeca50dda1a68c", "level": "none", "message": {"text": "Commented-code block (6 lines) in apps/dashboard/components/ui/empty-state.tsx:3"}, "properties": {"repobilityId": "c63a196d70004d10", "scanner": "scanner-primary", "fingerprint": "4daeca50dda1a68c", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-648d64bc4348c4b8", "level": "none", "message": {"text": "Commented-code block (6 lines) in apps/dashboard/components/ui/preview-banner.tsx:1"}, "properties": {"repobilityId": "9a100f189f9c4752", "scanner": "scanner-primary", "fingerprint": "648d64bc4348c4b8", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-7666b19ca98b4b0b", "level": "none", "message": {"text": "Commented-code block (5 lines) in apps/dashboard/lib/auth/context.ts:106"}, "properties": {"repobilityId": "a88f51b77b7295a9", "scanner": "scanner-primary", "fingerprint": "7666b19ca98b4b0b", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-e5e273b409f6db1d", "level": "none", "message": {"text": "Commented-code block (6 lines) in apps/dashboard/lib/auth/initials.ts:3"}, "properties": {"repobilityId": "d184cf41ed8c576a", "scanner": "scanner-primary", "fingerprint": "e5e273b409f6db1d", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-918e8ceae92265c8", "level": "none", "message": {"text": "Commented-code block (6 lines) in apps/api/src/index.ts:92"}, "properties": {"repobilityId": "6c1f0f001b209cdc", "scanner": "scanner-primary", "fingerprint": "918e8ceae92265c8", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-2cd1a5c149228cfd", "level": "none", "message": {"text": "Commented-code block (6 lines) in apps/api/src/middleware/agency-context.ts:67"}, "properties": {"repobilityId": "0b9c76b9af7036be", "scanner": "scanner-primary", "fingerprint": "2cd1a5c149228cfd", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-a415d084c46fbc9c", "level": "none", "message": {"text": "Commented-code block (7 lines) in apps/api/src/routes/settings.ts:58"}, "properties": {"repobilityId": "d9c1c3dc737922d6", "scanner": "scanner-primary", "fingerprint": "a415d084c46fbc9c", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-f7439d0cf8596af9", "level": "none", "message": {"text": "Commented-code block (5 lines) in apps/api/src/routes/studio-wizard.ts:248"}, "properties": {"repobilityId": "123f2081870b7a47", "scanner": "scanner-primary", "fingerprint": "f7439d0cf8596af9", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-31c1fa0fcbad5945", "level": "none", "message": {"text": "Commented-code block (5 lines) in apps/api/src/routes/admin/agencies.ts:112"}, "properties": {"repobilityId": "b07305c4e80e4d28", "scanner": "scanner-primary", "fingerprint": "31c1fa0fcbad5945", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}]}]}