{"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-2535dbaf951daf01", "name": "Possibly dead Python function: execute", "shortDescription": {"text": "Possibly dead Python function: execute"}, "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-4663db49deb8a69a", "name": "Possibly dead Python function: seed", "shortDescription": {"text": "Possibly dead Python function: seed"}, "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-ba2f6412dc1e1fd8", "name": "Possibly dead Python function: after_insert", "shortDescription": {"text": "Possibly dead Python function: after_insert"}, "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-37d6fe13e403ee1c", "name": "Possibly dead Python function: run_dry_run", "shortDescription": {"text": "Possibly dead Python function: run_dry_run"}, "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-2104784854f8e8c8", "name": "Possibly dead Python function: teardown", "shortDescription": {"text": "Possibly dead Python function: teardown"}, "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-5c964a45027fac6e", "name": "Stray `console.log` in TS/JS \u2014 update_real_images.js:23", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 update_real_images.js:23"}, "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-d0d3a3e402842788", "name": "Stray `console.log` in TS/JS \u2014 update_mock.js:79", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 update_mock.js: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-18dcbc4736d486ab", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/Charts/TopItemsChart.tsx:24", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/Charts/TopItemsChart.tsx:24"}, "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-7f690631761689dd", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/Charts/TopCustomersChart.tsx:24", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/Charts/TopCustomersChart.tsx:24"}, "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-b2b4760ff4bbd4c5", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/ui/ItemDetailDrawer.tsx:38", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/ui/ItemDetailDrawer.tsx:38"}, "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-dcbccede583e410c", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 frontend/src/components/ui/ItemDetailDrawer.tsx:393", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 frontend/src/components/ui/ItemDetailDrawer.tsx:393"}, "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-7b3b7622ef3a0eed", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/ui/TransactionsTable.tsx:81", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/ui/TransactionsTable.tsx:81"}, "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-abeb4c8de39c2f4b", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/Layout/Sidebar.tsx:185", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/Layout/Sidebar.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-f9ad944f32a702b3", "name": "TODO/FIXME marker in shipping code \u2014 frontend/src/components/Layout/Sidebar.tsx:44", "shortDescription": {"text": "TODO/FIXME marker in shipping code \u2014 frontend/src/components/Layout/Sidebar.tsx:44"}, "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-c0764a2eaee39bb7", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/ImportOrders/ShipmentDetailDrawer.tsx:67", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/ImportOrders/ShipmentDetailDrawer.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-aff947fcf43e6f32", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/Inventory/ItemList.tsx:270", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/Inventory/ItemList.tsx:270"}, "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-39dc33601b9492e1", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/Users/UserDetailDrawer.tsx:87", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/Users/UserDetailDrawer.tsx:87"}, "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-389ac24f1271e042", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/Suppliers/SupplierDetailDrawer.tsx:66", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/Suppliers/SupplierDetailDrawer.tsx:66"}, "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-658015a77aa4418c", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/Warehouse/WarehouseDetailDrawer.tsx:61", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/Warehouse/WarehouseDetailDrawer.tsx:61"}, "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-e6c91537f389f0ca", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/Customers/CustomerDetailDrawer.tsx:66", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/Customers/CustomerDetailDrawer.tsx:66"}, "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-9e0bc085f01aaf7b", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/Wholesale/SalesOrderDetailDrawer.tsx:63", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/Wholesale/SalesOrderDetailDrawer.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-e299fbc9fe162071", "name": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/Wholesale/SalesInvoiceDetailDrawer.tsx:63", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/Wholesale/SalesInvoiceDetailDrawer.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-f4923a3796b9a6ad", "name": "Stray `console.log` in TS/JS \u2014 backend/buildsupply/public/js/buildsupply.js:2", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 backend/buildsupply/public/js/buildsupply.js:2"}, "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-60427b03771411b6", "name": "Dockerfile runs as root: frontend/Dockerfile", "shortDescription": {"text": "Dockerfile runs as root: frontend/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-faa134129e5545ff", "name": "Docker base image is tag-pinned but not digest-pinned: node:20-alpine", "shortDescription": {"text": "Docker base image is tag-pinned but not digest-pinned: node:20-alpine"}, "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-b048d166901fd868", "name": "Docker base image is tag-pinned but not digest-pinned: nginx:alpine", "shortDescription": {"text": "Docker base image is tag-pinned but not digest-pinned: nginx:alpine"}, "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-b2c74a4dc0e48f59", "name": "Docker base image is tag-pinned but not digest-pinned: frappe/erpnext:v16.6.1", "shortDescription": {"text": "Docker base image is tag-pinned but not digest-pinned: frappe/erpnext:v16.6.1"}, "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-2c482023445423a4", "name": "Runtime dotenv file present in repo: frontend/.env.production", "shortDescription": {"text": "Runtime dotenv file present in repo: frontend/.env.production"}, "fullDescription": {"text": "`frontend/.env.production` looks like a runtime dotenv file. It contains secret-looking assignments for VITE_GEMINI_API_KEY. Move real values to a secret manager and keep only `.env.example` style templates in source control."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "critical", "confidence": 1.0}}, {"id": "scanner-40c73b8ca97d88d0", "name": "Runtime dotenv file present in repo: frontend/.env", "shortDescription": {"text": "Runtime dotenv file present in repo: frontend/.env"}, "fullDescription": {"text": "`frontend/.env` looks like a runtime dotenv file. It contains secret-looking assignments for VITE_GEMINI_API_KEY. Move real values to a secret manager and keep only `.env.example` style templates in source control."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "critical", "confidence": 1.0}}, {"id": "scanner-c5d853c67e41d0ce", "name": "Runtime dotenv file present in repo: deploy/.env.prod", "shortDescription": {"text": "Runtime dotenv file present in repo: deploy/.env.prod"}, "fullDescription": {"text": "`deploy/.env.prod` looks like a runtime dotenv file. It contains secret-looking assignments for DB_ROOT_PASSWORD, ADMIN_PASSWORD, VITE_GEMINI_API_KEY. Move real values to a secret manager and keep only `.env.example` style templates in source control."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "critical", "confidence": 1.0}}, {"id": "scanner-0c559935d56c238b", "name": "Insecure pattern 'direct_innerhtml_assignment' in import_cost_sheet_preview.html:197", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in import_cost_sheet_preview.html:197"}, "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-35b632dbfd9c6129", "name": "Insecure pattern 'direct_innerhtml_assignment' in import_intake_form.html:188", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in import_intake_form.html:188"}, "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-9df6eee28e020bee", "name": "Insecure pattern 'direct_innerhtml_assignment' in import_cost_sheet_print_preview.html:104", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in import_cost_sheet_print_preview.html:104"}, "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-ae8161593defdb13", "name": "Insecure pattern 'direct_innerhtml_assignment' in frontend/public/import_cost_sheet_preview.html:197", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in frontend/public/import_cost_sheet_preview.html:197"}, "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-fbd21ebcae8a8d39", "name": "Insecure pattern 'direct_innerhtml_assignment' in frontend/public/import_intake_form.html:188", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in frontend/public/import_intake_form.html:188"}, "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-d8180b21434d7e7c", "name": "Insecure pattern 'direct_innerhtml_assignment' in frontend/public/import_cost_sheet_print_preview.html:104", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in frontend/public/import_cost_sheet_print_preview.html:104"}, "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-4667932b0f8ca616", "name": "Insecure pattern 'dangerous_innerhtml' in frontend/src/components/ui/ItemDetailDrawer.tsx:393", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in frontend/src/components/ui/ItemDetailDrawer.tsx:393"}, "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-bfe8e168ca00894b", "name": "Insecure pattern 'direct_innerhtml_assignment' in frontend/src/components/ui/ItemDetailDrawer.tsx:136", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in frontend/src/components/ui/ItemDetailDrawer.tsx:136"}, "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-55d5974fd02391af", "name": "Possible secret in deploy/oracle-deploy.sh", "shortDescription": {"text": "Possible secret in deploy/oracle-deploy.sh"}, "fullDescription": {"text": "Detected pattern matching password_literal. Rotate the credential and move to a secret manager."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "critical", "confidence": 1.0}}, {"id": "scanner-6372cebde0220094", "name": "No auth library detected", "shortDescription": {"text": "No auth library detected"}, "fullDescription": {"text": "The scanner did not find any standard auth library (JWT, OAuth, NextAuth, Auth0, etc.). The repo has auth/admin/session surface indicators, so auth may live in custom code, in a separate service, or be missing."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-28c4a04bd807da0c", "name": "GitHub Action is tag-pinned rather than SHA-pinned", "shortDescription": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "fullDescription": {"text": "webfactory/ssh-agent@v0.9.0 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-24d8609707eeea3c", "name": "Very large file: frontend/src/components/ui/ChatBot.tsx (1542 lines)", "shortDescription": {"text": "Very large file: frontend/src/components/ui/ChatBot.tsx (1542 lines)"}, "fullDescription": {"text": "Files with >800 lines often hide complexity hotspots and discourage tests."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-6893a6c8b0861585", "name": "Very low test-to-source ratio", "shortDescription": {"text": "Very low test-to-source ratio"}, "fullDescription": {"text": "2 test file(s) for 111 source file(s) (ratio 0.02). 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 43 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 50 placeholder/mock markers across 21 source files. This often means the repo looks complete while core flows still use generated scaffolding or fake data."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-2d0c7b7ab8f8aacf", "name": "Critical user flow still appears backed by mock or placeholder data", "shortDescription": {"text": "Critical user flow still appears backed by mock or placeholder data"}, "fullDescription": {"text": "A payment/auth/admin/order/billing-style flow contains mock, fake, TODO, dummy, or placeholder markers in runtime source. In the Fable corpus this is a high-leverage completeness smell: the app can look finished while the money, identity, or tenant flow is still scaffolded."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-749d4bc1bd66df5f", "name": "Agent instructions exist but release-hardening basics are missing", "shortDescription": {"text": "Agent instructions exist but release-hardening basics are missing"}, "fullDescription": {"text": "AI-coder instruction files were found, but the repo is missing license. Treat this as a contract gap: the agent is guided, but the generated output is not yet guarded by the controls that make it repeatable."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-ea8f3013f588db25", "name": "Shallow git history limits provenance confidence", "shortDescription": {"text": "Shallow git history limits provenance confidence"}, "fullDescription": {"text": "The repository is a shallow clone. Origin/evolution analysis cannot distinguish fresh generation, imported legacy code, or long-lived human code with high confidence."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-8424db9c75e04ba4", "name": "Very short observed git history", "shortDescription": {"text": "Very short observed git history"}, "fullDescription": {"text": "The repo has multiple source files but two or fewer visible commits. This is not a failure by itself, but it lowers confidence in evolution-based diagnosis."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-122f91b7f2906dc4", "name": "Agent authority lacks a verifier contract: .claude/settings.json", "shortDescription": {"text": "Agent authority lacks a verifier contract: .claude/settings.json"}, "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-2c5f98b152cddb6d", "name": "Agent authority lacks a verifier contract: .claude/launch.json", "shortDescription": {"text": "Agent authority lacks a verifier contract: .claude/launch.json"}, "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-e57e341dc96afc1c", "name": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/api/client.ts:39", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/api/client.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-a3ca935710f09ddf", "name": "Frontend route `/cost-sheet/:name` has no Link/navigate to it \u2014 frontend/src/App.tsx", "shortDescription": {"text": "Frontend route `/cost-sheet/:name` has no Link/navigate to it \u2014 frontend/src/App.tsx"}, "fullDescription": {"text": "The route is registered but no `<Link to=\u2026>` or `navigate(\u2026)` in the codebase navigates here. Either it's reachable only via direct URL (intentional), it's dead, or the link broke during a refactor."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}]}}, "automationDetails": {"id": "repobility/23310"}, "properties": {"repository": "Yosef-Ali/import_wholesale", "repoUrl": "https://github.com/Yosef-Ali/import_wholesale", "branch": "main"}, "results": [{"ruleId": "scanner-2535dbaf951daf01", "level": "note", "message": {"text": "Possibly dead Python function: execute"}, "properties": {"repobilityId": "a0497c418f1db27e", "scanner": "scanner-primary", "fingerprint": "2535dbaf951daf01", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "deploy/seed_demo_data.py:20"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-4663db49deb8a69a", "level": "note", "message": {"text": "Possibly dead Python function: seed"}, "properties": {"repobilityId": "9ac043c21c030950", "scanner": "scanner-primary", "fingerprint": "4663db49deb8a69a", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/buildsupply/seed_data.py:26"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-ba2f6412dc1e1fd8", "level": "note", "message": {"text": "Possibly dead Python function: after_insert"}, "properties": {"repobilityId": "92071495036ca205", "scanner": "scanner-primary", "fingerprint": "ba2f6412dc1e1fd8", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/buildsupply/customer_credit/doctype/credit_limit_log/credit_limit_log.py:11"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-37d6fe13e403ee1c", "level": "note", "message": {"text": "Possibly dead Python function: run_dry_run"}, "properties": {"repobilityId": "3c09ad44967f938c", "scanner": "scanner-primary", "fingerprint": "37d6fe13e403ee1c", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/buildsupply/import_tracking/demo.py:90"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-2104784854f8e8c8", "level": "note", "message": {"text": "Possibly dead Python function: teardown"}, "properties": {"repobilityId": "88045150ff2a0ca0", "scanner": "scanner-primary", "fingerprint": "2104784854f8e8c8", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/buildsupply/import_tracking/demo.py:163"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-5c964a45027fac6e", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 update_real_images.js:23"}, "properties": {"repobilityId": "9036af34afa27315", "scanner": "scanner-primary", "fingerprint": "5c964a45027fac6e", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-d0d3a3e402842788", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 update_mock.js:79"}, "properties": {"repobilityId": "28a3453cedfa0dfd", "scanner": "scanner-primary", "fingerprint": "d0d3a3e402842788", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-18dcbc4736d486ab", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/Charts/TopItemsChart.tsx:24"}, "properties": {"repobilityId": "eb07c02a6a7c7959", "scanner": "scanner-primary", "fingerprint": "18dcbc4736d486ab", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-7f690631761689dd", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/Charts/TopCustomersChart.tsx:24"}, "properties": {"repobilityId": "f74d0806767e586e", "scanner": "scanner-primary", "fingerprint": "7f690631761689dd", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-b2b4760ff4bbd4c5", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/ui/ItemDetailDrawer.tsx:38"}, "properties": {"repobilityId": "50e6d432f0ec4937", "scanner": "scanner-primary", "fingerprint": "b2b4760ff4bbd4c5", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-dcbccede583e410c", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 frontend/src/components/ui/ItemDetailDrawer.tsx:393"}, "properties": {"repobilityId": "1fb93f8bb937fc52", "scanner": "scanner-primary", "fingerprint": "dcbccede583e410c", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-7b3b7622ef3a0eed", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/ui/TransactionsTable.tsx:81"}, "properties": {"repobilityId": "1436814add62a8b7", "scanner": "scanner-primary", "fingerprint": "7b3b7622ef3a0eed", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-abeb4c8de39c2f4b", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/components/Layout/Sidebar.tsx:185"}, "properties": {"repobilityId": "f2689d6e5a21ec01", "scanner": "scanner-primary", "fingerprint": "abeb4c8de39c2f4b", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-f9ad944f32a702b3", "level": "none", "message": {"text": "TODO/FIXME marker in shipping code \u2014 frontend/src/components/Layout/Sidebar.tsx:44"}, "properties": {"repobilityId": "a93b17367bc2c80d", "scanner": "scanner-primary", "fingerprint": "f9ad944f32a702b3", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.todo-marker"]}}, {"ruleId": "scanner-c0764a2eaee39bb7", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/ImportOrders/ShipmentDetailDrawer.tsx:67"}, "properties": {"repobilityId": "7519744ccef0476a", "scanner": "scanner-primary", "fingerprint": "c0764a2eaee39bb7", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-aff947fcf43e6f32", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/Inventory/ItemList.tsx:270"}, "properties": {"repobilityId": "a26be2e998c5f5d0", "scanner": "scanner-primary", "fingerprint": "aff947fcf43e6f32", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-39dc33601b9492e1", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/Users/UserDetailDrawer.tsx:87"}, "properties": {"repobilityId": "93f5a40f3783a520", "scanner": "scanner-primary", "fingerprint": "39dc33601b9492e1", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-389ac24f1271e042", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/Suppliers/SupplierDetailDrawer.tsx:66"}, "properties": {"repobilityId": "e90e3066fcde8f9d", "scanner": "scanner-primary", "fingerprint": "389ac24f1271e042", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-658015a77aa4418c", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/Warehouse/WarehouseDetailDrawer.tsx:61"}, "properties": {"repobilityId": "fcc0fed672cc5854", "scanner": "scanner-primary", "fingerprint": "658015a77aa4418c", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-e6c91537f389f0ca", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/Customers/CustomerDetailDrawer.tsx:66"}, "properties": {"repobilityId": "5f714ac4768a2f29", "scanner": "scanner-primary", "fingerprint": "e6c91537f389f0ca", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-9e0bc085f01aaf7b", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/Wholesale/SalesOrderDetailDrawer.tsx:63"}, "properties": {"repobilityId": "a8d690ca6bae015f", "scanner": "scanner-primary", "fingerprint": "9e0bc085f01aaf7b", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-e299fbc9fe162071", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 frontend/src/pages/Wholesale/SalesInvoiceDetailDrawer.tsx:63"}, "properties": {"repobilityId": "b926cddd151643bb", "scanner": "scanner-primary", "fingerprint": "e299fbc9fe162071", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-f4923a3796b9a6ad", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 backend/buildsupply/public/js/buildsupply.js:2"}, "properties": {"repobilityId": "5252627add7e1c46", "scanner": "scanner-primary", "fingerprint": "f4923a3796b9a6ad", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-60427b03771411b6", "level": "warning", "message": {"text": "Dockerfile runs as root: frontend/Dockerfile"}, "properties": {"repobilityId": "735c01d8531dfd2c", "scanner": "scanner-primary", "fingerprint": "60427b03771411b6", "layer": "hardware", "severity": "medium", "confidence": 1.0, "tags": ["security", "container"]}}, {"ruleId": "scanner-faa134129e5545ff", "level": "note", "message": {"text": "Docker base image is tag-pinned but not digest-pinned: node:20-alpine"}, "properties": {"repobilityId": "56554993b7676a1a", "scanner": "scanner-primary", "fingerprint": "faa134129e5545ff", "layer": "hardware", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "docker", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "frontend/Dockerfile"}, "region": {"startLine": 2}}}]}, {"ruleId": "scanner-b048d166901fd868", "level": "note", "message": {"text": "Docker base image is tag-pinned but not digest-pinned: nginx:alpine"}, "properties": {"repobilityId": "af2c63230b3c9e4c", "scanner": "scanner-primary", "fingerprint": "b048d166901fd868", "layer": "hardware", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "docker", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "frontend/Dockerfile"}, "region": {"startLine": 10}}}]}, {"ruleId": "scanner-b2c74a4dc0e48f59", "level": "note", "message": {"text": "Docker base image is tag-pinned but not digest-pinned: frappe/erpnext:v16.6.1"}, "properties": {"repobilityId": "5760c4fa9a04c87b", "scanner": "scanner-primary", "fingerprint": "b2c74a4dc0e48f59", "layer": "hardware", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "docker", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "docker/Dockerfile"}, "region": {"startLine": 1}}}]}, {"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-2c482023445423a4", "level": "error", "message": {"text": "Runtime dotenv file present in repo: frontend/.env.production"}, "properties": {"repobilityId": "f727d22a89e309c5", "scanner": "scanner-primary", "fingerprint": "2c482023445423a4", "layer": "security", "severity": "critical", "confidence": 1.0, "tags": ["secrets", "config", "env-file", "runtime-env", "env_file_with_secret"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "frontend/.env.production"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-40c73b8ca97d88d0", "level": "error", "message": {"text": "Runtime dotenv file present in repo: frontend/.env"}, "properties": {"repobilityId": "20512f217a866b0e", "scanner": "scanner-primary", "fingerprint": "40c73b8ca97d88d0", "layer": "security", "severity": "critical", "confidence": 1.0, "tags": ["secrets", "config", "env-file", "runtime-env", "env_file_with_secret"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "frontend/.env"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-c5d853c67e41d0ce", "level": "error", "message": {"text": "Runtime dotenv file present in repo: deploy/.env.prod"}, "properties": {"repobilityId": "cef33e85cfee8689", "scanner": "scanner-primary", "fingerprint": "c5d853c67e41d0ce", "layer": "security", "severity": "critical", "confidence": 1.0, "tags": ["secrets", "config", "env-file", "runtime-env", "env_file_with_secret"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "deploy/.env.prod"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-0c559935d56c238b", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in import_cost_sheet_preview.html:197"}, "properties": {"repobilityId": "039516f29f9edac1", "scanner": "scanner-primary", "fingerprint": "0c559935d56c238b", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "import_cost_sheet_preview.html"}, "region": {"startLine": 197}}}]}, {"ruleId": "scanner-35b632dbfd9c6129", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in import_intake_form.html:188"}, "properties": {"repobilityId": "f0aebffbf6f8431b", "scanner": "scanner-primary", "fingerprint": "35b632dbfd9c6129", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "import_intake_form.html"}, "region": {"startLine": 188}}}]}, {"ruleId": "scanner-9df6eee28e020bee", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in import_cost_sheet_print_preview.html:104"}, "properties": {"repobilityId": "91bcea0286b296a4", "scanner": "scanner-primary", "fingerprint": "9df6eee28e020bee", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "import_cost_sheet_print_preview.html"}, "region": {"startLine": 104}}}]}, {"ruleId": "scanner-ae8161593defdb13", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in frontend/public/import_cost_sheet_preview.html:197"}, "properties": {"repobilityId": "466bf69cf9d5562a", "scanner": "scanner-primary", "fingerprint": "ae8161593defdb13", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "frontend/public/import_cost_sheet_preview.html"}, "region": {"startLine": 197}}}]}, {"ruleId": "scanner-fbd21ebcae8a8d39", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in frontend/public/import_intake_form.html:188"}, "properties": {"repobilityId": "de09b6681e1fafb6", "scanner": "scanner-primary", "fingerprint": "fbd21ebcae8a8d39", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "frontend/public/import_intake_form.html"}, "region": {"startLine": 188}}}]}, {"ruleId": "scanner-d8180b21434d7e7c", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in frontend/public/import_cost_sheet_print_preview.html:104"}, "properties": {"repobilityId": "4471de856b0e3b62", "scanner": "scanner-primary", "fingerprint": "d8180b21434d7e7c", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "frontend/public/import_cost_sheet_print_preview.html"}, "region": {"startLine": 104}}}]}, {"ruleId": "scanner-4667932b0f8ca616", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in frontend/src/components/ui/ItemDetailDrawer.tsx:393"}, "properties": {"repobilityId": "4ac8c15d50810b24", "scanner": "scanner-primary", "fingerprint": "4667932b0f8ca616", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "frontend/src/components/ui/ItemDetailDrawer.tsx"}, "region": {"startLine": 393}}}]}, {"ruleId": "scanner-bfe8e168ca00894b", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in frontend/src/components/ui/ItemDetailDrawer.tsx:136"}, "properties": {"repobilityId": "c6582dfa6d0badb3", "scanner": "scanner-primary", "fingerprint": "bfe8e168ca00894b", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "frontend/src/components/ui/ItemDetailDrawer.tsx"}, "region": {"startLine": 136}}}]}, {"ruleId": "scanner-55d5974fd02391af", "level": "error", "message": {"text": "Possible secret in deploy/oracle-deploy.sh"}, "properties": {"repobilityId": "9af019cf5f4944c1", "scanner": "scanner-primary", "fingerprint": "55d5974fd02391af", "layer": "security", "severity": "critical", "confidence": 1.0, "tags": ["secrets"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "deploy/oracle-deploy.sh"}, "region": {"startLine": 13}}}]}, {"ruleId": "scanner-55d5974fd02391af", "level": "error", "message": {"text": "Possible secret in deploy/oracle-deploy.sh"}, "properties": {"repobilityId": "9af019cf5f4944c1", "scanner": "scanner-primary", "fingerprint": "55d5974fd02391af", "layer": "security", "severity": "critical", "confidence": 1.0, "tags": ["secrets"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "deploy/oracle-deploy.sh"}, "region": {"startLine": 14}}}]}, {"ruleId": "scanner-6372cebde0220094", "level": "warning", "message": {"text": "No auth library detected"}, "properties": {"repobilityId": "a5b6035a5bbf8054", "scanner": "scanner-primary", "fingerprint": "6372cebde0220094", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["coverage", "auth"]}}, {"ruleId": "scanner-28c4a04bd807da0c", "level": "warning", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "247bb11baae34b61", "scanner": "scanner-primary", "fingerprint": "28c4a04bd807da0c", "layer": "cicd", "severity": "medium", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/deploy.yml"}, "region": {"startLine": 19}}}]}, {"ruleId": "scanner-24d8609707eeea3c", "level": "note", "message": {"text": "Very large file: frontend/src/components/ui/ChatBot.tsx (1542 lines)"}, "properties": {"repobilityId": "36fd7ca3d88a5467", "scanner": "scanner-primary", "fingerprint": "24d8609707eeea3c", "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": "2e4687847b1649fe", "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": "2e920cd7520f9095", "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": "ad55794e682042ec", "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": "44e926dc2d6612c1", "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": "e0e5a30ebc4e5613", "scanner": "scanner-primary", "fingerprint": "749d4bc1bd66df5f", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "repo-hardening", "generated-repo-pattern"]}}, {"ruleId": "scanner-ea8f3013f588db25", "level": "note", "message": {"text": "Shallow git history limits provenance confidence"}, "properties": {"repobilityId": "8b01d2533ef32ee4", "scanner": "scanner-primary", "fingerprint": "ea8f3013f588db25", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["provenance", "git-history", "generated-repo-pattern"]}}, {"ruleId": "scanner-8424db9c75e04ba4", "level": "none", "message": {"text": "Very short observed git history"}, "properties": {"repobilityId": "59da9a620106b8cb", "scanner": "scanner-primary", "fingerprint": "8424db9c75e04ba4", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["provenance", "git-history", "generated-repo-pattern"]}}, {"ruleId": "scanner-122f91b7f2906dc4", "level": "warning", "message": {"text": "Agent authority lacks a verifier contract: .claude/settings.json"}, "properties": {"repobilityId": "a2967269048b6a9d", "scanner": "scanner-primary", "fingerprint": "122f91b7f2906dc4", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "verification", "claude_instruction"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".claude/settings.json"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-2c5f98b152cddb6d", "level": "warning", "message": {"text": "Agent authority lacks a verifier contract: .claude/launch.json"}, "properties": {"repobilityId": "0de48c0f4ab303d8", "scanner": "scanner-primary", "fingerprint": "2c5f98b152cddb6d", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "verification", "claude_instruction"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".claude/launch.json"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-e57e341dc96afc1c", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 frontend/src/api/client.ts:39"}, "properties": {"repobilityId": "73dab9d19cb39cab", "scanner": "scanner-primary", "fingerprint": "e57e341dc96afc1c", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-a3ca935710f09ddf", "level": "warning", "message": {"text": "Frontend route `/cost-sheet/:name` has no Link/navigate to it \u2014 frontend/src/App.tsx"}, "properties": {"repobilityId": "2ac649f710d968aa", "scanner": "scanner-primary", "fingerprint": "a3ca935710f09ddf", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "orphan-page", "wiring"]}}]}]}