{"version": "2.1.0", "$schema": "https://json.schemastore.org/sarif-2.1.0.json", "runs": [{"tool": {"driver": {"name": "Repobility", "informationUri": "https://repobility.com", "rules": [{"id": "scanner-bead75b0f9233e05", "name": "No API endpoints detected", "shortDescription": {"text": "No API endpoints detected"}, "fullDescription": {"text": "The scanner did not find FastAPI/Flask/Express/NestJS/GraphQL/gRPC routes. If this repo exposes APIs, the framework may be unsupported."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "info", "confidence": 1.0}}, {"id": "scanner-c59fc1af069898e4", "name": "`truncate` class without `title=` for hover reveal \u2014 mission-control/app/agents/page.tsx:306", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 mission-control/app/agents/page.tsx:306"}, "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-c90e2993329d0e28", "name": "`truncate` class without `title=` for hover reveal \u2014 mission-control/app/dashboard/page.tsx:227", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 mission-control/app/dashboard/page.tsx:227"}, "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-f3abfe9051fe3312", "name": "Stray `console.log` in TS/JS \u2014 mission-control/app/api/cron/route.ts:53", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 mission-control/app/api/cron/route.ts:53"}, "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-42216d8e2ab3d702", "name": "Stray `console.log` in TS/JS \u2014 mission-control/app/api/cron/daily/route.ts:44", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 mission-control/app/api/cron/daily/route.ts:44"}, "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-e08bb87b673fa455", "name": "Stray `console.log` in TS/JS \u2014 mission-control/app/api/cron/social/route.ts:20", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 mission-control/app/api/cron/social/route.ts:20"}, "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-ea4523a9a65434ce", "name": "Stray `console.log` in TS/JS \u2014 mission-control/app/api/cron/weekly/route.ts:20", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 mission-control/app/api/cron/weekly/route.ts:20"}, "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-cd3757b76bc5378e", "name": "Stray `console.log` in TS/JS \u2014 mission-control/app/api/cron/hourly/route.ts:29", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 mission-control/app/api/cron/hourly/route.ts:29"}, "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-725e2965087e26bb", "name": "Stray `console.log` in TS/JS \u2014 mission-control/app/api/cron/briefing/route.ts:167", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 mission-control/app/api/cron/briefing/route.ts:167"}, "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-01bbc690a2dae837", "name": "TODO/FIXME marker in shipping code \u2014 mission-control/app/api/channels/route.ts:16", "shortDescription": {"text": "TODO/FIXME marker in shipping code \u2014 mission-control/app/api/channels/route.ts:16"}, "fullDescription": {"text": "Track in /reviews or /issues, not as a code comment that rots.\n\nWhy: Drift control \u2014 shouldn't be the same as Quality TODO scanner.\nRule id: fq.todo-marker"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-7412ecd1fddf0173", "name": "Stray `console.log` in TS/JS \u2014 mission-control/app/api/webhooks/stripe/route.ts:138", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 mission-control/app/api/webhooks/stripe/route.ts:138"}, "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-cbb8ca6ca2f0bb4a", "name": "Stray `console.log` in TS/JS \u2014 mission-control/app/api/webhooks/shopify/route.ts:48", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 mission-control/app/api/webhooks/shopify/route.ts:48"}, "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-0c79a3835204cbbd", "name": "`truncate` class without `title=` for hover reveal \u2014 mission-control/app/admin/agents/page.tsx:122", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 mission-control/app/admin/agents/page.tsx:122"}, "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-6c8bc306074b06ba", "name": "`truncate` class without `title=` for hover reveal \u2014 mission-control/app/admin/projects/page.tsx:106", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 mission-control/app/admin/projects/page.tsx:106"}, "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-476cfb7820186374", "name": "`truncate` class without `title=` for hover reveal \u2014 mission-control/app/admin/projects/[slug]/page.tsx:127", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 mission-control/app/admin/projects/[slug]/page.tsx:127"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-d2d35e3ba97104d5", "name": "`truncate` class without `title=` for hover reveal \u2014 mission-control/app/settings/page.tsx:407", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 mission-control/app/settings/page.tsx:407"}, "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-8b4eb5efbb543cbd", "name": "`truncate` class without `title=` for hover reveal \u2014 mission-control/app/workflows/page.tsx:174", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 mission-control/app/workflows/page.tsx:174"}, "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-74887743eee8b1c1", "name": "`truncate` class without `title=` for hover reveal \u2014 mission-control/app/workflows/[id]/runs/[runId]/page.tsx:215", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 mission-control/app/workflows/[id]/runs/[runId]/page.tsx:215"}, "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-3117de2cd6556553", "name": "`truncate` class without `title=` for hover reveal \u2014 mission-control/app/autopilot/missions/page.tsx:102", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 mission-control/app/autopilot/missions/page.tsx:102"}, "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-67ec55e68f434bfc", "name": "`truncate` class without `title=` for hover reveal \u2014 mission-control/app/autopilot/plans/page.tsx:111", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 mission-control/app/autopilot/plans/page.tsx:111"}, "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-c766527e3c3a386f", "name": "`truncate` class without `title=` for hover reveal \u2014 mission-control/app/autopilot/plans/[id]/page.tsx:306", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 mission-control/app/autopilot/plans/[id]/page.tsx:306"}, "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-9cac394b1bfa96e5", "name": "`truncate` class without `title=` for hover reveal \u2014 mission-control/app/content/page.tsx:177", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 mission-control/app/content/page.tsx:177"}, "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-cf78df6fb25986a4", "name": "Stray `console.log` in TS/JS \u2014 mission-control/scripts/refresh-wechat-token.ts:36", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 mission-control/scripts/refresh-wechat-token.ts:36"}, "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-6419a8a795b001cb", "name": "Stray `console.log` in TS/JS \u2014 mission-control/scripts/test-mission.ts:20", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 mission-control/scripts/test-mission.ts:20"}, "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-7a2dd1000c4a7e04", "name": "Stray `console.log` in TS/JS \u2014 mission-control/scripts/test-approval-adversarial.ts:127", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 mission-control/scripts/test-approval-adversarial.ts:127"}, "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-6116c035665cc016", "name": "Stray `console.log` in TS/JS \u2014 mission-control/scripts/backfill-insight-zh.ts:91", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 mission-control/scripts/backfill-insight-zh.ts:91"}, "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-9a5a3022905dcb0e", "name": "Stray `console.log` in TS/JS \u2014 mission-control/scripts/backfill-task-zh.ts:79", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 mission-control/scripts/backfill-task-zh.ts:79"}, "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-0c54d3046014823c", "name": "Stray `console.log` in TS/JS \u2014 mission-control/scripts/test-memory-retrieval.ts:5", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 mission-control/scripts/test-memory-retrieval.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-2f7c70fdc2d330ff", "name": "Stray `console.log` in TS/JS \u2014 mission-control/scripts/test-planner.ts:25", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 mission-control/scripts/test-planner.ts:25"}, "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-f0b43be04b3fb4f9", "name": "Stray `console.log` in TS/JS \u2014 mission-control/scripts/sync-missions-to-obsidian.ts:135", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 mission-control/scripts/sync-missions-to-obsidian.ts:135"}, "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-37e27e3c4509a8a8", "name": "Stray `console.log` in TS/JS \u2014 mission-control/scripts/test-wechat-adapter.ts:11", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 mission-control/scripts/test-wechat-adapter.ts:11"}, "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-27606703afd2a0c3", "name": "Stray `console.log` in TS/JS \u2014 mission-control/scripts/explain-memory.ts:20", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 mission-control/scripts/explain-memory.ts:20"}, "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-95b675eb24b3b65c", "name": "Stray `console.log` in TS/JS \u2014 mission-control/inngest/functions/memory-sync.ts:124", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 mission-control/inngest/functions/memory-sync.ts:124"}, "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-b9924ce6f1f1ff48", "name": "Stray `console.log` in TS/JS \u2014 mission-control/inngest/functions/plan-on-insight.ts:66", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 mission-control/inngest/functions/plan-on-insight.ts:66"}, "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-6a90f1b40d846d17", "name": "`truncate` class without `title=` for hover reveal \u2014 mission-control/components/dashboard/agent-status-mini.tsx:55", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 mission-control/components/dashboard/agent-status-mini.tsx:55"}, "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-d31ba59a5f760d22", "name": "Icon-only button without accessible name \u2014 mission-control/components/admin/new-project-dialog.tsx:90", "shortDescription": {"text": "Icon-only button without accessible name \u2014 mission-control/components/admin/new-project-dialog.tsx:90"}, "fullDescription": {"text": "A `<button>` whose only child is a single glyph or symbol needs `title=` or `aria-label=` so screen readers (and tooltips on hover) work.\n\nWhy: P3 in CHECKLIST.md \u2014 icon-only buttons skipped a title.\nRule id: fq.button.no-label"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-3553e9aae2426cd1", "name": "Icon-only button without accessible name \u2014 mission-control/components/admin/new-agent-dialog.tsx:61", "shortDescription": {"text": "Icon-only button without accessible name \u2014 mission-control/components/admin/new-agent-dialog.tsx:61"}, "fullDescription": {"text": "A `<button>` whose only child is a single glyph or symbol needs `title=` or `aria-label=` so screen readers (and tooltips on hover) work.\n\nWhy: P3 in CHECKLIST.md \u2014 icon-only buttons skipped a title.\nRule id: fq.button.no-label"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-3585bba3f520eb46", "name": "Icon-only button without accessible name \u2014 mission-control/components/admin/goal-form-dialog.tsx:100", "shortDescription": {"text": "Icon-only button without accessible name \u2014 mission-control/components/admin/goal-form-dialog.tsx:100"}, "fullDescription": {"text": "A `<button>` whose only child is a single glyph or symbol needs `title=` or `aria-label=` so screen readers (and tooltips on hover) work.\n\nWhy: P3 in CHECKLIST.md \u2014 icon-only buttons skipped a title.\nRule id: fq.button.no-label"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-9315b8f225a6bf1b", "name": "`truncate` class without `title=` for hover reveal \u2014 mission-control/components/layout/sidebar.tsx:100", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 mission-control/components/layout/sidebar.tsx:100"}, "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-3d21f78cd5fcff75", "name": "`truncate` class without `title=` for hover reveal \u2014 mission-control/components/workflows/step-node.tsx:84", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 mission-control/components/workflows/step-node.tsx:84"}, "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-47b96a2a076c61da", "name": "Stray `console.log` in TS/JS \u2014 mission-control/prisma/seed.ts:7", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 mission-control/prisma/seed.ts:7"}, "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-8d588c7695c90ea5", "name": "Stray `console.log` in TS/JS \u2014 mission-control/prisma/seed_full.ts:9", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 mission-control/prisma/seed_full.ts:9"}, "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-5affdf8e24095f0f", "name": "Stray `console.log` in TS/JS \u2014 mission-control/lib/llm.ts:58", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 mission-control/lib/llm.ts:58"}, "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-1adee56079dcb83c", "name": "Stray `console.log` in TS/JS \u2014 mission-control/lib/email-drip.ts:62", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 mission-control/lib/email-drip.ts:62"}, "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-ca95145404d5a35b", "name": "Stray `console.log` in TS/JS \u2014 mission-control/lib/insight-generator.ts:205", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 mission-control/lib/insight-generator.ts:205"}, "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-b5e37490da843529", "name": "Stray `console.log` in TS/JS \u2014 mission-control/lib/embeddings.ts:77", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 mission-control/lib/embeddings.ts:77"}, "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-0296c0e05f99b449", "name": "Stray `console.log` in TS/JS \u2014 mission-control/lib/observer.ts:156", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 mission-control/lib/observer.ts:156"}, "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-2a49045719d3b954", "name": "Stray `console.log` in TS/JS \u2014 mission-control/lib/angel-scanner.ts:60", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 mission-control/lib/angel-scanner.ts:60"}, "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-e5b134b1ca4431de", "name": "Stray `console.log` in TS/JS \u2014 mission-control/lib/integrations/shopify.ts:373", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 mission-control/lib/integrations/shopify.ts:373"}, "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-64034b6b5cd6e6c6", "name": "Stray `console.log` in TS/JS \u2014 mission-control/lib/integrations/wheatcoin.ts:122", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 mission-control/lib/integrations/wheatcoin.ts:122"}, "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-bdba9dbcbce045d7", "name": "TODO/FIXME marker in shipping code \u2014 mission-control/lib/channels/adapters/linkedin.ts:22", "shortDescription": {"text": "TODO/FIXME marker in shipping code \u2014 mission-control/lib/channels/adapters/linkedin.ts:22"}, "fullDescription": {"text": "Track in /reviews or /issues, not as a code comment that rots.\n\nWhy: Drift control \u2014 shouldn't be the same as Quality TODO scanner.\nRule id: fq.todo-marker"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-a47ac1d541739990", "name": "TODO/FIXME marker in shipping code \u2014 mission-control/lib/channels/adapters/medium.ts:21", "shortDescription": {"text": "TODO/FIXME marker in shipping code \u2014 mission-control/lib/channels/adapters/medium.ts:21"}, "fullDescription": {"text": "Track in /reviews or /issues, not as a code comment that rots.\n\nWhy: Drift control \u2014 shouldn't be the same as Quality TODO scanner.\nRule id: fq.todo-marker"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-1a848f4d747d4596", "name": "TODO/FIXME marker in shipping code \u2014 mission-control/lib/channels/adapters/youtube.ts:20", "shortDescription": {"text": "TODO/FIXME marker in shipping code \u2014 mission-control/lib/channels/adapters/youtube.ts:20"}, "fullDescription": {"text": "Track in /reviews or /issues, not as a code comment that rots.\n\nWhy: Drift control \u2014 shouldn't be the same as Quality TODO scanner.\nRule id: fq.todo-marker"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-223d82591c890f83", "name": "Privileged port 30 in use", "shortDescription": {"text": "Privileged port 30 in use"}, "fullDescription": {"text": "Port 30 is privileged (<1024). Make sure the service runs with the right caps or front it with a non-privileged port via a load balancer."}, "properties": {"scanner": "scanner-primary", "layer": "network", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-6c6d1a60e126100c", "name": "Privileged port 10 in use", "shortDescription": {"text": "Privileged port 10 in use"}, "fullDescription": {"text": "Port 10 is privileged (<1024). Make sure the service runs with the right caps or front it with a non-privileged port via a load balancer."}, "properties": {"scanner": "scanner-primary", "layer": "network", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-b91ac5d55b1cd0a3", "name": "Insecure pattern 'cors_wildcard' in mission-control/lib/integrations/wheatcoin.ts:172", "shortDescription": {"text": "Insecure pattern 'cors_wildcard' in mission-control/lib/integrations/wheatcoin.ts:172"}, "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-b4cbf22d2ca483c5", "name": "Insecure pattern 'weak_hash' in mission-control/lib/channels/adapters/twitter.ts:91", "shortDescription": {"text": "Insecure pattern 'weak_hash' in mission-control/lib/channels/adapters/twitter.ts:91"}, "fullDescription": {"text": "Found a known-risky pattern (weak_hash). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-87e1ee6139c34030", "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-6893a6c8b0861585", "name": "Very low test-to-source ratio", "shortDescription": {"text": "Very low test-to-source ratio"}, "fullDescription": {"text": "5 test file(s) for 163 source file(s) (ratio 0.03). 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-3ab5d313dda8e5f9", "name": "Debug logging residue appears in source files", "shortDescription": {"text": "Debug logging residue appears in source files"}, "fullDescription": {"text": "Found 223 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 56 placeholder/mock markers across 12 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-11825279136b53a3", "name": "CI is configured but no tests are detected", "shortDescription": {"text": "CI is configured but no tests are detected"}, "fullDescription": {"text": "A CI pipeline exists, but the scan found no test files to gate. Opus labeled this generated-code pattern as config theater: release machinery exists, but it has little behavioral signal."}, "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, tests. Opus verification showed these co-occurring gaps are a better readiness signal than reading each flag in isolation."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-749d4bc1bd66df5f", "name": "Agent instructions exist but release-hardening basics are missing", "shortDescription": {"text": "Agent instructions exist but release-hardening basics are missing"}, "fullDescription": {"text": "AI-coder instruction files were found, but the repo is missing license, tests. 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-40d29133ac605e7d", "name": "`fetch()` without try/.catch or AbortSignal \u2014 mission-control/app/dashboard/page.tsx:52", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 mission-control/app/dashboard/page.tsx:52"}, "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-928b98f7e24e7a11", "name": "Commented-code block (6 lines) in mission-control/app/api/cron/daily/route.ts:25", "shortDescription": {"text": "Commented-code block (6 lines) in mission-control/app/api/cron/daily/route.ts: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-cbf49a014ae49bf5", "name": "`fetch()` without try/.catch or AbortSignal \u2014 mission-control/app/api/cron/hourly/route.ts:147", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 mission-control/app/api/cron/hourly/route.ts:147"}, "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-ea98193f17f52ab4", "name": "`fetch()` without try/.catch or AbortSignal \u2014 mission-control/app/api/settings/channels/wechat/materials/route.ts:27", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 mission-control/app/api/settings/channels/wechat/materials/route.ts:27"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-4cbf84db0002ff9d", "name": "`fetch()` without try/.catch or AbortSignal \u2014 mission-control/app/admin/agents/page.tsx:21", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 mission-control/app/admin/agents/page.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-4ce79a8deb70b395", "name": "`fetch()` without try/.catch or AbortSignal \u2014 mission-control/app/admin/agents/[id]/page.tsx:20", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 mission-control/app/admin/agents/[id]/page.tsx:20"}, "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-f105fcb1e19e0f9d", "name": "`fetch()` without try/.catch or AbortSignal \u2014 mission-control/app/admin/projects/page.tsx:21", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 mission-control/app/admin/projects/page.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-6cc27426910cebc4", "name": "`fetch()` without try/.catch or AbortSignal \u2014 mission-control/app/admin/projects/[slug]/page.tsx:22", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 mission-control/app/admin/projects/[slug]/page.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-b84d0cfabc7c9ca1", "name": "`fetch()` without try/.catch or AbortSignal \u2014 mission-control/app/settings/page.tsx:355", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 mission-control/app/settings/page.tsx:355"}, "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-484f6fa6bfd92389", "name": "`fetch()` without try/.catch or AbortSignal \u2014 mission-control/app/workflows/page.tsx:77", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 mission-control/app/workflows/page.tsx:77"}, "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-57ef3974818ba25d", "name": "`fetch()` without try/.catch or AbortSignal \u2014 mission-control/app/workflows/[id]/page.tsx:63", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 mission-control/app/workflows/[id]/page.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-ab354cc3df3aeca4", "name": "`fetch()` without try/.catch or AbortSignal \u2014 mission-control/app/workflows/[id]/runs/page.tsx:99", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 mission-control/app/workflows/[id]/runs/page.tsx:99"}, "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-f91202ebfdfa199f", "name": "`fetch()` without try/.catch or AbortSignal \u2014 mission-control/app/workflows/[id]/runs/[runId]/page.tsx:80", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 mission-control/app/workflows/[id]/runs/[runId]/page.tsx:80"}, "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-65ac9aba4f472735", "name": "`fetch()` without try/.catch or AbortSignal \u2014 mission-control/app/workflows/new/page.tsx:14", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 mission-control/app/workflows/new/page.tsx:14"}, "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-3c01daafc5878d9d", "name": "`fetch()` without try/.catch or AbortSignal \u2014 mission-control/app/autopilot/page.tsx:191", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 mission-control/app/autopilot/page.tsx:191"}, "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-431d6212ca3774db", "name": "`fetch()` without try/.catch or AbortSignal \u2014 mission-control/app/autopilot/insights/page.tsx:193", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 mission-control/app/autopilot/insights/page.tsx:193"}, "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-ba2741869309ac10", "name": "`fetch()` without try/.catch or AbortSignal \u2014 mission-control/app/autopilot/insights/[id]/page.tsx:161", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 mission-control/app/autopilot/insights/[id]/page.tsx:161"}, "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-5bf1804213abc773", "name": "`fetch()` without try/.catch or AbortSignal \u2014 mission-control/app/autopilot/missions/page.tsx:162", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 mission-control/app/autopilot/missions/page.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-519a320bae9775a9", "name": "`fetch()` without try/.catch or AbortSignal \u2014 mission-control/app/autopilot/missions/[id]/page.tsx:251", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 mission-control/app/autopilot/missions/[id]/page.tsx:251"}, "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-96a2f51f8325358c", "name": "`fetch()` without try/.catch or AbortSignal \u2014 mission-control/app/autopilot/plans/page.tsx:160", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 mission-control/app/autopilot/plans/page.tsx:160"}, "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-80cec3b4a10f3d0d", "name": "`fetch()` without try/.catch or AbortSignal \u2014 mission-control/app/autopilot/plans/[id]/page.tsx:120", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 mission-control/app/autopilot/plans/[id]/page.tsx:120"}, "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-9af14af2f173e1d3", "name": "`fetch()` without try/.catch or AbortSignal \u2014 mission-control/scripts/refresh-wechat-token.ts:39", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 mission-control/scripts/refresh-wechat-token.ts:39"}, "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-2b0c580f2e34c55f", "name": "`fetch()` without try/.catch or AbortSignal \u2014 mission-control/scripts/backfill-insight-zh.ts:42", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 mission-control/scripts/backfill-insight-zh.ts: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-0d34810112de272d", "name": "`fetch()` without try/.catch or AbortSignal \u2014 mission-control/scripts/backfill-task-zh.ts:32", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 mission-control/scripts/backfill-task-zh.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-d7de4fa72aa92c65", "name": "`fetch()` without try/.catch or AbortSignal \u2014 mission-control/components/admin/goal-form-dialog.tsx:78", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 mission-control/components/admin/goal-form-dialog.tsx:78"}, "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-1dc06784c2f40a47", "name": "`fetch()` without try/.catch or AbortSignal \u2014 mission-control/components/tasks/kanban-board.tsx:110", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 mission-control/components/tasks/kanban-board.tsx:110"}, "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-8b299286112736c2", "name": "Legacy-named symbol `planner_v1` in mission-control/lib/planner.ts:154", "shortDescription": {"text": "Legacy-named symbol `planner_v1` in mission-control/lib/planner.ts:154"}, "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-daa575090143c1e2", "name": "Commented-code block (7 lines) in mission-control/lib/integrations/stripe.ts:224", "shortDescription": {"text": "Commented-code block (7 lines) in mission-control/lib/integrations/stripe.ts:224"}, "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-0673f342afadf406", "name": "`fetch()` without try/.catch or AbortSignal \u2014 mission-control/lib/integrations/stripe.ts:88", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 mission-control/lib/integrations/stripe.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-604b6ff099f62efa", "name": "Commented-code block (7 lines) in mission-control/lib/integrations/gsc.ts:134", "shortDescription": {"text": "Commented-code block (7 lines) in mission-control/lib/integrations/gsc.ts:134"}, "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-100b3c2a695cffe9", "name": "`fetch()` without try/.catch or AbortSignal \u2014 mission-control/lib/integrations/gsc.ts:211", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 mission-control/lib/integrations/gsc.ts:211"}, "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-b61be0bb320c1a39", "name": "`fetch()` without try/.catch or AbortSignal \u2014 mission-control/lib/integrations/gmail.ts:36", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 mission-control/lib/integrations/gmail.ts:36"}, "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-71c0144bddf1bb35", "name": "Commented-code block (7 lines) in mission-control/lib/integrations/ga.ts:133", "shortDescription": {"text": "Commented-code block (7 lines) in mission-control/lib/integrations/ga.ts:133"}, "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-e41e187ab21e85da", "name": "`fetch()` without try/.catch or AbortSignal \u2014 mission-control/lib/integrations/ga.ts:211", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 mission-control/lib/integrations/ga.ts:211"}, "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-b9495312b2ecdfa5", "name": "`fetch()` without try/.catch or AbortSignal \u2014 mission-control/lib/integrations/shopify.ts:127", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 mission-control/lib/integrations/shopify.ts:127"}, "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-10271722fd160f73", "name": "Commented-code block (7 lines) in mission-control/lib/integrations/tidio.ts:193", "shortDescription": {"text": "Commented-code block (7 lines) in mission-control/lib/integrations/tidio.ts:193"}, "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-7938b6ea7173b1d6", "name": "Commented-code block (5 lines) in mission-control/lib/channels/registry.ts:55", "shortDescription": {"text": "Commented-code block (5 lines) in mission-control/lib/channels/registry.ts:55"}, "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-5d6a77363b334484", "name": "Commented-code block (6 lines) in mission-control/lib/channels/adapters/linkedin.ts:22", "shortDescription": {"text": "Commented-code block (6 lines) in mission-control/lib/channels/adapters/linkedin.ts:22"}, "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-b1ebaaa50bb9de56", "name": "`fetch()` without try/.catch or AbortSignal \u2014 mission-control/lib/channels/adapters/linkedin.ts:23", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 mission-control/lib/channels/adapters/linkedin.ts: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-d47a9e8cc695828b", "name": "Commented-code block (9 lines) in mission-control/lib/channels/adapters/medium.ts:21", "shortDescription": {"text": "Commented-code block (9 lines) in mission-control/lib/channels/adapters/medium.ts:21"}, "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-0d89c9a22906b5d1", "name": "`fetch()` without try/.catch or AbortSignal \u2014 mission-control/lib/channels/adapters/medium.ts:22", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 mission-control/lib/channels/adapters/medium.ts: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-83be7f05a21dca45", "name": "Commented-code block (5 lines) in mission-control/lib/ai/claude-client.ts:35", "shortDescription": {"text": "Commented-code block (5 lines) in mission-control/lib/ai/claude-client.ts:35"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}]}}, "automationDetails": {"id": "repobility/25418"}, "properties": {"repository": "dinnar1407-code/miniAIpdf-mission-control", "repoUrl": "https://github.com/dinnar1407-code/miniAIpdf-mission-control", "branch": "main"}, "results": [{"ruleId": "scanner-bead75b0f9233e05", "level": "none", "message": {"text": "No API endpoints detected"}, "properties": {"repobilityId": "0f8bb852027c38f8", "scanner": "scanner-primary", "fingerprint": "bead75b0f9233e05", "layer": "api", "severity": "info", "confidence": 1.0, "tags": ["coverage"]}}, {"ruleId": "scanner-c59fc1af069898e4", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 mission-control/app/agents/page.tsx:306"}, "properties": {"repobilityId": "859aca7be0f5340d", "scanner": "scanner-primary", "fingerprint": "c59fc1af069898e4", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-c90e2993329d0e28", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 mission-control/app/dashboard/page.tsx:227"}, "properties": {"repobilityId": "247d5a097b88edf9", "scanner": "scanner-primary", "fingerprint": "c90e2993329d0e28", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-f3abfe9051fe3312", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 mission-control/app/api/cron/route.ts:53"}, "properties": {"repobilityId": "4d3eb80551c425f9", "scanner": "scanner-primary", "fingerprint": "f3abfe9051fe3312", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-42216d8e2ab3d702", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 mission-control/app/api/cron/daily/route.ts:44"}, "properties": {"repobilityId": "ab733b8fd3bf09e6", "scanner": "scanner-primary", "fingerprint": "42216d8e2ab3d702", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-e08bb87b673fa455", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 mission-control/app/api/cron/social/route.ts:20"}, "properties": {"repobilityId": "ceb86f57d7d1b927", "scanner": "scanner-primary", "fingerprint": "e08bb87b673fa455", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-ea4523a9a65434ce", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 mission-control/app/api/cron/weekly/route.ts:20"}, "properties": {"repobilityId": "3588364ac681b9f0", "scanner": "scanner-primary", "fingerprint": "ea4523a9a65434ce", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-cd3757b76bc5378e", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 mission-control/app/api/cron/hourly/route.ts:29"}, "properties": {"repobilityId": "8d226dba4fe63b91", "scanner": "scanner-primary", "fingerprint": "cd3757b76bc5378e", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-725e2965087e26bb", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 mission-control/app/api/cron/briefing/route.ts:167"}, "properties": {"repobilityId": "6f848da9d3908d5f", "scanner": "scanner-primary", "fingerprint": "725e2965087e26bb", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-01bbc690a2dae837", "level": "none", "message": {"text": "TODO/FIXME marker in shipping code \u2014 mission-control/app/api/channels/route.ts:16"}, "properties": {"repobilityId": "b257cf5e02c0031f", "scanner": "scanner-primary", "fingerprint": "01bbc690a2dae837", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.todo-marker"]}}, {"ruleId": "scanner-7412ecd1fddf0173", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 mission-control/app/api/webhooks/stripe/route.ts:138"}, "properties": {"repobilityId": "d9ca0124a566b469", "scanner": "scanner-primary", "fingerprint": "7412ecd1fddf0173", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-cbb8ca6ca2f0bb4a", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 mission-control/app/api/webhooks/shopify/route.ts:48"}, "properties": {"repobilityId": "5c183ecc33463565", "scanner": "scanner-primary", "fingerprint": "cbb8ca6ca2f0bb4a", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-0c79a3835204cbbd", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 mission-control/app/admin/agents/page.tsx:122"}, "properties": {"repobilityId": "d9b7870aee108365", "scanner": "scanner-primary", "fingerprint": "0c79a3835204cbbd", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-6c8bc306074b06ba", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 mission-control/app/admin/projects/page.tsx:106"}, "properties": {"repobilityId": "2588df9139e4c7a1", "scanner": "scanner-primary", "fingerprint": "6c8bc306074b06ba", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-476cfb7820186374", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 mission-control/app/admin/projects/[slug]/page.tsx:127"}, "properties": {"repobilityId": "a92590048c7542e2", "scanner": "scanner-primary", "fingerprint": "476cfb7820186374", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-d2d35e3ba97104d5", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 mission-control/app/settings/page.tsx:407"}, "properties": {"repobilityId": "4f062af8fcb67cda", "scanner": "scanner-primary", "fingerprint": "d2d35e3ba97104d5", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-8b4eb5efbb543cbd", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 mission-control/app/workflows/page.tsx:174"}, "properties": {"repobilityId": "a664d8eb0610c2f0", "scanner": "scanner-primary", "fingerprint": "8b4eb5efbb543cbd", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-74887743eee8b1c1", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 mission-control/app/workflows/[id]/runs/[runId]/page.tsx:215"}, "properties": {"repobilityId": "6003263189c84ba2", "scanner": "scanner-primary", "fingerprint": "74887743eee8b1c1", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-3117de2cd6556553", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 mission-control/app/autopilot/missions/page.tsx:102"}, "properties": {"repobilityId": "fcb488fcb147337b", "scanner": "scanner-primary", "fingerprint": "3117de2cd6556553", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-67ec55e68f434bfc", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 mission-control/app/autopilot/plans/page.tsx:111"}, "properties": {"repobilityId": "22479220cc972ac8", "scanner": "scanner-primary", "fingerprint": "67ec55e68f434bfc", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-c766527e3c3a386f", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 mission-control/app/autopilot/plans/[id]/page.tsx:306"}, "properties": {"repobilityId": "c9ac0c3356a30b90", "scanner": "scanner-primary", "fingerprint": "c766527e3c3a386f", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-9cac394b1bfa96e5", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 mission-control/app/content/page.tsx:177"}, "properties": {"repobilityId": "4837b84449a912fd", "scanner": "scanner-primary", "fingerprint": "9cac394b1bfa96e5", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-cf78df6fb25986a4", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 mission-control/scripts/refresh-wechat-token.ts:36"}, "properties": {"repobilityId": "6fddd55367f3e5cc", "scanner": "scanner-primary", "fingerprint": "cf78df6fb25986a4", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-6419a8a795b001cb", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 mission-control/scripts/test-mission.ts:20"}, "properties": {"repobilityId": "2eb2e0ca1e040085", "scanner": "scanner-primary", "fingerprint": "6419a8a795b001cb", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-7a2dd1000c4a7e04", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 mission-control/scripts/test-approval-adversarial.ts:127"}, "properties": {"repobilityId": "e7c86ba9463045af", "scanner": "scanner-primary", "fingerprint": "7a2dd1000c4a7e04", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-6116c035665cc016", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 mission-control/scripts/backfill-insight-zh.ts:91"}, "properties": {"repobilityId": "7dc946a2a7af9353", "scanner": "scanner-primary", "fingerprint": "6116c035665cc016", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-9a5a3022905dcb0e", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 mission-control/scripts/backfill-task-zh.ts:79"}, "properties": {"repobilityId": "b6f4a6a4f32953ea", "scanner": "scanner-primary", "fingerprint": "9a5a3022905dcb0e", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-0c54d3046014823c", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 mission-control/scripts/test-memory-retrieval.ts:5"}, "properties": {"repobilityId": "7147c334c3cb6f23", "scanner": "scanner-primary", "fingerprint": "0c54d3046014823c", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-2f7c70fdc2d330ff", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 mission-control/scripts/test-planner.ts:25"}, "properties": {"repobilityId": "56588692bbd7a483", "scanner": "scanner-primary", "fingerprint": "2f7c70fdc2d330ff", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-f0b43be04b3fb4f9", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 mission-control/scripts/sync-missions-to-obsidian.ts:135"}, "properties": {"repobilityId": "768cefda3db4a208", "scanner": "scanner-primary", "fingerprint": "f0b43be04b3fb4f9", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-37e27e3c4509a8a8", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 mission-control/scripts/test-wechat-adapter.ts:11"}, "properties": {"repobilityId": "4f44e81c53a0f136", "scanner": "scanner-primary", "fingerprint": "37e27e3c4509a8a8", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-27606703afd2a0c3", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 mission-control/scripts/explain-memory.ts:20"}, "properties": {"repobilityId": "9d4d1be244167e5f", "scanner": "scanner-primary", "fingerprint": "27606703afd2a0c3", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-95b675eb24b3b65c", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 mission-control/inngest/functions/memory-sync.ts:124"}, "properties": {"repobilityId": "35a77f97e3299911", "scanner": "scanner-primary", "fingerprint": "95b675eb24b3b65c", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-b9924ce6f1f1ff48", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 mission-control/inngest/functions/plan-on-insight.ts:66"}, "properties": {"repobilityId": "944cf7655fa5999a", "scanner": "scanner-primary", "fingerprint": "b9924ce6f1f1ff48", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-6a90f1b40d846d17", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 mission-control/components/dashboard/agent-status-mini.tsx:55"}, "properties": {"repobilityId": "8d7a6d470cbe5d50", "scanner": "scanner-primary", "fingerprint": "6a90f1b40d846d17", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-d31ba59a5f760d22", "level": "note", "message": {"text": "Icon-only button without accessible name \u2014 mission-control/components/admin/new-project-dialog.tsx:90"}, "properties": {"repobilityId": "5a63a157c029f3d3", "scanner": "scanner-primary", "fingerprint": "d31ba59a5f760d22", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.button.no-label"]}}, {"ruleId": "scanner-3553e9aae2426cd1", "level": "note", "message": {"text": "Icon-only button without accessible name \u2014 mission-control/components/admin/new-agent-dialog.tsx:61"}, "properties": {"repobilityId": "06cc5a24d1dfca45", "scanner": "scanner-primary", "fingerprint": "3553e9aae2426cd1", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.button.no-label"]}}, {"ruleId": "scanner-3585bba3f520eb46", "level": "note", "message": {"text": "Icon-only button without accessible name \u2014 mission-control/components/admin/goal-form-dialog.tsx:100"}, "properties": {"repobilityId": "fa3021cc4f450a78", "scanner": "scanner-primary", "fingerprint": "3585bba3f520eb46", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.button.no-label"]}}, {"ruleId": "scanner-9315b8f225a6bf1b", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 mission-control/components/layout/sidebar.tsx:100"}, "properties": {"repobilityId": "c15db2b692342b42", "scanner": "scanner-primary", "fingerprint": "9315b8f225a6bf1b", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-3d21f78cd5fcff75", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 mission-control/components/workflows/step-node.tsx:84"}, "properties": {"repobilityId": "7d14ecf0b94e18c3", "scanner": "scanner-primary", "fingerprint": "3d21f78cd5fcff75", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-47b96a2a076c61da", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 mission-control/prisma/seed.ts:7"}, "properties": {"repobilityId": "3e76634d47bee335", "scanner": "scanner-primary", "fingerprint": "47b96a2a076c61da", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-8d588c7695c90ea5", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 mission-control/prisma/seed_full.ts:9"}, "properties": {"repobilityId": "000a241e8c346bba", "scanner": "scanner-primary", "fingerprint": "8d588c7695c90ea5", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-5affdf8e24095f0f", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 mission-control/lib/llm.ts:58"}, "properties": {"repobilityId": "d335c2acc486e29d", "scanner": "scanner-primary", "fingerprint": "5affdf8e24095f0f", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-1adee56079dcb83c", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 mission-control/lib/email-drip.ts:62"}, "properties": {"repobilityId": "309328874c164c27", "scanner": "scanner-primary", "fingerprint": "1adee56079dcb83c", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-ca95145404d5a35b", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 mission-control/lib/insight-generator.ts:205"}, "properties": {"repobilityId": "360bbe3abd256d7a", "scanner": "scanner-primary", "fingerprint": "ca95145404d5a35b", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-b5e37490da843529", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 mission-control/lib/embeddings.ts:77"}, "properties": {"repobilityId": "41f9ba3f9047f0c2", "scanner": "scanner-primary", "fingerprint": "b5e37490da843529", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-0296c0e05f99b449", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 mission-control/lib/observer.ts:156"}, "properties": {"repobilityId": "16e3cc50b0d3f898", "scanner": "scanner-primary", "fingerprint": "0296c0e05f99b449", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-2a49045719d3b954", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 mission-control/lib/angel-scanner.ts:60"}, "properties": {"repobilityId": "a9b8f5637fc4f709", "scanner": "scanner-primary", "fingerprint": "2a49045719d3b954", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-e5b134b1ca4431de", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 mission-control/lib/integrations/shopify.ts:373"}, "properties": {"repobilityId": "d5d3743302159a5a", "scanner": "scanner-primary", "fingerprint": "e5b134b1ca4431de", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-64034b6b5cd6e6c6", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 mission-control/lib/integrations/wheatcoin.ts:122"}, "properties": {"repobilityId": "a5aeef350fd29a07", "scanner": "scanner-primary", "fingerprint": "64034b6b5cd6e6c6", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-bdba9dbcbce045d7", "level": "none", "message": {"text": "TODO/FIXME marker in shipping code \u2014 mission-control/lib/channels/adapters/linkedin.ts:22"}, "properties": {"repobilityId": "fc7289b8f8dc8202", "scanner": "scanner-primary", "fingerprint": "bdba9dbcbce045d7", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.todo-marker"]}}, {"ruleId": "scanner-a47ac1d541739990", "level": "none", "message": {"text": "TODO/FIXME marker in shipping code \u2014 mission-control/lib/channels/adapters/medium.ts:21"}, "properties": {"repobilityId": "e96cf9e856336e12", "scanner": "scanner-primary", "fingerprint": "a47ac1d541739990", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.todo-marker"]}}, {"ruleId": "scanner-1a848f4d747d4596", "level": "none", "message": {"text": "TODO/FIXME marker in shipping code \u2014 mission-control/lib/channels/adapters/youtube.ts:20"}, "properties": {"repobilityId": "6a2e7e27548f6d19", "scanner": "scanner-primary", "fingerprint": "1a848f4d747d4596", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.todo-marker"]}}, {"ruleId": "scanner-223d82591c890f83", "level": "warning", "message": {"text": "Privileged port 30 in use"}, "properties": {"repobilityId": "54f172e7d16fc662", "scanner": "scanner-primary", "fingerprint": "223d82591c890f83", "layer": "network", "severity": "medium", "confidence": 1.0, "tags": ["security", "ports"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/jarvis-cron.yml"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-6c6d1a60e126100c", "level": "warning", "message": {"text": "Privileged port 10 in use"}, "properties": {"repobilityId": "735372d6b5594915", "scanner": "scanner-primary", "fingerprint": "6c6d1a60e126100c", "layer": "network", "severity": "medium", "confidence": 1.0, "tags": ["security", "ports"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/jarvis-cron.yml"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-b91ac5d55b1cd0a3", "level": "warning", "message": {"text": "Insecure pattern 'cors_wildcard' in mission-control/lib/integrations/wheatcoin.ts:172"}, "properties": {"repobilityId": "0acc961507480445", "scanner": "scanner-primary", "fingerprint": "b91ac5d55b1cd0a3", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "cors_wildcard"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "mission-control/lib/integrations/wheatcoin.ts"}, "region": {"startLine": 172}}}]}, {"ruleId": "scanner-b4cbf22d2ca483c5", "level": "warning", "message": {"text": "Insecure pattern 'weak_hash' in mission-control/lib/channels/adapters/twitter.ts:91"}, "properties": {"repobilityId": "175179c85b55dd5c", "scanner": "scanner-primary", "fingerprint": "b4cbf22d2ca483c5", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "weak_hash"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "mission-control/lib/channels/adapters/twitter.ts"}, "region": {"startLine": 91}}}]}, {"ruleId": "scanner-87e1ee6139c34030", "level": "note", "message": {"text": "package.json defines install-time lifecycle scripts"}, "properties": {"repobilityId": "dcda42af8aa99b0f", "scanner": "scanner-primary", "fingerprint": "87e1ee6139c34030", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "npm", "install-scripts"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "mission-control/package.json"}, "region": {"startLine": 1}}}]}, {"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": "461590ba32740266", "scanner": "scanner-primary", "fingerprint": "141b30a41e03817b", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["license", "repo-hardening", "generated-repo-pattern"]}}, {"ruleId": "scanner-3ab5d313dda8e5f9", "level": "note", "message": {"text": "Debug logging residue appears in source files"}, "properties": {"repobilityId": "6e5285d277b64d01", "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": "1f944133db94a59a", "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": "5e617413fefaa53b", "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": "ae604b9c7bc4656f", "scanner": "scanner-primary", "fingerprint": "2d0c7b7ab8f8aacf", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["placeholder", "mock-data", "critical-flow", "generated-repo-pattern"]}}, {"ruleId": "scanner-11825279136b53a3", "level": "warning", "message": {"text": "CI is configured but no tests are detected"}, "properties": {"repobilityId": "371f3edc04a56687", "scanner": "scanner-primary", "fingerprint": "11825279136b53a3", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["tests", "ci", "config-theater", "repo-hardening", "generated-repo-pattern"]}}, {"ruleId": "scanner-b9088664ace7f748", "level": "note", "message": {"text": "Composite production-readiness gap"}, "properties": {"repobilityId": "4c65df17ab2aae8f", "scanner": "scanner-primary", "fingerprint": "b9088664ace7f748", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["production-readiness", "repo-hardening", "generated-repo-pattern"]}}, {"ruleId": "scanner-749d4bc1bd66df5f", "level": "warning", "message": {"text": "Agent instructions exist but release-hardening basics are missing"}, "properties": {"repobilityId": "d247a174884f3220", "scanner": "scanner-primary", "fingerprint": "749d4bc1bd66df5f", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "repo-hardening", "generated-repo-pattern"]}}, {"ruleId": "scanner-40d29133ac605e7d", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 mission-control/app/dashboard/page.tsx:52"}, "properties": {"repobilityId": "40b031c39840af0b", "scanner": "scanner-primary", "fingerprint": "40d29133ac605e7d", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-928b98f7e24e7a11", "level": "none", "message": {"text": "Commented-code block (6 lines) in mission-control/app/api/cron/daily/route.ts:25"}, "properties": {"repobilityId": "8d7f2076730fff1b", "scanner": "scanner-primary", "fingerprint": "928b98f7e24e7a11", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-cbf49a014ae49bf5", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 mission-control/app/api/cron/hourly/route.ts:147"}, "properties": {"repobilityId": "1f6774fc607dec0d", "scanner": "scanner-primary", "fingerprint": "cbf49a014ae49bf5", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-ea98193f17f52ab4", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 mission-control/app/api/settings/channels/wechat/materials/route.ts:27"}, "properties": {"repobilityId": "abd19c1b7e23ff21", "scanner": "scanner-primary", "fingerprint": "ea98193f17f52ab4", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-4cbf84db0002ff9d", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 mission-control/app/admin/agents/page.tsx:21"}, "properties": {"repobilityId": "6ecd49a673e9542e", "scanner": "scanner-primary", "fingerprint": "4cbf84db0002ff9d", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-4ce79a8deb70b395", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 mission-control/app/admin/agents/[id]/page.tsx:20"}, "properties": {"repobilityId": "9fbb917dd99683d2", "scanner": "scanner-primary", "fingerprint": "4ce79a8deb70b395", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-f105fcb1e19e0f9d", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 mission-control/app/admin/projects/page.tsx:21"}, "properties": {"repobilityId": "73a2a6b3778dd7e4", "scanner": "scanner-primary", "fingerprint": "f105fcb1e19e0f9d", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-6cc27426910cebc4", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 mission-control/app/admin/projects/[slug]/page.tsx:22"}, "properties": {"repobilityId": "74897e988446238b", "scanner": "scanner-primary", "fingerprint": "6cc27426910cebc4", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-b84d0cfabc7c9ca1", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 mission-control/app/settings/page.tsx:355"}, "properties": {"repobilityId": "b9365c3d46f50864", "scanner": "scanner-primary", "fingerprint": "b84d0cfabc7c9ca1", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-484f6fa6bfd92389", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 mission-control/app/workflows/page.tsx:77"}, "properties": {"repobilityId": "882fdf123bfcff6f", "scanner": "scanner-primary", "fingerprint": "484f6fa6bfd92389", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-57ef3974818ba25d", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 mission-control/app/workflows/[id]/page.tsx:63"}, "properties": {"repobilityId": "dd6a9898cf87fe69", "scanner": "scanner-primary", "fingerprint": "57ef3974818ba25d", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-ab354cc3df3aeca4", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 mission-control/app/workflows/[id]/runs/page.tsx:99"}, "properties": {"repobilityId": "a6010c5febb91879", "scanner": "scanner-primary", "fingerprint": "ab354cc3df3aeca4", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-f91202ebfdfa199f", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 mission-control/app/workflows/[id]/runs/[runId]/page.tsx:80"}, "properties": {"repobilityId": "b6d99bab825b70be", "scanner": "scanner-primary", "fingerprint": "f91202ebfdfa199f", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-65ac9aba4f472735", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 mission-control/app/workflows/new/page.tsx:14"}, "properties": {"repobilityId": "bea71c82ba25f005", "scanner": "scanner-primary", "fingerprint": "65ac9aba4f472735", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-3c01daafc5878d9d", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 mission-control/app/autopilot/page.tsx:191"}, "properties": {"repobilityId": "43274408859277d5", "scanner": "scanner-primary", "fingerprint": "3c01daafc5878d9d", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-431d6212ca3774db", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 mission-control/app/autopilot/insights/page.tsx:193"}, "properties": {"repobilityId": "23607eb313bd20de", "scanner": "scanner-primary", "fingerprint": "431d6212ca3774db", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-ba2741869309ac10", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 mission-control/app/autopilot/insights/[id]/page.tsx:161"}, "properties": {"repobilityId": "19c7fce7e37b2e91", "scanner": "scanner-primary", "fingerprint": "ba2741869309ac10", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-5bf1804213abc773", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 mission-control/app/autopilot/missions/page.tsx:162"}, "properties": {"repobilityId": "2f5b05921b152743", "scanner": "scanner-primary", "fingerprint": "5bf1804213abc773", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-519a320bae9775a9", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 mission-control/app/autopilot/missions/[id]/page.tsx:251"}, "properties": {"repobilityId": "759b5d1add63a29c", "scanner": "scanner-primary", "fingerprint": "519a320bae9775a9", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-96a2f51f8325358c", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 mission-control/app/autopilot/plans/page.tsx:160"}, "properties": {"repobilityId": "64ad19a2f14a706e", "scanner": "scanner-primary", "fingerprint": "96a2f51f8325358c", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-80cec3b4a10f3d0d", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 mission-control/app/autopilot/plans/[id]/page.tsx:120"}, "properties": {"repobilityId": "77121f98638da806", "scanner": "scanner-primary", "fingerprint": "80cec3b4a10f3d0d", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-9af14af2f173e1d3", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 mission-control/scripts/refresh-wechat-token.ts:39"}, "properties": {"repobilityId": "70882b00f3bd7acf", "scanner": "scanner-primary", "fingerprint": "9af14af2f173e1d3", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-2b0c580f2e34c55f", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 mission-control/scripts/backfill-insight-zh.ts:42"}, "properties": {"repobilityId": "f8f421bbb63d6174", "scanner": "scanner-primary", "fingerprint": "2b0c580f2e34c55f", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-0d34810112de272d", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 mission-control/scripts/backfill-task-zh.ts:32"}, "properties": {"repobilityId": "bce95ce739ba3e46", "scanner": "scanner-primary", "fingerprint": "0d34810112de272d", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-d7de4fa72aa92c65", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 mission-control/components/admin/goal-form-dialog.tsx:78"}, "properties": {"repobilityId": "049331f80a9f80b5", "scanner": "scanner-primary", "fingerprint": "d7de4fa72aa92c65", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-1dc06784c2f40a47", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 mission-control/components/tasks/kanban-board.tsx:110"}, "properties": {"repobilityId": "f58942e0b7fc8f3f", "scanner": "scanner-primary", "fingerprint": "1dc06784c2f40a47", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-8b299286112736c2", "level": "note", "message": {"text": "Legacy-named symbol `planner_v1` in mission-control/lib/planner.ts:154"}, "properties": {"repobilityId": "e4b61fefc70a0245", "scanner": "scanner-primary", "fingerprint": "8b299286112736c2", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-daa575090143c1e2", "level": "none", "message": {"text": "Commented-code block (7 lines) in mission-control/lib/integrations/stripe.ts:224"}, "properties": {"repobilityId": "7aac12238bbb0d02", "scanner": "scanner-primary", "fingerprint": "daa575090143c1e2", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-0673f342afadf406", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 mission-control/lib/integrations/stripe.ts:88"}, "properties": {"repobilityId": "c81737d1fdb6847c", "scanner": "scanner-primary", "fingerprint": "0673f342afadf406", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-604b6ff099f62efa", "level": "none", "message": {"text": "Commented-code block (7 lines) in mission-control/lib/integrations/gsc.ts:134"}, "properties": {"repobilityId": "23951f4fd5f3d63a", "scanner": "scanner-primary", "fingerprint": "604b6ff099f62efa", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-100b3c2a695cffe9", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 mission-control/lib/integrations/gsc.ts:211"}, "properties": {"repobilityId": "a9dd9a6a6ed677b3", "scanner": "scanner-primary", "fingerprint": "100b3c2a695cffe9", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-b61be0bb320c1a39", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 mission-control/lib/integrations/gmail.ts:36"}, "properties": {"repobilityId": "ea243b502ce0e6f7", "scanner": "scanner-primary", "fingerprint": "b61be0bb320c1a39", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-71c0144bddf1bb35", "level": "none", "message": {"text": "Commented-code block (7 lines) in mission-control/lib/integrations/ga.ts:133"}, "properties": {"repobilityId": "b778a4b4264af18c", "scanner": "scanner-primary", "fingerprint": "71c0144bddf1bb35", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-e41e187ab21e85da", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 mission-control/lib/integrations/ga.ts:211"}, "properties": {"repobilityId": "5ee550941d6fe907", "scanner": "scanner-primary", "fingerprint": "e41e187ab21e85da", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-b9495312b2ecdfa5", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 mission-control/lib/integrations/shopify.ts:127"}, "properties": {"repobilityId": "29be70e60597dfcf", "scanner": "scanner-primary", "fingerprint": "b9495312b2ecdfa5", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-10271722fd160f73", "level": "none", "message": {"text": "Commented-code block (7 lines) in mission-control/lib/integrations/tidio.ts:193"}, "properties": {"repobilityId": "adae48cd7086768d", "scanner": "scanner-primary", "fingerprint": "10271722fd160f73", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-7938b6ea7173b1d6", "level": "none", "message": {"text": "Commented-code block (5 lines) in mission-control/lib/channels/registry.ts:55"}, "properties": {"repobilityId": "b2b7510c758f0771", "scanner": "scanner-primary", "fingerprint": "7938b6ea7173b1d6", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-5d6a77363b334484", "level": "none", "message": {"text": "Commented-code block (6 lines) in mission-control/lib/channels/adapters/linkedin.ts:22"}, "properties": {"repobilityId": "cd644735d4f7a0f1", "scanner": "scanner-primary", "fingerprint": "5d6a77363b334484", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-b1ebaaa50bb9de56", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 mission-control/lib/channels/adapters/linkedin.ts:23"}, "properties": {"repobilityId": "ca2711fc84af2aae", "scanner": "scanner-primary", "fingerprint": "b1ebaaa50bb9de56", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-d47a9e8cc695828b", "level": "none", "message": {"text": "Commented-code block (9 lines) in mission-control/lib/channels/adapters/medium.ts:21"}, "properties": {"repobilityId": "6a4a1ce5c2d205fe", "scanner": "scanner-primary", "fingerprint": "d47a9e8cc695828b", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-0d89c9a22906b5d1", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 mission-control/lib/channels/adapters/medium.ts:22"}, "properties": {"repobilityId": "15c11afa973ab4c2", "scanner": "scanner-primary", "fingerprint": "0d89c9a22906b5d1", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-83be7f05a21dca45", "level": "none", "message": {"text": "Commented-code block (5 lines) in mission-control/lib/ai/claude-client.ts:35"}, "properties": {"repobilityId": "13d42d6ca0d33fb9", "scanner": "scanner-primary", "fingerprint": "83be7f05a21dca45", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}]}]}