{"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-f42d5ac21741f2ef", "name": "Stray `console.log` in TS/JS \u2014 src/App.tsx:39", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/App.tsx:39"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-12814ffabac8994d", "name": "Stray `console.log` in TS/JS \u2014 src/utils/propertiesApi.tsx:20", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/utils/propertiesApi.tsx:20"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-11161aed27739f5b", "name": "Stray `console.log` in TS/JS \u2014 src/utils/resetDatabase.ts:9", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/utils/resetDatabase.ts:9"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-8aec8190a3328438", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 src/components/HolmenIcon.tsx:47", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/components/HolmenIcon.tsx:47"}, "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-2de14f5605297e03", "name": "Stray `console.log` in TS/JS \u2014 src/components/DepartmentsListView.tsx:172", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/components/DepartmentsListView.tsx:172"}, "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-758df67ed790bf97", "name": "Stray `console.log` in TS/JS \u2014 src/components/DepartmentDetailsView.tsx:129", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/components/DepartmentDetailsView.tsx:129"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-830c92a58d54aef7", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/PropertySwitcher.tsx:44", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/PropertySwitcher.tsx:44"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-86c207d5c7e9ba1d", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/ContactCard.tsx:243", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/ContactCard.tsx:243"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-1ce12f3ed896eaa4", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 src/components/HolmenWebbIcon.tsx:67", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/components/HolmenWebbIcon.tsx:67"}, "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-a1cd7f7266e1b710", "name": "Stray `console.log` in TS/JS \u2014 src/components/MapDrawer.tsx:483", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/components/MapDrawer.tsx:483"}, "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-5f8b995e940bd55c", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 src/components/ui/chart.tsx:83", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/components/ui/chart.tsx:83"}, "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-22fe89cc2494e63b", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/contracts-v2/BetalplanChart.tsx:276", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/contracts-v2/BetalplanChart.tsx:276"}, "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-2c2e1c72ca020251", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/contracts-v2/ContractRow.tsx:105", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/contracts-v2/ContractRow.tsx:105"}, "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-9a29f3a23b4aa2b0", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/contracts-v2/Aff\u00e4rGroup.tsx:41", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/contracts-v2/Aff\u00e4rGroup.tsx:41"}, "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-a4f546a105220f4d", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/contracts-v2/KostnaderChart.tsx:308", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/contracts-v2/KostnaderChart.tsx:308"}, "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-90f3c07be10ca8cc", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/contracts-v2/DateRangePicker.tsx:186", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/contracts-v2/DateRangePicker.tsx:186"}, "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-f73b5e0a83740463", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/contracts-v2/PaymentsChart.tsx:396", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/contracts-v2/PaymentsChart.tsx:396"}, "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-3b671fc4dc9e7e89", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/contracts-v2/UtbetalningarTable.tsx:106", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/contracts-v2/UtbetalningarTable.tsx:106"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-1ac4f92b7d3db028", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/contracts-v2/ContractDetailsPanel.tsx:107", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/contracts-v2/ContractDetailsPanel.tsx:107"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-59880809ffff3b84", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/contracts-v2/SortimentChart.tsx:188", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/contracts-v2/SortimentChart.tsx:188"}, "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-d6730baf04cdee75", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/contracts-v2/AtgardListItem.tsx:25", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/contracts-v2/AtgardListItem.tsx:25"}, "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-256c7c4f9348e364", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/contracts-v2/DokumentListItem.tsx:20", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/contracts-v2/DokumentListItem.tsx:20"}, "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-082f3917018aeed0", "name": "Stray `console.log` in TS/JS \u2014 src/contexts/UserContext.tsx:34", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/contexts/UserContext.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-de45421593624e45", "name": "Stray `console.log` in TS/JS \u2014 src/contexts/ProfileContext.tsx:89", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/contexts/ProfileContext.tsx:89"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-47556360f7c0fb16", "name": "Stray `console.log` in TS/JS \u2014 src/pages/PropertiesPage.tsx:461", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/pages/PropertiesPage.tsx:461"}, "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-b2dfbb27b9eea4a6", "name": "`truncate` class without `title=` for hover reveal \u2014 src/pages/InvoicesPage.tsx:261", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/pages/InvoicesPage.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-8433efb460c78629", "name": "`truncate` class without `title=` for hover reveal \u2014 src/pages/AllNewsPage.tsx:170", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/pages/AllNewsPage.tsx:170"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-4be2797f2a19643e", "name": "Stray `console.log` in TS/JS \u2014 src/pages/AccountPage.tsx:417", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/pages/AccountPage.tsx:417"}, "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-638a588ae07bee21", "name": "`truncate` class without `title=` for hover reveal \u2014 src/pages/ContractDetailPage.tsx:104", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/pages/ContractDetailPage.tsx:104"}, "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-e7d2c9af10b3d248", "name": "`truncate` class without `title=` for hover reveal \u2014 src/pages/AnnualStatementPage.tsx:166", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/pages/AnnualStatementPage.tsx:166"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-2f4611a865d83668", "name": "`truncate` class without `title=` for hover reveal \u2014 src/pages/DocumentsPage.tsx:284", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/pages/DocumentsPage.tsx:284"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-a6029a2e8d71bc16", "name": "Stray `console.log` in TS/JS \u2014 src/supabase/functions/server/departments.tsx:101", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/supabase/functions/server/departments.tsx:101"}, "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-2acd80113f7f8f9e", "name": "Stray `console.log` in TS/JS \u2014 src/supabase/functions/server/forestry-plans.tsx:270", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/supabase/functions/server/forestry-plans.tsx:270"}, "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-cf027dd34b57c748", "name": "Stray `console.log` in TS/JS \u2014 src/supabase/functions/server/index.tsx:15", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/supabase/functions/server/index.tsx:15"}, "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-f9e1ad592a520115", "name": "Stray `console.log` in TS/JS \u2014 src/supabase/functions/server/properties.tsx:289", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/supabase/functions/server/properties.tsx:289"}, "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-c277ab6fc30ecf40", "name": "Stray `console.log` in TS/JS \u2014 src/supabase/functions/server/notes.tsx:24", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/supabase/functions/server/notes.tsx:24"}, "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-5be698cfac4b8e4b", "name": "Stray `console.log` in TS/JS \u2014 src/supabase/functions/server/users.tsx:10", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/supabase/functions/server/users.tsx:10"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-e0752f340e2c36c9", "name": "Insecure pattern 'direct_innerhtml_assignment' in src/test-debug.html:11", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in src/test-debug.html:11"}, "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-6976bc10c9543e82", "name": "Possible secret in src/utils/mapSnapshots.ts", "shortDescription": {"text": "Possible secret in src/utils/mapSnapshots.ts"}, "fullDescription": {"text": "Detected pattern matching generic_api_key. Rotate the credential and move to a secret manager."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "critical", "confidence": 1.0}}, {"id": "scanner-db6f8c34ca1faabf", "name": "Insecure pattern 'dangerous_innerhtml' in src/components/HolmenIcon.tsx:47", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in src/components/HolmenIcon.tsx:47"}, "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-1352a112ad20d44c", "name": "Insecure pattern 'dangerous_innerhtml' in src/components/HolmenWebbIcon.tsx:67", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in src/components/HolmenWebbIcon.tsx:67"}, "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-6f38a33241735455", "name": "Insecure pattern 'dangerous_innerhtml' in src/components/ui/chart.tsx:83", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in src/components/ui/chart.tsx:83"}, "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-2b84307c65103c0f", "name": "Insecure pattern 'direct_innerhtml_assignment' in src/pages/PropertiesPage.tsx:1984", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in src/pages/PropertiesPage.tsx:1984"}, "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-de956837f53d7fa9", "name": "Insecure pattern 'cors_wildcard' in src/supabase/functions/server/index.tsx:28", "shortDescription": {"text": "Insecure pattern 'cors_wildcard' in src/supabase/functions/server/index.tsx:28"}, "fullDescription": {"text": "Found a known-risky pattern (cors_wildcard). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-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": "actions/deploy-pages@v4 can move without a code change in this repo. Pin third-party actions to a reviewed 40-character commit SHA."}, "properties": {"scanner": "scanner-primary", "layer": "cicd", "severity": "low", "confidence": 1.0}}, {"id": "scanner-ad6701f0a8405e22", "name": "GitHub Actions workflow grants broad write permissions", "shortDescription": {"text": "GitHub Actions workflow grants broad write permissions"}, "fullDescription": {"text": "CI tokens with write permissions increase blast radius when an action, dependency, or PR workflow is compromised. Prefer job-level least-privilege permissions."}, "properties": {"scanner": "scanner-primary", "layer": "cicd", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-92167146bb0b3353", "name": "Very large file: src/components/MapDrawer.tsx (1116 lines)", "shortDescription": {"text": "Very large file: src/components/MapDrawer.tsx (1116 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-d172cfdb4199e2a9", "name": "Very large file: src/components/MobileBottomDrawer.tsx (1015 lines)", "shortDescription": {"text": "Very large file: src/components/MobileBottomDrawer.tsx (1015 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-38e0cd3a083c4183", "name": "Very large file: src/pages/PropertiesPage.tsx (4227 lines)", "shortDescription": {"text": "Very large file: src/pages/PropertiesPage.tsx (4227 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-59369690025357f7", "name": "Very large file: src/pages/AccountPage.tsx (1714 lines)", "shortDescription": {"text": "Very large file: src/pages/AccountPage.tsx (1714 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-a2d7dbacfd4da813", "name": "Very large file: src/imports/IPhone16ProMax20.tsx (1532 lines)", "shortDescription": {"text": "Very large file: src/imports/IPhone16ProMax20.tsx (1532 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-e956ee31af6048e5", "name": "Very large file: src/imports/Desktop65.tsx (1378 lines)", "shortDescription": {"text": "Very large file: src/imports/Desktop65.tsx (1378 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-12d8fdfa39d816dc", "name": "Very large file: src/imports/Frame2.tsx (2611 lines)", "shortDescription": {"text": "Very large file: src/imports/Frame2.tsx (2611 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-2aa5cc9660958d3a", "name": "Very large file: src/imports/Desktop67.tsx (3358 lines)", "shortDescription": {"text": "Very large file: src/imports/Desktop67.tsx (3358 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-4ae8dc775d72d3ab", "name": "Very large file: src/imports/Desktop68.tsx (1746 lines)", "shortDescription": {"text": "Very large file: src/imports/Desktop68.tsx (1746 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-fe87ec3e975e721c", "name": "Very large file: src/imports/Frame1.tsx (1173 lines)", "shortDescription": {"text": "Very large file: src/imports/Frame1.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-6893a6c8b0861585", "name": "Very low test-to-source ratio", "shortDescription": {"text": "Very low test-to-source ratio"}, "fullDescription": {"text": "1 test file(s) for 231 source file(s) (ratio 0.00). 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 200 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 37 placeholder/mock markers across 18 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-11825279136b53a3", "name": "CI is configured but no tests are detected", "shortDescription": {"text": "CI is configured but no tests are detected"}, "fullDescription": {"text": "A CI pipeline exists, but the scan found no test files to gate. Opus labeled this generated-code pattern as config theater: release machinery exists, but it has little behavioral signal."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-b9088664ace7f748", "name": "Composite production-readiness gap", "shortDescription": {"text": "Composite production-readiness gap"}, "fullDescription": {"text": "Multiple low-cost hardening controls are missing together: license, tests. Opus verification showed these co-occurring gaps are a better readiness signal than reading each flag in isolation."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-749d4bc1bd66df5f", "name": "Agent instructions exist but release-hardening basics are missing", "shortDescription": {"text": "Agent instructions exist but release-hardening basics are missing"}, "fullDescription": {"text": "AI-coder instruction files were found, but the repo is missing license, tests. Treat this as a contract gap: the agent is guided, but the generated output is not yet guarded by the controls that make it repeatable."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-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-6a2f975986be98f1", "name": "Commented-code block (5 lines) in src/App.tsx:156", "shortDescription": {"text": "Commented-code block (5 lines) in src/App.tsx:156"}, "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-897956dd8311d196", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/utils/resetDatabase.ts:12", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/utils/resetDatabase.ts:12"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-625eb6bd00026676", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/DepartmentDetailsView.tsx:134", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/DepartmentDetailsView.tsx:134"}, "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-327a1ca968b46aa9", "name": "Commented-code block (6 lines) in src/components/contracts-v2/\u00c5terrapporteringTable.tsx:60", "shortDescription": {"text": "Commented-code block (6 lines) in src/components/contracts-v2/\u00c5terrapporteringTable.tsx:60"}, "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-57d4f2419bedf1ad", "name": "Commented-code block (8 lines) in src/pages/PropertiesPage.tsx:228", "shortDescription": {"text": "Commented-code block (8 lines) in src/pages/PropertiesPage.tsx:228"}, "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-97757949e848b188", "name": "Commented-code block (7 lines) in src/supabase/functions/server/departments.tsx:122", "shortDescription": {"text": "Commented-code block (7 lines) in src/supabase/functions/server/departments.tsx:122"}, "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-148e1bb75383c362", "name": "Dangling fetch: POST https://${projectId}.supabase.co/functions/v1/make-server-ffc89dab/departments/migrate-site-index (", "shortDescription": {"text": "Dangling fetch: POST https://${projectId}.supabase.co/functions/v1/make-server-ffc89dab/departments/migrate-site-index (src/App.tsx:105)"}, "fullDescription": {"text": "`src/App.tsx:105` calls `POST https://${projectId}.supabase.co/functions/v1/make-server-ffc89dab/departments/migrate-site-index` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/<p>.supabase.co/functions/v1/make-server-ffc89dab/departments/migrate-site-index`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-ec4b6851d5bbaecd", "name": "Dangling fetch: POST https://${projectId}.supabase.co/functions/v1/make-server-ffc89dab/departments/seed-missing (src/ut", "shortDescription": {"text": "Dangling fetch: POST https://${projectId}.supabase.co/functions/v1/make-server-ffc89dab/departments/seed-missing (src/utils/resetDatabase.ts:12)"}, "fullDescription": {"text": "`src/utils/resetDatabase.ts:12` calls `POST https://${projectId}.supabase.co/functions/v1/make-server-ffc89dab/departments/seed-missing` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/<p>.supabase.co/functions/v1/make-server-ffc89dab/departments/seed-missing`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-7ffc9790a5117ce8", "name": "Dangling fetch: POST https://${projectId}.supabase.co/functions/v1/make-server-ffc89dab/debug/reinit-all (src/utils/rese", "shortDescription": {"text": "Dangling fetch: POST https://${projectId}.supabase.co/functions/v1/make-server-ffc89dab/debug/reinit-all (src/utils/resetDatabase.ts:59)"}, "fullDescription": {"text": "`src/utils/resetDatabase.ts:59` calls `POST https://${projectId}.supabase.co/functions/v1/make-server-ffc89dab/debug/reinit-all` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/<p>.supabase.co/functions/v1/make-server-ffc89dab/debug/reinit-all`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-5c36064cd445e1b3", "name": "Dangling fetch: GET https://${projectId}.supabase.co/functions/v1/make-server-ffc89dab/departments/${propertyId} (src/co", "shortDescription": {"text": "Dangling fetch: GET https://${projectId}.supabase.co/functions/v1/make-server-ffc89dab/departments/${propertyId} (src/components/DepartmentsListView.tsx:174)"}, "fullDescription": {"text": "`src/components/DepartmentsListView.tsx:174` calls `GET https://${projectId}.supabase.co/functions/v1/make-server-ffc89dab/departments/${propertyId}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/<p>.supabase.co/functions/v1/make-server-ffc89dab/departments/<p>`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-88aef9006d84e84b", "name": "Dangling fetch: DELETE https://${projectId}.supabase.co/functions/v1/make-server-ffc89dab/departments/debug/clear-all (s", "shortDescription": {"text": "Dangling fetch: DELETE https://${projectId}.supabase.co/functions/v1/make-server-ffc89dab/departments/debug/clear-all (src/components/DepartmentsListView.tsx:206)"}, "fullDescription": {"text": "`src/components/DepartmentsListView.tsx:206` calls `DELETE https://${projectId}.supabase.co/functions/v1/make-server-ffc89dab/departments/debug/clear-all` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/<p>.supabase.co/functions/v1/make-server-ffc89dab/departments/debug/clear-all`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-3c77aa3d3a340da3", "name": "Dangling fetch: GET https://${projectId}.supabase.co/functions/v1/make-server-ffc89dab/departments/${selectedProperty.id", "shortDescription": {"text": "Dangling fetch: GET https://${projectId}.supabase.co/functions/v1/make-server-ffc89dab/departments/${selectedProperty.id} (src/pages/PropertiesPage.tsx:758)"}, "fullDescription": {"text": "`src/pages/PropertiesPage.tsx:758` calls `GET https://${projectId}.supabase.co/functions/v1/make-server-ffc89dab/departments/${selectedProperty.id}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/<p>.supabase.co/functions/v1/make-server-ffc89dab/departments/<p>`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-59b76f5b3dde6401", "name": "Dangling fetch: GET https://${projectId}.supabase.co/functions/v1/make-server-ffc89dab/user/${loggedInUser.id} (src/page", "shortDescription": {"text": "Dangling fetch: GET https://${projectId}.supabase.co/functions/v1/make-server-ffc89dab/user/${loggedInUser.id} (src/pages/AccountPage.tsx:302)"}, "fullDescription": {"text": "`src/pages/AccountPage.tsx:302` calls `GET https://${projectId}.supabase.co/functions/v1/make-server-ffc89dab/user/${loggedInUser.id}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/<p>.supabase.co/functions/v1/make-server-ffc89dab/user/<p>`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-66dc68746273b634", "name": "Dangling fetch: PUT https://${projectId}.supabase.co/functions/v1/make-server-ffc89dab/user/${loggedInUser.id} (src/page", "shortDescription": {"text": "Dangling fetch: PUT https://${projectId}.supabase.co/functions/v1/make-server-ffc89dab/user/${loggedInUser.id} (src/pages/AccountPage.tsx:632)"}, "fullDescription": {"text": "`src/pages/AccountPage.tsx:632` calls `PUT https://${projectId}.supabase.co/functions/v1/make-server-ffc89dab/user/${loggedInUser.id}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/<p>.supabase.co/functions/v1/make-server-ffc89dab/user/<p>`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-31930ecd2b19c4b4", "name": "Dangling fetch: GET https://${projectId}.supabase.co/functions/v1/make-server-ffc89dab/departments/debug/status (src/pag", "shortDescription": {"text": "Dangling fetch: GET https://${projectId}.supabase.co/functions/v1/make-server-ffc89dab/departments/debug/status (src/pages/DatabaseToolsPage.tsx:18)"}, "fullDescription": {"text": "`src/pages/DatabaseToolsPage.tsx:18` calls `GET https://${projectId}.supabase.co/functions/v1/make-server-ffc89dab/departments/debug/status` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/<p>.supabase.co/functions/v1/make-server-ffc89dab/departments/debug/status`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-a2a95d467b2485e3", "name": "Dangling fetch: POST https://${projectId}.supabase.co/functions/v1/make-server-ffc89dab/departments/migrate-site-index (", "shortDescription": {"text": "Dangling fetch: POST https://${projectId}.supabase.co/functions/v1/make-server-ffc89dab/departments/migrate-site-index (src/pages/DatabaseToolsPage.tsx:38)"}, "fullDescription": {"text": "`src/pages/DatabaseToolsPage.tsx:38` calls `POST https://${projectId}.supabase.co/functions/v1/make-server-ffc89dab/departments/migrate-site-index` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/<p>.supabase.co/functions/v1/make-server-ffc89dab/departments/migrate-site-index`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-89c52cb0596d9e7e", "name": "Dangling fetch: POST https://${projectId}.supabase.co/functions/v1/make-server-ffc89dab/departments/seed-missing (src/pa", "shortDescription": {"text": "Dangling fetch: POST https://${projectId}.supabase.co/functions/v1/make-server-ffc89dab/departments/seed-missing (src/pages/DatabaseToolsPage.tsx:61)"}, "fullDescription": {"text": "`src/pages/DatabaseToolsPage.tsx:61` calls `POST https://${projectId}.supabase.co/functions/v1/make-server-ffc89dab/departments/seed-missing` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/<p>.supabase.co/functions/v1/make-server-ffc89dab/departments/seed-missing`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-9e66c95c511bd0c6", "name": "Dangling fetch: POST https://${projectId}.supabase.co/functions/v1/make-server-ffc89dab/debug/reinit-all (src/pages/Data", "shortDescription": {"text": "Dangling fetch: POST https://${projectId}.supabase.co/functions/v1/make-server-ffc89dab/debug/reinit-all (src/pages/DatabaseToolsPage.tsx:84)"}, "fullDescription": {"text": "`src/pages/DatabaseToolsPage.tsx:84` calls `POST https://${projectId}.supabase.co/functions/v1/make-server-ffc89dab/debug/reinit-all` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/<p>.supabase.co/functions/v1/make-server-ffc89dab/debug/reinit-all`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-07d03ae4f204edf5", "name": "Unused endpoint: GET /departments/:propertyId", "shortDescription": {"text": "Unused endpoint: GET /departments/:propertyId"}, "fullDescription": {"text": "`src/supabase/functions/server/departments.tsx` declares `GET /departments/:propertyId` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-7e3b00946e23ff37", "name": "Unused endpoint: GET /departments/:propertyId/:departmentId", "shortDescription": {"text": "Unused endpoint: GET /departments/:propertyId/:departmentId"}, "fullDescription": {"text": "`src/supabase/functions/server/departments.tsx` declares `GET /departments/:propertyId/:departmentId` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-3e305959f54a8ec3", "name": "Unused endpoint: PUT /departments/:propertyId/:departmentId", "shortDescription": {"text": "Unused endpoint: PUT /departments/:propertyId/:departmentId"}, "fullDescription": {"text": "`src/supabase/functions/server/departments.tsx` declares `PUT /departments/:propertyId/:departmentId` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-634a9d7de3f1e66f", "name": "Unused endpoint: POST /departments/seed-missing", "shortDescription": {"text": "Unused endpoint: POST /departments/seed-missing"}, "fullDescription": {"text": "`src/supabase/functions/server/departments.tsx` declares `POST /departments/seed-missing` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-f3b82abaa2172d40", "name": "Unused endpoint: POST /departments/migrate-site-index", "shortDescription": {"text": "Unused endpoint: POST /departments/migrate-site-index"}, "fullDescription": {"text": "`src/supabase/functions/server/departments.tsx` declares `POST /departments/migrate-site-index` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-8cb638bf41f056d7", "name": "Unused endpoint: GET /departments/debug/status", "shortDescription": {"text": "Unused endpoint: GET /departments/debug/status"}, "fullDescription": {"text": "`src/supabase/functions/server/departments.tsx` declares `GET /departments/debug/status` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-a42438f725bc48ec", "name": "Unused endpoint: DELETE /departments/debug/clear-all", "shortDescription": {"text": "Unused endpoint: DELETE /departments/debug/clear-all"}, "fullDescription": {"text": "`src/supabase/functions/server/departments.tsx` declares `DELETE /departments/debug/clear-all` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-1ba03af24d3565e9", "name": "Unused endpoint: GET /invites/:userId", "shortDescription": {"text": "Unused endpoint: GET /invites/:userId"}, "fullDescription": {"text": "`src/supabase/functions/server/invites.tsx` declares `GET /invites/:userId` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-c9451b66f68ffc25", "name": "Unused endpoint: POST /invites", "shortDescription": {"text": "Unused endpoint: POST /invites"}, "fullDescription": {"text": "`src/supabase/functions/server/invites.tsx` declares `POST /invites` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-c75be402bbd6787a", "name": "Unused endpoint: DELETE /invites/:userId/:id", "shortDescription": {"text": "Unused endpoint: DELETE /invites/:userId/:id"}, "fullDescription": {"text": "`src/supabase/functions/server/invites.tsx` declares `DELETE /invites/:userId/:id` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-d8d150fd727ca70b", "name": "Unused endpoint: GET /forestry-plans/:propertyId", "shortDescription": {"text": "Unused endpoint: GET /forestry-plans/:propertyId"}, "fullDescription": {"text": "`src/supabase/functions/server/forestry-plans.tsx` declares `GET /forestry-plans/:propertyId` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-ad0fec2d3cdea37e", "name": "Unused endpoint: GET /forestry-plans/:propertyId/:departmentId", "shortDescription": {"text": "Unused endpoint: GET /forestry-plans/:propertyId/:departmentId"}, "fullDescription": {"text": "`src/supabase/functions/server/forestry-plans.tsx` declares `GET /forestry-plans/:propertyId/:departmentId` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-45ecd2c884235359", "name": "Unused endpoint: GET /forestry-plans/:propertyId/:departmentId/:actionId", "shortDescription": {"text": "Unused endpoint: GET /forestry-plans/:propertyId/:departmentId/:actionId"}, "fullDescription": {"text": "`src/supabase/functions/server/forestry-plans.tsx` declares `GET /forestry-plans/:propertyId/:departmentId/:actionId` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-c7d3081526bcfb0d", "name": "Unused endpoint: POST /forestry-plans/:propertyId/:departmentId", "shortDescription": {"text": "Unused endpoint: POST /forestry-plans/:propertyId/:departmentId"}, "fullDescription": {"text": "`src/supabase/functions/server/forestry-plans.tsx` declares `POST /forestry-plans/:propertyId/:departmentId` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-f20a1e8aa91784d2", "name": "Unused endpoint: PUT /forestry-plans/:propertyId/:departmentId/:actionId", "shortDescription": {"text": "Unused endpoint: PUT /forestry-plans/:propertyId/:departmentId/:actionId"}, "fullDescription": {"text": "`src/supabase/functions/server/forestry-plans.tsx` declares `PUT /forestry-plans/:propertyId/:departmentId/:actionId` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-053af9ed18ca9603", "name": "Unused endpoint: DELETE /forestry-plans/:propertyId/:departmentId/:actionId", "shortDescription": {"text": "Unused endpoint: DELETE /forestry-plans/:propertyId/:departmentId/:actionId"}, "fullDescription": {"text": "`src/supabase/functions/server/forestry-plans.tsx` declares `DELETE /forestry-plans/:propertyId/:departmentId/:actionId` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-e4f0cc29694321d8", "name": "Unused endpoint: GET /forestry-plans/debug/status", "shortDescription": {"text": "Unused endpoint: GET /forestry-plans/debug/status"}, "fullDescription": {"text": "`src/supabase/functions/server/forestry-plans.tsx` declares `GET /forestry-plans/debug/status` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-577759a83cd8243d", "name": "Unused endpoint: DELETE /forestry-plans/debug/clear-all", "shortDescription": {"text": "Unused endpoint: DELETE /forestry-plans/debug/clear-all"}, "fullDescription": {"text": "`src/supabase/functions/server/forestry-plans.tsx` declares `DELETE /forestry-plans/debug/clear-all` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-3abf952b8d28d710", "name": "Unused endpoint: USE /*", "shortDescription": {"text": "Unused endpoint: USE /*"}, "fullDescription": {"text": "`src/supabase/functions/server/index.tsx` declares `USE /*` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-055cf4d663317f59", "name": "Unused endpoint: GET /make-server-ffc89dab/health", "shortDescription": {"text": "Unused endpoint: GET /make-server-ffc89dab/health"}, "fullDescription": {"text": "`src/supabase/functions/server/index.tsx` declares `GET /make-server-ffc89dab/health` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-41c2d51311dad473", "name": "Unused endpoint: POST /make-server-ffc89dab/debug/reinit-all", "shortDescription": {"text": "Unused endpoint: POST /make-server-ffc89dab/debug/reinit-all"}, "fullDescription": {"text": "`src/supabase/functions/server/index.tsx` declares `POST /make-server-ffc89dab/debug/reinit-all` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-ad462bd006faca13", "name": "Unused endpoint: GET /properties/:userId", "shortDescription": {"text": "Unused endpoint: GET /properties/:userId"}, "fullDescription": {"text": "`src/supabase/functions/server/properties.tsx` declares `GET /properties/:userId` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-d19b2d76cf93168f", "name": "Unused endpoint: GET /properties/:userId/:propertyId", "shortDescription": {"text": "Unused endpoint: GET /properties/:userId/:propertyId"}, "fullDescription": {"text": "`src/supabase/functions/server/properties.tsx` declares `GET /properties/:userId/:propertyId` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-99040ed911d1cef3", "name": "Unused endpoint: GET /debug/all-properties", "shortDescription": {"text": "Unused endpoint: GET /debug/all-properties"}, "fullDescription": {"text": "`src/supabase/functions/server/properties.tsx` declares `GET /debug/all-properties` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-f35ae0d019e0cb6b", "name": "Unused endpoint: DELETE /debug/clear-properties", "shortDescription": {"text": "Unused endpoint: DELETE /debug/clear-properties"}, "fullDescription": {"text": "`src/supabase/functions/server/properties.tsx` declares `DELETE /debug/clear-properties` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-1f85cff6000fc979", "name": "Unused endpoint: GET /notes/:propertyId", "shortDescription": {"text": "Unused endpoint: GET /notes/:propertyId"}, "fullDescription": {"text": "`src/supabase/functions/server/notes.tsx` declares `GET /notes/:propertyId` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-f48242b46b49ddce", "name": "Unused endpoint: POST /notes", "shortDescription": {"text": "Unused endpoint: POST /notes"}, "fullDescription": {"text": "`src/supabase/functions/server/notes.tsx` declares `POST /notes` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-6a21f387c383a2ef", "name": "Unused endpoint: PUT /notes/:propertyId/:noteId", "shortDescription": {"text": "Unused endpoint: PUT /notes/:propertyId/:noteId"}, "fullDescription": {"text": "`src/supabase/functions/server/notes.tsx` declares `PUT /notes/:propertyId/:noteId` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-287854a48efa8153", "name": "Unused endpoint: DELETE /notes/:propertyId/:noteId", "shortDescription": {"text": "Unused endpoint: DELETE /notes/:propertyId/:noteId"}, "fullDescription": {"text": "`src/supabase/functions/server/notes.tsx` declares `DELETE /notes/:propertyId/:noteId` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-c54d68079daf388d", "name": "Unused endpoint: GET /user/:userId", "shortDescription": {"text": "Unused endpoint: GET /user/:userId"}, "fullDescription": {"text": "`src/supabase/functions/server/users.tsx` declares `GET /user/:userId` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-5db8b348ac87358e", "name": "Unused endpoint: PUT /user/:userId", "shortDescription": {"text": "Unused endpoint: PUT /user/:userId"}, "fullDescription": {"text": "`src/supabase/functions/server/users.tsx` declares `PUT /user/:userId` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-9598b84e3b9fae5a", "name": "Unused endpoint: PUT /user/:userId/notifications", "shortDescription": {"text": "Unused endpoint: PUT /user/:userId/notifications"}, "fullDescription": {"text": "`src/supabase/functions/server/users.tsx` declares `PUT /user/:userId/notifications` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}]}}, "automationDetails": {"id": "repobility/19188"}, "properties": {"repository": "SECONDOAK/holmen-webbapp", "repoUrl": "https://github.com/SECONDOAK/holmen-webbapp", "branch": "main"}, "results": [{"ruleId": "scanner-f42d5ac21741f2ef", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/App.tsx:39"}, "properties": {"repobilityId": "f3d63003b5dbefbd", "scanner": "scanner-primary", "fingerprint": "f42d5ac21741f2ef", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-12814ffabac8994d", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/utils/propertiesApi.tsx:20"}, "properties": {"repobilityId": "07605e6a51046fe4", "scanner": "scanner-primary", "fingerprint": "12814ffabac8994d", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-11161aed27739f5b", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/utils/resetDatabase.ts:9"}, "properties": {"repobilityId": "60f44ce8e1d108bd", "scanner": "scanner-primary", "fingerprint": "11161aed27739f5b", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-8aec8190a3328438", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/components/HolmenIcon.tsx:47"}, "properties": {"repobilityId": "33081ac0f6efe93f", "scanner": "scanner-primary", "fingerprint": "8aec8190a3328438", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-2de14f5605297e03", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/components/DepartmentsListView.tsx:172"}, "properties": {"repobilityId": "5e50e65550dc76b6", "scanner": "scanner-primary", "fingerprint": "2de14f5605297e03", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-758df67ed790bf97", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/components/DepartmentDetailsView.tsx:129"}, "properties": {"repobilityId": "781f0f175017c2fc", "scanner": "scanner-primary", "fingerprint": "758df67ed790bf97", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-830c92a58d54aef7", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/PropertySwitcher.tsx:44"}, "properties": {"repobilityId": "5ede89c4a9741f46", "scanner": "scanner-primary", "fingerprint": "830c92a58d54aef7", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-86c207d5c7e9ba1d", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/ContactCard.tsx:243"}, "properties": {"repobilityId": "36d98282b0285213", "scanner": "scanner-primary", "fingerprint": "86c207d5c7e9ba1d", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-1ce12f3ed896eaa4", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/components/HolmenWebbIcon.tsx:67"}, "properties": {"repobilityId": "b47754bc003c7007", "scanner": "scanner-primary", "fingerprint": "1ce12f3ed896eaa4", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-a1cd7f7266e1b710", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/components/MapDrawer.tsx:483"}, "properties": {"repobilityId": "94e8b8518e6b3f35", "scanner": "scanner-primary", "fingerprint": "a1cd7f7266e1b710", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-5f8b995e940bd55c", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 src/components/ui/chart.tsx:83"}, "properties": {"repobilityId": "b8c68f17a4018107", "scanner": "scanner-primary", "fingerprint": "5f8b995e940bd55c", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-22fe89cc2494e63b", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/contracts-v2/BetalplanChart.tsx:276"}, "properties": {"repobilityId": "7ef3263290b94448", "scanner": "scanner-primary", "fingerprint": "22fe89cc2494e63b", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-2c2e1c72ca020251", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/contracts-v2/ContractRow.tsx:105"}, "properties": {"repobilityId": "bb741801a269e5eb", "scanner": "scanner-primary", "fingerprint": "2c2e1c72ca020251", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-9a29f3a23b4aa2b0", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/contracts-v2/Aff\u00e4rGroup.tsx:41"}, "properties": {"repobilityId": "1b9e1455fac9e3dd", "scanner": "scanner-primary", "fingerprint": "9a29f3a23b4aa2b0", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-a4f546a105220f4d", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/contracts-v2/KostnaderChart.tsx:308"}, "properties": {"repobilityId": "d71d5f80db4214a0", "scanner": "scanner-primary", "fingerprint": "a4f546a105220f4d", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-90f3c07be10ca8cc", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/contracts-v2/DateRangePicker.tsx:186"}, "properties": {"repobilityId": "be145e5f879d12db", "scanner": "scanner-primary", "fingerprint": "90f3c07be10ca8cc", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-f73b5e0a83740463", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/contracts-v2/PaymentsChart.tsx:396"}, "properties": {"repobilityId": "af35f78967874232", "scanner": "scanner-primary", "fingerprint": "f73b5e0a83740463", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-3b671fc4dc9e7e89", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/contracts-v2/UtbetalningarTable.tsx:106"}, "properties": {"repobilityId": "95b1bb9eb64cb679", "scanner": "scanner-primary", "fingerprint": "3b671fc4dc9e7e89", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-1ac4f92b7d3db028", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/contracts-v2/ContractDetailsPanel.tsx:107"}, "properties": {"repobilityId": "2d2a14bd552d1717", "scanner": "scanner-primary", "fingerprint": "1ac4f92b7d3db028", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-59880809ffff3b84", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/contracts-v2/SortimentChart.tsx:188"}, "properties": {"repobilityId": "a8bc7293d46e1969", "scanner": "scanner-primary", "fingerprint": "59880809ffff3b84", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-d6730baf04cdee75", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/contracts-v2/AtgardListItem.tsx:25"}, "properties": {"repobilityId": "b947917db7b298d7", "scanner": "scanner-primary", "fingerprint": "d6730baf04cdee75", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-256c7c4f9348e364", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/contracts-v2/DokumentListItem.tsx:20"}, "properties": {"repobilityId": "36f84208c3eca6c0", "scanner": "scanner-primary", "fingerprint": "256c7c4f9348e364", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-082f3917018aeed0", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/contexts/UserContext.tsx:34"}, "properties": {"repobilityId": "1415e91c802ee2a9", "scanner": "scanner-primary", "fingerprint": "082f3917018aeed0", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-de45421593624e45", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/contexts/ProfileContext.tsx:89"}, "properties": {"repobilityId": "c7c44f52ca2a6518", "scanner": "scanner-primary", "fingerprint": "de45421593624e45", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-47556360f7c0fb16", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/pages/PropertiesPage.tsx:461"}, "properties": {"repobilityId": "a68af9f9cba96ddc", "scanner": "scanner-primary", "fingerprint": "47556360f7c0fb16", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-b2dfbb27b9eea4a6", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/pages/InvoicesPage.tsx:261"}, "properties": {"repobilityId": "28d83be80e493fbb", "scanner": "scanner-primary", "fingerprint": "b2dfbb27b9eea4a6", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-8433efb460c78629", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/pages/AllNewsPage.tsx:170"}, "properties": {"repobilityId": "dda098d7a4ffbad0", "scanner": "scanner-primary", "fingerprint": "8433efb460c78629", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-4be2797f2a19643e", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/pages/AccountPage.tsx:417"}, "properties": {"repobilityId": "7ba92cd59d746c16", "scanner": "scanner-primary", "fingerprint": "4be2797f2a19643e", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-638a588ae07bee21", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/pages/ContractDetailPage.tsx:104"}, "properties": {"repobilityId": "3fc2fc42ad3a6044", "scanner": "scanner-primary", "fingerprint": "638a588ae07bee21", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-e7d2c9af10b3d248", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/pages/AnnualStatementPage.tsx:166"}, "properties": {"repobilityId": "f1d34c4b2f959982", "scanner": "scanner-primary", "fingerprint": "e7d2c9af10b3d248", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-2f4611a865d83668", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/pages/DocumentsPage.tsx:284"}, "properties": {"repobilityId": "12328d345e0221f5", "scanner": "scanner-primary", "fingerprint": "2f4611a865d83668", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-a6029a2e8d71bc16", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/supabase/functions/server/departments.tsx:101"}, "properties": {"repobilityId": "3e2049a51c3d1ed7", "scanner": "scanner-primary", "fingerprint": "a6029a2e8d71bc16", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-2acd80113f7f8f9e", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/supabase/functions/server/forestry-plans.tsx:270"}, "properties": {"repobilityId": "6167489d634a7be6", "scanner": "scanner-primary", "fingerprint": "2acd80113f7f8f9e", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-cf027dd34b57c748", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/supabase/functions/server/index.tsx:15"}, "properties": {"repobilityId": "25f7e5bf54674f69", "scanner": "scanner-primary", "fingerprint": "cf027dd34b57c748", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-f9e1ad592a520115", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/supabase/functions/server/properties.tsx:289"}, "properties": {"repobilityId": "f2cbab9aecb46d96", "scanner": "scanner-primary", "fingerprint": "f9e1ad592a520115", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-c277ab6fc30ecf40", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/supabase/functions/server/notes.tsx:24"}, "properties": {"repobilityId": "2b45268d58917569", "scanner": "scanner-primary", "fingerprint": "c277ab6fc30ecf40", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-5be698cfac4b8e4b", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/supabase/functions/server/users.tsx:10"}, "properties": {"repobilityId": "d49911abd92be1ef", "scanner": "scanner-primary", "fingerprint": "5be698cfac4b8e4b", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-e0752f340e2c36c9", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in src/test-debug.html:11"}, "properties": {"repobilityId": "041f64a6aed2959f", "scanner": "scanner-primary", "fingerprint": "e0752f340e2c36c9", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/test-debug.html"}, "region": {"startLine": 11}}}]}, {"ruleId": "scanner-6976bc10c9543e82", "level": "error", "message": {"text": "Possible secret in src/utils/mapSnapshots.ts"}, "properties": {"repobilityId": "df5c3ffac029c4d0", "scanner": "scanner-primary", "fingerprint": "6976bc10c9543e82", "layer": "security", "severity": "critical", "confidence": 1.0, "tags": ["secrets"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/utils/mapSnapshots.ts"}, "region": {"startLine": 3}}}]}, {"ruleId": "scanner-db6f8c34ca1faabf", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in src/components/HolmenIcon.tsx:47"}, "properties": {"repobilityId": "d6fac69fe9ddbe0b", "scanner": "scanner-primary", "fingerprint": "db6f8c34ca1faabf", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/components/HolmenIcon.tsx"}, "region": {"startLine": 47}}}]}, {"ruleId": "scanner-1352a112ad20d44c", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in src/components/HolmenWebbIcon.tsx:67"}, "properties": {"repobilityId": "ba18ae633e2c37fb", "scanner": "scanner-primary", "fingerprint": "1352a112ad20d44c", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/components/HolmenWebbIcon.tsx"}, "region": {"startLine": 67}}}]}, {"ruleId": "scanner-6f38a33241735455", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in src/components/ui/chart.tsx:83"}, "properties": {"repobilityId": "33f10636e53b4298", "scanner": "scanner-primary", "fingerprint": "6f38a33241735455", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/components/ui/chart.tsx"}, "region": {"startLine": 83}}}]}, {"ruleId": "scanner-2b84307c65103c0f", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in src/pages/PropertiesPage.tsx:1984"}, "properties": {"repobilityId": "9ce1fd9ac0af2b49", "scanner": "scanner-primary", "fingerprint": "2b84307c65103c0f", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/pages/PropertiesPage.tsx"}, "region": {"startLine": 1984}}}]}, {"ruleId": "scanner-de956837f53d7fa9", "level": "warning", "message": {"text": "Insecure pattern 'cors_wildcard' in src/supabase/functions/server/index.tsx:28"}, "properties": {"repobilityId": "80a8cbffb103a87a", "scanner": "scanner-primary", "fingerprint": "de956837f53d7fa9", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "cors_wildcard"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/supabase/functions/server/index.tsx"}, "region": {"startLine": 28}}}]}, {"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": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "419d1ec7943efec2", "scanner": "scanner-primary", "fingerprint": "28c4a04bd807da0c", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/deploy.yml"}, "region": {"startLine": 41}}}]}, {"ruleId": "scanner-ad6701f0a8405e22", "level": "warning", "message": {"text": "GitHub Actions workflow grants broad write permissions"}, "properties": {"repobilityId": "8384c23520d55657", "scanner": "scanner-primary", "fingerprint": "ad6701f0a8405e22", "layer": "cicd", "severity": "medium", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "least-privilege"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/deploy.yml"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-92167146bb0b3353", "level": "note", "message": {"text": "Very large file: src/components/MapDrawer.tsx (1116 lines)"}, "properties": {"repobilityId": "658e500632f19642", "scanner": "scanner-primary", "fingerprint": "92167146bb0b3353", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-d172cfdb4199e2a9", "level": "note", "message": {"text": "Very large file: src/components/MobileBottomDrawer.tsx (1015 lines)"}, "properties": {"repobilityId": "c69300f027afaf9d", "scanner": "scanner-primary", "fingerprint": "d172cfdb4199e2a9", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-38e0cd3a083c4183", "level": "note", "message": {"text": "Very large file: src/pages/PropertiesPage.tsx (4227 lines)"}, "properties": {"repobilityId": "c5d61fd748a0ac80", "scanner": "scanner-primary", "fingerprint": "38e0cd3a083c4183", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-59369690025357f7", "level": "note", "message": {"text": "Very large file: src/pages/AccountPage.tsx (1714 lines)"}, "properties": {"repobilityId": "01cd840048a6412e", "scanner": "scanner-primary", "fingerprint": "59369690025357f7", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-a2d7dbacfd4da813", "level": "note", "message": {"text": "Very large file: src/imports/IPhone16ProMax20.tsx (1532 lines)"}, "properties": {"repobilityId": "ac190528cc5f3ae3", "scanner": "scanner-primary", "fingerprint": "a2d7dbacfd4da813", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-e956ee31af6048e5", "level": "note", "message": {"text": "Very large file: src/imports/Desktop65.tsx (1378 lines)"}, "properties": {"repobilityId": "56dbaa7145e4b064", "scanner": "scanner-primary", "fingerprint": "e956ee31af6048e5", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-12d8fdfa39d816dc", "level": "note", "message": {"text": "Very large file: src/imports/Frame2.tsx (2611 lines)"}, "properties": {"repobilityId": "fea0aac35b5fc467", "scanner": "scanner-primary", "fingerprint": "12d8fdfa39d816dc", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-2aa5cc9660958d3a", "level": "note", "message": {"text": "Very large file: src/imports/Desktop67.tsx (3358 lines)"}, "properties": {"repobilityId": "0436c78eea055938", "scanner": "scanner-primary", "fingerprint": "2aa5cc9660958d3a", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-4ae8dc775d72d3ab", "level": "note", "message": {"text": "Very large file: src/imports/Desktop68.tsx (1746 lines)"}, "properties": {"repobilityId": "c1ddb8cf7b21137c", "scanner": "scanner-primary", "fingerprint": "4ae8dc775d72d3ab", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-fe87ec3e975e721c", "level": "note", "message": {"text": "Very large file: src/imports/Frame1.tsx (1173 lines)"}, "properties": {"repobilityId": "e9c23f484bcc72df", "scanner": "scanner-primary", "fingerprint": "fe87ec3e975e721c", "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": "87377498f2ab36c6", "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": "c8364e87934ec5fe", "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": "9449f6249d20281e", "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": "9ab824ead15cf5ad", "scanner": "scanner-primary", "fingerprint": "2d0c7b7ab8f8aacf", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["placeholder", "mock-data", "critical-flow", "generated-repo-pattern"]}}, {"ruleId": "scanner-11825279136b53a3", "level": "warning", "message": {"text": "CI is configured but no tests are detected"}, "properties": {"repobilityId": "87a4f7b1efb822a6", "scanner": "scanner-primary", "fingerprint": "11825279136b53a3", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["tests", "ci", "config-theater", "repo-hardening", "generated-repo-pattern"]}}, {"ruleId": "scanner-b9088664ace7f748", "level": "note", "message": {"text": "Composite production-readiness gap"}, "properties": {"repobilityId": "cfeafb3fd0386584", "scanner": "scanner-primary", "fingerprint": "b9088664ace7f748", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["production-readiness", "repo-hardening", "generated-repo-pattern"]}}, {"ruleId": "scanner-749d4bc1bd66df5f", "level": "warning", "message": {"text": "Agent instructions exist but release-hardening basics are missing"}, "properties": {"repobilityId": "a7cf62e08bbecd85", "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": "728e4079e9beb119", "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": "caa8a57998904ef2", "scanner": "scanner-primary", "fingerprint": "8424db9c75e04ba4", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["provenance", "git-history", "generated-repo-pattern"]}}, {"ruleId": "scanner-6a2f975986be98f1", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/App.tsx:156"}, "properties": {"repobilityId": "d06801b212407097", "scanner": "scanner-primary", "fingerprint": "6a2f975986be98f1", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-897956dd8311d196", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/utils/resetDatabase.ts:12"}, "properties": {"repobilityId": "4dd4a95f3372c9cb", "scanner": "scanner-primary", "fingerprint": "897956dd8311d196", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-625eb6bd00026676", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/DepartmentDetailsView.tsx:134"}, "properties": {"repobilityId": "65c2841bdd511f62", "scanner": "scanner-primary", "fingerprint": "625eb6bd00026676", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-327a1ca968b46aa9", "level": "none", "message": {"text": "Commented-code block (6 lines) in src/components/contracts-v2/\u00c5terrapporteringTable.tsx:60"}, "properties": {"repobilityId": "f0445d9e9d868924", "scanner": "scanner-primary", "fingerprint": "327a1ca968b46aa9", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-57d4f2419bedf1ad", "level": "none", "message": {"text": "Commented-code block (8 lines) in src/pages/PropertiesPage.tsx:228"}, "properties": {"repobilityId": "7867fd399a643d08", "scanner": "scanner-primary", "fingerprint": "57d4f2419bedf1ad", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-97757949e848b188", "level": "none", "message": {"text": "Commented-code block (7 lines) in src/supabase/functions/server/departments.tsx:122"}, "properties": {"repobilityId": "516446ed10b832dd", "scanner": "scanner-primary", "fingerprint": "97757949e848b188", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-148e1bb75383c362", "level": "error", "message": {"text": "Dangling fetch: POST https://${projectId}.supabase.co/functions/v1/make-server-ffc89dab/departments/migrate-site-index (src/App.tsx:105)"}, "properties": {"repobilityId": "23a70349341d26f4", "scanner": "scanner-primary", "fingerprint": "148e1bb75383c362", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-ec4b6851d5bbaecd", "level": "error", "message": {"text": "Dangling fetch: POST https://${projectId}.supabase.co/functions/v1/make-server-ffc89dab/departments/seed-missing (src/utils/resetDatabase.ts:12)"}, "properties": {"repobilityId": "b6b4558709484de3", "scanner": "scanner-primary", "fingerprint": "ec4b6851d5bbaecd", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-7ffc9790a5117ce8", "level": "error", "message": {"text": "Dangling fetch: POST https://${projectId}.supabase.co/functions/v1/make-server-ffc89dab/debug/reinit-all (src/utils/resetDatabase.ts:59)"}, "properties": {"repobilityId": "f423d7b86a146aa4", "scanner": "scanner-primary", "fingerprint": "7ffc9790a5117ce8", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-5c36064cd445e1b3", "level": "error", "message": {"text": "Dangling fetch: GET https://${projectId}.supabase.co/functions/v1/make-server-ffc89dab/departments/${propertyId} (src/components/DepartmentsListView.tsx:174)"}, "properties": {"repobilityId": "f609b76955f7b485", "scanner": "scanner-primary", "fingerprint": "5c36064cd445e1b3", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-88aef9006d84e84b", "level": "error", "message": {"text": "Dangling fetch: DELETE https://${projectId}.supabase.co/functions/v1/make-server-ffc89dab/departments/debug/clear-all (src/components/DepartmentsListView.tsx:206)"}, "properties": {"repobilityId": "14f696b9657d6e62", "scanner": "scanner-primary", "fingerprint": "88aef9006d84e84b", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-3c77aa3d3a340da3", "level": "error", "message": {"text": "Dangling fetch: GET https://${projectId}.supabase.co/functions/v1/make-server-ffc89dab/departments/${selectedProperty.id} (src/pages/PropertiesPage.tsx:758)"}, "properties": {"repobilityId": "1d29b1c4ff9f864a", "scanner": "scanner-primary", "fingerprint": "3c77aa3d3a340da3", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-59b76f5b3dde6401", "level": "error", "message": {"text": "Dangling fetch: GET https://${projectId}.supabase.co/functions/v1/make-server-ffc89dab/user/${loggedInUser.id} (src/pages/AccountPage.tsx:302)"}, "properties": {"repobilityId": "1915dca355f4feb6", "scanner": "scanner-primary", "fingerprint": "59b76f5b3dde6401", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-66dc68746273b634", "level": "error", "message": {"text": "Dangling fetch: PUT https://${projectId}.supabase.co/functions/v1/make-server-ffc89dab/user/${loggedInUser.id} (src/pages/AccountPage.tsx:632)"}, "properties": {"repobilityId": "e9f3114d19f56aba", "scanner": "scanner-primary", "fingerprint": "66dc68746273b634", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-31930ecd2b19c4b4", "level": "error", "message": {"text": "Dangling fetch: GET https://${projectId}.supabase.co/functions/v1/make-server-ffc89dab/departments/debug/status (src/pages/DatabaseToolsPage.tsx:18)"}, "properties": {"repobilityId": "955ace32bddbf9ea", "scanner": "scanner-primary", "fingerprint": "31930ecd2b19c4b4", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-a2a95d467b2485e3", "level": "error", "message": {"text": "Dangling fetch: POST https://${projectId}.supabase.co/functions/v1/make-server-ffc89dab/departments/migrate-site-index (src/pages/DatabaseToolsPage.tsx:38)"}, "properties": {"repobilityId": "887f82953aee7b80", "scanner": "scanner-primary", "fingerprint": "a2a95d467b2485e3", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-89c52cb0596d9e7e", "level": "error", "message": {"text": "Dangling fetch: POST https://${projectId}.supabase.co/functions/v1/make-server-ffc89dab/departments/seed-missing (src/pages/DatabaseToolsPage.tsx:61)"}, "properties": {"repobilityId": "58d76a177f0f4be4", "scanner": "scanner-primary", "fingerprint": "89c52cb0596d9e7e", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-9e66c95c511bd0c6", "level": "error", "message": {"text": "Dangling fetch: POST https://${projectId}.supabase.co/functions/v1/make-server-ffc89dab/debug/reinit-all (src/pages/DatabaseToolsPage.tsx:84)"}, "properties": {"repobilityId": "59c95c8045d94807", "scanner": "scanner-primary", "fingerprint": "9e66c95c511bd0c6", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-07d03ae4f204edf5", "level": "note", "message": {"text": "Unused endpoint: GET /departments/:propertyId"}, "properties": {"repobilityId": "223e9a4d10b62446", "scanner": "scanner-primary", "fingerprint": "07d03ae4f204edf5", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-7e3b00946e23ff37", "level": "note", "message": {"text": "Unused endpoint: GET /departments/:propertyId/:departmentId"}, "properties": {"repobilityId": "69a16caca5d02c7a", "scanner": "scanner-primary", "fingerprint": "7e3b00946e23ff37", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-3e305959f54a8ec3", "level": "note", "message": {"text": "Unused endpoint: PUT /departments/:propertyId/:departmentId"}, "properties": {"repobilityId": "7b2617b825fb3742", "scanner": "scanner-primary", "fingerprint": "3e305959f54a8ec3", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-634a9d7de3f1e66f", "level": "note", "message": {"text": "Unused endpoint: POST /departments/seed-missing"}, "properties": {"repobilityId": "f9b23652c503535b", "scanner": "scanner-primary", "fingerprint": "634a9d7de3f1e66f", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-f3b82abaa2172d40", "level": "note", "message": {"text": "Unused endpoint: POST /departments/migrate-site-index"}, "properties": {"repobilityId": "d2f2aee0f2d11cea", "scanner": "scanner-primary", "fingerprint": "f3b82abaa2172d40", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-8cb638bf41f056d7", "level": "note", "message": {"text": "Unused endpoint: GET /departments/debug/status"}, "properties": {"repobilityId": "740a59947512f643", "scanner": "scanner-primary", "fingerprint": "8cb638bf41f056d7", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-a42438f725bc48ec", "level": "note", "message": {"text": "Unused endpoint: DELETE /departments/debug/clear-all"}, "properties": {"repobilityId": "3aaeac8d2065e85c", "scanner": "scanner-primary", "fingerprint": "a42438f725bc48ec", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-1ba03af24d3565e9", "level": "note", "message": {"text": "Unused endpoint: GET /invites/:userId"}, "properties": {"repobilityId": "7fbad635a7ce2d5e", "scanner": "scanner-primary", "fingerprint": "1ba03af24d3565e9", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-c9451b66f68ffc25", "level": "note", "message": {"text": "Unused endpoint: POST /invites"}, "properties": {"repobilityId": "f5e463d6473349c2", "scanner": "scanner-primary", "fingerprint": "c9451b66f68ffc25", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-c75be402bbd6787a", "level": "note", "message": {"text": "Unused endpoint: DELETE /invites/:userId/:id"}, "properties": {"repobilityId": "8d958a9b0479bb6a", "scanner": "scanner-primary", "fingerprint": "c75be402bbd6787a", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-d8d150fd727ca70b", "level": "note", "message": {"text": "Unused endpoint: GET /forestry-plans/:propertyId"}, "properties": {"repobilityId": "3f9a500cd4b790a7", "scanner": "scanner-primary", "fingerprint": "d8d150fd727ca70b", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-ad0fec2d3cdea37e", "level": "note", "message": {"text": "Unused endpoint: GET /forestry-plans/:propertyId/:departmentId"}, "properties": {"repobilityId": "5235e7440cdb935e", "scanner": "scanner-primary", "fingerprint": "ad0fec2d3cdea37e", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-45ecd2c884235359", "level": "note", "message": {"text": "Unused endpoint: GET /forestry-plans/:propertyId/:departmentId/:actionId"}, "properties": {"repobilityId": "6695aa789609f565", "scanner": "scanner-primary", "fingerprint": "45ecd2c884235359", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-c7d3081526bcfb0d", "level": "note", "message": {"text": "Unused endpoint: POST /forestry-plans/:propertyId/:departmentId"}, "properties": {"repobilityId": "30598c0232e07223", "scanner": "scanner-primary", "fingerprint": "c7d3081526bcfb0d", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-f20a1e8aa91784d2", "level": "note", "message": {"text": "Unused endpoint: PUT /forestry-plans/:propertyId/:departmentId/:actionId"}, "properties": {"repobilityId": "0725cdcd08ab89fe", "scanner": "scanner-primary", "fingerprint": "f20a1e8aa91784d2", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-053af9ed18ca9603", "level": "note", "message": {"text": "Unused endpoint: DELETE /forestry-plans/:propertyId/:departmentId/:actionId"}, "properties": {"repobilityId": "caebe552f2f91bcf", "scanner": "scanner-primary", "fingerprint": "053af9ed18ca9603", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-e4f0cc29694321d8", "level": "note", "message": {"text": "Unused endpoint: GET /forestry-plans/debug/status"}, "properties": {"repobilityId": "e3fe48fa5c54936a", "scanner": "scanner-primary", "fingerprint": "e4f0cc29694321d8", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-577759a83cd8243d", "level": "note", "message": {"text": "Unused endpoint: DELETE /forestry-plans/debug/clear-all"}, "properties": {"repobilityId": "4670bce8cc72c1d6", "scanner": "scanner-primary", "fingerprint": "577759a83cd8243d", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-3abf952b8d28d710", "level": "note", "message": {"text": "Unused endpoint: USE /*"}, "properties": {"repobilityId": "d2e72657b354558c", "scanner": "scanner-primary", "fingerprint": "3abf952b8d28d710", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-055cf4d663317f59", "level": "note", "message": {"text": "Unused endpoint: GET /make-server-ffc89dab/health"}, "properties": {"repobilityId": "b623699c2b658c6c", "scanner": "scanner-primary", "fingerprint": "055cf4d663317f59", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-41c2d51311dad473", "level": "note", "message": {"text": "Unused endpoint: POST /make-server-ffc89dab/debug/reinit-all"}, "properties": {"repobilityId": "067ad42f52d513ac", "scanner": "scanner-primary", "fingerprint": "41c2d51311dad473", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-ad462bd006faca13", "level": "note", "message": {"text": "Unused endpoint: GET /properties/:userId"}, "properties": {"repobilityId": "742ec9ca73cd446e", "scanner": "scanner-primary", "fingerprint": "ad462bd006faca13", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-d19b2d76cf93168f", "level": "note", "message": {"text": "Unused endpoint: GET /properties/:userId/:propertyId"}, "properties": {"repobilityId": "e2e1c59f80e7e15c", "scanner": "scanner-primary", "fingerprint": "d19b2d76cf93168f", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-99040ed911d1cef3", "level": "note", "message": {"text": "Unused endpoint: GET /debug/all-properties"}, "properties": {"repobilityId": "412a58db1745314f", "scanner": "scanner-primary", "fingerprint": "99040ed911d1cef3", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-f35ae0d019e0cb6b", "level": "note", "message": {"text": "Unused endpoint: DELETE /debug/clear-properties"}, "properties": {"repobilityId": "b00bfd32f84cb284", "scanner": "scanner-primary", "fingerprint": "f35ae0d019e0cb6b", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-1f85cff6000fc979", "level": "note", "message": {"text": "Unused endpoint: GET /notes/:propertyId"}, "properties": {"repobilityId": "393b21b8ba5087bd", "scanner": "scanner-primary", "fingerprint": "1f85cff6000fc979", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-f48242b46b49ddce", "level": "note", "message": {"text": "Unused endpoint: POST /notes"}, "properties": {"repobilityId": "abeb0d978cabd843", "scanner": "scanner-primary", "fingerprint": "f48242b46b49ddce", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-6a21f387c383a2ef", "level": "note", "message": {"text": "Unused endpoint: PUT /notes/:propertyId/:noteId"}, "properties": {"repobilityId": "3275374825d1f83d", "scanner": "scanner-primary", "fingerprint": "6a21f387c383a2ef", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-287854a48efa8153", "level": "note", "message": {"text": "Unused endpoint: DELETE /notes/:propertyId/:noteId"}, "properties": {"repobilityId": "88d6bf7e4f583c31", "scanner": "scanner-primary", "fingerprint": "287854a48efa8153", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-c54d68079daf388d", "level": "note", "message": {"text": "Unused endpoint: GET /user/:userId"}, "properties": {"repobilityId": "f2c89160d0db66e6", "scanner": "scanner-primary", "fingerprint": "c54d68079daf388d", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-5db8b348ac87358e", "level": "note", "message": {"text": "Unused endpoint: PUT /user/:userId"}, "properties": {"repobilityId": "3a391581a2be6424", "scanner": "scanner-primary", "fingerprint": "5db8b348ac87358e", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-9598b84e3b9fae5a", "level": "note", "message": {"text": "Unused endpoint: PUT /user/:userId/notifications"}, "properties": {"repobilityId": "cada96b6ced10501", "scanner": "scanner-primary", "fingerprint": "9598b84e3b9fae5a", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}]}]}