{"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-f5b331227d7ffe6c", "name": "Possibly dead Python function: progress_logger", "shortDescription": {"text": "Possibly dead Python function: progress_logger"}, "fullDescription": {"text": "No callers detected by AST scan in this repo. Could be exported for external callers or a framework handler."}, "properties": {"scanner": "scanner-primary", "layer": "software", "severity": "low", "confidence": 1.0}}, {"id": "scanner-b72a5b58f9fb663c", "name": "Possibly dead Python function: progress_logger_scan", "shortDescription": {"text": "Possibly dead Python function: progress_logger_scan"}, "fullDescription": {"text": "No callers detected by AST scan in this repo. Could be exported for external callers or a framework handler."}, "properties": {"scanner": "scanner-primary", "layer": "software", "severity": "low", "confidence": 1.0}}, {"id": "scanner-28cb924669d05b0b", "name": "Possibly dead Python function: initialize_async_resources", "shortDescription": {"text": "Possibly dead Python function: initialize_async_resources"}, "fullDescription": {"text": "No callers detected by AST scan in this repo. Could be exported for external callers or a framework handler."}, "properties": {"scanner": "scanner-primary", "layer": "software", "severity": "low", "confidence": 1.0}}, {"id": "scanner-42ef7063324956fb", "name": "Possibly dead Python function: setup_logging", "shortDescription": {"text": "Possibly dead Python function: setup_logging"}, "fullDescription": {"text": "No callers detected by AST scan in this repo. Could be exported for external callers or a framework handler."}, "properties": {"scanner": "scanner-primary", "layer": "software", "severity": "low", "confidence": 1.0}}, {"id": "scanner-804077d5cdfadb1a", "name": "Possibly dead Python function: wrapped", "shortDescription": {"text": "Possibly dead Python function: wrapped"}, "fullDescription": {"text": "No callers detected by AST scan in this repo. Could be exported for external callers or a framework handler."}, "properties": {"scanner": "scanner-primary", "layer": "software", "severity": "low", "confidence": 1.0}}, {"id": "scanner-0a11cfef361b37c2", "name": "Possibly dead Python function: route_after_review", "shortDescription": {"text": "Possibly dead Python function: route_after_review"}, "fullDescription": {"text": "No callers detected by AST scan in this repo. Could be exported for external callers or a framework handler."}, "properties": {"scanner": "scanner-primary", "layer": "software", "severity": "low", "confidence": 1.0}}, {"id": "scanner-b28596d3620dddb4", "name": "Possibly dead Python function: model_post_init", "shortDescription": {"text": "Possibly dead Python function: model_post_init"}, "fullDescription": {"text": "No callers detected by AST scan in this repo. Could be exported for external callers or a framework handler."}, "properties": {"scanner": "scanner-primary", "layer": "software", "severity": "low", "confidence": 1.0}}, {"id": "scanner-2743ab5c05a4ee25", "name": "Possibly dead Python function: design_spec_node", "shortDescription": {"text": "Possibly dead Python function: design_spec_node"}, "fullDescription": {"text": "No callers detected by AST scan in this repo. Could be exported for external callers or a framework handler."}, "properties": {"scanner": "scanner-primary", "layer": "software", "severity": "low", "confidence": 1.0}}, {"id": "scanner-95c5a1834140b694", "name": "Possibly dead Python function: image_analysis_node", "shortDescription": {"text": "Possibly dead Python function: image_analysis_node"}, "fullDescription": {"text": "No callers detected by AST scan in this repo. Could be exported for external callers or a framework handler."}, "properties": {"scanner": "scanner-primary", "layer": "software", "severity": "low", "confidence": 1.0}}, {"id": "scanner-e92faafac0a389dd", "name": "Possibly dead Python function: item_search_node", "shortDescription": {"text": "Possibly dead Python function: item_search_node"}, "fullDescription": {"text": "No callers detected by AST scan in this repo. Could be exported for external callers or a framework handler."}, "properties": {"scanner": "scanner-primary", "layer": "software", "severity": "low", "confidence": 1.0}}, {"id": "scanner-0e4a1ecf4c0e2ba4", "name": "Possibly dead Python function: editorial_node", "shortDescription": {"text": "Possibly dead Python function: editorial_node"}, "fullDescription": {"text": "No callers detected by AST scan in this repo. Could be exported for external callers or a framework handler."}, "properties": {"scanner": "scanner-primary", "layer": "software", "severity": "low", "confidence": 1.0}}, {"id": "scanner-8dd13e8dbeb32318", "name": "Possibly dead Python function: review_node", "shortDescription": {"text": "Possibly dead Python function: review_node"}, "fullDescription": {"text": "No callers detected by AST scan in this repo. Could be exported for external callers or a framework handler."}, "properties": {"scanner": "scanner-primary", "layer": "software", "severity": "low", "confidence": 1.0}}, {"id": "scanner-e1d89d14210a3222", "name": "Possibly dead Python function: item_research_node", "shortDescription": {"text": "Possibly dead Python function: item_research_node"}, "fullDescription": {"text": "No callers detected by AST scan in this repo. Could be exported for external callers or a framework handler."}, "properties": {"scanner": "scanner-primary", "layer": "software", "severity": "low", "confidence": 1.0}}, {"id": "scanner-44c9602cb14080b1", "name": "Possibly dead Python function: publish_node", "shortDescription": {"text": "Possibly dead Python function: publish_node"}, "fullDescription": {"text": "No callers detected by AST scan in this repo. Could be exported for external callers or a framework handler."}, "properties": {"scanner": "scanner-primary", "layer": "software", "severity": "low", "confidence": 1.0}}, {"id": "scanner-f6f730673cad086b", "name": "Possibly dead Python function: celeb_search_node", "shortDescription": {"text": "Possibly dead Python function: celeb_search_node"}, "fullDescription": {"text": "No callers detected by AST scan in this repo. Could be exported for external callers or a framework handler."}, "properties": {"scanner": "scanner-primary", "layer": "software", "severity": "low", "confidence": 1.0}}, {"id": "scanner-dd2570c146ea0af4", "name": "Possibly dead Python function: news_research_node", "shortDescription": {"text": "Possibly dead Python function: news_research_node"}, "fullDescription": {"text": "No callers detected by AST scan in this repo. Could be exported for external callers or a framework handler."}, "properties": {"scanner": "scanner-primary", "layer": "software", "severity": "low", "confidence": 1.0}}, {"id": "scanner-d587741d075f89eb", "name": "Possibly dead Python function: summary_node", "shortDescription": {"text": "Possibly dead Python function: summary_node"}, "fullDescription": {"text": "No callers detected by AST scan in this repo. Could be exported for external callers or a framework handler."}, "properties": {"scanner": "scanner-primary", "layer": "software", "severity": "low", "confidence": 1.0}}, {"id": "scanner-150fdf168a8308f9", "name": "Possibly dead Python function: detect_main_language", "shortDescription": {"text": "Possibly dead Python function: detect_main_language"}, "fullDescription": {"text": "No callers detected by AST scan in this repo. Could be exported for external callers or a framework handler."}, "properties": {"scanner": "scanner-primary", "layer": "software", "severity": "low", "confidence": 1.0}}, {"id": "scanner-4278f5a9df58ce72", "name": "Possibly dead Python function: extract_img_tags_from_url", "shortDescription": {"text": "Possibly dead Python function: extract_img_tags_from_url"}, "fullDescription": {"text": "No callers detected by AST scan in this repo. Could be exported for external callers or a framework handler."}, "properties": {"scanner": "scanner-primary", "layer": "software", "severity": "low", "confidence": 1.0}}, {"id": "scanner-b0ac3da4eb66abe4", "name": "Possibly dead Python function: to_radian", "shortDescription": {"text": "Possibly dead Python function: to_radian"}, "fullDescription": {"text": "No callers detected by AST scan in this repo. Could be exported for external callers or a framework handler."}, "properties": {"scanner": "scanner-primary", "layer": "software", "severity": "low", "confidence": 1.0}}, {"id": "scanner-f7f53b3ea08efa03", "name": "Possibly dead Python function: basic_setup", "shortDescription": {"text": "Possibly dead Python function: basic_setup"}, "fullDescription": {"text": "No callers detected by AST scan in this repo. Could be exported for external callers or a framework handler."}, "properties": {"scanner": "scanner-primary", "layer": "software", "severity": "low", "confidence": 1.0}}, {"id": "scanner-19d347e30db47162", "name": "Possibly dead Python function: image_url_validation", "shortDescription": {"text": "Possibly dead Python function: image_url_validation"}, "fullDescription": {"text": "No callers detected by AST scan in this repo. Could be exported for external callers or a framework handler."}, "properties": {"scanner": "scanner-primary", "layer": "software", "severity": "low", "confidence": 1.0}}, {"id": "scanner-2847b5d76288e89a", "name": "Possibly dead Python function: research_node", "shortDescription": {"text": "Possibly dead Python function: research_node"}, "fullDescription": {"text": "No callers detected by AST scan in this repo. Could be exported for external callers or a framework handler."}, "properties": {"scanner": "scanner-primary", "layer": "software", "severity": "low", "confidence": 1.0}}, {"id": "scanner-d1c3b4945404cd66", "name": "Possibly dead Python function: fetch_sources_node", "shortDescription": {"text": "Possibly dead Python function: fetch_sources_node"}, "fullDescription": {"text": "No callers detected by AST scan in this repo. Could be exported for external callers or a framework handler."}, "properties": {"scanner": "scanner-primary", "layer": "software", "severity": "low", "confidence": 1.0}}, {"id": "scanner-48b144c517318c28", "name": "Possibly dead Python function: compose_layout_node", "shortDescription": {"text": "Possibly dead Python function: compose_layout_node"}, "fullDescription": {"text": "No callers detected by AST scan in this repo. Could be exported for external callers or a framework handler."}, "properties": {"scanner": "scanner-primary", "layer": "software", "severity": "low", "confidence": 1.0}}, {"id": "scanner-23963668e88994a5", "name": "Possibly dead Python function: publish_node", "shortDescription": {"text": "Possibly dead Python function: publish_node"}, "fullDescription": {"text": "No callers detected by AST scan in this repo. Could be exported for external callers or a framework handler."}, "properties": {"scanner": "scanner-primary", "layer": "software", "severity": "low", "confidence": 1.0}}, {"id": "scanner-c82c5917ba1d6c24", "name": "Stray `console.log` in TS/JS \u2014 packages/web/proxy.ts:99", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 packages/web/proxy.ts:99"}, "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-31b12c200fb19219", "name": "`truncate` class without `title=` for hover reveal \u2014 packages/web/app/admin/solutions/page.tsx:182", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 packages/web/app/admin/solutions/page.tsx:182"}, "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-e7556a7d43d43b43", "name": "`truncate` class without `title=` for hover reveal \u2014 packages/web/app/admin/raw-posts/page.tsx:194", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 packages/web/app/admin/raw-posts/page.tsx:194"}, "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-7857b8c5371355b9", "name": "`truncate` class without `title=` for hover reveal \u2014 packages/web/app/admin/raw-posts/[id]/page.tsx:450", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 packages/web/app/admin/raw-posts/[id]/page.tsx:450"}, "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-ee7ae44eb10a33a5", "name": "`truncate` class without `title=` for hover reveal \u2014 packages/web/app/admin/affiliate-catalog/page.tsx:293", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 packages/web/app/admin/affiliate-catalog/page.tsx:293"}, "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-fecdf8dde637e6b7", "name": "`truncate` class without `title=` for hover reveal \u2014 packages/web/app/admin/content-studio/PostPickerModal.tsx:185", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 packages/web/app/admin/content-studio/PostPickerModal.tsx:185"}, "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-0817cd82fd169341", "name": "`truncate` class without `title=` for hover reveal \u2014 packages/web/app/admin/entities/group-members/page.tsx:592", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 packages/web/app/admin/entities/group-members/page.tsx:592"}, "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-19ff63a9147e0eef", "name": "`truncate` class without `title=` for hover reveal \u2014 packages/web/app/admin/data-pipeline/instagram-accounts/page.tsx:65", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 packages/web/app/admin/data-pipeline/instagram-accounts/page.tsx:65"}, "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-1c98bcb354ba7a68", "name": "`truncate` class without `title=` for hover reveal \u2014 packages/web/app/admin/onboarding-pool/page.tsx:48", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 packages/web/app/admin/onboarding-pool/page.tsx:48"}, "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-bb6a50564841e148", "name": "`truncate` class without `title=` for hover reveal \u2014 packages/web/app/admin/editorial/magazine/drafts/[id]/page.tsx:272", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 packages/web/app/admin/editorial/magazine/drafts/[id]/page.tsx:272"}, "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-c248f82ef28e8ba2", "name": "`truncate` class without `title=` for hover reveal \u2014 packages/web/app/admin/picks/page.tsx:295", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 packages/web/app/admin/picks/page.tsx:295"}, "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-a7d141c9646eaaa5", "name": "Stray `console.log` in TS/JS \u2014 packages/web/app/examples/scroll-animation/page.tsx:8", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 packages/web/app/examples/scroll-animation/page.tsx:8"}, "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-828f7d0092ea0969", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 packages/web/app/profile/[userId]/page.tsx:80", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 packages/web/app/profile/[userId]/page.tsx:80"}, "fullDescription": {"text": "Open XSS surface unless the input is provably trusted. Replace with explicit JSX or sanitize via a vetted library.\n\nWhy: OWASP basics. Already partially flagged by the security analyzer.\nRule id: fq.dangerous-html"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-3c4b8d52fce818ed", "name": "`truncate` class without `title=` for hover reveal \u2014 packages/web/app/rankings/RankingsClient.tsx:174", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 packages/web/app/rankings/RankingsClient.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-7b36fa3d5617d26f", "name": "`truncate` class without `title=` for hover reveal \u2014 packages/web/app/lab/neon-glow/page.tsx:155", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 packages/web/app/lab/neon-glow/page.tsx:155"}, "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-5be33898962c08ce", "name": "`truncate` class without `title=` for hover reveal \u2014 packages/web/app/request/try/page.tsx:133", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 packages/web/app/request/try/page.tsx:133"}, "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-e11ca5e430b2c3f6", "name": "`truncate` class without `title=` for hover reveal \u2014 packages/web/lib/design-system/profile-header-card.tsx:117", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 packages/web/lib/design-system/profile-header-card.tsx:117"}, "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-5a141e6daea74a8c", "name": "`truncate` class without `title=` for hover reveal \u2014 packages/web/lib/design-system/desktop-header.tsx:250", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 packages/web/lib/design-system/desktop-header.tsx:250"}, "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-2ac9d6b87adab44d", "name": "Stray `console.log` in TS/JS \u2014 packages/web/lib/api/posts.ts:108", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 packages/web/lib/api/posts.ts:108"}, "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-7ebdac0a60f9fe89", "name": "Stray `console.log` in TS/JS \u2014 packages/web/lib/stores/behaviorStore.ts:79", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 packages/web/lib/stores/behaviorStore.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-30be45ee6d7be8c6", "name": "Stray `console.log` in TS/JS \u2014 packages/web/lib/hooks/useScrollAnimation.ts:120", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 packages/web/lib/hooks/useScrollAnimation.ts:120"}, "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-27d9343958f87aed", "name": "Stray `console.log` in TS/JS \u2014 packages/web/lib/hooks/useImageUpload.ts:73", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 packages/web/lib/hooks/useImageUpload.ts:73"}, "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-3359d44cd30bfef6", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 packages/web/lib/seo/json-ld.tsx:11", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 packages/web/lib/seo/json-ld.tsx:11"}, "fullDescription": {"text": "Open XSS surface unless the input is provably trusted. Replace with explicit JSX or sanitize via a vetted library.\n\nWhy: OWASP basics. Already partially flagged by the security analyzer.\nRule id: fq.dangerous-html"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-f1af09fdf9d13c6e", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 packages/web/lib/theme/theme-script.tsx:11", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 packages/web/lib/theme/theme-script.tsx:11"}, "fullDescription": {"text": "Open XSS surface unless the input is provably trusted. Replace with explicit JSX or sanitize via a vetted library.\n\nWhy: OWASP basics. Already partially flagged by the security analyzer.\nRule id: fq.dangerous-html"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-74c94a6af5cb4115", "name": "`truncate` class without `title=` for hover reveal \u2014 packages/web/lib/components/FeedCard.tsx:208", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 packages/web/lib/components/FeedCard.tsx:208"}, "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-24d693e65437ea87", "name": "TODO/FIXME marker in shipping code \u2014 packages/web/lib/components/FeedCard.tsx:164", "shortDescription": {"text": "TODO/FIXME marker in shipping code \u2014 packages/web/lib/components/FeedCard.tsx:164"}, "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-0823aff419a40ff6", "name": "Stray `console.log` in TS/JS \u2014 packages/web/lib/components/FeedCard.tsx:171", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 packages/web/lib/components/FeedCard.tsx:171"}, "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-e5c6d35416df7a1b", "name": "`truncate` class without `title=` for hover reveal \u2014 packages/web/lib/components/SidebarSearchPanel.tsx:206", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 packages/web/lib/components/SidebarSearchPanel.tsx:206"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-7b619f601841ec4f", "name": "`truncate` class without `title=` for hover reveal \u2014 packages/web/lib/components/Sidebar.tsx:83", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 packages/web/lib/components/Sidebar.tsx:83"}, "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-046f8e84780b6578", "name": "`truncate` class without `title=` for hover reveal \u2014 packages/web/lib/components/main/TrendingPostsSection.tsx:63", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 packages/web/lib/components/main/TrendingPostsSection.tsx:63"}, "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-e1e2740602736995", "name": "`truncate` class without `title=` for hover reveal \u2014 packages/web/lib/components/main/LatestPostsScroll.tsx:68", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 packages/web/lib/components/main/LatestPostsScroll.tsx:68"}, "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-a2600cbac86a648f", "name": "`truncate` class without `title=` for hover reveal \u2014 packages/web/lib/components/main/HelpFindSection.tsx:63", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 packages/web/lib/components/main/HelpFindSection.tsx:63"}, "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-b343836edd59754d", "name": "`truncate` class without `title=` for hover reveal \u2014 packages/web/lib/components/main/DecodedSolutionsSection.tsx:64", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 packages/web/lib/components/main/DecodedSolutionsSection.tsx:64"}, "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-fa48346d65e7169e", "name": "`truncate` class without `title=` for hover reveal \u2014 packages/web/lib/components/main/EditorialSection.tsx:96", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 packages/web/lib/components/main/EditorialSection.tsx:96"}, "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-2545fd3fc673a38c", "name": "`truncate` class without `title=` for hover reveal \u2014 packages/web/lib/components/explore/ArtistProfileCard.tsx:44", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 packages/web/lib/components/explore/ArtistProfileCard.tsx:44"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-83d61e4454a27230", "name": "`truncate` class without `title=` for hover reveal \u2014 packages/web/lib/components/explore/ExploreCardCell.tsx:131", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 packages/web/lib/components/explore/ExploreCardCell.tsx:131"}, "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-b8e6233bcb6e4454", "name": "`truncate` class without `title=` for hover reveal \u2014 packages/web/lib/components/main-c/CuratedStory.tsx:35", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 packages/web/lib/components/main-c/CuratedStory.tsx:35"}, "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-84811e4e3d9902e9", "name": "`truncate` class without `title=` for hover reveal \u2014 packages/web/lib/components/main-c/MoodboardGrid.tsx:128", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 packages/web/lib/components/main-c/MoodboardGrid.tsx:128"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-4bdb4f46bf2eff47", "name": "`truncate` class without `title=` for hover reveal \u2014 packages/web/lib/components/main-b/ScatteredCanvas.tsx:111", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 packages/web/lib/components/main-b/ScatteredCanvas.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-4119709d588defa6", "name": "`truncate` class without `title=` for hover reveal \u2014 packages/web/lib/components/main-b/QuickPeekCard.tsx:50", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 packages/web/lib/components/main-b/QuickPeekCard.tsx:50"}, "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-148fa4a9c26c7709", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 packages/web/lib/components/main-b/NeonDoodles.tsx:611", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 packages/web/lib/components/main-b/NeonDoodles.tsx:611"}, "fullDescription": {"text": "Open XSS surface unless the input is provably trusted. Replace with explicit JSX or sanitize via a vetted library.\n\nWhy: OWASP basics. Already partially flagged by the security analyzer.\nRule id: fq.dangerous-html"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-09b95cdd139b43f9", "name": "Stray `console.log` in TS/JS \u2014 packages/web/lib/components/fashion-scan/FashionScanScene.tsx:80", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 packages/web/lib/components/fashion-scan/FashionScanScene.tsx:80"}, "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-9572ab91bba1f946", "name": "`truncate` class without `title=` for hover reveal \u2014 packages/web/lib/components/admin/magazines/MagazineApprovalTable.t", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 packages/web/lib/components/admin/magazines/MagazineApprovalTable.tsx:59"}, "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-3d4e500149716822", "name": "`truncate` class without `title=` for hover reveal \u2014 packages/web/lib/components/admin/raw-posts/ItemsList.tsx:291", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 packages/web/lib/components/admin/raw-posts/ItemsList.tsx:291"}, "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-25e712b5bc24c50a", "name": "`truncate` class without `title=` for hover reveal \u2014 packages/web/lib/components/admin/raw-posts/SpotsOverlay.tsx:150", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 packages/web/lib/components/admin/raw-posts/SpotsOverlay.tsx:150"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-a34d30db7d974247", "name": "`truncate` class without `title=` for hover reveal \u2014 packages/web/lib/components/admin/raw-posts/CatalogMatchesGrid.tsx:", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 packages/web/lib/components/admin/raw-posts/CatalogMatchesGrid.tsx:95"}, "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-9b344f219732a652", "name": "`truncate` class without `title=` for hover reveal \u2014 packages/web/lib/components/admin/raw-posts/CodyAnalysisCard.tsx:34", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 packages/web/lib/components/admin/raw-posts/CodyAnalysisCard.tsx:343"}, "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-005d40d1ce769faf", "name": "`truncate` class without `title=` for hover reveal \u2014 packages/web/lib/components/admin/editorial/CandidateTable.tsx:78", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 packages/web/lib/components/admin/editorial/CandidateTable.tsx:78"}, "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-81f8e05e25f57d0a", "name": "`truncate` class without `title=` for hover reveal \u2014 packages/web/lib/components/admin/editorial/PipelinesPanel.tsx:170", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 packages/web/lib/components/admin/editorial/PipelinesPanel.tsx:170"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-68916883d75b131c", "name": "`truncate` class without `title=` for hover reveal \u2014 packages/web/lib/components/admin/editorial/magazine/ArticleTable.t", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 packages/web/lib/components/admin/editorial/magazine/ArticleTable.tsx:73"}, "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-216ed5c3f0573d04", "name": "`truncate` class without `title=` for hover reveal \u2014 packages/web/lib/components/admin/editorial/magazine/Recommendation", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 packages/web/lib/components/admin/editorial/magazine/RecommendationTable.tsx:94"}, "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-5302f3ae8d571b1b", "name": "`truncate` class without `title=` for hover reveal \u2014 packages/web/lib/components/admin/editorial/magazine/MagazineRender", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 packages/web/lib/components/admin/editorial/magazine/MagazineRenderer.tsx:274"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-23fa836b98369425", "name": "`truncate` class without `title=` for hover reveal \u2014 packages/web/lib/components/admin/content/ReportTable.tsx:169", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 packages/web/lib/components/admin/content/ReportTable.tsx:169"}, "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-9627f924d75f7661", "name": "`truncate` class without `title=` for hover reveal \u2014 packages/web/lib/components/admin/content/AdminPostTable.tsx:195", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 packages/web/lib/components/admin/content/AdminPostTable.tsx:195"}, "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-03438e5a1ed21510", "name": "`truncate` class without `title=` for hover reveal \u2014 packages/web/lib/components/profile/ActivityItemCard.tsx:68", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 packages/web/lib/components/profile/ActivityItemCard.tsx:68"}, "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-12308de31ebd71d9", "name": "`truncate` class without `title=` for hover reveal \u2014 packages/web/lib/components/profile/TryDetailModal.tsx:164", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 packages/web/lib/components/profile/TryDetailModal.tsx:164"}, "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-e40b366618317561", "name": "Stray `console.log` in TS/JS \u2014 packages/web/lib/components/profile/EmptyState.tsx:98", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 packages/web/lib/components/profile/EmptyState.tsx:98"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-1998b1b865fb5762", "name": "`truncate` class without `title=` for hover reveal \u2014 packages/web/lib/components/profile/SpotsList.tsx:71", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 packages/web/lib/components/profile/SpotsList.tsx:71"}, "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-1fb9bc0bac4bb744", "name": "`truncate` class without `title=` for hover reveal \u2014 packages/web/lib/components/profile/PostsGrid.tsx:55", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 packages/web/lib/components/profile/PostsGrid.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-cfff7aaaf91fbafc", "name": "`truncate` class without `title=` for hover reveal \u2014 packages/web/lib/components/profile/SolutionsList.tsx:90", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 packages/web/lib/components/profile/SolutionsList.tsx:90"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-2019a98e8ec34521", "name": "`truncate` class without `title=` for hover reveal \u2014 packages/web/lib/components/profile/ClosetGrid.tsx:112", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 packages/web/lib/components/profile/ClosetGrid.tsx:112"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-2b46538594a0a48d", "name": "Stray `console.log` in TS/JS \u2014 packages/web/lib/components/profile/InkEconomyCard.tsx:13", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 packages/web/lib/components/profile/InkEconomyCard.tsx:13"}, "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-62e7728b3b6ce429", "name": "Stray `console.log` in TS/JS \u2014 packages/web/lib/components/profile/StatsCards.tsx:65", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 packages/web/lib/components/profile/StatsCards.tsx:65"}, "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-34a5153c9bb00e5c", "name": "`truncate` class without `title=` for hover reveal \u2014 packages/web/lib/components/profile/LikesGrid.tsx:49", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 packages/web/lib/components/profile/LikesGrid.tsx:49"}, "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-a30b1425d989cbbe", "name": "`truncate` class without `title=` for hover reveal \u2014 packages/web/lib/components/profile/SavedGrid.tsx:54", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 packages/web/lib/components/profile/SavedGrid.tsx:54"}, "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-b8ee561c32fab7c0", "name": "`truncate` class without `title=` for hover reveal \u2014 packages/web/lib/components/vton/VtonItemPanel.tsx:284", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 packages/web/lib/components/vton/VtonItemPanel.tsx:284"}, "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-0bf12d79ea5602e2", "name": "`truncate` class without `title=` for hover reveal \u2014 packages/web/lib/components/collection/MagazinePreviewModal.tsx:241", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 packages/web/lib/components/collection/MagazinePreviewModal.tsx:241"}, "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-577639d66cdafc0e", "name": "Stray `console.log` in TS/JS \u2014 packages/web/lib/components/collection/IssueSpine.tsx:241", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 packages/web/lib/components/collection/IssueSpine.tsx:241"}, "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-867df6093e6d9203", "name": "Stray `console.log` in TS/JS \u2014 packages/web/lib/components/collection/IssueDetailPanel.tsx:60", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 packages/web/lib/components/collection/IssueDetailPanel.tsx: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-441d5903dde8421b", "name": "Stray `console.log` in TS/JS \u2014 packages/web/lib/components/collection/studio/SplineStudio.tsx:89", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 packages/web/lib/components/collection/studio/SplineStudio.tsx:89"}, "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-04cce2df56fc55bc", "name": "Stray `console.log` in TS/JS \u2014 packages/web/lib/components/auth/AuthProvider.tsx:21", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 packages/web/lib/components/auth/AuthProvider.tsx:21"}, "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-d4ddeb39e22699e2", "name": "`truncate` class without `title=` for hover reveal \u2014 packages/web/lib/components/detail/TryCard.tsx:67", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 packages/web/lib/components/detail/TryCard.tsx:67"}, "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-9f01479bfd5e2e8e", "name": "`truncate` class without `title=` for hover reveal \u2014 packages/web/lib/components/detail/OtherSolutionsList.tsx:126", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 packages/web/lib/components/detail/OtherSolutionsList.tsx:126"}, "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-e1c09b163d408962", "name": "`truncate` class without `title=` for hover reveal \u2014 packages/web/lib/components/detail/TopSolutionCard.tsx:100", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 packages/web/lib/components/detail/TopSolutionCard.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-218b90f6bf32ad37", "name": "`truncate` class without `title=` for hover reveal \u2014 packages/web/lib/components/detail/RelatedImages.tsx:166", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 packages/web/lib/components/detail/RelatedImages.tsx:166"}, "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-a50b6051ea1bcba9", "name": "`truncate` class without `title=` for hover reveal \u2014 packages/web/lib/components/detail/ImageDetailPreview.tsx:204", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 packages/web/lib/components/detail/ImageDetailPreview.tsx:204"}, "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-bdb0266f9ee0dc0a", "name": "Stray `console.log` in TS/JS \u2014 packages/web/lib/components/detail/ImageDetailModal.tsx:161", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 packages/web/lib/components/detail/ImageDetailModal.tsx:161"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-db48b54fe2857bc4", "name": "`truncate` class without `title=` for hover reveal \u2014 packages/web/lib/components/detail/magazine/MagazineItemsSection.ts", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 packages/web/lib/components/detail/magazine/MagazineItemsSection.tsx:518"}, "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-bedc485e8e07c6be", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 packages/web/lib/components/dome/DomeGallery.tsx:515", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 packages/web/lib/components/dome/DomeGallery.tsx:515"}, "fullDescription": {"text": "Open XSS surface unless the input is provably trusted. Replace with explicit JSX or sanitize via a vetted library.\n\nWhy: OWASP basics. Already partially flagged by the security analyzer.\nRule id: fq.dangerous-html"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-eba849ee54263f71", "name": "`truncate` class without `title=` for hover reveal \u2014 packages/web/lib/components/search/RecentSearches.tsx:63", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 packages/web/lib/components/search/RecentSearches.tsx:63"}, "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-e3d3356983f5f4e3", "name": "`truncate` class without `title=` for hover reveal \u2014 packages/web/lib/components/search/SearchSuggestions.tsx:147", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 packages/web/lib/components/search/SearchSuggestions.tsx:147"}, "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-f9b8226db9cdbc43", "name": "`truncate` class without `title=` for hover reveal \u2014 packages/web/lib/components/search/MediaResultCard.tsx:76", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 packages/web/lib/components/search/MediaResultCard.tsx:76"}, "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-18a814f7c28bd9d3", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 packages/web/lib/components/search/MediaResultCard.tsx:44", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 packages/web/lib/components/search/MediaResultCard.tsx:44"}, "fullDescription": {"text": "Open XSS surface unless the input is provably trusted. Replace with explicit JSX or sanitize via a vetted library.\n\nWhy: OWASP basics. Already partially flagged by the security analyzer.\nRule id: fq.dangerous-html"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-09559a548ec5ce5a", "name": "`truncate` class without `title=` for hover reveal \u2014 packages/web/lib/components/search/SearchResults.tsx:254", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 packages/web/lib/components/search/SearchResults.tsx:254"}, "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-8cd78a2ab9883163", "name": "`truncate` class without `title=` for hover reveal \u2014 packages/web/lib/components/search/PersonResultCard.tsx:63", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 packages/web/lib/components/search/PersonResultCard.tsx:63"}, "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-2e2a0a862ee2067d", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 packages/web/lib/components/search/PersonResultCard.tsx:34", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 packages/web/lib/components/search/PersonResultCard.tsx:34"}, "fullDescription": {"text": "Open XSS surface unless the input is provably trusted. Replace with explicit JSX or sanitize via a vetted library.\n\nWhy: OWASP basics. Already partially flagged by the security analyzer.\nRule id: fq.dangerous-html"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-dfac72f0e0e7f306", "name": "`truncate` class without `title=` for hover reveal \u2014 packages/web/lib/components/search/ItemResultSection.tsx:103", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 packages/web/lib/components/search/ItemResultSection.tsx:103"}, "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-7b0b7765f44bbdd4", "name": "`truncate` class without `title=` for hover reveal \u2014 packages/web/lib/components/onboarding/TasteOnboardingPrompt.tsx:44", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 packages/web/lib/components/onboarding/TasteOnboardingPrompt.tsx:44"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-2172229b4c708300", "name": "`truncate` class without `title=` for hover reveal \u2014 packages/web/lib/components/cody/RecommendedCard.tsx:60", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 packages/web/lib/components/cody/RecommendedCard.tsx:60"}, "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-b0580e8b1010a8be", "name": "`truncate` class without `title=` for hover reveal \u2014 packages/web/lib/components/cody/LookDetail.tsx:157", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 packages/web/lib/components/cody/LookDetail.tsx:157"}, "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-27842048b7e34eba", "name": "`truncate` class without `title=` for hover reveal \u2014 packages/web/lib/components/cody/SavedLooks.tsx:194", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 packages/web/lib/components/cody/SavedLooks.tsx:194"}, "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-1c29af006f5555db", "name": "`truncate` class without `title=` for hover reveal \u2014 packages/web/lib/components/shared/ShareModal.tsx:136", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 packages/web/lib/components/shared/ShareModal.tsx:136"}, "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-e810d28087520533", "name": "`truncate` class without `title=` for hover reveal \u2014 packages/web/lib/components/shared/CommentSection.tsx:63", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 packages/web/lib/components/shared/CommentSection.tsx:63"}, "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-f79763c3c6e14d30", "name": "`truncate` class without `title=` for hover reveal \u2014 packages/web/lib/components/main-renewal/EditorPicks.tsx:64", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 packages/web/lib/components/main-renewal/EditorPicks.tsx:64"}, "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-826266c0b80b41e4", "name": "`truncate` class without `title=` for hover reveal \u2014 packages/web/lib/components/main-renewal/SmartNav.tsx:224", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 packages/web/lib/components/main-renewal/SmartNav.tsx:224"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-afd48e3e0d463827", "name": "`truncate` class without `title=` for hover reveal \u2014 packages/web/lib/components/main-renewal/DecodeShowcase.tsx:498", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 packages/web/lib/components/main-renewal/DecodeShowcase.tsx:498"}, "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-f3a5621a8f698118", "name": "`truncate` class without `title=` for hover reveal \u2014 packages/web/lib/components/main-renewal/HeroSpotMarker.tsx:143", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 packages/web/lib/components/main-renewal/HeroSpotMarker.tsx:143"}, "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-a9d74d703b1f0ab8", "name": "`truncate` class without `title=` for hover reveal \u2014 packages/web/lib/components/request/SubmitPreview.tsx:72", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 packages/web/lib/components/request/SubmitPreview.tsx:72"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-f6c246675e08fa2b", "name": "`truncate` class without `title=` for hover reveal \u2014 packages/web/lib/components/request/DetectedItemCard.tsx:127", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 packages/web/lib/components/request/DetectedItemCard.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-731bd30b9cd1dfe3", "name": "`truncate` class without `title=` for hover reveal \u2014 packages/web/lib/components/request/SingleImagePreview.tsx:90", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 packages/web/lib/components/request/SingleImagePreview.tsx:90"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-c2fed98afc083af1", "name": "`truncate` class without `title=` for hover reveal \u2014 packages/web/lib/components/request/ImagePreview.tsx:86", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 packages/web/lib/components/request/ImagePreview.tsx:86"}, "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-01d281c6810499f3", "name": "`truncate` class without `title=` for hover reveal \u2014 packages/web/lib/components/request/UploadFlowSteps.tsx:423", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 packages/web/lib/components/request/UploadFlowSteps.tsx:423"}, "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-84d1168b2b9d73eb", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 packages/web/lib/components/main-d/StickerPeel.tsx:184", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 packages/web/lib/components/main-d/StickerPeel.tsx:184"}, "fullDescription": {"text": "Open XSS surface unless the input is provably trusted. Replace with explicit JSX or sanitize via a vetted library.\n\nWhy: OWASP basics. Already partially flagged by the security analyzer.\nRule id: fq.dangerous-html"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-4482f4c41a8bb915", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 packages/mobile/app/+html.tsx:22", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 packages/mobile/app/+html.tsx:22"}, "fullDescription": {"text": "Open XSS surface unless the input is provably trusted. Replace with explicit JSX or sanitize via a vetted library.\n\nWhy: OWASP basics. Already partially flagged by the security analyzer.\nRule id: fq.dangerous-html"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-747216c4c98cb5b8", "name": "Stray `console.log` in TS/JS \u2014 scripts/vton-poc-speed.ts:60", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/vton-poc-speed.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-94bc892f84cc9c59", "name": "Stray `console.log` in TS/JS \u2014 scripts/vton-poc.ts:137", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/vton-poc.ts:137"}, "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-139747d1a10c50ed", "name": "Stray `console.log` in TS/JS \u2014 .claude/skills/gstack/scripts/analytics.ts:168", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 .claude/skills/gstack/scripts/analytics.ts:168"}, "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-d2176b23d9b3b189", "name": "Stray `console.log` in TS/JS \u2014 .claude/skills/gstack/scripts/eval-select.ts:33", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 .claude/skills/gstack/scripts/eval-select.ts:33"}, "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-abc7689a272359c3", "name": "Stray `console.log` in TS/JS \u2014 .claude/skills/gstack/scripts/eval-summary.ts:20", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 .claude/skills/gstack/scripts/eval-summary.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-8318f4714f1261f7", "name": "Stray `console.log` in TS/JS \u2014 .claude/skills/gstack/scripts/host-config-export.ts:38", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 .claude/skills/gstack/scripts/host-config-export.ts:38"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-e9c46e4c3cfc17a3", "name": "Stray `console.log` in TS/JS \u2014 .claude/skills/gstack/scripts/eval-list.ts:32", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 .claude/skills/gstack/scripts/eval-list.ts:32"}, "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-d1fdcff32b1decb5", "name": "Stray `console.log` in TS/JS \u2014 .claude/skills/gstack/scripts/eval-compare.ts:50", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 .claude/skills/gstack/scripts/eval-compare.ts:50"}, "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-0aef8732c9bb3704", "name": "Stray `console.log` in TS/JS \u2014 .claude/skills/gstack/scripts/skill-check.ts:26", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 .claude/skills/gstack/scripts/skill-check.ts:26"}, "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-ed99c9442c109928", "name": "Stray `console.log` in TS/JS \u2014 .claude/skills/gstack/scripts/dev-skill.ts:27", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 .claude/skills/gstack/scripts/dev-skill.ts:27"}, "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-4a620ea5c815de14", "name": "Stray `console.log` in TS/JS \u2014 .claude/skills/gstack/scripts/slop-diff.ts:29", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 .claude/skills/gstack/scripts/slop-diff.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-0abdcc1d71551a10", "name": "Stray `console.log` in TS/JS \u2014 .claude/skills/gstack/scripts/gen-skill-docs.ts:527", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 .claude/skills/gstack/scripts/gen-skill-docs.ts:527"}, "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-5e7cd0a42043a103", "name": "Stray `console.log` in TS/JS \u2014 .claude/skills/gstack/browse/src/server.ts:338", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 .claude/skills/gstack/browse/src/server.ts:338"}, "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-70e4084bd8295b23", "name": "Stray `console.log` in TS/JS \u2014 .claude/skills/gstack/browse/src/cli.ts:642", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 .claude/skills/gstack/browse/src/cli.ts:642"}, "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-c7d666044c2e5ad3", "name": "Stray `console.log` in TS/JS \u2014 .claude/skills/gstack/browse/src/find-browse.ts:58", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 .claude/skills/gstack/browse/src/find-browse.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-651c6dccdd014826", "name": "Stray `console.log` in TS/JS \u2014 .claude/skills/gstack/browse/src/cookie-picker-routes.ts:243", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 .claude/skills/gstack/browse/src/cookie-picker-routes.ts:243"}, "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-5d1a2d8c251e5e73", "name": "Stray `console.log` in TS/JS \u2014 .claude/skills/gstack/browse/src/sidebar-agent.ts:109", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 .claude/skills/gstack/browse/src/sidebar-agent.ts:109"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-f8a8b66c9702c9f6", "name": "Icon-only button without accessible name \u2014 .claude/skills/gstack/browse/src/cookie-picker-ui.ts:369", "shortDescription": {"text": "Icon-only button without accessible name \u2014 .claude/skills/gstack/browse/src/cookie-picker-ui.ts:369"}, "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-4d13a7d1277cd6b5", "name": "Stray `console.log` in TS/JS \u2014 .claude/skills/gstack/browse/src/meta-commands.ts:111", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 .claude/skills/gstack/browse/src/meta-commands.ts:111"}, "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-ffc887e26fc2f8c3", "name": "Stray `console.log` in TS/JS \u2014 .claude/skills/gstack/browse/src/browser-manager.ts:171", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 .claude/skills/gstack/browse/src/browser-manager.ts:171"}, "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-7f188dc660ef70e6", "name": "Stray `console.log` in TS/JS \u2014 .claude/skills/gstack/browse/test/bun-polyfill.test.ts:18", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 .claude/skills/gstack/browse/test/bun-polyfill.test.ts:18"}, "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-956a72f3346d0337", "name": "Stray `console.log` in TS/JS \u2014 .claude/skills/gstack/browse/test/findport.test.ts:117", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 .claude/skills/gstack/browse/test/findport.test.ts:117"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-1b8e9f7869548c2f", "name": "Stray `console.log` in TS/JS \u2014 .claude/skills/gstack/browse/test/test-server.ts:54", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 .claude/skills/gstack/browse/test/test-server.ts:54"}, "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-54856e894d1c65dc", "name": "Stray `console.log` in TS/JS \u2014 .claude/skills/gstack/extension/background.js:488", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 .claude/skills/gstack/extension/background.js:488"}, "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-823b884f5d3eb05d", "name": "Stray `console.log` in TS/JS \u2014 .claude/skills/gstack/design/prototype.ts:39", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 .claude/skills/gstack/design/prototype.ts:39"}, "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-9059ac9804dc9d5e", "name": "Stray `console.log` in TS/JS \u2014 .claude/skills/gstack/design/src/serve.ts:138", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 .claude/skills/gstack/design/src/serve.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-094e4fc83a90595f", "name": "Stray `console.log` in TS/JS \u2014 .claude/skills/gstack/design/src/cli.ts:57", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 .claude/skills/gstack/design/src/cli.ts:57"}, "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-77d030ba108a3728", "name": "Stray `console.log` in TS/JS \u2014 .claude/skills/gstack/design/src/compare.ts:627", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 .claude/skills/gstack/design/src/compare.ts:627"}, "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-7dd50d4f39c31908", "name": "Stray `console.log` in TS/JS \u2014 .claude/skills/gstack/design/src/gallery.ts:250", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 .claude/skills/gstack/design/src/gallery.ts:250"}, "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-f3840524203da0e8", "name": "Stray `console.log` in TS/JS \u2014 .claude/skills/gstack/design/src/evolve.ts:98", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 .claude/skills/gstack/design/src/evolve.ts:98"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-6392a601090450b3", "name": "Stray `console.log` in TS/JS \u2014 .claude/skills/gstack/design/src/generate.ts:158", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 .claude/skills/gstack/design/src/generate.ts:158"}, "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-c6906f53c9e41566", "name": "Stray `console.log` in TS/JS \u2014 .claude/skills/gstack/design/src/iterate.ts:70", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 .claude/skills/gstack/design/src/iterate.ts:70"}, "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-3b9dc27cd7c1dd1e", "name": "Stray `console.log` in TS/JS \u2014 .claude/skills/gstack/design/src/check.ts:95", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 .claude/skills/gstack/design/src/check.ts:95"}, "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-6a55a45319cd6e51", "name": "Stray `console.log` in TS/JS \u2014 .claude/skills/gstack/design/src/variants.ts:176", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 .claude/skills/gstack/design/src/variants.ts:176"}, "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-cbe57f888872e88a", "name": "Stray `console.log` in TS/JS \u2014 .claude/skills/gstack/test/codex-e2e.test.ts:109", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 .claude/skills/gstack/test/codex-e2e.test.ts:109"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-bb69749e8e3c5b33", "name": "Stray `console.log` in TS/JS \u2014 .claude/skills/gstack/test/skill-e2e-plan.test.ts:401", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 .claude/skills/gstack/test/skill-e2e-plan.test.ts:401"}, "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-7c41aa780e508729", "name": "Stray `console.log` in TS/JS \u2014 .claude/skills/gstack/test/skill-e2e.test.ts:143", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 .claude/skills/gstack/test/skill-e2e.test.ts:143"}, "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-37bc7a5580c1753d", "name": "Stray `console.log` in TS/JS \u2014 .claude/skills/gstack/test/skill-e2e-qa-bugs.test.ts:151", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 .claude/skills/gstack/test/skill-e2e-qa-bugs.test.ts:151"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-89fd4ce55439b37f", "name": "Stray `console.log` in TS/JS \u2014 .claude/skills/gstack/test/skill-e2e-qa-workflow.test.ts:266", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 .claude/skills/gstack/test/skill-e2e-qa-workflow.test.ts:266"}, "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-16efa1d2627322de", "name": "TODO/FIXME marker in shipping code \u2014 .claude/skills/gstack/test/skill-routing-e2e.test.ts:382", "shortDescription": {"text": "TODO/FIXME marker in shipping code \u2014 .claude/skills/gstack/test/skill-routing-e2e.test.ts:382"}, "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-6a32122217cb8a37", "name": "Stray `console.log` in TS/JS \u2014 .claude/skills/gstack/test/skill-routing-e2e.test.ts:159", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 .claude/skills/gstack/test/skill-routing-e2e.test.ts:159"}, "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-93f889852a415184", "name": "Stray `console.log` in TS/JS \u2014 .claude/skills/gstack/test/skill-e2e-cso.test.ts:129", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 .claude/skills/gstack/test/skill-e2e-cso.test.ts:129"}, "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-f08ade7beec95821", "name": "Stray `console.log` in TS/JS \u2014 .claude/skills/gstack/test/gemini-e2e.test.ts:105", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 .claude/skills/gstack/test/gemini-e2e.test.ts:105"}, "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-20f0418b11c5d494", "name": "Stray `console.log` in TS/JS \u2014 .claude/skills/gstack/test/skill-e2e-learnings.test.ts:32", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 .claude/skills/gstack/test/skill-e2e-learnings.test.ts:32"}, "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-4e12a5fbb3b7b278", "name": "Stray `console.log` in TS/JS \u2014 .claude/skills/gstack/test/skill-e2e-bws.test.ts:191", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 .claude/skills/gstack/test/skill-e2e-bws.test.ts:191"}, "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-9c828c479889e8cc", "name": "Stray `console.log` in TS/JS \u2014 .claude/skills/gstack/test/skill-e2e-workflow.test.ts:113", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 .claude/skills/gstack/test/skill-e2e-workflow.test.ts:113"}, "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-a98f9870d483077e", "name": "Stray `console.log` in TS/JS \u2014 .claude/skills/gstack/test/skill-e2e-session-intelligence.test.ts:37", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 .claude/skills/gstack/test/skill-e2e-session-intelligence.test.ts:37"}, "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-52464209672a7a21", "name": "Stray `console.log` in TS/JS \u2014 .claude/skills/gstack/test/skill-e2e-sidebar.test.ts:299", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 .claude/skills/gstack/test/skill-e2e-sidebar.test.ts:299"}, "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-7e6451b91cf711fa", "name": "Stray `console.log` in TS/JS \u2014 .claude/skills/gstack/test/skill-e2e-review.test.ts:249", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 .claude/skills/gstack/test/skill-e2e-review.test.ts:249"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-b5bfdcdae48fbd3c", "name": "Stray `console.log` in TS/JS \u2014 .claude/skills/gstack/test/skill-llm-eval.test.ts:74", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 .claude/skills/gstack/test/skill-llm-eval.test.ts:74"}, "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-120bae28a6898f54", "name": "Stray `console.log` in TS/JS \u2014 .claude/skills/gstack/test/skill-e2e-design.test.ts:140", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 .claude/skills/gstack/test/skill-e2e-design.test.ts:140"}, "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-55cb1a9ee65e664f", "name": "Stray `console.log` in TS/JS \u2014 .claude/skills/gstack/test/helpers/e2e-helpers.ts:137", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 .claude/skills/gstack/test/helpers/e2e-helpers.ts:137"}, "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-7433914a8ca74fcc", "name": "Privileged port 4 in use", "shortDescription": {"text": "Privileged port 4 in use"}, "fullDescription": {"text": "Port 4 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-b7b1fb75a2a95009", "name": "Privileged port 19 in use", "shortDescription": {"text": "Privileged port 19 in use"}, "fullDescription": {"text": "Port 19 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-1a60014486c1bb1d", "name": "Docker base image is tag-pinned but not digest-pinned: rust:1.91-slim", "shortDescription": {"text": "Docker base image is tag-pinned but not digest-pinned: rust:1.91-slim"}, "fullDescription": {"text": "Container tags can be retagged upstream. Pin production base images to a reviewed digest (`image@sha256:...`) when reproducibility and supply-chain integrity matter."}, "properties": {"scanner": "scanner-primary", "layer": "hardware", "severity": "low", "confidence": 1.0}}, {"id": "scanner-acc0afe522a9d9cf", "name": "Docker base image is tag-pinned but not digest-pinned: debian:bookworm-slim", "shortDescription": {"text": "Docker base image is tag-pinned but not digest-pinned: debian:bookworm-slim"}, "fullDescription": {"text": "Container tags can be retagged upstream. Pin production base images to a reviewed digest (`image@sha256:...`) when reproducibility and supply-chain integrity matter."}, "properties": {"scanner": "scanner-primary", "layer": "hardware", "severity": "low", "confidence": 1.0}}, {"id": "scanner-108f644e3ffa56b6", "name": "Dockerfile runs as root: packages/api-server/docker/dev/Dockerfile", "shortDescription": {"text": "Dockerfile runs as root: packages/api-server/docker/dev/Dockerfile"}, "fullDescription": {"text": "No non-root USER set. Containers running as root expand the blast radius of any vulnerability inside the image."}, "properties": {"scanner": "scanner-primary", "layer": "hardware", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-beb7571395fa2324", "name": "Docker base image is tag-pinned but not digest-pinned: rust:1.91-slim", "shortDescription": {"text": "Docker base image is tag-pinned but not digest-pinned: rust:1.91-slim"}, "fullDescription": {"text": "Container tags can be retagged upstream. Pin production base images to a reviewed digest (`image@sha256:...`) when reproducibility and supply-chain integrity matter."}, "properties": {"scanner": "scanner-primary", "layer": "hardware", "severity": "low", "confidence": 1.0}}, {"id": "scanner-5a5f881ad058be93", "name": "Docker base image is tag-pinned but not digest-pinned: rust:1.91-slim", "shortDescription": {"text": "Docker base image is tag-pinned but not digest-pinned: rust:1.91-slim"}, "fullDescription": {"text": "Container tags can be retagged upstream. Pin production base images to a reviewed digest (`image@sha256:...`) when reproducibility and supply-chain integrity matter."}, "properties": {"scanner": "scanner-primary", "layer": "hardware", "severity": "low", "confidence": 1.0}}, {"id": "scanner-aa5acaa49eb8315b", "name": "Containers defined but no K8s/orchestration manifest found", "shortDescription": {"text": "Containers defined but no K8s/orchestration manifest found"}, "fullDescription": {"text": "Repo has Dockerfiles/compose but no Kubernetes/Nomad manifests. If the target deployment is K8s, the manifests may live in a separate ops repo."}, "properties": {"scanner": "scanner-primary", "layer": "hardware", "severity": "low", "confidence": 1.0}}, {"id": "scanner-11a847cc92425e4d", "name": "Insecure pattern 'cors_wildcard' in packages/web/app/api/v1/image-proxy/route.ts:322", "shortDescription": {"text": "Insecure pattern 'cors_wildcard' in packages/web/app/api/v1/image-proxy/route.ts:322"}, "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-bcc68b524d8954bd", "name": "Insecure pattern 'dangerous_innerhtml' in packages/web/app/profile/[userId]/page.tsx:80", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in packages/web/app/profile/[userId]/page.tsx:80"}, "fullDescription": {"text": "Found a known-risky pattern (dangerous_innerhtml). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-43013d4d2a68f1c5", "name": "Insecure pattern 'dangerous_innerhtml' in packages/web/lib/seo/json-ld.tsx:11", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in packages/web/lib/seo/json-ld.tsx:11"}, "fullDescription": {"text": "Found a known-risky pattern (dangerous_innerhtml). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-879d0464d06dc435", "name": "Insecure pattern 'dangerous_innerhtml' in packages/web/lib/theme/theme-script.tsx:11", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in packages/web/lib/theme/theme-script.tsx:11"}, "fullDescription": {"text": "Found a known-risky pattern (dangerous_innerhtml). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-be0151b3a779e9ba", "name": "Insecure pattern 'direct_innerhtml_assignment' in packages/web/lib/components/DecodedLogo.tsx:251", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in packages/web/lib/components/DecodedLogo.tsx:251"}, "fullDescription": {"text": "Found a known-risky pattern (direct_innerhtml_assignment). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-01078546f38b7bf1", "name": "Insecure pattern 'direct_innerhtml_assignment' in packages/web/lib/components/ASCIIText.tsx:218", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in packages/web/lib/components/ASCIIText.tsx:218"}, "fullDescription": {"text": "Found a known-risky pattern (direct_innerhtml_assignment). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-dbf827d5e55ab059", "name": "Insecure pattern 'dangerous_innerhtml' in packages/web/lib/components/main-b/NeonDoodles.tsx:611", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in packages/web/lib/components/main-b/NeonDoodles.tsx:611"}, "fullDescription": {"text": "Found a known-risky pattern (dangerous_innerhtml). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-d80b872e16a3d7b5", "name": "Insecure pattern 'dangerous_innerhtml' in packages/web/lib/components/dome/DomeGallery.tsx:515", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in packages/web/lib/components/dome/DomeGallery.tsx:515"}, "fullDescription": {"text": "Found a known-risky pattern (dangerous_innerhtml). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-5071d86465edb0db", "name": "Insecure pattern 'dangerous_innerhtml' in packages/web/lib/components/search/MediaResultCard.tsx:44", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in packages/web/lib/components/search/MediaResultCard.tsx:44"}, "fullDescription": {"text": "Found a known-risky pattern (dangerous_innerhtml). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-c4d6c89ca3e0f1d9", "name": "Insecure pattern 'dangerous_innerhtml' in packages/web/lib/components/search/PersonResultCard.tsx:34", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in packages/web/lib/components/search/PersonResultCard.tsx:34"}, "fullDescription": {"text": "Found a known-risky pattern (dangerous_innerhtml). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-42cdd31b819869ef", "name": "Insecure pattern 'dangerous_innerhtml' in packages/web/lib/components/main-d/StickerPeel.tsx:184", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in packages/web/lib/components/main-d/StickerPeel.tsx:184"}, "fullDescription": {"text": "Found a known-risky pattern (dangerous_innerhtml). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-95b706c65f564ce9", "name": "Insecure pattern 'node_child_process' in packages/web/lib/content-studio/assets/video-composition.ts:1", "shortDescription": {"text": "Insecure pattern 'node_child_process' in packages/web/lib/content-studio/assets/video-composition.ts:1"}, "fullDescription": {"text": "Found a known-risky pattern (node_child_process). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-7ef787727d402c43", "name": "Insecure pattern 'dangerous_innerhtml' in packages/mobile/app/+html.tsx:22", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in packages/mobile/app/+html.tsx:22"}, "fullDescription": {"text": "Found a known-risky pattern (dangerous_innerhtml). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-c1d130fb72372a28", "name": "Insecure pattern 'node_child_process' in scripts/check-schema-drift.ts:21", "shortDescription": {"text": "Insecure pattern 'node_child_process' in scripts/check-schema-drift.ts:21"}, "fullDescription": {"text": "Found a known-risky pattern (node_child_process). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-f3b5f45b124a0ba2", "name": "Insecure pattern 'dangerous_innerhtml' in .cursor/skills/security-auditor/SKILL.md:37", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in .cursor/skills/security-auditor/SKILL.md:37"}, "fullDescription": {"text": "Found a known-risky pattern (dangerous_innerhtml). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-40351898d5febd20", "name": "Insecure pattern 'dangerous_innerhtml' in .cursor/skills/code-reviewer/SKILL.md:48", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in .cursor/skills/code-reviewer/SKILL.md:48"}, "fullDescription": {"text": "Found a known-risky pattern (dangerous_innerhtml). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-dbeaa16565e34421", "name": "Insecure pattern 'eval_used' in .claude/skills/gstack/ship/SKILL.md:1198", "shortDescription": {"text": "Insecure pattern 'eval_used' in .claude/skills/gstack/ship/SKILL.md:1198"}, "fullDescription": {"text": "Found a known-risky pattern (eval_used). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-0f23d3ca85ed01cb", "name": "Insecure pattern 'eval_used' in .claude/skills/gstack/plan-eng-review/SKILL.md:879", "shortDescription": {"text": "Insecure pattern 'eval_used' in .claude/skills/gstack/plan-eng-review/SKILL.md:879"}, "fullDescription": {"text": "Found a known-risky pattern (eval_used). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-f9aba5f85470cfdf", "name": "Insecure pattern 'node_child_process' in .claude/skills/gstack/scripts/host-config-export.ts:18", "shortDescription": {"text": "Insecure pattern 'node_child_process' in .claude/skills/gstack/scripts/host-config-export.ts:18"}, "fullDescription": {"text": "Found a known-risky pattern (node_child_process). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-41d5e451215060b7", "name": "Insecure pattern 'node_child_process' in .claude/skills/gstack/scripts/skill-check.ts:15", "shortDescription": {"text": "Insecure pattern 'node_child_process' in .claude/skills/gstack/scripts/skill-check.ts:15"}, "fullDescription": {"text": "Found a known-risky pattern (node_child_process). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-5ae1c021f48c4981", "name": "Insecure pattern 'node_child_process' in .claude/skills/gstack/scripts/dev-skill.ts:11", "shortDescription": {"text": "Insecure pattern 'node_child_process' in .claude/skills/gstack/scripts/dev-skill.ts:11"}, "fullDescription": {"text": "Found a known-risky pattern (node_child_process). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-62034588d187ee2d", "name": "Insecure pattern 'node_child_process' in .claude/skills/gstack/scripts/slop-diff.ts:14", "shortDescription": {"text": "Insecure pattern 'node_child_process' in .claude/skills/gstack/scripts/slop-diff.ts:14"}, "fullDescription": {"text": "Found a known-risky pattern (node_child_process). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-1d44c146bfcffc4e", "name": "Insecure pattern 'eval_used' in .claude/skills/gstack/scripts/resolvers/testing.ts:312", "shortDescription": {"text": "Insecure pattern 'eval_used' in .claude/skills/gstack/scripts/resolvers/testing.ts:312"}, "fullDescription": {"text": "Found a known-risky pattern (eval_used). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-cc4a20c31167d0be", "name": "Insecure pattern 'node_child_process' in .claude/skills/gstack/browse/src/bun-polyfill.cjs:14", "shortDescription": {"text": "Insecure pattern 'node_child_process' in .claude/skills/gstack/browse/src/bun-polyfill.cjs:14"}, "fullDescription": {"text": "Found a known-risky pattern (node_child_process). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-a339f3c5c794ebe9", "name": "Insecure pattern 'node_child_process' in .claude/skills/gstack/browse/src/sidebar-agent.ts:12", "shortDescription": {"text": "Insecure pattern 'node_child_process' in .claude/skills/gstack/browse/src/sidebar-agent.ts:12"}, "fullDescription": {"text": "Found a known-risky pattern (node_child_process). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-4c252f636813b55b", "name": "Insecure pattern 'direct_innerhtml_assignment' in .claude/skills/gstack/browse/src/cookie-picker-ui.ts:370", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in .claude/skills/gstack/browse/src/cookie-picker-ui.ts:370"}, "fullDescription": {"text": "Found a known-risky pattern (direct_innerhtml_assignment). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-703e03f129bf96e2", "name": "Insecure pattern 'eval_used' in .claude/skills/gstack/cso/SKILL.md:805", "shortDescription": {"text": "Insecure pattern 'eval_used' in .claude/skills/gstack/cso/SKILL.md:805"}, "fullDescription": {"text": "Found a known-risky pattern (eval_used). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-3ab2affc089adc53", "name": "Insecure pattern 'exec_used' in .claude/skills/gstack/cso/SKILL.md:805", "shortDescription": {"text": "Insecure pattern 'exec_used' in .claude/skills/gstack/cso/SKILL.md:805"}, "fullDescription": {"text": "Found a known-risky pattern (exec_used). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-39b20560b9b63157", "name": "Insecure pattern 'dangerous_innerhtml' in .claude/skills/gstack/cso/SKILL.md:802", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in .claude/skills/gstack/cso/SKILL.md:802"}, "fullDescription": {"text": "Found a known-risky pattern (dangerous_innerhtml). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-f0f1c80a6cfdeebf", "name": "Insecure pattern 'weak_hash' in .claude/skills/gstack/cso/SKILL.md:854", "shortDescription": {"text": "Insecure pattern 'weak_hash' in .claude/skills/gstack/cso/SKILL.md:854"}, "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-1ca7272f2a92a210", "name": "Insecure pattern 'direct_innerhtml_assignment' in .claude/skills/gstack/extension/sidepanel.js:129", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in .claude/skills/gstack/extension/sidepanel.js:129"}, "fullDescription": {"text": "Found a known-risky pattern (direct_innerhtml_assignment). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-d1cbeb6a450f1d7e", "name": "Insecure pattern 'direct_innerhtml_assignment' in .claude/skills/gstack/extension/content.js:36", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in .claude/skills/gstack/extension/content.js:36"}, "fullDescription": {"text": "Found a known-risky pattern (direct_innerhtml_assignment). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-791878ae98b721d6", "name": "Insecure pattern 'node_child_process' in .claude/skills/gstack/design/src/serve.ts:38", "shortDescription": {"text": "Insecure pattern 'node_child_process' in .claude/skills/gstack/design/src/serve.ts:38"}, "fullDescription": {"text": "Found a known-risky pattern (node_child_process). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-bba783d7809bf214", "name": "Insecure pattern 'direct_innerhtml_assignment' in .claude/skills/gstack/design/src/compare.ts:490", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in .claude/skills/gstack/design/src/compare.ts:490"}, "fullDescription": {"text": "Found a known-risky pattern (direct_innerhtml_assignment). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-2867c1cc7e92f585", "name": "Insecure pattern 'node_child_process' in .claude/skills/gstack/lib/worktree.ts:12", "shortDescription": {"text": "Insecure pattern 'node_child_process' in .claude/skills/gstack/lib/worktree.ts:12"}, "fullDescription": {"text": "Found a known-risky pattern (node_child_process). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-127cf0c68b24f667", "name": "GitHub Actions workflow grants broad write permissions", "shortDescription": {"text": "GitHub Actions workflow grants broad write permissions"}, "fullDescription": {"text": "CI tokens with write permissions increase blast radius when an action, dependency, or PR workflow is compromised. Prefer job-level least-privilege permissions."}, "properties": {"scanner": "scanner-primary", "layer": "cicd", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-f9aa59634fce90e2", "name": "GitHub Actions workflow grants broad write permissions", "shortDescription": {"text": "GitHub Actions workflow grants broad write permissions"}, "fullDescription": {"text": "CI tokens with write permissions increase blast radius when an action, dependency, or PR workflow is compromised. Prefer job-level least-privilege permissions."}, "properties": {"scanner": "scanner-primary", "layer": "cicd", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-aaef340a7e26f7c1", "name": "GitHub Action is tag-pinned rather than SHA-pinned", "shortDescription": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "fullDescription": {"text": "oven-sh/setup-bun@v2 can move without a code change in this repo. Pin third-party actions to a reviewed 40-character commit SHA."}, "properties": {"scanner": "scanner-primary", "layer": "cicd", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-9d7e8d370403d6cd", "name": "GitHub Action is tag-pinned rather than SHA-pinned", "shortDescription": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "fullDescription": {"text": "actions/checkout@v6 can move without a code change in this repo. Pin third-party actions to a reviewed 40-character commit SHA."}, "properties": {"scanner": "scanner-primary", "layer": "cicd", "severity": "low", "confidence": 1.0}}, {"id": "scanner-063997d8d14f8d5c", "name": "GitHub Actions workflow grants broad write permissions", "shortDescription": {"text": "GitHub Actions workflow grants broad write permissions"}, "fullDescription": {"text": "CI tokens with write permissions increase blast radius when an action, dependency, or PR workflow is compromised. Prefer job-level least-privilege permissions."}, "properties": {"scanner": "scanner-primary", "layer": "cicd", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-71ccec1b8896fe87", "name": "GitHub Action is tag-pinned rather than SHA-pinned", "shortDescription": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "fullDescription": {"text": "actions/upload-artifact@v4 can move without a code change in this repo. Pin third-party actions to a reviewed 40-character commit SHA."}, "properties": {"scanner": "scanner-primary", "layer": "cicd", "severity": "low", "confidence": 1.0}}, {"id": "scanner-6cfa33b25ae12779", "name": "GitHub Action is tag-pinned rather than SHA-pinned", "shortDescription": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "fullDescription": {"text": "marocchino/sticky-pull-request-comment@v2 can move without a code change in this repo. Pin third-party actions to a reviewed 40-character commit SHA."}, "properties": {"scanner": "scanner-primary", "layer": "cicd", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-ea7d09c7bcd26d85", "name": "GitHub Actions workflow grants broad write permissions", "shortDescription": {"text": "GitHub Actions workflow grants broad write permissions"}, "fullDescription": {"text": "CI tokens with write permissions increase blast radius when an action, dependency, or PR workflow is compromised. Prefer job-level least-privilege permissions."}, "properties": {"scanner": "scanner-primary", "layer": "cicd", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-21d5c924df212c73", "name": "GitHub Action is tag-pinned rather than SHA-pinned", "shortDescription": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "fullDescription": {"text": "docker/build-push-action@v6 can move without a code change in this repo. Pin third-party actions to a reviewed 40-character commit SHA."}, "properties": {"scanner": "scanner-primary", "layer": "cicd", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-3fc95f4f1399c98e", "name": "GitHub Actions workflow grants broad write permissions", "shortDescription": {"text": "GitHub Actions workflow grants broad write permissions"}, "fullDescription": {"text": "CI tokens with write permissions increase blast radius when an action, dependency, or PR workflow is compromised. Prefer job-level least-privilege permissions."}, "properties": {"scanner": "scanner-primary", "layer": "cicd", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-3f3f65460c61fd51", "name": "GitHub Action is tag-pinned rather than SHA-pinned", "shortDescription": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "fullDescription": {"text": "docker/build-push-action@v6 can move without a code change in this repo. Pin third-party actions to a reviewed 40-character commit SHA."}, "properties": {"scanner": "scanner-primary", "layer": "cicd", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-c22778b2a4b45a0c", "name": "GitHub Actions workflow grants broad write permissions", "shortDescription": {"text": "GitHub Actions workflow grants broad write permissions"}, "fullDescription": {"text": "CI tokens with write permissions increase blast radius when an action, dependency, or PR workflow is compromised. Prefer job-level least-privilege permissions."}, "properties": {"scanner": "scanner-primary", "layer": "cicd", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-44c73285932ce358", "name": "Very large file: packages/ai-server/src/editorial_article/ig_carousel/carousel.py (2064 lines)", "shortDescription": {"text": "Very large file: packages/ai-server/src/editorial_article/ig_carousel/carousel.py (2064 lines)"}, "fullDescription": {"text": "Files with >800 lines often hide complexity hotspots and discourage tests."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-e98123dd40d482ff", "name": "Very large file: packages/ai-server/src/services/raw_posts/repository.py (1227 lines)", "shortDescription": {"text": "Very large file: packages/ai-server/src/services/raw_posts/repository.py (1227 lines)"}, "fullDescription": {"text": "Files with >800 lines often hide complexity hotspots and discourage tests."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-ab1dbac7ff818d47", "name": "Very large file: packages/api-server/src/domains/raw_posts/service.rs (2065 lines)", "shortDescription": {"text": "Very large file: packages/api-server/src/domains/raw_posts/service.rs (2065 lines)"}, "fullDescription": {"text": "Files with >800 lines often hide complexity hotspots and discourage tests."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-1b21b02c86c5f0fb", "name": "Very large file: packages/api-server/src/domains/posts/service.rs (4407 lines)", "shortDescription": {"text": "Very large file: packages/api-server/src/domains/posts/service.rs (4407 lines)"}, "fullDescription": {"text": "Files with >800 lines often hide complexity hotspots and discourage tests."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-dca361f32a5543bd", "name": "Very large file: packages/api-server/src/domains/posts/tests.rs (1648 lines)", "shortDescription": {"text": "Very large file: packages/api-server/src/domains/posts/tests.rs (1648 lines)"}, "fullDescription": {"text": "Files with >800 lines often hide complexity hotspots and discourage tests."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-51f70c8d97885703", "name": "Very large file: .claude/skills/gstack/scripts/resolvers/review.ts (1021 lines)", "shortDescription": {"text": "Very large file: .claude/skills/gstack/scripts/resolvers/review.ts (1021 lines)"}, "fullDescription": {"text": "Files with >800 lines often hide complexity hotspots and discourage tests."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-255d515aa9598b66", "name": "Very large file: .claude/skills/gstack/browse/src/server.ts (2380 lines)", "shortDescription": {"text": "Very large file: .claude/skills/gstack/browse/src/server.ts (2380 lines)"}, "fullDescription": {"text": "Files with >800 lines often hide complexity hotspots and discourage tests."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-305b3033194a45ea", "name": "Very large file: .claude/skills/gstack/browse/test/sidebar-ux.test.ts (1671 lines)", "shortDescription": {"text": "Very large file: .claude/skills/gstack/browse/test/sidebar-ux.test.ts (1671 lines)"}, "fullDescription": {"text": "Files with >800 lines often hide complexity hotspots and discourage tests."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-9985d0989b57a320", "name": "Very large file: .claude/skills/gstack/browse/test/commands.test.ts (2089 lines)", "shortDescription": {"text": "Very large file: .claude/skills/gstack/browse/test/commands.test.ts (2089 lines)"}, "fullDescription": {"text": "Files with >800 lines often hide complexity hotspots and discourage tests."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-e5b403276aa60aaa", "name": "Very large file: .claude/skills/gstack/extension/sidepanel.js (1675 lines)", "shortDescription": {"text": "Very large file: .claude/skills/gstack/extension/sidepanel.js (1675 lines)"}, "fullDescription": {"text": "Files with >800 lines often hide complexity hotspots and discourage tests."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-ff1a08a5d7add672", "name": "Very large file: .claude/skills/gstack/test/gen-skill-docs.test.ts (2738 lines)", "shortDescription": {"text": "Very large file: .claude/skills/gstack/test/gen-skill-docs.test.ts (2738 lines)"}, "fullDescription": {"text": "Files with >800 lines often hide complexity hotspots and discourage tests."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-e86fb0cd90c20636", "name": "Very large file: .claude/skills/gstack/test/skill-e2e.test.ts (3365 lines)", "shortDescription": {"text": "Very large file: .claude/skills/gstack/test/skill-e2e.test.ts (3365 lines)"}, "fullDescription": {"text": "Files with >800 lines often hide complexity hotspots and discourage tests."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-78014a346a7009d6", "name": "Very large file: .claude/skills/gstack/test/skill-validation.test.ts (1571 lines)", "shortDescription": {"text": "Very large file: .claude/skills/gstack/test/skill-validation.test.ts (1571 lines)"}, "fullDescription": {"text": "Files with >800 lines often hide complexity hotspots and discourage tests."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-ea3b5e389d8c9c0f", "name": "Low test-to-source ratio", "shortDescription": {"text": "Low test-to-source ratio"}, "fullDescription": {"text": "300 tests / 1483 src (ratio 0.20)."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-2699d5f16ae11282", "name": "Node manifest has dependencies but no lockfile: packages/shared/package.json", "shortDescription": {"text": "Node manifest has dependencies but no lockfile: packages/shared/package.json"}, "fullDescription": {"text": "`package.json` declares dependencies, but no same-directory npm/pnpm/yarn/bun lockfile was found. Generated projects without lockfiles are less reproducible and harder to secure-scan precisely."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-a28850983a0b02d5", "name": "Node manifest has dependencies but no lockfile: packages/web/package.json", "shortDescription": {"text": "Node manifest has dependencies but no lockfile: packages/web/package.json"}, "fullDescription": {"text": "`package.json` declares dependencies, but no same-directory npm/pnpm/yarn/bun lockfile was found. Generated projects without lockfiles are less reproducible and harder to secure-scan precisely."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-0f87c913f9d130f8", "name": "Node manifest has dependencies but no lockfile: packages/mobile/package.json", "shortDescription": {"text": "Node manifest has dependencies but no lockfile: packages/mobile/package.json"}, "fullDescription": {"text": "`package.json` declares dependencies, but no same-directory npm/pnpm/yarn/bun lockfile was found. Generated projects without lockfiles are less reproducible and harder to secure-scan precisely."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-3ab5d313dda8e5f9", "name": "Debug logging residue appears in source files", "shortDescription": {"text": "Debug logging residue appears in source files"}, "fullDescription": {"text": "Found 419 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 292 placeholder/mock markers across 133 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-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 lockfile. Treat this as a contract gap: the agent is guided, but the generated output is not yet guarded by the controls that make it repeatable."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-bea357a6497a2d5d", "name": "Agent authority lacks a verifier contract: CLAUDE.md", "shortDescription": {"text": "Agent authority lacks a verifier contract: CLAUDE.md"}, "fullDescription": {"text": "This agent instruction grants code or shell authority but does not state the verification gate that decides promotion. The recurring safe pattern is: LLM proposes; deterministic tests/build/security checks verify; only verified code promotes."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-604f0604c6c64a31", "name": "Agent authority lacks a verifier contract: packages/ai-server/CLAUDE.md", "shortDescription": {"text": "Agent authority lacks a verifier contract: packages/ai-server/CLAUDE.md"}, "fullDescription": {"text": "This agent instruction grants code or shell authority but does not state the verification gate that decides promotion. The recurring safe pattern is: LLM proposes; deterministic tests/build/security checks verify; only verified code promotes."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-5f010693ea3298a8", "name": "Agent authority lacks a verifier contract: packages/api-server/AGENTS.md", "shortDescription": {"text": "Agent authority lacks a verifier contract: packages/api-server/AGENTS.md"}, "fullDescription": {"text": "This agent instruction grants code or shell authority but does not state the verification gate that decides promotion. The recurring safe pattern is: LLM proposes; deterministic tests/build/security checks verify; only verified code promotes."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-14e9f0fa87f8c0b8", "name": "Agent authority lacks a verifier contract: .cursor/skills/security-auditor/SKILL.md", "shortDescription": {"text": "Agent authority lacks a verifier contract: .cursor/skills/security-auditor/SKILL.md"}, "fullDescription": {"text": "This agent instruction grants code or shell authority but does not state the verification gate that decides promotion. The recurring safe pattern is: LLM proposes; deterministic tests/build/security checks verify; only verified code promotes."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-00b46dcd53da637c", "name": "Agent authority lacks a verifier contract: .cursor/skills/code-reviewer/SKILL.md", "shortDescription": {"text": "Agent authority lacks a verifier contract: .cursor/skills/code-reviewer/SKILL.md"}, "fullDescription": {"text": "This agent instruction grants code or shell authority but does not state the verification gate that decides promotion. The recurring safe pattern is: LLM proposes; deterministic tests/build/security checks verify; only verified code promotes."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-8b61cf3bbbef67b3", "name": "Agent authority lacks a verifier contract: .claude/agents/code-reviewer.md", "shortDescription": {"text": "Agent authority lacks a verifier contract: .claude/agents/code-reviewer.md"}, "fullDescription": {"text": "This agent instruction grants code or shell authority but does not state the verification gate that decides promotion. The recurring safe pattern is: LLM proposes; deterministic tests/build/security checks verify; only verified code promotes."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-5bf1ddb685bd2c00", "name": "Agent instruction/config may expose a secret: .claude/agents/supabase-query-builder.md", "shortDescription": {"text": "Agent instruction/config may expose a secret: .claude/agents/supabase-query-builder.md"}, "fullDescription": {"text": "Agent-facing files are routinely pasted into LLM/tool contexts. Move literal tokens, keys, and passwords into a secret manager or document them as placeholders only."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-bc9c3eeb8b9236ee", "name": "Agent authority lacks a verifier contract: .claude/commands/to-prd.md", "shortDescription": {"text": "Agent authority lacks a verifier contract: .claude/commands/to-prd.md"}, "fullDescription": {"text": "This agent instruction grants code or shell authority but does not state the verification gate that decides promotion. The recurring safe pattern is: LLM proposes; deterministic tests/build/security checks verify; only verified code promotes."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-3e6444a2cb9202f3", "name": "Agent authority lacks a verifier contract: .claude/commands/setup-matt-skills.md", "shortDescription": {"text": "Agent authority lacks a verifier contract: .claude/commands/setup-matt-skills.md"}, "fullDescription": {"text": "This agent instruction grants code or shell authority but does not state the verification gate that decides promotion. The recurring safe pattern is: LLM proposes; deterministic tests/build/security checks verify; only verified code promotes."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-13802f11423095bd", "name": "Agent authority lacks a verifier contract: .claude/commands/grill-docs.md", "shortDescription": {"text": "Agent authority lacks a verifier contract: .claude/commands/grill-docs.md"}, "fullDescription": {"text": "This agent instruction grants code or shell authority but does not state the verification gate that decides promotion. The recurring safe pattern is: LLM proposes; deterministic tests/build/security checks verify; only verified code promotes."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-1b28054baa8caee8", "name": "Agent authority lacks a verifier contract: .claude/commands/improve-codebase-architecture.md", "shortDescription": {"text": "Agent authority lacks a verifier contract: .claude/commands/improve-codebase-architecture.md"}, "fullDescription": {"text": "This agent instruction grants code or shell authority but does not state the verification gate that decides promotion. The recurring safe pattern is: LLM proposes; deterministic tests/build/security checks verify; only verified code promotes."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-fe70da00d7b6ec57", "name": "Agent authority lacks a verifier contract: .claude/commands/to-issues.md", "shortDescription": {"text": "Agent authority lacks a verifier contract: .claude/commands/to-issues.md"}, "fullDescription": {"text": "This agent instruction grants code or shell authority but does not state the verification gate that decides promotion. The recurring safe pattern is: LLM proposes; deterministic tests/build/security checks verify; only verified code promotes."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-b5bf7d10757cefc6", "name": "Agent authority lacks a verifier contract: .claude/skills/pencil-screen-ui/SKILL.md", "shortDescription": {"text": "Agent authority lacks a verifier contract: .claude/skills/pencil-screen-ui/SKILL.md"}, "fullDescription": {"text": "This agent instruction grants code or shell authority but does not state the verification gate that decides promotion. The recurring safe pattern is: LLM proposes; deterministic tests/build/security checks verify; only verified code promotes."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-e69908c3726c4663", "name": "Agent authority lacks a verifier contract: .claude/skills/gstack/ARCHITECTURE.md", "shortDescription": {"text": "Agent authority lacks a verifier contract: .claude/skills/gstack/ARCHITECTURE.md"}, "fullDescription": {"text": "This agent instruction grants code or shell authority but does not state the verification gate that decides promotion. The recurring safe pattern is: LLM proposes; deterministic tests/build/security checks verify; only verified code promotes."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-98723f81061404ef", "name": "Agent authority lacks a verifier contract: .claude/skills/gstack/DESIGN.md", "shortDescription": {"text": "Agent authority lacks a verifier contract: .claude/skills/gstack/DESIGN.md"}, "fullDescription": {"text": "This agent instruction grants code or shell authority but does not state the verification gate that decides promotion. The recurring safe pattern is: LLM proposes; deterministic tests/build/security checks verify; only verified code promotes."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-b97dd0971cab9969", "name": "Agent authority lacks a verifier contract: .claude/skills/gstack/CHANGELOG.md", "shortDescription": {"text": "Agent authority lacks a verifier contract: .claude/skills/gstack/CHANGELOG.md"}, "fullDescription": {"text": "This agent instruction grants code or shell authority but does not state the verification gate that decides promotion. The recurring safe pattern is: LLM proposes; deterministic tests/build/security checks verify; only verified code promotes."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-0f6c08c1de1ccd58", "name": "Agent authority lacks a verifier contract: .claude/skills/gstack/TODOS.md", "shortDescription": {"text": "Agent authority lacks a verifier contract: .claude/skills/gstack/TODOS.md"}, "fullDescription": {"text": "This agent instruction grants code or shell authority but does not state the verification gate that decides promotion. The recurring safe pattern is: LLM proposes; deterministic tests/build/security checks verify; only verified code promotes."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-7a6fd8d971180b90", "name": "Agent authority lacks a verifier contract: .claude/skills/gstack/ship/SKILL.md", "shortDescription": {"text": "Agent authority lacks a verifier contract: .claude/skills/gstack/ship/SKILL.md"}, "fullDescription": {"text": "This agent instruction grants code or shell authority but does not state the verification gate that decides promotion. The recurring safe pattern is: LLM proposes; deterministic tests/build/security checks verify; only verified code promotes."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-1cb3a3339ce179bf", "name": "Agent instruction contains unpinned remote install: .claude/skills/gstack/ship/SKILL.md", "shortDescription": {"text": "Agent instruction contains unpinned remote install: .claude/skills/gstack/ship/SKILL.md"}, "fullDescription": {"text": "Remote install commands in agent instructions are a supply-chain risk, especially when an agent can execute shell commands."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-a964f6ba60cec322", "name": "Agent authority lacks a verifier contract: .claude/skills/gstack/unfreeze/SKILL.md", "shortDescription": {"text": "Agent authority lacks a verifier contract: .claude/skills/gstack/unfreeze/SKILL.md"}, "fullDescription": {"text": "This agent instruction grants code or shell authority but does not state the verification gate that decides promotion. The recurring safe pattern is: LLM proposes; deterministic tests/build/security checks verify; only verified code promotes."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-9beb5123532f5525", "name": "Agent authority lacks a verifier contract: .claude/skills/gstack/plan-eng-review/SKILL.md", "shortDescription": {"text": "Agent authority lacks a verifier contract: .claude/skills/gstack/plan-eng-review/SKILL.md"}, "fullDescription": {"text": "This agent instruction grants code or shell authority but does not state the verification gate that decides promotion. The recurring safe pattern is: LLM proposes; deterministic tests/build/security checks verify; only verified code promotes."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-89ada1f97ff4d956", "name": "Agent authority lacks a verifier contract: .claude/skills/gstack/plan-devex-review/SKILL.md", "shortDescription": {"text": "Agent authority lacks a verifier contract: .claude/skills/gstack/plan-devex-review/SKILL.md"}, "fullDescription": {"text": "This agent instruction grants code or shell authority but does not state the verification gate that decides promotion. The recurring safe pattern is: LLM proposes; deterministic tests/build/security checks verify; only verified code promotes."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-bc3e3f6a28761881", "name": "Agent authority lacks a verifier contract: .claude/skills/gstack/openclaw/gstack-full-CLAUDE.md", "shortDescription": {"text": "Agent authority lacks a verifier contract: .claude/skills/gstack/openclaw/gstack-full-CLAUDE.md"}, "fullDescription": {"text": "This agent instruction grants code or shell authority but does not state the verification gate that decides promotion. The recurring safe pattern is: LLM proposes; deterministic tests/build/security checks verify; only verified code promotes."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-122947036072abd4", "name": "Agent authority lacks a verifier contract: .claude/skills/gstack/openclaw/gstack-plan-CLAUDE.md", "shortDescription": {"text": "Agent authority lacks a verifier contract: .claude/skills/gstack/openclaw/gstack-plan-CLAUDE.md"}, "fullDescription": {"text": "This agent instruction grants code or shell authority but does not state the verification gate that decides promotion. The recurring safe pattern is: LLM proposes; deterministic tests/build/security checks verify; only verified code promotes."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-d4b0f8295c2a013a", "name": "Agent authority lacks a verifier contract: .claude/skills/gstack/openclaw/skills/gstack-openclaw-investigate/SKILL.md", "shortDescription": {"text": "Agent authority lacks a verifier contract: .claude/skills/gstack/openclaw/skills/gstack-openclaw-investigate/SKILL.md"}, "fullDescription": {"text": "This agent instruction grants code or shell authority but does not state the verification gate that decides promotion. The recurring safe pattern is: LLM proposes; deterministic tests/build/security checks verify; only verified code promotes."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-a3b6528b343b2c98", "name": "Agent authority lacks a verifier contract: .claude/skills/gstack/review/SKILL.md", "shortDescription": {"text": "Agent authority lacks a verifier contract: .claude/skills/gstack/review/SKILL.md"}, "fullDescription": {"text": "This agent instruction grants code or shell authority but does not state the verification gate that decides promotion. The recurring safe pattern is: LLM proposes; deterministic tests/build/security checks verify; only verified code promotes."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-a53680c0f39ae2e8", "name": "Agent instruction contains unpinned remote install: .claude/skills/gstack/review/SKILL.md", "shortDescription": {"text": "Agent instruction contains unpinned remote install: .claude/skills/gstack/review/SKILL.md"}, "fullDescription": {"text": "Remote install commands in agent instructions are a supply-chain risk, especially when an agent can execute shell commands."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-7725449e4317769e", "name": "Agent authority lacks a verifier contract: .claude/skills/gstack/review/greptile-triage.md", "shortDescription": {"text": "Agent authority lacks a verifier contract: .claude/skills/gstack/review/greptile-triage.md"}, "fullDescription": {"text": "This agent instruction grants code or shell authority but does not state the verification gate that decides promotion. The recurring safe pattern is: LLM proposes; deterministic tests/build/security checks verify; only verified code promotes."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-dfd56f0e20015f67", "name": "Agent authority lacks a verifier contract: .claude/skills/gstack/review/specialists/security.md", "shortDescription": {"text": "Agent authority lacks a verifier contract: .claude/skills/gstack/review/specialists/security.md"}, "fullDescription": {"text": "This agent instruction grants code or shell authority but does not state the verification gate that decides promotion. The recurring safe pattern is: LLM proposes; deterministic tests/build/security checks verify; only verified code promotes."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-28d3566dd26ac2ca", "name": "Agent authority lacks a verifier contract: .claude/skills/gstack/review/specialists/performance.md", "shortDescription": {"text": "Agent authority lacks a verifier contract: .claude/skills/gstack/review/specialists/performance.md"}, "fullDescription": {"text": "This agent instruction grants code or shell authority but does not state the verification gate that decides promotion. The recurring safe pattern is: LLM proposes; deterministic tests/build/security checks verify; only verified code promotes."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-fa92eb47728fb0c6", "name": "Agent authority lacks a verifier contract: .claude/skills/gstack/review/specialists/red-team.md", "shortDescription": {"text": "Agent authority lacks a verifier contract: .claude/skills/gstack/review/specialists/red-team.md"}, "fullDescription": {"text": "This agent instruction grants code or shell authority but does not state the verification gate that decides promotion. The recurring safe pattern is: LLM proposes; deterministic tests/build/security checks verify; only verified code promotes."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-bd18becee38f6a1e", "name": "Agent authority lacks a verifier contract: .claude/skills/gstack/qa/SKILL.md", "shortDescription": {"text": "Agent authority lacks a verifier contract: .claude/skills/gstack/qa/SKILL.md"}, "fullDescription": {"text": "This agent instruction grants code or shell authority but does not state the verification gate that decides promotion. The recurring safe pattern is: LLM proposes; deterministic tests/build/security checks verify; only verified code promotes."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-466307eab193018b", "name": "Agent authority lacks a verifier contract: .claude/skills/gstack/cso/SKILL.md", "shortDescription": {"text": "Agent authority lacks a verifier contract: .claude/skills/gstack/cso/SKILL.md"}, "fullDescription": {"text": "This agent instruction grants code or shell authority but does not state the verification gate that decides promotion. The recurring safe pattern is: LLM proposes; deterministic tests/build/security checks verify; only verified code promotes."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-961341e4defa2cfa", "name": "Agent instruction contains unpinned remote install: .claude/skills/gstack/codex/SKILL.md", "shortDescription": {"text": "Agent instruction contains unpinned remote install: .claude/skills/gstack/codex/SKILL.md"}, "fullDescription": {"text": "Remote install commands in agent instructions are a supply-chain risk, especially when an agent can execute shell commands."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-726f67f8fb949f8b", "name": "Agent authority lacks a verifier contract: .claude/skills/gstack/autoplan/SKILL.md", "shortDescription": {"text": "Agent authority lacks a verifier contract: .claude/skills/gstack/autoplan/SKILL.md"}, "fullDescription": {"text": "This agent instruction grants code or shell authority but does not state the verification gate that decides promotion. The recurring safe pattern is: LLM proposes; deterministic tests/build/security checks verify; only verified code promotes."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-25bac539a9965627", "name": "Agent authority lacks a verifier contract: .claude/skills/gstack/docs/skills.md", "shortDescription": {"text": "Agent authority lacks a verifier contract: .claude/skills/gstack/docs/skills.md"}, "fullDescription": {"text": "This agent instruction grants code or shell authority but does not state the verification gate that decides promotion. The recurring safe pattern is: LLM proposes; deterministic tests/build/security checks verify; only verified code promotes."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-cbeb50a72dfbdecb", "name": "Agent authority lacks a verifier contract: .claude/skills/gstack/docs/REMOTE_BROWSER_ACCESS.md", "shortDescription": {"text": "Agent authority lacks a verifier contract: .claude/skills/gstack/docs/REMOTE_BROWSER_ACCESS.md"}, "fullDescription": {"text": "This agent instruction grants code or shell authority but does not state the verification gate that decides promotion. The recurring safe pattern is: LLM proposes; deterministic tests/build/security checks verify; only verified code promotes."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-284eb7b494a8a320", "name": "Agent authority lacks a verifier contract: .claude/skills/gstack/docs/designs/CHROME_VS_CHROMIUM_EXPLORATION.md", "shortDescription": {"text": "Agent authority lacks a verifier contract: .claude/skills/gstack/docs/designs/CHROME_VS_CHROMIUM_EXPLORATION.md"}, "fullDescription": {"text": "This agent instruction grants code or shell authority but does not state the verification gate that decides promotion. The recurring safe pattern is: LLM proposes; deterministic tests/build/security checks verify; only verified code promotes."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-115c9529722b43e7", "name": "Agent instruction/config may expose a secret: .claude/skills/gstack/docs/designs/SLATE_HOST.md", "shortDescription": {"text": "Agent instruction/config may expose a secret: .claude/skills/gstack/docs/designs/SLATE_HOST.md"}, "fullDescription": {"text": "Agent-facing files are routinely pasted into LLM/tool contexts. Move literal tokens, keys, and passwords into a secret manager or document them as placeholders only."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-8e91c0d1a090de44", "name": "Agent instruction/config may expose a secret: .claude/skills/gstack/docs/designs/SIDEBAR_MESSAGE_FLOW.md", "shortDescription": {"text": "Agent instruction/config may expose a secret: .claude/skills/gstack/docs/designs/SIDEBAR_MESSAGE_FLOW.md"}, "fullDescription": {"text": "Agent-facing files are routinely pasted into LLM/tool contexts. Move literal tokens, keys, and passwords into a secret manager or document them as placeholders only."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-103d701335356670", "name": "Agent authority lacks a verifier contract: .claude/skills/gstack/docs/designs/SIDEBAR_MESSAGE_FLOW.md", "shortDescription": {"text": "Agent authority lacks a verifier contract: .claude/skills/gstack/docs/designs/SIDEBAR_MESSAGE_FLOW.md"}, "fullDescription": {"text": "This agent instruction grants code or shell authority but does not state the verification gate that decides promotion. The recurring safe pattern is: LLM proposes; deterministic tests/build/security checks verify; only verified code promotes."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-2d266c1476ad08a0", "name": "Agent authority lacks a verifier contract: .claude/skills/gstack/docs/designs/CONDUCTOR_CHROME_SIDEBAR_INTEGRATION.md", "shortDescription": {"text": "Agent authority lacks a verifier contract: .claude/skills/gstack/docs/designs/CONDUCTOR_CHROME_SIDEBAR_INTEGRATION.md"}, "fullDescription": {"text": "This agent instruction grants code or shell authority but does not state the verification gate that decides promotion. The recurring safe pattern is: LLM proposes; deterministic tests/build/security checks verify; only verified code promotes."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-5087fc3ea8caf659", "name": "Agent authority lacks a verifier contract: .claude/skills/gstack/docs/designs/CONDUCTOR_SESSION_API.md", "shortDescription": {"text": "Agent authority lacks a verifier contract: .claude/skills/gstack/docs/designs/CONDUCTOR_SESSION_API.md"}, "fullDescription": {"text": "This agent instruction grants code or shell authority but does not state the verification gate that decides promotion. The recurring safe pattern is: LLM proposes; deterministic tests/build/security checks verify; only verified code promotes."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-f06617692c17304b", "name": "Agent authority lacks a verifier contract: .claude/skills/gstack/docs/designs/SELF_LEARNING_V0.md", "shortDescription": {"text": "Agent authority lacks a verifier contract: .claude/skills/gstack/docs/designs/SELF_LEARNING_V0.md"}, "fullDescription": {"text": "This agent instruction grants code or shell authority but does not state the verification gate that decides promotion. The recurring safe pattern is: LLM proposes; deterministic tests/build/security checks verify; only verified code promotes."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-9aae906d2c2a7ac8", "name": "Agent authority lacks a verifier contract: .claude/skills/gstack/gstack-upgrade/SKILL.md", "shortDescription": {"text": "Agent authority lacks a verifier contract: .claude/skills/gstack/gstack-upgrade/SKILL.md"}, "fullDescription": {"text": "This agent instruction grants code or shell authority but does not state the verification gate that decides promotion. The recurring safe pattern is: LLM proposes; deterministic tests/build/security checks verify; only verified code promotes."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-9f71351e7fa9cad3", "name": "Agent authority lacks a verifier contract: .claude/skills/gstack/design-review/SKILL.md", "shortDescription": {"text": "Agent authority lacks a verifier contract: .claude/skills/gstack/design-review/SKILL.md"}, "fullDescription": {"text": "This agent instruction grants code or shell authority but does not state the verification gate that decides promotion. The recurring safe pattern is: LLM proposes; deterministic tests/build/security checks verify; only verified code promotes."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-d64d7b567a549515", "name": "Agent authority lacks a verifier contract: .claude/skills/gstack/land-and-deploy/SKILL.md", "shortDescription": {"text": "Agent authority lacks a verifier contract: .claude/skills/gstack/land-and-deploy/SKILL.md"}, "fullDescription": {"text": "This agent instruction grants code or shell authority but does not state the verification gate that decides promotion. The recurring safe pattern is: LLM proposes; deterministic tests/build/security checks verify; only verified code promotes."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-306e31c438d1b6e6", "name": "Agent authority lacks a verifier contract: .claude/skills/gstack/design-html/SKILL.md", "shortDescription": {"text": "Agent authority lacks a verifier contract: .claude/skills/gstack/design-html/SKILL.md"}, "fullDescription": {"text": "This agent instruction grants code or shell authority but does not state the verification gate that decides promotion. The recurring safe pattern is: LLM proposes; deterministic tests/build/security checks verify; only verified code promotes."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-2d589ac9abeb32bb", "name": "Agent authority lacks a verifier contract: .claude/skills/gstack/test/fixtures/golden-ship-claude.md", "shortDescription": {"text": "Agent authority lacks a verifier contract: .claude/skills/gstack/test/fixtures/golden-ship-claude.md"}, "fullDescription": {"text": "This agent instruction grants code or shell authority but does not state the verification gate that decides promotion. The recurring safe pattern is: LLM proposes; deterministic tests/build/security checks verify; only verified code promotes."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-bae7f03969efb559", "name": "Agent instruction contains unpinned remote install: .claude/skills/gstack/test/fixtures/golden-ship-claude.md", "shortDescription": {"text": "Agent instruction contains unpinned remote install: .claude/skills/gstack/test/fixtures/golden-ship-claude.md"}, "fullDescription": {"text": "Remote install commands in agent instructions are a supply-chain risk, especially when an agent can execute shell commands."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-3db26658d6d264b4", "name": "Agent authority lacks a verifier contract: .claude/skills/gstack/test/fixtures/golden/codex-ship-SKILL.md", "shortDescription": {"text": "Agent authority lacks a verifier contract: .claude/skills/gstack/test/fixtures/golden/codex-ship-SKILL.md"}, "fullDescription": {"text": "This agent instruction grants code or shell authority but does not state the verification gate that decides promotion. The recurring safe pattern is: LLM proposes; deterministic tests/build/security checks verify; only verified code promotes."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-e979ebf9663560e7", "name": "Agent authority lacks a verifier contract: .claude/skills/gstack/test/fixtures/golden/claude-ship-SKILL.md", "shortDescription": {"text": "Agent authority lacks a verifier contract: .claude/skills/gstack/test/fixtures/golden/claude-ship-SKILL.md"}, "fullDescription": {"text": "This agent instruction grants code or shell authority but does not state the verification gate that decides promotion. The recurring safe pattern is: LLM proposes; deterministic tests/build/security checks verify; only verified code promotes."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-f44c4f7c62aff486", "name": "Agent instruction contains unpinned remote install: .claude/skills/gstack/test/fixtures/golden/claude-ship-SKILL.md", "shortDescription": {"text": "Agent instruction contains unpinned remote install: .claude/skills/gstack/test/fixtures/golden/claude-ship-SKILL.md"}, "fullDescription": {"text": "Remote install commands in agent instructions are a supply-chain risk, especially when an agent can execute shell commands."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-c252cdf7cf7896a5", "name": "Agent authority lacks a verifier contract: .claude/skills/gstack/test/fixtures/golden/factory-ship-SKILL.md", "shortDescription": {"text": "Agent authority lacks a verifier contract: .claude/skills/gstack/test/fixtures/golden/factory-ship-SKILL.md"}, "fullDescription": {"text": "This agent instruction grants code or shell authority but does not state the verification gate that decides promotion. The recurring safe pattern is: LLM proposes; deterministic tests/build/security checks verify; only verified code promotes."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-ba4dcb8335b27a89", "name": "Agent instruction contains unpinned remote install: .claude/skills/gstack/test/fixtures/golden/factory-ship-SKILL.md", "shortDescription": {"text": "Agent instruction contains unpinned remote install: .claude/skills/gstack/test/fixtures/golden/factory-ship-SKILL.md"}, "fullDescription": {"text": "Remote install commands in agent instructions are a supply-chain risk, especially when an agent can execute shell commands."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-a849ecdee02f7126", "name": "Agent authority lacks a verifier contract: .claude/skills/gstack/plan-design-review/SKILL.md", "shortDescription": {"text": "Agent authority lacks a verifier contract: .claude/skills/gstack/plan-design-review/SKILL.md"}, "fullDescription": {"text": "This agent instruction grants code or shell authority but does not state the verification gate that decides promotion. The recurring safe pattern is: LLM proposes; deterministic tests/build/security checks verify; only verified code promotes."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-bfb710c08b73fd64", "name": "Agent authority lacks a verifier contract: .claude/skills/gstack/qa-only/SKILL.md", "shortDescription": {"text": "Agent authority lacks a verifier contract: .claude/skills/gstack/qa-only/SKILL.md"}, "fullDescription": {"text": "This agent instruction grants code or shell authority but does not state the verification gate that decides promotion. The recurring safe pattern is: LLM proposes; deterministic tests/build/security checks verify; only verified code promotes."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-beab8adc380ec953", "name": "Agent authority lacks a verifier contract: .claude/skills/gstack/freeze/SKILL.md", "shortDescription": {"text": "Agent authority lacks a verifier contract: .claude/skills/gstack/freeze/SKILL.md"}, "fullDescription": {"text": "This agent instruction grants code or shell authority but does not state the verification gate that decides promotion. The recurring safe pattern is: LLM proposes; deterministic tests/build/security checks verify; only verified code promotes."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-eb6e135978f19032", "name": "Agent authority lacks a verifier contract: .claude/skills/gstack/plan-ceo-review/SKILL.md", "shortDescription": {"text": "Agent authority lacks a verifier contract: .claude/skills/gstack/plan-ceo-review/SKILL.md"}, "fullDescription": {"text": "This agent instruction grants code or shell authority but does not state the verification gate that decides promotion. The recurring safe pattern is: LLM proposes; deterministic tests/build/security checks verify; only verified code promotes."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-6b9136f725351000", "name": "Agent authority lacks a verifier contract: .claude/skills/gstack/investigate/SKILL.md", "shortDescription": {"text": "Agent authority lacks a verifier contract: .claude/skills/gstack/investigate/SKILL.md"}, "fullDescription": {"text": "This agent instruction grants code or shell authority but does not state the verification gate that decides promotion. The recurring safe pattern is: LLM proposes; deterministic tests/build/security checks verify; only verified code promotes."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-6824c7d70c7a5ff5", "name": "Agent authority lacks a verifier contract: .claude/skills/supabase-migration-generator/SKILL.md", "shortDescription": {"text": "Agent authority lacks a verifier contract: .claude/skills/supabase-migration-generator/SKILL.md"}, "fullDescription": {"text": "This agent instruction grants code or shell authority but does not state the verification gate that decides promotion. The recurring safe pattern is: LLM proposes; deterministic tests/build/security checks verify; only verified code promotes."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-f2337922f15326e1", "name": "Agent authority lacks a verifier contract: .claude/skills/supabase-migration-generator/references/migration-patterns.md", "shortDescription": {"text": "Agent authority lacks a verifier contract: .claude/skills/supabase-migration-generator/references/migration-patterns.md"}, "fullDescription": {"text": "This agent instruction grants code or shell authority but does not state the verification gate that decides promotion. The recurring safe pattern is: LLM proposes; deterministic tests/build/security checks verify; only verified code promotes."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-e725d2ab884fbd49", "name": "Multiple root agent instruction files without precedence", "shortDescription": {"text": "Multiple root agent instruction files without precedence"}, "fullDescription": {"text": "The repo has multiple top-level AI-coder instruction files. Without precedence rules, different agents may follow different policies."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-cf14b8338c5344ab", "name": "Legacy-named symbol `model_copy` in packages/ai-server/tests/unit/services/raw_posts/test_processor_prelabeled.py:144", "shortDescription": {"text": "Legacy-named symbol `model_copy` in packages/ai-server/tests/unit/services/raw_posts/test_processor_prelabeled.py:144"}, "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-4d461d41d413a7c6", "name": "Legacy-named symbol `model_copy` in packages/ai-server/tests/unit/services/raw_posts/test_processor.py:83", "shortDescription": {"text": "Legacy-named symbol `model_copy` in packages/ai-server/tests/unit/services/raw_posts/test_processor.py:83"}, "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-fd0d3c33264bae24", "name": "Network/subprocess call without timeout or try/except \u2014 packages/ai-server/scripts/backfill_solution_urls_gemini.py:68", "shortDescription": {"text": "Network/subprocess call without timeout or try/except \u2014 packages/ai-server/scripts/backfill_solution_urls_gemini.py:68"}, "fullDescription": {"text": "`subprocess.run(...)` here lacks both a `timeout=` arg and an enclosing try/except. This is exactly the class of bug that took down our git-clone earlier (HTTP/2 stream cancel surfaced as a fatal). Add a `timeout=` and wrap in try/except, or use a wrapper that retries."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-50ad1b98c44ec692", "name": "Network/subprocess call without timeout or try/except \u2014 packages/ai-server/scripts/backfill_post_titles.py:84", "shortDescription": {"text": "Network/subprocess call without timeout or try/except \u2014 packages/ai-server/scripts/backfill_post_titles.py:84"}, "fullDescription": {"text": "`subprocess.run(...)` here lacks both a `timeout=` arg and an enclosing try/except. This is exactly the class of bug that took down our git-clone earlier (HTTP/2 stream cancel surfaced as a fatal). Add a `timeout=` and wrap in try/except, or use a wrapper that retries."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-f38b9f4e89b7facd", "name": "Network/subprocess call without timeout or try/except \u2014 packages/ai-server/scripts/backfill_solution_urls_dryrun.py:80", "shortDescription": {"text": "Network/subprocess call without timeout or try/except \u2014 packages/ai-server/scripts/backfill_solution_urls_dryrun.py:80"}, "fullDescription": {"text": "`subprocess.run(...)` here lacks both a `timeout=` arg and an enclosing try/except. This is exactly the class of bug that took down our git-clone earlier (HTTP/2 stream cancel surfaced as a fatal). Add a `timeout=` and wrap in try/except, or use a wrapper that retries."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-2a84950a48f7efd0", "name": "Network/subprocess call without timeout or try/except \u2014 packages/ai-server/scripts/backfill_post_enrichment.py:79", "shortDescription": {"text": "Network/subprocess call without timeout or try/except \u2014 packages/ai-server/scripts/backfill_post_enrichment.py:79"}, "fullDescription": {"text": "`subprocess.run(...)` here lacks both a `timeout=` arg and an enclosing try/except. This is exactly the class of bug that took down our git-clone earlier (HTTP/2 stream cancel surfaced as a fatal). Add a `timeout=` and wrap in try/except, or use a wrapper that retries."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-42509dd5ff22cdf0", "name": "Legacy-named symbol `model_copy` in packages/ai-server/src/editorial_article_chat/tools.py:201", "shortDescription": {"text": "Legacy-named symbol `model_copy` in packages/ai-server/src/editorial_article_chat/tools.py:201"}, "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-bfdfa4f578a96b7b", "name": "Legacy-named symbol `model_copy` in packages/ai-server/src/editorial_article/nodes/compose_layout.py:52", "shortDescription": {"text": "Legacy-named symbol `model_copy` in packages/ai-server/src/editorial_article/nodes/compose_layout.py:52"}, "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-3d19f4df0531d5db", "name": "Legacy-named symbol `model_copy` in packages/ai-server/src/editorial_article/nodes/generate_thumbnail.py:166", "shortDescription": {"text": "Legacy-named symbol `model_copy` in packages/ai-server/src/editorial_article/nodes/generate_thumbnail.py:166"}, "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-c4b6dba3ae0237d0", "name": "Legacy-named symbol `_generate_slide_copy` in packages/ai-server/src/editorial_article/ig_carousel/carousel.py:840", "shortDescription": {"text": "Legacy-named symbol `_generate_slide_copy` in packages/ai-server/src/editorial_article/ig_carousel/carousel.py:840"}, "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-736afef4c4053a07", "name": "Commented-code block (5 lines) in packages/ai-server/src/editorial_article/ig_carousel/carousel.py:52", "shortDescription": {"text": "Commented-code block (5 lines) in packages/ai-server/src/editorial_article/ig_carousel/carousel.py:52"}, "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-9c1946ccb39c47b1", "name": "Commented-code block (6 lines) in packages/ai-server/src/services/raw_posts/scheduler.py:590", "shortDescription": {"text": "Commented-code block (6 lines) in packages/ai-server/src/services/raw_posts/scheduler.py:590"}, "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-e7d0c3c527b34fe7", "name": "Commented-code block (5 lines) in packages/ai-server/src/services/raw_posts/processors/cody_prompts.py:268", "shortDescription": {"text": "Commented-code block (5 lines) in packages/ai-server/src/services/raw_posts/processors/cody_prompts.py:268"}, "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-2e4dd9d69fbef5a6", "name": "Commented-code block (12 lines) in packages/ai-server/src/services/raw_posts/processors/cody_describe_parser.py:43", "shortDescription": {"text": "Commented-code block (12 lines) in packages/ai-server/src/services/raw_posts/processors/cody_describe_parser.py:43"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-6afda84f75acc8c7", "name": "Legacy-named symbol `model_copy` in packages/ai-server/src/services/raw_posts/processors/processor.py:338", "shortDescription": {"text": "Legacy-named symbol `model_copy` in packages/ai-server/src/services/raw_posts/processors/processor.py:338"}, "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-b609fb8f0517720e", "name": "Commented-code block (6 lines) in packages/ai-server/src/services/raw_posts/processors/processor.py:386", "shortDescription": {"text": "Commented-code block (6 lines) in packages/ai-server/src/services/raw_posts/processors/processor.py:386"}, "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-18cf367c7ea27473", "name": "Legacy-named symbol `model_copy` in packages/ai-server/src/services/raw_posts/processors/catalog_matcher.py:526", "shortDescription": {"text": "Legacy-named symbol `model_copy` in packages/ai-server/src/services/raw_posts/processors/catalog_matcher.py:526"}, "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-104bcec75259cf59", "name": "Legacy-named symbol `model_copy` in packages/ai-server/src/services/raw_posts/processors/items_thumbnail.py:186", "shortDescription": {"text": "Legacy-named symbol `model_copy` in packages/ai-server/src/services/raw_posts/processors/items_thumbnail.py:186"}, "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-b009234c0602889b", "name": "Legacy-named symbol `model_copy` in packages/ai-server/src/services/raw_posts/processors/spots_parser.py:149", "shortDescription": {"text": "Legacy-named symbol `model_copy` in packages/ai-server/src/services/raw_posts/processors/spots_parser.py:149"}, "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-138cfc23600e3f96", "name": "Commented-code block (5 lines) in packages/ai-server/src/services/raw_posts/processors/spots_parser.py:32", "shortDescription": {"text": "Commented-code block (5 lines) in packages/ai-server/src/services/raw_posts/processors/spots_parser.py:32"}, "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-ff747ceffae73e61", "name": "Legacy-named symbol `model_copy` in packages/ai-server/src/services/editorial_discovery/repository.py:298", "shortDescription": {"text": "Legacy-named symbol `model_copy` in packages/ai-server/src/services/editorial_discovery/repository.py:298"}, "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-0f604e7d4532a430", "name": "Commented-code block (5 lines) in packages/ai-server/src/services/editorial_article/scheduler.py:77", "shortDescription": {"text": "Commented-code block (5 lines) in packages/ai-server/src/services/editorial_article/scheduler.py:77"}, "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-75b7da6c15fc096f", "name": "Commented-code block (5 lines) in packages/ai-server/src/config/_container.py:419", "shortDescription": {"text": "Commented-code block (5 lines) in packages/ai-server/src/config/_container.py:419"}, "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-1bf9f5172d909fa6", "name": "Legacy-named symbol `model_copy` in packages/ai-server/src/config/helpers/_override.py:13", "shortDescription": {"text": "Legacy-named symbol `model_copy` in packages/ai-server/src/config/helpers/_override.py:13"}, "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-eec780b0b6d8bdfb", "name": "`fetch()` without try/.catch or AbortSignal \u2014 packages/shared/api/search.ts:126", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 packages/shared/api/search.ts:126"}, "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-2a859b3f03d50628", "name": "`fetch()` without try/.catch or AbortSignal \u2014 packages/shared/api/client.ts:17", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 packages/shared/api/client.ts:17"}, "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-7b53ffac9a90f3b7", "name": "`fetch()` without try/.catch or AbortSignal \u2014 packages/web/app/api/v1/vton/route.ts:41", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 packages/web/app/api/v1/vton/route.ts:41"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-661a00c4b6ab21bd", "name": "`fetch()` without try/.catch or AbortSignal \u2014 packages/web/app/api/v1/content/posts/search/route.ts:30", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 packages/web/app/api/v1/content/posts/search/route.ts:30"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-cbdc61d8587909f5", "name": "`fetch()` without try/.catch or AbortSignal \u2014 packages/web/app/api/v1/events/route.ts:36", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 packages/web/app/api/v1/events/route.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-e5c5f3d3052c298f", "name": "`fetch()` without try/.catch or AbortSignal \u2014 packages/web/app/api/v1/events/anon/route.ts:25", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 packages/web/app/api/v1/events/anon/route.ts:25"}, "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-d9a595fd017d0530", "name": "`fetch()` without try/.catch or AbortSignal \u2014 packages/web/app/api/admin/data-pipeline/instagram-accounts/route.ts:45", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 packages/web/app/api/admin/data-pipeline/instagram-accounts/route.ts:45"}, "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-3fd709147bae9739", "name": "`fetch()` without try/.catch or AbortSignal \u2014 packages/web/app/api/admin/raw-post-sources/preview/route.ts:46", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 packages/web/app/api/admin/raw-post-sources/preview/route.ts:46"}, "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-1b69cc19e3aca48f", "name": "Commented-code block (10 lines) in packages/web/app/admin/login/page.tsx:12", "shortDescription": {"text": "Commented-code block (10 lines) in packages/web/app/admin/login/page.tsx:12"}, "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-12dea6aa26153304", "name": "Commented-code block (6 lines) in packages/web/app/admin/raw-posts/page.tsx:243", "shortDescription": {"text": "Commented-code block (6 lines) in packages/web/app/admin/raw-posts/page.tsx:243"}, "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-a71ba5764f5f8bfc", "name": "`fetch()` without try/.catch or AbortSignal \u2014 packages/web/app/admin/raw-post-sources/page.tsx:290", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 packages/web/app/admin/raw-post-sources/page.tsx:290"}, "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-e91557a8e3d1a224", "name": "`fetch()` without try/.catch or AbortSignal \u2014 packages/web/lib/api/proxy-to-backend.ts:34", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 packages/web/lib/api/proxy-to-backend.ts:34"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-6e07f276db6cbc0b", "name": "Commented-code block (5 lines) in packages/web/lib/api/posts.ts:44", "shortDescription": {"text": "Commented-code block (5 lines) in packages/web/lib/api/posts.ts:44"}, "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-dd0f879d18fe522f", "name": "`fetch()` without try/.catch or AbortSignal \u2014 packages/web/lib/api/posts.ts:483", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 packages/web/lib/api/posts.ts:483"}, "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-e0540197be6dd19b", "name": "`fetch()` without try/.catch or AbortSignal \u2014 packages/web/lib/api/server-instance.ts:37", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 packages/web/lib/api/server-instance.ts:37"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-7111456d858c73ca", "name": "`fetch()` without try/.catch or AbortSignal \u2014 packages/web/lib/api/server-prefetch.ts:36", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 packages/web/lib/api/server-prefetch.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-15ada9a5ba6f0dda", "name": "`fetch()` without try/.catch or AbortSignal \u2014 packages/web/lib/api/admin/affiliate-catalog.ts:4", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 packages/web/lib/api/admin/affiliate-catalog.ts:4"}, "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-b2ba2cfcdd94139d", "name": "Commented-code block (6 lines) in packages/web/lib/api/admin/raw-posts.ts:115", "shortDescription": {"text": "Commented-code block (6 lines) in packages/web/lib/api/admin/raw-posts.ts:115"}, "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-7b5f6d01db26b1df", "name": "`fetch()` without try/.catch or AbortSignal \u2014 packages/web/lib/api/admin/raw-posts.ts:17", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 packages/web/lib/api/admin/raw-posts.ts:17"}, "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-911a311e7797607d", "name": "`fetch()` without try/.catch or AbortSignal \u2014 packages/web/lib/api/admin/entity-enrichment.ts:4", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 packages/web/lib/api/admin/entity-enrichment.ts:4"}, "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-f85c20401dc9ef63", "name": "`fetch()` without try/.catch or AbortSignal \u2014 packages/web/lib/api/admin/raw-post-sources.ts:24", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 packages/web/lib/api/admin/raw-post-sources.ts:24"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-4ab5412b1f8db275", "name": "`fetch()` without try/.catch or AbortSignal \u2014 packages/web/lib/hooks/useVtonPostFetch.ts:93", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 packages/web/lib/hooks/useVtonPostFetch.ts:93"}, "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-7ca7b6b1756b39e1", "name": "`fetch()` without try/.catch or AbortSignal \u2014 packages/web/lib/hooks/admin/useEditorialCandidates.ts:130", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 packages/web/lib/hooks/admin/useEditorialCandidates.ts:130"}, "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-f33171a6e82e59e4", "name": "`fetch()` without try/.catch or AbortSignal \u2014 packages/web/lib/hooks/admin/useServerLogs.ts:29", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 packages/web/lib/hooks/admin/useServerLogs.ts:29"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-08849034c6e3128e", "name": "`fetch()` without try/.catch or AbortSignal \u2014 packages/web/lib/hooks/admin/useEditorialPipelineSettings.ts:35", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 packages/web/lib/hooks/admin/useEditorialPipelineSettings.ts:35"}, "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-996fec365ebf8e3d", "name": "`fetch()` without try/.catch or AbortSignal \u2014 packages/web/lib/hooks/admin/usePipeline.ts:20", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 packages/web/lib/hooks/admin/usePipeline.ts: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-54ff4d8675a46299", "name": "`fetch()` without try/.catch or AbortSignal \u2014 packages/web/lib/hooks/admin/useGeminiCost.ts:226", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 packages/web/lib/hooks/admin/useGeminiCost.ts:226"}, "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-eb680df1ff60c657", "name": "`fetch()` without try/.catch or AbortSignal \u2014 packages/web/lib/hooks/admin/useAdminPosts.ts:20", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 packages/web/lib/hooks/admin/useAdminPosts.ts: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-a6d98580681cfea3", "name": "`fetch()` without try/.catch or AbortSignal \u2014 packages/web/lib/hooks/admin/useEditorialChat.ts:69", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 packages/web/lib/hooks/admin/useEditorialChat.ts:69"}, "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-49ef277ffc530375", "name": "`fetch()` without try/.catch or AbortSignal \u2014 packages/web/lib/hooks/admin/useAiCost.ts:9", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 packages/web/lib/hooks/admin/useAiCost.ts:9"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-e39babc6a809c913", "name": "`fetch()` without try/.catch or AbortSignal \u2014 packages/web/lib/hooks/admin/useAdminOnboardingPool.ts:18", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 packages/web/lib/hooks/admin/useAdminOnboardingPool.ts:18"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-316ac4a50981bd5e", "name": "`fetch()` without try/.catch or AbortSignal \u2014 packages/web/lib/hooks/admin/useAudit.ts:25", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 packages/web/lib/hooks/admin/useAudit.ts:25"}, "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-3ce90671e08cca92", "name": "`fetch()` without try/.catch or AbortSignal \u2014 packages/web/lib/hooks/admin/useDashboard.ts:23", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 packages/web/lib/hooks/admin/useDashboard.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-5f56d71acba12cee", "name": "`fetch()` without try/.catch or AbortSignal \u2014 packages/web/lib/hooks/admin/useAdminMagazineList.ts:35", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 packages/web/lib/hooks/admin/useAdminMagazineList.ts:35"}, "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-ef2b05f80c52ad9f", "name": "`fetch()` without try/.catch or AbortSignal \u2014 packages/web/lib/hooks/admin/useAdminReports.ts:21", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 packages/web/lib/hooks/admin/useAdminReports.ts: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-f5e72b30c27a4f64", "name": "`fetch()` without try/.catch or AbortSignal \u2014 packages/web/lib/hooks/admin/useVerifyStats.ts:45", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 packages/web/lib/hooks/admin/useVerifyStats.ts:45"}, "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-54783cc2d1247359", "name": "`fetch()` without try/.catch or AbortSignal \u2014 packages/web/lib/hooks/admin/useEditorialArticles.ts:206", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 packages/web/lib/hooks/admin/useEditorialArticles.ts:206"}, "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-b247419d89dc0523", "name": "`fetch()` without try/.catch or AbortSignal \u2014 packages/web/lib/hooks/admin/useDiscoverySettings.ts:46", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 packages/web/lib/hooks/admin/useDiscoverySettings.ts:46"}, "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-4bfe03da4cf21e8a", "name": "`fetch()` without try/.catch or AbortSignal \u2014 packages/web/lib/hooks/admin/useAdminPicks.ts:26", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 packages/web/lib/hooks/admin/useAdminPicks.ts:26"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-cb836a62f1467af7", "name": "`fetch()` without try/.catch or AbortSignal \u2014 packages/web/lib/hooks/admin/useEditorialRecommendations.ts:74", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 packages/web/lib/hooks/admin/useEditorialRecommendations.ts:74"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-46f7410b6af6175c", "name": "`fetch()` without try/.catch or AbortSignal \u2014 packages/web/lib/hooks/admin/useAdminSolutions.ts:17", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 packages/web/lib/hooks/admin/useAdminSolutions.ts:17"}, "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-2207ed16a8e1750b", "name": "`fetch()` without try/.catch or AbortSignal \u2014 packages/web/lib/hooks/admin/useAdminPostEdit.ts:21", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 packages/web/lib/hooks/admin/useAdminPostEdit.ts: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-3d122d0ea92177be", "name": "Commented-code block (9 lines) in packages/web/lib/hooks/__tests__/usePostLike.test.tsx:129", "shortDescription": {"text": "Commented-code block (9 lines) in packages/web/lib/hooks/__tests__/usePostLike.test.tsx:129"}, "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-93a1ee8c6aaebae8", "name": "Legacy-named symbol `isLegacy` in packages/web/lib/components/PostBadge.tsx:19", "shortDescription": {"text": "Legacy-named symbol `isLegacy` in packages/web/lib/components/PostBadge.tsx:19"}, "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-9ab88e949cbe00f7", "name": "Commented-code block (9 lines) in packages/web/lib/components/admin/AdminSidebar.tsx:155", "shortDescription": {"text": "Commented-code block (9 lines) in packages/web/lib/components/admin/AdminSidebar.tsx:155"}, "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-ce08d0139b992b73", "name": "`fetch()` without try/.catch or AbortSignal \u2014 packages/web/lib/components/cody/LookDetail.tsx:5", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 packages/web/lib/components/cody/LookDetail.tsx:5"}, "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-e3858e8a6199969d", "name": "`fetch()` without try/.catch or AbortSignal \u2014 packages/web/lib/components/cody/__tests__/vton-separation.test.ts:62", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 packages/web/lib/components/cody/__tests__/vton-separation.test.ts:62"}, "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-c07a781558629ca9", "name": "`fetch()` without try/.catch or AbortSignal \u2014 packages/web/lib/content-studio/llm-client.ts:68", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 packages/web/lib/content-studio/llm-client.ts:68"}, "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-658dda8351afea12", "name": "`fetch()` without try/.catch or AbortSignal \u2014 packages/web/lib/content-studio/assets/video.ts:379", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 packages/web/lib/content-studio/assets/video.ts:379"}, "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-5d29c4e6ec814fcb", "name": "`fetch()` without try/.catch or AbortSignal \u2014 packages/web/lib/content-studio/assets/openai-client.ts:119", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 packages/web/lib/content-studio/assets/openai-client.ts:119"}, "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-7e55870c56deb596", "name": "`fetch()` without try/.catch or AbortSignal \u2014 packages/web/lib/content-studio/assets/video-persistence.ts:9", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 packages/web/lib/content-studio/assets/video-persistence.ts:9"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-d472a8cead21a324", "name": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/list-posts-with-spots.mjs:12", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/list-posts-with-spots.mjs:12"}, "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-ac8b00ac89fd0aaa", "name": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/vton-poc-speed.ts:28", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/vton-poc-speed.ts:28"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-22859c945280cf39", "name": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/vton-poc.ts:52", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/vton-poc.ts: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-9a9ea41360058ae7", "name": "Commented-code block (5 lines) in scripts/check-schema-drift.ts:158", "shortDescription": {"text": "Commented-code block (5 lines) in scripts/check-schema-drift.ts:158"}, "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-ad10ad3351eac134", "name": "Commented-code block (5 lines) in tools/wiki/lib/vault.ts:3", "shortDescription": {"text": "Commented-code block (5 lines) in tools/wiki/lib/vault.ts:3"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-a30133f9c6bd5980", "name": "`fetch()` without try/.catch or AbortSignal \u2014 .claude/skills/gstack/scripts/resolvers/utility.ts:107", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 .claude/skills/gstack/scripts/resolvers/utility.ts:107"}, "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-cb39fe22e3f37194", "name": "Commented-code block (6 lines) in .claude/skills/gstack/scripts/resolvers/preamble.ts:707", "shortDescription": {"text": "Commented-code block (6 lines) in .claude/skills/gstack/scripts/resolvers/preamble.ts:707"}, "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-f7693123d4a4e8eb", "name": "Commented-code block (11 lines) in .claude/skills/gstack/scripts/resolvers/testing.ts:168", "shortDescription": {"text": "Commented-code block (11 lines) in .claude/skills/gstack/scripts/resolvers/testing.ts:168"}, "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-f5e37e51bf3cb5a7", "name": "Commented-code block (5 lines) in .claude/skills/gstack/browse/src/server.ts:753", "shortDescription": {"text": "Commented-code block (5 lines) in .claude/skills/gstack/browse/src/server.ts:753"}, "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-aaadddae3ff96162", "name": "Legacy-named symbol `chrome_libsecret_os_crypt_password_v2` in .claude/skills/gstack/browse/src/cookie-import-browser.ts", "shortDescription": {"text": "Legacy-named symbol `chrome_libsecret_os_crypt_password_v2` in .claude/skills/gstack/browse/src/cookie-import-browser.ts:519"}, "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-7154822849909bd1", "name": "`fetch()` without try/.catch or AbortSignal \u2014 .claude/skills/gstack/browse/src/bun-polyfill.cjs:43", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 .claude/skills/gstack/browse/src/bun-polyfill.cjs:43"}, "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-3f7e7b4394f78744", "name": "`fetch()` without try/.catch or AbortSignal \u2014 .claude/skills/gstack/browse/src/write-commands.ts:974", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 .claude/skills/gstack/browse/src/write-commands.ts:974"}, "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-bac6eeaac6d33996", "name": "Commented-code block (5 lines) in .claude/skills/gstack/browse/src/token-registry.ts:32", "shortDescription": {"text": "Commented-code block (5 lines) in .claude/skills/gstack/browse/src/token-registry.ts:32"}, "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-70d894f5a71a2363", "name": "Commented-code block (7 lines) in .claude/skills/gstack/browse/src/browser-manager.ts:342", "shortDescription": {"text": "Commented-code block (7 lines) in .claude/skills/gstack/browse/src/browser-manager.ts:342"}, "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-e2871de5d097edad", "name": "`fetch()` without try/.catch or AbortSignal \u2014 .claude/skills/gstack/browse/test/welcome-page.test.ts:24", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 .claude/skills/gstack/browse/test/welcome-page.test.ts:24"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-c124064aed130329", "name": "`fetch()` without try/.catch or AbortSignal \u2014 .claude/skills/gstack/browse/test/sidebar-integration.test.ts:4", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 .claude/skills/gstack/browse/test/sidebar-integration.test.ts:4"}, "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-81b5f3aee8b69e74", "name": "`fetch()` without try/.catch or AbortSignal \u2014 .claude/skills/gstack/browse/test/bun-polyfill.test.ts:57", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 .claude/skills/gstack/browse/test/bun-polyfill.test.ts:57"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-49df02075cca691c", "name": "`fetch()` without try/.catch or AbortSignal \u2014 .claude/skills/gstack/browse/test/batch.test.ts:19", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 .claude/skills/gstack/browse/test/batch.test.ts:19"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-076545e7650dd829", "name": "`fetch()` without try/.catch or AbortSignal \u2014 .claude/skills/gstack/browse/test/sidebar-agent-roundtrip.test.ts:31", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 .claude/skills/gstack/browse/test/sidebar-agent-roundtrip.test.ts:31"}, "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-aeffe193ee04c9b3", "name": "Commented-code block (5 lines) in .claude/skills/gstack/browse/test/sidebar-ux.test.ts:1332", "shortDescription": {"text": "Commented-code block (5 lines) in .claude/skills/gstack/browse/test/sidebar-ux.test.ts:1332"}, "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-77f022cd5afbbff3", "name": "`fetch()` without try/.catch or AbortSignal \u2014 .claude/skills/gstack/browse/test/test-server.ts:15", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 .claude/skills/gstack/browse/test/test-server.ts:15"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-42b535b6c6ad122f", "name": "`fetch()` without try/.catch or AbortSignal \u2014 .claude/skills/gstack/extension/background.js:445", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 .claude/skills/gstack/extension/background.js:445"}, "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-583657014106b00b", "name": "Commented-code block (6 lines) in .claude/skills/gstack/supabase/functions/telemetry-ingest/index.ts:46", "shortDescription": {"text": "Commented-code block (6 lines) in .claude/skills/gstack/supabase/functions/telemetry-ingest/index.ts:46"}, "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-142627a1c14db4e6", "name": "`fetch()` without try/.catch or AbortSignal \u2014 .claude/skills/gstack/design/prototype.ts:48", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 .claude/skills/gstack/design/prototype.ts:48"}, "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-12ecb67e5279127d", "name": "`fetch()` without try/.catch or AbortSignal \u2014 .claude/skills/gstack/design/src/serve.ts:69", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 .claude/skills/gstack/design/src/serve.ts:69"}, "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-ee7e2bf77a1bf32b", "name": "`fetch()` without try/.catch or AbortSignal \u2014 .claude/skills/gstack/design/test/serve.test.ts:64", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 .claude/skills/gstack/design/test/serve.test.ts:64"}, "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-3ad1524903eea21b", "name": "`fetch()` without try/.catch or AbortSignal \u2014 .claude/skills/gstack/design/test/feedback-roundtrip.test.ts:7", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 .claude/skills/gstack/design/test/feedback-roundtrip.test.ts:7"}, "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-954d3da8253bce13", "name": "Commented-code block (5 lines) in .claude/skills/gstack/test/gen-skill-docs.test.ts:2502", "shortDescription": {"text": "Commented-code block (5 lines) in .claude/skills/gstack/test/gen-skill-docs.test.ts:2502"}, "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-0dfc478d820787ba", "name": "`fetch()` without try/.catch or AbortSignal \u2014 .claude/skills/gstack/test/skill-e2e-plan.test.ts:307", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 .claude/skills/gstack/test/skill-e2e-plan.test.ts:307"}, "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-3b064c9ac00cde7f", "name": "`fetch()` without try/.catch or AbortSignal \u2014 .claude/skills/gstack/test/skill-e2e.test.ts:1330", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 .claude/skills/gstack/test/skill-e2e.test.ts:1330"}, "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-f34f42d2b3a8b3d5", "name": "`fetch()` without try/.catch or AbortSignal \u2014 .claude/skills/gstack/test/skill-e2e-qa-workflow.test.ts:209", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 .claude/skills/gstack/test/skill-e2e-qa-workflow.test.ts:209"}, "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-a7c4a2c99f9ede68", "name": "Commented-code block (5 lines) in .claude/skills/gstack/test/hook-scripts.test.ts:119", "shortDescription": {"text": "Commented-code block (5 lines) in .claude/skills/gstack/test/hook-scripts.test.ts:119"}, "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-6db4d60d25ec7aca", "name": "`fetch()` without try/.catch or AbortSignal \u2014 .claude/skills/gstack/test/skill-e2e-sidebar.test.ts:45", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 .claude/skills/gstack/test/skill-e2e-sidebar.test.ts:45"}, "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-500e3b7d9fe8faf0", "name": "76 env vars used in code but missing from .env.example", "shortDescription": {"text": "76 env vars used in code but missing from .env.example"}, "fullDescription": {"text": "Drift between code and config docs. The first few: `AI_GRPC_LISTEN_PORT`, `API_BASE_URL`, `BROWSE_BIN`, `BROWSE_CONTENT_FILTER`, `BROWSE_EXTENSIONS_DIR`, `BROWSE_HEADED`, `BROWSE_HEADLESS_SKIP`, `BROWSE_IDLE_TIMEOUT` + 68 more. Add them (with a placeholder/comment) to .env.example so onboarding doesn't break."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-2c04133e54348533", "name": "Near-duplicate function bodies in 2 places", "shortDescription": {"text": "Near-duplicate function bodies in 2 places"}, "fullDescription": {"text": "Functions with the same first-5-line body hash:\npackages/ai-server/scripts/backfill_solution_urls_gemini.py:supabase_query, packages/ai-server/scripts/backfill_solution_urls_dryrun.py:supabase_query\n\nThis is *the* AI-coder failure mode (4\u00d7 more duplication in vibe-coded repos \u2014 see https://jw.hn/ai-code-hygiene). Consolidate or document why they're separate."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-be46ea126aa5d8dc", "name": "Near-duplicate function bodies in 3 places", "shortDescription": {"text": "Near-duplicate function bodies in 3 places"}, "fullDescription": {"text": "Functions with the same first-5-line body hash:\npackages/ai-server/scripts/backfill_solution_urls_gemini.py:supabase_query_file, packages/ai-server/scripts/backfill_solution_urls_dryrun.py:supabase_query_file, packages/ai-server/scripts/backfill_post_enrichment.py:supabase_query_file\n\nThis is *the* AI-coder failure mode (4\u00d7 more duplication in vibe-coded repos \u2014 see https://jw.hn/ai-code-hygiene). Consolidate or document why they're separate."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-33a6b62e30ce7ab4", "name": "Near-duplicate function bodies in 6 places", "shortDescription": {"text": "Near-duplicate function bodies in 6 places"}, "fullDescription": {"text": "Functions with the same first-5-line body hash:\npackages/ai-server/src/grpc/proto/outbound/outbound_pb2_grpc.py:ProcessedBatchUpdate, packages/ai-server/src/grpc/proto/outbound/outbound_pb2_grpc.py:ProcessedBatchUpdate, packages/ai-server/src/grpc/proto/inbound/inbound_pb2_grpc.py:AnalyzeLink, packages/ai-server/src/grpc/proto/inbound/inbound_pb2_grpc.py:ReparseRawPost\n\nThis is *the* AI-coder failure mode (4\u00d7 more duplication in vibe-coded repos \u2014 see https://jw.hn/ai-code-hygiene). Consolidate or document why they're separate."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-eba13254ad3c9636", "name": "Dangling fetch: GET http://127.0.0.1:${port}/health (.claude/skills/gstack/extension/sidepanel.js:1553)", "shortDescription": {"text": "Dangling fetch: GET http://127.0.0.1:${port}/health (.claude/skills/gstack/extension/sidepanel.js:1553)"}, "fullDescription": {"text": "`.claude/skills/gstack/extension/sidepanel.js:1553` calls `GET http://127.0.0.1:${port}/health` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/http:/127.0.0.1:/<p>/health`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-026d9559f7478ecd", "name": "Dangling fetch: GET https://www.pinterest.com/pin/${encodeURIComponent(pin)}/ (packages/web/app/api/admin/raw-post-sourc", "shortDescription": {"text": "Dangling fetch: GET https://www.pinterest.com/pin/${encodeURIComponent(pin)}/ (packages/web/app/api/admin/raw-post-sources/preview/route.ts:46)"}, "fullDescription": {"text": "`packages/web/app/api/admin/raw-post-sources/preview/route.ts:46` calls `GET https://www.pinterest.com/pin/${encodeURIComponent(pin)}/` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/www.pinterest.com/pin/<p>`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-5193527fd821d516", "name": "Dangling fetch: GET https://www.instagram.com/p/${encodeURIComponent(shortcode)}/ (packages/web/app/api/admin/raw-post-s", "shortDescription": {"text": "Dangling fetch: GET https://www.instagram.com/p/${encodeURIComponent(shortcode)}/ (packages/web/app/api/admin/raw-post-sources/preview/route.ts:85)"}, "fullDescription": {"text": "`packages/web/app/api/admin/raw-post-sources/preview/route.ts:85` calls `GET https://www.instagram.com/p/${encodeURIComponent(shortcode)}/` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/www.instagram.com/p/<p>`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-7e6a1accb5921105", "name": "Dangling fetch: GET /api/v1/content/posts/search?${params.toString()} (packages/web/app/admin/content-studio/PostPickerM", "shortDescription": {"text": "Dangling fetch: GET /api/v1/content/posts/search?${params.toString()} (packages/web/app/admin/content-studio/PostPickerModal.tsx:52)"}, "fullDescription": {"text": "`packages/web/app/admin/content-studio/PostPickerModal.tsx:52` calls `GET /api/v1/content/posts/search?${params.toString()}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/v1/content/posts/search`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-245e1e85027f9f4e", "name": "Dangling fetch: POST /api/v1/posts/analyze (packages/web/tests/ai-pipeline.spec.ts:111)", "shortDescription": {"text": "Dangling fetch: POST /api/v1/posts/analyze (packages/web/tests/ai-pipeline.spec.ts:111)"}, "fullDescription": {"text": "`packages/web/tests/ai-pipeline.spec.ts:111` calls `POST /api/v1/posts/analyze` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/v1/posts/analyze`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-83ad65c7e67fe29e", "name": "Dangling fetch: POST /api/v1/posts (packages/web/lib/api/posts.ts:301)", "shortDescription": {"text": "Dangling fetch: POST /api/v1/posts (packages/web/lib/api/posts.ts:301)"}, "fullDescription": {"text": "`packages/web/lib/api/posts.ts:301` calls `POST /api/v1/posts` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/v1/posts`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-87304c4eb1ff5203", "name": "Dangling fetch: POST /api/v1/posts/with-solutions (packages/web/lib/api/posts.ts:359)", "shortDescription": {"text": "Dangling fetch: POST /api/v1/posts/with-solutions (packages/web/lib/api/posts.ts:359)"}, "fullDescription": {"text": "`packages/web/lib/api/posts.ts:359` calls `POST /api/v1/posts/with-solutions` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/v1/posts/with-solutions`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-96a5a2b93790a68f", "name": "Dangling fetch: POST /api/v1/posts/try (packages/web/lib/api/posts.ts:534)", "shortDescription": {"text": "Dangling fetch: POST /api/v1/posts/try (packages/web/lib/api/posts.ts:534)"}, "fullDescription": {"text": "`packages/web/lib/api/posts.ts:534` calls `POST /api/v1/posts/try` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/v1/posts/try`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-2dfa03b7c0476768", "name": "Dangling fetch: POST /api/v1/vton (packages/web/lib/hooks/useVtonTryOn.ts:199)", "shortDescription": {"text": "Dangling fetch: POST /api/v1/vton (packages/web/lib/hooks/useVtonTryOn.ts:199)"}, "fullDescription": {"text": "`packages/web/lib/hooks/useVtonTryOn.ts:199` calls `POST /api/v1/vton` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/v1/vton`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-1a7f0b4f01375c47", "name": "Dangling fetch: POST /api/v1/tries (packages/web/lib/hooks/useVtonTryOn.ts:243)", "shortDescription": {"text": "Dangling fetch: POST /api/v1/tries (packages/web/lib/hooks/useVtonTryOn.ts:243)"}, "fullDescription": {"text": "`packages/web/lib/hooks/useVtonTryOn.ts:243` calls `POST /api/v1/tries` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/v1/tries`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-cb26282e921619e9", "name": "Dangling fetch: GET /api/v1/vton/posts?${params} (packages/web/lib/hooks/useVtonPostFetch.ts:61)", "shortDescription": {"text": "Dangling fetch: GET /api/v1/vton/posts?${params} (packages/web/lib/hooks/useVtonPostFetch.ts:61)"}, "fullDescription": {"text": "`packages/web/lib/hooks/useVtonPostFetch.ts:61` calls `GET /api/v1/vton/posts?${params}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/v1/vton/posts`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-c7792ce662109a96", "name": "Dangling fetch: GET /api/v1/vton/posts?${params} (packages/web/lib/hooks/useVtonPostFetch.ts:93)", "shortDescription": {"text": "Dangling fetch: GET /api/v1/vton/posts?${params} (packages/web/lib/hooks/useVtonPostFetch.ts:93)"}, "fullDescription": {"text": "`packages/web/lib/hooks/useVtonPostFetch.ts:93` calls `GET /api/v1/vton/posts?${params}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/v1/vton/posts`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-657f5ed8f6cb526d", "name": "Dangling fetch: POST /api/v1/reports (packages/web/lib/hooks/useReport.ts:19)", "shortDescription": {"text": "Dangling fetch: POST /api/v1/reports (packages/web/lib/hooks/useReport.ts:19)"}, "fullDescription": {"text": "`packages/web/lib/hooks/useReport.ts:19` calls `POST /api/v1/reports` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/v1/reports`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-9d64c7a84d7a7a31", "name": "Dangling fetch: GET /api/v1/vton/items?${params} (packages/web/lib/hooks/useVtonItemFetch.ts:64)", "shortDescription": {"text": "Dangling fetch: GET /api/v1/vton/items?${params} (packages/web/lib/hooks/useVtonItemFetch.ts:64)"}, "fullDescription": {"text": "`packages/web/lib/hooks/useVtonItemFetch.ts:64` calls `GET /api/v1/vton/items?${params}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/v1/vton/items`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-04c35d156797b1d7", "name": "Dangling fetch: POST /api/v1/post-magazines/generate (packages/web/lib/hooks/admin/useEditorialCandidates.ts:204)", "shortDescription": {"text": "Dangling fetch: POST /api/v1/post-magazines/generate (packages/web/lib/hooks/admin/useEditorialCandidates.ts:204)"}, "fullDescription": {"text": "`packages/web/lib/hooks/admin/useEditorialCandidates.ts:204` calls `POST /api/v1/post-magazines/generate` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/v1/post-magazines/generate`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-a9afe3766cf7d6d8", "name": "Dangling fetch: GET /api/admin/editorial-pipeline/settings (packages/web/lib/hooks/admin/useEditorialPipelineSettings.ts", "shortDescription": {"text": "Dangling fetch: GET /api/admin/editorial-pipeline/settings (packages/web/lib/hooks/admin/useEditorialPipelineSettings.ts:35)"}, "fullDescription": {"text": "`packages/web/lib/hooks/admin/useEditorialPipelineSettings.ts:35` calls `GET /api/admin/editorial-pipeline/settings` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/admin/editorial-pipeline/settings`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-b0d30e94fafcd3b1", "name": "Dangling fetch: PATCH /api/admin/editorial-pipeline/settings (packages/web/lib/hooks/admin/useEditorialPipelineSettings.", "shortDescription": {"text": "Dangling fetch: PATCH /api/admin/editorial-pipeline/settings (packages/web/lib/hooks/admin/useEditorialPipelineSettings.ts:58)"}, "fullDescription": {"text": "`packages/web/lib/hooks/admin/useEditorialPipelineSettings.ts:58` calls `PATCH /api/admin/editorial-pipeline/settings` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/admin/editorial-pipeline/settings`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-dbd563a40f5436c1", "name": "Dangling fetch: PATCH /api/v1/admin/posts/${postId}/status (packages/web/lib/hooks/admin/useAdminPosts.ts:78)", "shortDescription": {"text": "Dangling fetch: PATCH /api/v1/admin/posts/${postId}/status (packages/web/lib/hooks/admin/useAdminPosts.ts:78)"}, "fullDescription": {"text": "`packages/web/lib/hooks/admin/useAdminPosts.ts:78` calls `PATCH /api/v1/admin/posts/${postId}/status` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/v1/admin/posts/<p>/status`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-258bb470b9392d3c", "name": "Dangling fetch: PATCH /api/v1/admin/posts/magazines/${input.id}/status (packages/web/lib/hooks/admin/useUpdateMagazineSt", "shortDescription": {"text": "Dangling fetch: PATCH /api/v1/admin/posts/magazines/${input.id}/status (packages/web/lib/hooks/admin/useUpdateMagazineStatus.ts:26)"}, "fullDescription": {"text": "`packages/web/lib/hooks/admin/useUpdateMagazineStatus.ts:26` calls `PATCH /api/v1/admin/posts/magazines/${input.id}/status` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/v1/admin/posts/magazines/<p>/status`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-c7375e95bb91f5d8", "name": "Dangling fetch: POST /api/admin/editorial-article-chat/sessions/${encodeURIComponent(articleId)} (packages/web/lib/hooks", "shortDescription": {"text": "Dangling fetch: POST /api/admin/editorial-article-chat/sessions/${encodeURIComponent(articleId)} (packages/web/lib/hooks/admin/useEditorialChat.ts:88)"}, "fullDescription": {"text": "`packages/web/lib/hooks/admin/useEditorialChat.ts:88` calls `POST /api/admin/editorial-article-chat/sessions/${encodeURIComponent(articleId)}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/admin/editorial-article-chat/sessions/<p>`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-1192d2c9e4b7182f", "name": "Dangling fetch: POST /api/admin/editorial-article-chat/messages/${encodeURIComponent(sessionId)} (packages/web/lib/hooks", "shortDescription": {"text": "Dangling fetch: POST /api/admin/editorial-article-chat/messages/${encodeURIComponent(sessionId)} (packages/web/lib/hooks/admin/useEditorialChat.ts:131)"}, "fullDescription": {"text": "`packages/web/lib/hooks/admin/useEditorialChat.ts:131` calls `POST /api/admin/editorial-article-chat/messages/${encodeURIComponent(sessionId)}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/admin/editorial-article-chat/messages/<p>`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-3ee62d77e1441c6c", "name": "Dangling fetch: GET /api/v1/admin/posts/magazines?${qs} (packages/web/lib/hooks/admin/useAdminMagazineList.ts:35)", "shortDescription": {"text": "Dangling fetch: GET /api/v1/admin/posts/magazines?${qs} (packages/web/lib/hooks/admin/useAdminMagazineList.ts:35)"}, "fullDescription": {"text": "`packages/web/lib/hooks/admin/useAdminMagazineList.ts:35` calls `GET /api/v1/admin/posts/magazines?${qs}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/v1/admin/posts/magazines`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-503f39c432349ec2", "name": "Dangling fetch: PATCH /api/v1/admin/reports/${reportId} (packages/web/lib/hooks/admin/useAdminReports.ts:76)", "shortDescription": {"text": "Dangling fetch: PATCH /api/v1/admin/reports/${reportId} (packages/web/lib/hooks/admin/useAdminReports.ts:76)"}, "fullDescription": {"text": "`packages/web/lib/hooks/admin/useAdminReports.ts:76` calls `PATCH /api/v1/admin/reports/${reportId}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/v1/admin/reports/<p>`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-f4df8500b2a8cd1f", "name": "Dangling fetch: GET /api/admin/verify-stats (packages/web/lib/hooks/admin/useVerifyStats.ts:45)", "shortDescription": {"text": "Dangling fetch: GET /api/admin/verify-stats (packages/web/lib/hooks/admin/useVerifyStats.ts:45)"}, "fullDescription": {"text": "`packages/web/lib/hooks/admin/useVerifyStats.ts:45` calls `GET /api/admin/verify-stats` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/admin/verify-stats`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-fe244508ec807b57", "name": "Dangling fetch: GET /api/admin/editorial-articles?${sp.toString()} (packages/web/lib/hooks/admin/useEditorialArticles.ts", "shortDescription": {"text": "Dangling fetch: GET /api/admin/editorial-articles?${sp.toString()} (packages/web/lib/hooks/admin/useEditorialArticles.ts:206)"}, "fullDescription": {"text": "`packages/web/lib/hooks/admin/useEditorialArticles.ts:206` calls `GET /api/admin/editorial-articles?${sp.toString()}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/admin/editorial-articles`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-e733c8f44e59f24c", "name": "Dangling fetch: POST /api/admin/editorial-articles/${encodeURIComponent(id)}/regen-thumbnail (packages/web/lib/hooks/adm", "shortDescription": {"text": "Dangling fetch: POST /api/admin/editorial-articles/${encodeURIComponent(id)}/regen-thumbnail (packages/web/lib/hooks/admin/useEditorialArticles.ts:253)"}, "fullDescription": {"text": "`packages/web/lib/hooks/admin/useEditorialArticles.ts:253` calls `POST /api/admin/editorial-articles/${encodeURIComponent(id)}/regen-thumbnail` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/admin/editorial-articles/<p>/regen-thumbnail`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-4e285a7114f21e98", "name": "Dangling fetch: POST /api/admin/editorial-articles/${encodeURIComponent(id)}/regen-ig-carousel (packages/web/lib/hooks/a", "shortDescription": {"text": "Dangling fetch: POST /api/admin/editorial-articles/${encodeURIComponent(id)}/regen-ig-carousel (packages/web/lib/hooks/admin/useEditorialArticles.ts:288)"}, "fullDescription": {"text": "`packages/web/lib/hooks/admin/useEditorialArticles.ts:288` calls `POST /api/admin/editorial-articles/${encodeURIComponent(id)}/regen-ig-carousel` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/admin/editorial-articles/<p>/regen-ig-carousel`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-d72a11581c7b1ab1", "name": "Dangling fetch: PATCH /api/admin/editorial-articles/${encodeURIComponent(id)} (packages/web/lib/hooks/admin/useEditorial", "shortDescription": {"text": "Dangling fetch: PATCH /api/admin/editorial-articles/${encodeURIComponent(id)} (packages/web/lib/hooks/admin/useEditorialArticles.ts:320)"}, "fullDescription": {"text": "`packages/web/lib/hooks/admin/useEditorialArticles.ts:320` calls `PATCH /api/admin/editorial-articles/${encodeURIComponent(id)}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/admin/editorial-articles/<p>`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-df8bb38eb107fe35", "name": "Dangling fetch: DELETE /api/admin/editorial-articles/${encodeURIComponent(id)} (packages/web/lib/hooks/admin/useEditoria", "shortDescription": {"text": "Dangling fetch: DELETE /api/admin/editorial-articles/${encodeURIComponent(id)} (packages/web/lib/hooks/admin/useEditorialArticles.ts:369)"}, "fullDescription": {"text": "`packages/web/lib/hooks/admin/useEditorialArticles.ts:369` calls `DELETE /api/admin/editorial-articles/${encodeURIComponent(id)}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/admin/editorial-articles/<p>`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-73913f130a0701a8", "name": "Dangling fetch: GET /api/admin/editorial-discovery/settings (packages/web/lib/hooks/admin/useDiscoverySettings.ts:46)", "shortDescription": {"text": "Dangling fetch: GET /api/admin/editorial-discovery/settings (packages/web/lib/hooks/admin/useDiscoverySettings.ts:46)"}, "fullDescription": {"text": "`packages/web/lib/hooks/admin/useDiscoverySettings.ts:46` calls `GET /api/admin/editorial-discovery/settings` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/admin/editorial-discovery/settings`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-a7d77604beaf42d8", "name": "Dangling fetch: PATCH /api/admin/editorial-discovery/settings (packages/web/lib/hooks/admin/useDiscoverySettings.ts:67)", "shortDescription": {"text": "Dangling fetch: PATCH /api/admin/editorial-discovery/settings (packages/web/lib/hooks/admin/useDiscoverySettings.ts:67)"}, "fullDescription": {"text": "`packages/web/lib/hooks/admin/useDiscoverySettings.ts:67` calls `PATCH /api/admin/editorial-discovery/settings` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/admin/editorial-discovery/settings`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-24d971b774ef489a", "name": "Dangling fetch: GET /api/admin/editorial-recommendations?${sp.toString()} (packages/web/lib/hooks/admin/useEditorialReco", "shortDescription": {"text": "Dangling fetch: GET /api/admin/editorial-recommendations?${sp.toString()} (packages/web/lib/hooks/admin/useEditorialRecommendations.ts:74)"}, "fullDescription": {"text": "`packages/web/lib/hooks/admin/useEditorialRecommendations.ts:74` calls `GET /api/admin/editorial-recommendations?${sp.toString()}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/admin/editorial-recommendations`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-d0c415ba4adbfdf1", "name": "Dangling fetch: GET /api/admin/editorial-recommendations?page=1&per_page=100 (packages/web/lib/hooks/admin/useEditorialR", "shortDescription": {"text": "Dangling fetch: GET /api/admin/editorial-recommendations?page=1&per_page=100 (packages/web/lib/hooks/admin/useEditorialRecommendations.ts:100)"}, "fullDescription": {"text": "`packages/web/lib/hooks/admin/useEditorialRecommendations.ts:100` calls `GET /api/admin/editorial-recommendations?page=1&per_page=100` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/admin/editorial-recommendations`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-e42ce24bdd73b22f", "name": "Dangling fetch: PATCH /api/admin/editorial-recommendations/${encodeURIComponent(id)} (packages/web/lib/hooks/admin/useEd", "shortDescription": {"text": "Dangling fetch: PATCH /api/admin/editorial-recommendations/${encodeURIComponent(id)} (packages/web/lib/hooks/admin/useEditorialRecommendations.ts:122)"}, "fullDescription": {"text": "`packages/web/lib/hooks/admin/useEditorialRecommendations.ts:122` calls `PATCH /api/admin/editorial-recommendations/${encodeURIComponent(id)}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/admin/editorial-recommendations/<p>`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-fefffd7e21fbf4b7", "name": "Dangling fetch: DELETE /api/admin/editorial-recommendations/${encodeURIComponent(id)} (packages/web/lib/hooks/admin/useE", "shortDescription": {"text": "Dangling fetch: DELETE /api/admin/editorial-recommendations/${encodeURIComponent(id)} (packages/web/lib/hooks/admin/useEditorialRecommendations.ts:149)"}, "fullDescription": {"text": "`packages/web/lib/hooks/admin/useEditorialRecommendations.ts:149` calls `DELETE /api/admin/editorial-recommendations/${encodeURIComponent(id)}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/admin/editorial-recommendations/<p>`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-9418d8c9e3b058be", "name": "Dangling fetch: GET /api/v1/admin/monitoring/metrics (packages/web/lib/hooks/admin/useMonitoring.ts:14)", "shortDescription": {"text": "Dangling fetch: GET /api/v1/admin/monitoring/metrics (packages/web/lib/hooks/admin/useMonitoring.ts:14)"}, "fullDescription": {"text": "`packages/web/lib/hooks/admin/useMonitoring.ts:14` calls `GET /api/v1/admin/monitoring/metrics` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/v1/admin/monitoring/metrics`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-39e7714d240e615c", "name": "Dangling fetch: PATCH /api/v1/admin/posts/${postId} (packages/web/lib/hooks/admin/useAdminPostEdit.ts:21)", "shortDescription": {"text": "Dangling fetch: PATCH /api/v1/admin/posts/${postId} (packages/web/lib/hooks/admin/useAdminPostEdit.ts:21)"}, "fullDescription": {"text": "`packages/web/lib/hooks/admin/useAdminPostEdit.ts:21` calls `PATCH /api/v1/admin/posts/${postId}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/v1/admin/posts/<p>`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-89ae938db628670f", "name": "Dangling fetch: GET /api/auth/session (packages/web/lib/auth/client.ts:74)", "shortDescription": {"text": "Dangling fetch: GET /api/auth/session (packages/web/lib/auth/client.ts:74)"}, "fullDescription": {"text": "`packages/web/lib/auth/client.ts:74` calls `GET /api/auth/session` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:request\nNormalized path used for matching: `/auth/session`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-3770e50834112720", "name": "Dangling fetch: POST /api/auth/login (packages/web/lib/auth/client.ts:85)", "shortDescription": {"text": "Dangling fetch: POST /api/auth/login (packages/web/lib/auth/client.ts:85)"}, "fullDescription": {"text": "`packages/web/lib/auth/client.ts:85` calls `POST /api/auth/login` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:request\nNormalized path used for matching: `/auth/login`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-474835f205a60825", "name": "Dangling fetch: POST /api/auth/oauth/start (packages/web/lib/auth/client.ts:100)", "shortDescription": {"text": "Dangling fetch: POST /api/auth/oauth/start (packages/web/lib/auth/client.ts:100)"}, "fullDescription": {"text": "`packages/web/lib/auth/client.ts:100` calls `POST /api/auth/oauth/start` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:request\nNormalized path used for matching: `/auth/oauth/start`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-424df6e7f241dae9", "name": "Dangling fetch: POST /api/auth/refresh (packages/web/lib/auth/client.ts:123)", "shortDescription": {"text": "Dangling fetch: POST /api/auth/refresh (packages/web/lib/auth/client.ts:123)"}, "fullDescription": {"text": "`packages/web/lib/auth/client.ts:123` calls `POST /api/auth/refresh` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:request\nNormalized path used for matching: `/auth/refresh`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-2a1be91965e090ac", "name": "Dangling fetch: DELETE /api/auth/session (packages/web/lib/components/admin/AdminSidebar.tsx:166)", "shortDescription": {"text": "Dangling fetch: DELETE /api/auth/session (packages/web/lib/components/admin/AdminSidebar.tsx:166)"}, "fullDescription": {"text": "`packages/web/lib/components/admin/AdminSidebar.tsx:166` calls `DELETE /api/auth/session` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/auth/session`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-3797306c7a09aa8d", "name": "Dangling fetch: GET /api/v1/vton/posts?${params} (packages/web/lib/components/profile/ClosetGrid.tsx:63)", "shortDescription": {"text": "Dangling fetch: GET /api/v1/vton/posts?${params} (packages/web/lib/components/profile/ClosetGrid.tsx:63)"}, "fullDescription": {"text": "`packages/web/lib/components/profile/ClosetGrid.tsx:63` calls `GET /api/v1/vton/posts?${params}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/v1/vton/posts`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-0e077c7d087f98ff", "name": "Dangling fetch: GET /api/v1/vton/run (packages/web/lib/components/cody/__tests__/vton-separation.test.ts:62)", "shortDescription": {"text": "Dangling fetch: GET /api/v1/vton/run (packages/web/lib/components/cody/__tests__/vton-separation.test.ts:62)"}, "fullDescription": {"text": "`packages/web/lib/components/cody/__tests__/vton-separation.test.ts:62` calls `GET /api/v1/vton/run` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/v1/vton/run`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-e9a2a012bb3c9392", "name": "Dangling fetch: GET /video-jobs/${jobId} (packages/web/lib/content-studio/assets/video-persistence.ts:27)", "shortDescription": {"text": "Dangling fetch: GET /video-jobs/${jobId} (packages/web/lib/content-studio/assets/video-persistence.ts:27)"}, "fullDescription": {"text": "`packages/web/lib/content-studio/assets/video-persistence.ts:27` calls `GET /video-jobs/${jobId}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:request\nNormalized path used for matching: `/video-jobs/<p>`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-c15ab3232540b0cf", "name": "Dangling fetch: POST /video-jobs (packages/web/lib/content-studio/assets/video-persistence.ts:37)", "shortDescription": {"text": "Dangling fetch: POST /video-jobs (packages/web/lib/content-studio/assets/video-persistence.ts:37)"}, "fullDescription": {"text": "`packages/web/lib/content-studio/assets/video-persistence.ts:37` calls `POST /video-jobs` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:request\nNormalized path used for matching: `/video-jobs`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-6c559f91aef92a68", "name": "Dangling fetch: PUT /video-scenes/row (packages/web/lib/content-studio/assets/video-persistence.ts:44)", "shortDescription": {"text": "Dangling fetch: PUT /video-scenes/row (packages/web/lib/content-studio/assets/video-persistence.ts:44)"}, "fullDescription": {"text": "`packages/web/lib/content-studio/assets/video-persistence.ts:44` calls `PUT /video-scenes/row` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:request\nNormalized path used for matching: `/video-scenes/row`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-b9a9cee1d3f01775", "name": "Dangling fetch: POST /assets/upload (packages/web/lib/content-studio/assets/video-persistence.ts:57)", "shortDescription": {"text": "Dangling fetch: POST /assets/upload (packages/web/lib/content-studio/assets/video-persistence.ts:57)"}, "fullDescription": {"text": "`packages/web/lib/content-studio/assets/video-persistence.ts:57` calls `POST /assets/upload` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: helper:request\nNormalized path used for matching: `/assets/upload`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-8855f38607cecbd6", "name": "Dangling fetch: GET /api/... (.claude/skills/gstack/scripts/resolvers/utility.ts:107)", "shortDescription": {"text": "Dangling fetch: GET /api/... (.claude/skills/gstack/scripts/resolvers/utility.ts:107)"}, "fullDescription": {"text": "`.claude/skills/gstack/scripts/resolvers/utility.ts:107` calls `GET /api/...` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/...`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-b4c59974cdb0c213", "name": "Dangling fetch: GET http://127.0.0.1:${port}/health (.claude/skills/gstack/browse/src/cli.ts:115)", "shortDescription": {"text": "Dangling fetch: GET http://127.0.0.1:${port}/health (.claude/skills/gstack/browse/src/cli.ts:115)"}, "fullDescription": {"text": "`.claude/skills/gstack/browse/src/cli.ts:115` calls `GET http://127.0.0.1:${port}/health` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/http:/127.0.0.1:/<p>/health`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-9fabc3d6fc3bf6b3", "name": "Dangling fetch: POST http://127.0.0.1:${state.port}/command (.claude/skills/gstack/browse/src/cli.ts:377)", "shortDescription": {"text": "Dangling fetch: POST http://127.0.0.1:${state.port}/command (.claude/skills/gstack/browse/src/cli.ts:377)"}, "fullDescription": {"text": "`.claude/skills/gstack/browse/src/cli.ts:377` calls `POST http://127.0.0.1:${state.port}/command` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/http:/127.0.0.1:/<p>/command`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-7dbd897c5e4e8143", "name": "Dangling fetch: POST http://127.0.0.1:${state.port}/pair (.claude/skills/gstack/browse/src/cli.ts:586)", "shortDescription": {"text": "Dangling fetch: POST http://127.0.0.1:${state.port}/pair (.claude/skills/gstack/browse/src/cli.ts:586)"}, "fullDescription": {"text": "`.claude/skills/gstack/browse/src/cli.ts:586` calls `POST http://127.0.0.1:${state.port}/pair` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/http:/127.0.0.1:/<p>/pair`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-270a928b1cb578bc", "name": "Dangling fetch: POST http://127.0.0.1:${state.port}/tunnel/start (.claude/skills/gstack/browse/src/cli.ts:644)", "shortDescription": {"text": "Dangling fetch: POST http://127.0.0.1:${state.port}/tunnel/start (.claude/skills/gstack/browse/src/cli.ts:644)"}, "fullDescription": {"text": "`.claude/skills/gstack/browse/src/cli.ts:644` calls `POST http://127.0.0.1:${state.port}/tunnel/start` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/http:/127.0.0.1:/<p>/tunnel/start`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-31bc2c9df8471058", "name": "Dangling fetch: GET http://127.0.0.1:${existingState.port}/health (.claude/skills/gstack/browse/src/cli.ts:771)", "shortDescription": {"text": "Dangling fetch: GET http://127.0.0.1:${existingState.port}/health (.claude/skills/gstack/browse/src/cli.ts:771)"}, "fullDescription": {"text": "`.claude/skills/gstack/browse/src/cli.ts:771` calls `GET http://127.0.0.1:${existingState.port}/health` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/http:/127.0.0.1:/<p>/health`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-21fe262697e4f860", "name": "Dangling fetch: POST http://127.0.0.1:${newState.port}/command (.claude/skills/gstack/browse/src/cli.ts:838)", "shortDescription": {"text": "Dangling fetch: POST http://127.0.0.1:${newState.port}/command (.claude/skills/gstack/browse/src/cli.ts:838)"}, "fullDescription": {"text": "`.claude/skills/gstack/browse/src/cli.ts:838` calls `POST http://127.0.0.1:${newState.port}/command` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/http:/127.0.0.1:/<p>/command`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-ce6efb8671a1ba8f", "name": "Dangling fetch: POST http://127.0.0.1:${existingState.port}/command (.claude/skills/gstack/browse/src/cli.ts:919)", "shortDescription": {"text": "Dangling fetch: POST http://127.0.0.1:${existingState.port}/command (.claude/skills/gstack/browse/src/cli.ts:919)"}, "fullDescription": {"text": "`.claude/skills/gstack/browse/src/cli.ts:919` calls `POST http://127.0.0.1:${existingState.port}/command` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/http:/127.0.0.1:/<p>/command`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-65636dfac5aa441e", "name": "Dangling fetch: GET http://127.0.0.1:${serverPort}${pathname} (.claude/skills/gstack/browse/test/sidebar-integration.tes", "shortDescription": {"text": "Dangling fetch: GET http://127.0.0.1:${serverPort}${pathname} (.claude/skills/gstack/browse/test/sidebar-integration.test.ts:29)"}, "fullDescription": {"text": "`.claude/skills/gstack/browse/test/sidebar-integration.test.ts:29` calls `GET http://127.0.0.1:${serverPort}${pathname}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/http:/127.0.0.1:/<p>/<p>`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-27522bc50e5c6cbf", "name": "Dangling fetch: POST http://127.0.0.1:${serverPort}/batch (.claude/skills/gstack/browse/test/batch.test.ts:19)", "shortDescription": {"text": "Dangling fetch: POST http://127.0.0.1:${serverPort}/batch (.claude/skills/gstack/browse/test/batch.test.ts:19)"}, "fullDescription": {"text": "`.claude/skills/gstack/browse/test/batch.test.ts:19` calls `POST http://127.0.0.1:${serverPort}/batch` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/http:/127.0.0.1:/<p>/batch`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-ef949c44a51e964b", "name": "Dangling fetch: GET http://127.0.0.1:${serverPort}${pathname} (.claude/skills/gstack/browse/test/sidebar-agent-roundtrip", "shortDescription": {"text": "Dangling fetch: GET http://127.0.0.1:${serverPort}${pathname} (.claude/skills/gstack/browse/test/sidebar-agent-roundtrip.test.ts:31)"}, "fullDescription": {"text": "`.claude/skills/gstack/browse/test/sidebar-agent-roundtrip.test.ts:31` calls `GET http://127.0.0.1:${serverPort}${pathname}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/http:/127.0.0.1:/<p>/<p>`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-7de026bddab11336", "name": "Dangling fetch: POST https://api.openai.com/v1/responses (.claude/skills/gstack/design/prototype.ts:48)", "shortDescription": {"text": "Dangling fetch: POST https://api.openai.com/v1/responses (.claude/skills/gstack/design/prototype.ts:48)"}, "fullDescription": {"text": "`.claude/skills/gstack/design/prototype.ts:48` calls `POST https://api.openai.com/v1/responses` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/api.openai.com/v1/responses`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-a01f5203f60b99e3", "name": "Dangling fetch: POST https://api.openai.com/v1/responses (.claude/skills/gstack/design/src/evolve.ts:58)", "shortDescription": {"text": "Dangling fetch: POST https://api.openai.com/v1/responses (.claude/skills/gstack/design/src/evolve.ts:58)"}, "fullDescription": {"text": "`.claude/skills/gstack/design/src/evolve.ts:58` calls `POST https://api.openai.com/v1/responses` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/api.openai.com/v1/responses`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-1c5165668ced5756", "name": "Dangling fetch: POST https://api.openai.com/v1/chat/completions (.claude/skills/gstack/design/src/evolve.ts:116)", "shortDescription": {"text": "Dangling fetch: POST https://api.openai.com/v1/chat/completions (.claude/skills/gstack/design/src/evolve.ts:116)"}, "fullDescription": {"text": "`.claude/skills/gstack/design/src/evolve.ts:116` calls `POST https://api.openai.com/v1/chat/completions` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/api.openai.com/v1/chat/completions`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-bf01965c4cac5d0f", "name": "Dangling fetch: POST https://api.openai.com/v1/chat/completions (.claude/skills/gstack/design/src/design-to-code.ts:40)", "shortDescription": {"text": "Dangling fetch: POST https://api.openai.com/v1/chat/completions (.claude/skills/gstack/design/src/design-to-code.ts:40)"}, "fullDescription": {"text": "`.claude/skills/gstack/design/src/design-to-code.ts:40` calls `POST https://api.openai.com/v1/chat/completions` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/api.openai.com/v1/chat/completions`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-60fc239a8bcfc39e", "name": "Dangling fetch: POST https://api.openai.com/v1/responses (.claude/skills/gstack/design/src/generate.ts:43)", "shortDescription": {"text": "Dangling fetch: POST https://api.openai.com/v1/responses (.claude/skills/gstack/design/src/generate.ts:43)"}, "fullDescription": {"text": "`.claude/skills/gstack/design/src/generate.ts:43` calls `POST https://api.openai.com/v1/responses` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/api.openai.com/v1/responses`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-acd229f097d12b68", "name": "Dangling fetch: POST https://api.openai.com/v1/responses (.claude/skills/gstack/design/src/iterate.ts:88)", "shortDescription": {"text": "Dangling fetch: POST https://api.openai.com/v1/responses (.claude/skills/gstack/design/src/iterate.ts:88)"}, "fullDescription": {"text": "`.claude/skills/gstack/design/src/iterate.ts:88` calls `POST https://api.openai.com/v1/responses` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/api.openai.com/v1/responses`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-349a02c16e56e3ae", "name": "Dangling fetch: POST https://api.openai.com/v1/responses (.claude/skills/gstack/design/src/iterate.ts:136)", "shortDescription": {"text": "Dangling fetch: POST https://api.openai.com/v1/responses (.claude/skills/gstack/design/src/iterate.ts:136)"}, "fullDescription": {"text": "`.claude/skills/gstack/design/src/iterate.ts:136` calls `POST https://api.openai.com/v1/responses` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/api.openai.com/v1/responses`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-b9fcf2a2cefeb693", "name": "Dangling fetch: POST https://api.openai.com/v1/chat/completions (.claude/skills/gstack/design/src/check.ts:25)", "shortDescription": {"text": "Dangling fetch: POST https://api.openai.com/v1/chat/completions (.claude/skills/gstack/design/src/check.ts:25)"}, "fullDescription": {"text": "`.claude/skills/gstack/design/src/check.ts:25` calls `POST https://api.openai.com/v1/chat/completions` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/api.openai.com/v1/chat/completions`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-5523f4cdcff0fe6b", "name": "Dangling fetch: POST https://api.openai.com/v1/responses (.claude/skills/gstack/design/src/variants.ts:57)", "shortDescription": {"text": "Dangling fetch: POST https://api.openai.com/v1/responses (.claude/skills/gstack/design/src/variants.ts:57)"}, "fullDescription": {"text": "`.claude/skills/gstack/design/src/variants.ts:57` calls `POST https://api.openai.com/v1/responses` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/api.openai.com/v1/responses`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-37c4cc7cb1d6118a", "name": "Dangling fetch: POST https://api.openai.com/v1/chat/completions (.claude/skills/gstack/design/src/memory.ts:37)", "shortDescription": {"text": "Dangling fetch: POST https://api.openai.com/v1/chat/completions (.claude/skills/gstack/design/src/memory.ts:37)"}, "fullDescription": {"text": "`.claude/skills/gstack/design/src/memory.ts:37` calls `POST https://api.openai.com/v1/chat/completions` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/api.openai.com/v1/chat/completions`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-aadb335d616ed2cf", "name": "Dangling fetch: POST https://api.openai.com/v1/chat/completions (.claude/skills/gstack/design/src/diff.ts:31)", "shortDescription": {"text": "Dangling fetch: POST https://api.openai.com/v1/chat/completions (.claude/skills/gstack/design/src/diff.ts:31)"}, "fullDescription": {"text": "`.claude/skills/gstack/design/src/diff.ts:31` calls `POST https://api.openai.com/v1/chat/completions` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/api.openai.com/v1/chat/completions`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-89e6a823658bf8e0", "name": "Dangling fetch: GET /api/stats (.claude/skills/gstack/test/skill-e2e-plan.test.ts:307)", "shortDescription": {"text": "Dangling fetch: GET /api/stats (.claude/skills/gstack/test/skill-e2e-plan.test.ts:307)"}, "fullDescription": {"text": "`.claude/skills/gstack/test/skill-e2e-plan.test.ts:307` calls `GET /api/stats` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/stats`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-8e5035737f1b0031", "name": "Dangling fetch: GET /api/stats (.claude/skills/gstack/test/skill-e2e.test.ts:1423)", "shortDescription": {"text": "Dangling fetch: GET /api/stats (.claude/skills/gstack/test/skill-e2e.test.ts:1423)"}, "fullDescription": {"text": "`.claude/skills/gstack/test/skill-e2e.test.ts:1423` calls `GET /api/stats` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/stats`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-ba2a6a84e92ab4f5", "name": "Dangling fetch: GET http://127.0.0.1:${serverPort}${pathname} (.claude/skills/gstack/test/skill-e2e-sidebar.test.ts:45)", "shortDescription": {"text": "Dangling fetch: GET http://127.0.0.1:${serverPort}${pathname} (.claude/skills/gstack/test/skill-e2e-sidebar.test.ts:45)"}, "fullDescription": {"text": "`.claude/skills/gstack/test/skill-e2e-sidebar.test.ts:45` calls `GET http://127.0.0.1:${serverPort}${pathname}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/http:/127.0.0.1:/<p>/<p>`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-19311267b6735ad0", "name": "Dangling fetch: GET http://127.0.0.1:${serverPort}${pathname} (.claude/skills/gstack/test/skill-e2e-sidebar.test.ts:178)", "shortDescription": {"text": "Dangling fetch: GET http://127.0.0.1:${serverPort}${pathname} (.claude/skills/gstack/test/skill-e2e-sidebar.test.ts:178)"}, "fullDescription": {"text": "`.claude/skills/gstack/test/skill-e2e-sidebar.test.ts:178` calls `GET http://127.0.0.1:${serverPort}${pathname}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/http:/127.0.0.1:/<p>/<p>`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-81cf5c5ded425722", "name": "Dangling fetch: GET http://127.0.0.1:${serverPort}/health (.claude/skills/gstack/test/skill-e2e-sidebar.test.ts:225)", "shortDescription": {"text": "Dangling fetch: GET http://127.0.0.1:${serverPort}/health (.claude/skills/gstack/test/skill-e2e-sidebar.test.ts:225)"}, "fullDescription": {"text": "`.claude/skills/gstack/test/skill-e2e-sidebar.test.ts:225` calls `GET http://127.0.0.1:${serverPort}/health` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/http:/127.0.0.1:/<p>/health`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-e235d593a2082879", "name": "Dangling fetch: GET http://127.0.0.1:${serverPort}${pathname} (.claude/skills/gstack/test/skill-e2e-sidebar.test.ts:363)", "shortDescription": {"text": "Dangling fetch: GET http://127.0.0.1:${serverPort}${pathname} (.claude/skills/gstack/test/skill-e2e-sidebar.test.ts:363)"}, "fullDescription": {"text": "`.claude/skills/gstack/test/skill-e2e-sidebar.test.ts:363` calls `GET http://127.0.0.1:${serverPort}${pathname}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/http:/127.0.0.1:/<p>/<p>`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-5baa8971ebe192a1", "name": "Unused endpoint: GET /", "shortDescription": {"text": "Unused endpoint: GET /"}, "fullDescription": {"text": "`packages/ai-server/src/bootstrap.py` declares `GET /` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}]}}, "automationDetails": {"id": "repobility/25314"}, "properties": {"repository": "decodedcorp/decoded", "repoUrl": "https://github.com/decodedcorp/decoded", "branch": "main"}, "results": [{"ruleId": "scanner-f5b331227d7ffe6c", "level": "note", "message": {"text": "Possibly dead Python function: progress_logger"}, "properties": {"repobilityId": "db40018cbea684c8", "scanner": "scanner-primary", "fingerprint": "f5b331227d7ffe6c", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "packages/ai-server/scripts/backfill_starstyle_posts.py:509"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-b72a5b58f9fb663c", "level": "note", "message": {"text": "Possibly dead Python function: progress_logger_scan"}, "properties": {"repobilityId": "0032cefdc5a1baaa", "scanner": "scanner-primary", "fingerprint": "b72a5b58f9fb663c", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "packages/ai-server/scripts/backfill_whatsonthestar_outfits.py:540"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-28cb924669d05b0b", "level": "note", "message": {"text": "Possibly dead Python function: initialize_async_resources"}, "properties": {"repobilityId": "260f58685dd1d573", "scanner": "scanner-primary", "fingerprint": "28cb924669d05b0b", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "packages/ai-server/src/bootstrap.py:40"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-42ef7063324956fb", "level": "note", "message": {"text": "Possibly dead Python function: setup_logging"}, "properties": {"repobilityId": "e79074b18f293f2b", "scanner": "scanner-primary", "fingerprint": "42ef7063324956fb", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "packages/ai-server/src/log.py:9"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-804077d5cdfadb1a", "level": "note", "message": {"text": "Possibly dead Python function: wrapped"}, "properties": {"repobilityId": "faacdada21d43bd9", "scanner": "scanner-primary", "fingerprint": "804077d5cdfadb1a", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "packages/ai-server/src/post_editorial/events.py:152"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-0a11cfef361b37c2", "level": "note", "message": {"text": "Possibly dead Python function: route_after_review"}, "properties": {"repobilityId": "0ac13b6039197050", "scanner": "scanner-primary", "fingerprint": "0a11cfef361b37c2", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "packages/ai-server/src/post_editorial/graph.py:37"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-b28596d3620dddb4", "level": "note", "message": {"text": "Possibly dead Python function: model_post_init"}, "properties": {"repobilityId": "92fde611a57364a6", "scanner": "scanner-primary", "fingerprint": "b28596d3620dddb4", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "packages/ai-server/src/post_editorial/state.py:26"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-2743ab5c05a4ee25", "level": "note", "message": {"text": "Possibly dead Python function: design_spec_node"}, "properties": {"repobilityId": "e7dc22866ee147b4", "scanner": "scanner-primary", "fingerprint": "2743ab5c05a4ee25", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "packages/ai-server/src/post_editorial/nodes/design_spec.py:77"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-95c5a1834140b694", "level": "note", "message": {"text": "Possibly dead Python function: image_analysis_node"}, "properties": {"repobilityId": "4defe58bc9319cc6", "scanner": "scanner-primary", "fingerprint": "95c5a1834140b694", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "packages/ai-server/src/post_editorial/nodes/image_analysis.py:75"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-e92faafac0a389dd", "level": "note", "message": {"text": "Possibly dead Python function: item_search_node"}, "properties": {"repobilityId": "3599b3de47d62d7e", "scanner": "scanner-primary", "fingerprint": "e92faafac0a389dd", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "packages/ai-server/src/post_editorial/nodes/item_search.py:321"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-0e4a1ecf4c0e2ba4", "level": "note", "message": {"text": "Possibly dead Python function: editorial_node"}, "properties": {"repobilityId": "6d46c81948a7a3ca", "scanner": "scanner-primary", "fingerprint": "0e4a1ecf4c0e2ba4", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "packages/ai-server/src/post_editorial/nodes/editorial.py:186"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-8dd13e8dbeb32318", "level": "note", "message": {"text": "Possibly dead Python function: review_node"}, "properties": {"repobilityId": "2f677865ad963050", "scanner": "scanner-primary", "fingerprint": "8dd13e8dbeb32318", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "packages/ai-server/src/post_editorial/nodes/review.py:113"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-e1d89d14210a3222", "level": "note", "message": {"text": "Possibly dead Python function: item_research_node"}, "properties": {"repobilityId": "d1b95fa6099b202f", "scanner": "scanner-primary", "fingerprint": "e1d89d14210a3222", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "packages/ai-server/src/post_editorial/nodes/item_research.py:255"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-44c9602cb14080b1", "level": "note", "message": {"text": "Possibly dead Python function: publish_node"}, "properties": {"repobilityId": "0c6ea1751106c482", "scanner": "scanner-primary", "fingerprint": "44c9602cb14080b1", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "packages/ai-server/src/post_editorial/nodes/publish.py:107"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-f6f730673cad086b", "level": "note", "message": {"text": "Possibly dead Python function: celeb_search_node"}, "properties": {"repobilityId": "0b728c7827023dd2", "scanner": "scanner-primary", "fingerprint": "f6f730673cad086b", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "packages/ai-server/src/post_editorial/nodes/celeb_search.py:211"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-dd2570c146ea0af4", "level": "note", "message": {"text": "Possibly dead Python function: news_research_node"}, "properties": {"repobilityId": "dc67038ed3fd3a92", "scanner": "scanner-primary", "fingerprint": "dd2570c146ea0af4", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "packages/ai-server/src/post_editorial/nodes/news_research.py:291"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-d587741d075f89eb", "level": "note", "message": {"text": "Possibly dead Python function: summary_node"}, "properties": {"repobilityId": "9892eb67185e59dc", "scanner": "scanner-primary", "fingerprint": "d587741d075f89eb", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "packages/ai-server/src/post_editorial/nodes/summary.py:98"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-150fdf168a8308f9", "level": "note", "message": {"text": "Possibly dead Python function: detect_main_language"}, "properties": {"repobilityId": "7399413f517b7f7a", "scanner": "scanner-primary", "fingerprint": "150fdf168a8308f9", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "packages/ai-server/src/utils/text_utils.py:80"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-4278f5a9df58ce72", "level": "note", "message": {"text": "Possibly dead Python function: extract_img_tags_from_url"}, "properties": {"repobilityId": "92581adbf2e6a8f9", "scanner": "scanner-primary", "fingerprint": "4278f5a9df58ce72", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "packages/ai-server/src/utils/text_utils.py:108"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-b0ac3da4eb66abe4", "level": "note", "message": {"text": "Possibly dead Python function: to_radian"}, "properties": {"repobilityId": "53e77a8bc3ba9045", "scanner": "scanner-primary", "fingerprint": "b0ac3da4eb66abe4", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "packages/ai-server/src/utils/types.py:34"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-f7f53b3ea08efa03", "level": "note", "message": {"text": "Possibly dead Python function: basic_setup"}, "properties": {"repobilityId": "fb05e40b90f6cc0a", "scanner": "scanner-primary", "fingerprint": "f7f53b3ea08efa03", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "packages/ai-server/src/utils/selenium_utils.py:127"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-19d347e30db47162", "level": "note", "message": {"text": "Possibly dead Python function: image_url_validation"}, "properties": {"repobilityId": "08c78dba4cc3cb59", "scanner": "scanner-primary", "fingerprint": "19d347e30db47162", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "packages/ai-server/src/utils/image_utils.py:1"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-2847b5d76288e89a", "level": "note", "message": {"text": "Possibly dead Python function: research_node"}, "properties": {"repobilityId": "f12852465323223f", "scanner": "scanner-primary", "fingerprint": "2847b5d76288e89a", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "packages/ai-server/src/editorial_article/nodes/research.py:26"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-d1c3b4945404cd66", "level": "note", "message": {"text": "Possibly dead Python function: fetch_sources_node"}, "properties": {"repobilityId": "a9688926cad98845", "scanner": "scanner-primary", "fingerprint": "d1c3b4945404cd66", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "packages/ai-server/src/editorial_article/nodes/fetch_sources.py:130"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-48b144c517318c28", "level": "note", "message": {"text": "Possibly dead Python function: compose_layout_node"}, "properties": {"repobilityId": "259f787db39cf84b", "scanner": "scanner-primary", "fingerprint": "48b144c517318c28", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "packages/ai-server/src/editorial_article/nodes/compose_layout.py:55"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-23963668e88994a5", "level": "note", "message": {"text": "Possibly dead Python function: publish_node"}, "properties": {"repobilityId": "0c6ea1751106c482", "scanner": "scanner-primary", "fingerprint": "23963668e88994a5", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "packages/ai-server/src/editorial_article/nodes/publish.py:107"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-c82c5917ba1d6c24", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 packages/web/proxy.ts:99"}, "properties": {"repobilityId": "f5a31a50bbf223fe", "scanner": "scanner-primary", "fingerprint": "c82c5917ba1d6c24", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-31b12c200fb19219", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 packages/web/app/admin/solutions/page.tsx:182"}, "properties": {"repobilityId": "9a35454e73f1f3a1", "scanner": "scanner-primary", "fingerprint": "31b12c200fb19219", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-e7556a7d43d43b43", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 packages/web/app/admin/raw-posts/page.tsx:194"}, "properties": {"repobilityId": "3bfe180543f05186", "scanner": "scanner-primary", "fingerprint": "e7556a7d43d43b43", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-7857b8c5371355b9", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 packages/web/app/admin/raw-posts/[id]/page.tsx:450"}, "properties": {"repobilityId": "c9d02eb5e157f2b5", "scanner": "scanner-primary", "fingerprint": "7857b8c5371355b9", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-ee7ae44eb10a33a5", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 packages/web/app/admin/affiliate-catalog/page.tsx:293"}, "properties": {"repobilityId": "1e242a23e27f8cc7", "scanner": "scanner-primary", "fingerprint": "ee7ae44eb10a33a5", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-fecdf8dde637e6b7", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 packages/web/app/admin/content-studio/PostPickerModal.tsx:185"}, "properties": {"repobilityId": "52c17c96bb476748", "scanner": "scanner-primary", "fingerprint": "fecdf8dde637e6b7", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-0817cd82fd169341", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 packages/web/app/admin/entities/group-members/page.tsx:592"}, "properties": {"repobilityId": "e6ae54ae6f7503ec", "scanner": "scanner-primary", "fingerprint": "0817cd82fd169341", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-19ff63a9147e0eef", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 packages/web/app/admin/data-pipeline/instagram-accounts/page.tsx:65"}, "properties": {"repobilityId": "5cc6b7482e59c241", "scanner": "scanner-primary", "fingerprint": "19ff63a9147e0eef", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-1c98bcb354ba7a68", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 packages/web/app/admin/onboarding-pool/page.tsx:48"}, "properties": {"repobilityId": "1bff3d7a69c4ffa5", "scanner": "scanner-primary", "fingerprint": "1c98bcb354ba7a68", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-bb6a50564841e148", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 packages/web/app/admin/editorial/magazine/drafts/[id]/page.tsx:272"}, "properties": {"repobilityId": "41f1181999efecce", "scanner": "scanner-primary", "fingerprint": "bb6a50564841e148", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-c248f82ef28e8ba2", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 packages/web/app/admin/picks/page.tsx:295"}, "properties": {"repobilityId": "80ebd49304dd3701", "scanner": "scanner-primary", "fingerprint": "c248f82ef28e8ba2", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-a7d141c9646eaaa5", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 packages/web/app/examples/scroll-animation/page.tsx:8"}, "properties": {"repobilityId": "c006b2ec1e23b16a", "scanner": "scanner-primary", "fingerprint": "a7d141c9646eaaa5", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-828f7d0092ea0969", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 packages/web/app/profile/[userId]/page.tsx:80"}, "properties": {"repobilityId": "cbb70258ebe516ab", "scanner": "scanner-primary", "fingerprint": "828f7d0092ea0969", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-3c4b8d52fce818ed", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 packages/web/app/rankings/RankingsClient.tsx:174"}, "properties": {"repobilityId": "1afdb045ead46166", "scanner": "scanner-primary", "fingerprint": "3c4b8d52fce818ed", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-7b36fa3d5617d26f", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 packages/web/app/lab/neon-glow/page.tsx:155"}, "properties": {"repobilityId": "35d213af08e68c1e", "scanner": "scanner-primary", "fingerprint": "7b36fa3d5617d26f", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-5be33898962c08ce", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 packages/web/app/request/try/page.tsx:133"}, "properties": {"repobilityId": "7dd9e14d3f9dcc18", "scanner": "scanner-primary", "fingerprint": "5be33898962c08ce", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-e11ca5e430b2c3f6", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 packages/web/lib/design-system/profile-header-card.tsx:117"}, "properties": {"repobilityId": "e0975422afe82fcd", "scanner": "scanner-primary", "fingerprint": "e11ca5e430b2c3f6", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-5a141e6daea74a8c", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 packages/web/lib/design-system/desktop-header.tsx:250"}, "properties": {"repobilityId": "2868c79fc6b05f80", "scanner": "scanner-primary", "fingerprint": "5a141e6daea74a8c", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-2ac9d6b87adab44d", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 packages/web/lib/api/posts.ts:108"}, "properties": {"repobilityId": "aca05f812589f2b1", "scanner": "scanner-primary", "fingerprint": "2ac9d6b87adab44d", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-7ebdac0a60f9fe89", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 packages/web/lib/stores/behaviorStore.ts:79"}, "properties": {"repobilityId": "5f6e684bee0e2a02", "scanner": "scanner-primary", "fingerprint": "7ebdac0a60f9fe89", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-30be45ee6d7be8c6", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 packages/web/lib/hooks/useScrollAnimation.ts:120"}, "properties": {"repobilityId": "bd8a0d4098efb67a", "scanner": "scanner-primary", "fingerprint": "30be45ee6d7be8c6", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-27d9343958f87aed", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 packages/web/lib/hooks/useImageUpload.ts:73"}, "properties": {"repobilityId": "8248d8525a09e3b7", "scanner": "scanner-primary", "fingerprint": "27d9343958f87aed", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-3359d44cd30bfef6", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 packages/web/lib/seo/json-ld.tsx:11"}, "properties": {"repobilityId": "3d0158690ed12b00", "scanner": "scanner-primary", "fingerprint": "3359d44cd30bfef6", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-f1af09fdf9d13c6e", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 packages/web/lib/theme/theme-script.tsx:11"}, "properties": {"repobilityId": "b958373aca1da279", "scanner": "scanner-primary", "fingerprint": "f1af09fdf9d13c6e", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-74c94a6af5cb4115", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 packages/web/lib/components/FeedCard.tsx:208"}, "properties": {"repobilityId": "94d466a6a56d1dd6", "scanner": "scanner-primary", "fingerprint": "74c94a6af5cb4115", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-24d693e65437ea87", "level": "none", "message": {"text": "TODO/FIXME marker in shipping code \u2014 packages/web/lib/components/FeedCard.tsx:164"}, "properties": {"repobilityId": "535d192864091c4e", "scanner": "scanner-primary", "fingerprint": "24d693e65437ea87", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.todo-marker"]}}, {"ruleId": "scanner-0823aff419a40ff6", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 packages/web/lib/components/FeedCard.tsx:171"}, "properties": {"repobilityId": "82225c797b69bb1b", "scanner": "scanner-primary", "fingerprint": "0823aff419a40ff6", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-e5c6d35416df7a1b", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 packages/web/lib/components/SidebarSearchPanel.tsx:206"}, "properties": {"repobilityId": "8f26314567119363", "scanner": "scanner-primary", "fingerprint": "e5c6d35416df7a1b", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-7b619f601841ec4f", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 packages/web/lib/components/Sidebar.tsx:83"}, "properties": {"repobilityId": "10d0afb9e47248dc", "scanner": "scanner-primary", "fingerprint": "7b619f601841ec4f", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-046f8e84780b6578", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 packages/web/lib/components/main/TrendingPostsSection.tsx:63"}, "properties": {"repobilityId": "6e7742aa01f32b7f", "scanner": "scanner-primary", "fingerprint": "046f8e84780b6578", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-e1e2740602736995", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 packages/web/lib/components/main/LatestPostsScroll.tsx:68"}, "properties": {"repobilityId": "3f298854575c2cb2", "scanner": "scanner-primary", "fingerprint": "e1e2740602736995", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-a2600cbac86a648f", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 packages/web/lib/components/main/HelpFindSection.tsx:63"}, "properties": {"repobilityId": "e228f136bb6795e8", "scanner": "scanner-primary", "fingerprint": "a2600cbac86a648f", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-b343836edd59754d", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 packages/web/lib/components/main/DecodedSolutionsSection.tsx:64"}, "properties": {"repobilityId": "f39e887b83556d2c", "scanner": "scanner-primary", "fingerprint": "b343836edd59754d", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-fa48346d65e7169e", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 packages/web/lib/components/main/EditorialSection.tsx:96"}, "properties": {"repobilityId": "49a2a02ee0a1f56e", "scanner": "scanner-primary", "fingerprint": "fa48346d65e7169e", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-2545fd3fc673a38c", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 packages/web/lib/components/explore/ArtistProfileCard.tsx:44"}, "properties": {"repobilityId": "47c602a61a3a4553", "scanner": "scanner-primary", "fingerprint": "2545fd3fc673a38c", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-83d61e4454a27230", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 packages/web/lib/components/explore/ExploreCardCell.tsx:131"}, "properties": {"repobilityId": "700f24df39005dbe", "scanner": "scanner-primary", "fingerprint": "83d61e4454a27230", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-b8e6233bcb6e4454", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 packages/web/lib/components/main-c/CuratedStory.tsx:35"}, "properties": {"repobilityId": "01e5f4711a7fa938", "scanner": "scanner-primary", "fingerprint": "b8e6233bcb6e4454", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-84811e4e3d9902e9", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 packages/web/lib/components/main-c/MoodboardGrid.tsx:128"}, "properties": {"repobilityId": "d775892d61128821", "scanner": "scanner-primary", "fingerprint": "84811e4e3d9902e9", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-4bdb4f46bf2eff47", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 packages/web/lib/components/main-b/ScatteredCanvas.tsx:111"}, "properties": {"repobilityId": "30c3c16fb44388bb", "scanner": "scanner-primary", "fingerprint": "4bdb4f46bf2eff47", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-4119709d588defa6", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 packages/web/lib/components/main-b/QuickPeekCard.tsx:50"}, "properties": {"repobilityId": "02f9ddbf27301797", "scanner": "scanner-primary", "fingerprint": "4119709d588defa6", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-148fa4a9c26c7709", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 packages/web/lib/components/main-b/NeonDoodles.tsx:611"}, "properties": {"repobilityId": "62d818c10ea247be", "scanner": "scanner-primary", "fingerprint": "148fa4a9c26c7709", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-09b95cdd139b43f9", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 packages/web/lib/components/fashion-scan/FashionScanScene.tsx:80"}, "properties": {"repobilityId": "7e16f791a4ad360d", "scanner": "scanner-primary", "fingerprint": "09b95cdd139b43f9", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-9572ab91bba1f946", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 packages/web/lib/components/admin/magazines/MagazineApprovalTable.tsx:59"}, "properties": {"repobilityId": "3a9ce4e75ede72c8", "scanner": "scanner-primary", "fingerprint": "9572ab91bba1f946", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-3d4e500149716822", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 packages/web/lib/components/admin/raw-posts/ItemsList.tsx:291"}, "properties": {"repobilityId": "ebd8812a930f73f1", "scanner": "scanner-primary", "fingerprint": "3d4e500149716822", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-25e712b5bc24c50a", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 packages/web/lib/components/admin/raw-posts/SpotsOverlay.tsx:150"}, "properties": {"repobilityId": "9251597be265c70f", "scanner": "scanner-primary", "fingerprint": "25e712b5bc24c50a", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-a34d30db7d974247", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 packages/web/lib/components/admin/raw-posts/CatalogMatchesGrid.tsx:95"}, "properties": {"repobilityId": "3f9bfdc2868e86c7", "scanner": "scanner-primary", "fingerprint": "a34d30db7d974247", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-9b344f219732a652", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 packages/web/lib/components/admin/raw-posts/CodyAnalysisCard.tsx:343"}, "properties": {"repobilityId": "b5cc420ca485cd88", "scanner": "scanner-primary", "fingerprint": "9b344f219732a652", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-005d40d1ce769faf", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 packages/web/lib/components/admin/editorial/CandidateTable.tsx:78"}, "properties": {"repobilityId": "2ba531f15bef6ea8", "scanner": "scanner-primary", "fingerprint": "005d40d1ce769faf", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-81f8e05e25f57d0a", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 packages/web/lib/components/admin/editorial/PipelinesPanel.tsx:170"}, "properties": {"repobilityId": "59ad534db8c2e3ab", "scanner": "scanner-primary", "fingerprint": "81f8e05e25f57d0a", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-68916883d75b131c", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 packages/web/lib/components/admin/editorial/magazine/ArticleTable.tsx:73"}, "properties": {"repobilityId": "81c8cca95bf2e467", "scanner": "scanner-primary", "fingerprint": "68916883d75b131c", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-216ed5c3f0573d04", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 packages/web/lib/components/admin/editorial/magazine/RecommendationTable.tsx:94"}, "properties": {"repobilityId": "31195f6f9fdf953e", "scanner": "scanner-primary", "fingerprint": "216ed5c3f0573d04", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-5302f3ae8d571b1b", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 packages/web/lib/components/admin/editorial/magazine/MagazineRenderer.tsx:274"}, "properties": {"repobilityId": "52523995e96ccee3", "scanner": "scanner-primary", "fingerprint": "5302f3ae8d571b1b", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-23fa836b98369425", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 packages/web/lib/components/admin/content/ReportTable.tsx:169"}, "properties": {"repobilityId": "feeee554867762b9", "scanner": "scanner-primary", "fingerprint": "23fa836b98369425", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-9627f924d75f7661", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 packages/web/lib/components/admin/content/AdminPostTable.tsx:195"}, "properties": {"repobilityId": "7ae1d07ac997a8e3", "scanner": "scanner-primary", "fingerprint": "9627f924d75f7661", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-03438e5a1ed21510", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 packages/web/lib/components/profile/ActivityItemCard.tsx:68"}, "properties": {"repobilityId": "a5686ec93ecbf3b5", "scanner": "scanner-primary", "fingerprint": "03438e5a1ed21510", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-12308de31ebd71d9", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 packages/web/lib/components/profile/TryDetailModal.tsx:164"}, "properties": {"repobilityId": "336df0bb91743cc4", "scanner": "scanner-primary", "fingerprint": "12308de31ebd71d9", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-e40b366618317561", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 packages/web/lib/components/profile/EmptyState.tsx:98"}, "properties": {"repobilityId": "a7c9703bd9f9a08b", "scanner": "scanner-primary", "fingerprint": "e40b366618317561", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-1998b1b865fb5762", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 packages/web/lib/components/profile/SpotsList.tsx:71"}, "properties": {"repobilityId": "ad755cb0fcb90ff9", "scanner": "scanner-primary", "fingerprint": "1998b1b865fb5762", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-1fb9bc0bac4bb744", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 packages/web/lib/components/profile/PostsGrid.tsx:55"}, "properties": {"repobilityId": "044e7a457f0072c2", "scanner": "scanner-primary", "fingerprint": "1fb9bc0bac4bb744", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-cfff7aaaf91fbafc", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 packages/web/lib/components/profile/SolutionsList.tsx:90"}, "properties": {"repobilityId": "47c3909013631175", "scanner": "scanner-primary", "fingerprint": "cfff7aaaf91fbafc", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-2019a98e8ec34521", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 packages/web/lib/components/profile/ClosetGrid.tsx:112"}, "properties": {"repobilityId": "ecd5e4d08e18a7c8", "scanner": "scanner-primary", "fingerprint": "2019a98e8ec34521", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-2b46538594a0a48d", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 packages/web/lib/components/profile/InkEconomyCard.tsx:13"}, "properties": {"repobilityId": "06a438539ce7e827", "scanner": "scanner-primary", "fingerprint": "2b46538594a0a48d", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-62e7728b3b6ce429", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 packages/web/lib/components/profile/StatsCards.tsx:65"}, "properties": {"repobilityId": "8c2e4ed2e1fcc3b4", "scanner": "scanner-primary", "fingerprint": "62e7728b3b6ce429", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-34a5153c9bb00e5c", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 packages/web/lib/components/profile/LikesGrid.tsx:49"}, "properties": {"repobilityId": "5cc57b2557e31415", "scanner": "scanner-primary", "fingerprint": "34a5153c9bb00e5c", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-a30b1425d989cbbe", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 packages/web/lib/components/profile/SavedGrid.tsx:54"}, "properties": {"repobilityId": "e88e86d6bd2469dd", "scanner": "scanner-primary", "fingerprint": "a30b1425d989cbbe", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-b8ee561c32fab7c0", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 packages/web/lib/components/vton/VtonItemPanel.tsx:284"}, "properties": {"repobilityId": "74300bf602524a13", "scanner": "scanner-primary", "fingerprint": "b8ee561c32fab7c0", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-0bf12d79ea5602e2", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 packages/web/lib/components/collection/MagazinePreviewModal.tsx:241"}, "properties": {"repobilityId": "cef8cf70fbac350c", "scanner": "scanner-primary", "fingerprint": "0bf12d79ea5602e2", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-577639d66cdafc0e", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 packages/web/lib/components/collection/IssueSpine.tsx:241"}, "properties": {"repobilityId": "7aaf55b75a422aa3", "scanner": "scanner-primary", "fingerprint": "577639d66cdafc0e", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-867df6093e6d9203", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 packages/web/lib/components/collection/IssueDetailPanel.tsx:60"}, "properties": {"repobilityId": "a84b079d01444ca8", "scanner": "scanner-primary", "fingerprint": "867df6093e6d9203", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-441d5903dde8421b", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 packages/web/lib/components/collection/studio/SplineStudio.tsx:89"}, "properties": {"repobilityId": "42dd464c716e6243", "scanner": "scanner-primary", "fingerprint": "441d5903dde8421b", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-04cce2df56fc55bc", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 packages/web/lib/components/auth/AuthProvider.tsx:21"}, "properties": {"repobilityId": "084a54c9cd3dd681", "scanner": "scanner-primary", "fingerprint": "04cce2df56fc55bc", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-d4ddeb39e22699e2", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 packages/web/lib/components/detail/TryCard.tsx:67"}, "properties": {"repobilityId": "f0b9aadd1d803f88", "scanner": "scanner-primary", "fingerprint": "d4ddeb39e22699e2", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-9f01479bfd5e2e8e", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 packages/web/lib/components/detail/OtherSolutionsList.tsx:126"}, "properties": {"repobilityId": "6d358d14e33657e9", "scanner": "scanner-primary", "fingerprint": "9f01479bfd5e2e8e", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-e1c09b163d408962", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 packages/web/lib/components/detail/TopSolutionCard.tsx:100"}, "properties": {"repobilityId": "59217a1a02f389d4", "scanner": "scanner-primary", "fingerprint": "e1c09b163d408962", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-218b90f6bf32ad37", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 packages/web/lib/components/detail/RelatedImages.tsx:166"}, "properties": {"repobilityId": "70b3b964795cbe8b", "scanner": "scanner-primary", "fingerprint": "218b90f6bf32ad37", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-a50b6051ea1bcba9", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 packages/web/lib/components/detail/ImageDetailPreview.tsx:204"}, "properties": {"repobilityId": "61a3239364cfcd57", "scanner": "scanner-primary", "fingerprint": "a50b6051ea1bcba9", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-bdb0266f9ee0dc0a", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 packages/web/lib/components/detail/ImageDetailModal.tsx:161"}, "properties": {"repobilityId": "db47d989dd30d1af", "scanner": "scanner-primary", "fingerprint": "bdb0266f9ee0dc0a", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-db48b54fe2857bc4", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 packages/web/lib/components/detail/magazine/MagazineItemsSection.tsx:518"}, "properties": {"repobilityId": "2f829aa5d077dc24", "scanner": "scanner-primary", "fingerprint": "db48b54fe2857bc4", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-bedc485e8e07c6be", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 packages/web/lib/components/dome/DomeGallery.tsx:515"}, "properties": {"repobilityId": "d1402f9e4e651032", "scanner": "scanner-primary", "fingerprint": "bedc485e8e07c6be", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-eba849ee54263f71", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 packages/web/lib/components/search/RecentSearches.tsx:63"}, "properties": {"repobilityId": "9bbb0fb5c1ce9ba2", "scanner": "scanner-primary", "fingerprint": "eba849ee54263f71", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-e3d3356983f5f4e3", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 packages/web/lib/components/search/SearchSuggestions.tsx:147"}, "properties": {"repobilityId": "6f4d64a1539fc13e", "scanner": "scanner-primary", "fingerprint": "e3d3356983f5f4e3", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-f9b8226db9cdbc43", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 packages/web/lib/components/search/MediaResultCard.tsx:76"}, "properties": {"repobilityId": "17c4756cef792817", "scanner": "scanner-primary", "fingerprint": "f9b8226db9cdbc43", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-18a814f7c28bd9d3", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 packages/web/lib/components/search/MediaResultCard.tsx:44"}, "properties": {"repobilityId": "b0929355d4e024da", "scanner": "scanner-primary", "fingerprint": "18a814f7c28bd9d3", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-09559a548ec5ce5a", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 packages/web/lib/components/search/SearchResults.tsx:254"}, "properties": {"repobilityId": "a74038cfed7c9876", "scanner": "scanner-primary", "fingerprint": "09559a548ec5ce5a", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-8cd78a2ab9883163", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 packages/web/lib/components/search/PersonResultCard.tsx:63"}, "properties": {"repobilityId": "5e37e831990e37da", "scanner": "scanner-primary", "fingerprint": "8cd78a2ab9883163", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-2e2a0a862ee2067d", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 packages/web/lib/components/search/PersonResultCard.tsx:34"}, "properties": {"repobilityId": "f125ea3160060f60", "scanner": "scanner-primary", "fingerprint": "2e2a0a862ee2067d", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-dfac72f0e0e7f306", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 packages/web/lib/components/search/ItemResultSection.tsx:103"}, "properties": {"repobilityId": "5e6ef98c49e0e921", "scanner": "scanner-primary", "fingerprint": "dfac72f0e0e7f306", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-7b0b7765f44bbdd4", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 packages/web/lib/components/onboarding/TasteOnboardingPrompt.tsx:44"}, "properties": {"repobilityId": "cab84d7fb57fe0df", "scanner": "scanner-primary", "fingerprint": "7b0b7765f44bbdd4", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-2172229b4c708300", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 packages/web/lib/components/cody/RecommendedCard.tsx:60"}, "properties": {"repobilityId": "9469936ed21df4cd", "scanner": "scanner-primary", "fingerprint": "2172229b4c708300", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-b0580e8b1010a8be", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 packages/web/lib/components/cody/LookDetail.tsx:157"}, "properties": {"repobilityId": "30e66adfc8f71fe1", "scanner": "scanner-primary", "fingerprint": "b0580e8b1010a8be", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-27842048b7e34eba", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 packages/web/lib/components/cody/SavedLooks.tsx:194"}, "properties": {"repobilityId": "ddd9ac2a7aca1ed3", "scanner": "scanner-primary", "fingerprint": "27842048b7e34eba", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-1c29af006f5555db", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 packages/web/lib/components/shared/ShareModal.tsx:136"}, "properties": {"repobilityId": "64258a6b3c14ea08", "scanner": "scanner-primary", "fingerprint": "1c29af006f5555db", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-e810d28087520533", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 packages/web/lib/components/shared/CommentSection.tsx:63"}, "properties": {"repobilityId": "59aa06f131ee3255", "scanner": "scanner-primary", "fingerprint": "e810d28087520533", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-f79763c3c6e14d30", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 packages/web/lib/components/main-renewal/EditorPicks.tsx:64"}, "properties": {"repobilityId": "8f14ba23785edddc", "scanner": "scanner-primary", "fingerprint": "f79763c3c6e14d30", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-826266c0b80b41e4", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 packages/web/lib/components/main-renewal/SmartNav.tsx:224"}, "properties": {"repobilityId": "8302d33de8bf9dac", "scanner": "scanner-primary", "fingerprint": "826266c0b80b41e4", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-afd48e3e0d463827", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 packages/web/lib/components/main-renewal/DecodeShowcase.tsx:498"}, "properties": {"repobilityId": "473d3d2fbd5b588c", "scanner": "scanner-primary", "fingerprint": "afd48e3e0d463827", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-f3a5621a8f698118", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 packages/web/lib/components/main-renewal/HeroSpotMarker.tsx:143"}, "properties": {"repobilityId": "2f3f7f4e97524105", "scanner": "scanner-primary", "fingerprint": "f3a5621a8f698118", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-a9d74d703b1f0ab8", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 packages/web/lib/components/request/SubmitPreview.tsx:72"}, "properties": {"repobilityId": "b47f723bda5721c1", "scanner": "scanner-primary", "fingerprint": "a9d74d703b1f0ab8", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-f6c246675e08fa2b", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 packages/web/lib/components/request/DetectedItemCard.tsx:127"}, "properties": {"repobilityId": "87002434c18c0043", "scanner": "scanner-primary", "fingerprint": "f6c246675e08fa2b", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-731bd30b9cd1dfe3", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 packages/web/lib/components/request/SingleImagePreview.tsx:90"}, "properties": {"repobilityId": "9c9286c59765b757", "scanner": "scanner-primary", "fingerprint": "731bd30b9cd1dfe3", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-c2fed98afc083af1", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 packages/web/lib/components/request/ImagePreview.tsx:86"}, "properties": {"repobilityId": "ed288d14f6c50e20", "scanner": "scanner-primary", "fingerprint": "c2fed98afc083af1", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-01d281c6810499f3", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 packages/web/lib/components/request/UploadFlowSteps.tsx:423"}, "properties": {"repobilityId": "22b42c7c7d1cb3ad", "scanner": "scanner-primary", "fingerprint": "01d281c6810499f3", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-84d1168b2b9d73eb", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 packages/web/lib/components/main-d/StickerPeel.tsx:184"}, "properties": {"repobilityId": "c3831076f92f93c1", "scanner": "scanner-primary", "fingerprint": "84d1168b2b9d73eb", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-4482f4c41a8bb915", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 packages/mobile/app/+html.tsx:22"}, "properties": {"repobilityId": "5b0fee31b08d23fd", "scanner": "scanner-primary", "fingerprint": "4482f4c41a8bb915", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-747216c4c98cb5b8", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/vton-poc-speed.ts:60"}, "properties": {"repobilityId": "52937e4e92dc7fe0", "scanner": "scanner-primary", "fingerprint": "747216c4c98cb5b8", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-94bc892f84cc9c59", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/vton-poc.ts:137"}, "properties": {"repobilityId": "0392a07ec111dade", "scanner": "scanner-primary", "fingerprint": "94bc892f84cc9c59", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-139747d1a10c50ed", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 .claude/skills/gstack/scripts/analytics.ts:168"}, "properties": {"repobilityId": "972ebcf1f18f828c", "scanner": "scanner-primary", "fingerprint": "139747d1a10c50ed", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-d2176b23d9b3b189", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 .claude/skills/gstack/scripts/eval-select.ts:33"}, "properties": {"repobilityId": "7e291ccd8ddf4c7b", "scanner": "scanner-primary", "fingerprint": "d2176b23d9b3b189", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-abc7689a272359c3", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 .claude/skills/gstack/scripts/eval-summary.ts:20"}, "properties": {"repobilityId": "5aa608df05fb5768", "scanner": "scanner-primary", "fingerprint": "abc7689a272359c3", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-8318f4714f1261f7", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 .claude/skills/gstack/scripts/host-config-export.ts:38"}, "properties": {"repobilityId": "6521f6ddad728844", "scanner": "scanner-primary", "fingerprint": "8318f4714f1261f7", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-e9c46e4c3cfc17a3", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 .claude/skills/gstack/scripts/eval-list.ts:32"}, "properties": {"repobilityId": "e230a88801e3828f", "scanner": "scanner-primary", "fingerprint": "e9c46e4c3cfc17a3", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-d1fdcff32b1decb5", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 .claude/skills/gstack/scripts/eval-compare.ts:50"}, "properties": {"repobilityId": "959aedebfea83e74", "scanner": "scanner-primary", "fingerprint": "d1fdcff32b1decb5", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-0aef8732c9bb3704", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 .claude/skills/gstack/scripts/skill-check.ts:26"}, "properties": {"repobilityId": "973e9f49fcae5604", "scanner": "scanner-primary", "fingerprint": "0aef8732c9bb3704", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-ed99c9442c109928", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 .claude/skills/gstack/scripts/dev-skill.ts:27"}, "properties": {"repobilityId": "58521e9ceb4eea70", "scanner": "scanner-primary", "fingerprint": "ed99c9442c109928", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-4a620ea5c815de14", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 .claude/skills/gstack/scripts/slop-diff.ts:29"}, "properties": {"repobilityId": "67021f46ad2b6660", "scanner": "scanner-primary", "fingerprint": "4a620ea5c815de14", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-0abdcc1d71551a10", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 .claude/skills/gstack/scripts/gen-skill-docs.ts:527"}, "properties": {"repobilityId": "573bee6c7010037d", "scanner": "scanner-primary", "fingerprint": "0abdcc1d71551a10", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-5e7cd0a42043a103", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 .claude/skills/gstack/browse/src/server.ts:338"}, "properties": {"repobilityId": "88b176dc0a5aaf61", "scanner": "scanner-primary", "fingerprint": "5e7cd0a42043a103", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-70e4084bd8295b23", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 .claude/skills/gstack/browse/src/cli.ts:642"}, "properties": {"repobilityId": "ab45599ef6ff3171", "scanner": "scanner-primary", "fingerprint": "70e4084bd8295b23", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-c7d666044c2e5ad3", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 .claude/skills/gstack/browse/src/find-browse.ts:58"}, "properties": {"repobilityId": "bd0933e0241e9641", "scanner": "scanner-primary", "fingerprint": "c7d666044c2e5ad3", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-651c6dccdd014826", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 .claude/skills/gstack/browse/src/cookie-picker-routes.ts:243"}, "properties": {"repobilityId": "c1578a54eab7d8f9", "scanner": "scanner-primary", "fingerprint": "651c6dccdd014826", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-5d1a2d8c251e5e73", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 .claude/skills/gstack/browse/src/sidebar-agent.ts:109"}, "properties": {"repobilityId": "3b4a22edb001ca90", "scanner": "scanner-primary", "fingerprint": "5d1a2d8c251e5e73", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-f8a8b66c9702c9f6", "level": "note", "message": {"text": "Icon-only button without accessible name \u2014 .claude/skills/gstack/browse/src/cookie-picker-ui.ts:369"}, "properties": {"repobilityId": "b2e77e9176c05def", "scanner": "scanner-primary", "fingerprint": "f8a8b66c9702c9f6", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.button.no-label"]}}, {"ruleId": "scanner-4d13a7d1277cd6b5", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 .claude/skills/gstack/browse/src/meta-commands.ts:111"}, "properties": {"repobilityId": "c5a3c73e58f2bfe6", "scanner": "scanner-primary", "fingerprint": "4d13a7d1277cd6b5", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-ffc887e26fc2f8c3", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 .claude/skills/gstack/browse/src/browser-manager.ts:171"}, "properties": {"repobilityId": "2787d37b9e65e17f", "scanner": "scanner-primary", "fingerprint": "ffc887e26fc2f8c3", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-7f188dc660ef70e6", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 .claude/skills/gstack/browse/test/bun-polyfill.test.ts:18"}, "properties": {"repobilityId": "7f0472aa222d73b3", "scanner": "scanner-primary", "fingerprint": "7f188dc660ef70e6", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-956a72f3346d0337", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 .claude/skills/gstack/browse/test/findport.test.ts:117"}, "properties": {"repobilityId": "f86c931b1ea77b0c", "scanner": "scanner-primary", "fingerprint": "956a72f3346d0337", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-1b8e9f7869548c2f", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 .claude/skills/gstack/browse/test/test-server.ts:54"}, "properties": {"repobilityId": "6a4b5d2fdf02ac5a", "scanner": "scanner-primary", "fingerprint": "1b8e9f7869548c2f", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-54856e894d1c65dc", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 .claude/skills/gstack/extension/background.js:488"}, "properties": {"repobilityId": "f488a04ded8b3a24", "scanner": "scanner-primary", "fingerprint": "54856e894d1c65dc", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-823b884f5d3eb05d", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 .claude/skills/gstack/design/prototype.ts:39"}, "properties": {"repobilityId": "64507bdfb224551a", "scanner": "scanner-primary", "fingerprint": "823b884f5d3eb05d", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-9059ac9804dc9d5e", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 .claude/skills/gstack/design/src/serve.ts:138"}, "properties": {"repobilityId": "d51971d19374c3c0", "scanner": "scanner-primary", "fingerprint": "9059ac9804dc9d5e", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-094e4fc83a90595f", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 .claude/skills/gstack/design/src/cli.ts:57"}, "properties": {"repobilityId": "40ccafca75b1c24d", "scanner": "scanner-primary", "fingerprint": "094e4fc83a90595f", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-77d030ba108a3728", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 .claude/skills/gstack/design/src/compare.ts:627"}, "properties": {"repobilityId": "16a5208f996d99d7", "scanner": "scanner-primary", "fingerprint": "77d030ba108a3728", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-7dd50d4f39c31908", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 .claude/skills/gstack/design/src/gallery.ts:250"}, "properties": {"repobilityId": "73efe4bbbc8edff6", "scanner": "scanner-primary", "fingerprint": "7dd50d4f39c31908", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-f3840524203da0e8", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 .claude/skills/gstack/design/src/evolve.ts:98"}, "properties": {"repobilityId": "6992df39265889de", "scanner": "scanner-primary", "fingerprint": "f3840524203da0e8", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-6392a601090450b3", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 .claude/skills/gstack/design/src/generate.ts:158"}, "properties": {"repobilityId": "fff075458b713cc8", "scanner": "scanner-primary", "fingerprint": "6392a601090450b3", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-c6906f53c9e41566", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 .claude/skills/gstack/design/src/iterate.ts:70"}, "properties": {"repobilityId": "559e24bb738fef1b", "scanner": "scanner-primary", "fingerprint": "c6906f53c9e41566", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-3b9dc27cd7c1dd1e", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 .claude/skills/gstack/design/src/check.ts:95"}, "properties": {"repobilityId": "cc793388b039976d", "scanner": "scanner-primary", "fingerprint": "3b9dc27cd7c1dd1e", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-6a55a45319cd6e51", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 .claude/skills/gstack/design/src/variants.ts:176"}, "properties": {"repobilityId": "2e94df58ef2e1947", "scanner": "scanner-primary", "fingerprint": "6a55a45319cd6e51", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-cbe57f888872e88a", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 .claude/skills/gstack/test/codex-e2e.test.ts:109"}, "properties": {"repobilityId": "06d1d97ed4ef0016", "scanner": "scanner-primary", "fingerprint": "cbe57f888872e88a", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-bb69749e8e3c5b33", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 .claude/skills/gstack/test/skill-e2e-plan.test.ts:401"}, "properties": {"repobilityId": "c93ce6444c195282", "scanner": "scanner-primary", "fingerprint": "bb69749e8e3c5b33", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-7c41aa780e508729", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 .claude/skills/gstack/test/skill-e2e.test.ts:143"}, "properties": {"repobilityId": "4844d0cda96e4198", "scanner": "scanner-primary", "fingerprint": "7c41aa780e508729", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-37bc7a5580c1753d", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 .claude/skills/gstack/test/skill-e2e-qa-bugs.test.ts:151"}, "properties": {"repobilityId": "fe433ddde47d5767", "scanner": "scanner-primary", "fingerprint": "37bc7a5580c1753d", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-89fd4ce55439b37f", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 .claude/skills/gstack/test/skill-e2e-qa-workflow.test.ts:266"}, "properties": {"repobilityId": "b509716d4ab3cde6", "scanner": "scanner-primary", "fingerprint": "89fd4ce55439b37f", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-16efa1d2627322de", "level": "none", "message": {"text": "TODO/FIXME marker in shipping code \u2014 .claude/skills/gstack/test/skill-routing-e2e.test.ts:382"}, "properties": {"repobilityId": "9cdcda2e9ea38b7d", "scanner": "scanner-primary", "fingerprint": "16efa1d2627322de", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.todo-marker"]}}, {"ruleId": "scanner-6a32122217cb8a37", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 .claude/skills/gstack/test/skill-routing-e2e.test.ts:159"}, "properties": {"repobilityId": "3abb9e4fa72d6f62", "scanner": "scanner-primary", "fingerprint": "6a32122217cb8a37", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-93f889852a415184", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 .claude/skills/gstack/test/skill-e2e-cso.test.ts:129"}, "properties": {"repobilityId": "c099f5c2d74ff7ec", "scanner": "scanner-primary", "fingerprint": "93f889852a415184", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-f08ade7beec95821", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 .claude/skills/gstack/test/gemini-e2e.test.ts:105"}, "properties": {"repobilityId": "95c34602f69d42ec", "scanner": "scanner-primary", "fingerprint": "f08ade7beec95821", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-20f0418b11c5d494", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 .claude/skills/gstack/test/skill-e2e-learnings.test.ts:32"}, "properties": {"repobilityId": "f836a8212f5b98e6", "scanner": "scanner-primary", "fingerprint": "20f0418b11c5d494", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-4e12a5fbb3b7b278", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 .claude/skills/gstack/test/skill-e2e-bws.test.ts:191"}, "properties": {"repobilityId": "0646790274862052", "scanner": "scanner-primary", "fingerprint": "4e12a5fbb3b7b278", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-9c828c479889e8cc", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 .claude/skills/gstack/test/skill-e2e-workflow.test.ts:113"}, "properties": {"repobilityId": "4df969d6463f7a87", "scanner": "scanner-primary", "fingerprint": "9c828c479889e8cc", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-a98f9870d483077e", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 .claude/skills/gstack/test/skill-e2e-session-intelligence.test.ts:37"}, "properties": {"repobilityId": "b8f77ae2e8f36f62", "scanner": "scanner-primary", "fingerprint": "a98f9870d483077e", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-52464209672a7a21", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 .claude/skills/gstack/test/skill-e2e-sidebar.test.ts:299"}, "properties": {"repobilityId": "493bc37872a01012", "scanner": "scanner-primary", "fingerprint": "52464209672a7a21", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-7e6451b91cf711fa", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 .claude/skills/gstack/test/skill-e2e-review.test.ts:249"}, "properties": {"repobilityId": "eca097f6cfdb2981", "scanner": "scanner-primary", "fingerprint": "7e6451b91cf711fa", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-b5bfdcdae48fbd3c", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 .claude/skills/gstack/test/skill-llm-eval.test.ts:74"}, "properties": {"repobilityId": "09ac8033b8f991b9", "scanner": "scanner-primary", "fingerprint": "b5bfdcdae48fbd3c", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-120bae28a6898f54", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 .claude/skills/gstack/test/skill-e2e-design.test.ts:140"}, "properties": {"repobilityId": "76a1fa1cbd51e1be", "scanner": "scanner-primary", "fingerprint": "120bae28a6898f54", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-55cb1a9ee65e664f", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 .claude/skills/gstack/test/helpers/e2e-helpers.ts:137"}, "properties": {"repobilityId": "357e830c64a73e02", "scanner": "scanner-primary", "fingerprint": "55cb1a9ee65e664f", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-7433914a8ca74fcc", "level": "warning", "message": {"text": "Privileged port 4 in use"}, "properties": {"repobilityId": "1594bfeff919296e", "scanner": "scanner-primary", "fingerprint": "7433914a8ca74fcc", "layer": "network", "severity": "medium", "confidence": 1.0, "tags": ["security", "ports"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/db-drift-check.yml"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-b7b1fb75a2a95009", "level": "warning", "message": {"text": "Privileged port 19 in use"}, "properties": {"repobilityId": "a6b5b06deac36eac", "scanner": "scanner-primary", "fingerprint": "b7b1fb75a2a95009", "layer": "network", "severity": "medium", "confidence": 1.0, "tags": ["security", "ports"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/db-drift-check.yml"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-1a60014486c1bb1d", "level": "note", "message": {"text": "Docker base image is tag-pinned but not digest-pinned: rust:1.91-slim"}, "properties": {"repobilityId": "d0c4f182041200e2", "scanner": "scanner-primary", "fingerprint": "1a60014486c1bb1d", "layer": "hardware", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "docker", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "packages/api-server/docker/staging/Dockerfile"}, "region": {"startLine": 3}}}]}, {"ruleId": "scanner-acc0afe522a9d9cf", "level": "note", "message": {"text": "Docker base image is tag-pinned but not digest-pinned: debian:bookworm-slim"}, "properties": {"repobilityId": "cae2513147f6bbc0", "scanner": "scanner-primary", "fingerprint": "acc0afe522a9d9cf", "layer": "hardware", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "docker", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "packages/api-server/docker/staging/Dockerfile"}, "region": {"startLine": 36}}}]}, {"ruleId": "scanner-108f644e3ffa56b6", "level": "warning", "message": {"text": "Dockerfile runs as root: packages/api-server/docker/dev/Dockerfile"}, "properties": {"repobilityId": "7444e2afc3c0f2e3", "scanner": "scanner-primary", "fingerprint": "108f644e3ffa56b6", "layer": "hardware", "severity": "medium", "confidence": 1.0, "tags": ["security", "container"]}}, {"ruleId": "scanner-beb7571395fa2324", "level": "note", "message": {"text": "Docker base image is tag-pinned but not digest-pinned: rust:1.91-slim"}, "properties": {"repobilityId": "ea813617527e36c1", "scanner": "scanner-primary", "fingerprint": "beb7571395fa2324", "layer": "hardware", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "docker", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "packages/api-server/docker/dev/Dockerfile"}, "region": {"startLine": 2}}}]}, {"ruleId": "scanner-5a5f881ad058be93", "level": "note", "message": {"text": "Docker base image is tag-pinned but not digest-pinned: rust:1.91-slim"}, "properties": {"repobilityId": "3b5e15b97bdbe3a3", "scanner": "scanner-primary", "fingerprint": "5a5f881ad058be93", "layer": "hardware", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "docker", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "packages/api-server/docker/prod/Dockerfile"}, "region": {"startLine": 3}}}]}, {"ruleId": "scanner-5a5f881ad058be93", "level": "note", "message": {"text": "Docker base image is tag-pinned but not digest-pinned: rust:1.91-slim"}, "properties": {"repobilityId": "6901f857bd324412", "scanner": "scanner-primary", "fingerprint": "5a5f881ad058be93", "layer": "hardware", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "docker", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "packages/api-server/docker/prod/Dockerfile"}, "region": {"startLine": 23}}}]}, {"ruleId": "scanner-aa5acaa49eb8315b", "level": "note", "message": {"text": "Containers defined but no K8s/orchestration manifest found"}, "properties": {"repobilityId": "b230ea9b68736081", "scanner": "scanner-primary", "fingerprint": "aa5acaa49eb8315b", "layer": "hardware", "severity": "low", "confidence": 1.0, "tags": ["coverage", "deployment"]}}, {"ruleId": "scanner-11a847cc92425e4d", "level": "warning", "message": {"text": "Insecure pattern 'cors_wildcard' in packages/web/app/api/v1/image-proxy/route.ts:322"}, "properties": {"repobilityId": "fe239e03d6355da3", "scanner": "scanner-primary", "fingerprint": "11a847cc92425e4d", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "cors_wildcard"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "packages/web/app/api/v1/image-proxy/route.ts"}, "region": {"startLine": 322}}}]}, {"ruleId": "scanner-bcc68b524d8954bd", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in packages/web/app/profile/[userId]/page.tsx:80"}, "properties": {"repobilityId": "da8ba83aad22468d", "scanner": "scanner-primary", "fingerprint": "bcc68b524d8954bd", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "packages/web/app/profile/[userId]/page.tsx"}, "region": {"startLine": 80}}}]}, {"ruleId": "scanner-43013d4d2a68f1c5", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in packages/web/lib/seo/json-ld.tsx:11"}, "properties": {"repobilityId": "a685f0d8bc7c8110", "scanner": "scanner-primary", "fingerprint": "43013d4d2a68f1c5", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "packages/web/lib/seo/json-ld.tsx"}, "region": {"startLine": 11}}}]}, {"ruleId": "scanner-879d0464d06dc435", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in packages/web/lib/theme/theme-script.tsx:11"}, "properties": {"repobilityId": "6587e3c3762894d8", "scanner": "scanner-primary", "fingerprint": "879d0464d06dc435", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "packages/web/lib/theme/theme-script.tsx"}, "region": {"startLine": 11}}}]}, {"ruleId": "scanner-be0151b3a779e9ba", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in packages/web/lib/components/DecodedLogo.tsx:251"}, "properties": {"repobilityId": "9c6d86b8248f01e0", "scanner": "scanner-primary", "fingerprint": "be0151b3a779e9ba", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "packages/web/lib/components/DecodedLogo.tsx"}, "region": {"startLine": 251}}}]}, {"ruleId": "scanner-01078546f38b7bf1", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in packages/web/lib/components/ASCIIText.tsx:218"}, "properties": {"repobilityId": "26bb2ac9c1b85421", "scanner": "scanner-primary", "fingerprint": "01078546f38b7bf1", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "packages/web/lib/components/ASCIIText.tsx"}, "region": {"startLine": 218}}}]}, {"ruleId": "scanner-dbf827d5e55ab059", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in packages/web/lib/components/main-b/NeonDoodles.tsx:611"}, "properties": {"repobilityId": "eadebea0bca7ce8a", "scanner": "scanner-primary", "fingerprint": "dbf827d5e55ab059", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "packages/web/lib/components/main-b/NeonDoodles.tsx"}, "region": {"startLine": 611}}}]}, {"ruleId": "scanner-d80b872e16a3d7b5", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in packages/web/lib/components/dome/DomeGallery.tsx:515"}, "properties": {"repobilityId": "047b5a0d18544a5b", "scanner": "scanner-primary", "fingerprint": "d80b872e16a3d7b5", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "packages/web/lib/components/dome/DomeGallery.tsx"}, "region": {"startLine": 515}}}]}, {"ruleId": "scanner-5071d86465edb0db", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in packages/web/lib/components/search/MediaResultCard.tsx:44"}, "properties": {"repobilityId": "bd982117dac05317", "scanner": "scanner-primary", "fingerprint": "5071d86465edb0db", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "packages/web/lib/components/search/MediaResultCard.tsx"}, "region": {"startLine": 44}}}]}, {"ruleId": "scanner-c4d6c89ca3e0f1d9", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in packages/web/lib/components/search/PersonResultCard.tsx:34"}, "properties": {"repobilityId": "a2e74ff069d4e100", "scanner": "scanner-primary", "fingerprint": "c4d6c89ca3e0f1d9", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "packages/web/lib/components/search/PersonResultCard.tsx"}, "region": {"startLine": 34}}}]}, {"ruleId": "scanner-42cdd31b819869ef", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in packages/web/lib/components/main-d/StickerPeel.tsx:184"}, "properties": {"repobilityId": "40a52fb270c2ae9c", "scanner": "scanner-primary", "fingerprint": "42cdd31b819869ef", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "packages/web/lib/components/main-d/StickerPeel.tsx"}, "region": {"startLine": 184}}}]}, {"ruleId": "scanner-95b706c65f564ce9", "level": "warning", "message": {"text": "Insecure pattern 'node_child_process' in packages/web/lib/content-studio/assets/video-composition.ts:1"}, "properties": {"repobilityId": "cc6bd1dcc68aa34d", "scanner": "scanner-primary", "fingerprint": "95b706c65f564ce9", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "node_child_process"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "packages/web/lib/content-studio/assets/video-composition.ts"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-7ef787727d402c43", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in packages/mobile/app/+html.tsx:22"}, "properties": {"repobilityId": "9fbd98615d286c33", "scanner": "scanner-primary", "fingerprint": "7ef787727d402c43", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "packages/mobile/app/+html.tsx"}, "region": {"startLine": 22}}}]}, {"ruleId": "scanner-c1d130fb72372a28", "level": "warning", "message": {"text": "Insecure pattern 'node_child_process' in scripts/check-schema-drift.ts:21"}, "properties": {"repobilityId": "8ae3237a6cc6d91c", "scanner": "scanner-primary", "fingerprint": "c1d130fb72372a28", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "node_child_process"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "scripts/check-schema-drift.ts"}, "region": {"startLine": 21}}}]}, {"ruleId": "scanner-f3b5f45b124a0ba2", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in .cursor/skills/security-auditor/SKILL.md:37"}, "properties": {"repobilityId": "c19802000626b951", "scanner": "scanner-primary", "fingerprint": "f3b5f45b124a0ba2", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".cursor/skills/security-auditor/SKILL.md"}, "region": {"startLine": 37}}}]}, {"ruleId": "scanner-40351898d5febd20", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in .cursor/skills/code-reviewer/SKILL.md:48"}, "properties": {"repobilityId": "435037caae1dd7fd", "scanner": "scanner-primary", "fingerprint": "40351898d5febd20", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".cursor/skills/code-reviewer/SKILL.md"}, "region": {"startLine": 48}}}]}, {"ruleId": "scanner-dbeaa16565e34421", "level": "error", "message": {"text": "Insecure pattern 'eval_used' in .claude/skills/gstack/ship/SKILL.md:1198"}, "properties": {"repobilityId": "721fe8abaa31e414", "scanner": "scanner-primary", "fingerprint": "dbeaa16565e34421", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["owasp", "eval_used"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".claude/skills/gstack/ship/SKILL.md"}, "region": {"startLine": 1198}}}]}, {"ruleId": "scanner-0f23d3ca85ed01cb", "level": "error", "message": {"text": "Insecure pattern 'eval_used' in .claude/skills/gstack/plan-eng-review/SKILL.md:879"}, "properties": {"repobilityId": "11ecdc82d904460c", "scanner": "scanner-primary", "fingerprint": "0f23d3ca85ed01cb", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["owasp", "eval_used"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".claude/skills/gstack/plan-eng-review/SKILL.md"}, "region": {"startLine": 879}}}]}, {"ruleId": "scanner-f9aba5f85470cfdf", "level": "warning", "message": {"text": "Insecure pattern 'node_child_process' in .claude/skills/gstack/scripts/host-config-export.ts:18"}, "properties": {"repobilityId": "3cfebf348a4d9594", "scanner": "scanner-primary", "fingerprint": "f9aba5f85470cfdf", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "node_child_process"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".claude/skills/gstack/scripts/host-config-export.ts"}, "region": {"startLine": 18}}}]}, {"ruleId": "scanner-41d5e451215060b7", "level": "warning", "message": {"text": "Insecure pattern 'node_child_process' in .claude/skills/gstack/scripts/skill-check.ts:15"}, "properties": {"repobilityId": "d4ccaadb49f6b424", "scanner": "scanner-primary", "fingerprint": "41d5e451215060b7", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "node_child_process"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".claude/skills/gstack/scripts/skill-check.ts"}, "region": {"startLine": 15}}}]}, {"ruleId": "scanner-5ae1c021f48c4981", "level": "warning", "message": {"text": "Insecure pattern 'node_child_process' in .claude/skills/gstack/scripts/dev-skill.ts:11"}, "properties": {"repobilityId": "44580c14fccc4317", "scanner": "scanner-primary", "fingerprint": "5ae1c021f48c4981", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "node_child_process"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".claude/skills/gstack/scripts/dev-skill.ts"}, "region": {"startLine": 11}}}]}, {"ruleId": "scanner-62034588d187ee2d", "level": "warning", "message": {"text": "Insecure pattern 'node_child_process' in .claude/skills/gstack/scripts/slop-diff.ts:14"}, "properties": {"repobilityId": "0842fcc6cd4b404c", "scanner": "scanner-primary", "fingerprint": "62034588d187ee2d", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "node_child_process"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".claude/skills/gstack/scripts/slop-diff.ts"}, "region": {"startLine": 14}}}]}, {"ruleId": "scanner-1d44c146bfcffc4e", "level": "error", "message": {"text": "Insecure pattern 'eval_used' in .claude/skills/gstack/scripts/resolvers/testing.ts:312"}, "properties": {"repobilityId": "c0a97ef6acc42f97", "scanner": "scanner-primary", "fingerprint": "1d44c146bfcffc4e", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["owasp", "eval_used"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".claude/skills/gstack/scripts/resolvers/testing.ts"}, "region": {"startLine": 312}}}]}, {"ruleId": "scanner-cc4a20c31167d0be", "level": "warning", "message": {"text": "Insecure pattern 'node_child_process' in .claude/skills/gstack/browse/src/bun-polyfill.cjs:14"}, "properties": {"repobilityId": "5ad5ffdb2133326e", "scanner": "scanner-primary", "fingerprint": "cc4a20c31167d0be", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "node_child_process"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".claude/skills/gstack/browse/src/bun-polyfill.cjs"}, "region": {"startLine": 14}}}]}, {"ruleId": "scanner-a339f3c5c794ebe9", "level": "warning", "message": {"text": "Insecure pattern 'node_child_process' in .claude/skills/gstack/browse/src/sidebar-agent.ts:12"}, "properties": {"repobilityId": "9a37ea9f27fcf56f", "scanner": "scanner-primary", "fingerprint": "a339f3c5c794ebe9", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "node_child_process"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".claude/skills/gstack/browse/src/sidebar-agent.ts"}, "region": {"startLine": 12}}}]}, {"ruleId": "scanner-4c252f636813b55b", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in .claude/skills/gstack/browse/src/cookie-picker-ui.ts:370"}, "properties": {"repobilityId": "96f825ca83a316a2", "scanner": "scanner-primary", "fingerprint": "4c252f636813b55b", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".claude/skills/gstack/browse/src/cookie-picker-ui.ts"}, "region": {"startLine": 370}}}]}, {"ruleId": "scanner-703e03f129bf96e2", "level": "error", "message": {"text": "Insecure pattern 'eval_used' in .claude/skills/gstack/cso/SKILL.md:805"}, "properties": {"repobilityId": "f6d5451761875238", "scanner": "scanner-primary", "fingerprint": "703e03f129bf96e2", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["owasp", "eval_used"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".claude/skills/gstack/cso/SKILL.md"}, "region": {"startLine": 805}}}]}, {"ruleId": "scanner-3ab2affc089adc53", "level": "error", "message": {"text": "Insecure pattern 'exec_used' in .claude/skills/gstack/cso/SKILL.md:805"}, "properties": {"repobilityId": "78042d540f3f3d11", "scanner": "scanner-primary", "fingerprint": "3ab2affc089adc53", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["owasp", "exec_used"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".claude/skills/gstack/cso/SKILL.md"}, "region": {"startLine": 805}}}]}, {"ruleId": "scanner-39b20560b9b63157", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in .claude/skills/gstack/cso/SKILL.md:802"}, "properties": {"repobilityId": "199ceac3c23f0777", "scanner": "scanner-primary", "fingerprint": "39b20560b9b63157", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".claude/skills/gstack/cso/SKILL.md"}, "region": {"startLine": 802}}}]}, {"ruleId": "scanner-f0f1c80a6cfdeebf", "level": "warning", "message": {"text": "Insecure pattern 'weak_hash' in .claude/skills/gstack/cso/SKILL.md:854"}, "properties": {"repobilityId": "8fa87b687a86ebdf", "scanner": "scanner-primary", "fingerprint": "f0f1c80a6cfdeebf", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "weak_hash"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".claude/skills/gstack/cso/SKILL.md"}, "region": {"startLine": 854}}}]}, {"ruleId": "scanner-1ca7272f2a92a210", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in .claude/skills/gstack/extension/sidepanel.js:129"}, "properties": {"repobilityId": "e1fbfb4b444f334b", "scanner": "scanner-primary", "fingerprint": "1ca7272f2a92a210", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".claude/skills/gstack/extension/sidepanel.js"}, "region": {"startLine": 129}}}]}, {"ruleId": "scanner-d1cbeb6a450f1d7e", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in .claude/skills/gstack/extension/content.js:36"}, "properties": {"repobilityId": "b3772c622270a68a", "scanner": "scanner-primary", "fingerprint": "d1cbeb6a450f1d7e", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".claude/skills/gstack/extension/content.js"}, "region": {"startLine": 36}}}]}, {"ruleId": "scanner-791878ae98b721d6", "level": "warning", "message": {"text": "Insecure pattern 'node_child_process' in .claude/skills/gstack/design/src/serve.ts:38"}, "properties": {"repobilityId": "8ec33c462628a1b1", "scanner": "scanner-primary", "fingerprint": "791878ae98b721d6", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "node_child_process"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".claude/skills/gstack/design/src/serve.ts"}, "region": {"startLine": 38}}}]}, {"ruleId": "scanner-bba783d7809bf214", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in .claude/skills/gstack/design/src/compare.ts:490"}, "properties": {"repobilityId": "9e6caf138cc4059d", "scanner": "scanner-primary", "fingerprint": "bba783d7809bf214", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".claude/skills/gstack/design/src/compare.ts"}, "region": {"startLine": 490}}}]}, {"ruleId": "scanner-2867c1cc7e92f585", "level": "warning", "message": {"text": "Insecure pattern 'node_child_process' in .claude/skills/gstack/lib/worktree.ts:12"}, "properties": {"repobilityId": "ee9d846397ce1e13", "scanner": "scanner-primary", "fingerprint": "2867c1cc7e92f585", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "node_child_process"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".claude/skills/gstack/lib/worktree.ts"}, "region": {"startLine": 12}}}]}, {"ruleId": "scanner-127cf0c68b24f667", "level": "warning", "message": {"text": "GitHub Actions workflow grants broad write permissions"}, "properties": {"repobilityId": "c30c0e41610255bf", "scanner": "scanner-primary", "fingerprint": "127cf0c68b24f667", "layer": "cicd", "severity": "medium", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "least-privilege"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "packages/ai-server/.github/workflows/release-please.yml"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-f9aa59634fce90e2", "level": "warning", "message": {"text": "GitHub Actions workflow grants broad write permissions"}, "properties": {"repobilityId": "5387d28813b32b6c", "scanner": "scanner-primary", "fingerprint": "f9aa59634fce90e2", "layer": "cicd", "severity": "medium", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "least-privilege"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/backend-release.yml"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-aaef340a7e26f7c1", "level": "warning", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "5797ce4f31fed32a", "scanner": "scanner-primary", "fingerprint": "aaef340a7e26f7c1", "layer": "cicd", "severity": "medium", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/wiki-lint.yml"}, "region": {"startLine": 24}}}]}, {"ruleId": "scanner-9d7e8d370403d6cd", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "9e2148f405d372b1", "scanner": "scanner-primary", "fingerprint": "9d7e8d370403d6cd", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/deploy-backend.yml"}, "region": {"startLine": 29}}}]}, {"ruleId": "scanner-063997d8d14f8d5c", "level": "warning", "message": {"text": "GitHub Actions workflow grants broad write permissions"}, "properties": {"repobilityId": "b268301d4ba9d1b9", "scanner": "scanner-primary", "fingerprint": "063997d8d14f8d5c", "layer": "cicd", "severity": "medium", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "least-privilege"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/claude-review.yml"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-71ccec1b8896fe87", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "6700b2ff44fc6c6f", "scanner": "scanner-primary", "fingerprint": "71ccec1b8896fe87", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/db-drift-check.yml"}, "region": {"startLine": 86}}}]}, {"ruleId": "scanner-6cfa33b25ae12779", "level": "warning", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "fe4b3118efc086ea", "scanner": "scanner-primary", "fingerprint": "6cfa33b25ae12779", "layer": "cicd", "severity": "medium", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/schema-drift.yml"}, "region": {"startLine": 121}}}]}, {"ruleId": "scanner-ea7d09c7bcd26d85", "level": "warning", "message": {"text": "GitHub Actions workflow grants broad write permissions"}, "properties": {"repobilityId": "93d3c653e52df8c7", "scanner": "scanner-primary", "fingerprint": "ea7d09c7bcd26d85", "layer": "cicd", "severity": "medium", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "least-privilege"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".claude/skills/gstack/.github/workflows/ci-image.yml"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-21d5c924df212c73", "level": "warning", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "2450273ddfbdadee", "scanner": "scanner-primary", "fingerprint": "21d5c924df212c73", "layer": "cicd", "severity": "medium", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".claude/skills/gstack/.github/workflows/evals-periodic.yml"}, "region": {"startLine": 49}}}]}, {"ruleId": "scanner-21d5c924df212c73", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "06e552b8fb2e484a", "scanner": "scanner-primary", "fingerprint": "21d5c924df212c73", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".claude/skills/gstack/.github/workflows/evals-periodic.yml"}, "region": {"startLine": 125}}}]}, {"ruleId": "scanner-3fc95f4f1399c98e", "level": "warning", "message": {"text": "GitHub Actions workflow grants broad write permissions"}, "properties": {"repobilityId": "f06812a0cd24a6cf", "scanner": "scanner-primary", "fingerprint": "3fc95f4f1399c98e", "layer": "cicd", "severity": "medium", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "least-privilege"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".claude/skills/gstack/.github/workflows/evals-periodic.yml"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-3f3f65460c61fd51", "level": "warning", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "efc8da8e81525eed", "scanner": "scanner-primary", "fingerprint": "3f3f65460c61fd51", "layer": "cicd", "severity": "medium", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".claude/skills/gstack/.github/workflows/evals.yml"}, "region": {"startLine": 49}}}]}, {"ruleId": "scanner-3f3f65460c61fd51", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "f1e0ed5d4f61400f", "scanner": "scanner-primary", "fingerprint": "3f3f65460c61fd51", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".claude/skills/gstack/.github/workflows/evals.yml"}, "region": {"startLine": 143}}}]}, {"ruleId": "scanner-3f3f65460c61fd51", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "a2bf435372904565", "scanner": "scanner-primary", "fingerprint": "3f3f65460c61fd51", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".claude/skills/gstack/.github/workflows/evals.yml"}, "region": {"startLine": 163}}}]}, {"ruleId": "scanner-c22778b2a4b45a0c", "level": "warning", "message": {"text": "GitHub Actions workflow grants broad write permissions"}, "properties": {"repobilityId": "434dcbef14ca7a3f", "scanner": "scanner-primary", "fingerprint": "c22778b2a4b45a0c", "layer": "cicd", "severity": "medium", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "least-privilege"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".claude/skills/gstack/.github/workflows/evals.yml"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-44c73285932ce358", "level": "note", "message": {"text": "Very large file: packages/ai-server/src/editorial_article/ig_carousel/carousel.py (2064 lines)"}, "properties": {"repobilityId": "acd23d092e3f4fbc", "scanner": "scanner-primary", "fingerprint": "44c73285932ce358", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-e98123dd40d482ff", "level": "note", "message": {"text": "Very large file: packages/ai-server/src/services/raw_posts/repository.py (1227 lines)"}, "properties": {"repobilityId": "130164d2fc40092d", "scanner": "scanner-primary", "fingerprint": "e98123dd40d482ff", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-ab1dbac7ff818d47", "level": "note", "message": {"text": "Very large file: packages/api-server/src/domains/raw_posts/service.rs (2065 lines)"}, "properties": {"repobilityId": "05bf5242d247d8d3", "scanner": "scanner-primary", "fingerprint": "ab1dbac7ff818d47", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-1b21b02c86c5f0fb", "level": "note", "message": {"text": "Very large file: packages/api-server/src/domains/posts/service.rs (4407 lines)"}, "properties": {"repobilityId": "8fac75c9f9fafccc", "scanner": "scanner-primary", "fingerprint": "1b21b02c86c5f0fb", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-dca361f32a5543bd", "level": "note", "message": {"text": "Very large file: packages/api-server/src/domains/posts/tests.rs (1648 lines)"}, "properties": {"repobilityId": "f5cd82992795a58f", "scanner": "scanner-primary", "fingerprint": "dca361f32a5543bd", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-51f70c8d97885703", "level": "note", "message": {"text": "Very large file: .claude/skills/gstack/scripts/resolvers/review.ts (1021 lines)"}, "properties": {"repobilityId": "c66a93a989f441be", "scanner": "scanner-primary", "fingerprint": "51f70c8d97885703", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-255d515aa9598b66", "level": "note", "message": {"text": "Very large file: .claude/skills/gstack/browse/src/server.ts (2380 lines)"}, "properties": {"repobilityId": "d1ff9cc356633122", "scanner": "scanner-primary", "fingerprint": "255d515aa9598b66", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-305b3033194a45ea", "level": "note", "message": {"text": "Very large file: .claude/skills/gstack/browse/test/sidebar-ux.test.ts (1671 lines)"}, "properties": {"repobilityId": "d18a44dd265e7f5d", "scanner": "scanner-primary", "fingerprint": "305b3033194a45ea", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-9985d0989b57a320", "level": "note", "message": {"text": "Very large file: .claude/skills/gstack/browse/test/commands.test.ts (2089 lines)"}, "properties": {"repobilityId": "c20cee960bdb2c58", "scanner": "scanner-primary", "fingerprint": "9985d0989b57a320", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-e5b403276aa60aaa", "level": "note", "message": {"text": "Very large file: .claude/skills/gstack/extension/sidepanel.js (1675 lines)"}, "properties": {"repobilityId": "b8df03cfe6311eee", "scanner": "scanner-primary", "fingerprint": "e5b403276aa60aaa", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-ff1a08a5d7add672", "level": "note", "message": {"text": "Very large file: .claude/skills/gstack/test/gen-skill-docs.test.ts (2738 lines)"}, "properties": {"repobilityId": "688a6cea3cf9a243", "scanner": "scanner-primary", "fingerprint": "ff1a08a5d7add672", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-e86fb0cd90c20636", "level": "note", "message": {"text": "Very large file: .claude/skills/gstack/test/skill-e2e.test.ts (3365 lines)"}, "properties": {"repobilityId": "3d5d3c617992d359", "scanner": "scanner-primary", "fingerprint": "e86fb0cd90c20636", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-78014a346a7009d6", "level": "note", "message": {"text": "Very large file: .claude/skills/gstack/test/skill-validation.test.ts (1571 lines)"}, "properties": {"repobilityId": "f69fd75e7deeab91", "scanner": "scanner-primary", "fingerprint": "78014a346a7009d6", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-ea3b5e389d8c9c0f", "level": "note", "message": {"text": "Low test-to-source ratio"}, "properties": {"repobilityId": "ef7b2552cc00a375", "scanner": "scanner-primary", "fingerprint": "ea3b5e389d8c9c0f", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["tests"]}}, {"ruleId": "scanner-2699d5f16ae11282", "level": "note", "message": {"text": "Node manifest has dependencies but no lockfile: packages/shared/package.json"}, "properties": {"repobilityId": "37ac218a4ef9b430", "scanner": "scanner-primary", "fingerprint": "2699d5f16ae11282", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["dependency", "lockfile", "reproducibility", "generated-repo-pattern"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "packages/shared/package.json"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-a28850983a0b02d5", "level": "note", "message": {"text": "Node manifest has dependencies but no lockfile: packages/web/package.json"}, "properties": {"repobilityId": "8f313f0fe526a925", "scanner": "scanner-primary", "fingerprint": "a28850983a0b02d5", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["dependency", "lockfile", "reproducibility", "generated-repo-pattern"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "packages/web/package.json"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-0f87c913f9d130f8", "level": "note", "message": {"text": "Node manifest has dependencies but no lockfile: packages/mobile/package.json"}, "properties": {"repobilityId": "913954574c9d28f4", "scanner": "scanner-primary", "fingerprint": "0f87c913f9d130f8", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["dependency", "lockfile", "reproducibility", "generated-repo-pattern"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "packages/mobile/package.json"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-3ab5d313dda8e5f9", "level": "note", "message": {"text": "Debug logging residue appears in source files"}, "properties": {"repobilityId": "d8a73c03da372fb0", "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": "fac5c974c2e7d84c", "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": "228936e003046985", "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": "a9bdb46cdc574c3f", "scanner": "scanner-primary", "fingerprint": "2d0c7b7ab8f8aacf", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["placeholder", "mock-data", "critical-flow", "generated-repo-pattern"]}}, {"ruleId": "scanner-749d4bc1bd66df5f", "level": "warning", "message": {"text": "Agent instructions exist but release-hardening basics are missing"}, "properties": {"repobilityId": "b56eb0dc47658ee8", "scanner": "scanner-primary", "fingerprint": "749d4bc1bd66df5f", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "repo-hardening", "generated-repo-pattern"]}}, {"ruleId": "scanner-bea357a6497a2d5d", "level": "warning", "message": {"text": "Agent authority lacks a verifier contract: CLAUDE.md"}, "properties": {"repobilityId": "aae72df3934829ac", "scanner": "scanner-primary", "fingerprint": "bea357a6497a2d5d", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "verification", "claude_instruction"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "CLAUDE.md"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-604f0604c6c64a31", "level": "warning", "message": {"text": "Agent authority lacks a verifier contract: packages/ai-server/CLAUDE.md"}, "properties": {"repobilityId": "c14681ddc013a794", "scanner": "scanner-primary", "fingerprint": "604f0604c6c64a31", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "verification", "claude_instruction"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "packages/ai-server/CLAUDE.md"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-5f010693ea3298a8", "level": "warning", "message": {"text": "Agent authority lacks a verifier contract: packages/api-server/AGENTS.md"}, "properties": {"repobilityId": "e4993e1efc0abaca", "scanner": "scanner-primary", "fingerprint": "5f010693ea3298a8", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "verification", "agents_md"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "packages/api-server/AGENTS.md"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-14e9f0fa87f8c0b8", "level": "warning", "message": {"text": "Agent authority lacks a verifier contract: .cursor/skills/security-auditor/SKILL.md"}, "properties": {"repobilityId": "48e197c5cb162d07", "scanner": "scanner-primary", "fingerprint": "14e9f0fa87f8c0b8", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "verification", "cursor_rule"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".cursor/skills/security-auditor/SKILL.md"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-00b46dcd53da637c", "level": "warning", "message": {"text": "Agent authority lacks a verifier contract: .cursor/skills/code-reviewer/SKILL.md"}, "properties": {"repobilityId": "5899c82d4198421d", "scanner": "scanner-primary", "fingerprint": "00b46dcd53da637c", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "verification", "cursor_rule"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".cursor/skills/code-reviewer/SKILL.md"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-8b61cf3bbbef67b3", "level": "warning", "message": {"text": "Agent authority lacks a verifier contract: .claude/agents/code-reviewer.md"}, "properties": {"repobilityId": "5bdbcbe505ae9cd6", "scanner": "scanner-primary", "fingerprint": "8b61cf3bbbef67b3", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "verification", "claude_instruction"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".claude/agents/code-reviewer.md"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-5bf1ddb685bd2c00", "level": "error", "message": {"text": "Agent instruction/config may expose a secret: .claude/agents/supabase-query-builder.md"}, "properties": {"repobilityId": "86e447e776fde28b", "scanner": "scanner-primary", "fingerprint": "5bf1ddb685bd2c00", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["agent-instructions", "secrets", "claude_instruction"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".claude/agents/supabase-query-builder.md"}, "region": {"startLine": 29}}}]}, {"ruleId": "scanner-bc9c3eeb8b9236ee", "level": "warning", "message": {"text": "Agent authority lacks a verifier contract: .claude/commands/to-prd.md"}, "properties": {"repobilityId": "1a9694602fd46f29", "scanner": "scanner-primary", "fingerprint": "bc9c3eeb8b9236ee", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "verification", "claude_instruction"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".claude/commands/to-prd.md"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-3e6444a2cb9202f3", "level": "warning", "message": {"text": "Agent authority lacks a verifier contract: .claude/commands/setup-matt-skills.md"}, "properties": {"repobilityId": "964f82b55c5c3f98", "scanner": "scanner-primary", "fingerprint": "3e6444a2cb9202f3", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "verification", "claude_instruction"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".claude/commands/setup-matt-skills.md"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-13802f11423095bd", "level": "warning", "message": {"text": "Agent authority lacks a verifier contract: .claude/commands/grill-docs.md"}, "properties": {"repobilityId": "bd9c07659f6e16d5", "scanner": "scanner-primary", "fingerprint": "13802f11423095bd", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "verification", "claude_instruction"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".claude/commands/grill-docs.md"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-1b28054baa8caee8", "level": "warning", "message": {"text": "Agent authority lacks a verifier contract: .claude/commands/improve-codebase-architecture.md"}, "properties": {"repobilityId": "1dd87c06931d1559", "scanner": "scanner-primary", "fingerprint": "1b28054baa8caee8", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "verification", "claude_instruction"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".claude/commands/improve-codebase-architecture.md"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-fe70da00d7b6ec57", "level": "warning", "message": {"text": "Agent authority lacks a verifier contract: .claude/commands/to-issues.md"}, "properties": {"repobilityId": "3ef2a80f030d042d", "scanner": "scanner-primary", "fingerprint": "fe70da00d7b6ec57", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "verification", "claude_instruction"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".claude/commands/to-issues.md"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-b5bf7d10757cefc6", "level": "warning", "message": {"text": "Agent authority lacks a verifier contract: .claude/skills/pencil-screen-ui/SKILL.md"}, "properties": {"repobilityId": "ba97bbdf2137dbc0", "scanner": "scanner-primary", "fingerprint": "b5bf7d10757cefc6", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "verification", "claude_instruction"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".claude/skills/pencil-screen-ui/SKILL.md"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-e69908c3726c4663", "level": "warning", "message": {"text": "Agent authority lacks a verifier contract: .claude/skills/gstack/ARCHITECTURE.md"}, "properties": {"repobilityId": "b9aca6b318ba2075", "scanner": "scanner-primary", "fingerprint": "e69908c3726c4663", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "verification", "claude_instruction"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".claude/skills/gstack/ARCHITECTURE.md"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-98723f81061404ef", "level": "warning", "message": {"text": "Agent authority lacks a verifier contract: .claude/skills/gstack/DESIGN.md"}, "properties": {"repobilityId": "ea87bce7462a69b0", "scanner": "scanner-primary", "fingerprint": "98723f81061404ef", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "verification", "claude_instruction"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".claude/skills/gstack/DESIGN.md"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-b97dd0971cab9969", "level": "warning", "message": {"text": "Agent authority lacks a verifier contract: .claude/skills/gstack/CHANGELOG.md"}, "properties": {"repobilityId": "22f0200a482eeffc", "scanner": "scanner-primary", "fingerprint": "b97dd0971cab9969", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "verification", "claude_instruction"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".claude/skills/gstack/CHANGELOG.md"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-0f6c08c1de1ccd58", "level": "warning", "message": {"text": "Agent authority lacks a verifier contract: .claude/skills/gstack/TODOS.md"}, "properties": {"repobilityId": "f329a6198005c340", "scanner": "scanner-primary", "fingerprint": "0f6c08c1de1ccd58", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "verification", "claude_instruction"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".claude/skills/gstack/TODOS.md"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-7a6fd8d971180b90", "level": "warning", "message": {"text": "Agent authority lacks a verifier contract: .claude/skills/gstack/ship/SKILL.md"}, "properties": {"repobilityId": "8fa38fa114a42158", "scanner": "scanner-primary", "fingerprint": "7a6fd8d971180b90", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "verification", "claude_instruction"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".claude/skills/gstack/ship/SKILL.md"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-1cb3a3339ce179bf", "level": "warning", "message": {"text": "Agent instruction contains unpinned remote install: .claude/skills/gstack/ship/SKILL.md"}, "properties": {"repobilityId": "c3cacfcdb1609ddd", "scanner": "scanner-primary", "fingerprint": "1cb3a3339ce179bf", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "supply-chain", "claude_instruction"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".claude/skills/gstack/ship/SKILL.md"}, "region": {"startLine": 2081}}}]}, {"ruleId": "scanner-a964f6ba60cec322", "level": "warning", "message": {"text": "Agent authority lacks a verifier contract: .claude/skills/gstack/unfreeze/SKILL.md"}, "properties": {"repobilityId": "3708ba6ee674babd", "scanner": "scanner-primary", "fingerprint": "a964f6ba60cec322", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "verification", "claude_instruction"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".claude/skills/gstack/unfreeze/SKILL.md"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-9beb5123532f5525", "level": "warning", "message": {"text": "Agent authority lacks a verifier contract: .claude/skills/gstack/plan-eng-review/SKILL.md"}, "properties": {"repobilityId": "6b345f2be185eeec", "scanner": "scanner-primary", "fingerprint": "9beb5123532f5525", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "verification", "claude_instruction"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".claude/skills/gstack/plan-eng-review/SKILL.md"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-89ada1f97ff4d956", "level": "warning", "message": {"text": "Agent authority lacks a verifier contract: .claude/skills/gstack/plan-devex-review/SKILL.md"}, "properties": {"repobilityId": "00110838b7bfa7e0", "scanner": "scanner-primary", "fingerprint": "89ada1f97ff4d956", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "verification", "claude_instruction"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".claude/skills/gstack/plan-devex-review/SKILL.md"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-bc3e3f6a28761881", "level": "warning", "message": {"text": "Agent authority lacks a verifier contract: .claude/skills/gstack/openclaw/gstack-full-CLAUDE.md"}, "properties": {"repobilityId": "910e8f810b4069c3", "scanner": "scanner-primary", "fingerprint": "bc3e3f6a28761881", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "verification", "claude_instruction"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".claude/skills/gstack/openclaw/gstack-full-CLAUDE.md"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-122947036072abd4", "level": "warning", "message": {"text": "Agent authority lacks a verifier contract: .claude/skills/gstack/openclaw/gstack-plan-CLAUDE.md"}, "properties": {"repobilityId": "e91e3db9e554d659", "scanner": "scanner-primary", "fingerprint": "122947036072abd4", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "verification", "claude_instruction"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".claude/skills/gstack/openclaw/gstack-plan-CLAUDE.md"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-d4b0f8295c2a013a", "level": "warning", "message": {"text": "Agent authority lacks a verifier contract: .claude/skills/gstack/openclaw/skills/gstack-openclaw-investigate/SKILL.md"}, "properties": {"repobilityId": "95bdb9e44a43b27b", "scanner": "scanner-primary", "fingerprint": "d4b0f8295c2a013a", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "verification", "claude_instruction"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".claude/skills/gstack/openclaw/skills/gstack-openclaw-investigate/SKILL.md"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-a3b6528b343b2c98", "level": "warning", "message": {"text": "Agent authority lacks a verifier contract: .claude/skills/gstack/review/SKILL.md"}, "properties": {"repobilityId": "b4d964dd968d8805", "scanner": "scanner-primary", "fingerprint": "a3b6528b343b2c98", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "verification", "claude_instruction"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".claude/skills/gstack/review/SKILL.md"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-a53680c0f39ae2e8", "level": "warning", "message": {"text": "Agent instruction contains unpinned remote install: .claude/skills/gstack/review/SKILL.md"}, "properties": {"repobilityId": "1ae79d5d93b7485d", "scanner": "scanner-primary", "fingerprint": "a53680c0f39ae2e8", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "supply-chain", "claude_instruction"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".claude/skills/gstack/review/SKILL.md"}, "region": {"startLine": 1347}}}]}, {"ruleId": "scanner-7725449e4317769e", "level": "warning", "message": {"text": "Agent authority lacks a verifier contract: .claude/skills/gstack/review/greptile-triage.md"}, "properties": {"repobilityId": "04dacfccec6110b7", "scanner": "scanner-primary", "fingerprint": "7725449e4317769e", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "verification", "claude_instruction"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".claude/skills/gstack/review/greptile-triage.md"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-dfd56f0e20015f67", "level": "warning", "message": {"text": "Agent authority lacks a verifier contract: .claude/skills/gstack/review/specialists/security.md"}, "properties": {"repobilityId": "898debcc819ab639", "scanner": "scanner-primary", "fingerprint": "dfd56f0e20015f67", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "verification", "claude_instruction"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".claude/skills/gstack/review/specialists/security.md"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-28d3566dd26ac2ca", "level": "warning", "message": {"text": "Agent authority lacks a verifier contract: .claude/skills/gstack/review/specialists/performance.md"}, "properties": {"repobilityId": "eced2a781e8f9364", "scanner": "scanner-primary", "fingerprint": "28d3566dd26ac2ca", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "verification", "claude_instruction"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".claude/skills/gstack/review/specialists/performance.md"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-fa92eb47728fb0c6", "level": "warning", "message": {"text": "Agent authority lacks a verifier contract: .claude/skills/gstack/review/specialists/red-team.md"}, "properties": {"repobilityId": "e5dfd5148ea83b07", "scanner": "scanner-primary", "fingerprint": "fa92eb47728fb0c6", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "verification", "claude_instruction"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".claude/skills/gstack/review/specialists/red-team.md"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-bd18becee38f6a1e", "level": "warning", "message": {"text": "Agent authority lacks a verifier contract: .claude/skills/gstack/qa/SKILL.md"}, "properties": {"repobilityId": "d805ffcedcedbdbe", "scanner": "scanner-primary", "fingerprint": "bd18becee38f6a1e", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "verification", "claude_instruction"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".claude/skills/gstack/qa/SKILL.md"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-466307eab193018b", "level": "warning", "message": {"text": "Agent authority lacks a verifier contract: .claude/skills/gstack/cso/SKILL.md"}, "properties": {"repobilityId": "ece53147a4ee45a9", "scanner": "scanner-primary", "fingerprint": "466307eab193018b", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "verification", "claude_instruction"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".claude/skills/gstack/cso/SKILL.md"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-961341e4defa2cfa", "level": "warning", "message": {"text": "Agent instruction contains unpinned remote install: .claude/skills/gstack/codex/SKILL.md"}, "properties": {"repobilityId": "9879fd9780f2f7f6", "scanner": "scanner-primary", "fingerprint": "961341e4defa2cfa", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "supply-chain", "claude_instruction"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".claude/skills/gstack/codex/SKILL.md"}, "region": {"startLine": 612}}}]}, {"ruleId": "scanner-726f67f8fb949f8b", "level": "warning", "message": {"text": "Agent authority lacks a verifier contract: .claude/skills/gstack/autoplan/SKILL.md"}, "properties": {"repobilityId": "a1e0e0cf750cee17", "scanner": "scanner-primary", "fingerprint": "726f67f8fb949f8b", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "verification", "claude_instruction"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".claude/skills/gstack/autoplan/SKILL.md"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-25bac539a9965627", "level": "warning", "message": {"text": "Agent authority lacks a verifier contract: .claude/skills/gstack/docs/skills.md"}, "properties": {"repobilityId": "dc5049335b17e5f7", "scanner": "scanner-primary", "fingerprint": "25bac539a9965627", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "verification", "claude_instruction"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".claude/skills/gstack/docs/skills.md"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-cbeb50a72dfbdecb", "level": "warning", "message": {"text": "Agent authority lacks a verifier contract: .claude/skills/gstack/docs/REMOTE_BROWSER_ACCESS.md"}, "properties": {"repobilityId": "c14736028f4f8cfc", "scanner": "scanner-primary", "fingerprint": "cbeb50a72dfbdecb", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "verification", "claude_instruction"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".claude/skills/gstack/docs/REMOTE_BROWSER_ACCESS.md"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-284eb7b494a8a320", "level": "warning", "message": {"text": "Agent authority lacks a verifier contract: .claude/skills/gstack/docs/designs/CHROME_VS_CHROMIUM_EXPLORATION.md"}, "properties": {"repobilityId": "0dabead9ad190898", "scanner": "scanner-primary", "fingerprint": "284eb7b494a8a320", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "verification", "claude_instruction"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".claude/skills/gstack/docs/designs/CHROME_VS_CHROMIUM_EXPLORATION.md"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-115c9529722b43e7", "level": "error", "message": {"text": "Agent instruction/config may expose a secret: .claude/skills/gstack/docs/designs/SLATE_HOST.md"}, "properties": {"repobilityId": "a0c0913892457521", "scanner": "scanner-primary", "fingerprint": "115c9529722b43e7", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["agent-instructions", "secrets", "claude_instruction"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".claude/skills/gstack/docs/designs/SLATE_HOST.md"}, "region": {"startLine": 290}}}]}, {"ruleId": "scanner-8e91c0d1a090de44", "level": "error", "message": {"text": "Agent instruction/config may expose a secret: .claude/skills/gstack/docs/designs/SIDEBAR_MESSAGE_FLOW.md"}, "properties": {"repobilityId": "062e14b88528447f", "scanner": "scanner-primary", "fingerprint": "8e91c0d1a090de44", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["agent-instructions", "secrets", "claude_instruction"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".claude/skills/gstack/docs/designs/SIDEBAR_MESSAGE_FLOW.md"}, "region": {"startLine": 126}}}]}, {"ruleId": "scanner-103d701335356670", "level": "warning", "message": {"text": "Agent authority lacks a verifier contract: .claude/skills/gstack/docs/designs/SIDEBAR_MESSAGE_FLOW.md"}, "properties": {"repobilityId": "f037be166677a3b3", "scanner": "scanner-primary", "fingerprint": "103d701335356670", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "verification", "claude_instruction"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".claude/skills/gstack/docs/designs/SIDEBAR_MESSAGE_FLOW.md"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-2d266c1476ad08a0", "level": "warning", "message": {"text": "Agent authority lacks a verifier contract: .claude/skills/gstack/docs/designs/CONDUCTOR_CHROME_SIDEBAR_INTEGRATION.md"}, "properties": {"repobilityId": "46c0eb439afa609e", "scanner": "scanner-primary", "fingerprint": "2d266c1476ad08a0", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "verification", "claude_instruction"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".claude/skills/gstack/docs/designs/CONDUCTOR_CHROME_SIDEBAR_INTEGRATION.md"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-5087fc3ea8caf659", "level": "warning", "message": {"text": "Agent authority lacks a verifier contract: .claude/skills/gstack/docs/designs/CONDUCTOR_SESSION_API.md"}, "properties": {"repobilityId": "88c9cfaa54ce82e2", "scanner": "scanner-primary", "fingerprint": "5087fc3ea8caf659", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "verification", "claude_instruction"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".claude/skills/gstack/docs/designs/CONDUCTOR_SESSION_API.md"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-f06617692c17304b", "level": "warning", "message": {"text": "Agent authority lacks a verifier contract: .claude/skills/gstack/docs/designs/SELF_LEARNING_V0.md"}, "properties": {"repobilityId": "62f2f2ec42e3c4a4", "scanner": "scanner-primary", "fingerprint": "f06617692c17304b", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "verification", "claude_instruction"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".claude/skills/gstack/docs/designs/SELF_LEARNING_V0.md"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-9aae906d2c2a7ac8", "level": "warning", "message": {"text": "Agent authority lacks a verifier contract: .claude/skills/gstack/gstack-upgrade/SKILL.md"}, "properties": {"repobilityId": "76a8e8f90d79dd76", "scanner": "scanner-primary", "fingerprint": "9aae906d2c2a7ac8", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "verification", "claude_instruction"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".claude/skills/gstack/gstack-upgrade/SKILL.md"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-9f71351e7fa9cad3", "level": "warning", "message": {"text": "Agent authority lacks a verifier contract: .claude/skills/gstack/design-review/SKILL.md"}, "properties": {"repobilityId": "7c90f8cee3fae09a", "scanner": "scanner-primary", "fingerprint": "9f71351e7fa9cad3", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "verification", "claude_instruction"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".claude/skills/gstack/design-review/SKILL.md"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-d64d7b567a549515", "level": "warning", "message": {"text": "Agent authority lacks a verifier contract: .claude/skills/gstack/land-and-deploy/SKILL.md"}, "properties": {"repobilityId": "2c929c830ae44e6a", "scanner": "scanner-primary", "fingerprint": "d64d7b567a549515", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "verification", "claude_instruction"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".claude/skills/gstack/land-and-deploy/SKILL.md"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-306e31c438d1b6e6", "level": "warning", "message": {"text": "Agent authority lacks a verifier contract: .claude/skills/gstack/design-html/SKILL.md"}, "properties": {"repobilityId": "fb8bdc8df280b71b", "scanner": "scanner-primary", "fingerprint": "306e31c438d1b6e6", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "verification", "claude_instruction"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".claude/skills/gstack/design-html/SKILL.md"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-2d589ac9abeb32bb", "level": "warning", "message": {"text": "Agent authority lacks a verifier contract: .claude/skills/gstack/test/fixtures/golden-ship-claude.md"}, "properties": {"repobilityId": "6b02beb6ec44da4c", "scanner": "scanner-primary", "fingerprint": "2d589ac9abeb32bb", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "verification", "claude_instruction"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".claude/skills/gstack/test/fixtures/golden-ship-claude.md"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-bae7f03969efb559", "level": "warning", "message": {"text": "Agent instruction contains unpinned remote install: .claude/skills/gstack/test/fixtures/golden-ship-claude.md"}, "properties": {"repobilityId": "1095ce210393023a", "scanner": "scanner-primary", "fingerprint": "bae7f03969efb559", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "supply-chain", "claude_instruction"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".claude/skills/gstack/test/fixtures/golden-ship-claude.md"}, "region": {"startLine": 2041}}}]}, {"ruleId": "scanner-3db26658d6d264b4", "level": "warning", "message": {"text": "Agent authority lacks a verifier contract: .claude/skills/gstack/test/fixtures/golden/codex-ship-SKILL.md"}, "properties": {"repobilityId": "f95841633ce79d46", "scanner": "scanner-primary", "fingerprint": "3db26658d6d264b4", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "verification", "claude_instruction"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".claude/skills/gstack/test/fixtures/golden/codex-ship-SKILL.md"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-e979ebf9663560e7", "level": "warning", "message": {"text": "Agent authority lacks a verifier contract: .claude/skills/gstack/test/fixtures/golden/claude-ship-SKILL.md"}, "properties": {"repobilityId": "214927ca0f16b05b", "scanner": "scanner-primary", "fingerprint": "e979ebf9663560e7", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "verification", "claude_instruction"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".claude/skills/gstack/test/fixtures/golden/claude-ship-SKILL.md"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-f44c4f7c62aff486", "level": "warning", "message": {"text": "Agent instruction contains unpinned remote install: .claude/skills/gstack/test/fixtures/golden/claude-ship-SKILL.md"}, "properties": {"repobilityId": "c8301f3f1105979f", "scanner": "scanner-primary", "fingerprint": "f44c4f7c62aff486", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "supply-chain", "claude_instruction"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".claude/skills/gstack/test/fixtures/golden/claude-ship-SKILL.md"}, "region": {"startLine": 2041}}}]}, {"ruleId": "scanner-c252cdf7cf7896a5", "level": "warning", "message": {"text": "Agent authority lacks a verifier contract: .claude/skills/gstack/test/fixtures/golden/factory-ship-SKILL.md"}, "properties": {"repobilityId": "c2955343365ec1db", "scanner": "scanner-primary", "fingerprint": "c252cdf7cf7896a5", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "verification", "claude_instruction"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".claude/skills/gstack/test/fixtures/golden/factory-ship-SKILL.md"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-ba4dcb8335b27a89", "level": "warning", "message": {"text": "Agent instruction contains unpinned remote install: .claude/skills/gstack/test/fixtures/golden/factory-ship-SKILL.md"}, "properties": {"repobilityId": "56468679196feb08", "scanner": "scanner-primary", "fingerprint": "ba4dcb8335b27a89", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "supply-chain", "claude_instruction"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".claude/skills/gstack/test/fixtures/golden/factory-ship-SKILL.md"}, "region": {"startLine": 2037}}}]}, {"ruleId": "scanner-a849ecdee02f7126", "level": "warning", "message": {"text": "Agent authority lacks a verifier contract: .claude/skills/gstack/plan-design-review/SKILL.md"}, "properties": {"repobilityId": "983a176383753d4d", "scanner": "scanner-primary", "fingerprint": "a849ecdee02f7126", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "verification", "claude_instruction"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".claude/skills/gstack/plan-design-review/SKILL.md"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-bfb710c08b73fd64", "level": "warning", "message": {"text": "Agent authority lacks a verifier contract: .claude/skills/gstack/qa-only/SKILL.md"}, "properties": {"repobilityId": "c5a280e35927b865", "scanner": "scanner-primary", "fingerprint": "bfb710c08b73fd64", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "verification", "claude_instruction"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".claude/skills/gstack/qa-only/SKILL.md"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-beab8adc380ec953", "level": "warning", "message": {"text": "Agent authority lacks a verifier contract: .claude/skills/gstack/freeze/SKILL.md"}, "properties": {"repobilityId": "31dde181bb914ae7", "scanner": "scanner-primary", "fingerprint": "beab8adc380ec953", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "verification", "claude_instruction"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".claude/skills/gstack/freeze/SKILL.md"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-eb6e135978f19032", "level": "warning", "message": {"text": "Agent authority lacks a verifier contract: .claude/skills/gstack/plan-ceo-review/SKILL.md"}, "properties": {"repobilityId": "cdcfe4cabaeb2c11", "scanner": "scanner-primary", "fingerprint": "eb6e135978f19032", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "verification", "claude_instruction"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".claude/skills/gstack/plan-ceo-review/SKILL.md"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-6b9136f725351000", "level": "warning", "message": {"text": "Agent authority lacks a verifier contract: .claude/skills/gstack/investigate/SKILL.md"}, "properties": {"repobilityId": "52ca69877fa055e5", "scanner": "scanner-primary", "fingerprint": "6b9136f725351000", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "verification", "claude_instruction"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".claude/skills/gstack/investigate/SKILL.md"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-6824c7d70c7a5ff5", "level": "warning", "message": {"text": "Agent authority lacks a verifier contract: .claude/skills/supabase-migration-generator/SKILL.md"}, "properties": {"repobilityId": "854da76d23f69525", "scanner": "scanner-primary", "fingerprint": "6824c7d70c7a5ff5", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "verification", "claude_instruction"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".claude/skills/supabase-migration-generator/SKILL.md"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-f2337922f15326e1", "level": "warning", "message": {"text": "Agent authority lacks a verifier contract: .claude/skills/supabase-migration-generator/references/migration-patterns.md"}, "properties": {"repobilityId": "3a2014669df78e3f", "scanner": "scanner-primary", "fingerprint": "f2337922f15326e1", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "verification", "claude_instruction"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".claude/skills/supabase-migration-generator/references/migration-patterns.md"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-e725d2ab884fbd49", "level": "note", "message": {"text": "Multiple root agent instruction files without precedence"}, "properties": {"repobilityId": "1953db6c89508d22", "scanner": "scanner-primary", "fingerprint": "e725d2ab884fbd49", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["agent-instructions", "governance"]}}, {"ruleId": "scanner-cf14b8338c5344ab", "level": "note", "message": {"text": "Legacy-named symbol `model_copy` in packages/ai-server/tests/unit/services/raw_posts/test_processor_prelabeled.py:144"}, "properties": {"repobilityId": "a209f848702c9e29", "scanner": "scanner-primary", "fingerprint": "cf14b8338c5344ab", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-4d461d41d413a7c6", "level": "note", "message": {"text": "Legacy-named symbol `model_copy` in packages/ai-server/tests/unit/services/raw_posts/test_processor.py:83"}, "properties": {"repobilityId": "1097a5fe9862dd2d", "scanner": "scanner-primary", "fingerprint": "4d461d41d413a7c6", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-fd0d3c33264bae24", "level": "warning", "message": {"text": "Network/subprocess call without timeout or try/except \u2014 packages/ai-server/scripts/backfill_solution_urls_gemini.py:68"}, "properties": {"repobilityId": "2bd6662f2595b989", "scanner": "scanner-primary", "fingerprint": "fd0d3c33264bae24", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-50ad1b98c44ec692", "level": "warning", "message": {"text": "Network/subprocess call without timeout or try/except \u2014 packages/ai-server/scripts/backfill_post_titles.py:84"}, "properties": {"repobilityId": "75fb05b4daa90ccc", "scanner": "scanner-primary", "fingerprint": "50ad1b98c44ec692", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-f38b9f4e89b7facd", "level": "warning", "message": {"text": "Network/subprocess call without timeout or try/except \u2014 packages/ai-server/scripts/backfill_solution_urls_dryrun.py:80"}, "properties": {"repobilityId": "f0bd047a6014d8d5", "scanner": "scanner-primary", "fingerprint": "f38b9f4e89b7facd", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-2a84950a48f7efd0", "level": "warning", "message": {"text": "Network/subprocess call without timeout or try/except \u2014 packages/ai-server/scripts/backfill_post_enrichment.py:79"}, "properties": {"repobilityId": "775168887ada0e2e", "scanner": "scanner-primary", "fingerprint": "2a84950a48f7efd0", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-42509dd5ff22cdf0", "level": "note", "message": {"text": "Legacy-named symbol `model_copy` in packages/ai-server/src/editorial_article_chat/tools.py:201"}, "properties": {"repobilityId": "c9c411dea2591d35", "scanner": "scanner-primary", "fingerprint": "42509dd5ff22cdf0", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-bfdfa4f578a96b7b", "level": "note", "message": {"text": "Legacy-named symbol `model_copy` in packages/ai-server/src/editorial_article/nodes/compose_layout.py:52"}, "properties": {"repobilityId": "758ce3f670042ba5", "scanner": "scanner-primary", "fingerprint": "bfdfa4f578a96b7b", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-3d19f4df0531d5db", "level": "note", "message": {"text": "Legacy-named symbol `model_copy` in packages/ai-server/src/editorial_article/nodes/generate_thumbnail.py:166"}, "properties": {"repobilityId": "22104257ba14ea88", "scanner": "scanner-primary", "fingerprint": "3d19f4df0531d5db", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-c4b6dba3ae0237d0", "level": "note", "message": {"text": "Legacy-named symbol `_generate_slide_copy` in packages/ai-server/src/editorial_article/ig_carousel/carousel.py:840"}, "properties": {"repobilityId": "043947d33273458b", "scanner": "scanner-primary", "fingerprint": "c4b6dba3ae0237d0", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-736afef4c4053a07", "level": "none", "message": {"text": "Commented-code block (5 lines) in packages/ai-server/src/editorial_article/ig_carousel/carousel.py:52"}, "properties": {"repobilityId": "1142020154a34a27", "scanner": "scanner-primary", "fingerprint": "736afef4c4053a07", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-9c1946ccb39c47b1", "level": "none", "message": {"text": "Commented-code block (6 lines) in packages/ai-server/src/services/raw_posts/scheduler.py:590"}, "properties": {"repobilityId": "d2419c2566d51e2d", "scanner": "scanner-primary", "fingerprint": "9c1946ccb39c47b1", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-e7d0c3c527b34fe7", "level": "none", "message": {"text": "Commented-code block (5 lines) in packages/ai-server/src/services/raw_posts/processors/cody_prompts.py:268"}, "properties": {"repobilityId": "47b7571515a2d2d8", "scanner": "scanner-primary", "fingerprint": "e7d0c3c527b34fe7", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-2e4dd9d69fbef5a6", "level": "none", "message": {"text": "Commented-code block (12 lines) in packages/ai-server/src/services/raw_posts/processors/cody_describe_parser.py:43"}, "properties": {"repobilityId": "5c4f9cbf28379819", "scanner": "scanner-primary", "fingerprint": "2e4dd9d69fbef5a6", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-6afda84f75acc8c7", "level": "note", "message": {"text": "Legacy-named symbol `model_copy` in packages/ai-server/src/services/raw_posts/processors/processor.py:338"}, "properties": {"repobilityId": "b3e4ea4a33e1511b", "scanner": "scanner-primary", "fingerprint": "6afda84f75acc8c7", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-b609fb8f0517720e", "level": "none", "message": {"text": "Commented-code block (6 lines) in packages/ai-server/src/services/raw_posts/processors/processor.py:386"}, "properties": {"repobilityId": "3b823ffcd506a3f2", "scanner": "scanner-primary", "fingerprint": "b609fb8f0517720e", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-18cf367c7ea27473", "level": "note", "message": {"text": "Legacy-named symbol `model_copy` in packages/ai-server/src/services/raw_posts/processors/catalog_matcher.py:526"}, "properties": {"repobilityId": "1907e89b0b7488e4", "scanner": "scanner-primary", "fingerprint": "18cf367c7ea27473", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-104bcec75259cf59", "level": "note", "message": {"text": "Legacy-named symbol `model_copy` in packages/ai-server/src/services/raw_posts/processors/items_thumbnail.py:186"}, "properties": {"repobilityId": "ed2a463bb59c2a0f", "scanner": "scanner-primary", "fingerprint": "104bcec75259cf59", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-b009234c0602889b", "level": "note", "message": {"text": "Legacy-named symbol `model_copy` in packages/ai-server/src/services/raw_posts/processors/spots_parser.py:149"}, "properties": {"repobilityId": "1d5fd36675ea4507", "scanner": "scanner-primary", "fingerprint": "b009234c0602889b", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-138cfc23600e3f96", "level": "none", "message": {"text": "Commented-code block (5 lines) in packages/ai-server/src/services/raw_posts/processors/spots_parser.py:32"}, "properties": {"repobilityId": "759c3b53954fe070", "scanner": "scanner-primary", "fingerprint": "138cfc23600e3f96", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-ff747ceffae73e61", "level": "note", "message": {"text": "Legacy-named symbol `model_copy` in packages/ai-server/src/services/editorial_discovery/repository.py:298"}, "properties": {"repobilityId": "d616fc02f4b43ebb", "scanner": "scanner-primary", "fingerprint": "ff747ceffae73e61", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-0f604e7d4532a430", "level": "none", "message": {"text": "Commented-code block (5 lines) in packages/ai-server/src/services/editorial_article/scheduler.py:77"}, "properties": {"repobilityId": "19b050583223ae04", "scanner": "scanner-primary", "fingerprint": "0f604e7d4532a430", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-75b7da6c15fc096f", "level": "none", "message": {"text": "Commented-code block (5 lines) in packages/ai-server/src/config/_container.py:419"}, "properties": {"repobilityId": "0168e9f1cf2efca2", "scanner": "scanner-primary", "fingerprint": "75b7da6c15fc096f", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-1bf9f5172d909fa6", "level": "note", "message": {"text": "Legacy-named symbol `model_copy` in packages/ai-server/src/config/helpers/_override.py:13"}, "properties": {"repobilityId": "d4196d7d0af64f2c", "scanner": "scanner-primary", "fingerprint": "1bf9f5172d909fa6", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-eec780b0b6d8bdfb", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 packages/shared/api/search.ts:126"}, "properties": {"repobilityId": "2ad600deff9b6300", "scanner": "scanner-primary", "fingerprint": "eec780b0b6d8bdfb", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-2a859b3f03d50628", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 packages/shared/api/client.ts:17"}, "properties": {"repobilityId": "684718424b983ecd", "scanner": "scanner-primary", "fingerprint": "2a859b3f03d50628", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-7b53ffac9a90f3b7", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 packages/web/app/api/v1/vton/route.ts:41"}, "properties": {"repobilityId": "95e69cdb51956953", "scanner": "scanner-primary", "fingerprint": "7b53ffac9a90f3b7", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-661a00c4b6ab21bd", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 packages/web/app/api/v1/content/posts/search/route.ts:30"}, "properties": {"repobilityId": "98e278a14d9a0ad3", "scanner": "scanner-primary", "fingerprint": "661a00c4b6ab21bd", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-cbdc61d8587909f5", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 packages/web/app/api/v1/events/route.ts:36"}, "properties": {"repobilityId": "fd4544edd331dc09", "scanner": "scanner-primary", "fingerprint": "cbdc61d8587909f5", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-e5c5f3d3052c298f", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 packages/web/app/api/v1/events/anon/route.ts:25"}, "properties": {"repobilityId": "4d66ed1d0194e6e0", "scanner": "scanner-primary", "fingerprint": "e5c5f3d3052c298f", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-d9a595fd017d0530", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 packages/web/app/api/admin/data-pipeline/instagram-accounts/route.ts:45"}, "properties": {"repobilityId": "503d5cb27e61ba66", "scanner": "scanner-primary", "fingerprint": "d9a595fd017d0530", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-3fd709147bae9739", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 packages/web/app/api/admin/raw-post-sources/preview/route.ts:46"}, "properties": {"repobilityId": "dfb7b163ed87e48f", "scanner": "scanner-primary", "fingerprint": "3fd709147bae9739", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-1b69cc19e3aca48f", "level": "none", "message": {"text": "Commented-code block (10 lines) in packages/web/app/admin/login/page.tsx:12"}, "properties": {"repobilityId": "d9b4e98b92e27ca8", "scanner": "scanner-primary", "fingerprint": "1b69cc19e3aca48f", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-12dea6aa26153304", "level": "none", "message": {"text": "Commented-code block (6 lines) in packages/web/app/admin/raw-posts/page.tsx:243"}, "properties": {"repobilityId": "22af1cfa6ebc6977", "scanner": "scanner-primary", "fingerprint": "12dea6aa26153304", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-a71ba5764f5f8bfc", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 packages/web/app/admin/raw-post-sources/page.tsx:290"}, "properties": {"repobilityId": "e4b05452d6033d42", "scanner": "scanner-primary", "fingerprint": "a71ba5764f5f8bfc", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-e91557a8e3d1a224", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 packages/web/lib/api/proxy-to-backend.ts:34"}, "properties": {"repobilityId": "29ca445a3d8131be", "scanner": "scanner-primary", "fingerprint": "e91557a8e3d1a224", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-6e07f276db6cbc0b", "level": "none", "message": {"text": "Commented-code block (5 lines) in packages/web/lib/api/posts.ts:44"}, "properties": {"repobilityId": "82162f4bf46eb238", "scanner": "scanner-primary", "fingerprint": "6e07f276db6cbc0b", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-dd0f879d18fe522f", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 packages/web/lib/api/posts.ts:483"}, "properties": {"repobilityId": "e231e60c07b9a264", "scanner": "scanner-primary", "fingerprint": "dd0f879d18fe522f", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-e0540197be6dd19b", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 packages/web/lib/api/server-instance.ts:37"}, "properties": {"repobilityId": "90f44f9e9463e917", "scanner": "scanner-primary", "fingerprint": "e0540197be6dd19b", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-7111456d858c73ca", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 packages/web/lib/api/server-prefetch.ts:36"}, "properties": {"repobilityId": "cd32f6ebf932d7ef", "scanner": "scanner-primary", "fingerprint": "7111456d858c73ca", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-15ada9a5ba6f0dda", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 packages/web/lib/api/admin/affiliate-catalog.ts:4"}, "properties": {"repobilityId": "7ea24808be2ad851", "scanner": "scanner-primary", "fingerprint": "15ada9a5ba6f0dda", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-b2ba2cfcdd94139d", "level": "none", "message": {"text": "Commented-code block (6 lines) in packages/web/lib/api/admin/raw-posts.ts:115"}, "properties": {"repobilityId": "8b5d5a32fb15c03a", "scanner": "scanner-primary", "fingerprint": "b2ba2cfcdd94139d", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-7b5f6d01db26b1df", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 packages/web/lib/api/admin/raw-posts.ts:17"}, "properties": {"repobilityId": "0dedeb0486074917", "scanner": "scanner-primary", "fingerprint": "7b5f6d01db26b1df", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-911a311e7797607d", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 packages/web/lib/api/admin/entity-enrichment.ts:4"}, "properties": {"repobilityId": "8d46da484de29d12", "scanner": "scanner-primary", "fingerprint": "911a311e7797607d", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-f85c20401dc9ef63", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 packages/web/lib/api/admin/raw-post-sources.ts:24"}, "properties": {"repobilityId": "528eef549520c801", "scanner": "scanner-primary", "fingerprint": "f85c20401dc9ef63", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-4ab5412b1f8db275", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 packages/web/lib/hooks/useVtonPostFetch.ts:93"}, "properties": {"repobilityId": "30788559a9d4cd63", "scanner": "scanner-primary", "fingerprint": "4ab5412b1f8db275", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-7ca7b6b1756b39e1", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 packages/web/lib/hooks/admin/useEditorialCandidates.ts:130"}, "properties": {"repobilityId": "22da7deee2a82a01", "scanner": "scanner-primary", "fingerprint": "7ca7b6b1756b39e1", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-f33171a6e82e59e4", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 packages/web/lib/hooks/admin/useServerLogs.ts:29"}, "properties": {"repobilityId": "89f823d34af4b11f", "scanner": "scanner-primary", "fingerprint": "f33171a6e82e59e4", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-08849034c6e3128e", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 packages/web/lib/hooks/admin/useEditorialPipelineSettings.ts:35"}, "properties": {"repobilityId": "23f71709cb91dcbf", "scanner": "scanner-primary", "fingerprint": "08849034c6e3128e", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-996fec365ebf8e3d", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 packages/web/lib/hooks/admin/usePipeline.ts:20"}, "properties": {"repobilityId": "7bc08cd659bbf212", "scanner": "scanner-primary", "fingerprint": "996fec365ebf8e3d", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-54ff4d8675a46299", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 packages/web/lib/hooks/admin/useGeminiCost.ts:226"}, "properties": {"repobilityId": "c7f8e27ddbd82f0b", "scanner": "scanner-primary", "fingerprint": "54ff4d8675a46299", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-eb680df1ff60c657", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 packages/web/lib/hooks/admin/useAdminPosts.ts:20"}, "properties": {"repobilityId": "3a43384da72762f4", "scanner": "scanner-primary", "fingerprint": "eb680df1ff60c657", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-a6d98580681cfea3", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 packages/web/lib/hooks/admin/useEditorialChat.ts:69"}, "properties": {"repobilityId": "0ab560dbb6fd62b9", "scanner": "scanner-primary", "fingerprint": "a6d98580681cfea3", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-49ef277ffc530375", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 packages/web/lib/hooks/admin/useAiCost.ts:9"}, "properties": {"repobilityId": "c5d34e4dddeb68bc", "scanner": "scanner-primary", "fingerprint": "49ef277ffc530375", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-e39babc6a809c913", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 packages/web/lib/hooks/admin/useAdminOnboardingPool.ts:18"}, "properties": {"repobilityId": "9d9cdb32b6fba39f", "scanner": "scanner-primary", "fingerprint": "e39babc6a809c913", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-316ac4a50981bd5e", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 packages/web/lib/hooks/admin/useAudit.ts:25"}, "properties": {"repobilityId": "fba9f0781bb5a0fb", "scanner": "scanner-primary", "fingerprint": "316ac4a50981bd5e", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-3ce90671e08cca92", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 packages/web/lib/hooks/admin/useDashboard.ts:23"}, "properties": {"repobilityId": "9a8e445999d8508f", "scanner": "scanner-primary", "fingerprint": "3ce90671e08cca92", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-5f56d71acba12cee", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 packages/web/lib/hooks/admin/useAdminMagazineList.ts:35"}, "properties": {"repobilityId": "3a9bddf189175472", "scanner": "scanner-primary", "fingerprint": "5f56d71acba12cee", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-ef2b05f80c52ad9f", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 packages/web/lib/hooks/admin/useAdminReports.ts:21"}, "properties": {"repobilityId": "b43464e194690f70", "scanner": "scanner-primary", "fingerprint": "ef2b05f80c52ad9f", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-f5e72b30c27a4f64", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 packages/web/lib/hooks/admin/useVerifyStats.ts:45"}, "properties": {"repobilityId": "605d2b9f89d9d1d5", "scanner": "scanner-primary", "fingerprint": "f5e72b30c27a4f64", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-54783cc2d1247359", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 packages/web/lib/hooks/admin/useEditorialArticles.ts:206"}, "properties": {"repobilityId": "1e4f92e574100728", "scanner": "scanner-primary", "fingerprint": "54783cc2d1247359", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-b247419d89dc0523", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 packages/web/lib/hooks/admin/useDiscoverySettings.ts:46"}, "properties": {"repobilityId": "833e63b3c9bcb022", "scanner": "scanner-primary", "fingerprint": "b247419d89dc0523", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-4bfe03da4cf21e8a", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 packages/web/lib/hooks/admin/useAdminPicks.ts:26"}, "properties": {"repobilityId": "2993cdccdfaae12c", "scanner": "scanner-primary", "fingerprint": "4bfe03da4cf21e8a", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-cb836a62f1467af7", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 packages/web/lib/hooks/admin/useEditorialRecommendations.ts:74"}, "properties": {"repobilityId": "c69bdd622a4dbb7d", "scanner": "scanner-primary", "fingerprint": "cb836a62f1467af7", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-46f7410b6af6175c", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 packages/web/lib/hooks/admin/useAdminSolutions.ts:17"}, "properties": {"repobilityId": "1cdb83335ab04645", "scanner": "scanner-primary", "fingerprint": "46f7410b6af6175c", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-2207ed16a8e1750b", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 packages/web/lib/hooks/admin/useAdminPostEdit.ts:21"}, "properties": {"repobilityId": "1f058127e0970345", "scanner": "scanner-primary", "fingerprint": "2207ed16a8e1750b", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-3d122d0ea92177be", "level": "none", "message": {"text": "Commented-code block (9 lines) in packages/web/lib/hooks/__tests__/usePostLike.test.tsx:129"}, "properties": {"repobilityId": "831b33cdf173299c", "scanner": "scanner-primary", "fingerprint": "3d122d0ea92177be", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-93a1ee8c6aaebae8", "level": "note", "message": {"text": "Legacy-named symbol `isLegacy` in packages/web/lib/components/PostBadge.tsx:19"}, "properties": {"repobilityId": "d73cefc002f1f5a0", "scanner": "scanner-primary", "fingerprint": "93a1ee8c6aaebae8", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-9ab88e949cbe00f7", "level": "none", "message": {"text": "Commented-code block (9 lines) in packages/web/lib/components/admin/AdminSidebar.tsx:155"}, "properties": {"repobilityId": "c0c54281cf686a81", "scanner": "scanner-primary", "fingerprint": "9ab88e949cbe00f7", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-ce08d0139b992b73", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 packages/web/lib/components/cody/LookDetail.tsx:5"}, "properties": {"repobilityId": "cbfe39d585bb9508", "scanner": "scanner-primary", "fingerprint": "ce08d0139b992b73", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-e3858e8a6199969d", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 packages/web/lib/components/cody/__tests__/vton-separation.test.ts:62"}, "properties": {"repobilityId": "d9da8f87bde67557", "scanner": "scanner-primary", "fingerprint": "e3858e8a6199969d", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-c07a781558629ca9", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 packages/web/lib/content-studio/llm-client.ts:68"}, "properties": {"repobilityId": "ddb450009e41439b", "scanner": "scanner-primary", "fingerprint": "c07a781558629ca9", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-658dda8351afea12", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 packages/web/lib/content-studio/assets/video.ts:379"}, "properties": {"repobilityId": "d27c8378ff4c042a", "scanner": "scanner-primary", "fingerprint": "658dda8351afea12", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-5d29c4e6ec814fcb", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 packages/web/lib/content-studio/assets/openai-client.ts:119"}, "properties": {"repobilityId": "d0cead00adfc6b66", "scanner": "scanner-primary", "fingerprint": "5d29c4e6ec814fcb", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-7e55870c56deb596", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 packages/web/lib/content-studio/assets/video-persistence.ts:9"}, "properties": {"repobilityId": "e164aa93dcd3117c", "scanner": "scanner-primary", "fingerprint": "7e55870c56deb596", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-d472a8cead21a324", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/list-posts-with-spots.mjs:12"}, "properties": {"repobilityId": "f7ca0e8351463c51", "scanner": "scanner-primary", "fingerprint": "d472a8cead21a324", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-ac8b00ac89fd0aaa", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/vton-poc-speed.ts:28"}, "properties": {"repobilityId": "95884146f702fca5", "scanner": "scanner-primary", "fingerprint": "ac8b00ac89fd0aaa", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-22859c945280cf39", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/vton-poc.ts:52"}, "properties": {"repobilityId": "f01b7bbf7043838b", "scanner": "scanner-primary", "fingerprint": "22859c945280cf39", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-9a9ea41360058ae7", "level": "none", "message": {"text": "Commented-code block (5 lines) in scripts/check-schema-drift.ts:158"}, "properties": {"repobilityId": "7cd08800a75284e7", "scanner": "scanner-primary", "fingerprint": "9a9ea41360058ae7", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-ad10ad3351eac134", "level": "none", "message": {"text": "Commented-code block (5 lines) in tools/wiki/lib/vault.ts:3"}, "properties": {"repobilityId": "5b60fabe6dbe8ad9", "scanner": "scanner-primary", "fingerprint": "ad10ad3351eac134", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-a30133f9c6bd5980", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 .claude/skills/gstack/scripts/resolvers/utility.ts:107"}, "properties": {"repobilityId": "a6886050ce834b4a", "scanner": "scanner-primary", "fingerprint": "a30133f9c6bd5980", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-cb39fe22e3f37194", "level": "none", "message": {"text": "Commented-code block (6 lines) in .claude/skills/gstack/scripts/resolvers/preamble.ts:707"}, "properties": {"repobilityId": "4ad5849464adf19a", "scanner": "scanner-primary", "fingerprint": "cb39fe22e3f37194", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-f7693123d4a4e8eb", "level": "none", "message": {"text": "Commented-code block (11 lines) in .claude/skills/gstack/scripts/resolvers/testing.ts:168"}, "properties": {"repobilityId": "5e07f46b3e45544d", "scanner": "scanner-primary", "fingerprint": "f7693123d4a4e8eb", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-f5e37e51bf3cb5a7", "level": "none", "message": {"text": "Commented-code block (5 lines) in .claude/skills/gstack/browse/src/server.ts:753"}, "properties": {"repobilityId": "38f6cba69ddf6295", "scanner": "scanner-primary", "fingerprint": "f5e37e51bf3cb5a7", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-aaadddae3ff96162", "level": "note", "message": {"text": "Legacy-named symbol `chrome_libsecret_os_crypt_password_v2` in .claude/skills/gstack/browse/src/cookie-import-browser.ts:519"}, "properties": {"repobilityId": "b4d375bda60a1bbe", "scanner": "scanner-primary", "fingerprint": "aaadddae3ff96162", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-7154822849909bd1", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 .claude/skills/gstack/browse/src/bun-polyfill.cjs:43"}, "properties": {"repobilityId": "1022c63c1b1221fb", "scanner": "scanner-primary", "fingerprint": "7154822849909bd1", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-3f7e7b4394f78744", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 .claude/skills/gstack/browse/src/write-commands.ts:974"}, "properties": {"repobilityId": "506e394bfa869139", "scanner": "scanner-primary", "fingerprint": "3f7e7b4394f78744", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-bac6eeaac6d33996", "level": "none", "message": {"text": "Commented-code block (5 lines) in .claude/skills/gstack/browse/src/token-registry.ts:32"}, "properties": {"repobilityId": "8d4687d3cdfd7e9f", "scanner": "scanner-primary", "fingerprint": "bac6eeaac6d33996", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-70d894f5a71a2363", "level": "none", "message": {"text": "Commented-code block (7 lines) in .claude/skills/gstack/browse/src/browser-manager.ts:342"}, "properties": {"repobilityId": "60d8b06449e1db69", "scanner": "scanner-primary", "fingerprint": "70d894f5a71a2363", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-e2871de5d097edad", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 .claude/skills/gstack/browse/test/welcome-page.test.ts:24"}, "properties": {"repobilityId": "9f5e6d24df25a1d7", "scanner": "scanner-primary", "fingerprint": "e2871de5d097edad", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-c124064aed130329", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 .claude/skills/gstack/browse/test/sidebar-integration.test.ts:4"}, "properties": {"repobilityId": "b5d722b4044026a9", "scanner": "scanner-primary", "fingerprint": "c124064aed130329", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-81b5f3aee8b69e74", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 .claude/skills/gstack/browse/test/bun-polyfill.test.ts:57"}, "properties": {"repobilityId": "e15215ea1465e104", "scanner": "scanner-primary", "fingerprint": "81b5f3aee8b69e74", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-49df02075cca691c", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 .claude/skills/gstack/browse/test/batch.test.ts:19"}, "properties": {"repobilityId": "8b9bb79ddf819701", "scanner": "scanner-primary", "fingerprint": "49df02075cca691c", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-076545e7650dd829", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 .claude/skills/gstack/browse/test/sidebar-agent-roundtrip.test.ts:31"}, "properties": {"repobilityId": "80fb2eea06519f25", "scanner": "scanner-primary", "fingerprint": "076545e7650dd829", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-aeffe193ee04c9b3", "level": "none", "message": {"text": "Commented-code block (5 lines) in .claude/skills/gstack/browse/test/sidebar-ux.test.ts:1332"}, "properties": {"repobilityId": "27a7609f6a1c178c", "scanner": "scanner-primary", "fingerprint": "aeffe193ee04c9b3", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-77f022cd5afbbff3", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 .claude/skills/gstack/browse/test/test-server.ts:15"}, "properties": {"repobilityId": "f9912f2dbecf5340", "scanner": "scanner-primary", "fingerprint": "77f022cd5afbbff3", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-42b535b6c6ad122f", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 .claude/skills/gstack/extension/background.js:445"}, "properties": {"repobilityId": "4477883ca8aaaf18", "scanner": "scanner-primary", "fingerprint": "42b535b6c6ad122f", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-583657014106b00b", "level": "none", "message": {"text": "Commented-code block (6 lines) in .claude/skills/gstack/supabase/functions/telemetry-ingest/index.ts:46"}, "properties": {"repobilityId": "87b127afae08e9d7", "scanner": "scanner-primary", "fingerprint": "583657014106b00b", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-142627a1c14db4e6", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 .claude/skills/gstack/design/prototype.ts:48"}, "properties": {"repobilityId": "88cf8e616480b017", "scanner": "scanner-primary", "fingerprint": "142627a1c14db4e6", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-12ecb67e5279127d", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 .claude/skills/gstack/design/src/serve.ts:69"}, "properties": {"repobilityId": "9a903262b2b0f16d", "scanner": "scanner-primary", "fingerprint": "12ecb67e5279127d", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-ee7e2bf77a1bf32b", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 .claude/skills/gstack/design/test/serve.test.ts:64"}, "properties": {"repobilityId": "286158c8459237aa", "scanner": "scanner-primary", "fingerprint": "ee7e2bf77a1bf32b", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-3ad1524903eea21b", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 .claude/skills/gstack/design/test/feedback-roundtrip.test.ts:7"}, "properties": {"repobilityId": "7d09b88b7eece6fa", "scanner": "scanner-primary", "fingerprint": "3ad1524903eea21b", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-954d3da8253bce13", "level": "none", "message": {"text": "Commented-code block (5 lines) in .claude/skills/gstack/test/gen-skill-docs.test.ts:2502"}, "properties": {"repobilityId": "9ab4f20518aa4260", "scanner": "scanner-primary", "fingerprint": "954d3da8253bce13", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-0dfc478d820787ba", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 .claude/skills/gstack/test/skill-e2e-plan.test.ts:307"}, "properties": {"repobilityId": "2bb60e46d6765360", "scanner": "scanner-primary", "fingerprint": "0dfc478d820787ba", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-3b064c9ac00cde7f", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 .claude/skills/gstack/test/skill-e2e.test.ts:1330"}, "properties": {"repobilityId": "77c667608f45e095", "scanner": "scanner-primary", "fingerprint": "3b064c9ac00cde7f", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-f34f42d2b3a8b3d5", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 .claude/skills/gstack/test/skill-e2e-qa-workflow.test.ts:209"}, "properties": {"repobilityId": "c6346037d79541c5", "scanner": "scanner-primary", "fingerprint": "f34f42d2b3a8b3d5", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-a7c4a2c99f9ede68", "level": "none", "message": {"text": "Commented-code block (5 lines) in .claude/skills/gstack/test/hook-scripts.test.ts:119"}, "properties": {"repobilityId": "0c7bcaafb2f4af1b", "scanner": "scanner-primary", "fingerprint": "a7c4a2c99f9ede68", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-6db4d60d25ec7aca", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 .claude/skills/gstack/test/skill-e2e-sidebar.test.ts:45"}, "properties": {"repobilityId": "16db7c9e3f0be1b5", "scanner": "scanner-primary", "fingerprint": "6db4d60d25ec7aca", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-500e3b7d9fe8faf0", "level": "note", "message": {"text": "76 env vars used in code but missing from .env.example"}, "properties": {"repobilityId": "12aca37ef2a6fb6e", "scanner": "scanner-primary", "fingerprint": "500e3b7d9fe8faf0", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "config-drift"]}}, {"ruleId": "scanner-2c04133e54348533", "level": "note", "message": {"text": "Near-duplicate function bodies in 2 places"}, "properties": {"repobilityId": "a07192bd08063583", "scanner": "scanner-primary", "fingerprint": "2c04133e54348533", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-be46ea126aa5d8dc", "level": "note", "message": {"text": "Near-duplicate function bodies in 3 places"}, "properties": {"repobilityId": "bdb0b7a6fded1359", "scanner": "scanner-primary", "fingerprint": "be46ea126aa5d8dc", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-2c04133e54348533", "level": "note", "message": {"text": "Near-duplicate function bodies in 2 places"}, "properties": {"repobilityId": "31657a8f2853d470", "scanner": "scanner-primary", "fingerprint": "2c04133e54348533", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-be46ea126aa5d8dc", "level": "note", "message": {"text": "Near-duplicate function bodies in 3 places"}, "properties": {"repobilityId": "e814290a8f7343fe", "scanner": "scanner-primary", "fingerprint": "be46ea126aa5d8dc", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-2c04133e54348533", "level": "note", "message": {"text": "Near-duplicate function bodies in 2 places"}, "properties": {"repobilityId": "6b0723518b176f81", "scanner": "scanner-primary", "fingerprint": "2c04133e54348533", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-2c04133e54348533", "level": "note", "message": {"text": "Near-duplicate function bodies in 2 places"}, "properties": {"repobilityId": "827a2ea4e73b902e", "scanner": "scanner-primary", "fingerprint": "2c04133e54348533", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-33a6b62e30ce7ab4", "level": "note", "message": {"text": "Near-duplicate function bodies in 6 places"}, "properties": {"repobilityId": "d241426faf795ec4", "scanner": "scanner-primary", "fingerprint": "33a6b62e30ce7ab4", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-2c04133e54348533", "level": "note", "message": {"text": "Near-duplicate function bodies in 2 places"}, "properties": {"repobilityId": "2da7530c896c3336", "scanner": "scanner-primary", "fingerprint": "2c04133e54348533", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-2c04133e54348533", "level": "note", "message": {"text": "Near-duplicate function bodies in 2 places"}, "properties": {"repobilityId": "eaf918caa7a4a7b9", "scanner": "scanner-primary", "fingerprint": "2c04133e54348533", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-2c04133e54348533", "level": "note", "message": {"text": "Near-duplicate function bodies in 2 places"}, "properties": {"repobilityId": "6ae61c2624551051", "scanner": "scanner-primary", "fingerprint": "2c04133e54348533", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-2c04133e54348533", "level": "note", "message": {"text": "Near-duplicate function bodies in 2 places"}, "properties": {"repobilityId": "1aea8a32719efc64", "scanner": "scanner-primary", "fingerprint": "2c04133e54348533", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-2c04133e54348533", "level": "note", "message": {"text": "Near-duplicate function bodies in 2 places"}, "properties": {"repobilityId": "49c4844545e30cc1", "scanner": "scanner-primary", "fingerprint": "2c04133e54348533", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-2c04133e54348533", "level": "note", "message": {"text": "Near-duplicate function bodies in 2 places"}, "properties": {"repobilityId": "d43ad1bfcbbb1612", "scanner": "scanner-primary", "fingerprint": "2c04133e54348533", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-2c04133e54348533", "level": "note", "message": {"text": "Near-duplicate function bodies in 2 places"}, "properties": {"repobilityId": "e7b38ea00eb0f4ae", "scanner": "scanner-primary", "fingerprint": "2c04133e54348533", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-2c04133e54348533", "level": "note", "message": {"text": "Near-duplicate function bodies in 2 places"}, "properties": {"repobilityId": "e4be1c582e2e57cd", "scanner": "scanner-primary", "fingerprint": "2c04133e54348533", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-2c04133e54348533", "level": "note", "message": {"text": "Near-duplicate function bodies in 2 places"}, "properties": {"repobilityId": "7ccfe9763f143bcb", "scanner": "scanner-primary", "fingerprint": "2c04133e54348533", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-2c04133e54348533", "level": "note", "message": {"text": "Near-duplicate function bodies in 2 places"}, "properties": {"repobilityId": "97ce86a09899ad56", "scanner": "scanner-primary", "fingerprint": "2c04133e54348533", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-2c04133e54348533", "level": "note", "message": {"text": "Near-duplicate function bodies in 2 places"}, "properties": {"repobilityId": "85e4feaf560b0d3d", "scanner": "scanner-primary", "fingerprint": "2c04133e54348533", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-2c04133e54348533", "level": "note", "message": {"text": "Near-duplicate function bodies in 2 places"}, "properties": {"repobilityId": "2809a3c7803739cf", "scanner": "scanner-primary", "fingerprint": "2c04133e54348533", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-2c04133e54348533", "level": "note", "message": {"text": "Near-duplicate function bodies in 2 places"}, "properties": {"repobilityId": "23b2fe9b526d0a72", "scanner": "scanner-primary", "fingerprint": "2c04133e54348533", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-eba13254ad3c9636", "level": "error", "message": {"text": "Dangling fetch: GET http://127.0.0.1:${port}/health (.claude/skills/gstack/extension/sidepanel.js:1553)"}, "properties": {"repobilityId": "fc9a241ed5b7277f", "scanner": "scanner-primary", "fingerprint": "eba13254ad3c9636", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-026d9559f7478ecd", "level": "error", "message": {"text": "Dangling fetch: GET https://www.pinterest.com/pin/${encodeURIComponent(pin)}/ (packages/web/app/api/admin/raw-post-sources/preview/route.ts:46)"}, "properties": {"repobilityId": "b7b532f6146a7de0", "scanner": "scanner-primary", "fingerprint": "026d9559f7478ecd", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-5193527fd821d516", "level": "error", "message": {"text": "Dangling fetch: GET https://www.instagram.com/p/${encodeURIComponent(shortcode)}/ (packages/web/app/api/admin/raw-post-sources/preview/route.ts:85)"}, "properties": {"repobilityId": "575ace475de64b4d", "scanner": "scanner-primary", "fingerprint": "5193527fd821d516", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-7e6a1accb5921105", "level": "error", "message": {"text": "Dangling fetch: GET /api/v1/content/posts/search?${params.toString()} (packages/web/app/admin/content-studio/PostPickerModal.tsx:52)"}, "properties": {"repobilityId": "da3001136dc71e53", "scanner": "scanner-primary", "fingerprint": "7e6a1accb5921105", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-245e1e85027f9f4e", "level": "error", "message": {"text": "Dangling fetch: POST /api/v1/posts/analyze (packages/web/tests/ai-pipeline.spec.ts:111)"}, "properties": {"repobilityId": "02896f5cff6fc1d3", "scanner": "scanner-primary", "fingerprint": "245e1e85027f9f4e", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-83ad65c7e67fe29e", "level": "error", "message": {"text": "Dangling fetch: POST /api/v1/posts (packages/web/lib/api/posts.ts:301)"}, "properties": {"repobilityId": "da0bd140ecab5aa7", "scanner": "scanner-primary", "fingerprint": "83ad65c7e67fe29e", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-87304c4eb1ff5203", "level": "error", "message": {"text": "Dangling fetch: POST /api/v1/posts/with-solutions (packages/web/lib/api/posts.ts:359)"}, "properties": {"repobilityId": "cc6baec0576ff2bb", "scanner": "scanner-primary", "fingerprint": "87304c4eb1ff5203", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-96a5a2b93790a68f", "level": "error", "message": {"text": "Dangling fetch: POST /api/v1/posts/try (packages/web/lib/api/posts.ts:534)"}, "properties": {"repobilityId": "f794655b114ec5ae", "scanner": "scanner-primary", "fingerprint": "96a5a2b93790a68f", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-2dfa03b7c0476768", "level": "error", "message": {"text": "Dangling fetch: POST /api/v1/vton (packages/web/lib/hooks/useVtonTryOn.ts:199)"}, "properties": {"repobilityId": "8441c562bfeac8c9", "scanner": "scanner-primary", "fingerprint": "2dfa03b7c0476768", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-1a7f0b4f01375c47", "level": "error", "message": {"text": "Dangling fetch: POST /api/v1/tries (packages/web/lib/hooks/useVtonTryOn.ts:243)"}, "properties": {"repobilityId": "25a63f479240e87d", "scanner": "scanner-primary", "fingerprint": "1a7f0b4f01375c47", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-cb26282e921619e9", "level": "error", "message": {"text": "Dangling fetch: GET /api/v1/vton/posts?${params} (packages/web/lib/hooks/useVtonPostFetch.ts:61)"}, "properties": {"repobilityId": "c2b0e4ebb244948c", "scanner": "scanner-primary", "fingerprint": "cb26282e921619e9", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-c7792ce662109a96", "level": "error", "message": {"text": "Dangling fetch: GET /api/v1/vton/posts?${params} (packages/web/lib/hooks/useVtonPostFetch.ts:93)"}, "properties": {"repobilityId": "94b2385d01635cc5", "scanner": "scanner-primary", "fingerprint": "c7792ce662109a96", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-657f5ed8f6cb526d", "level": "error", "message": {"text": "Dangling fetch: POST /api/v1/reports (packages/web/lib/hooks/useReport.ts:19)"}, "properties": {"repobilityId": "386f3b533e5267fa", "scanner": "scanner-primary", "fingerprint": "657f5ed8f6cb526d", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-9d64c7a84d7a7a31", "level": "error", "message": {"text": "Dangling fetch: GET /api/v1/vton/items?${params} (packages/web/lib/hooks/useVtonItemFetch.ts:64)"}, "properties": {"repobilityId": "aee0f2780058a5e1", "scanner": "scanner-primary", "fingerprint": "9d64c7a84d7a7a31", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-04c35d156797b1d7", "level": "error", "message": {"text": "Dangling fetch: POST /api/v1/post-magazines/generate (packages/web/lib/hooks/admin/useEditorialCandidates.ts:204)"}, "properties": {"repobilityId": "d927bddf10fa3839", "scanner": "scanner-primary", "fingerprint": "04c35d156797b1d7", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-a9afe3766cf7d6d8", "level": "error", "message": {"text": "Dangling fetch: GET /api/admin/editorial-pipeline/settings (packages/web/lib/hooks/admin/useEditorialPipelineSettings.ts:35)"}, "properties": {"repobilityId": "6d0bfd87d17bfe6d", "scanner": "scanner-primary", "fingerprint": "a9afe3766cf7d6d8", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-b0d30e94fafcd3b1", "level": "error", "message": {"text": "Dangling fetch: PATCH /api/admin/editorial-pipeline/settings (packages/web/lib/hooks/admin/useEditorialPipelineSettings.ts:58)"}, "properties": {"repobilityId": "6742e5e5cede0599", "scanner": "scanner-primary", "fingerprint": "b0d30e94fafcd3b1", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-dbd563a40f5436c1", "level": "error", "message": {"text": "Dangling fetch: PATCH /api/v1/admin/posts/${postId}/status (packages/web/lib/hooks/admin/useAdminPosts.ts:78)"}, "properties": {"repobilityId": "6d2509bc8c5b1750", "scanner": "scanner-primary", "fingerprint": "dbd563a40f5436c1", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-258bb470b9392d3c", "level": "error", "message": {"text": "Dangling fetch: PATCH /api/v1/admin/posts/magazines/${input.id}/status (packages/web/lib/hooks/admin/useUpdateMagazineStatus.ts:26)"}, "properties": {"repobilityId": "feb1fdeb3a9de8c6", "scanner": "scanner-primary", "fingerprint": "258bb470b9392d3c", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-c7375e95bb91f5d8", "level": "error", "message": {"text": "Dangling fetch: POST /api/admin/editorial-article-chat/sessions/${encodeURIComponent(articleId)} (packages/web/lib/hooks/admin/useEditorialChat.ts:88)"}, "properties": {"repobilityId": "ebcff0c2aa2c27f3", "scanner": "scanner-primary", "fingerprint": "c7375e95bb91f5d8", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-1192d2c9e4b7182f", "level": "error", "message": {"text": "Dangling fetch: POST /api/admin/editorial-article-chat/messages/${encodeURIComponent(sessionId)} (packages/web/lib/hooks/admin/useEditorialChat.ts:131)"}, "properties": {"repobilityId": "a952f135d1b3c5ce", "scanner": "scanner-primary", "fingerprint": "1192d2c9e4b7182f", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-3ee62d77e1441c6c", "level": "error", "message": {"text": "Dangling fetch: GET /api/v1/admin/posts/magazines?${qs} (packages/web/lib/hooks/admin/useAdminMagazineList.ts:35)"}, "properties": {"repobilityId": "55c8587528c47cb1", "scanner": "scanner-primary", "fingerprint": "3ee62d77e1441c6c", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-503f39c432349ec2", "level": "error", "message": {"text": "Dangling fetch: PATCH /api/v1/admin/reports/${reportId} (packages/web/lib/hooks/admin/useAdminReports.ts:76)"}, "properties": {"repobilityId": "1e1b323111444248", "scanner": "scanner-primary", "fingerprint": "503f39c432349ec2", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-f4df8500b2a8cd1f", "level": "error", "message": {"text": "Dangling fetch: GET /api/admin/verify-stats (packages/web/lib/hooks/admin/useVerifyStats.ts:45)"}, "properties": {"repobilityId": "59277879f305dd22", "scanner": "scanner-primary", "fingerprint": "f4df8500b2a8cd1f", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-fe244508ec807b57", "level": "error", "message": {"text": "Dangling fetch: GET /api/admin/editorial-articles?${sp.toString()} (packages/web/lib/hooks/admin/useEditorialArticles.ts:206)"}, "properties": {"repobilityId": "feaf4c1f10d77eff", "scanner": "scanner-primary", "fingerprint": "fe244508ec807b57", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-e733c8f44e59f24c", "level": "error", "message": {"text": "Dangling fetch: POST /api/admin/editorial-articles/${encodeURIComponent(id)}/regen-thumbnail (packages/web/lib/hooks/admin/useEditorialArticles.ts:253)"}, "properties": {"repobilityId": "f47383885b579603", "scanner": "scanner-primary", "fingerprint": "e733c8f44e59f24c", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-4e285a7114f21e98", "level": "error", "message": {"text": "Dangling fetch: POST /api/admin/editorial-articles/${encodeURIComponent(id)}/regen-ig-carousel (packages/web/lib/hooks/admin/useEditorialArticles.ts:288)"}, "properties": {"repobilityId": "960be86d04286c17", "scanner": "scanner-primary", "fingerprint": "4e285a7114f21e98", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-d72a11581c7b1ab1", "level": "error", "message": {"text": "Dangling fetch: PATCH /api/admin/editorial-articles/${encodeURIComponent(id)} (packages/web/lib/hooks/admin/useEditorialArticles.ts:320)"}, "properties": {"repobilityId": "02f78eab337d037c", "scanner": "scanner-primary", "fingerprint": "d72a11581c7b1ab1", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-df8bb38eb107fe35", "level": "error", "message": {"text": "Dangling fetch: DELETE /api/admin/editorial-articles/${encodeURIComponent(id)} (packages/web/lib/hooks/admin/useEditorialArticles.ts:369)"}, "properties": {"repobilityId": "a9f327bf915bf0a4", "scanner": "scanner-primary", "fingerprint": "df8bb38eb107fe35", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-73913f130a0701a8", "level": "error", "message": {"text": "Dangling fetch: GET /api/admin/editorial-discovery/settings (packages/web/lib/hooks/admin/useDiscoverySettings.ts:46)"}, "properties": {"repobilityId": "f05386042e8341af", "scanner": "scanner-primary", "fingerprint": "73913f130a0701a8", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-a7d77604beaf42d8", "level": "error", "message": {"text": "Dangling fetch: PATCH /api/admin/editorial-discovery/settings (packages/web/lib/hooks/admin/useDiscoverySettings.ts:67)"}, "properties": {"repobilityId": "16d71ff8edc4f549", "scanner": "scanner-primary", "fingerprint": "a7d77604beaf42d8", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-24d971b774ef489a", "level": "error", "message": {"text": "Dangling fetch: GET /api/admin/editorial-recommendations?${sp.toString()} (packages/web/lib/hooks/admin/useEditorialRecommendations.ts:74)"}, "properties": {"repobilityId": "26607f6fa36424b9", "scanner": "scanner-primary", "fingerprint": "24d971b774ef489a", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-d0c415ba4adbfdf1", "level": "error", "message": {"text": "Dangling fetch: GET /api/admin/editorial-recommendations?page=1&per_page=100 (packages/web/lib/hooks/admin/useEditorialRecommendations.ts:100)"}, "properties": {"repobilityId": "6b5473d236e8bb5b", "scanner": "scanner-primary", "fingerprint": "d0c415ba4adbfdf1", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-e42ce24bdd73b22f", "level": "error", "message": {"text": "Dangling fetch: PATCH /api/admin/editorial-recommendations/${encodeURIComponent(id)} (packages/web/lib/hooks/admin/useEditorialRecommendations.ts:122)"}, "properties": {"repobilityId": "41536cab680ba83f", "scanner": "scanner-primary", "fingerprint": "e42ce24bdd73b22f", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-fefffd7e21fbf4b7", "level": "error", "message": {"text": "Dangling fetch: DELETE /api/admin/editorial-recommendations/${encodeURIComponent(id)} (packages/web/lib/hooks/admin/useEditorialRecommendations.ts:149)"}, "properties": {"repobilityId": "b74b17dd96dbc414", "scanner": "scanner-primary", "fingerprint": "fefffd7e21fbf4b7", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-9418d8c9e3b058be", "level": "error", "message": {"text": "Dangling fetch: GET /api/v1/admin/monitoring/metrics (packages/web/lib/hooks/admin/useMonitoring.ts:14)"}, "properties": {"repobilityId": "d3d366194ac44e23", "scanner": "scanner-primary", "fingerprint": "9418d8c9e3b058be", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-39e7714d240e615c", "level": "error", "message": {"text": "Dangling fetch: PATCH /api/v1/admin/posts/${postId} (packages/web/lib/hooks/admin/useAdminPostEdit.ts:21)"}, "properties": {"repobilityId": "fe526844633cf80e", "scanner": "scanner-primary", "fingerprint": "39e7714d240e615c", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-89ae938db628670f", "level": "error", "message": {"text": "Dangling fetch: GET /api/auth/session (packages/web/lib/auth/client.ts:74)"}, "properties": {"repobilityId": "939ef86a122b883f", "scanner": "scanner-primary", "fingerprint": "89ae938db628670f", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:request"]}}, {"ruleId": "scanner-3770e50834112720", "level": "error", "message": {"text": "Dangling fetch: POST /api/auth/login (packages/web/lib/auth/client.ts:85)"}, "properties": {"repobilityId": "c94ad283c1b4306a", "scanner": "scanner-primary", "fingerprint": "3770e50834112720", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:request"]}}, {"ruleId": "scanner-474835f205a60825", "level": "error", "message": {"text": "Dangling fetch: POST /api/auth/oauth/start (packages/web/lib/auth/client.ts:100)"}, "properties": {"repobilityId": "c71e2abfd0afb86e", "scanner": "scanner-primary", "fingerprint": "474835f205a60825", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:request"]}}, {"ruleId": "scanner-424df6e7f241dae9", "level": "error", "message": {"text": "Dangling fetch: POST /api/auth/refresh (packages/web/lib/auth/client.ts:123)"}, "properties": {"repobilityId": "3587205bac4098ba", "scanner": "scanner-primary", "fingerprint": "424df6e7f241dae9", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:request"]}}, {"ruleId": "scanner-2a1be91965e090ac", "level": "error", "message": {"text": "Dangling fetch: DELETE /api/auth/session (packages/web/lib/components/admin/AdminSidebar.tsx:166)"}, "properties": {"repobilityId": "32d044d9296489a9", "scanner": "scanner-primary", "fingerprint": "2a1be91965e090ac", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-3797306c7a09aa8d", "level": "error", "message": {"text": "Dangling fetch: GET /api/v1/vton/posts?${params} (packages/web/lib/components/profile/ClosetGrid.tsx:63)"}, "properties": {"repobilityId": "94ec8cdfe78abcba", "scanner": "scanner-primary", "fingerprint": "3797306c7a09aa8d", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-0e077c7d087f98ff", "level": "error", "message": {"text": "Dangling fetch: GET /api/v1/vton/run (packages/web/lib/components/cody/__tests__/vton-separation.test.ts:62)"}, "properties": {"repobilityId": "45719911b72381ae", "scanner": "scanner-primary", "fingerprint": "0e077c7d087f98ff", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-e9a2a012bb3c9392", "level": "error", "message": {"text": "Dangling fetch: GET /video-jobs/${jobId} (packages/web/lib/content-studio/assets/video-persistence.ts:27)"}, "properties": {"repobilityId": "3e96c8d2497a5eea", "scanner": "scanner-primary", "fingerprint": "e9a2a012bb3c9392", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:request"]}}, {"ruleId": "scanner-c15ab3232540b0cf", "level": "error", "message": {"text": "Dangling fetch: POST /video-jobs (packages/web/lib/content-studio/assets/video-persistence.ts:37)"}, "properties": {"repobilityId": "7e1ff5181c7f884e", "scanner": "scanner-primary", "fingerprint": "c15ab3232540b0cf", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:request"]}}, {"ruleId": "scanner-6c559f91aef92a68", "level": "error", "message": {"text": "Dangling fetch: PUT /video-scenes/row (packages/web/lib/content-studio/assets/video-persistence.ts:44)"}, "properties": {"repobilityId": "6ebd92f92a118d33", "scanner": "scanner-primary", "fingerprint": "6c559f91aef92a68", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:request"]}}, {"ruleId": "scanner-b9a9cee1d3f01775", "level": "error", "message": {"text": "Dangling fetch: POST /assets/upload (packages/web/lib/content-studio/assets/video-persistence.ts:57)"}, "properties": {"repobilityId": "5fe29269978a1ba8", "scanner": "scanner-primary", "fingerprint": "b9a9cee1d3f01775", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "helper:request"]}}, {"ruleId": "scanner-8855f38607cecbd6", "level": "error", "message": {"text": "Dangling fetch: GET /api/... (.claude/skills/gstack/scripts/resolvers/utility.ts:107)"}, "properties": {"repobilityId": "f9481e3214327dfa", "scanner": "scanner-primary", "fingerprint": "8855f38607cecbd6", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-b4c59974cdb0c213", "level": "error", "message": {"text": "Dangling fetch: GET http://127.0.0.1:${port}/health (.claude/skills/gstack/browse/src/cli.ts:115)"}, "properties": {"repobilityId": "5390b5325fc4fc89", "scanner": "scanner-primary", "fingerprint": "b4c59974cdb0c213", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-9fabc3d6fc3bf6b3", "level": "error", "message": {"text": "Dangling fetch: POST http://127.0.0.1:${state.port}/command (.claude/skills/gstack/browse/src/cli.ts:377)"}, "properties": {"repobilityId": "2650f86dd99e4028", "scanner": "scanner-primary", "fingerprint": "9fabc3d6fc3bf6b3", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-7dbd897c5e4e8143", "level": "error", "message": {"text": "Dangling fetch: POST http://127.0.0.1:${state.port}/pair (.claude/skills/gstack/browse/src/cli.ts:586)"}, "properties": {"repobilityId": "f1998cbff0c44d1b", "scanner": "scanner-primary", "fingerprint": "7dbd897c5e4e8143", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-270a928b1cb578bc", "level": "error", "message": {"text": "Dangling fetch: POST http://127.0.0.1:${state.port}/tunnel/start (.claude/skills/gstack/browse/src/cli.ts:644)"}, "properties": {"repobilityId": "b959bcbda12a7c2a", "scanner": "scanner-primary", "fingerprint": "270a928b1cb578bc", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-31bc2c9df8471058", "level": "error", "message": {"text": "Dangling fetch: GET http://127.0.0.1:${existingState.port}/health (.claude/skills/gstack/browse/src/cli.ts:771)"}, "properties": {"repobilityId": "c804750016990018", "scanner": "scanner-primary", "fingerprint": "31bc2c9df8471058", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-21fe262697e4f860", "level": "error", "message": {"text": "Dangling fetch: POST http://127.0.0.1:${newState.port}/command (.claude/skills/gstack/browse/src/cli.ts:838)"}, "properties": {"repobilityId": "d2d20fbda3f29516", "scanner": "scanner-primary", "fingerprint": "21fe262697e4f860", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-ce6efb8671a1ba8f", "level": "error", "message": {"text": "Dangling fetch: POST http://127.0.0.1:${existingState.port}/command (.claude/skills/gstack/browse/src/cli.ts:919)"}, "properties": {"repobilityId": "06cfb2737dca895f", "scanner": "scanner-primary", "fingerprint": "ce6efb8671a1ba8f", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-65636dfac5aa441e", "level": "error", "message": {"text": "Dangling fetch: GET http://127.0.0.1:${serverPort}${pathname} (.claude/skills/gstack/browse/test/sidebar-integration.test.ts:29)"}, "properties": {"repobilityId": "9839ddfb175d3adb", "scanner": "scanner-primary", "fingerprint": "65636dfac5aa441e", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-27522bc50e5c6cbf", "level": "error", "message": {"text": "Dangling fetch: POST http://127.0.0.1:${serverPort}/batch (.claude/skills/gstack/browse/test/batch.test.ts:19)"}, "properties": {"repobilityId": "8a87ff4c78013ba1", "scanner": "scanner-primary", "fingerprint": "27522bc50e5c6cbf", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-ef949c44a51e964b", "level": "error", "message": {"text": "Dangling fetch: GET http://127.0.0.1:${serverPort}${pathname} (.claude/skills/gstack/browse/test/sidebar-agent-roundtrip.test.ts:31)"}, "properties": {"repobilityId": "b58e8e7aadf15cd1", "scanner": "scanner-primary", "fingerprint": "ef949c44a51e964b", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-7de026bddab11336", "level": "error", "message": {"text": "Dangling fetch: POST https://api.openai.com/v1/responses (.claude/skills/gstack/design/prototype.ts:48)"}, "properties": {"repobilityId": "cf197f865e7c3539", "scanner": "scanner-primary", "fingerprint": "7de026bddab11336", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-a01f5203f60b99e3", "level": "error", "message": {"text": "Dangling fetch: POST https://api.openai.com/v1/responses (.claude/skills/gstack/design/src/evolve.ts:58)"}, "properties": {"repobilityId": "729b752718be94ff", "scanner": "scanner-primary", "fingerprint": "a01f5203f60b99e3", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-1c5165668ced5756", "level": "error", "message": {"text": "Dangling fetch: POST https://api.openai.com/v1/chat/completions (.claude/skills/gstack/design/src/evolve.ts:116)"}, "properties": {"repobilityId": "e1d74120d3695dc5", "scanner": "scanner-primary", "fingerprint": "1c5165668ced5756", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-bf01965c4cac5d0f", "level": "error", "message": {"text": "Dangling fetch: POST https://api.openai.com/v1/chat/completions (.claude/skills/gstack/design/src/design-to-code.ts:40)"}, "properties": {"repobilityId": "035697dab52bafab", "scanner": "scanner-primary", "fingerprint": "bf01965c4cac5d0f", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-60fc239a8bcfc39e", "level": "error", "message": {"text": "Dangling fetch: POST https://api.openai.com/v1/responses (.claude/skills/gstack/design/src/generate.ts:43)"}, "properties": {"repobilityId": "05cc47bd8e419a1a", "scanner": "scanner-primary", "fingerprint": "60fc239a8bcfc39e", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-acd229f097d12b68", "level": "error", "message": {"text": "Dangling fetch: POST https://api.openai.com/v1/responses (.claude/skills/gstack/design/src/iterate.ts:88)"}, "properties": {"repobilityId": "30fd0337eaf53262", "scanner": "scanner-primary", "fingerprint": "acd229f097d12b68", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-349a02c16e56e3ae", "level": "error", "message": {"text": "Dangling fetch: POST https://api.openai.com/v1/responses (.claude/skills/gstack/design/src/iterate.ts:136)"}, "properties": {"repobilityId": "c3257b789f3c53b2", "scanner": "scanner-primary", "fingerprint": "349a02c16e56e3ae", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-b9fcf2a2cefeb693", "level": "error", "message": {"text": "Dangling fetch: POST https://api.openai.com/v1/chat/completions (.claude/skills/gstack/design/src/check.ts:25)"}, "properties": {"repobilityId": "b613376328ecbaf5", "scanner": "scanner-primary", "fingerprint": "b9fcf2a2cefeb693", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-5523f4cdcff0fe6b", "level": "error", "message": {"text": "Dangling fetch: POST https://api.openai.com/v1/responses (.claude/skills/gstack/design/src/variants.ts:57)"}, "properties": {"repobilityId": "b0b8c12356c2a0bb", "scanner": "scanner-primary", "fingerprint": "5523f4cdcff0fe6b", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-37c4cc7cb1d6118a", "level": "error", "message": {"text": "Dangling fetch: POST https://api.openai.com/v1/chat/completions (.claude/skills/gstack/design/src/memory.ts:37)"}, "properties": {"repobilityId": "1f79a39e902f77e3", "scanner": "scanner-primary", "fingerprint": "37c4cc7cb1d6118a", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-aadb335d616ed2cf", "level": "error", "message": {"text": "Dangling fetch: POST https://api.openai.com/v1/chat/completions (.claude/skills/gstack/design/src/diff.ts:31)"}, "properties": {"repobilityId": "9b0f5a01d5f61cfe", "scanner": "scanner-primary", "fingerprint": "aadb335d616ed2cf", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-89e6a823658bf8e0", "level": "error", "message": {"text": "Dangling fetch: GET /api/stats (.claude/skills/gstack/test/skill-e2e-plan.test.ts:307)"}, "properties": {"repobilityId": "fb4c92b07f54a65f", "scanner": "scanner-primary", "fingerprint": "89e6a823658bf8e0", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-8e5035737f1b0031", "level": "error", "message": {"text": "Dangling fetch: GET /api/stats (.claude/skills/gstack/test/skill-e2e.test.ts:1423)"}, "properties": {"repobilityId": "c8c3c3634d6c8ea3", "scanner": "scanner-primary", "fingerprint": "8e5035737f1b0031", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-ba2a6a84e92ab4f5", "level": "error", "message": {"text": "Dangling fetch: GET http://127.0.0.1:${serverPort}${pathname} (.claude/skills/gstack/test/skill-e2e-sidebar.test.ts:45)"}, "properties": {"repobilityId": "81d8ea37df62f748", "scanner": "scanner-primary", "fingerprint": "ba2a6a84e92ab4f5", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-19311267b6735ad0", "level": "error", "message": {"text": "Dangling fetch: GET http://127.0.0.1:${serverPort}${pathname} (.claude/skills/gstack/test/skill-e2e-sidebar.test.ts:178)"}, "properties": {"repobilityId": "8c88786bb0f14ab3", "scanner": "scanner-primary", "fingerprint": "19311267b6735ad0", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-81cf5c5ded425722", "level": "error", "message": {"text": "Dangling fetch: GET http://127.0.0.1:${serverPort}/health (.claude/skills/gstack/test/skill-e2e-sidebar.test.ts:225)"}, "properties": {"repobilityId": "bb5bddd6942c03f1", "scanner": "scanner-primary", "fingerprint": "81cf5c5ded425722", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-e235d593a2082879", "level": "error", "message": {"text": "Dangling fetch: GET http://127.0.0.1:${serverPort}${pathname} (.claude/skills/gstack/test/skill-e2e-sidebar.test.ts:363)"}, "properties": {"repobilityId": "2c55a2a5cc99457b", "scanner": "scanner-primary", "fingerprint": "e235d593a2082879", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-5baa8971ebe192a1", "level": "note", "message": {"text": "Unused endpoint: GET /"}, "properties": {"repobilityId": "fe87fe7913fc2ada", "scanner": "scanner-primary", "fingerprint": "5baa8971ebe192a1", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}]}]}