{"version": "2.1.0", "$schema": "https://json.schemastore.org/sarif-2.1.0.json", "runs": [{"tool": {"driver": {"name": "Repobility", "informationUri": "https://repobility.com", "rules": [{"id": "scanner-bead75b0f9233e05", "name": "No API endpoints detected", "shortDescription": {"text": "No API endpoints detected"}, "fullDescription": {"text": "The scanner did not find FastAPI/Flask/Express/NestJS/GraphQL/gRPC routes. If this repo exposes APIs, the framework may be unsupported."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "info", "confidence": 1.0}}, {"id": "scanner-b547f31910dd4e7b", "name": "`truncate` class without `title=` for hover reveal \u2014 app/page.tsx:329", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/page.tsx:329"}, "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-cab4c9964234883b", "name": "Stray `console.log` in TS/JS \u2014 app/api/webhook/line-events/route.ts:21", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 app/api/webhook/line-events/route.ts: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-f6b10faa2ce94bdf", "name": "Stray `console.log` in TS/JS \u2014 app/api/webhook/line-notify/route.ts:92", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 app/api/webhook/line-notify/route.ts:92"}, "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-97d42bb7503cc87f", "name": "Stray `console.log` in TS/JS \u2014 app/admin/daily/page.tsx:131", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 app/admin/daily/page.tsx:131"}, "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-44614d1f61a6e9b3", "name": "`truncate` class without `title=` for hover reveal \u2014 app/admin/sara/schema/page.tsx:86", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/admin/sara/schema/page.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-d6adc922dd53b49a", "name": "`truncate` class without `title=` for hover reveal \u2014 app/admin/orders/master/page.tsx:261", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/admin/orders/master/page.tsx:261"}, "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-574a0027ffca968b", "name": "`truncate` class without `title=` for hover reveal \u2014 app/admin/argoerp/material-prep/page.tsx:1597", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/admin/argoerp/material-prep/page.tsx:1597"}, "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-5f73098831b3fa4c", "name": "`truncate` class without `title=` for hover reveal \u2014 app/admin/argoerp/order-batch-export-c/page.tsx:666", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/admin/argoerp/order-batch-export-c/page.tsx:666"}, "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-6d674bd49fff3e6b", "name": "`truncate` class without `title=` for hover reveal \u2014 app/admin/argoerp/erp-sync/page.tsx:2009", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/admin/argoerp/erp-sync/page.tsx:2009"}, "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-57156a95ae421297", "name": "`truncate` class without `title=` for hover reveal \u2014 app/admin/argoerp/standalone-pr-create/page.tsx:640", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/admin/argoerp/standalone-pr-create/page.tsx:640"}, "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-7ee16bd1e0d6627d", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 app/admin/argoerp/mo-summary/print/page.tsx:737", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 app/admin/argoerp/mo-summary/print/page.tsx:737"}, "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-91a2955ce0bc3079", "name": "Stray `console.log` in TS/JS \u2014 app/admin/argoerp/order-batch-export/page.tsx:1186", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 app/admin/argoerp/order-batch-export/page.tsx:1186"}, "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-fbb0fdeb6cdcc299", "name": "`truncate` class without `title=` for hover reveal \u2014 app/admin/argoerp/daily-order-sheet/page.tsx:2060", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/admin/argoerp/daily-order-sheet/page.tsx:2060"}, "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-78bdcbb4b769a619", "name": "Icon-only button without accessible name \u2014 app/admin/production/anomaly/records/page.tsx:881", "shortDescription": {"text": "Icon-only button without accessible name \u2014 app/admin/production/anomaly/records/page.tsx:881"}, "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-91a02a23d4ca112b", "name": "Stray `console.log` in TS/JS \u2014 app/admin/materials/bom/page.tsx:225", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 app/admin/materials/bom/page.tsx:225"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-9ca17919853c285e", "name": "`truncate` class without `title=` for hover reveal \u2014 app/admin/history/conversion/page.tsx:465", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/admin/history/conversion/page.tsx:465"}, "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-7458358b31b08970", "name": "Stray `console.log` in TS/JS \u2014 app/admin/history/conversion/page.tsx:164", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 app/admin/history/conversion/page.tsx:164"}, "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-530b19dbca4e862a", "name": "`truncate` class without `title=` for hover reveal \u2014 app/tasks/page.tsx:432", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/tasks/page.tsx:432"}, "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-2c12097b8ba6627f", "name": "Stray `console.log` in TS/JS \u2014 app/tasks/page.tsx:124", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 app/tasks/page.tsx:124"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-92fc2226d1759fb4", "name": "`truncate` class without `title=` for hover reveal \u2014 app/material-issue/page.tsx:696", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/material-issue/page.tsx:696"}, "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-1aebdc9ec64be6ad", "name": "`truncate` class without `title=` for hover reveal \u2014 app/estimation/page.tsx:361", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/estimation/page.tsx:361"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-ce75cca3af54f3b7", "name": "Icon-only button without accessible name \u2014 app/info-board/order-records/page.tsx:136", "shortDescription": {"text": "Icon-only button without accessible name \u2014 app/info-board/order-records/page.tsx:136"}, "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-645e17bbba78f134", "name": "Stray `console.log` in TS/JS \u2014 context/FavoritesContext.tsx:34", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 context/FavoritesContext.tsx:34"}, "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-1a684f052532fe78", "name": "Icon-only button without accessible name \u2014 components/ProductionViewer.tsx:189", "shortDescription": {"text": "Icon-only button without accessible name \u2014 components/ProductionViewer.tsx:189"}, "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-e7f2c2a47e54af63", "name": "`truncate` class without `title=` for hover reveal \u2014 components/ProductionViewer.tsx:352", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/ProductionViewer.tsx:352"}, "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-3ae5f58c6ef75f69", "name": "`truncate` class without `title=` for hover reveal \u2014 components/TaskFloatingWidget.tsx:132", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/TaskFloatingWidget.tsx:132"}, "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-c0c0901c0e244976", "name": "Icon-only button without accessible name \u2014 components/ProductionScheduler.tsx:382", "shortDescription": {"text": "Icon-only button without accessible name \u2014 components/ProductionScheduler.tsx:382"}, "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-a863e9a1d2cd35f4", "name": "`truncate` class without `title=` for hover reveal \u2014 components/ProductionScheduler.tsx:542", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/ProductionScheduler.tsx:542"}, "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-788e69a8105f725c", "name": "Icon-only button without accessible name \u2014 components/OrderEditModal.tsx:492", "shortDescription": {"text": "Icon-only button without accessible name \u2014 components/OrderEditModal.tsx:492"}, "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-166dff3c3df6a10e", "name": "ORM models found but no DB engine detected", "shortDescription": {"text": "ORM models found but no DB engine detected"}, "fullDescription": {"text": "The repo defines tables/models but no DB connection string was found. Likely lives in env vars or a config file the scanner didn't read."}, "properties": {"scanner": "scanner-primary", "layer": "data", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-4315b501b046b95e", "name": "Insecure pattern 'local_storage_auth_token' in app/page.tsx:171", "shortDescription": {"text": "Insecure pattern 'local_storage_auth_token' in app/page.tsx:171"}, "fullDescription": {"text": "Found a known-risky pattern (local_storage_auth_token). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-13be4c7d319368eb", "name": "Insecure pattern 'document_write' in app/admin/argoerp/erp-sync/page.tsx:858", "shortDescription": {"text": "Insecure pattern 'document_write' in app/admin/argoerp/erp-sync/page.tsx:858"}, "fullDescription": {"text": "Found a known-risky pattern (document_write). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "low", "confidence": 1.0}}, {"id": "scanner-19d70547b83f56d0", "name": "Insecure pattern 'dangerous_innerhtml' in app/admin/argoerp/mo-summary/print/page.tsx:737", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in app/admin/argoerp/mo-summary/print/page.tsx:737"}, "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-07230b88f1f3e339", "name": "Very large file: app/page.tsx (987 lines)", "shortDescription": {"text": "Very large file: app/page.tsx (987 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-dd9f37bf7527a694", "name": "Very large file: app/api/argoerp/route.ts (1884 lines)", "shortDescription": {"text": "Very large file: app/api/argoerp/route.ts (1884 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-40615dbb6e4f9f14", "name": "Very large file: app/admin/argoerp/material-prep/page.tsx (2233 lines)", "shortDescription": {"text": "Very large file: app/admin/argoerp/material-prep/page.tsx (2233 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-9cc5db17e13127b7", "name": "Very large file: app/admin/argoerp/order-batch-export-c/page.tsx (946 lines)", "shortDescription": {"text": "Very large file: app/admin/argoerp/order-batch-export-c/page.tsx (946 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-990188933f75e173", "name": "Very large file: app/admin/argoerp/erp-sync/page.tsx (2557 lines)", "shortDescription": {"text": "Very large file: app/admin/argoerp/erp-sync/page.tsx (2557 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-a7a7cee8cec6c24f", "name": "Very large file: app/admin/argoerp/mo-summary/print/page.tsx (1203 lines)", "shortDescription": {"text": "Very large file: app/admin/argoerp/mo-summary/print/page.tsx (1203 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-46ae736997f0efac", "name": "Very large file: app/admin/argoerp/_shared/FactoryOrderExportPage.tsx (1277 lines)", "shortDescription": {"text": "Very large file: app/admin/argoerp/_shared/FactoryOrderExportPage.tsx (1277 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-0bf2dc75c8f90bb1", "name": "Very large file: app/admin/argoerp/order-batch-export/page.tsx (2597 lines)", "shortDescription": {"text": "Very large file: app/admin/argoerp/order-batch-export/page.tsx (2597 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-f53acb78d541d379", "name": "Very large file: app/admin/argoerp/ng-material-prep/page.tsx (1173 lines)", "shortDescription": {"text": "Very large file: app/admin/argoerp/ng-material-prep/page.tsx (1173 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-eee2d36e47611ce6", "name": "Very large file: app/admin/argoerp/order-batch-export-o/page.tsx (1026 lines)", "shortDescription": {"text": "Very large file: app/admin/argoerp/order-batch-export-o/page.tsx (1026 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-b023008e20ceb53c", "name": "Very large file: app/admin/argoerp/daily-order-sheet/page.tsx (2802 lines)", "shortDescription": {"text": "Very large file: app/admin/argoerp/daily-order-sheet/page.tsx (2802 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-9c334d61010cd940", "name": "Very large file: app/admin/production/anomaly/records/page.tsx (1558 lines)", "shortDescription": {"text": "Very large file: app/admin/production/anomaly/records/page.tsx (1558 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-399595365ec89a5c", "name": "Very large file: components/ProductionScheduler.tsx (911 lines)", "shortDescription": {"text": "Very large file: components/ProductionScheduler.tsx (911 lines)"}, "fullDescription": {"text": "Files with >800 lines often hide complexity hotspots and discourage tests."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-6893a6c8b0861585", "name": "Very low test-to-source ratio", "shortDescription": {"text": "Very low test-to-source ratio"}, "fullDescription": {"text": "1 test file(s) for 147 source file(s) (ratio 0.01). Consider adding integration or unit tests for critical paths."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-141b30a41e03817b", "name": "No license file detected", "shortDescription": {"text": "No license file detected"}, "fullDescription": {"text": "No LICENSE/COPYING/NOTICE file was found. Generated repositories often omit licensing, which blocks reuse and automated intake."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-3ab5d313dda8e5f9", "name": "Debug logging residue appears in source files", "shortDescription": {"text": "Debug logging residue appears in source files"}, "fullDescription": {"text": "Found 24 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 211 placeholder/mock markers across 52 source files. This often means the repo looks complete while core flows still use generated scaffolding or fake data."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-2d0c7b7ab8f8aacf", "name": "Critical user flow still appears backed by mock or placeholder data", "shortDescription": {"text": "Critical user flow still appears backed by mock or placeholder data"}, "fullDescription": {"text": "A payment/auth/admin/order/billing-style flow contains mock, fake, TODO, dummy, or placeholder markers in runtime source. In the Fable corpus this is a high-leverage completeness smell: the app can look finished while the money, identity, or tenant flow is still scaffolded."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-b9088664ace7f748", "name": "Composite production-readiness gap", "shortDescription": {"text": "Composite production-readiness gap"}, "fullDescription": {"text": "Multiple low-cost hardening controls are missing together: license, ci, tests. Opus verification showed these co-occurring gaps are a better readiness signal than reading each flag in isolation."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-375260f5982ef2fd", "name": "`fetch()` without try/.catch or AbortSignal \u2014 app/api/ocr/route.ts:82", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/api/ocr/route.ts:82"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-535d9adc0de8b6fd", "name": "`fetch()` without try/.catch or AbortSignal \u2014 app/api/argoerp/route.ts:264", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/api/argoerp/route.ts:264"}, "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-cfaa421e37181790", "name": "Commented-code block (6 lines) in app/api/argoerp/mo-summary/route.ts:79", "shortDescription": {"text": "Commented-code block (6 lines) in app/api/argoerp/mo-summary/route.ts:79"}, "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-f39db4ce555e0fc5", "name": "`fetch()` without try/.catch or AbortSignal \u2014 app/api/webhook/sync/route.ts:39", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/api/webhook/sync/route.ts:39"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-5f9b17dddc1eb7ce", "name": "`fetch()` without try/.catch or AbortSignal \u2014 app/api/webhook/line-notify/route.ts:77", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/api/webhook/line-notify/route.ts:77"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-0753286ad73baaa7", "name": "`fetch()` without try/.catch or AbortSignal \u2014 app/admin/argoerp/group-order-export/page.tsx:202", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/admin/argoerp/group-order-export/page.tsx:202"}, "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-eb994c79416017e9", "name": "Legacy-named symbol `argoerp_pr_o_header_v1` in app/admin/argoerp/order-batch-export-pr/page.tsx:46", "shortDescription": {"text": "Legacy-named symbol `argoerp_pr_o_header_v1` in app/admin/argoerp/order-batch-export-pr/page.tsx:46"}, "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-b09c54c97773263c", "name": "`fetch()` without try/.catch or AbortSignal \u2014 app/admin/argoerp/material-prep/page.tsx:1054", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/admin/argoerp/material-prep/page.tsx:1054"}, "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-55e24ac4ff54513c", "name": "Legacy-named symbol `argoerp_po_c_header_v1` in app/admin/argoerp/order-batch-export-c/page.tsx:65", "shortDescription": {"text": "Legacy-named symbol `argoerp_po_c_header_v1` in app/admin/argoerp/order-batch-export-c/page.tsx:65"}, "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-5a838f443ec1535c", "name": "`fetch()` without try/.catch or AbortSignal \u2014 app/admin/argoerp/order-batch-export-c/page.tsx:376", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/admin/argoerp/order-batch-export-c/page.tsx:376"}, "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-38dcfee4b1e1f9d2", "name": "`fetch()` without try/.catch or AbortSignal \u2014 app/admin/argoerp/staging/page.tsx:107", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/admin/argoerp/staging/page.tsx: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-70cdb41769c2e1ca", "name": "Commented-code block (7 lines) in app/admin/argoerp/crm-cross/page.tsx:7", "shortDescription": {"text": "Commented-code block (7 lines) in app/admin/argoerp/crm-cross/page.tsx:7"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-652667a472e26c6c", "name": "`fetch()` without try/.catch or AbortSignal \u2014 app/admin/argoerp/erp-sync/page.tsx:1175", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/admin/argoerp/erp-sync/page.tsx:1175"}, "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-4c1ab2b52d4641f1", "name": "`fetch()` without try/.catch or AbortSignal \u2014 app/admin/argoerp/erp-db/ErpDbTable.tsx:231", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/admin/argoerp/erp-db/ErpDbTable.tsx:231"}, "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-1d2bdc0b197031d7", "name": "Legacy-named symbol `argoerp_standalone_pr_header_v1` in app/admin/argoerp/standalone-pr-create/page.tsx:38", "shortDescription": {"text": "Legacy-named symbol `argoerp_standalone_pr_header_v1` in app/admin/argoerp/standalone-pr-create/page.tsx:38"}, "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-ade8c28674c17cb5", "name": "`fetch()` without try/.catch or AbortSignal \u2014 app/admin/argoerp/mo-summary/page.tsx:77", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/admin/argoerp/mo-summary/page.tsx:77"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-f9469cf3b7d22111", "name": "`fetch()` without try/.catch or AbortSignal \u2014 app/admin/argoerp/_shared/FactoryOrderExportPage.tsx:553", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/admin/argoerp/_shared/FactoryOrderExportPage.tsx:553"}, "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-67751990b412e04e", "name": "`fetch()` without try/.catch or AbortSignal \u2014 app/admin/argoerp/order-batch-export/page.tsx:777", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/admin/argoerp/order-batch-export/page.tsx:777"}, "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-e0984fb8b02f0ea8", "name": "`fetch()` without try/.catch or AbortSignal \u2014 app/admin/argoerp/ng-material-prep/page.tsx:670", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/admin/argoerp/ng-material-prep/page.tsx:670"}, "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-ee5b8fcff1bdc0d7", "name": "Legacy-named symbol `argoerp_po_o_header_v1` in app/admin/argoerp/order-batch-export-o/page.tsx:67", "shortDescription": {"text": "Legacy-named symbol `argoerp_po_o_header_v1` in app/admin/argoerp/order-batch-export-o/page.tsx:67"}, "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-06b426558306a194", "name": "`fetch()` without try/.catch or AbortSignal \u2014 app/admin/argoerp/order-batch-export-o/page.tsx:411", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/admin/argoerp/order-batch-export-o/page.tsx:411"}, "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-e0aba6b19b8ffc30", "name": "`fetch()` without try/.catch or AbortSignal \u2014 app/admin/argoerp/daily-order-sheet/page.tsx:512", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/admin/argoerp/daily-order-sheet/page.tsx:512"}, "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-c6ac393e5833adf8", "name": "`fetch()` without try/.catch or AbortSignal \u2014 app/material-issue/page.tsx:255", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/material-issue/page.tsx:255"}, "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-77720600a2d1ffe8", "name": "Legacy-named symbol `argoerp_inventory_sync_config_v1` in components/InventorySyncPanel.tsx:33", "shortDescription": {"text": "Legacy-named symbol `argoerp_inventory_sync_config_v1` in components/InventorySyncPanel.tsx:33"}, "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-fa4e5412fcdf074a", "name": "`fetch()` without try/.catch or AbortSignal \u2014 lib/saraClient.ts:79", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 lib/saraClient.ts:79"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}]}}, "automationDetails": {"id": "repobility/24485"}, "properties": {"repository": "bardshop10149-dev/bardshop-factory-os", "repoUrl": "https://github.com/bardshop10149-dev/bardshop-factory-os", "branch": "main"}, "results": [{"ruleId": "scanner-bead75b0f9233e05", "level": "none", "message": {"text": "No API endpoints detected"}, "properties": {"repobilityId": "0f8bb852027c38f8", "scanner": "scanner-primary", "fingerprint": "bead75b0f9233e05", "layer": "api", "severity": "info", "confidence": 1.0, "tags": ["coverage"]}}, {"ruleId": "scanner-b547f31910dd4e7b", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/page.tsx:329"}, "properties": {"repobilityId": "2a6638282026d4f9", "scanner": "scanner-primary", "fingerprint": "b547f31910dd4e7b", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-cab4c9964234883b", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 app/api/webhook/line-events/route.ts:21"}, "properties": {"repobilityId": "d41e513de04e0625", "scanner": "scanner-primary", "fingerprint": "cab4c9964234883b", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-f6b10faa2ce94bdf", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 app/api/webhook/line-notify/route.ts:92"}, "properties": {"repobilityId": "19404de893a26f2b", "scanner": "scanner-primary", "fingerprint": "f6b10faa2ce94bdf", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-97d42bb7503cc87f", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 app/admin/daily/page.tsx:131"}, "properties": {"repobilityId": "84c2099d2e8e86de", "scanner": "scanner-primary", "fingerprint": "97d42bb7503cc87f", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-44614d1f61a6e9b3", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/admin/sara/schema/page.tsx:86"}, "properties": {"repobilityId": "dae54c25ba3f6e07", "scanner": "scanner-primary", "fingerprint": "44614d1f61a6e9b3", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-d6adc922dd53b49a", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/admin/orders/master/page.tsx:261"}, "properties": {"repobilityId": "783cb084660b21ba", "scanner": "scanner-primary", "fingerprint": "d6adc922dd53b49a", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-574a0027ffca968b", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/admin/argoerp/material-prep/page.tsx:1597"}, "properties": {"repobilityId": "3f3356d6c1e9f1d3", "scanner": "scanner-primary", "fingerprint": "574a0027ffca968b", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-5f73098831b3fa4c", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/admin/argoerp/order-batch-export-c/page.tsx:666"}, "properties": {"repobilityId": "62939108d52204a6", "scanner": "scanner-primary", "fingerprint": "5f73098831b3fa4c", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-6d674bd49fff3e6b", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/admin/argoerp/erp-sync/page.tsx:2009"}, "properties": {"repobilityId": "20c5a45d7c1febb1", "scanner": "scanner-primary", "fingerprint": "6d674bd49fff3e6b", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-57156a95ae421297", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/admin/argoerp/standalone-pr-create/page.tsx:640"}, "properties": {"repobilityId": "fefff0676e4d7bf0", "scanner": "scanner-primary", "fingerprint": "57156a95ae421297", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-7ee16bd1e0d6627d", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 app/admin/argoerp/mo-summary/print/page.tsx:737"}, "properties": {"repobilityId": "e707f9ef78ca14f4", "scanner": "scanner-primary", "fingerprint": "7ee16bd1e0d6627d", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-91a2955ce0bc3079", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 app/admin/argoerp/order-batch-export/page.tsx:1186"}, "properties": {"repobilityId": "fdbccd9022bc51bf", "scanner": "scanner-primary", "fingerprint": "91a2955ce0bc3079", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-fbb0fdeb6cdcc299", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/admin/argoerp/daily-order-sheet/page.tsx:2060"}, "properties": {"repobilityId": "7d662161d58ff02b", "scanner": "scanner-primary", "fingerprint": "fbb0fdeb6cdcc299", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-78bdcbb4b769a619", "level": "note", "message": {"text": "Icon-only button without accessible name \u2014 app/admin/production/anomaly/records/page.tsx:881"}, "properties": {"repobilityId": "8b0198a728e0be0e", "scanner": "scanner-primary", "fingerprint": "78bdcbb4b769a619", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.button.no-label"]}}, {"ruleId": "scanner-91a02a23d4ca112b", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 app/admin/materials/bom/page.tsx:225"}, "properties": {"repobilityId": "31c36d659735f0a3", "scanner": "scanner-primary", "fingerprint": "91a02a23d4ca112b", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-9ca17919853c285e", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/admin/history/conversion/page.tsx:465"}, "properties": {"repobilityId": "e7fa266263c5a942", "scanner": "scanner-primary", "fingerprint": "9ca17919853c285e", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-7458358b31b08970", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 app/admin/history/conversion/page.tsx:164"}, "properties": {"repobilityId": "b80bd1cc8c406305", "scanner": "scanner-primary", "fingerprint": "7458358b31b08970", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-530b19dbca4e862a", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/tasks/page.tsx:432"}, "properties": {"repobilityId": "432bf5e0765e82c1", "scanner": "scanner-primary", "fingerprint": "530b19dbca4e862a", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-2c12097b8ba6627f", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 app/tasks/page.tsx:124"}, "properties": {"repobilityId": "8fd18eb8c601301b", "scanner": "scanner-primary", "fingerprint": "2c12097b8ba6627f", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-92fc2226d1759fb4", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/material-issue/page.tsx:696"}, "properties": {"repobilityId": "b8ab9d71e5e61cf9", "scanner": "scanner-primary", "fingerprint": "92fc2226d1759fb4", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-1aebdc9ec64be6ad", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/estimation/page.tsx:361"}, "properties": {"repobilityId": "0140af1a9e588043", "scanner": "scanner-primary", "fingerprint": "1aebdc9ec64be6ad", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-ce75cca3af54f3b7", "level": "note", "message": {"text": "Icon-only button without accessible name \u2014 app/info-board/order-records/page.tsx:136"}, "properties": {"repobilityId": "c0a65b8d2b7e6495", "scanner": "scanner-primary", "fingerprint": "ce75cca3af54f3b7", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.button.no-label"]}}, {"ruleId": "scanner-645e17bbba78f134", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 context/FavoritesContext.tsx:34"}, "properties": {"repobilityId": "0e28a8319f186dfe", "scanner": "scanner-primary", "fingerprint": "645e17bbba78f134", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-1a684f052532fe78", "level": "note", "message": {"text": "Icon-only button without accessible name \u2014 components/ProductionViewer.tsx:189"}, "properties": {"repobilityId": "b017fc42687b569a", "scanner": "scanner-primary", "fingerprint": "1a684f052532fe78", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.button.no-label"]}}, {"ruleId": "scanner-e7f2c2a47e54af63", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/ProductionViewer.tsx:352"}, "properties": {"repobilityId": "52f3cc12486f501a", "scanner": "scanner-primary", "fingerprint": "e7f2c2a47e54af63", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-3ae5f58c6ef75f69", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/TaskFloatingWidget.tsx:132"}, "properties": {"repobilityId": "129d7fe760f7bb37", "scanner": "scanner-primary", "fingerprint": "3ae5f58c6ef75f69", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-c0c0901c0e244976", "level": "note", "message": {"text": "Icon-only button without accessible name \u2014 components/ProductionScheduler.tsx:382"}, "properties": {"repobilityId": "7d341fa002265c47", "scanner": "scanner-primary", "fingerprint": "c0c0901c0e244976", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.button.no-label"]}}, {"ruleId": "scanner-a863e9a1d2cd35f4", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/ProductionScheduler.tsx:542"}, "properties": {"repobilityId": "de33c5538b9e04de", "scanner": "scanner-primary", "fingerprint": "a863e9a1d2cd35f4", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-788e69a8105f725c", "level": "note", "message": {"text": "Icon-only button without accessible name \u2014 components/OrderEditModal.tsx:492"}, "properties": {"repobilityId": "491c4a6ab3e5a8dc", "scanner": "scanner-primary", "fingerprint": "788e69a8105f725c", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.button.no-label"]}}, {"ruleId": "scanner-166dff3c3df6a10e", "level": "warning", "message": {"text": "ORM models found but no DB engine detected"}, "properties": {"repobilityId": "cda36de65e114635", "scanner": "scanner-primary", "fingerprint": "166dff3c3df6a10e", "layer": "data", "severity": "medium", "confidence": 1.0, "tags": ["coverage"]}}, {"ruleId": "scanner-4315b501b046b95e", "level": "warning", "message": {"text": "Insecure pattern 'local_storage_auth_token' in app/page.tsx:171"}, "properties": {"repobilityId": "6712d1594a2cabd2", "scanner": "scanner-primary", "fingerprint": "4315b501b046b95e", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "local_storage_auth_token"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "app/page.tsx"}, "region": {"startLine": 171}}}]}, {"ruleId": "scanner-13be4c7d319368eb", "level": "note", "message": {"text": "Insecure pattern 'document_write' in app/admin/argoerp/erp-sync/page.tsx:858"}, "properties": {"repobilityId": "7150d0e08114d61a", "scanner": "scanner-primary", "fingerprint": "13be4c7d319368eb", "layer": "security", "severity": "low", "confidence": 1.0, "tags": ["owasp", "document_write"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "app/admin/argoerp/erp-sync/page.tsx"}, "region": {"startLine": 858}}}]}, {"ruleId": "scanner-19d70547b83f56d0", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in app/admin/argoerp/mo-summary/print/page.tsx:737"}, "properties": {"repobilityId": "9a03d8f592ffa839", "scanner": "scanner-primary", "fingerprint": "19d70547b83f56d0", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "app/admin/argoerp/mo-summary/print/page.tsx"}, "region": {"startLine": 737}}}]}, {"ruleId": "scanner-07230b88f1f3e339", "level": "note", "message": {"text": "Very large file: app/page.tsx (987 lines)"}, "properties": {"repobilityId": "5e5eaf124a1a5246", "scanner": "scanner-primary", "fingerprint": "07230b88f1f3e339", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-dd9f37bf7527a694", "level": "note", "message": {"text": "Very large file: app/api/argoerp/route.ts (1884 lines)"}, "properties": {"repobilityId": "b34d1bbb0b52170f", "scanner": "scanner-primary", "fingerprint": "dd9f37bf7527a694", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-40615dbb6e4f9f14", "level": "note", "message": {"text": "Very large file: app/admin/argoerp/material-prep/page.tsx (2233 lines)"}, "properties": {"repobilityId": "4ff1ba5a6599a871", "scanner": "scanner-primary", "fingerprint": "40615dbb6e4f9f14", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-9cc5db17e13127b7", "level": "note", "message": {"text": "Very large file: app/admin/argoerp/order-batch-export-c/page.tsx (946 lines)"}, "properties": {"repobilityId": "9742431a16d27b8c", "scanner": "scanner-primary", "fingerprint": "9cc5db17e13127b7", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-990188933f75e173", "level": "note", "message": {"text": "Very large file: app/admin/argoerp/erp-sync/page.tsx (2557 lines)"}, "properties": {"repobilityId": "d49816a8ceda8d8d", "scanner": "scanner-primary", "fingerprint": "990188933f75e173", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-a7a7cee8cec6c24f", "level": "note", "message": {"text": "Very large file: app/admin/argoerp/mo-summary/print/page.tsx (1203 lines)"}, "properties": {"repobilityId": "c14c4c199c4f759a", "scanner": "scanner-primary", "fingerprint": "a7a7cee8cec6c24f", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-46ae736997f0efac", "level": "note", "message": {"text": "Very large file: app/admin/argoerp/_shared/FactoryOrderExportPage.tsx (1277 lines)"}, "properties": {"repobilityId": "1a52070bbf07c0c7", "scanner": "scanner-primary", "fingerprint": "46ae736997f0efac", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-0bf2dc75c8f90bb1", "level": "note", "message": {"text": "Very large file: app/admin/argoerp/order-batch-export/page.tsx (2597 lines)"}, "properties": {"repobilityId": "ff3f4cff90fe0184", "scanner": "scanner-primary", "fingerprint": "0bf2dc75c8f90bb1", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-f53acb78d541d379", "level": "note", "message": {"text": "Very large file: app/admin/argoerp/ng-material-prep/page.tsx (1173 lines)"}, "properties": {"repobilityId": "0f1ef0623ac046d0", "scanner": "scanner-primary", "fingerprint": "f53acb78d541d379", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-eee2d36e47611ce6", "level": "note", "message": {"text": "Very large file: app/admin/argoerp/order-batch-export-o/page.tsx (1026 lines)"}, "properties": {"repobilityId": "e29f6e6c8568d90e", "scanner": "scanner-primary", "fingerprint": "eee2d36e47611ce6", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-b023008e20ceb53c", "level": "note", "message": {"text": "Very large file: app/admin/argoerp/daily-order-sheet/page.tsx (2802 lines)"}, "properties": {"repobilityId": "503f08d1f9b0073b", "scanner": "scanner-primary", "fingerprint": "b023008e20ceb53c", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-9c334d61010cd940", "level": "note", "message": {"text": "Very large file: app/admin/production/anomaly/records/page.tsx (1558 lines)"}, "properties": {"repobilityId": "cc4d1c6c852e5e6e", "scanner": "scanner-primary", "fingerprint": "9c334d61010cd940", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-399595365ec89a5c", "level": "note", "message": {"text": "Very large file: components/ProductionScheduler.tsx (911 lines)"}, "properties": {"repobilityId": "5ae6250dd013e463", "scanner": "scanner-primary", "fingerprint": "399595365ec89a5c", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-6893a6c8b0861585", "level": "warning", "message": {"text": "Very low test-to-source ratio"}, "properties": {"repobilityId": "54a7de3f06314bf0", "scanner": "scanner-primary", "fingerprint": "6893a6c8b0861585", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["tests", "coverage"]}}, {"ruleId": "scanner-141b30a41e03817b", "level": "note", "message": {"text": "No license file detected"}, "properties": {"repobilityId": "9461e13466f5ce63", "scanner": "scanner-primary", "fingerprint": "141b30a41e03817b", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["license", "repo-hardening", "generated-repo-pattern"]}}, {"ruleId": "scanner-3ab5d313dda8e5f9", "level": "note", "message": {"text": "Debug logging residue appears in source files"}, "properties": {"repobilityId": "4377e638e29cd0a3", "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": "46c6610fec4f3fb1", "scanner": "scanner-primary", "fingerprint": "72b2a6250083a784", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["placeholder", "mock-data", "incomplete", "generated-repo-pattern"]}}, {"ruleId": "scanner-2d0c7b7ab8f8aacf", "level": "warning", "message": {"text": "Critical user flow still appears backed by mock or placeholder data"}, "properties": {"repobilityId": "f1c16c784732fd8b", "scanner": "scanner-primary", "fingerprint": "2d0c7b7ab8f8aacf", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["placeholder", "mock-data", "critical-flow", "generated-repo-pattern"]}}, {"ruleId": "scanner-b9088664ace7f748", "level": "warning", "message": {"text": "Composite production-readiness gap"}, "properties": {"repobilityId": "577a4343c089cd32", "scanner": "scanner-primary", "fingerprint": "b9088664ace7f748", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["production-readiness", "repo-hardening", "generated-repo-pattern"]}}, {"ruleId": "scanner-375260f5982ef2fd", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/api/ocr/route.ts:82"}, "properties": {"repobilityId": "4dcd95df207ad968", "scanner": "scanner-primary", "fingerprint": "375260f5982ef2fd", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-535d9adc0de8b6fd", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/api/argoerp/route.ts:264"}, "properties": {"repobilityId": "935af99ec1e3eed7", "scanner": "scanner-primary", "fingerprint": "535d9adc0de8b6fd", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-cfaa421e37181790", "level": "none", "message": {"text": "Commented-code block (6 lines) in app/api/argoerp/mo-summary/route.ts:79"}, "properties": {"repobilityId": "ff88272efa73e275", "scanner": "scanner-primary", "fingerprint": "cfaa421e37181790", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-f39db4ce555e0fc5", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/api/webhook/sync/route.ts:39"}, "properties": {"repobilityId": "715c1f21d108b859", "scanner": "scanner-primary", "fingerprint": "f39db4ce555e0fc5", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-5f9b17dddc1eb7ce", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/api/webhook/line-notify/route.ts:77"}, "properties": {"repobilityId": "2416b6c368391469", "scanner": "scanner-primary", "fingerprint": "5f9b17dddc1eb7ce", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-0753286ad73baaa7", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/admin/argoerp/group-order-export/page.tsx:202"}, "properties": {"repobilityId": "89ae621f08b72dc4", "scanner": "scanner-primary", "fingerprint": "0753286ad73baaa7", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-eb994c79416017e9", "level": "note", "message": {"text": "Legacy-named symbol `argoerp_pr_o_header_v1` in app/admin/argoerp/order-batch-export-pr/page.tsx:46"}, "properties": {"repobilityId": "d2614074447387f0", "scanner": "scanner-primary", "fingerprint": "eb994c79416017e9", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-b09c54c97773263c", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/admin/argoerp/material-prep/page.tsx:1054"}, "properties": {"repobilityId": "1c64d28ab762427d", "scanner": "scanner-primary", "fingerprint": "b09c54c97773263c", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-55e24ac4ff54513c", "level": "note", "message": {"text": "Legacy-named symbol `argoerp_po_c_header_v1` in app/admin/argoerp/order-batch-export-c/page.tsx:65"}, "properties": {"repobilityId": "4191af55e9254eb8", "scanner": "scanner-primary", "fingerprint": "55e24ac4ff54513c", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-5a838f443ec1535c", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/admin/argoerp/order-batch-export-c/page.tsx:376"}, "properties": {"repobilityId": "11992980ff0458dc", "scanner": "scanner-primary", "fingerprint": "5a838f443ec1535c", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-38dcfee4b1e1f9d2", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/admin/argoerp/staging/page.tsx:107"}, "properties": {"repobilityId": "96600e50fe2d7485", "scanner": "scanner-primary", "fingerprint": "38dcfee4b1e1f9d2", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-70cdb41769c2e1ca", "level": "none", "message": {"text": "Commented-code block (7 lines) in app/admin/argoerp/crm-cross/page.tsx:7"}, "properties": {"repobilityId": "bc40e23b234d586a", "scanner": "scanner-primary", "fingerprint": "70cdb41769c2e1ca", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-652667a472e26c6c", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/admin/argoerp/erp-sync/page.tsx:1175"}, "properties": {"repobilityId": "9e72f949561d6cb0", "scanner": "scanner-primary", "fingerprint": "652667a472e26c6c", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-4c1ab2b52d4641f1", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/admin/argoerp/erp-db/ErpDbTable.tsx:231"}, "properties": {"repobilityId": "0520c6ca8c8d1a1c", "scanner": "scanner-primary", "fingerprint": "4c1ab2b52d4641f1", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-1d2bdc0b197031d7", "level": "note", "message": {"text": "Legacy-named symbol `argoerp_standalone_pr_header_v1` in app/admin/argoerp/standalone-pr-create/page.tsx:38"}, "properties": {"repobilityId": "4fc0f0b99a6ef2df", "scanner": "scanner-primary", "fingerprint": "1d2bdc0b197031d7", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-ade8c28674c17cb5", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/admin/argoerp/mo-summary/page.tsx:77"}, "properties": {"repobilityId": "c2f60a98eb05275e", "scanner": "scanner-primary", "fingerprint": "ade8c28674c17cb5", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-f9469cf3b7d22111", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/admin/argoerp/_shared/FactoryOrderExportPage.tsx:553"}, "properties": {"repobilityId": "ce036d1d1bf41df6", "scanner": "scanner-primary", "fingerprint": "f9469cf3b7d22111", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-67751990b412e04e", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/admin/argoerp/order-batch-export/page.tsx:777"}, "properties": {"repobilityId": "20852dd261554c44", "scanner": "scanner-primary", "fingerprint": "67751990b412e04e", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-e0984fb8b02f0ea8", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/admin/argoerp/ng-material-prep/page.tsx:670"}, "properties": {"repobilityId": "6830a6fadbd4fd4a", "scanner": "scanner-primary", "fingerprint": "e0984fb8b02f0ea8", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-ee5b8fcff1bdc0d7", "level": "note", "message": {"text": "Legacy-named symbol `argoerp_po_o_header_v1` in app/admin/argoerp/order-batch-export-o/page.tsx:67"}, "properties": {"repobilityId": "4810feec5c6b8814", "scanner": "scanner-primary", "fingerprint": "ee5b8fcff1bdc0d7", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-06b426558306a194", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/admin/argoerp/order-batch-export-o/page.tsx:411"}, "properties": {"repobilityId": "61cfcc33afba237b", "scanner": "scanner-primary", "fingerprint": "06b426558306a194", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-e0aba6b19b8ffc30", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/admin/argoerp/daily-order-sheet/page.tsx:512"}, "properties": {"repobilityId": "b27893b898f00123", "scanner": "scanner-primary", "fingerprint": "e0aba6b19b8ffc30", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-c6ac393e5833adf8", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/material-issue/page.tsx:255"}, "properties": {"repobilityId": "1b97738dd4b1b67a", "scanner": "scanner-primary", "fingerprint": "c6ac393e5833adf8", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-77720600a2d1ffe8", "level": "note", "message": {"text": "Legacy-named symbol `argoerp_inventory_sync_config_v1` in components/InventorySyncPanel.tsx:33"}, "properties": {"repobilityId": "428a859e345d6e54", "scanner": "scanner-primary", "fingerprint": "77720600a2d1ffe8", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-fa4e5412fcdf074a", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 lib/saraClient.ts:79"}, "properties": {"repobilityId": "fa9a10d3dff56dd1", "scanner": "scanner-primary", "fingerprint": "fa4e5412fcdf074a", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}]}]}