{"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-b0be63b6fa55b622", "name": "Stray `console.log` in TS/JS \u2014 scripts/src/seed-attendance-demo.ts:68", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/src/seed-attendance-demo.ts:68"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-dd446cf1f7942ae6", "name": "Stray `console.log` in TS/JS \u2014 scripts/src/hello.ts:1", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/src/hello.ts:1"}, "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-06cd3a21cbafb2ef", "name": "Stray `console.log` in TS/JS \u2014 scripts/src/seed-fb-inbox.ts:114", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/src/seed-fb-inbox.ts:114"}, "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-ae502e197d3b3d24", "name": "Stray `console.log` in TS/JS \u2014 lib/object-storage-web/src/use-upload.ts:35", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 lib/object-storage-web/src/use-upload.ts:35"}, "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-2427540219b0cf41", "name": "Stray `console.log` in TS/JS \u2014 lib/db/src/seed.ts:10", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 lib/db/src/seed.ts:10"}, "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-15e23468dfa74e7b", "name": "Stray `console.log` in TS/JS \u2014 lib/db/src/seed-customers.ts:5", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 lib/db/src/seed-customers.ts:5"}, "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-69a4417e8ca064b0", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 artifacts/mockup-sandbox/src/components/ui/chart.tsx:78", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 artifacts/mockup-sandbox/src/components/ui/chart.tsx:78"}, "fullDescription": {"text": "Open XSS surface unless the input is provably trusted. Replace with explicit JSX or sanitize via a vetted library.\n\nWhy: OWASP basics. Already partially flagged by the security analyzer.\nRule id: fq.dangerous-html"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-d2afd186ffa7dba2", "name": "Stray `console.log` in TS/JS \u2014 artifacts/api-server/scripts/test-claude-sale.ts:117", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 artifacts/api-server/scripts/test-claude-sale.ts:117"}, "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-9af9fa32844fe218", "name": "Stray `console.log` in TS/JS \u2014 artifacts/api-server/src/migrations.ts:820", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 artifacts/api-server/src/migrations.ts:820"}, "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-dd74648e42a342ea", "name": "Stray `console.log` in TS/JS \u2014 artifacts/api-server/src/follow-up-scheduler.ts:98", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 artifacts/api-server/src/follow-up-scheduler.ts:98"}, "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-e5db528cd20e0503", "name": "Stray `console.log` in TS/JS \u2014 artifacts/api-server/src/test-follow-up-scheduler.ts:72", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 artifacts/api-server/src/test-follow-up-scheduler.ts:72"}, "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-d1f43301c907bb5f", "name": "Stray `console.log` in TS/JS \u2014 artifacts/api-server/src/lib/autopost-schema.ts:109", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 artifacts/api-server/src/lib/autopost-schema.ts:109"}, "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-a50ebbc6d1a0d82c", "name": "Stray `console.log` in TS/JS \u2014 artifacts/api-server/src/lib/sale-context.ts:125", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 artifacts/api-server/src/lib/sale-context.ts:125"}, "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-39a4dd613832b849", "name": "Stray `console.log` in TS/JS \u2014 artifacts/api-server/src/lib/ai-orchestrator.ts:249", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 artifacts/api-server/src/lib/ai-orchestrator.ts:249"}, "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-6fa3759e19c9a5dd", "name": "Stray `console.log` in TS/JS \u2014 artifacts/api-server/src/routes/auth.ts:22", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 artifacts/api-server/src/routes/auth.ts:22"}, "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-1cc4968826b141eb", "name": "Stray `console.log` in TS/JS \u2014 artifacts/api-server/src/routes/ai-test.ts:480", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 artifacts/api-server/src/routes/ai-test.ts:480"}, "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-066612bc1f2f58cb", "name": "Stray `console.log` in TS/JS \u2014 artifacts/api-server/src/routes/ai-scripts.ts:225", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 artifacts/api-server/src/routes/ai-scripts.ts:225"}, "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-43d724368fe7a590", "name": "Stray `console.log` in TS/JS \u2014 artifacts/api-server/src/routes/web-push.ts:16", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 artifacts/api-server/src/routes/web-push.ts:16"}, "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-fc13201646bd88a2", "name": "Stray `console.log` in TS/JS \u2014 artifacts/api-server/src/routes/wedding-cards.ts:151", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 artifacts/api-server/src/routes/wedding-cards.ts:151"}, "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-f8228dd5101ee6fd", "name": "Stray `console.log` in TS/JS \u2014 artifacts/api-server/src/routes/ai-engine.ts:511", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 artifacts/api-server/src/routes/ai-engine.ts:511"}, "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-e5665d0f0654f009", "name": "Stray `console.log` in TS/JS \u2014 artifacts/api-server/src/routes/pricing.ts:366", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 artifacts/api-server/src/routes/pricing.ts:366"}, "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-621ae47ee16b6560", "name": "Stray `console.log` in TS/JS \u2014 artifacts/api-server/src/routes/cms.ts:185", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 artifacts/api-server/src/routes/cms.ts:185"}, "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-e2d650b3c85f7e01", "name": "Stray `console.log` in TS/JS \u2014 artifacts/api-server/src/routes/fb-inbox.ts:161", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 artifacts/api-server/src/routes/fb-inbox.ts:161"}, "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-30ab77c725550b11", "name": "Stray `console.log` in TS/JS \u2014 artifacts/api-server/src/routes/webhook-facebook.ts:61", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 artifacts/api-server/src/routes/webhook-facebook.ts:61"}, "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-4cbff9a0fb2c02b9", "name": "`truncate` class without `title=` for hover reveal \u2014 artifacts/amazing-studio/src/components/public-ai-advisor.tsx:431", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 artifacts/amazing-studio/src/components/public-ai-advisor.tsx:431"}, "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-2cdedd3b2a994275", "name": "`truncate` class without `title=` for hover reveal \u2014 artifacts/amazing-studio/src/components/UploadQueueIndicator.tsx:44", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 artifacts/amazing-studio/src/components/UploadQueueIndicator.tsx:44"}, "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-5d75d83e1e357e10", "name": "`truncate` class without `title=` for hover reveal \u2014 artifacts/amazing-studio/src/components/outfit-booking-section.tsx:", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 artifacts/amazing-studio/src/components/outfit-booking-section.tsx:577"}, "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-bff3723a9655246a", "name": "`truncate` class without `title=` for hover reveal \u2014 artifacts/amazing-studio/src/components/staff-assignment-editor.tsx", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 artifacts/amazing-studio/src/components/staff-assignment-editor.tsx:425"}, "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-60c65c1982de65d5", "name": "`truncate` class without `title=` for hover reveal \u2014 artifacts/amazing-studio/src/components/layout.tsx:236", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 artifacts/amazing-studio/src/components/layout.tsx:236"}, "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-a284394b10b0f295", "name": "`truncate` class without `title=` for hover reveal \u2014 artifacts/amazing-studio/src/components/cms-shared.tsx:146", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 artifacts/amazing-studio/src/components/cms-shared.tsx:146"}, "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-31d3b2ac66e5ef5d", "name": "`truncate` class without `title=` for hover reveal \u2014 artifacts/amazing-studio/src/components/SmartSearch.tsx:123", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 artifacts/amazing-studio/src/components/SmartSearch.tsx:123"}, "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-eba1903dd1192151", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 artifacts/amazing-studio/src/components/ui/chart.tsx:79", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 artifacts/amazing-studio/src/components/ui/chart.tsx:79"}, "fullDescription": {"text": "Open XSS surface unless the input is provably trusted. Replace with explicit JSX or sanitize via a vetted library.\n\nWhy: OWASP basics. Already partially flagged by the security analyzer.\nRule id: fq.dangerous-html"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-cdc21ab88a56daea", "name": "\"active\" state uses light bg in a dark theme \u2014 artifacts/amazing-studio/src/components/public/PublicHero.tsx:139", "shortDescription": {"text": "\"active\" state uses light bg in a dark theme \u2014 artifacts/amazing-studio/src/components/public/PublicHero.tsx:139"}, "fullDescription": {"text": "A ternary like `active ? 'bg-white' : '...'` (or bg-gray-100/200) on a dark theme produces jarring white pills. Use a dark-emphasized active state instead \u2014 border + ring or slightly brighter dark bg. Example: `active ? 'bg-gray-800 border-gray-500 ring-1 ring-blue-500/30' : '\u2026'`.\n\nWhy: P-E in CHECKLIST.md \u2014 light bg in a dark theme is a class of regression.\nRule id: fq.active-light-bg"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-c8a9d4a93ba01dcd", "name": "Stray `console.log` in TS/JS \u2014 artifacts/amazing-studio/src/lib/push-notifications.ts:14", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 artifacts/amazing-studio/src/lib/push-notifications.ts:14"}, "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-9c1169039a8d51e6", "name": "`truncate` class without `title=` for hover reveal \u2014 artifacts/amazing-studio/src/pages/tasks.tsx:767", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 artifacts/amazing-studio/src/pages/tasks.tsx:767"}, "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-d321280e4c3eeef8", "name": "`truncate` class without `title=` for hover reveal \u2014 artifacts/amazing-studio/src/pages/settings.tsx:242", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 artifacts/amazing-studio/src/pages/settings.tsx:242"}, "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-0673bde7546f36cf", "name": "`truncate` class without `title=` for hover reveal \u2014 artifacts/amazing-studio/src/pages/claude-sale-reengage.tsx:120", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 artifacts/amazing-studio/src/pages/claude-sale-reengage.tsx:120"}, "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-ca1bb253a34b5ff1", "name": "`truncate` class without `title=` for hover reveal \u2014 artifacts/amazing-studio/src/pages/calendar.tsx:550", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 artifacts/amazing-studio/src/pages/calendar.tsx:550"}, "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-b4b945bab677f0c4", "name": "Stray `console.log` in TS/JS \u2014 artifacts/amazing-studio/src/pages/calendar.tsx:5503", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 artifacts/amazing-studio/src/pages/calendar.tsx:5503"}, "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-1b9235023a35a1b6", "name": "`truncate` class without `title=` for hover reveal \u2014 artifacts/amazing-studio/src/pages/services.tsx:253", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 artifacts/amazing-studio/src/pages/services.tsx:253"}, "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-8ec51606fe7466de", "name": "`truncate` class without `title=` for hover reveal \u2014 artifacts/amazing-studio/src/pages/claude-sale-monitor.tsx:151", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 artifacts/amazing-studio/src/pages/claude-sale-monitor.tsx:151"}, "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-7d5d078f7ccae53d", "name": "`truncate` class without `title=` for hover reveal \u2014 artifacts/amazing-studio/src/pages/payments.tsx:296", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 artifacts/amazing-studio/src/pages/payments.tsx:296"}, "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-351ff2ab9f1324d2", "name": "`truncate` class without `title=` for hover reveal \u2014 artifacts/amazing-studio/src/pages/claude-sale-test.tsx:150", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 artifacts/amazing-studio/src/pages/claude-sale-test.tsx:150"}, "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-17e2b6f1539f55d8", "name": "`truncate` class without `title=` for hover reveal \u2014 artifacts/amazing-studio/src/pages/photoshop-jobs.tsx:494", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 artifacts/amazing-studio/src/pages/photoshop-jobs.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-34064e7a1fd9af63", "name": "`truncate` class without `title=` for hover reveal \u2014 artifacts/amazing-studio/src/pages/facebook-inbox-ai.tsx:285", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 artifacts/amazing-studio/src/pages/facebook-inbox-ai.tsx:285"}, "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-29d43217192732b4", "name": "`truncate` class without `title=` for hover reveal \u2014 artifacts/amazing-studio/src/pages/bookings.tsx:363", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 artifacts/amazing-studio/src/pages/bookings.tsx:363"}, "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-1561e5902f438564", "name": "`truncate` class without `title=` for hover reveal \u2014 artifacts/amazing-studio/src/pages/my-profile.tsx:281", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 artifacts/amazing-studio/src/pages/my-profile.tsx:281"}, "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-d4f0b9a4464d9b7c", "name": "`truncate` class without `title=` for hover reveal \u2014 artifacts/amazing-studio/src/pages/dashboard.tsx:652", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 artifacts/amazing-studio/src/pages/dashboard.tsx:652"}, "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-909e3ff962dfff1c", "name": "Stray `console.log` in TS/JS \u2014 artifacts/amazing-studio/src/pages/service-detail.tsx:45", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 artifacts/amazing-studio/src/pages/service-detail.tsx:45"}, "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-23fe5c6441648201", "name": "`truncate` class without `title=` for hover reveal \u2014 artifacts/amazing-studio/src/pages/internal-comms.tsx:257", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 artifacts/amazing-studio/src/pages/internal-comms.tsx:257"}, "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-3bd041ad23c35237", "name": "`truncate` class without `title=` for hover reveal \u2014 artifacts/amazing-studio/src/pages/pricing.tsx:510", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 artifacts/amazing-studio/src/pages/pricing.tsx:510"}, "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-cdedfaa1eb6586ea", "name": "`truncate` class without `title=` for hover reveal \u2014 artifacts/amazing-studio/src/pages/staff.tsx:176", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 artifacts/amazing-studio/src/pages/staff.tsx:176"}, "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-991da6a55caaefb5", "name": "`truncate` class without `title=` for hover reveal \u2014 artifacts/amazing-studio/src/pages/quotes.tsx:573", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 artifacts/amazing-studio/src/pages/quotes.tsx:573"}, "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-22748b44abd4c543", "name": "`truncate` class without `title=` for hover reveal \u2014 artifacts/amazing-studio/src/pages/crm-leads.tsx:361", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 artifacts/amazing-studio/src/pages/crm-leads.tsx:361"}, "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-9aaf995bc0e05ece", "name": "`truncate` class without `title=` for hover reveal \u2014 artifacts/amazing-studio/src/pages/attendance.tsx:1001", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 artifacts/amazing-studio/src/pages/attendance.tsx:1001"}, "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-d7fa7e02bcab7dc1", "name": "`truncate` class without `title=` for hover reveal \u2014 artifacts/amazing-studio/src/pages/ai-test-room.tsx:881", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 artifacts/amazing-studio/src/pages/ai-test-room.tsx:881"}, "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-7cce97a3c365b26f", "name": "Stray `console.log` in TS/JS \u2014 artifacts/amazing-studio/src/pages/ai-test-room.tsx:405", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 artifacts/amazing-studio/src/pages/ai-test-room.tsx:405"}, "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-7299ff384b2ee157", "name": "`truncate` class without `title=` for hover reveal \u2014 artifacts/amazing-studio/src/pages/staff-profile.tsx:844", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 artifacts/amazing-studio/src/pages/staff-profile.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-81078a4f1ea08750", "name": "`truncate` class without `title=` for hover reveal \u2014 artifacts/amazing-studio/src/pages/dresses.tsx:303", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 artifacts/amazing-studio/src/pages/dresses.tsx:303"}, "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-35e061f6a95f950a", "name": "`truncate` class without `title=` for hover reveal \u2014 artifacts/amazing-studio/src/pages/sale-learning.tsx:170", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 artifacts/amazing-studio/src/pages/sale-learning.tsx:170"}, "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-b9816e8cc58ec6b2", "name": "`truncate` class without `title=` for hover reveal \u2014 artifacts/amazing-studio/src/pages/expenses.tsx:593", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 artifacts/amazing-studio/src/pages/expenses.tsx:593"}, "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-29ca05f1c7e40756", "name": "`truncate` class without `title=` for hover reveal \u2014 artifacts/amazing-studio/src/pages/customers.tsx:430", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 artifacts/amazing-studio/src/pages/customers.tsx:430"}, "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-41876394fbc193e0", "name": "`truncate` class without `title=` for hover reveal \u2014 artifacts/amazing-studio/src/pages/cms/pricing-public.tsx:110", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 artifacts/amazing-studio/src/pages/cms/pricing-public.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-1bb8353614f03e4d", "name": "`truncate` class without `title=` for hover reveal \u2014 artifacts/amazing-studio/src/pages/cms/trash.tsx:161", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 artifacts/amazing-studio/src/pages/cms/trash.tsx:161"}, "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-3f4bb78bfc0f4045", "name": "`truncate` class without `title=` for hover reveal \u2014 artifacts/amazing-studio/src/pages/cms/products-rental.tsx:206", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 artifacts/amazing-studio/src/pages/cms/products-rental.tsx:206"}, "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-be20b5f01f762ba3", "name": "`truncate` class without `title=` for hover reveal \u2014 artifacts/amazing-studio/src/pages/cms/photo-ideas.tsx:274", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 artifacts/amazing-studio/src/pages/cms/photo-ideas.tsx:274"}, "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-d6ab9a9e86dc63f1", "name": "`truncate` class without `title=` for hover reveal \u2014 artifacts/amazing-studio/src/pages/cms/categories.tsx:435", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 artifacts/amazing-studio/src/pages/cms/categories.tsx:435"}, "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-8b56044e0de86777", "name": "`truncate` class without `title=` for hover reveal \u2014 artifacts/amazing-studio/src/pages/cms/gallery.tsx:109", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 artifacts/amazing-studio/src/pages/cms/gallery.tsx:109"}, "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-f6b27706062da827", "name": "`truncate` class without `title=` for hover reveal \u2014 artifacts/amazing-studio/src/pages/cms/rental-public.tsx:107", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 artifacts/amazing-studio/src/pages/cms/rental-public.tsx:107"}, "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-2243b14e52ec8513", "name": "`truncate` class without `title=` for hover reveal \u2014 artifacts/amazing-studio/src/pages/public/gallery-detail.tsx:224", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 artifacts/amazing-studio/src/pages/public/gallery-detail.tsx:224"}, "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-14331958323e071f", "name": "`truncate` class without `title=` for hover reveal \u2014 artifacts/amazing-studio/src/pages/public/contact.tsx:144", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 artifacts/amazing-studio/src/pages/public/contact.tsx:144"}, "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-abd6377e45fd2bfd", "name": "`truncate` class without `title=` for hover reveal \u2014 artifacts/amazing-studio/src/pages/public/wedding-cards-create.tsx:", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 artifacts/amazing-studio/src/pages/public/wedding-cards-create.tsx:243"}, "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-3867b248564ebfaa", "name": "`truncate` class without `title=` for hover reveal \u2014 artifacts/amazing-studio/src/pages/public/rental-detail.tsx:281", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 artifacts/amazing-studio/src/pages/public/rental-detail.tsx:281"}, "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-e8dd3bf42ace0bc2", "name": "`truncate` class without `title=` for hover reveal \u2014 artifacts/amazing-studio/src/pages/public/rental-public.tsx:1029", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 artifacts/amazing-studio/src/pages/public/rental-public.tsx:1029"}, "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-db1f92d77cbc6d1d", "name": "Insecure pattern 'node_child_process' in run_all.cjs:3", "shortDescription": {"text": "Insecure pattern 'node_child_process' in run_all.cjs:3"}, "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-3745f6da5336d09a", "name": "Insecure pattern 'dangerous_innerhtml' in artifacts/mockup-sandbox/src/components/ui/chart.tsx:78", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in artifacts/mockup-sandbox/src/components/ui/chart.tsx:78"}, "fullDescription": {"text": "Found a known-risky pattern (dangerous_innerhtml). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-6fc5ff5f21852ce1", "name": "Insecure pattern 'cors_wildcard' in artifacts/api-server/src/app.ts:34", "shortDescription": {"text": "Insecure pattern 'cors_wildcard' in artifacts/api-server/src/app.ts:34"}, "fullDescription": {"text": "Found a known-risky pattern (cors_wildcard). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-11c396b26a1a985e", "name": "Insecure pattern 'direct_innerhtml_assignment' in artifacts/api-server/src/routes/contracts.ts:284", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in artifacts/api-server/src/routes/contracts.ts:284"}, "fullDescription": {"text": "Found a known-risky pattern (direct_innerhtml_assignment). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-3d0adea29eb3927c", "name": "Insecure pattern 'dangerous_innerhtml' in artifacts/amazing-studio/src/components/ui/chart.tsx:79", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in artifacts/amazing-studio/src/components/ui/chart.tsx:79"}, "fullDescription": {"text": "Found a known-risky pattern (dangerous_innerhtml). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-018cd81f784cd402", "name": "Insecure pattern 'document_write' in artifacts/amazing-studio/src/pages/calendar.tsx:3311", "shortDescription": {"text": "Insecure pattern 'document_write' in artifacts/amazing-studio/src/pages/calendar.tsx:3311"}, "fullDescription": {"text": "Found a known-risky pattern (document_write). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "low", "confidence": 1.0}}, {"id": "scanner-decb0429fc6e63f2", "name": "Insecure pattern 'direct_innerhtml_assignment' in artifacts/amazing-studio/src/pages/calendar.tsx:2612", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in artifacts/amazing-studio/src/pages/calendar.tsx:2612"}, "fullDescription": {"text": "Found a known-risky pattern (direct_innerhtml_assignment). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-35f9a62df710fdff", "name": "Insecure pattern 'document_write' in artifacts/amazing-studio/src/pages/contracts.tsx:207", "shortDescription": {"text": "Insecure pattern 'document_write' in artifacts/amazing-studio/src/pages/contracts.tsx:207"}, "fullDescription": {"text": "Found a known-risky pattern (document_write). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "low", "confidence": 1.0}}, {"id": "scanner-64c72fd2bfb60d3a", "name": "Insecure pattern 'document_write' in artifacts/amazing-studio/src/pages/ai-test-room.tsx:755", "shortDescription": {"text": "Insecure pattern 'document_write' in artifacts/amazing-studio/src/pages/ai-test-room.tsx:755"}, "fullDescription": {"text": "Found a known-risky pattern (document_write). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "low", "confidence": 1.0}}, {"id": "scanner-994128a3ddea15df", "name": "Insecure pattern 'document_write' in artifacts/amazing-studio/src/pages/cms/categories.tsx:1640", "shortDescription": {"text": "Insecure pattern 'document_write' in artifacts/amazing-studio/src/pages/cms/categories.tsx:1640"}, "fullDescription": {"text": "Found a known-risky pattern (document_write). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "low", "confidence": 1.0}}, {"id": "scanner-cb639d9a10a47b23", "name": "package.json defines install-time lifecycle scripts", "shortDescription": {"text": "package.json defines install-time lifecycle scripts"}, "fullDescription": {"text": "preinstall/install/postinstall/prepare scripts execute during dependency installation. Review them carefully for network calls, obfuscation, shell execution, or credential access."}, "properties": {"scanner": "scanner-primary", "layer": "cicd", "severity": "low", "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-2ea3c4faec3d60e0", "name": "Very large file: lib/api-client-react/src/generated/api.ts (3826 lines)", "shortDescription": {"text": "Very large file: lib/api-client-react/src/generated/api.ts (3826 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-c68949fa48d75d33", "name": "Very large file: artifacts/api-server/src/migrations.ts (1096 lines)", "shortDescription": {"text": "Very large file: artifacts/api-server/src/migrations.ts (1096 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-9fdb96e95381ca9d", "name": "Very large file: artifacts/api-server/src/routes/ai-engine.ts (1298 lines)", "shortDescription": {"text": "Very large file: artifacts/api-server/src/routes/ai-engine.ts (1298 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-130799b5567b3272", "name": "Very large file: artifacts/api-server/src/routes/bookings.ts (1588 lines)", "shortDescription": {"text": "Very large file: artifacts/api-server/src/routes/bookings.ts (1588 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-f2f6fbaa4fc23915", "name": "Very large file: artifacts/api-server/src/routes/attendance.ts (2180 lines)", "shortDescription": {"text": "Very large file: artifacts/api-server/src/routes/attendance.ts (2180 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-932782b0ba97b704", "name": "Very large file: artifacts/api-server/src/routes/pricing.ts (1233 lines)", "shortDescription": {"text": "Very large file: artifacts/api-server/src/routes/pricing.ts (1233 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-95de1ca011ffb425", "name": "Very large file: artifacts/api-server/src/routes/photoshop-jobs.ts (1673 lines)", "shortDescription": {"text": "Very large file: artifacts/api-server/src/routes/photoshop-jobs.ts (1673 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-202e088d81c03910", "name": "Very large file: artifacts/api-server/src/routes/cms.ts (1868 lines)", "shortDescription": {"text": "Very large file: artifacts/api-server/src/routes/cms.ts (1868 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-9cdca55f8d0d5e79", "name": "Very large file: artifacts/api-server/src/routes/fb-inbox.ts (1680 lines)", "shortDescription": {"text": "Very large file: artifacts/api-server/src/routes/fb-inbox.ts (1680 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-2415f6f4dbb4b531", "name": "Very large file: artifacts/amazing-studio/src/pages/calendar.tsx (6893 lines)", "shortDescription": {"text": "Very large file: artifacts/amazing-studio/src/pages/calendar.tsx (6893 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-01a4e6a292ceacc3", "name": "Very large file: artifacts/amazing-studio/src/pages/payments.tsx (2789 lines)", "shortDescription": {"text": "Very large file: artifacts/amazing-studio/src/pages/payments.tsx (2789 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-e965a0b7cd7e44a7", "name": "Very large file: artifacts/amazing-studio/src/pages/photoshop-jobs.tsx (1999 lines)", "shortDescription": {"text": "Very large file: artifacts/amazing-studio/src/pages/photoshop-jobs.tsx (1999 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-69fd4be22b5e2e0f", "name": "Very large file: artifacts/amazing-studio/src/pages/facebook-inbox-ai.tsx (1306 lines)", "shortDescription": {"text": "Very large file: artifacts/amazing-studio/src/pages/facebook-inbox-ai.tsx (1306 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-4191f8ebde650f5a", "name": "Very large file: artifacts/amazing-studio/src/pages/bookings.tsx (1619 lines)", "shortDescription": {"text": "Very large file: artifacts/amazing-studio/src/pages/bookings.tsx (1619 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-093c4265ae5f5cc3", "name": "Very large file: artifacts/amazing-studio/src/pages/pricing.tsx (1726 lines)", "shortDescription": {"text": "Very large file: artifacts/amazing-studio/src/pages/pricing.tsx (1726 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-7ea374c61905aa5a", "name": "Very large file: artifacts/amazing-studio/src/pages/staff.tsx (1832 lines)", "shortDescription": {"text": "Very large file: artifacts/amazing-studio/src/pages/staff.tsx (1832 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-295449ac8223f27a", "name": "Very large file: artifacts/amazing-studio/src/pages/attendance.tsx (4780 lines)", "shortDescription": {"text": "Very large file: artifacts/amazing-studio/src/pages/attendance.tsx (4780 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-83141295b6288435", "name": "Very large file: artifacts/amazing-studio/src/pages/revenue.tsx (1215 lines)", "shortDescription": {"text": "Very large file: artifacts/amazing-studio/src/pages/revenue.tsx (1215 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-ceb8286587cfe4ae", "name": "Very large file: artifacts/amazing-studio/src/pages/ai-test-room.tsx (1512 lines)", "shortDescription": {"text": "Very large file: artifacts/amazing-studio/src/pages/ai-test-room.tsx (1512 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-879e3ef585171ea2", "name": "Very large file: artifacts/amazing-studio/src/pages/staff-profile.tsx (2157 lines)", "shortDescription": {"text": "Very large file: artifacts/amazing-studio/src/pages/staff-profile.tsx (2157 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-621e85f93f819a89", "name": "Very large file: artifacts/amazing-studio/src/pages/ai-sale-scripts.tsx (2107 lines)", "shortDescription": {"text": "Very large file: artifacts/amazing-studio/src/pages/ai-sale-scripts.tsx (2107 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-fc8d3374dfbb3db4", "name": "Very large file: artifacts/amazing-studio/src/pages/expenses.tsx (1170 lines)", "shortDescription": {"text": "Very large file: artifacts/amazing-studio/src/pages/expenses.tsx (1170 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-9a8b74621713b20f", "name": "Very large file: artifacts/amazing-studio/src/pages/cms/products-rental.tsx (1667 lines)", "shortDescription": {"text": "Very large file: artifacts/amazing-studio/src/pages/cms/products-rental.tsx (1667 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-03c7828032a4dec7", "name": "Very large file: artifacts/amazing-studio/src/pages/cms/photo-ideas.tsx (1031 lines)", "shortDescription": {"text": "Very large file: artifacts/amazing-studio/src/pages/cms/photo-ideas.tsx (1031 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-72dd18eec9836a21", "name": "Very large file: artifacts/amazing-studio/src/pages/cms/categories.tsx (2723 lines)", "shortDescription": {"text": "Very large file: artifacts/amazing-studio/src/pages/cms/categories.tsx (2723 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-37b7cc81e1d0b762", "name": "Very large file: artifacts/amazing-studio/src/pages/cms/gallery.tsx (1131 lines)", "shortDescription": {"text": "Very large file: artifacts/amazing-studio/src/pages/cms/gallery.tsx (1131 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": "26 test file(s) for 517 source file(s) (ratio 0.05). 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-faccb9061e9b52a0", "name": "No README detected", "shortDescription": {"text": "No README detected"}, "fullDescription": {"text": "No README file was found. Generated repos without README context are hard to operate, validate, or safely hand off."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-3036d70d2146842b", "name": "Node manifest has dependencies but no lockfile: scripts/package.json", "shortDescription": {"text": "Node manifest has dependencies but no lockfile: scripts/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-2848c575b2bac51a", "name": "Node manifest has dependencies but no lockfile: lib/object-storage-web/package.json", "shortDescription": {"text": "Node manifest has dependencies but no lockfile: lib/object-storage-web/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-3b9817ac318b5825", "name": "Node manifest has dependencies but no lockfile: lib/api-spec/package.json", "shortDescription": {"text": "Node manifest has dependencies but no lockfile: lib/api-spec/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-e17d020eb983b802", "name": "Node manifest has dependencies but no lockfile: lib/db/package.json", "shortDescription": {"text": "Node manifest has dependencies but no lockfile: lib/db/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-328a71053c42b16a", "name": "Node manifest has dependencies but no lockfile: lib/api-zod/package.json", "shortDescription": {"text": "Node manifest has dependencies but no lockfile: lib/api-zod/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-ea221e303761338d", "name": "Node manifest has dependencies but no lockfile: lib/api-client-react/package.json", "shortDescription": {"text": "Node manifest has dependencies but no lockfile: lib/api-client-react/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-c5e31b7c75792a1d", "name": "Node manifest has dependencies but no lockfile: artifacts/mockup-sandbox/package.json", "shortDescription": {"text": "Node manifest has dependencies but no lockfile: artifacts/mockup-sandbox/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-a5f90eaf6e067813", "name": "Node manifest has dependencies but no lockfile: artifacts/api-server/package.json", "shortDescription": {"text": "Node manifest has dependencies but no lockfile: artifacts/api-server/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-29d117820b074bc4", "name": "Node manifest has dependencies but no lockfile: artifacts/amazing-studio/package.json", "shortDescription": {"text": "Node manifest has dependencies but no lockfile: artifacts/amazing-studio/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-3ab5d313dda8e5f9", "name": "Debug logging residue appears in source files", "shortDescription": {"text": "Debug logging residue appears in source files"}, "fullDescription": {"text": "Found 145 console/debugger/print-style debug statements in non-test source. This is a common fast-generation residue before production cleanup."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-72b2a6250083a784", "name": "Placeholder or mock-heavy implementation detected", "shortDescription": {"text": "Placeholder or mock-heavy implementation detected"}, "fullDescription": {"text": "Found 359 placeholder/mock markers across 79 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-9d79c4077342a7d0", "name": "Runtime service client appears to use placeholder configuration", "shortDescription": {"text": "Runtime service client appears to use placeholder configuration"}, "fullDescription": {"text": "A runtime source file appears to wire Supabase/Firebase/AI/payment-style clients to placeholder URLs, keys, or fallback values. In the Fable corpus this often means the UI/API shape is present while the backend service is not actually configured."}, "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, operator-readme, 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": "medium", "confidence": 1.0}}, {"id": "scanner-749d4bc1bd66df5f", "name": "Agent instructions exist but release-hardening basics are missing", "shortDescription": {"text": "Agent instructions exist but release-hardening basics are missing"}, "fullDescription": {"text": "AI-coder instruction files were found, but the repo is missing license, ci, operator-readme, lockfile. 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-ec2b2369f71cfa9e", "name": "`fetch()` without try/.catch or AbortSignal \u2014 lib/object-storage-web/src/use-upload.ts:88", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 lib/object-storage-web/src/use-upload.ts:88"}, "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-524c376cc3dd962a", "name": "Commented-code block (6 lines) in lib/db/src/schema/staff_payroll.ts:51", "shortDescription": {"text": "Commented-code block (6 lines) in lib/db/src/schema/staff_payroll.ts:51"}, "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-fb6a17e772119586", "name": "Commented-code block (6 lines) in lib/api-client-react/src/custom-fetch.ts:111", "shortDescription": {"text": "Commented-code block (6 lines) in lib/api-client-react/src/custom-fetch.ts:111"}, "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-5fa66e8884152aab", "name": "`fetch()` without try/.catch or AbortSignal \u2014 lib/api-client-react/src/custom-fetch.ts:360", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 lib/api-client-react/src/custom-fetch.ts:360"}, "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-04fd30fb82b62459", "name": "Commented-code block (5 lines) in artifacts/api-server/build.mjs:25", "shortDescription": {"text": "Commented-code block (5 lines) in artifacts/api-server/build.mjs:25"}, "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-ed5c70bd221581e3", "name": "Commented-code block (10 lines) in artifacts/api-server/scripts/check-duplicate-functions.mjs:37", "shortDescription": {"text": "Commented-code block (10 lines) in artifacts/api-server/scripts/check-duplicate-functions.mjs: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-1bfb8bd71f989024", "name": "Legacy-named symbol `requires_post_production_seeded_v1` in artifacts/api-server/src/migrations.ts:613", "shortDescription": {"text": "Legacy-named symbol `requires_post_production_seeded_v1` in artifacts/api-server/src/migrations.ts:613"}, "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-fc2d072b00b5f21d", "name": "Commented-code block (5 lines) in artifacts/api-server/src/migrations.ts:693", "shortDescription": {"text": "Commented-code block (5 lines) in artifacts/api-server/src/migrations.ts:693"}, "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-965a36871c566a98", "name": "Commented-code block (6 lines) in artifacts/api-server/src/follow-up-scheduler.ts:207", "shortDescription": {"text": "Commented-code block (6 lines) in artifacts/api-server/src/follow-up-scheduler.ts:207"}, "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-5a01d7c02b45c1b4", "name": "Commented-code block (10 lines) in artifacts/api-server/src/lib/overtime.ts:1", "shortDescription": {"text": "Commented-code block (10 lines) in artifacts/api-server/src/lib/overtime.ts: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-e9d4a034ddb16169", "name": "Commented-code block (6 lines) in artifacts/api-server/src/lib/objectAcl.ts:7", "shortDescription": {"text": "Commented-code block (6 lines) in artifacts/api-server/src/lib/objectAcl.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-af7bf7c4c39c4276", "name": "Commented-code block (6 lines) in artifacts/api-server/src/routes/revenue.ts:1", "shortDescription": {"text": "Commented-code block (6 lines) in artifacts/api-server/src/routes/revenue.ts: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-de29ec08db5a8059", "name": "`fetch()` without try/.catch or AbortSignal \u2014 artifacts/api-server/src/routes/revenue.integration.test.ts:112", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 artifacts/api-server/src/routes/revenue.integration.test.ts:112"}, "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-974320f4131f13b1", "name": "Commented-code block (8 lines) in artifacts/api-server/src/routes/storage.ts:170", "shortDescription": {"text": "Commented-code block (8 lines) in artifacts/api-server/src/routes/storage.ts:170"}, "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-e236fe843a41ce25", "name": "Commented-code block (9 lines) in artifacts/api-server/src/routes/notifications.ts:374", "shortDescription": {"text": "Commented-code block (9 lines) in artifacts/api-server/src/routes/notifications.ts:374"}, "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-b4e5c76f5c9a5511", "name": "Commented-code block (6 lines) in artifacts/api-server/src/routes/ai-engine.ts:752", "shortDescription": {"text": "Commented-code block (6 lines) in artifacts/api-server/src/routes/ai-engine.ts:752"}, "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-997d766476b06a3a", "name": "`fetch()` without try/.catch or AbortSignal \u2014 artifacts/api-server/src/routes/ai-engine.ts:674", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 artifacts/api-server/src/routes/ai-engine.ts:674"}, "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-dea152a9e4d046ae", "name": "Commented-code block (5 lines) in artifacts/api-server/src/routes/bookings.ts:963", "shortDescription": {"text": "Commented-code block (5 lines) in artifacts/api-server/src/routes/bookings.ts:963"}, "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-f5cda65360beb4f8", "name": "Commented-code block (5 lines) in artifacts/api-server/src/routes/attendance.ts:277", "shortDescription": {"text": "Commented-code block (5 lines) in artifacts/api-server/src/routes/attendance.ts:277"}, "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-16cfdbe54781d9a2", "name": "Commented-code block (5 lines) in artifacts/api-server/src/routes/golden-hour.ts:5", "shortDescription": {"text": "Commented-code block (5 lines) in artifacts/api-server/src/routes/golden-hour.ts:5"}, "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-210ebc5051354a02", "name": "Legacy-named symbol `exOld` in artifacts/api-server/src/routes/pricing.ts:614", "shortDescription": {"text": "Legacy-named symbol `exOld` in artifacts/api-server/src/routes/pricing.ts:614"}, "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-3229e2fcee9e3bcf", "name": "Commented-code block (9 lines) in artifacts/api-server/src/routes/photoshop-jobs.ts:212", "shortDescription": {"text": "Commented-code block (9 lines) in artifacts/api-server/src/routes/photoshop-jobs.ts:212"}, "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-7b6408ac5e05affa", "name": "Commented-code block (5 lines) in artifacts/api-server/src/routes/payments.ts:315", "shortDescription": {"text": "Commented-code block (5 lines) in artifacts/api-server/src/routes/payments.ts:315"}, "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-6acb3f37f4e47010", "name": "Commented-code block (5 lines) in artifacts/api-server/src/routes/cms.ts:599", "shortDescription": {"text": "Commented-code block (5 lines) in artifacts/api-server/src/routes/cms.ts:599"}, "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-5691a8629ee727cf", "name": "`fetch()` without try/.catch or AbortSignal \u2014 artifacts/api-server/src/routes/fb-inbox.ts:194", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 artifacts/api-server/src/routes/fb-inbox.ts:194"}, "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-a8d2081d7f50ad65", "name": "Commented-code block (6 lines) in artifacts/api-server/src/routes/staff-commissions.ts:9", "shortDescription": {"text": "Commented-code block (6 lines) in artifacts/api-server/src/routes/staff-commissions.ts:9"}, "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-c355971bffab93cf", "name": "Commented-code block (6 lines) in artifacts/api-server/src/routes/revenue/monthly.ts:96", "shortDescription": {"text": "Commented-code block (6 lines) in artifacts/api-server/src/routes/revenue/monthly.ts:96"}, "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-b5eb370b74a132da", "name": "Legacy-named symbol `amazingStudioToken_v2` in artifacts/amazing-studio/src/App.tsx:72", "shortDescription": {"text": "Legacy-named symbol `amazingStudioToken_v2` in artifacts/amazing-studio/src/App.tsx:72"}, "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-a7d67ff5c76b4431", "name": "Legacy-named symbol `amazingPhotoIdeasToken_v1` in artifacts/amazing-studio/src/components/public-ai-advisor.tsx:72", "shortDescription": {"text": "Legacy-named symbol `amazingPhotoIdeasToken_v1` in artifacts/amazing-studio/src/components/public-ai-advisor.tsx:72"}, "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-18586ac9dd998d7e", "name": "`fetch()` without try/.catch or AbortSignal \u2014 artifacts/amazing-studio/src/components/public-ai-advisor.tsx:194", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 artifacts/amazing-studio/src/components/public-ai-advisor.tsx:194"}, "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-e11aefbf6f18179d", "name": "Legacy-named symbol `amazingStudioToken_v2` in artifacts/amazing-studio/src/components/outfit-booking-section.tsx:92", "shortDescription": {"text": "Legacy-named symbol `amazingStudioToken_v2` in artifacts/amazing-studio/src/components/outfit-booking-section.tsx:92"}, "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-2e647537adf4d681", "name": "Legacy-named symbol `amazingStudioToken_v2` in artifacts/amazing-studio/src/components/staff-assignment-editor.tsx:18", "shortDescription": {"text": "Legacy-named symbol `amazingStudioToken_v2` in artifacts/amazing-studio/src/components/staff-assignment-editor.tsx:18"}, "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-405a6f74adee8128", "name": "`fetch()` without try/.catch or AbortSignal \u2014 artifacts/amazing-studio/src/components/staff-assignment-editor.tsx:19", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 artifacts/amazing-studio/src/components/staff-assignment-editor.tsx:19"}, "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-c1965f6dd5ee2030", "name": "Legacy-named symbol `amazingStudioToken_v2` in artifacts/amazing-studio/src/components/layout.tsx:116", "shortDescription": {"text": "Legacy-named symbol `amazingStudioToken_v2` in artifacts/amazing-studio/src/components/layout.tsx:116"}, "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-36aeb465bbde93ec", "name": "Commented-code block (5 lines) in artifacts/amazing-studio/src/components/layout.tsx:61", "shortDescription": {"text": "Commented-code block (5 lines) in artifacts/amazing-studio/src/components/layout.tsx:61"}, "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-34d7d757687347d4", "name": "`fetch()` without try/.catch or AbortSignal \u2014 artifacts/amazing-studio/src/components/layout.tsx:117", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 artifacts/amazing-studio/src/components/layout.tsx:117"}, "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-7c3dd74b112f5dd9", "name": "Legacy-named symbol `amazingStudioToken_v2` in artifacts/amazing-studio/src/components/StaffSalaryPanel.tsx:18", "shortDescription": {"text": "Legacy-named symbol `amazingStudioToken_v2` in artifacts/amazing-studio/src/components/StaffSalaryPanel.tsx:18"}, "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-24eab2794161f0ea", "name": "`fetch()` without try/.catch or AbortSignal \u2014 artifacts/amazing-studio/src/components/StaffSalaryPanel.tsx:22", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 artifacts/amazing-studio/src/components/StaffSalaryPanel.tsx:22"}, "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-97360ca73b0b189d", "name": "Legacy-named symbol `amazingStudioToken_v2` in artifacts/amazing-studio/src/components/cms-shared.tsx:12", "shortDescription": {"text": "Legacy-named symbol `amazingStudioToken_v2` in artifacts/amazing-studio/src/components/cms-shared.tsx:12"}, "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-1e812e45bf43a5e0", "name": "`fetch()` without try/.catch or AbortSignal \u2014 artifacts/amazing-studio/src/components/SmartSearch.tsx:57", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 artifacts/amazing-studio/src/components/SmartSearch.tsx:57"}, "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-4f078c0cb595d3d6", "name": "Legacy-named symbol `amazingStudioToken_v2` in artifacts/amazing-studio/src/components/golden-hour-admin.tsx:7", "shortDescription": {"text": "Legacy-named symbol `amazingStudioToken_v2` in artifacts/amazing-studio/src/components/golden-hour-admin.tsx:7"}, "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-70c19f83ad082eb1", "name": "Legacy-named symbol `amazingStudioToken_v2` in artifacts/amazing-studio/src/contexts/StaffAuthContext.tsx:50", "shortDescription": {"text": "Legacy-named symbol `amazingStudioToken_v2` in artifacts/amazing-studio/src/contexts/StaffAuthContext.tsx:50"}, "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-225a034f6462b57b", "name": "`fetch()` without try/.catch or AbortSignal \u2014 artifacts/amazing-studio/src/contexts/StaffAuthContext.tsx:82", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 artifacts/amazing-studio/src/contexts/StaffAuthContext.tsx:82"}, "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-f0d67a78d42a9906", "name": "Legacy-named symbol `amazingStudioToken_v2` in artifacts/amazing-studio/src/lib/image-upload.ts:6", "shortDescription": {"text": "Legacy-named symbol `amazingStudioToken_v2` in artifacts/amazing-studio/src/lib/image-upload.ts:6"}, "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-2b950c2c9bd97dec", "name": "`fetch()` without try/.catch or AbortSignal \u2014 artifacts/amazing-studio/src/lib/image-upload.ts:53", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 artifacts/amazing-studio/src/lib/image-upload.ts:53"}, "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-c7cb5304f0b0f01e", "name": "Legacy-named symbol `amazingStudioPublicPreview_v1` in artifacts/amazing-studio/src/lib/public-site-url.ts:9", "shortDescription": {"text": "Legacy-named symbol `amazingStudioPublicPreview_v1` in artifacts/amazing-studio/src/lib/public-site-url.ts:9"}, "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-149176a50dbb5981", "name": "`fetch()` without try/.catch or AbortSignal \u2014 artifacts/amazing-studio/src/lib/api-base.ts:2", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 artifacts/amazing-studio/src/lib/api-base.ts:2"}, "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-51df9a5a47458e7b", "name": "Legacy-named symbol `amazingStudioToken_v2` in artifacts/amazing-studio/src/lib/push-notifications.ts:4", "shortDescription": {"text": "Legacy-named symbol `amazingStudioToken_v2` in artifacts/amazing-studio/src/lib/push-notifications.ts:4"}, "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-72dd33b525baa38c", "name": "`fetch()` without try/.catch or AbortSignal \u2014 artifacts/amazing-studio/src/lib/push-notifications.ts:32", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 artifacts/amazing-studio/src/lib/push-notifications.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-c507385ec96cb7f2", "name": "Legacy-named symbol `amazingUploadQueue_v1` in artifacts/amazing-studio/src/lib/upload-queue/store.ts:6", "shortDescription": {"text": "Legacy-named symbol `amazingUploadQueue_v1` in artifacts/amazing-studio/src/lib/upload-queue/store.ts:6"}, "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-fe9ea296c3461334", "name": "Legacy-named symbol `amazingStudioToken_v2` in artifacts/amazing-studio/src/lib/upload-queue/attach-handlers.ts:5", "shortDescription": {"text": "Legacy-named symbol `amazingStudioToken_v2` in artifacts/amazing-studio/src/lib/upload-queue/attach-handlers.ts:5"}, "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-f896aa2136253093", "name": "`fetch()` without try/.catch or AbortSignal \u2014 artifacts/amazing-studio/src/lib/upload-queue/attach-handlers.ts:29", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 artifacts/amazing-studio/src/lib/upload-queue/attach-handlers.ts:29"}, "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-546363d8e6856194", "name": "Legacy-named symbol `amazingStudioToken_v2` in artifacts/amazing-studio/src/pages/tasks.tsx:15", "shortDescription": {"text": "Legacy-named symbol `amazingStudioToken_v2` in artifacts/amazing-studio/src/pages/tasks.tsx:15"}, "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-4b1cc99e3a162b30", "name": "`fetch()` without try/.catch or AbortSignal \u2014 artifacts/amazing-studio/src/pages/tasks.tsx:18", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 artifacts/amazing-studio/src/pages/tasks.tsx:18"}, "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-1e67e90b3c3b21cb", "name": "Legacy-named symbol `amazingStudioToken_v2` in artifacts/amazing-studio/src/pages/settings.tsx:302", "shortDescription": {"text": "Legacy-named symbol `amazingStudioToken_v2` in artifacts/amazing-studio/src/pages/settings.tsx:302"}, "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-2592a72d370756fd", "name": "`fetch()` without try/.catch or AbortSignal \u2014 artifacts/amazing-studio/src/pages/settings.tsx:324", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 artifacts/amazing-studio/src/pages/settings.tsx:324"}, "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-9b587d4d781f5509", "name": "Legacy-named symbol `amazingStudioToken_v2` in artifacts/amazing-studio/src/pages/claude-sale-reengage.tsx:21", "shortDescription": {"text": "Legacy-named symbol `amazingStudioToken_v2` in artifacts/amazing-studio/src/pages/claude-sale-reengage.tsx:21"}, "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-da3274de00307e9f", "name": "Legacy-named symbol `amazingStudioToken_v2` in artifacts/amazing-studio/src/pages/calendar.tsx:48", "shortDescription": {"text": "Legacy-named symbol `amazingStudioToken_v2` in artifacts/amazing-studio/src/pages/calendar.tsx:48"}, "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-f97fde72e740ee53", "name": "Commented-code block (6 lines) in artifacts/amazing-studio/src/pages/calendar.tsx:116", "shortDescription": {"text": "Commented-code block (6 lines) in artifacts/amazing-studio/src/pages/calendar.tsx:116"}, "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-a64163aa94f00497", "name": "`fetch()` without try/.catch or AbortSignal \u2014 artifacts/amazing-studio/src/pages/calendar.tsx:50", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 artifacts/amazing-studio/src/pages/calendar.tsx:50"}, "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-8498a65742cb742b", "name": "`fetch()` without try/.catch or AbortSignal \u2014 artifacts/amazing-studio/src/pages/services.tsx:16", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 artifacts/amazing-studio/src/pages/services.tsx:16"}, "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-2253400ba4880514", "name": "Legacy-named symbol `amazingStudioToken_v2` in artifacts/amazing-studio/src/pages/attendance-checkin.tsx:47", "shortDescription": {"text": "Legacy-named symbol `amazingStudioToken_v2` in artifacts/amazing-studio/src/pages/attendance-checkin.tsx:47"}, "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-5edaa29e1aaecb97", "name": "Legacy-named symbol `amazingStudioToken_v2` in artifacts/amazing-studio/src/pages/claude-sale-monitor.tsx:24", "shortDescription": {"text": "Legacy-named symbol `amazingStudioToken_v2` in artifacts/amazing-studio/src/pages/claude-sale-monitor.tsx:24"}, "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-db1f5cfc990a4d9d", "name": "Legacy-named symbol `amazingStudioToken_v2` in artifacts/amazing-studio/src/pages/payments.tsx:24", "shortDescription": {"text": "Legacy-named symbol `amazingStudioToken_v2` in artifacts/amazing-studio/src/pages/payments.tsx:24"}, "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-bb1bd6becbd0e4df", "name": "`fetch()` without try/.catch or AbortSignal \u2014 artifacts/amazing-studio/src/pages/payments.tsx:42", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 artifacts/amazing-studio/src/pages/payments.tsx:42"}, "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-2cc4324917a8cb42", "name": "Legacy-named symbol `karuSaleTestHistory_v1` in artifacts/amazing-studio/src/pages/claude-sale-test.tsx:17", "shortDescription": {"text": "Legacy-named symbol `karuSaleTestHistory_v1` in artifacts/amazing-studio/src/pages/claude-sale-test.tsx:17"}, "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-8ff2c3f83e4dbca0", "name": "Legacy-named symbol `amazingStudioToken_v2` in artifacts/amazing-studio/src/pages/accounting-hr.tsx:14", "shortDescription": {"text": "Legacy-named symbol `amazingStudioToken_v2` in artifacts/amazing-studio/src/pages/accounting-hr.tsx:14"}, "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-796ccd389ee49284", "name": "`fetch()` without try/.catch or AbortSignal \u2014 artifacts/amazing-studio/src/pages/accounting-hr.tsx:70", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 artifacts/amazing-studio/src/pages/accounting-hr.tsx:70"}, "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-d8db6b0559597a13", "name": "Legacy-named symbol `amazingStudioToken_v2` in artifacts/amazing-studio/src/pages/photoshop-jobs.tsx:16", "shortDescription": {"text": "Legacy-named symbol `amazingStudioToken_v2` in artifacts/amazing-studio/src/pages/photoshop-jobs.tsx:16"}, "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-6db8eed1df3bb011", "name": "`fetch()` without try/.catch or AbortSignal \u2014 artifacts/amazing-studio/src/pages/photoshop-jobs.tsx:22", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 artifacts/amazing-studio/src/pages/photoshop-jobs.tsx:22"}, "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-b1d0f62c485e84af", "name": "Legacy-named symbol `amazingStudioToken_v2` in artifacts/amazing-studio/src/pages/facebook-inbox-ai.tsx:9", "shortDescription": {"text": "Legacy-named symbol `amazingStudioToken_v2` in artifacts/amazing-studio/src/pages/facebook-inbox-ai.tsx:9"}, "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-4a7cb68929deab1d", "name": "`fetch()` without try/.catch or AbortSignal \u2014 artifacts/amazing-studio/src/pages/facebook-inbox-ai.tsx:10", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 artifacts/amazing-studio/src/pages/facebook-inbox-ai.tsx:10"}, "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-bd38dd162c6b0813", "name": "Legacy-named symbol `amazingStudioToken_v2` in artifacts/amazing-studio/src/pages/bookings.tsx:109", "shortDescription": {"text": "Legacy-named symbol `amazingStudioToken_v2` in artifacts/amazing-studio/src/pages/bookings.tsx:109"}, "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-d80382d7172ca221", "name": "`fetch()` without try/.catch or AbortSignal \u2014 artifacts/amazing-studio/src/pages/bookings.tsx:180", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 artifacts/amazing-studio/src/pages/bookings.tsx:180"}, "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-9e6c53ce5663eaa4", "name": "Legacy-named symbol `amazingStudioToken_v2` in artifacts/amazing-studio/src/pages/reports.tsx:11", "shortDescription": {"text": "Legacy-named symbol `amazingStudioToken_v2` in artifacts/amazing-studio/src/pages/reports.tsx:11"}, "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-8a789eeed60bf424", "name": "Legacy-named symbol `amazingStudioToken_v2` in artifacts/amazing-studio/src/pages/my-profile.tsx:21", "shortDescription": {"text": "Legacy-named symbol `amazingStudioToken_v2` in artifacts/amazing-studio/src/pages/my-profile.tsx:21"}, "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-9d7b5d6d86b93c6c", "name": "Legacy-named symbol `amazingStudioToken_v2` in artifacts/amazing-studio/src/pages/dashboard.tsx:99", "shortDescription": {"text": "Legacy-named symbol `amazingStudioToken_v2` in artifacts/amazing-studio/src/pages/dashboard.tsx:99"}, "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-eeeba800f3816422", "name": "`fetch()` without try/.catch or AbortSignal \u2014 artifacts/amazing-studio/src/pages/dashboard.tsx:100", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 artifacts/amazing-studio/src/pages/dashboard.tsx:100"}, "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-0bf2aadc61d01d9e", "name": "`fetch()` without try/.catch or AbortSignal \u2014 artifacts/amazing-studio/src/pages/service-detail.tsx:63", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 artifacts/amazing-studio/src/pages/service-detail.tsx:63"}, "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-e0f0dbea090ddf97", "name": "`fetch()` without try/.catch or AbortSignal \u2014 artifacts/amazing-studio/src/pages/ai-assistant.tsx:56", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 artifacts/amazing-studio/src/pages/ai-assistant.tsx: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-e9e718e7dbae6332", "name": "Legacy-named symbol `amazingStudioToken_v2` in artifacts/amazing-studio/src/pages/internal-comms.tsx:14", "shortDescription": {"text": "Legacy-named symbol `amazingStudioToken_v2` in artifacts/amazing-studio/src/pages/internal-comms.tsx:14"}, "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-aeb91ef85f87f015", "name": "Legacy-named symbol `amazingStudioToken_v2` in artifacts/amazing-studio/src/pages/pricing.tsx:88", "shortDescription": {"text": "Legacy-named symbol `amazingStudioToken_v2` in artifacts/amazing-studio/src/pages/pricing.tsx:88"}, "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-72c1aac50f978c7b", "name": "`fetch()` without try/.catch or AbortSignal \u2014 artifacts/amazing-studio/src/pages/pricing.tsx:153", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 artifacts/amazing-studio/src/pages/pricing.tsx:153"}, "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-6735a8bd057ed78d", "name": "`fetch()` without try/.catch or AbortSignal \u2014 artifacts/amazing-studio/src/pages/contracts.tsx:11", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 artifacts/amazing-studio/src/pages/contracts.tsx:11"}, "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-36c417c9fe0bfcbf", "name": "Legacy-named symbol `amazingStudioToken_v2` in artifacts/amazing-studio/src/pages/staff.tsx:23", "shortDescription": {"text": "Legacy-named symbol `amazingStudioToken_v2` in artifacts/amazing-studio/src/pages/staff.tsx:23"}, "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-28869d7810c04254", "name": "Legacy-named symbol `amazingStudioToken_v2` in artifacts/amazing-studio/src/pages/quotes.tsx:24", "shortDescription": {"text": "Legacy-named symbol `amazingStudioToken_v2` in artifacts/amazing-studio/src/pages/quotes.tsx:24"}, "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-f89700def3080d01", "name": "`fetch()` without try/.catch or AbortSignal \u2014 artifacts/amazing-studio/src/pages/quotes.tsx:27", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 artifacts/amazing-studio/src/pages/quotes.tsx: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-d0b9e8ebfcce0246", "name": "Legacy-named symbol `amazingStudioToken_v2` in artifacts/amazing-studio/src/pages/claude-sale-settings.tsx:34", "shortDescription": {"text": "Legacy-named symbol `amazingStudioToken_v2` in artifacts/amazing-studio/src/pages/claude-sale-settings.tsx:34"}, "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-e4495d05d60f0ba7", "name": "Legacy-named symbol `amazingStudioToken_v2` in artifacts/amazing-studio/src/pages/crm-leads.tsx:8", "shortDescription": {"text": "Legacy-named symbol `amazingStudioToken_v2` in artifacts/amazing-studio/src/pages/crm-leads.tsx:8"}, "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-1a14bbf5e3602d4f", "name": "`fetch()` without try/.catch or AbortSignal \u2014 artifacts/amazing-studio/src/pages/crm-leads.tsx:10", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 artifacts/amazing-studio/src/pages/crm-leads.tsx:10"}, "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-4611fc97e99ddf1e", "name": "Legacy-named symbol `amazingStudioToken_v2` in artifacts/amazing-studio/src/pages/attendance.tsx:47", "shortDescription": {"text": "Legacy-named symbol `amazingStudioToken_v2` in artifacts/amazing-studio/src/pages/attendance.tsx:47"}, "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-d9b709730f0c29b9", "name": "`fetch()` without try/.catch or AbortSignal \u2014 artifacts/amazing-studio/src/pages/attendance.tsx:81", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 artifacts/amazing-studio/src/pages/attendance.tsx:81"}, "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-79369aeb7338f72f", "name": "Legacy-named symbol `amazingStudioToken_v2` in artifacts/amazing-studio/src/pages/revenue.tsx:363", "shortDescription": {"text": "Legacy-named symbol `amazingStudioToken_v2` in artifacts/amazing-studio/src/pages/revenue.tsx:363"}, "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-14485a199f42b1d3", "name": "`fetch()` without try/.catch or AbortSignal \u2014 artifacts/amazing-studio/src/pages/revenue.tsx:283", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 artifacts/amazing-studio/src/pages/revenue.tsx:283"}, "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-6144e72ac55b1bac", "name": "Legacy-named symbol `amazingStudioToken_v2` in artifacts/amazing-studio/src/pages/ai-test-room.tsx:20", "shortDescription": {"text": "Legacy-named symbol `amazingStudioToken_v2` in artifacts/amazing-studio/src/pages/ai-test-room.tsx:20"}, "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-a5c760aa1ea27e07", "name": "`fetch()` without try/.catch or AbortSignal \u2014 artifacts/amazing-studio/src/pages/ai-test-room.tsx:21", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 artifacts/amazing-studio/src/pages/ai-test-room.tsx:21"}, "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-034d16a466cf985a", "name": "Legacy-named symbol `amazingStudioToken_v2` in artifacts/amazing-studio/src/pages/staff-profile.tsx:25", "shortDescription": {"text": "Legacy-named symbol `amazingStudioToken_v2` in artifacts/amazing-studio/src/pages/staff-profile.tsx:25"}, "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-d2d0571eb2b085b0", "name": "`fetch()` without try/.catch or AbortSignal \u2014 artifacts/amazing-studio/src/pages/staff-profile.tsx:34", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 artifacts/amazing-studio/src/pages/staff-profile.tsx: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-539cfd1f7796949b", "name": "Legacy-named symbol `amazingStudioToken_v2` in artifacts/amazing-studio/src/pages/ai-sale-scripts.tsx:9", "shortDescription": {"text": "Legacy-named symbol `amazingStudioToken_v2` in artifacts/amazing-studio/src/pages/ai-sale-scripts.tsx:9"}, "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-b4723911949fc6f5", "name": "`fetch()` without try/.catch or AbortSignal \u2014 artifacts/amazing-studio/src/pages/ai-sale-scripts.tsx:15", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 artifacts/amazing-studio/src/pages/ai-sale-scripts.tsx: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-0e0b90119e452a08", "name": "Legacy-named symbol `amazingStudioToken_v2` in artifacts/amazing-studio/src/pages/sale-learning.tsx:26", "shortDescription": {"text": "Legacy-named symbol `amazingStudioToken_v2` in artifacts/amazing-studio/src/pages/sale-learning.tsx:26"}, "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-dea053b52bef0eee", "name": "Legacy-named symbol `amazingStudioToken_v2` in artifacts/amazing-studio/src/pages/expenses.tsx:148", "shortDescription": {"text": "Legacy-named symbol `amazingStudioToken_v2` in artifacts/amazing-studio/src/pages/expenses.tsx:148"}, "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-60c6e3671d4aee95", "name": "`fetch()` without try/.catch or AbortSignal \u2014 artifacts/amazing-studio/src/pages/expenses.tsx:158", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 artifacts/amazing-studio/src/pages/expenses.tsx:158"}, "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-5e20f06e83c8227d", "name": "Legacy-named symbol `amazingStudioToken_v2` in artifacts/amazing-studio/src/pages/customers.tsx:14", "shortDescription": {"text": "Legacy-named symbol `amazingStudioToken_v2` in artifacts/amazing-studio/src/pages/customers.tsx:14"}, "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-d54db7d494b521b1", "name": "`fetch()` without try/.catch or AbortSignal \u2014 artifacts/amazing-studio/src/pages/customers.tsx:32", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 artifacts/amazing-studio/src/pages/customers.tsx: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-e1fff930d4b85b15", "name": "Legacy-named symbol `amazingStudioToken_v2` in artifacts/amazing-studio/src/pages/notifications.tsx:10", "shortDescription": {"text": "Legacy-named symbol `amazingStudioToken_v2` in artifacts/amazing-studio/src/pages/notifications.tsx:10"}, "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-27c7fbdfff9501ca", "name": "`fetch()` without try/.catch or AbortSignal \u2014 artifacts/amazing-studio/src/pages/notifications.tsx:11", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 artifacts/amazing-studio/src/pages/notifications.tsx:11"}, "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-a77ecc903120c6ee", "name": "`fetch()` without try/.catch or AbortSignal \u2014 artifacts/amazing-studio/src/pages/cms/pricing-public.tsx:26", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 artifacts/amazing-studio/src/pages/cms/pricing-public.tsx:26"}, "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-ae91027d0e6bb4b7", "name": "`fetch()` without try/.catch or AbortSignal \u2014 artifacts/amazing-studio/src/pages/cms/trash.tsx:28", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 artifacts/amazing-studio/src/pages/cms/trash.tsx:28"}, "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-2795c09d4619427a", "name": "`fetch()` without try/.catch or AbortSignal \u2014 artifacts/amazing-studio/src/pages/cms/products-rental.tsx:103", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 artifacts/amazing-studio/src/pages/cms/products-rental.tsx:103"}, "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-aabac7ee47c5a3be", "name": "`fetch()` without try/.catch or AbortSignal \u2014 artifacts/amazing-studio/src/pages/cms/photo-ideas.tsx:651", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 artifacts/amazing-studio/src/pages/cms/photo-ideas.tsx:651"}, "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-7f16b0be2342ca66", "name": "`fetch()` without try/.catch or AbortSignal \u2014 artifacts/amazing-studio/src/pages/cms/categories.tsx:162", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 artifacts/amazing-studio/src/pages/cms/categories.tsx:162"}, "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-b1c6fa21aafd9872", "name": "`fetch()` without try/.catch or AbortSignal \u2014 artifacts/amazing-studio/src/pages/cms/gallery.tsx:167", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 artifacts/amazing-studio/src/pages/cms/gallery.tsx:167"}, "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-a3e42771a724fd60", "name": "`fetch()` without try/.catch or AbortSignal \u2014 artifacts/amazing-studio/src/pages/cms/rental-public.tsx:23", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 artifacts/amazing-studio/src/pages/cms/rental-public.tsx:23"}, "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-07a214429a6b1673", "name": "`fetch()` without try/.catch or AbortSignal \u2014 artifacts/amazing-studio/src/pages/public/pricing-public.tsx:24", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 artifacts/amazing-studio/src/pages/public/pricing-public.tsx:24"}, "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-c9a34ddea29d5b89", "name": "`fetch()` without try/.catch or AbortSignal \u2014 artifacts/amazing-studio/src/pages/public/gallery-detail.tsx:128", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 artifacts/amazing-studio/src/pages/public/gallery-detail.tsx:128"}, "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-b311c46d7b8ab97f", "name": "Legacy-named symbol `amazingPhotoIdeasToken_v1` in artifacts/amazing-studio/src/pages/public/photo-ideas.tsx:23", "shortDescription": {"text": "Legacy-named symbol `amazingPhotoIdeasToken_v1` in artifacts/amazing-studio/src/pages/public/photo-ideas.tsx:23"}, "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-a69a60ab81d6dd23", "name": "`fetch()` without try/.catch or AbortSignal \u2014 artifacts/amazing-studio/src/pages/public/rental-detail.tsx:689", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 artifacts/amazing-studio/src/pages/public/rental-detail.tsx:689"}, "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-c4c4eaab320742ad", "name": "`fetch()` without try/.catch or AbortSignal \u2014 artifacts/amazing-studio/src/pages/public/rental-public.tsx:141", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 artifacts/amazing-studio/src/pages/public/rental-public.tsx:141"}, "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-ca549ec355c991c5", "name": "`fetch()` without try/.catch or AbortSignal \u2014 artifacts/amazing-studio/src/hooks/use-wedding-card-upload.ts:18", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 artifacts/amazing-studio/src/hooks/use-wedding-card-upload.ts:18"}, "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-f5e88b35f8b68b15", "name": "`fetch()` without try/.catch or AbortSignal \u2014 artifacts/amazing-studio/src/hooks/use-wedding-templates-admin.ts:83", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 artifacts/amazing-studio/src/hooks/use-wedding-templates-admin.ts:83"}, "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-38c308980c9382b3", "name": "`fetch()` without try/.catch or AbortSignal \u2014 artifacts/amazing-studio/src/hooks/use-public-cms.ts:181", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 artifacts/amazing-studio/src/hooks/use-public-cms.ts:181"}, "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-de392d9e5a3510e4", "name": "Legacy-named symbol `amazingStudioToken_v2` in artifacts/amazing-studio/src/hooks/use-notifications.ts:8", "shortDescription": {"text": "Legacy-named symbol `amazingStudioToken_v2` in artifacts/amazing-studio/src/hooks/use-notifications.ts:8"}, "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-7acc6a03c2b65160", "name": "`fetch()` without try/.catch or AbortSignal \u2014 artifacts/amazing-studio/src/hooks/use-notifications.ts:9", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 artifacts/amazing-studio/src/hooks/use-notifications.ts:9"}, "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-b065dff77d8beb17", "name": "Legacy-named symbol `amazingStudioToken_v2` in artifacts/amazing-studio/src/hooks/use-outfit-schedule.ts:28", "shortDescription": {"text": "Legacy-named symbol `amazingStudioToken_v2` in artifacts/amazing-studio/src/hooks/use-outfit-schedule.ts:28"}, "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-2ae262a2c48fd3a3", "name": "`fetch()` without try/.catch or AbortSignal \u2014 artifacts/amazing-studio/src/hooks/use-outfit-schedule.ts:30", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 artifacts/amazing-studio/src/hooks/use-outfit-schedule.ts:30"}, "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-ca395a18e146a116", "name": "38 env vars used in code but missing from .env.example", "shortDescription": {"text": "38 env vars used in code but missing from .env.example"}, "fullDescription": {"text": "Drift between code and config docs. The first few: `AI_FOLLOWUP_INTERVAL_SEC`, `AI_INTEGRATIONS_OPENAI_API_KEY`, `AI_INTEGRATIONS_OPENAI_BASE_URL`, `AI_TEST_FOLLOWUP_INTERVAL_SEC`, `BASE_PATH`, `BASE_URL`, `DEFAULT_OBJECT_STORAGE_BUCKET_ID`, `DEV` + 30 more. Add them (with a placeholder/comment) to .env.example so onboarding doesn't break."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-36318016eab04814", "name": "Frontend route `/thiep-cuoi-online/tao` has no Link/navigate to it \u2014 artifacts/amazing-studio/src/App.tsx", "shortDescription": {"text": "Frontend route `/thiep-cuoi-online/tao` has no Link/navigate to it \u2014 artifacts/amazing-studio/src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-3d7a18a7e04a1f25", "name": "Frontend route `/thiep-cuoi/:slug` has no Link/navigate to it \u2014 artifacts/amazing-studio/src/App.tsx", "shortDescription": {"text": "Frontend route `/thiep-cuoi/:slug` has no Link/navigate to it \u2014 artifacts/amazing-studio/src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-b3b5b9e6bef9561d", "name": "Frontend route `/trang-chu` has no Link/navigate to it \u2014 artifacts/amazing-studio/src/App.tsx", "shortDescription": {"text": "Frontend route `/trang-chu` has no Link/navigate to it \u2014 artifacts/amazing-studio/src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-a184a9a6491410d1", "name": "Frontend route `/bo-anh/:slug` has no Link/navigate to it \u2014 artifacts/amazing-studio/src/App.tsx", "shortDescription": {"text": "Frontend route `/bo-anh/:slug` has no Link/navigate to it \u2014 artifacts/amazing-studio/src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-bd80bb51f5a17320", "name": "Frontend route `/san-pham/:slug` has no Link/navigate to it \u2014 artifacts/amazing-studio/src/App.tsx", "shortDescription": {"text": "Frontend route `/san-pham/:slug` has no Link/navigate to it \u2014 artifacts/amazing-studio/src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-ef9ce76ba19c84b4", "name": "Frontend route `/services/:id` has no Link/navigate to it \u2014 artifacts/amazing-studio/src/App.tsx", "shortDescription": {"text": "Frontend route `/services/:id` has no Link/navigate to it \u2014 artifacts/amazing-studio/src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-5ac2ee594d9348e7", "name": "Frontend route `/staff/:id` has no Link/navigate to it \u2014 artifacts/amazing-studio/src/App.tsx", "shortDescription": {"text": "Frontend route `/staff/:id` has no Link/navigate to it \u2014 artifacts/amazing-studio/src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-8a0f92f00d9d9ca4", "name": "Frontend route `/accounting` has no Link/navigate to it \u2014 artifacts/amazing-studio/src/App.tsx", "shortDescription": {"text": "Frontend route `/accounting` has no Link/navigate to it \u2014 artifacts/amazing-studio/src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-d66fe7228eb965a9", "name": "Frontend route `/contracts` has no Link/navigate to it \u2014 artifacts/amazing-studio/src/App.tsx", "shortDescription": {"text": "Frontend route `/contracts` has no Link/navigate to it \u2014 artifacts/amazing-studio/src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-ed9d1cb5953ee956", "name": "Frontend route `/attendance/check-in` has no Link/navigate to it \u2014 artifacts/amazing-studio/src/App.tsx", "shortDescription": {"text": "Frontend route `/attendance/check-in` has no Link/navigate to it \u2014 artifacts/amazing-studio/src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-020b77bee11654b8", "name": "Frontend route `/cms/rentals` has no Link/navigate to it \u2014 artifacts/amazing-studio/src/App.tsx", "shortDescription": {"text": "Frontend route `/cms/rentals` has no Link/navigate to it \u2014 artifacts/amazing-studio/src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-78f90f933be9d012", "name": "Frontend route `/cms/products-rental` has no Link/navigate to it \u2014 artifacts/amazing-studio/src/App.tsx", "shortDescription": {"text": "Frontend route `/cms/products-rental` has no Link/navigate to it \u2014 artifacts/amazing-studio/src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-bf313c2918d61c5e", "name": "Dangling fetch: POST https://graph.facebook.com/v22.0/me/messages?access_token=${encodeURIComponent(token)} (artifacts/a", "shortDescription": {"text": "Dangling fetch: POST https://graph.facebook.com/v22.0/me/messages?access_token=${encodeURIComponent(token)} (artifacts/api-server/src/follow-up-scheduler.ts:21)"}, "fullDescription": {"text": "`artifacts/api-server/src/follow-up-scheduler.ts:21` calls `POST https://graph.facebook.com/v22.0/me/messages?access_token=${encodeURIComponent(token)}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/graph.facebook.com/v22.0/me/messages`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-cc8dbfbe7ee2c627", "name": "Dangling fetch: POST https://graph.facebook.com/v22.0/me/messages?access_token=${encodeURIComponent(token)} (artifacts/a", "shortDescription": {"text": "Dangling fetch: POST https://graph.facebook.com/v22.0/me/messages?access_token=${encodeURIComponent(token)} (artifacts/api-server/src/routes/fb-inbox.ts:142)"}, "fullDescription": {"text": "`artifacts/api-server/src/routes/fb-inbox.ts:142` calls `POST https://graph.facebook.com/v22.0/me/messages?access_token=${encodeURIComponent(token)}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/graph.facebook.com/v22.0/me/messages`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-8919944dac16946b", "name": "Dangling fetch: POST https://graph.facebook.com/v22.0/me/messages?access_token=${encodeURIComponent(pageAccessToken)} (a", "shortDescription": {"text": "Dangling fetch: POST https://graph.facebook.com/v22.0/me/messages?access_token=${encodeURIComponent(pageAccessToken)} (artifacts/api-server/src/routes/fb-inbox.ts:194)"}, "fullDescription": {"text": "`artifacts/api-server/src/routes/fb-inbox.ts:194` calls `POST https://graph.facebook.com/v22.0/me/messages?access_token=${encodeURIComponent(pageAccessToken)}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/graph.facebook.com/v22.0/me/messages`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-41ca865cb5970d6d", "name": "Dangling fetch: POST https://graph.facebook.com/v22.0/me/messages?access_token=${encodeURIComponent(pageAccessToken)} (a", "shortDescription": {"text": "Dangling fetch: POST https://graph.facebook.com/v22.0/me/messages?access_token=${encodeURIComponent(pageAccessToken)} (artifacts/api-server/src/routes/fb-inbox.ts:215)"}, "fullDescription": {"text": "`artifacts/api-server/src/routes/fb-inbox.ts:215` calls `POST https://graph.facebook.com/v22.0/me/messages?access_token=${encodeURIComponent(pageAccessToken)}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/graph.facebook.com/v22.0/me/messages`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-c4310fda3d022f01", "name": "Dangling fetch: GET https://graph.facebook.com/me?fields=id,name,fan_count,picture&access_token=${encodeURIComponent(cfg", "shortDescription": {"text": "Dangling fetch: GET https://graph.facebook.com/me?fields=id,name,fan_count,picture&access_token=${encodeURIComponent(cfg.pageAccessToken)} (artifacts/api-server/src/routes/fb-inbox.ts:897)"}, "fullDescription": {"text": "`artifacts/api-server/src/routes/fb-inbox.ts:897` calls `GET https://graph.facebook.com/me?fields=id,name,fan_count,picture&access_token=${encodeURIComponent(cfg.pageAccessToken)}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/graph.facebook.com/me`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-911c620f33ca0492", "name": "Dangling fetch: GET https://graph.facebook.com/me?fields=id,name&access_token=${encodeURIComponent(cfg.pageAccessToken)}", "shortDescription": {"text": "Dangling fetch: GET https://graph.facebook.com/me?fields=id,name&access_token=${encodeURIComponent(cfg.pageAccessToken)} (artifacts/api-server/src/routes/fb-inbox.ts:914)"}, "fullDescription": {"text": "`artifacts/api-server/src/routes/fb-inbox.ts:914` calls `GET https://graph.facebook.com/me?fields=id,name&access_token=${encodeURIComponent(cfg.pageAccessToken)}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/graph.facebook.com/me`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-727f750d817442f2", "name": "Dangling fetch: POST https://graph.facebook.com/${meData.id}/subscribed_apps?subscribed_fields=messages,messaging_postba", "shortDescription": {"text": "Dangling fetch: POST https://graph.facebook.com/${meData.id}/subscribed_apps?subscribed_fields=messages,messaging_postbacks,messaging_optins,message_deliveries,message_reads&access_token=${encodeURIComponent(cfg.pageAccessToken)} (artifacts"}, "fullDescription": {"text": "`artifacts/api-server/src/routes/fb-inbox.ts:918` calls `POST https://graph.facebook.com/${meData.id}/subscribed_apps?subscribed_fields=messages,messaging_postbacks,messaging_optins,message_deliveries,message_reads&access_token=${encodeURIComponent(cfg.pageAccessToken)}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/graph.facebook.com/<p>/subscribed_apps`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-dde3adb27bf7eebe", "name": "Unused endpoint: USE /api", "shortDescription": {"text": "Unused endpoint: USE /api"}, "fullDescription": {"text": "`artifacts/api-server/src/app.ts` declares `USE /api` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-f85a32feeafd78c9", "name": "Unused endpoint: POST /ai/chat", "shortDescription": {"text": "Unused endpoint: POST /ai/chat"}, "fullDescription": {"text": "`artifacts/api-server/src/routes/ai.ts` declares `POST /ai/chat` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-2b0aafbe18a1fba2", "name": "Unused endpoint: GET /job-earnings", "shortDescription": {"text": "Unused endpoint: GET /job-earnings"}, "fullDescription": {"text": "`artifacts/api-server/src/routes/job-earnings.ts` declares `GET /job-earnings` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-18bcdaddf134cf95", "name": "Unused endpoint: GET /job-earnings/by-booking/:bookingId", "shortDescription": {"text": "Unused endpoint: GET /job-earnings/by-booking/:bookingId"}, "fullDescription": {"text": "`artifacts/api-server/src/routes/job-earnings.ts` declares `GET /job-earnings/by-booking/:bookingId` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-fc134cc97ce3ce7c", "name": "Unused endpoint: POST /job-earnings/compute/:bookingId", "shortDescription": {"text": "Unused endpoint: POST /job-earnings/compute/:bookingId"}, "fullDescription": {"text": "`artifacts/api-server/src/routes/job-earnings.ts` declares `POST /job-earnings/compute/:bookingId` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-a424def8e8b321ba", "name": "Unused endpoint: PATCH /job-earnings/:id/void", "shortDescription": {"text": "Unused endpoint: PATCH /job-earnings/:id/void"}, "fullDescription": {"text": "`artifacts/api-server/src/routes/job-earnings.ts` declares `PATCH /job-earnings/:id/void` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-1f214e4dcdd61710", "name": "Unused endpoint: PUT /job-earnings/:id", "shortDescription": {"text": "Unused endpoint: PUT /job-earnings/:id"}, "fullDescription": {"text": "`artifacts/api-server/src/routes/job-earnings.ts` declares `PUT /job-earnings/:id` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-97985b60cc523608", "name": "Unused endpoint: GET /job-earnings/summary/:staffId", "shortDescription": {"text": "Unused endpoint: GET /job-earnings/summary/:staffId"}, "fullDescription": {"text": "`artifacts/api-server/src/routes/job-earnings.ts` declares `GET /job-earnings/summary/:staffId` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-ac42422b23e45104", "name": "Unused endpoint: GET /auth/me", "shortDescription": {"text": "Unused endpoint: GET /auth/me"}, "fullDescription": {"text": "`artifacts/api-server/src/routes/auth.ts` declares `GET /auth/me` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-8fdbacfe9430a6ed", "name": "Unused endpoint: POST /auth/login", "shortDescription": {"text": "Unused endpoint: POST /auth/login"}, "fullDescription": {"text": "`artifacts/api-server/src/routes/auth.ts` declares `POST /auth/login` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-083589da2acbc70a", "name": "Unused endpoint: GET /auth/staff-account/:id", "shortDescription": {"text": "Unused endpoint: GET /auth/staff-account/:id"}, "fullDescription": {"text": "`artifacts/api-server/src/routes/auth.ts` declares `GET /auth/staff-account/:id` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-4585c350da9e880d", "name": "Unused endpoint: POST /auth/change-password", "shortDescription": {"text": "Unused endpoint: POST /auth/change-password"}, "fullDescription": {"text": "`artifacts/api-server/src/routes/auth.ts` declares `POST /auth/change-password` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-ce43f7026490f754", "name": "Unused endpoint: POST /ai-test/sessions", "shortDescription": {"text": "Unused endpoint: POST /ai-test/sessions"}, "fullDescription": {"text": "`artifacts/api-server/src/routes/ai-test.ts` declares `POST /ai-test/sessions` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-5c369d9121b36605", "name": "Unused endpoint: GET /ai-test/sessions", "shortDescription": {"text": "Unused endpoint: GET /ai-test/sessions"}, "fullDescription": {"text": "`artifacts/api-server/src/routes/ai-test.ts` declares `GET /ai-test/sessions` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-699e010d1fac856a", "name": "Unused endpoint: DELETE /ai-test/sessions/:id", "shortDescription": {"text": "Unused endpoint: DELETE /ai-test/sessions/:id"}, "fullDescription": {"text": "`artifacts/api-server/src/routes/ai-test.ts` declares `DELETE /ai-test/sessions/:id` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-9ffa2ba7d5d093d4", "name": "Unused endpoint: GET /ai-test/sessions/:id/messages", "shortDescription": {"text": "Unused endpoint: GET /ai-test/sessions/:id/messages"}, "fullDescription": {"text": "`artifacts/api-server/src/routes/ai-test.ts` declares `GET /ai-test/sessions/:id/messages` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-ff811b4c7e057a31", "name": "Unused endpoint: GET /ai-test/sessions/:id/debug", "shortDescription": {"text": "Unused endpoint: GET /ai-test/sessions/:id/debug"}, "fullDescription": {"text": "`artifacts/api-server/src/routes/ai-test.ts` declares `GET /ai-test/sessions/:id/debug` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-9dffb229c3d99d03", "name": "Unused endpoint: GET /ai-test/sessions/:id/events", "shortDescription": {"text": "Unused endpoint: GET /ai-test/sessions/:id/events"}, "fullDescription": {"text": "`artifacts/api-server/src/routes/ai-test.ts` declares `GET /ai-test/sessions/:id/events` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-24a294df24b1c979", "name": "Unused endpoint: POST /ai-test/sessions/:id/message", "shortDescription": {"text": "Unused endpoint: POST /ai-test/sessions/:id/message"}, "fullDescription": {"text": "`artifacts/api-server/src/routes/ai-test.ts` declares `POST /ai-test/sessions/:id/message` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-9579c4ff916cc3bb", "name": "Unused endpoint: POST /ai-test/sessions/:id/reset", "shortDescription": {"text": "Unused endpoint: POST /ai-test/sessions/:id/reset"}, "fullDescription": {"text": "`artifacts/api-server/src/routes/ai-test.ts` declares `POST /ai-test/sessions/:id/reset` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-4b9f8e609fcd7228", "name": "Unused endpoint: PATCH /ai-test/sessions/:id", "shortDescription": {"text": "Unused endpoint: PATCH /ai-test/sessions/:id"}, "fullDescription": {"text": "`artifacts/api-server/src/routes/ai-test.ts` declares `PATCH /ai-test/sessions/:id` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-5ee80cc77bb3e682", "name": "Unused endpoint: GET /ai-test/sessions/:id/export", "shortDescription": {"text": "Unused endpoint: GET /ai-test/sessions/:id/export"}, "fullDescription": {"text": "`artifacts/api-server/src/routes/ai-test.ts` declares `GET /ai-test/sessions/:id/export` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-1f4c13b940de8e39", "name": "Unused endpoint: GET /ai-test/sessions/export-all", "shortDescription": {"text": "Unused endpoint: GET /ai-test/sessions/export-all"}, "fullDescription": {"text": "`artifacts/api-server/src/routes/ai-test.ts` declares `GET /ai-test/sessions/export-all` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-addf18fe92200722", "name": "Unused endpoint: GET /ai-test/scripts", "shortDescription": {"text": "Unused endpoint: GET /ai-test/scripts"}, "fullDescription": {"text": "`artifacts/api-server/src/routes/ai-test.ts` declares `GET /ai-test/scripts` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-089ce3a352fb43b5", "name": "Unused endpoint: GET /check-ai-key", "shortDescription": {"text": "Unused endpoint: GET /check-ai-key"}, "fullDescription": {"text": "`artifacts/api-server/src/routes/health.ts` declares `GET /check-ai-key` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-e95cbeb660f7477b", "name": "Unused endpoint: GET /bookings/:id/items", "shortDescription": {"text": "Unused endpoint: GET /bookings/:id/items"}, "fullDescription": {"text": "`artifacts/api-server/src/routes/booking-extras.ts` declares `GET /bookings/:id/items` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-c2355797882b6585", "name": "Unused endpoint: POST /bookings/:id/items", "shortDescription": {"text": "Unused endpoint: POST /bookings/:id/items"}, "fullDescription": {"text": "`artifacts/api-server/src/routes/booking-extras.ts` declares `POST /bookings/:id/items` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-cc158902ff84918a", "name": "Unused endpoint: PUT /bookings/:id/items/:itemId", "shortDescription": {"text": "Unused endpoint: PUT /bookings/:id/items/:itemId"}, "fullDescription": {"text": "`artifacts/api-server/src/routes/booking-extras.ts` declares `PUT /bookings/:id/items/:itemId` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-612b8609d6d2ea57", "name": "Unused endpoint: POST /bookings/:id/upgrade", "shortDescription": {"text": "Unused endpoint: POST /bookings/:id/upgrade"}, "fullDescription": {"text": "`artifacts/api-server/src/routes/booking-extras.ts` declares `POST /bookings/:id/upgrade` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-2328badb5aad0fca", "name": "Unused endpoint: PATCH /bookings/:id/reschedule", "shortDescription": {"text": "Unused endpoint: PATCH /bookings/:id/reschedule"}, "fullDescription": {"text": "`artifacts/api-server/src/routes/booking-extras.ts` declares `PATCH /bookings/:id/reschedule` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-287372ea3a622c49", "name": "Unused endpoint: GET /bookings/:id/change-log", "shortDescription": {"text": "Unused endpoint: GET /bookings/:id/change-log"}, "fullDescription": {"text": "`artifacts/api-server/src/routes/booking-extras.ts` declares `GET /bookings/:id/change-log` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-b10bc9d9c16004ba", "name": "Unused endpoint: GET /ai-scripts", "shortDescription": {"text": "Unused endpoint: GET /ai-scripts"}, "fullDescription": {"text": "`artifacts/api-server/src/routes/ai-scripts.ts` declares `GET /ai-scripts` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-44b54d7dea89990d", "name": "Unused endpoint: GET /ai-scripts/unknown-questions/count", "shortDescription": {"text": "Unused endpoint: GET /ai-scripts/unknown-questions/count"}, "fullDescription": {"text": "`artifacts/api-server/src/routes/ai-scripts.ts` declares `GET /ai-scripts/unknown-questions/count` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-04821fce71e6bc1b", "name": "Unused endpoint: GET /ai-scripts/unknown-questions", "shortDescription": {"text": "Unused endpoint: GET /ai-scripts/unknown-questions"}, "fullDescription": {"text": "`artifacts/api-server/src/routes/ai-scripts.ts` declares `GET /ai-scripts/unknown-questions` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-55cc72bf29ed42e3", "name": "Unused endpoint: PATCH /ai-scripts/unknown-questions/:id", "shortDescription": {"text": "Unused endpoint: PATCH /ai-scripts/unknown-questions/:id"}, "fullDescription": {"text": "`artifacts/api-server/src/routes/ai-scripts.ts` declares `PATCH /ai-scripts/unknown-questions/:id` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-127f89b5042e5430", "name": "Unused endpoint: GET /ai-scripts/shared-qa-rows", "shortDescription": {"text": "Unused endpoint: GET /ai-scripts/shared-qa-rows"}, "fullDescription": {"text": "`artifacts/api-server/src/routes/ai-scripts.ts` declares `GET /ai-scripts/shared-qa-rows` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-b48fe36be97a6d2d", "name": "Unused endpoint: POST /ai-scripts/shared-qa-rows/bulk", "shortDescription": {"text": "Unused endpoint: POST /ai-scripts/shared-qa-rows/bulk"}, "fullDescription": {"text": "`artifacts/api-server/src/routes/ai-scripts.ts` declares `POST /ai-scripts/shared-qa-rows/bulk` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-6f9544fdbd5749a5", "name": "Unused endpoint: GET /ai-scripts/:id", "shortDescription": {"text": "Unused endpoint: GET /ai-scripts/:id"}, "fullDescription": {"text": "`artifacts/api-server/src/routes/ai-scripts.ts` declares `GET /ai-scripts/:id` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-b344d329473cc4e9", "name": "Unused endpoint: POST /ai-scripts", "shortDescription": {"text": "Unused endpoint: POST /ai-scripts"}, "fullDescription": {"text": "`artifacts/api-server/src/routes/ai-scripts.ts` declares `POST /ai-scripts` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-2d9b79da9f30534e", "name": "Unused endpoint: PUT /ai-scripts/:id", "shortDescription": {"text": "Unused endpoint: PUT /ai-scripts/:id"}, "fullDescription": {"text": "`artifacts/api-server/src/routes/ai-scripts.ts` declares `PUT /ai-scripts/:id` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-e45d82df8aee057d", "name": "Unused endpoint: PATCH /ai-scripts/:id/settings", "shortDescription": {"text": "Unused endpoint: PATCH /ai-scripts/:id/settings"}, "fullDescription": {"text": "`artifacts/api-server/src/routes/ai-scripts.ts` declares `PATCH /ai-scripts/:id/settings` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-d4725c8b3bf027fd", "name": "Unused endpoint: DELETE /ai-scripts/:id", "shortDescription": {"text": "Unused endpoint: DELETE /ai-scripts/:id"}, "fullDescription": {"text": "`artifacts/api-server/src/routes/ai-scripts.ts` declares `DELETE /ai-scripts/:id` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-582a63c555098792", "name": "Unused endpoint: GET /ai-scripts/:id/qa-rows", "shortDescription": {"text": "Unused endpoint: GET /ai-scripts/:id/qa-rows"}, "fullDescription": {"text": "`artifacts/api-server/src/routes/ai-scripts.ts` declares `GET /ai-scripts/:id/qa-rows` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-33c567afc7b9690f", "name": "Unused endpoint: POST /ai-scripts/:id/qa-rows/bulk", "shortDescription": {"text": "Unused endpoint: POST /ai-scripts/:id/qa-rows/bulk"}, "fullDescription": {"text": "`artifacts/api-server/src/routes/ai-scripts.ts` declares `POST /ai-scripts/:id/qa-rows/bulk` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-d302051675d353bd", "name": "Unused endpoint: GET /quotes", "shortDescription": {"text": "Unused endpoint: GET /quotes"}, "fullDescription": {"text": "`artifacts/api-server/src/routes/quotes.ts` declares `GET /quotes` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-e33df8e307a8336a", "name": "Unused endpoint: POST /quotes", "shortDescription": {"text": "Unused endpoint: POST /quotes"}, "fullDescription": {"text": "`artifacts/api-server/src/routes/quotes.ts` declares `POST /quotes` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-a8e37d5bcc9a7c67", "name": "Unused endpoint: GET /quotes/:id", "shortDescription": {"text": "Unused endpoint: GET /quotes/:id"}, "fullDescription": {"text": "`artifacts/api-server/src/routes/quotes.ts` declares `GET /quotes/:id` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-f84145a647efe83d", "name": "Unused endpoint: PUT /quotes/:id", "shortDescription": {"text": "Unused endpoint: PUT /quotes/:id"}, "fullDescription": {"text": "`artifacts/api-server/src/routes/quotes.ts` declares `PUT /quotes/:id` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-47612a7b6488e3aa", "name": "Unused endpoint: DELETE /quotes/:id", "shortDescription": {"text": "Unused endpoint: DELETE /quotes/:id"}, "fullDescription": {"text": "`artifacts/api-server/src/routes/quotes.ts` declares `DELETE /quotes/:id` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-dc00132a6a0ccb38", "name": "Unused endpoint: POST /quotes/:id/convert-to-booking", "shortDescription": {"text": "Unused endpoint: POST /quotes/:id/convert-to-booking"}, "fullDescription": {"text": "`artifacts/api-server/src/routes/quotes.ts` declares `POST /quotes/:id/convert-to-booking` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}]}}, "automationDetails": {"id": "repobility/21603"}, "properties": {"repository": "tranchistudio-sys/studio", "repoUrl": "https://github.com/tranchistudio-sys/studio", "branch": "main"}, "results": [{"ruleId": "scanner-b0be63b6fa55b622", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/src/seed-attendance-demo.ts:68"}, "properties": {"repobilityId": "d46b711b13df3e8d", "scanner": "scanner-primary", "fingerprint": "b0be63b6fa55b622", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-dd446cf1f7942ae6", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/src/hello.ts:1"}, "properties": {"repobilityId": "8a8876b1127e88ce", "scanner": "scanner-primary", "fingerprint": "dd446cf1f7942ae6", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-06cd3a21cbafb2ef", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/src/seed-fb-inbox.ts:114"}, "properties": {"repobilityId": "316aaa2543ebbb09", "scanner": "scanner-primary", "fingerprint": "06cd3a21cbafb2ef", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-ae502e197d3b3d24", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 lib/object-storage-web/src/use-upload.ts:35"}, "properties": {"repobilityId": "224b8824b6cc8243", "scanner": "scanner-primary", "fingerprint": "ae502e197d3b3d24", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-2427540219b0cf41", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 lib/db/src/seed.ts:10"}, "properties": {"repobilityId": "a76903dad941c0d1", "scanner": "scanner-primary", "fingerprint": "2427540219b0cf41", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-15e23468dfa74e7b", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 lib/db/src/seed-customers.ts:5"}, "properties": {"repobilityId": "05979483937d46e2", "scanner": "scanner-primary", "fingerprint": "15e23468dfa74e7b", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-69a4417e8ca064b0", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 artifacts/mockup-sandbox/src/components/ui/chart.tsx:78"}, "properties": {"repobilityId": "5e73f33ec5db7797", "scanner": "scanner-primary", "fingerprint": "69a4417e8ca064b0", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-d2afd186ffa7dba2", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 artifacts/api-server/scripts/test-claude-sale.ts:117"}, "properties": {"repobilityId": "ad5932e19feb4e44", "scanner": "scanner-primary", "fingerprint": "d2afd186ffa7dba2", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-9af9fa32844fe218", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 artifacts/api-server/src/migrations.ts:820"}, "properties": {"repobilityId": "2d4eb91c1732636f", "scanner": "scanner-primary", "fingerprint": "9af9fa32844fe218", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-dd74648e42a342ea", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 artifacts/api-server/src/follow-up-scheduler.ts:98"}, "properties": {"repobilityId": "c17c4c9ee25707a6", "scanner": "scanner-primary", "fingerprint": "dd74648e42a342ea", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-e5db528cd20e0503", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 artifacts/api-server/src/test-follow-up-scheduler.ts:72"}, "properties": {"repobilityId": "d4aabed3539a447e", "scanner": "scanner-primary", "fingerprint": "e5db528cd20e0503", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-d1f43301c907bb5f", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 artifacts/api-server/src/lib/autopost-schema.ts:109"}, "properties": {"repobilityId": "3aaf2467cac44903", "scanner": "scanner-primary", "fingerprint": "d1f43301c907bb5f", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-a50ebbc6d1a0d82c", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 artifacts/api-server/src/lib/sale-context.ts:125"}, "properties": {"repobilityId": "5407db7913bd30b5", "scanner": "scanner-primary", "fingerprint": "a50ebbc6d1a0d82c", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-39a4dd613832b849", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 artifacts/api-server/src/lib/ai-orchestrator.ts:249"}, "properties": {"repobilityId": "9fb92c8918240aba", "scanner": "scanner-primary", "fingerprint": "39a4dd613832b849", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-6fa3759e19c9a5dd", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 artifacts/api-server/src/routes/auth.ts:22"}, "properties": {"repobilityId": "c95bfe230a865603", "scanner": "scanner-primary", "fingerprint": "6fa3759e19c9a5dd", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-1cc4968826b141eb", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 artifacts/api-server/src/routes/ai-test.ts:480"}, "properties": {"repobilityId": "3ef78bd8c3a9ffcf", "scanner": "scanner-primary", "fingerprint": "1cc4968826b141eb", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-066612bc1f2f58cb", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 artifacts/api-server/src/routes/ai-scripts.ts:225"}, "properties": {"repobilityId": "8ca251c49bb87270", "scanner": "scanner-primary", "fingerprint": "066612bc1f2f58cb", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-43d724368fe7a590", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 artifacts/api-server/src/routes/web-push.ts:16"}, "properties": {"repobilityId": "b48d70898ce135f9", "scanner": "scanner-primary", "fingerprint": "43d724368fe7a590", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-fc13201646bd88a2", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 artifacts/api-server/src/routes/wedding-cards.ts:151"}, "properties": {"repobilityId": "c6c57fbe4abc8064", "scanner": "scanner-primary", "fingerprint": "fc13201646bd88a2", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-f8228dd5101ee6fd", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 artifacts/api-server/src/routes/ai-engine.ts:511"}, "properties": {"repobilityId": "17ac7fc284b5c3d3", "scanner": "scanner-primary", "fingerprint": "f8228dd5101ee6fd", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-e5665d0f0654f009", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 artifacts/api-server/src/routes/pricing.ts:366"}, "properties": {"repobilityId": "c6c3eff5c09019b4", "scanner": "scanner-primary", "fingerprint": "e5665d0f0654f009", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-621ae47ee16b6560", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 artifacts/api-server/src/routes/cms.ts:185"}, "properties": {"repobilityId": "84bab79c529d3d03", "scanner": "scanner-primary", "fingerprint": "621ae47ee16b6560", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-e2d650b3c85f7e01", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 artifacts/api-server/src/routes/fb-inbox.ts:161"}, "properties": {"repobilityId": "464db3bb2213bef8", "scanner": "scanner-primary", "fingerprint": "e2d650b3c85f7e01", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-30ab77c725550b11", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 artifacts/api-server/src/routes/webhook-facebook.ts:61"}, "properties": {"repobilityId": "f0ded9e932c06095", "scanner": "scanner-primary", "fingerprint": "30ab77c725550b11", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-4cbff9a0fb2c02b9", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 artifacts/amazing-studio/src/components/public-ai-advisor.tsx:431"}, "properties": {"repobilityId": "3780b750d5e6dcdb", "scanner": "scanner-primary", "fingerprint": "4cbff9a0fb2c02b9", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-2cdedd3b2a994275", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 artifacts/amazing-studio/src/components/UploadQueueIndicator.tsx:44"}, "properties": {"repobilityId": "916e79a1aa94b987", "scanner": "scanner-primary", "fingerprint": "2cdedd3b2a994275", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-5d75d83e1e357e10", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 artifacts/amazing-studio/src/components/outfit-booking-section.tsx:577"}, "properties": {"repobilityId": "27567df8ddb7435c", "scanner": "scanner-primary", "fingerprint": "5d75d83e1e357e10", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-bff3723a9655246a", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 artifacts/amazing-studio/src/components/staff-assignment-editor.tsx:425"}, "properties": {"repobilityId": "5ff6f32c6aa073a6", "scanner": "scanner-primary", "fingerprint": "bff3723a9655246a", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-60c65c1982de65d5", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 artifacts/amazing-studio/src/components/layout.tsx:236"}, "properties": {"repobilityId": "e9f458f18d947458", "scanner": "scanner-primary", "fingerprint": "60c65c1982de65d5", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-a284394b10b0f295", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 artifacts/amazing-studio/src/components/cms-shared.tsx:146"}, "properties": {"repobilityId": "ecb2ad22070da747", "scanner": "scanner-primary", "fingerprint": "a284394b10b0f295", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-31d3b2ac66e5ef5d", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 artifacts/amazing-studio/src/components/SmartSearch.tsx:123"}, "properties": {"repobilityId": "751393c2c0809474", "scanner": "scanner-primary", "fingerprint": "31d3b2ac66e5ef5d", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-eba1903dd1192151", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 artifacts/amazing-studio/src/components/ui/chart.tsx:79"}, "properties": {"repobilityId": "9dac494ee357fc30", "scanner": "scanner-primary", "fingerprint": "eba1903dd1192151", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-cdc21ab88a56daea", "level": "note", "message": {"text": "\"active\" state uses light bg in a dark theme \u2014 artifacts/amazing-studio/src/components/public/PublicHero.tsx:139"}, "properties": {"repobilityId": "900b4ed9bc72e383", "scanner": "scanner-primary", "fingerprint": "cdc21ab88a56daea", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.active-light-bg"]}}, {"ruleId": "scanner-c8a9d4a93ba01dcd", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 artifacts/amazing-studio/src/lib/push-notifications.ts:14"}, "properties": {"repobilityId": "0a3d6f1182d005e8", "scanner": "scanner-primary", "fingerprint": "c8a9d4a93ba01dcd", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-9c1169039a8d51e6", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 artifacts/amazing-studio/src/pages/tasks.tsx:767"}, "properties": {"repobilityId": "3dc42a3c5d682b8d", "scanner": "scanner-primary", "fingerprint": "9c1169039a8d51e6", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-d321280e4c3eeef8", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 artifacts/amazing-studio/src/pages/settings.tsx:242"}, "properties": {"repobilityId": "f2dbfc4da58e896c", "scanner": "scanner-primary", "fingerprint": "d321280e4c3eeef8", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-0673bde7546f36cf", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 artifacts/amazing-studio/src/pages/claude-sale-reengage.tsx:120"}, "properties": {"repobilityId": "475695037c82553a", "scanner": "scanner-primary", "fingerprint": "0673bde7546f36cf", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-ca1bb253a34b5ff1", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 artifacts/amazing-studio/src/pages/calendar.tsx:550"}, "properties": {"repobilityId": "0af2d7162389bde7", "scanner": "scanner-primary", "fingerprint": "ca1bb253a34b5ff1", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-b4b945bab677f0c4", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 artifacts/amazing-studio/src/pages/calendar.tsx:5503"}, "properties": {"repobilityId": "bb0b4cdecfe7a11c", "scanner": "scanner-primary", "fingerprint": "b4b945bab677f0c4", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-1b9235023a35a1b6", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 artifacts/amazing-studio/src/pages/services.tsx:253"}, "properties": {"repobilityId": "2e84b4bb87e4969d", "scanner": "scanner-primary", "fingerprint": "1b9235023a35a1b6", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-8ec51606fe7466de", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 artifacts/amazing-studio/src/pages/claude-sale-monitor.tsx:151"}, "properties": {"repobilityId": "ce93c9cf6a02e07d", "scanner": "scanner-primary", "fingerprint": "8ec51606fe7466de", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-7d5d078f7ccae53d", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 artifacts/amazing-studio/src/pages/payments.tsx:296"}, "properties": {"repobilityId": "dfb1702bf1103ac5", "scanner": "scanner-primary", "fingerprint": "7d5d078f7ccae53d", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-351ff2ab9f1324d2", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 artifacts/amazing-studio/src/pages/claude-sale-test.tsx:150"}, "properties": {"repobilityId": "e8b43ef434113c74", "scanner": "scanner-primary", "fingerprint": "351ff2ab9f1324d2", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-17e2b6f1539f55d8", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 artifacts/amazing-studio/src/pages/photoshop-jobs.tsx:494"}, "properties": {"repobilityId": "b3c9ac17aace36fe", "scanner": "scanner-primary", "fingerprint": "17e2b6f1539f55d8", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-34064e7a1fd9af63", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 artifacts/amazing-studio/src/pages/facebook-inbox-ai.tsx:285"}, "properties": {"repobilityId": "46d2929cb88ae555", "scanner": "scanner-primary", "fingerprint": "34064e7a1fd9af63", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-29d43217192732b4", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 artifacts/amazing-studio/src/pages/bookings.tsx:363"}, "properties": {"repobilityId": "2f879b1a34a8be8b", "scanner": "scanner-primary", "fingerprint": "29d43217192732b4", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-1561e5902f438564", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 artifacts/amazing-studio/src/pages/my-profile.tsx:281"}, "properties": {"repobilityId": "d9e61f99e782cd65", "scanner": "scanner-primary", "fingerprint": "1561e5902f438564", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-d4f0b9a4464d9b7c", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 artifacts/amazing-studio/src/pages/dashboard.tsx:652"}, "properties": {"repobilityId": "e62522ebe91f2a23", "scanner": "scanner-primary", "fingerprint": "d4f0b9a4464d9b7c", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-909e3ff962dfff1c", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 artifacts/amazing-studio/src/pages/service-detail.tsx:45"}, "properties": {"repobilityId": "d25eb6297fec8dfd", "scanner": "scanner-primary", "fingerprint": "909e3ff962dfff1c", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-23fe5c6441648201", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 artifacts/amazing-studio/src/pages/internal-comms.tsx:257"}, "properties": {"repobilityId": "3a0c04324c4ebc22", "scanner": "scanner-primary", "fingerprint": "23fe5c6441648201", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-3bd041ad23c35237", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 artifacts/amazing-studio/src/pages/pricing.tsx:510"}, "properties": {"repobilityId": "93b97754b1297915", "scanner": "scanner-primary", "fingerprint": "3bd041ad23c35237", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-cdedfaa1eb6586ea", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 artifacts/amazing-studio/src/pages/staff.tsx:176"}, "properties": {"repobilityId": "996ccf58e6a89ac8", "scanner": "scanner-primary", "fingerprint": "cdedfaa1eb6586ea", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-991da6a55caaefb5", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 artifacts/amazing-studio/src/pages/quotes.tsx:573"}, "properties": {"repobilityId": "a1e3d5adfe4ba3aa", "scanner": "scanner-primary", "fingerprint": "991da6a55caaefb5", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-22748b44abd4c543", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 artifacts/amazing-studio/src/pages/crm-leads.tsx:361"}, "properties": {"repobilityId": "499d7eb9968c548d", "scanner": "scanner-primary", "fingerprint": "22748b44abd4c543", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-9aaf995bc0e05ece", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 artifacts/amazing-studio/src/pages/attendance.tsx:1001"}, "properties": {"repobilityId": "6b1201d5232b8042", "scanner": "scanner-primary", "fingerprint": "9aaf995bc0e05ece", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-d7fa7e02bcab7dc1", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 artifacts/amazing-studio/src/pages/ai-test-room.tsx:881"}, "properties": {"repobilityId": "8b11457a942c5672", "scanner": "scanner-primary", "fingerprint": "d7fa7e02bcab7dc1", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-7cce97a3c365b26f", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 artifacts/amazing-studio/src/pages/ai-test-room.tsx:405"}, "properties": {"repobilityId": "b75d5ec4deb835a1", "scanner": "scanner-primary", "fingerprint": "7cce97a3c365b26f", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-7299ff384b2ee157", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 artifacts/amazing-studio/src/pages/staff-profile.tsx:844"}, "properties": {"repobilityId": "a779860506761445", "scanner": "scanner-primary", "fingerprint": "7299ff384b2ee157", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-81078a4f1ea08750", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 artifacts/amazing-studio/src/pages/dresses.tsx:303"}, "properties": {"repobilityId": "8870a75bb79fe66a", "scanner": "scanner-primary", "fingerprint": "81078a4f1ea08750", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-35e061f6a95f950a", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 artifacts/amazing-studio/src/pages/sale-learning.tsx:170"}, "properties": {"repobilityId": "a9e0155ef6f638e3", "scanner": "scanner-primary", "fingerprint": "35e061f6a95f950a", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-b9816e8cc58ec6b2", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 artifacts/amazing-studio/src/pages/expenses.tsx:593"}, "properties": {"repobilityId": "f90d83d52a912ede", "scanner": "scanner-primary", "fingerprint": "b9816e8cc58ec6b2", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-29ca05f1c7e40756", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 artifacts/amazing-studio/src/pages/customers.tsx:430"}, "properties": {"repobilityId": "3fe8259223c18361", "scanner": "scanner-primary", "fingerprint": "29ca05f1c7e40756", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-41876394fbc193e0", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 artifacts/amazing-studio/src/pages/cms/pricing-public.tsx:110"}, "properties": {"repobilityId": "02bf08beb42a2689", "scanner": "scanner-primary", "fingerprint": "41876394fbc193e0", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-1bb8353614f03e4d", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 artifacts/amazing-studio/src/pages/cms/trash.tsx:161"}, "properties": {"repobilityId": "06c7087622de18f5", "scanner": "scanner-primary", "fingerprint": "1bb8353614f03e4d", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-3f4bb78bfc0f4045", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 artifacts/amazing-studio/src/pages/cms/products-rental.tsx:206"}, "properties": {"repobilityId": "437ef5a5de9bef14", "scanner": "scanner-primary", "fingerprint": "3f4bb78bfc0f4045", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-be20b5f01f762ba3", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 artifacts/amazing-studio/src/pages/cms/photo-ideas.tsx:274"}, "properties": {"repobilityId": "0f218ccc5fb72d97", "scanner": "scanner-primary", "fingerprint": "be20b5f01f762ba3", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-d6ab9a9e86dc63f1", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 artifacts/amazing-studio/src/pages/cms/categories.tsx:435"}, "properties": {"repobilityId": "a676c0511d807a39", "scanner": "scanner-primary", "fingerprint": "d6ab9a9e86dc63f1", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-8b56044e0de86777", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 artifacts/amazing-studio/src/pages/cms/gallery.tsx:109"}, "properties": {"repobilityId": "5fbdc9aed220aaee", "scanner": "scanner-primary", "fingerprint": "8b56044e0de86777", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-f6b27706062da827", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 artifacts/amazing-studio/src/pages/cms/rental-public.tsx:107"}, "properties": {"repobilityId": "a4d52ef606191d8c", "scanner": "scanner-primary", "fingerprint": "f6b27706062da827", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-2243b14e52ec8513", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 artifacts/amazing-studio/src/pages/public/gallery-detail.tsx:224"}, "properties": {"repobilityId": "d775c295cc6bacb5", "scanner": "scanner-primary", "fingerprint": "2243b14e52ec8513", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-14331958323e071f", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 artifacts/amazing-studio/src/pages/public/contact.tsx:144"}, "properties": {"repobilityId": "3428ce906aefd3c0", "scanner": "scanner-primary", "fingerprint": "14331958323e071f", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-abd6377e45fd2bfd", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 artifacts/amazing-studio/src/pages/public/wedding-cards-create.tsx:243"}, "properties": {"repobilityId": "680e855723fb80c1", "scanner": "scanner-primary", "fingerprint": "abd6377e45fd2bfd", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-3867b248564ebfaa", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 artifacts/amazing-studio/src/pages/public/rental-detail.tsx:281"}, "properties": {"repobilityId": "b947f8aea94e115d", "scanner": "scanner-primary", "fingerprint": "3867b248564ebfaa", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-e8dd3bf42ace0bc2", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 artifacts/amazing-studio/src/pages/public/rental-public.tsx:1029"}, "properties": {"repobilityId": "ed591e4dbd96dfbd", "scanner": "scanner-primary", "fingerprint": "e8dd3bf42ace0bc2", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-db1f92d77cbc6d1d", "level": "warning", "message": {"text": "Insecure pattern 'node_child_process' in run_all.cjs:3"}, "properties": {"repobilityId": "58bd679dfb5c5044", "scanner": "scanner-primary", "fingerprint": "db1f92d77cbc6d1d", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "node_child_process"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "run_all.cjs"}, "region": {"startLine": 3}}}]}, {"ruleId": "scanner-3745f6da5336d09a", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in artifacts/mockup-sandbox/src/components/ui/chart.tsx:78"}, "properties": {"repobilityId": "ac72f3f576911974", "scanner": "scanner-primary", "fingerprint": "3745f6da5336d09a", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "artifacts/mockup-sandbox/src/components/ui/chart.tsx"}, "region": {"startLine": 78}}}]}, {"ruleId": "scanner-6fc5ff5f21852ce1", "level": "warning", "message": {"text": "Insecure pattern 'cors_wildcard' in artifacts/api-server/src/app.ts:34"}, "properties": {"repobilityId": "9661a72d8c5f8b98", "scanner": "scanner-primary", "fingerprint": "6fc5ff5f21852ce1", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "cors_wildcard"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "artifacts/api-server/src/app.ts"}, "region": {"startLine": 34}}}]}, {"ruleId": "scanner-11c396b26a1a985e", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in artifacts/api-server/src/routes/contracts.ts:284"}, "properties": {"repobilityId": "957e65fdae1cda37", "scanner": "scanner-primary", "fingerprint": "11c396b26a1a985e", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "artifacts/api-server/src/routes/contracts.ts"}, "region": {"startLine": 284}}}]}, {"ruleId": "scanner-3d0adea29eb3927c", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in artifacts/amazing-studio/src/components/ui/chart.tsx:79"}, "properties": {"repobilityId": "ad7967da0badb40e", "scanner": "scanner-primary", "fingerprint": "3d0adea29eb3927c", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "artifacts/amazing-studio/src/components/ui/chart.tsx"}, "region": {"startLine": 79}}}]}, {"ruleId": "scanner-018cd81f784cd402", "level": "note", "message": {"text": "Insecure pattern 'document_write' in artifacts/amazing-studio/src/pages/calendar.tsx:3311"}, "properties": {"repobilityId": "7e3cea882ab9f1c4", "scanner": "scanner-primary", "fingerprint": "018cd81f784cd402", "layer": "security", "severity": "low", "confidence": 1.0, "tags": ["owasp", "document_write"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "artifacts/amazing-studio/src/pages/calendar.tsx"}, "region": {"startLine": 3311}}}]}, {"ruleId": "scanner-decb0429fc6e63f2", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in artifacts/amazing-studio/src/pages/calendar.tsx:2612"}, "properties": {"repobilityId": "0231331a8b28b21d", "scanner": "scanner-primary", "fingerprint": "decb0429fc6e63f2", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "artifacts/amazing-studio/src/pages/calendar.tsx"}, "region": {"startLine": 2612}}}]}, {"ruleId": "scanner-35f9a62df710fdff", "level": "note", "message": {"text": "Insecure pattern 'document_write' in artifacts/amazing-studio/src/pages/contracts.tsx:207"}, "properties": {"repobilityId": "3e16a9ca470a40ca", "scanner": "scanner-primary", "fingerprint": "35f9a62df710fdff", "layer": "security", "severity": "low", "confidence": 1.0, "tags": ["owasp", "document_write"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "artifacts/amazing-studio/src/pages/contracts.tsx"}, "region": {"startLine": 207}}}]}, {"ruleId": "scanner-64c72fd2bfb60d3a", "level": "note", "message": {"text": "Insecure pattern 'document_write' in artifacts/amazing-studio/src/pages/ai-test-room.tsx:755"}, "properties": {"repobilityId": "b1622efd57d3d4cc", "scanner": "scanner-primary", "fingerprint": "64c72fd2bfb60d3a", "layer": "security", "severity": "low", "confidence": 1.0, "tags": ["owasp", "document_write"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "artifacts/amazing-studio/src/pages/ai-test-room.tsx"}, "region": {"startLine": 755}}}]}, {"ruleId": "scanner-994128a3ddea15df", "level": "note", "message": {"text": "Insecure pattern 'document_write' in artifacts/amazing-studio/src/pages/cms/categories.tsx:1640"}, "properties": {"repobilityId": "5c5a8b29a4e12fae", "scanner": "scanner-primary", "fingerprint": "994128a3ddea15df", "layer": "security", "severity": "low", "confidence": 1.0, "tags": ["owasp", "document_write"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "artifacts/amazing-studio/src/pages/cms/categories.tsx"}, "region": {"startLine": 1640}}}]}, {"ruleId": "scanner-cb639d9a10a47b23", "level": "note", "message": {"text": "package.json defines install-time lifecycle scripts"}, "properties": {"repobilityId": "4d02a5c7daed0bc5", "scanner": "scanner-primary", "fingerprint": "cb639d9a10a47b23", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "npm", "install-scripts"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "package.json"}, "region": {"startLine": 1}}}]}, {"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-2ea3c4faec3d60e0", "level": "note", "message": {"text": "Very large file: lib/api-client-react/src/generated/api.ts (3826 lines)"}, "properties": {"repobilityId": "fbf2081f386acd3b", "scanner": "scanner-primary", "fingerprint": "2ea3c4faec3d60e0", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-c68949fa48d75d33", "level": "note", "message": {"text": "Very large file: artifacts/api-server/src/migrations.ts (1096 lines)"}, "properties": {"repobilityId": "32eaa1aa3b5008e8", "scanner": "scanner-primary", "fingerprint": "c68949fa48d75d33", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-9fdb96e95381ca9d", "level": "note", "message": {"text": "Very large file: artifacts/api-server/src/routes/ai-engine.ts (1298 lines)"}, "properties": {"repobilityId": "e00cd60f442215fe", "scanner": "scanner-primary", "fingerprint": "9fdb96e95381ca9d", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-130799b5567b3272", "level": "note", "message": {"text": "Very large file: artifacts/api-server/src/routes/bookings.ts (1588 lines)"}, "properties": {"repobilityId": "a3978c1dcab73754", "scanner": "scanner-primary", "fingerprint": "130799b5567b3272", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-f2f6fbaa4fc23915", "level": "note", "message": {"text": "Very large file: artifacts/api-server/src/routes/attendance.ts (2180 lines)"}, "properties": {"repobilityId": "148ee2402b605662", "scanner": "scanner-primary", "fingerprint": "f2f6fbaa4fc23915", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-932782b0ba97b704", "level": "note", "message": {"text": "Very large file: artifacts/api-server/src/routes/pricing.ts (1233 lines)"}, "properties": {"repobilityId": "e351c2ddb3eca75d", "scanner": "scanner-primary", "fingerprint": "932782b0ba97b704", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-95de1ca011ffb425", "level": "note", "message": {"text": "Very large file: artifacts/api-server/src/routes/photoshop-jobs.ts (1673 lines)"}, "properties": {"repobilityId": "12d9947870fa0e91", "scanner": "scanner-primary", "fingerprint": "95de1ca011ffb425", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-202e088d81c03910", "level": "note", "message": {"text": "Very large file: artifacts/api-server/src/routes/cms.ts (1868 lines)"}, "properties": {"repobilityId": "70c16c8e373e5a25", "scanner": "scanner-primary", "fingerprint": "202e088d81c03910", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-9cdca55f8d0d5e79", "level": "note", "message": {"text": "Very large file: artifacts/api-server/src/routes/fb-inbox.ts (1680 lines)"}, "properties": {"repobilityId": "8e43eea3f3274463", "scanner": "scanner-primary", "fingerprint": "9cdca55f8d0d5e79", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-2415f6f4dbb4b531", "level": "note", "message": {"text": "Very large file: artifacts/amazing-studio/src/pages/calendar.tsx (6893 lines)"}, "properties": {"repobilityId": "0b130ff40cf63e33", "scanner": "scanner-primary", "fingerprint": "2415f6f4dbb4b531", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-01a4e6a292ceacc3", "level": "note", "message": {"text": "Very large file: artifacts/amazing-studio/src/pages/payments.tsx (2789 lines)"}, "properties": {"repobilityId": "67db91f1fd9587cd", "scanner": "scanner-primary", "fingerprint": "01a4e6a292ceacc3", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-e965a0b7cd7e44a7", "level": "note", "message": {"text": "Very large file: artifacts/amazing-studio/src/pages/photoshop-jobs.tsx (1999 lines)"}, "properties": {"repobilityId": "c3b385c8f39f60b6", "scanner": "scanner-primary", "fingerprint": "e965a0b7cd7e44a7", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-69fd4be22b5e2e0f", "level": "note", "message": {"text": "Very large file: artifacts/amazing-studio/src/pages/facebook-inbox-ai.tsx (1306 lines)"}, "properties": {"repobilityId": "2ac4423673e449bc", "scanner": "scanner-primary", "fingerprint": "69fd4be22b5e2e0f", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-4191f8ebde650f5a", "level": "note", "message": {"text": "Very large file: artifacts/amazing-studio/src/pages/bookings.tsx (1619 lines)"}, "properties": {"repobilityId": "3143967578cd6c47", "scanner": "scanner-primary", "fingerprint": "4191f8ebde650f5a", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-093c4265ae5f5cc3", "level": "note", "message": {"text": "Very large file: artifacts/amazing-studio/src/pages/pricing.tsx (1726 lines)"}, "properties": {"repobilityId": "2c78fdaac19ad009", "scanner": "scanner-primary", "fingerprint": "093c4265ae5f5cc3", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-7ea374c61905aa5a", "level": "note", "message": {"text": "Very large file: artifacts/amazing-studio/src/pages/staff.tsx (1832 lines)"}, "properties": {"repobilityId": "f63fa3eb677f68d5", "scanner": "scanner-primary", "fingerprint": "7ea374c61905aa5a", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-295449ac8223f27a", "level": "note", "message": {"text": "Very large file: artifacts/amazing-studio/src/pages/attendance.tsx (4780 lines)"}, "properties": {"repobilityId": "9f9d9f57c956790b", "scanner": "scanner-primary", "fingerprint": "295449ac8223f27a", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-83141295b6288435", "level": "note", "message": {"text": "Very large file: artifacts/amazing-studio/src/pages/revenue.tsx (1215 lines)"}, "properties": {"repobilityId": "36b8266e7d1ec2c8", "scanner": "scanner-primary", "fingerprint": "83141295b6288435", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-ceb8286587cfe4ae", "level": "note", "message": {"text": "Very large file: artifacts/amazing-studio/src/pages/ai-test-room.tsx (1512 lines)"}, "properties": {"repobilityId": "f74228c4f26ba600", "scanner": "scanner-primary", "fingerprint": "ceb8286587cfe4ae", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-879e3ef585171ea2", "level": "note", "message": {"text": "Very large file: artifacts/amazing-studio/src/pages/staff-profile.tsx (2157 lines)"}, "properties": {"repobilityId": "e18d6842f62f3d02", "scanner": "scanner-primary", "fingerprint": "879e3ef585171ea2", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-621e85f93f819a89", "level": "note", "message": {"text": "Very large file: artifacts/amazing-studio/src/pages/ai-sale-scripts.tsx (2107 lines)"}, "properties": {"repobilityId": "d4cac576fd29bea5", "scanner": "scanner-primary", "fingerprint": "621e85f93f819a89", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-fc8d3374dfbb3db4", "level": "note", "message": {"text": "Very large file: artifacts/amazing-studio/src/pages/expenses.tsx (1170 lines)"}, "properties": {"repobilityId": "62107ccb6ccd4a73", "scanner": "scanner-primary", "fingerprint": "fc8d3374dfbb3db4", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-9a8b74621713b20f", "level": "note", "message": {"text": "Very large file: artifacts/amazing-studio/src/pages/cms/products-rental.tsx (1667 lines)"}, "properties": {"repobilityId": "61a64366844b515a", "scanner": "scanner-primary", "fingerprint": "9a8b74621713b20f", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-03c7828032a4dec7", "level": "note", "message": {"text": "Very large file: artifacts/amazing-studio/src/pages/cms/photo-ideas.tsx (1031 lines)"}, "properties": {"repobilityId": "f653bfe09b45739a", "scanner": "scanner-primary", "fingerprint": "03c7828032a4dec7", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-72dd18eec9836a21", "level": "note", "message": {"text": "Very large file: artifacts/amazing-studio/src/pages/cms/categories.tsx (2723 lines)"}, "properties": {"repobilityId": "fa0e95f7689d87b4", "scanner": "scanner-primary", "fingerprint": "72dd18eec9836a21", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-37b7cc81e1d0b762", "level": "note", "message": {"text": "Very large file: artifacts/amazing-studio/src/pages/cms/gallery.tsx (1131 lines)"}, "properties": {"repobilityId": "17ca4c8effbea111", "scanner": "scanner-primary", "fingerprint": "37b7cc81e1d0b762", "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": "73b34dce48790358", "scanner": "scanner-primary", "fingerprint": "141b30a41e03817b", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["license", "repo-hardening", "generated-repo-pattern"]}}, {"ruleId": "scanner-faccb9061e9b52a0", "level": "note", "message": {"text": "No README detected"}, "properties": {"repobilityId": "d20d26a82aa3ef2a", "scanner": "scanner-primary", "fingerprint": "faccb9061e9b52a0", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["docs", "readme", "repo-hardening", "generated-repo-pattern"]}}, {"ruleId": "scanner-3036d70d2146842b", "level": "note", "message": {"text": "Node manifest has dependencies but no lockfile: scripts/package.json"}, "properties": {"repobilityId": "3a2a86cb93b8e276", "scanner": "scanner-primary", "fingerprint": "3036d70d2146842b", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["dependency", "lockfile", "reproducibility", "generated-repo-pattern"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "scripts/package.json"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-2848c575b2bac51a", "level": "note", "message": {"text": "Node manifest has dependencies but no lockfile: lib/object-storage-web/package.json"}, "properties": {"repobilityId": "55a4df799078ecff", "scanner": "scanner-primary", "fingerprint": "2848c575b2bac51a", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["dependency", "lockfile", "reproducibility", "generated-repo-pattern"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "lib/object-storage-web/package.json"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-3b9817ac318b5825", "level": "note", "message": {"text": "Node manifest has dependencies but no lockfile: lib/api-spec/package.json"}, "properties": {"repobilityId": "eda4cc86db8e9149", "scanner": "scanner-primary", "fingerprint": "3b9817ac318b5825", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["dependency", "lockfile", "reproducibility", "generated-repo-pattern"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "lib/api-spec/package.json"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-e17d020eb983b802", "level": "note", "message": {"text": "Node manifest has dependencies but no lockfile: lib/db/package.json"}, "properties": {"repobilityId": "892008a5a207d3f2", "scanner": "scanner-primary", "fingerprint": "e17d020eb983b802", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["dependency", "lockfile", "reproducibility", "generated-repo-pattern"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "lib/db/package.json"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-328a71053c42b16a", "level": "note", "message": {"text": "Node manifest has dependencies but no lockfile: lib/api-zod/package.json"}, "properties": {"repobilityId": "804558e2ccb62729", "scanner": "scanner-primary", "fingerprint": "328a71053c42b16a", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["dependency", "lockfile", "reproducibility", "generated-repo-pattern"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "lib/api-zod/package.json"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-ea221e303761338d", "level": "note", "message": {"text": "Node manifest has dependencies but no lockfile: lib/api-client-react/package.json"}, "properties": {"repobilityId": "2f7f46cc532837f4", "scanner": "scanner-primary", "fingerprint": "ea221e303761338d", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["dependency", "lockfile", "reproducibility", "generated-repo-pattern"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "lib/api-client-react/package.json"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-c5e31b7c75792a1d", "level": "note", "message": {"text": "Node manifest has dependencies but no lockfile: artifacts/mockup-sandbox/package.json"}, "properties": {"repobilityId": "eecd492329e860bc", "scanner": "scanner-primary", "fingerprint": "c5e31b7c75792a1d", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["dependency", "lockfile", "reproducibility", "generated-repo-pattern"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "artifacts/mockup-sandbox/package.json"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-a5f90eaf6e067813", "level": "note", "message": {"text": "Node manifest has dependencies but no lockfile: artifacts/api-server/package.json"}, "properties": {"repobilityId": "acfe01e5eaa91c63", "scanner": "scanner-primary", "fingerprint": "a5f90eaf6e067813", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["dependency", "lockfile", "reproducibility", "generated-repo-pattern"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "artifacts/api-server/package.json"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-29d117820b074bc4", "level": "note", "message": {"text": "Node manifest has dependencies but no lockfile: artifacts/amazing-studio/package.json"}, "properties": {"repobilityId": "f400a101204b241b", "scanner": "scanner-primary", "fingerprint": "29d117820b074bc4", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["dependency", "lockfile", "reproducibility", "generated-repo-pattern"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "artifacts/amazing-studio/package.json"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-3ab5d313dda8e5f9", "level": "note", "message": {"text": "Debug logging residue appears in source files"}, "properties": {"repobilityId": "f166d4d753bf5e6d", "scanner": "scanner-primary", "fingerprint": "3ab5d313dda8e5f9", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["debug", "cleanup", "repo-hardening", "generated-repo-pattern"]}}, {"ruleId": "scanner-72b2a6250083a784", "level": "warning", "message": {"text": "Placeholder or mock-heavy implementation detected"}, "properties": {"repobilityId": "6a0f15eb1090f423", "scanner": "scanner-primary", "fingerprint": "72b2a6250083a784", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["placeholder", "mock-data", "incomplete", "generated-repo-pattern"]}}, {"ruleId": "scanner-9d79c4077342a7d0", "level": "warning", "message": {"text": "Runtime service client appears to use placeholder configuration"}, "properties": {"repobilityId": "97aa070bded6d3d1", "scanner": "scanner-primary", "fingerprint": "9d79c4077342a7d0", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["placeholder", "runtime-config", "service-client", "generated-repo-pattern"]}}, {"ruleId": "scanner-2d0c7b7ab8f8aacf", "level": "warning", "message": {"text": "Critical user flow still appears backed by mock or placeholder data"}, "properties": {"repobilityId": "76c04ab18560b01a", "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": "warning", "message": {"text": "Composite production-readiness gap"}, "properties": {"repobilityId": "ea7c6275d0e7785d", "scanner": "scanner-primary", "fingerprint": "b9088664ace7f748", "layer": "quality", "severity": "medium", "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": "051497aebd7beffe", "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": "b0c4ba9be2ed4a36", "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": "c95ff4dfed9b2799", "scanner": "scanner-primary", "fingerprint": "8424db9c75e04ba4", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["provenance", "git-history", "generated-repo-pattern"]}}, {"ruleId": "scanner-ec2b2369f71cfa9e", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 lib/object-storage-web/src/use-upload.ts:88"}, "properties": {"repobilityId": "0f062dbc447ac075", "scanner": "scanner-primary", "fingerprint": "ec2b2369f71cfa9e", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-524c376cc3dd962a", "level": "none", "message": {"text": "Commented-code block (6 lines) in lib/db/src/schema/staff_payroll.ts:51"}, "properties": {"repobilityId": "21c32703fa0bf0bd", "scanner": "scanner-primary", "fingerprint": "524c376cc3dd962a", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-fb6a17e772119586", "level": "none", "message": {"text": "Commented-code block (6 lines) in lib/api-client-react/src/custom-fetch.ts:111"}, "properties": {"repobilityId": "7315386b9899dfbd", "scanner": "scanner-primary", "fingerprint": "fb6a17e772119586", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-5fa66e8884152aab", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 lib/api-client-react/src/custom-fetch.ts:360"}, "properties": {"repobilityId": "2ba5f8ba9843fcb0", "scanner": "scanner-primary", "fingerprint": "5fa66e8884152aab", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-04fd30fb82b62459", "level": "none", "message": {"text": "Commented-code block (5 lines) in artifacts/api-server/build.mjs:25"}, "properties": {"repobilityId": "8590b310c456e636", "scanner": "scanner-primary", "fingerprint": "04fd30fb82b62459", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-ed5c70bd221581e3", "level": "none", "message": {"text": "Commented-code block (10 lines) in artifacts/api-server/scripts/check-duplicate-functions.mjs:37"}, "properties": {"repobilityId": "66c6d5bb409bc3a9", "scanner": "scanner-primary", "fingerprint": "ed5c70bd221581e3", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-1bfb8bd71f989024", "level": "note", "message": {"text": "Legacy-named symbol `requires_post_production_seeded_v1` in artifacts/api-server/src/migrations.ts:613"}, "properties": {"repobilityId": "52e864d6c7dc5320", "scanner": "scanner-primary", "fingerprint": "1bfb8bd71f989024", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-fc2d072b00b5f21d", "level": "none", "message": {"text": "Commented-code block (5 lines) in artifacts/api-server/src/migrations.ts:693"}, "properties": {"repobilityId": "4a10e5d5b0c84154", "scanner": "scanner-primary", "fingerprint": "fc2d072b00b5f21d", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-965a36871c566a98", "level": "none", "message": {"text": "Commented-code block (6 lines) in artifacts/api-server/src/follow-up-scheduler.ts:207"}, "properties": {"repobilityId": "dec488656e8fccff", "scanner": "scanner-primary", "fingerprint": "965a36871c566a98", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-5a01d7c02b45c1b4", "level": "none", "message": {"text": "Commented-code block (10 lines) in artifacts/api-server/src/lib/overtime.ts:1"}, "properties": {"repobilityId": "965df4d3019adc08", "scanner": "scanner-primary", "fingerprint": "5a01d7c02b45c1b4", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-e9d4a034ddb16169", "level": "none", "message": {"text": "Commented-code block (6 lines) in artifacts/api-server/src/lib/objectAcl.ts:7"}, "properties": {"repobilityId": "3c512e1cb325b588", "scanner": "scanner-primary", "fingerprint": "e9d4a034ddb16169", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-af7bf7c4c39c4276", "level": "none", "message": {"text": "Commented-code block (6 lines) in artifacts/api-server/src/routes/revenue.ts:1"}, "properties": {"repobilityId": "14882773b80a5e4e", "scanner": "scanner-primary", "fingerprint": "af7bf7c4c39c4276", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-de29ec08db5a8059", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 artifacts/api-server/src/routes/revenue.integration.test.ts:112"}, "properties": {"repobilityId": "19fb3d30b4860cf8", "scanner": "scanner-primary", "fingerprint": "de29ec08db5a8059", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-974320f4131f13b1", "level": "none", "message": {"text": "Commented-code block (8 lines) in artifacts/api-server/src/routes/storage.ts:170"}, "properties": {"repobilityId": "ccf3d4f64ad930b8", "scanner": "scanner-primary", "fingerprint": "974320f4131f13b1", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-e236fe843a41ce25", "level": "none", "message": {"text": "Commented-code block (9 lines) in artifacts/api-server/src/routes/notifications.ts:374"}, "properties": {"repobilityId": "15ab27d0833cf117", "scanner": "scanner-primary", "fingerprint": "e236fe843a41ce25", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-b4e5c76f5c9a5511", "level": "none", "message": {"text": "Commented-code block (6 lines) in artifacts/api-server/src/routes/ai-engine.ts:752"}, "properties": {"repobilityId": "de1baaf867dd1acf", "scanner": "scanner-primary", "fingerprint": "b4e5c76f5c9a5511", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-997d766476b06a3a", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 artifacts/api-server/src/routes/ai-engine.ts:674"}, "properties": {"repobilityId": "db24404ca1f37859", "scanner": "scanner-primary", "fingerprint": "997d766476b06a3a", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-dea152a9e4d046ae", "level": "none", "message": {"text": "Commented-code block (5 lines) in artifacts/api-server/src/routes/bookings.ts:963"}, "properties": {"repobilityId": "22968db128665b48", "scanner": "scanner-primary", "fingerprint": "dea152a9e4d046ae", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-f5cda65360beb4f8", "level": "none", "message": {"text": "Commented-code block (5 lines) in artifacts/api-server/src/routes/attendance.ts:277"}, "properties": {"repobilityId": "97320233ad91acf0", "scanner": "scanner-primary", "fingerprint": "f5cda65360beb4f8", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-16cfdbe54781d9a2", "level": "none", "message": {"text": "Commented-code block (5 lines) in artifacts/api-server/src/routes/golden-hour.ts:5"}, "properties": {"repobilityId": "a174e16758c41fb0", "scanner": "scanner-primary", "fingerprint": "16cfdbe54781d9a2", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-210ebc5051354a02", "level": "note", "message": {"text": "Legacy-named symbol `exOld` in artifacts/api-server/src/routes/pricing.ts:614"}, "properties": {"repobilityId": "e2b885ea48f6ea79", "scanner": "scanner-primary", "fingerprint": "210ebc5051354a02", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-3229e2fcee9e3bcf", "level": "none", "message": {"text": "Commented-code block (9 lines) in artifacts/api-server/src/routes/photoshop-jobs.ts:212"}, "properties": {"repobilityId": "d9cf097031b7f7aa", "scanner": "scanner-primary", "fingerprint": "3229e2fcee9e3bcf", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-7b6408ac5e05affa", "level": "none", "message": {"text": "Commented-code block (5 lines) in artifacts/api-server/src/routes/payments.ts:315"}, "properties": {"repobilityId": "1694225edb84f35c", "scanner": "scanner-primary", "fingerprint": "7b6408ac5e05affa", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-6acb3f37f4e47010", "level": "none", "message": {"text": "Commented-code block (5 lines) in artifacts/api-server/src/routes/cms.ts:599"}, "properties": {"repobilityId": "7de1fcddeba4ad72", "scanner": "scanner-primary", "fingerprint": "6acb3f37f4e47010", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-5691a8629ee727cf", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 artifacts/api-server/src/routes/fb-inbox.ts:194"}, "properties": {"repobilityId": "fd3004b192552b03", "scanner": "scanner-primary", "fingerprint": "5691a8629ee727cf", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-a8d2081d7f50ad65", "level": "none", "message": {"text": "Commented-code block (6 lines) in artifacts/api-server/src/routes/staff-commissions.ts:9"}, "properties": {"repobilityId": "a1f59e33d5956e9c", "scanner": "scanner-primary", "fingerprint": "a8d2081d7f50ad65", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-c355971bffab93cf", "level": "none", "message": {"text": "Commented-code block (6 lines) in artifacts/api-server/src/routes/revenue/monthly.ts:96"}, "properties": {"repobilityId": "2e9efd3333f5585c", "scanner": "scanner-primary", "fingerprint": "c355971bffab93cf", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-b5eb370b74a132da", "level": "note", "message": {"text": "Legacy-named symbol `amazingStudioToken_v2` in artifacts/amazing-studio/src/App.tsx:72"}, "properties": {"repobilityId": "72edf0972b0d379b", "scanner": "scanner-primary", "fingerprint": "b5eb370b74a132da", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-a7d67ff5c76b4431", "level": "note", "message": {"text": "Legacy-named symbol `amazingPhotoIdeasToken_v1` in artifacts/amazing-studio/src/components/public-ai-advisor.tsx:72"}, "properties": {"repobilityId": "ae852ff7d2bdb643", "scanner": "scanner-primary", "fingerprint": "a7d67ff5c76b4431", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-18586ac9dd998d7e", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 artifacts/amazing-studio/src/components/public-ai-advisor.tsx:194"}, "properties": {"repobilityId": "429966a9b1080c78", "scanner": "scanner-primary", "fingerprint": "18586ac9dd998d7e", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-e11aefbf6f18179d", "level": "note", "message": {"text": "Legacy-named symbol `amazingStudioToken_v2` in artifacts/amazing-studio/src/components/outfit-booking-section.tsx:92"}, "properties": {"repobilityId": "01d71004579eb04b", "scanner": "scanner-primary", "fingerprint": "e11aefbf6f18179d", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-2e647537adf4d681", "level": "note", "message": {"text": "Legacy-named symbol `amazingStudioToken_v2` in artifacts/amazing-studio/src/components/staff-assignment-editor.tsx:18"}, "properties": {"repobilityId": "61f203bdb77da285", "scanner": "scanner-primary", "fingerprint": "2e647537adf4d681", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-405a6f74adee8128", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 artifacts/amazing-studio/src/components/staff-assignment-editor.tsx:19"}, "properties": {"repobilityId": "2e5beeb8461db25f", "scanner": "scanner-primary", "fingerprint": "405a6f74adee8128", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-c1965f6dd5ee2030", "level": "note", "message": {"text": "Legacy-named symbol `amazingStudioToken_v2` in artifacts/amazing-studio/src/components/layout.tsx:116"}, "properties": {"repobilityId": "1dc972c2b0592e50", "scanner": "scanner-primary", "fingerprint": "c1965f6dd5ee2030", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-36aeb465bbde93ec", "level": "none", "message": {"text": "Commented-code block (5 lines) in artifacts/amazing-studio/src/components/layout.tsx:61"}, "properties": {"repobilityId": "f8234a506bd7babb", "scanner": "scanner-primary", "fingerprint": "36aeb465bbde93ec", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-34d7d757687347d4", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 artifacts/amazing-studio/src/components/layout.tsx:117"}, "properties": {"repobilityId": "87b56ba74a441e1c", "scanner": "scanner-primary", "fingerprint": "34d7d757687347d4", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-7c3dd74b112f5dd9", "level": "note", "message": {"text": "Legacy-named symbol `amazingStudioToken_v2` in artifacts/amazing-studio/src/components/StaffSalaryPanel.tsx:18"}, "properties": {"repobilityId": "81ccae80a5d646e0", "scanner": "scanner-primary", "fingerprint": "7c3dd74b112f5dd9", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-24eab2794161f0ea", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 artifacts/amazing-studio/src/components/StaffSalaryPanel.tsx:22"}, "properties": {"repobilityId": "240d5761f7fe3152", "scanner": "scanner-primary", "fingerprint": "24eab2794161f0ea", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-97360ca73b0b189d", "level": "note", "message": {"text": "Legacy-named symbol `amazingStudioToken_v2` in artifacts/amazing-studio/src/components/cms-shared.tsx:12"}, "properties": {"repobilityId": "6a728ac3c30291b8", "scanner": "scanner-primary", "fingerprint": "97360ca73b0b189d", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-1e812e45bf43a5e0", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 artifacts/amazing-studio/src/components/SmartSearch.tsx:57"}, "properties": {"repobilityId": "0250a23b3aa17cb3", "scanner": "scanner-primary", "fingerprint": "1e812e45bf43a5e0", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-4f078c0cb595d3d6", "level": "note", "message": {"text": "Legacy-named symbol `amazingStudioToken_v2` in artifacts/amazing-studio/src/components/golden-hour-admin.tsx:7"}, "properties": {"repobilityId": "a20e9966c6cb50bf", "scanner": "scanner-primary", "fingerprint": "4f078c0cb595d3d6", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-70c19f83ad082eb1", "level": "note", "message": {"text": "Legacy-named symbol `amazingStudioToken_v2` in artifacts/amazing-studio/src/contexts/StaffAuthContext.tsx:50"}, "properties": {"repobilityId": "c0398a71b7e44757", "scanner": "scanner-primary", "fingerprint": "70c19f83ad082eb1", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-225a034f6462b57b", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 artifacts/amazing-studio/src/contexts/StaffAuthContext.tsx:82"}, "properties": {"repobilityId": "f84da338045c4c98", "scanner": "scanner-primary", "fingerprint": "225a034f6462b57b", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-f0d67a78d42a9906", "level": "note", "message": {"text": "Legacy-named symbol `amazingStudioToken_v2` in artifacts/amazing-studio/src/lib/image-upload.ts:6"}, "properties": {"repobilityId": "cff9441aaf8c701a", "scanner": "scanner-primary", "fingerprint": "f0d67a78d42a9906", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-2b950c2c9bd97dec", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 artifacts/amazing-studio/src/lib/image-upload.ts:53"}, "properties": {"repobilityId": "08c939658a00da47", "scanner": "scanner-primary", "fingerprint": "2b950c2c9bd97dec", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-c7cb5304f0b0f01e", "level": "note", "message": {"text": "Legacy-named symbol `amazingStudioPublicPreview_v1` in artifacts/amazing-studio/src/lib/public-site-url.ts:9"}, "properties": {"repobilityId": "fd65a4121802211b", "scanner": "scanner-primary", "fingerprint": "c7cb5304f0b0f01e", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-149176a50dbb5981", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 artifacts/amazing-studio/src/lib/api-base.ts:2"}, "properties": {"repobilityId": "005064e69950744f", "scanner": "scanner-primary", "fingerprint": "149176a50dbb5981", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-51df9a5a47458e7b", "level": "note", "message": {"text": "Legacy-named symbol `amazingStudioToken_v2` in artifacts/amazing-studio/src/lib/push-notifications.ts:4"}, "properties": {"repobilityId": "9a6403707b68f27d", "scanner": "scanner-primary", "fingerprint": "51df9a5a47458e7b", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-72dd33b525baa38c", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 artifacts/amazing-studio/src/lib/push-notifications.ts:32"}, "properties": {"repobilityId": "0e8ee0f9955c7280", "scanner": "scanner-primary", "fingerprint": "72dd33b525baa38c", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-c507385ec96cb7f2", "level": "note", "message": {"text": "Legacy-named symbol `amazingUploadQueue_v1` in artifacts/amazing-studio/src/lib/upload-queue/store.ts:6"}, "properties": {"repobilityId": "9946de7f82818654", "scanner": "scanner-primary", "fingerprint": "c507385ec96cb7f2", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-fe9ea296c3461334", "level": "note", "message": {"text": "Legacy-named symbol `amazingStudioToken_v2` in artifacts/amazing-studio/src/lib/upload-queue/attach-handlers.ts:5"}, "properties": {"repobilityId": "dacb9230c3ef09f9", "scanner": "scanner-primary", "fingerprint": "fe9ea296c3461334", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-f896aa2136253093", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 artifacts/amazing-studio/src/lib/upload-queue/attach-handlers.ts:29"}, "properties": {"repobilityId": "93e71bd924f94a16", "scanner": "scanner-primary", "fingerprint": "f896aa2136253093", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-546363d8e6856194", "level": "note", "message": {"text": "Legacy-named symbol `amazingStudioToken_v2` in artifacts/amazing-studio/src/pages/tasks.tsx:15"}, "properties": {"repobilityId": "e4aa8daf3d66f630", "scanner": "scanner-primary", "fingerprint": "546363d8e6856194", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-4b1cc99e3a162b30", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 artifacts/amazing-studio/src/pages/tasks.tsx:18"}, "properties": {"repobilityId": "b575c4b9fcbd36e3", "scanner": "scanner-primary", "fingerprint": "4b1cc99e3a162b30", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-1e67e90b3c3b21cb", "level": "note", "message": {"text": "Legacy-named symbol `amazingStudioToken_v2` in artifacts/amazing-studio/src/pages/settings.tsx:302"}, "properties": {"repobilityId": "fa39e86f7b01b4ff", "scanner": "scanner-primary", "fingerprint": "1e67e90b3c3b21cb", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-2592a72d370756fd", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 artifacts/amazing-studio/src/pages/settings.tsx:324"}, "properties": {"repobilityId": "e82835af5879a1b5", "scanner": "scanner-primary", "fingerprint": "2592a72d370756fd", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-9b587d4d781f5509", "level": "note", "message": {"text": "Legacy-named symbol `amazingStudioToken_v2` in artifacts/amazing-studio/src/pages/claude-sale-reengage.tsx:21"}, "properties": {"repobilityId": "6b2cefa0a66ad317", "scanner": "scanner-primary", "fingerprint": "9b587d4d781f5509", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-da3274de00307e9f", "level": "note", "message": {"text": "Legacy-named symbol `amazingStudioToken_v2` in artifacts/amazing-studio/src/pages/calendar.tsx:48"}, "properties": {"repobilityId": "ccef1ba9e383e0d0", "scanner": "scanner-primary", "fingerprint": "da3274de00307e9f", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-f97fde72e740ee53", "level": "none", "message": {"text": "Commented-code block (6 lines) in artifacts/amazing-studio/src/pages/calendar.tsx:116"}, "properties": {"repobilityId": "61f01c6b7d23db5e", "scanner": "scanner-primary", "fingerprint": "f97fde72e740ee53", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-a64163aa94f00497", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 artifacts/amazing-studio/src/pages/calendar.tsx:50"}, "properties": {"repobilityId": "f9b4e5c9bfe091a7", "scanner": "scanner-primary", "fingerprint": "a64163aa94f00497", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-8498a65742cb742b", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 artifacts/amazing-studio/src/pages/services.tsx:16"}, "properties": {"repobilityId": "6eb5b3af20092d2d", "scanner": "scanner-primary", "fingerprint": "8498a65742cb742b", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-2253400ba4880514", "level": "note", "message": {"text": "Legacy-named symbol `amazingStudioToken_v2` in artifacts/amazing-studio/src/pages/attendance-checkin.tsx:47"}, "properties": {"repobilityId": "259635427efda411", "scanner": "scanner-primary", "fingerprint": "2253400ba4880514", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-5edaa29e1aaecb97", "level": "note", "message": {"text": "Legacy-named symbol `amazingStudioToken_v2` in artifacts/amazing-studio/src/pages/claude-sale-monitor.tsx:24"}, "properties": {"repobilityId": "3edf9f0ab51b4fde", "scanner": "scanner-primary", "fingerprint": "5edaa29e1aaecb97", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-db1f5cfc990a4d9d", "level": "note", "message": {"text": "Legacy-named symbol `amazingStudioToken_v2` in artifacts/amazing-studio/src/pages/payments.tsx:24"}, "properties": {"repobilityId": "e24bcc21ceade7e7", "scanner": "scanner-primary", "fingerprint": "db1f5cfc990a4d9d", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-bb1bd6becbd0e4df", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 artifacts/amazing-studio/src/pages/payments.tsx:42"}, "properties": {"repobilityId": "be1aba3f052491c0", "scanner": "scanner-primary", "fingerprint": "bb1bd6becbd0e4df", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-2cc4324917a8cb42", "level": "note", "message": {"text": "Legacy-named symbol `karuSaleTestHistory_v1` in artifacts/amazing-studio/src/pages/claude-sale-test.tsx:17"}, "properties": {"repobilityId": "209203675045a762", "scanner": "scanner-primary", "fingerprint": "2cc4324917a8cb42", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-8ff2c3f83e4dbca0", "level": "note", "message": {"text": "Legacy-named symbol `amazingStudioToken_v2` in artifacts/amazing-studio/src/pages/accounting-hr.tsx:14"}, "properties": {"repobilityId": "2c3108a22f1a0dd0", "scanner": "scanner-primary", "fingerprint": "8ff2c3f83e4dbca0", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-796ccd389ee49284", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 artifacts/amazing-studio/src/pages/accounting-hr.tsx:70"}, "properties": {"repobilityId": "179f82c8eec1fe60", "scanner": "scanner-primary", "fingerprint": "796ccd389ee49284", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-d8db6b0559597a13", "level": "note", "message": {"text": "Legacy-named symbol `amazingStudioToken_v2` in artifacts/amazing-studio/src/pages/photoshop-jobs.tsx:16"}, "properties": {"repobilityId": "ce204223afbb92d4", "scanner": "scanner-primary", "fingerprint": "d8db6b0559597a13", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-6db8eed1df3bb011", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 artifacts/amazing-studio/src/pages/photoshop-jobs.tsx:22"}, "properties": {"repobilityId": "a69008d4c772336b", "scanner": "scanner-primary", "fingerprint": "6db8eed1df3bb011", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-b1d0f62c485e84af", "level": "note", "message": {"text": "Legacy-named symbol `amazingStudioToken_v2` in artifacts/amazing-studio/src/pages/facebook-inbox-ai.tsx:9"}, "properties": {"repobilityId": "386316409b9920a3", "scanner": "scanner-primary", "fingerprint": "b1d0f62c485e84af", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-4a7cb68929deab1d", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 artifacts/amazing-studio/src/pages/facebook-inbox-ai.tsx:10"}, "properties": {"repobilityId": "3b33731ab4d82055", "scanner": "scanner-primary", "fingerprint": "4a7cb68929deab1d", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-bd38dd162c6b0813", "level": "note", "message": {"text": "Legacy-named symbol `amazingStudioToken_v2` in artifacts/amazing-studio/src/pages/bookings.tsx:109"}, "properties": {"repobilityId": "149d9f120dbc4dee", "scanner": "scanner-primary", "fingerprint": "bd38dd162c6b0813", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-d80382d7172ca221", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 artifacts/amazing-studio/src/pages/bookings.tsx:180"}, "properties": {"repobilityId": "81f85c5ff0dbe995", "scanner": "scanner-primary", "fingerprint": "d80382d7172ca221", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-9e6c53ce5663eaa4", "level": "note", "message": {"text": "Legacy-named symbol `amazingStudioToken_v2` in artifacts/amazing-studio/src/pages/reports.tsx:11"}, "properties": {"repobilityId": "c1bfd638737e9b79", "scanner": "scanner-primary", "fingerprint": "9e6c53ce5663eaa4", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-8a789eeed60bf424", "level": "note", "message": {"text": "Legacy-named symbol `amazingStudioToken_v2` in artifacts/amazing-studio/src/pages/my-profile.tsx:21"}, "properties": {"repobilityId": "91f7cbd1b29ba11c", "scanner": "scanner-primary", "fingerprint": "8a789eeed60bf424", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-9d7b5d6d86b93c6c", "level": "note", "message": {"text": "Legacy-named symbol `amazingStudioToken_v2` in artifacts/amazing-studio/src/pages/dashboard.tsx:99"}, "properties": {"repobilityId": "71df2ecbaeb24e91", "scanner": "scanner-primary", "fingerprint": "9d7b5d6d86b93c6c", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-eeeba800f3816422", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 artifacts/amazing-studio/src/pages/dashboard.tsx:100"}, "properties": {"repobilityId": "c34ee816dbcc7d92", "scanner": "scanner-primary", "fingerprint": "eeeba800f3816422", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-0bf2aadc61d01d9e", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 artifacts/amazing-studio/src/pages/service-detail.tsx:63"}, "properties": {"repobilityId": "f59a122b5898daf8", "scanner": "scanner-primary", "fingerprint": "0bf2aadc61d01d9e", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-e0f0dbea090ddf97", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 artifacts/amazing-studio/src/pages/ai-assistant.tsx:56"}, "properties": {"repobilityId": "d6c27ec79c04f9d8", "scanner": "scanner-primary", "fingerprint": "e0f0dbea090ddf97", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-e9e718e7dbae6332", "level": "note", "message": {"text": "Legacy-named symbol `amazingStudioToken_v2` in artifacts/amazing-studio/src/pages/internal-comms.tsx:14"}, "properties": {"repobilityId": "f7feb33c250a0496", "scanner": "scanner-primary", "fingerprint": "e9e718e7dbae6332", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-aeb91ef85f87f015", "level": "note", "message": {"text": "Legacy-named symbol `amazingStudioToken_v2` in artifacts/amazing-studio/src/pages/pricing.tsx:88"}, "properties": {"repobilityId": "1923cbfa60498240", "scanner": "scanner-primary", "fingerprint": "aeb91ef85f87f015", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-72c1aac50f978c7b", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 artifacts/amazing-studio/src/pages/pricing.tsx:153"}, "properties": {"repobilityId": "7d35e8cbfa772ae2", "scanner": "scanner-primary", "fingerprint": "72c1aac50f978c7b", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-6735a8bd057ed78d", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 artifacts/amazing-studio/src/pages/contracts.tsx:11"}, "properties": {"repobilityId": "a511116ed5deab36", "scanner": "scanner-primary", "fingerprint": "6735a8bd057ed78d", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-36c417c9fe0bfcbf", "level": "note", "message": {"text": "Legacy-named symbol `amazingStudioToken_v2` in artifacts/amazing-studio/src/pages/staff.tsx:23"}, "properties": {"repobilityId": "4b8836c5b07eab7d", "scanner": "scanner-primary", "fingerprint": "36c417c9fe0bfcbf", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-28869d7810c04254", "level": "note", "message": {"text": "Legacy-named symbol `amazingStudioToken_v2` in artifacts/amazing-studio/src/pages/quotes.tsx:24"}, "properties": {"repobilityId": "0fe5a24086bb4e4d", "scanner": "scanner-primary", "fingerprint": "28869d7810c04254", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-f89700def3080d01", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 artifacts/amazing-studio/src/pages/quotes.tsx:27"}, "properties": {"repobilityId": "02ffb26c98f81abc", "scanner": "scanner-primary", "fingerprint": "f89700def3080d01", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-d0b9e8ebfcce0246", "level": "note", "message": {"text": "Legacy-named symbol `amazingStudioToken_v2` in artifacts/amazing-studio/src/pages/claude-sale-settings.tsx:34"}, "properties": {"repobilityId": "960ef0a3de5af1bd", "scanner": "scanner-primary", "fingerprint": "d0b9e8ebfcce0246", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-e4495d05d60f0ba7", "level": "note", "message": {"text": "Legacy-named symbol `amazingStudioToken_v2` in artifacts/amazing-studio/src/pages/crm-leads.tsx:8"}, "properties": {"repobilityId": "df18b7b688dbc216", "scanner": "scanner-primary", "fingerprint": "e4495d05d60f0ba7", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-1a14bbf5e3602d4f", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 artifacts/amazing-studio/src/pages/crm-leads.tsx:10"}, "properties": {"repobilityId": "ba94b22088fb434c", "scanner": "scanner-primary", "fingerprint": "1a14bbf5e3602d4f", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-4611fc97e99ddf1e", "level": "note", "message": {"text": "Legacy-named symbol `amazingStudioToken_v2` in artifacts/amazing-studio/src/pages/attendance.tsx:47"}, "properties": {"repobilityId": "6d8be4934208c73b", "scanner": "scanner-primary", "fingerprint": "4611fc97e99ddf1e", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-d9b709730f0c29b9", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 artifacts/amazing-studio/src/pages/attendance.tsx:81"}, "properties": {"repobilityId": "5eac81c5e30d2761", "scanner": "scanner-primary", "fingerprint": "d9b709730f0c29b9", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-79369aeb7338f72f", "level": "note", "message": {"text": "Legacy-named symbol `amazingStudioToken_v2` in artifacts/amazing-studio/src/pages/revenue.tsx:363"}, "properties": {"repobilityId": "a2214178d525141e", "scanner": "scanner-primary", "fingerprint": "79369aeb7338f72f", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-14485a199f42b1d3", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 artifacts/amazing-studio/src/pages/revenue.tsx:283"}, "properties": {"repobilityId": "b8ecb3d5c8f9ce62", "scanner": "scanner-primary", "fingerprint": "14485a199f42b1d3", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-6144e72ac55b1bac", "level": "note", "message": {"text": "Legacy-named symbol `amazingStudioToken_v2` in artifacts/amazing-studio/src/pages/ai-test-room.tsx:20"}, "properties": {"repobilityId": "5d120eb838e561d2", "scanner": "scanner-primary", "fingerprint": "6144e72ac55b1bac", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-a5c760aa1ea27e07", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 artifacts/amazing-studio/src/pages/ai-test-room.tsx:21"}, "properties": {"repobilityId": "cda5a99f83505ef5", "scanner": "scanner-primary", "fingerprint": "a5c760aa1ea27e07", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-034d16a466cf985a", "level": "note", "message": {"text": "Legacy-named symbol `amazingStudioToken_v2` in artifacts/amazing-studio/src/pages/staff-profile.tsx:25"}, "properties": {"repobilityId": "c02bca7b691b4995", "scanner": "scanner-primary", "fingerprint": "034d16a466cf985a", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-d2d0571eb2b085b0", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 artifacts/amazing-studio/src/pages/staff-profile.tsx:34"}, "properties": {"repobilityId": "19e9bdce4a06d172", "scanner": "scanner-primary", "fingerprint": "d2d0571eb2b085b0", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-539cfd1f7796949b", "level": "note", "message": {"text": "Legacy-named symbol `amazingStudioToken_v2` in artifacts/amazing-studio/src/pages/ai-sale-scripts.tsx:9"}, "properties": {"repobilityId": "7998a6abd630f77f", "scanner": "scanner-primary", "fingerprint": "539cfd1f7796949b", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-b4723911949fc6f5", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 artifacts/amazing-studio/src/pages/ai-sale-scripts.tsx:15"}, "properties": {"repobilityId": "ad573badfc33247b", "scanner": "scanner-primary", "fingerprint": "b4723911949fc6f5", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-0e0b90119e452a08", "level": "note", "message": {"text": "Legacy-named symbol `amazingStudioToken_v2` in artifacts/amazing-studio/src/pages/sale-learning.tsx:26"}, "properties": {"repobilityId": "91f1470d289d9ec4", "scanner": "scanner-primary", "fingerprint": "0e0b90119e452a08", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-dea053b52bef0eee", "level": "note", "message": {"text": "Legacy-named symbol `amazingStudioToken_v2` in artifacts/amazing-studio/src/pages/expenses.tsx:148"}, "properties": {"repobilityId": "1f8272d58d2a785c", "scanner": "scanner-primary", "fingerprint": "dea053b52bef0eee", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-60c6e3671d4aee95", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 artifacts/amazing-studio/src/pages/expenses.tsx:158"}, "properties": {"repobilityId": "a5fd568928a6e4bc", "scanner": "scanner-primary", "fingerprint": "60c6e3671d4aee95", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-5e20f06e83c8227d", "level": "note", "message": {"text": "Legacy-named symbol `amazingStudioToken_v2` in artifacts/amazing-studio/src/pages/customers.tsx:14"}, "properties": {"repobilityId": "e7c7c46c41716915", "scanner": "scanner-primary", "fingerprint": "5e20f06e83c8227d", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-d54db7d494b521b1", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 artifacts/amazing-studio/src/pages/customers.tsx:32"}, "properties": {"repobilityId": "f386a761f1d28cd7", "scanner": "scanner-primary", "fingerprint": "d54db7d494b521b1", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-e1fff930d4b85b15", "level": "note", "message": {"text": "Legacy-named symbol `amazingStudioToken_v2` in artifacts/amazing-studio/src/pages/notifications.tsx:10"}, "properties": {"repobilityId": "fb473d6d19cb3afe", "scanner": "scanner-primary", "fingerprint": "e1fff930d4b85b15", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-27c7fbdfff9501ca", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 artifacts/amazing-studio/src/pages/notifications.tsx:11"}, "properties": {"repobilityId": "b369e3889350bc14", "scanner": "scanner-primary", "fingerprint": "27c7fbdfff9501ca", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-a77ecc903120c6ee", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 artifacts/amazing-studio/src/pages/cms/pricing-public.tsx:26"}, "properties": {"repobilityId": "13e5cff0e706e8d4", "scanner": "scanner-primary", "fingerprint": "a77ecc903120c6ee", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-ae91027d0e6bb4b7", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 artifacts/amazing-studio/src/pages/cms/trash.tsx:28"}, "properties": {"repobilityId": "4b282cd16accbd9d", "scanner": "scanner-primary", "fingerprint": "ae91027d0e6bb4b7", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-2795c09d4619427a", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 artifacts/amazing-studio/src/pages/cms/products-rental.tsx:103"}, "properties": {"repobilityId": "cbb80697d9c3bc3c", "scanner": "scanner-primary", "fingerprint": "2795c09d4619427a", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-aabac7ee47c5a3be", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 artifacts/amazing-studio/src/pages/cms/photo-ideas.tsx:651"}, "properties": {"repobilityId": "759868140557f2bb", "scanner": "scanner-primary", "fingerprint": "aabac7ee47c5a3be", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-7f16b0be2342ca66", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 artifacts/amazing-studio/src/pages/cms/categories.tsx:162"}, "properties": {"repobilityId": "50c3fa34e313d8fd", "scanner": "scanner-primary", "fingerprint": "7f16b0be2342ca66", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-b1c6fa21aafd9872", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 artifacts/amazing-studio/src/pages/cms/gallery.tsx:167"}, "properties": {"repobilityId": "00fb59ed9cf0029a", "scanner": "scanner-primary", "fingerprint": "b1c6fa21aafd9872", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-a3e42771a724fd60", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 artifacts/amazing-studio/src/pages/cms/rental-public.tsx:23"}, "properties": {"repobilityId": "3e9074dbf3e857f7", "scanner": "scanner-primary", "fingerprint": "a3e42771a724fd60", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-07a214429a6b1673", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 artifacts/amazing-studio/src/pages/public/pricing-public.tsx:24"}, "properties": {"repobilityId": "fdbe2cbeb2dd6e67", "scanner": "scanner-primary", "fingerprint": "07a214429a6b1673", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-c9a34ddea29d5b89", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 artifacts/amazing-studio/src/pages/public/gallery-detail.tsx:128"}, "properties": {"repobilityId": "3ef7f02c01da982e", "scanner": "scanner-primary", "fingerprint": "c9a34ddea29d5b89", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-b311c46d7b8ab97f", "level": "note", "message": {"text": "Legacy-named symbol `amazingPhotoIdeasToken_v1` in artifacts/amazing-studio/src/pages/public/photo-ideas.tsx:23"}, "properties": {"repobilityId": "d453b30f034c2ce8", "scanner": "scanner-primary", "fingerprint": "b311c46d7b8ab97f", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-a69a60ab81d6dd23", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 artifacts/amazing-studio/src/pages/public/rental-detail.tsx:689"}, "properties": {"repobilityId": "296f19d0bf1948c0", "scanner": "scanner-primary", "fingerprint": "a69a60ab81d6dd23", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-c4c4eaab320742ad", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 artifacts/amazing-studio/src/pages/public/rental-public.tsx:141"}, "properties": {"repobilityId": "82bfa830b0b38ed0", "scanner": "scanner-primary", "fingerprint": "c4c4eaab320742ad", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-ca549ec355c991c5", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 artifacts/amazing-studio/src/hooks/use-wedding-card-upload.ts:18"}, "properties": {"repobilityId": "322764c54d473fb6", "scanner": "scanner-primary", "fingerprint": "ca549ec355c991c5", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-f5e88b35f8b68b15", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 artifacts/amazing-studio/src/hooks/use-wedding-templates-admin.ts:83"}, "properties": {"repobilityId": "9c1298e9c8fe1898", "scanner": "scanner-primary", "fingerprint": "f5e88b35f8b68b15", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-38c308980c9382b3", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 artifacts/amazing-studio/src/hooks/use-public-cms.ts:181"}, "properties": {"repobilityId": "163599ecdaae4f0a", "scanner": "scanner-primary", "fingerprint": "38c308980c9382b3", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-de392d9e5a3510e4", "level": "note", "message": {"text": "Legacy-named symbol `amazingStudioToken_v2` in artifacts/amazing-studio/src/hooks/use-notifications.ts:8"}, "properties": {"repobilityId": "44b98a69246601bf", "scanner": "scanner-primary", "fingerprint": "de392d9e5a3510e4", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-7acc6a03c2b65160", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 artifacts/amazing-studio/src/hooks/use-notifications.ts:9"}, "properties": {"repobilityId": "e23047c6796cad55", "scanner": "scanner-primary", "fingerprint": "7acc6a03c2b65160", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-b065dff77d8beb17", "level": "note", "message": {"text": "Legacy-named symbol `amazingStudioToken_v2` in artifacts/amazing-studio/src/hooks/use-outfit-schedule.ts:28"}, "properties": {"repobilityId": "e1d6dc07e368fd09", "scanner": "scanner-primary", "fingerprint": "b065dff77d8beb17", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-2ae262a2c48fd3a3", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 artifacts/amazing-studio/src/hooks/use-outfit-schedule.ts:30"}, "properties": {"repobilityId": "13c5c2954f2f1d9e", "scanner": "scanner-primary", "fingerprint": "2ae262a2c48fd3a3", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-ca395a18e146a116", "level": "note", "message": {"text": "38 env vars used in code but missing from .env.example"}, "properties": {"repobilityId": "44b4fc87d4005415", "scanner": "scanner-primary", "fingerprint": "ca395a18e146a116", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "config-drift"]}}, {"ruleId": "scanner-36318016eab04814", "level": "warning", "message": {"text": "Frontend route `/thiep-cuoi-online/tao` has no Link/navigate to it \u2014 artifacts/amazing-studio/src/App.tsx"}, "properties": {"repobilityId": "b139a5569184afa2", "scanner": "scanner-primary", "fingerprint": "36318016eab04814", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-3d7a18a7e04a1f25", "level": "warning", "message": {"text": "Frontend route `/thiep-cuoi/:slug` has no Link/navigate to it \u2014 artifacts/amazing-studio/src/App.tsx"}, "properties": {"repobilityId": "377634bd588e6415", "scanner": "scanner-primary", "fingerprint": "3d7a18a7e04a1f25", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-b3b5b9e6bef9561d", "level": "warning", "message": {"text": "Frontend route `/trang-chu` has no Link/navigate to it \u2014 artifacts/amazing-studio/src/App.tsx"}, "properties": {"repobilityId": "0b0d7b0056155377", "scanner": "scanner-primary", "fingerprint": "b3b5b9e6bef9561d", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-a184a9a6491410d1", "level": "warning", "message": {"text": "Frontend route `/bo-anh/:slug` has no Link/navigate to it \u2014 artifacts/amazing-studio/src/App.tsx"}, "properties": {"repobilityId": "c3c14636069c7310", "scanner": "scanner-primary", "fingerprint": "a184a9a6491410d1", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-bd80bb51f5a17320", "level": "warning", "message": {"text": "Frontend route `/san-pham/:slug` has no Link/navigate to it \u2014 artifacts/amazing-studio/src/App.tsx"}, "properties": {"repobilityId": "41be32416ebd5f11", "scanner": "scanner-primary", "fingerprint": "bd80bb51f5a17320", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-ef9ce76ba19c84b4", "level": "warning", "message": {"text": "Frontend route `/services/:id` has no Link/navigate to it \u2014 artifacts/amazing-studio/src/App.tsx"}, "properties": {"repobilityId": "7a64ddc0b81c4095", "scanner": "scanner-primary", "fingerprint": "ef9ce76ba19c84b4", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-5ac2ee594d9348e7", "level": "warning", "message": {"text": "Frontend route `/staff/:id` has no Link/navigate to it \u2014 artifacts/amazing-studio/src/App.tsx"}, "properties": {"repobilityId": "1f111b490f2fa814", "scanner": "scanner-primary", "fingerprint": "5ac2ee594d9348e7", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-8a0f92f00d9d9ca4", "level": "warning", "message": {"text": "Frontend route `/accounting` has no Link/navigate to it \u2014 artifacts/amazing-studio/src/App.tsx"}, "properties": {"repobilityId": "04669251d706596a", "scanner": "scanner-primary", "fingerprint": "8a0f92f00d9d9ca4", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-d66fe7228eb965a9", "level": "warning", "message": {"text": "Frontend route `/contracts` has no Link/navigate to it \u2014 artifacts/amazing-studio/src/App.tsx"}, "properties": {"repobilityId": "b5971c0d8e4a24ea", "scanner": "scanner-primary", "fingerprint": "d66fe7228eb965a9", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-ed9d1cb5953ee956", "level": "warning", "message": {"text": "Frontend route `/attendance/check-in` has no Link/navigate to it \u2014 artifacts/amazing-studio/src/App.tsx"}, "properties": {"repobilityId": "583c8f2399ccaebf", "scanner": "scanner-primary", "fingerprint": "ed9d1cb5953ee956", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-020b77bee11654b8", "level": "warning", "message": {"text": "Frontend route `/cms/rentals` has no Link/navigate to it \u2014 artifacts/amazing-studio/src/App.tsx"}, "properties": {"repobilityId": "8bfa9bb35107d7bb", "scanner": "scanner-primary", "fingerprint": "020b77bee11654b8", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-78f90f933be9d012", "level": "warning", "message": {"text": "Frontend route `/cms/products-rental` has no Link/navigate to it \u2014 artifacts/amazing-studio/src/App.tsx"}, "properties": {"repobilityId": "cc485d7a7b743aac", "scanner": "scanner-primary", "fingerprint": "78f90f933be9d012", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}, {"ruleId": "scanner-bf313c2918d61c5e", "level": "error", "message": {"text": "Dangling fetch: POST https://graph.facebook.com/v22.0/me/messages?access_token=${encodeURIComponent(token)} (artifacts/api-server/src/follow-up-scheduler.ts:21)"}, "properties": {"repobilityId": "6a3b61b755ff4175", "scanner": "scanner-primary", "fingerprint": "bf313c2918d61c5e", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-cc8dbfbe7ee2c627", "level": "error", "message": {"text": "Dangling fetch: POST https://graph.facebook.com/v22.0/me/messages?access_token=${encodeURIComponent(token)} (artifacts/api-server/src/routes/fb-inbox.ts:142)"}, "properties": {"repobilityId": "681c98c8a0df5f87", "scanner": "scanner-primary", "fingerprint": "cc8dbfbe7ee2c627", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-8919944dac16946b", "level": "error", "message": {"text": "Dangling fetch: POST https://graph.facebook.com/v22.0/me/messages?access_token=${encodeURIComponent(pageAccessToken)} (artifacts/api-server/src/routes/fb-inbox.ts:194)"}, "properties": {"repobilityId": "eec15fdb87a5b9f7", "scanner": "scanner-primary", "fingerprint": "8919944dac16946b", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-41ca865cb5970d6d", "level": "error", "message": {"text": "Dangling fetch: POST https://graph.facebook.com/v22.0/me/messages?access_token=${encodeURIComponent(pageAccessToken)} (artifacts/api-server/src/routes/fb-inbox.ts:215)"}, "properties": {"repobilityId": "9904bd7bbf21354e", "scanner": "scanner-primary", "fingerprint": "41ca865cb5970d6d", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-c4310fda3d022f01", "level": "error", "message": {"text": "Dangling fetch: GET https://graph.facebook.com/me?fields=id,name,fan_count,picture&access_token=${encodeURIComponent(cfg.pageAccessToken)} (artifacts/api-server/src/routes/fb-inbox.ts:897)"}, "properties": {"repobilityId": "9d9036e06fbcd54d", "scanner": "scanner-primary", "fingerprint": "c4310fda3d022f01", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-911c620f33ca0492", "level": "error", "message": {"text": "Dangling fetch: GET https://graph.facebook.com/me?fields=id,name&access_token=${encodeURIComponent(cfg.pageAccessToken)} (artifacts/api-server/src/routes/fb-inbox.ts:914)"}, "properties": {"repobilityId": "735e407538bd0d74", "scanner": "scanner-primary", "fingerprint": "911c620f33ca0492", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-727f750d817442f2", "level": "error", "message": {"text": "Dangling fetch: POST https://graph.facebook.com/${meData.id}/subscribed_apps?subscribed_fields=messages,messaging_postbacks,messaging_optins,message_deliveries,message_reads&access_token=${encodeURIComponent(cfg.pageAccessToken)} (artifacts/api-server/src/routes/fb-inbox.ts:918)"}, "properties": {"repobilityId": "b03ca942fc61801e", "scanner": "scanner-primary", "fingerprint": "727f750d817442f2", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-dde3adb27bf7eebe", "level": "note", "message": {"text": "Unused endpoint: USE /api"}, "properties": {"repobilityId": "61dbc3efae8620b1", "scanner": "scanner-primary", "fingerprint": "dde3adb27bf7eebe", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-f85a32feeafd78c9", "level": "note", "message": {"text": "Unused endpoint: POST /ai/chat"}, "properties": {"repobilityId": "f7c4cb96bc1563d9", "scanner": "scanner-primary", "fingerprint": "f85a32feeafd78c9", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-2b0aafbe18a1fba2", "level": "note", "message": {"text": "Unused endpoint: GET /job-earnings"}, "properties": {"repobilityId": "ffcc696e35968f1d", "scanner": "scanner-primary", "fingerprint": "2b0aafbe18a1fba2", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-18bcdaddf134cf95", "level": "note", "message": {"text": "Unused endpoint: GET /job-earnings/by-booking/:bookingId"}, "properties": {"repobilityId": "9f87127235e0562d", "scanner": "scanner-primary", "fingerprint": "18bcdaddf134cf95", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-fc134cc97ce3ce7c", "level": "note", "message": {"text": "Unused endpoint: POST /job-earnings/compute/:bookingId"}, "properties": {"repobilityId": "6d0d31b96dd0e6c0", "scanner": "scanner-primary", "fingerprint": "fc134cc97ce3ce7c", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-a424def8e8b321ba", "level": "note", "message": {"text": "Unused endpoint: PATCH /job-earnings/:id/void"}, "properties": {"repobilityId": "b36910169645b7e0", "scanner": "scanner-primary", "fingerprint": "a424def8e8b321ba", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-1f214e4dcdd61710", "level": "note", "message": {"text": "Unused endpoint: PUT /job-earnings/:id"}, "properties": {"repobilityId": "bfc42a02736543a5", "scanner": "scanner-primary", "fingerprint": "1f214e4dcdd61710", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-97985b60cc523608", "level": "note", "message": {"text": "Unused endpoint: GET /job-earnings/summary/:staffId"}, "properties": {"repobilityId": "369fbf8a79549fdb", "scanner": "scanner-primary", "fingerprint": "97985b60cc523608", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-ac42422b23e45104", "level": "note", "message": {"text": "Unused endpoint: GET /auth/me"}, "properties": {"repobilityId": "b61bec29c588607c", "scanner": "scanner-primary", "fingerprint": "ac42422b23e45104", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-8fdbacfe9430a6ed", "level": "note", "message": {"text": "Unused endpoint: POST /auth/login"}, "properties": {"repobilityId": "a40e49fbe4ae8365", "scanner": "scanner-primary", "fingerprint": "8fdbacfe9430a6ed", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-083589da2acbc70a", "level": "note", "message": {"text": "Unused endpoint: GET /auth/staff-account/:id"}, "properties": {"repobilityId": "6c0f72e067553ff4", "scanner": "scanner-primary", "fingerprint": "083589da2acbc70a", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-4585c350da9e880d", "level": "note", "message": {"text": "Unused endpoint: POST /auth/change-password"}, "properties": {"repobilityId": "6177233cce8bf1bb", "scanner": "scanner-primary", "fingerprint": "4585c350da9e880d", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-ce43f7026490f754", "level": "note", "message": {"text": "Unused endpoint: POST /ai-test/sessions"}, "properties": {"repobilityId": "90f38856c747b541", "scanner": "scanner-primary", "fingerprint": "ce43f7026490f754", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-5c369d9121b36605", "level": "note", "message": {"text": "Unused endpoint: GET /ai-test/sessions"}, "properties": {"repobilityId": "e6fff8e4bf5d6e57", "scanner": "scanner-primary", "fingerprint": "5c369d9121b36605", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-699e010d1fac856a", "level": "note", "message": {"text": "Unused endpoint: DELETE /ai-test/sessions/:id"}, "properties": {"repobilityId": "53a9ed7762342f89", "scanner": "scanner-primary", "fingerprint": "699e010d1fac856a", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-9ffa2ba7d5d093d4", "level": "note", "message": {"text": "Unused endpoint: GET /ai-test/sessions/:id/messages"}, "properties": {"repobilityId": "58bee45a77d196f0", "scanner": "scanner-primary", "fingerprint": "9ffa2ba7d5d093d4", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-ff811b4c7e057a31", "level": "note", "message": {"text": "Unused endpoint: GET /ai-test/sessions/:id/debug"}, "properties": {"repobilityId": "70ef0662438a73b1", "scanner": "scanner-primary", "fingerprint": "ff811b4c7e057a31", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-9dffb229c3d99d03", "level": "note", "message": {"text": "Unused endpoint: GET /ai-test/sessions/:id/events"}, "properties": {"repobilityId": "7553543b2fa7a0c2", "scanner": "scanner-primary", "fingerprint": "9dffb229c3d99d03", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-24a294df24b1c979", "level": "note", "message": {"text": "Unused endpoint: POST /ai-test/sessions/:id/message"}, "properties": {"repobilityId": "c4c4b0402f381a76", "scanner": "scanner-primary", "fingerprint": "24a294df24b1c979", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-9579c4ff916cc3bb", "level": "note", "message": {"text": "Unused endpoint: POST /ai-test/sessions/:id/reset"}, "properties": {"repobilityId": "fbff158b1e69bcad", "scanner": "scanner-primary", "fingerprint": "9579c4ff916cc3bb", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-4b9f8e609fcd7228", "level": "note", "message": {"text": "Unused endpoint: PATCH /ai-test/sessions/:id"}, "properties": {"repobilityId": "471c8f510f27ea71", "scanner": "scanner-primary", "fingerprint": "4b9f8e609fcd7228", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-5ee80cc77bb3e682", "level": "note", "message": {"text": "Unused endpoint: GET /ai-test/sessions/:id/export"}, "properties": {"repobilityId": "5078cc88dde169f7", "scanner": "scanner-primary", "fingerprint": "5ee80cc77bb3e682", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-1f4c13b940de8e39", "level": "note", "message": {"text": "Unused endpoint: GET /ai-test/sessions/export-all"}, "properties": {"repobilityId": "8e78a5bf15423537", "scanner": "scanner-primary", "fingerprint": "1f4c13b940de8e39", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-addf18fe92200722", "level": "note", "message": {"text": "Unused endpoint: GET /ai-test/scripts"}, "properties": {"repobilityId": "418cb27918ca521a", "scanner": "scanner-primary", "fingerprint": "addf18fe92200722", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-089ce3a352fb43b5", "level": "note", "message": {"text": "Unused endpoint: GET /check-ai-key"}, "properties": {"repobilityId": "e94f078beb8bd8b3", "scanner": "scanner-primary", "fingerprint": "089ce3a352fb43b5", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-e95cbeb660f7477b", "level": "note", "message": {"text": "Unused endpoint: GET /bookings/:id/items"}, "properties": {"repobilityId": "319f6f6ffa2b5a94", "scanner": "scanner-primary", "fingerprint": "e95cbeb660f7477b", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-c2355797882b6585", "level": "note", "message": {"text": "Unused endpoint: POST /bookings/:id/items"}, "properties": {"repobilityId": "38e2ab55a83c6bae", "scanner": "scanner-primary", "fingerprint": "c2355797882b6585", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-cc158902ff84918a", "level": "note", "message": {"text": "Unused endpoint: PUT /bookings/:id/items/:itemId"}, "properties": {"repobilityId": "dd8538d69d6b880d", "scanner": "scanner-primary", "fingerprint": "cc158902ff84918a", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-612b8609d6d2ea57", "level": "note", "message": {"text": "Unused endpoint: POST /bookings/:id/upgrade"}, "properties": {"repobilityId": "32bb5237acbee0fb", "scanner": "scanner-primary", "fingerprint": "612b8609d6d2ea57", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-2328badb5aad0fca", "level": "note", "message": {"text": "Unused endpoint: PATCH /bookings/:id/reschedule"}, "properties": {"repobilityId": "4260a0fc59ea8516", "scanner": "scanner-primary", "fingerprint": "2328badb5aad0fca", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-287372ea3a622c49", "level": "note", "message": {"text": "Unused endpoint: GET /bookings/:id/change-log"}, "properties": {"repobilityId": "bce1803271c06051", "scanner": "scanner-primary", "fingerprint": "287372ea3a622c49", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-b10bc9d9c16004ba", "level": "note", "message": {"text": "Unused endpoint: GET /ai-scripts"}, "properties": {"repobilityId": "45347a55a156c9d3", "scanner": "scanner-primary", "fingerprint": "b10bc9d9c16004ba", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-44b54d7dea89990d", "level": "note", "message": {"text": "Unused endpoint: GET /ai-scripts/unknown-questions/count"}, "properties": {"repobilityId": "63ea29feb95d5e3a", "scanner": "scanner-primary", "fingerprint": "44b54d7dea89990d", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-04821fce71e6bc1b", "level": "note", "message": {"text": "Unused endpoint: GET /ai-scripts/unknown-questions"}, "properties": {"repobilityId": "a02c5d07db8c39af", "scanner": "scanner-primary", "fingerprint": "04821fce71e6bc1b", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-55cc72bf29ed42e3", "level": "note", "message": {"text": "Unused endpoint: PATCH /ai-scripts/unknown-questions/:id"}, "properties": {"repobilityId": "13bfe377b58a9ee7", "scanner": "scanner-primary", "fingerprint": "55cc72bf29ed42e3", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-127f89b5042e5430", "level": "note", "message": {"text": "Unused endpoint: GET /ai-scripts/shared-qa-rows"}, "properties": {"repobilityId": "7ce8f5ddbff54662", "scanner": "scanner-primary", "fingerprint": "127f89b5042e5430", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-b48fe36be97a6d2d", "level": "note", "message": {"text": "Unused endpoint: POST /ai-scripts/shared-qa-rows/bulk"}, "properties": {"repobilityId": "4c31193a1d8b26fc", "scanner": "scanner-primary", "fingerprint": "b48fe36be97a6d2d", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-6f9544fdbd5749a5", "level": "note", "message": {"text": "Unused endpoint: GET /ai-scripts/:id"}, "properties": {"repobilityId": "887d2c76103c3057", "scanner": "scanner-primary", "fingerprint": "6f9544fdbd5749a5", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-b344d329473cc4e9", "level": "note", "message": {"text": "Unused endpoint: POST /ai-scripts"}, "properties": {"repobilityId": "a00ed1a82f55c522", "scanner": "scanner-primary", "fingerprint": "b344d329473cc4e9", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-2d9b79da9f30534e", "level": "note", "message": {"text": "Unused endpoint: PUT /ai-scripts/:id"}, "properties": {"repobilityId": "18bcb9845d0efc35", "scanner": "scanner-primary", "fingerprint": "2d9b79da9f30534e", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-e45d82df8aee057d", "level": "note", "message": {"text": "Unused endpoint: PATCH /ai-scripts/:id/settings"}, "properties": {"repobilityId": "b2e166171bc91efe", "scanner": "scanner-primary", "fingerprint": "e45d82df8aee057d", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-d4725c8b3bf027fd", "level": "note", "message": {"text": "Unused endpoint: DELETE /ai-scripts/:id"}, "properties": {"repobilityId": "8fe04c01a9060512", "scanner": "scanner-primary", "fingerprint": "d4725c8b3bf027fd", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-582a63c555098792", "level": "note", "message": {"text": "Unused endpoint: GET /ai-scripts/:id/qa-rows"}, "properties": {"repobilityId": "a4114a5cd80a46eb", "scanner": "scanner-primary", "fingerprint": "582a63c555098792", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-33c567afc7b9690f", "level": "note", "message": {"text": "Unused endpoint: POST /ai-scripts/:id/qa-rows/bulk"}, "properties": {"repobilityId": "6a7625e82f8abbf8", "scanner": "scanner-primary", "fingerprint": "33c567afc7b9690f", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-d302051675d353bd", "level": "note", "message": {"text": "Unused endpoint: GET /quotes"}, "properties": {"repobilityId": "5ffadddf2f61a0a0", "scanner": "scanner-primary", "fingerprint": "d302051675d353bd", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-e33df8e307a8336a", "level": "note", "message": {"text": "Unused endpoint: POST /quotes"}, "properties": {"repobilityId": "01c9240ae397a385", "scanner": "scanner-primary", "fingerprint": "e33df8e307a8336a", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-a8e37d5bcc9a7c67", "level": "note", "message": {"text": "Unused endpoint: GET /quotes/:id"}, "properties": {"repobilityId": "8397cad7c32e106c", "scanner": "scanner-primary", "fingerprint": "a8e37d5bcc9a7c67", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-f84145a647efe83d", "level": "note", "message": {"text": "Unused endpoint: PUT /quotes/:id"}, "properties": {"repobilityId": "ce3f79fed059389b", "scanner": "scanner-primary", "fingerprint": "f84145a647efe83d", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-47612a7b6488e3aa", "level": "note", "message": {"text": "Unused endpoint: DELETE /quotes/:id"}, "properties": {"repobilityId": "015bbdcc45a294a8", "scanner": "scanner-primary", "fingerprint": "47612a7b6488e3aa", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-dc00132a6a0ccb38", "level": "note", "message": {"text": "Unused endpoint: POST /quotes/:id/convert-to-booking"}, "properties": {"repobilityId": "64675de4b05d274a", "scanner": "scanner-primary", "fingerprint": "dc00132a6a0ccb38", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}]}]}