{"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-0d990be4c4bf952f", "name": "Stray `console.log` in TS/JS \u2014 apps/api/src/index.ts:44", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 apps/api/src/index.ts:44"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-0a066deb333a69d3", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/components/AddNewPatientOption.tsx:43", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/components/AddNewPatientOption.tsx:43"}, "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-010b73850c8040c2", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/components/OrganChain.tsx:96", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/components/OrganChain.tsx:96"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-208b64490b2f39e9", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/components/RecordsPatientBar.tsx:226", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/components/RecordsPatientBar.tsx:226"}, "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-132f1fc3bced0b93", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/components/AddTermSheet.tsx:127", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/components/AddTermSheet.tsx:127"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-60247019e26414ec", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/components/ObjectiveBoard.tsx:169", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/components/ObjectiveBoard.tsx:169"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-8a1dd230a2b38db3", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/components/BillingScreen.tsx:588", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/components/BillingScreen.tsx:588"}, "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-d4a316ddd98f48f2", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/components/SuggestPanel.tsx:81", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/components/SuggestPanel.tsx:81"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-c6de85ac088db34f", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/components/MacroManagerSheet.tsx:42", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/components/MacroManagerSheet.tsx:42"}, "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-fa154216da44954d", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/components/TabBar.tsx:175", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/components/TabBar.tsx:175"}, "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-ed93446163f9b0cf", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/components/LabImportSheet.tsx:392", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/components/LabImportSheet.tsx:392"}, "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-571efb009162abb2", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/components/DispensaryScreen.tsx:594", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/components/DispensaryScreen.tsx:594"}, "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-de0190ff26411a2b", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/components/SubjectiveStrip.tsx:76", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/components/SubjectiveStrip.tsx:76"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-e31a5678638d48ba", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/components/ScheduleScreen.tsx:285", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/components/ScheduleScreen.tsx:285"}, "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-2bfcd3ba396f6b27", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/components/LabsScreen.tsx:331", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/components/LabsScreen.tsx:331"}, "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-c1118fe2cc97e650", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/components/PatientBar.tsx:174", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/components/PatientBar.tsx:174"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-64484be3087f0c38", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/components/CheckoutSheet.tsx:405", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/components/CheckoutSheet.tsx:405"}, "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-2bebd469cea08865", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/components/LastVisitPanel.tsx:137", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/components/LastVisitPanel.tsx:137"}, "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-479a38248d5b0707", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/components/ScheduleSettingsSection.tsx:219", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/components/ScheduleSettingsSection.tsx:219"}, "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-a9498000bce8b355", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/components/PatientGlance.tsx:136", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/components/PatientGlance.tsx:136"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-3583b670428cba73", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/components/CheckoutPanel.tsx:150", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/components/CheckoutPanel.tsx:150"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-49a6737b1d5795e4", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/components/AppointmentSheet.tsx:552", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/components/AppointmentSheet.tsx:552"}, "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-fa147a339cfbe52a", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/components/FlowBoard.tsx:166", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/components/FlowBoard.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-ec70bd76767aa87f", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/components/TeamSection.tsx:226", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/components/TeamSection.tsx:226"}, "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-c367ebd7c7408f7f", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/components/QuickPick.tsx:145", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/components/QuickPick.tsx:145"}, "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-1a9f0bd0d4a8993a", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/components/PatientsScreen.tsx:81", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/components/PatientsScreen.tsx:81"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-b304c140992c8075", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/components/DocumentsScreen.tsx:332", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/components/DocumentsScreen.tsx:332"}, "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-666e7055dc282c1f", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/components/WaitlistSheet.tsx:138", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/components/WaitlistSheet.tsx:138"}, "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-65001a86c38e8482", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/components/ProgressView.tsx:163", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/components/ProgressView.tsx:163"}, "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-7e3aa96378dd2a91", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/components/cockpit/OutOfRangeLabs.tsx:180", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/components/cockpit/OutOfRangeLabs.tsx:180"}, "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-b05023dba800a562", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/components/reports/PatientOutcomesView.tsx:121", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/components/reports/PatientOutcomesView.tsx:121"}, "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-1ed9c2e661857db5", "name": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/components/reports/UnsignedNotesView.tsx:82", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/components/reports/UnsignedNotesView.tsx:82"}, "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-93e02e0d67c8f3e8", "name": "Docker base image is tag-pinned but not digest-pinned: node:22-slim", "shortDescription": {"text": "Docker base image is tag-pinned but not digest-pinned: node:22-slim"}, "fullDescription": {"text": "Container tags can be retagged upstream. Pin production base images to a reviewed digest (`image@sha256:...`) when reproducibility and supply-chain integrity matter."}, "properties": {"scanner": "scanner-primary", "layer": "hardware", "severity": "low", "confidence": 1.0}}, {"id": "scanner-aa5acaa49eb8315b", "name": "Containers defined but no K8s/orchestration manifest found", "shortDescription": {"text": "Containers defined but no K8s/orchestration manifest found"}, "fullDescription": {"text": "Repo has Dockerfiles/compose but no Kubernetes/Nomad manifests. If the target deployment is K8s, the manifests may live in a separate ops repo."}, "properties": {"scanner": "scanner-primary", "layer": "hardware", "severity": "low", "confidence": 1.0}}, {"id": "scanner-ee448cb153955502", "name": "Insecure pattern 'node_child_process' in infra/seed-demo-labs.mjs:15", "shortDescription": {"text": "Insecure pattern 'node_child_process' in infra/seed-demo-labs.mjs:15"}, "fullDescription": {"text": "Found a known-risky pattern (node_child_process). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-5f7829c6be420f8f", "name": "Insecure pattern 'node_child_process' in infra/backfill-visit-practiceid.mjs:17", "shortDescription": {"text": "Insecure pattern 'node_child_process' in infra/backfill-visit-practiceid.mjs:17"}, "fullDescription": {"text": "Found a known-risky pattern (node_child_process). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-c85ecbabfbb16471", "name": "Insecure pattern 'node_child_process' in infra/dev-metadata-stub.mjs:18", "shortDescription": {"text": "Insecure pattern 'node_child_process' in infra/dev-metadata-stub.mjs:18"}, "fullDescription": {"text": "Found a known-risky pattern (node_child_process). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-a9d52d1bf787de51", "name": "Insecure pattern 'node_child_process' in infra/import-oldapp.mjs:52", "shortDescription": {"text": "Insecure pattern 'node_child_process' in infra/import-oldapp.mjs:52"}, "fullDescription": {"text": "Found a known-risky pattern (node_child_process). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-c9e6c23f80a3f93b", "name": "Insecure pattern 'node_child_process' in infra/deploy-rules.mjs:12", "shortDescription": {"text": "Insecure pattern 'node_child_process' in infra/deploy-rules.mjs:12"}, "fullDescription": {"text": "Found a known-risky pattern (node_child_process). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-f23bffe80b66f205", "name": "Insecure pattern 'node_child_process' in infra/seed-practice.mjs:17", "shortDescription": {"text": "Insecure pattern 'node_child_process' in infra/seed-practice.mjs:17"}, "fullDescription": {"text": "Found a known-risky pattern (node_child_process). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-bbae94f0d8304908", "name": "Possible secret in infra/verify-visit-tenancy.mjs", "shortDescription": {"text": "Possible secret in infra/verify-visit-tenancy.mjs"}, "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-99e2e71d79d2edf8", "name": "Insecure pattern 'node_child_process' in infra/verify-visit-tenancy.mjs:25", "shortDescription": {"text": "Insecure pattern 'node_child_process' in infra/verify-visit-tenancy.mjs:25"}, "fullDescription": {"text": "Found a known-risky pattern (node_child_process). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-5770c5e61ec2278f", "name": "Insecure pattern 'direct_innerhtml_assignment' in mockups/design-option-a.html:350", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in mockups/design-option-a.html:350"}, "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-5679c1097206e673", "name": "Insecure pattern 'direct_innerhtml_assignment' in mockups/design-option-b.html:237", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in mockups/design-option-b.html:237"}, "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-ed184b4570bbef59", "name": "Insecure pattern 'direct_innerhtml_assignment' in mockups/design-option-d.html:438", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in mockups/design-option-d.html:438"}, "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-dca00dd997f2bee8", "name": "Insecure pattern 'direct_innerhtml_assignment' in mockups/design-option-c.html:224", "shortDescription": {"text": "Insecure pattern 'direct_innerhtml_assignment' in mockups/design-option-c.html:224"}, "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-4601e3ad3bb28677", "name": "No CI/CD pipelines detected", "shortDescription": {"text": "No CI/CD pipelines detected"}, "fullDescription": {"text": "No GitHub Actions, GitLab CI, or CircleCI configs found. Without CI you can't gate deploys on tests/lints."}, "properties": {"scanner": "scanner-primary", "layer": "cicd", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-16cafbd59bfdbaca", "name": "Very large file: apps/api/src/billing.ts (1428 lines)", "shortDescription": {"text": "Very large file: apps/api/src/billing.ts (1428 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-47cce7d88d963754", "name": "Very large file: apps/web/src/components/ScheduleScreen.tsx (1313 lines)", "shortDescription": {"text": "Very large file: apps/web/src/components/ScheduleScreen.tsx (1313 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 209 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-01f96f71d9907a8c", "name": "README lacks setup or run instructions", "shortDescription": {"text": "README lacks setup or run instructions"}, "fullDescription": {"text": "A README exists, but it does not contain common install/setup/run markers. This matches a frequent generated-code pattern: UI is present, operational handoff is thin."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-b06b8d86f24c77f9", "name": "Node manifest has dependencies but no lockfile: apps/api/package.json", "shortDescription": {"text": "Node manifest has dependencies but no lockfile: apps/api/package.json"}, "fullDescription": {"text": "`package.json` declares dependencies, but no same-directory npm/pnpm/yarn/bun lockfile was found. Generated projects without lockfiles are less reproducible and harder to secure-scan precisely."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-4a9eb7dc7c6e3880", "name": "Node manifest has dependencies but no lockfile: apps/web/package.json", "shortDescription": {"text": "Node manifest has dependencies but no lockfile: apps/web/package.json"}, "fullDescription": {"text": "`package.json` declares dependencies, but no same-directory npm/pnpm/yarn/bun lockfile was found. Generated projects without lockfiles are less reproducible and harder to secure-scan precisely."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-9acab6e258601a71", "name": "Node manifest has dependencies but no lockfile: packages/domain/package.json", "shortDescription": {"text": "Node manifest has dependencies but no lockfile: packages/domain/package.json"}, "fullDescription": {"text": "`package.json` declares dependencies, but no same-directory npm/pnpm/yarn/bun lockfile was found. Generated projects without lockfiles are less reproducible and harder to secure-scan precisely."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-3ab5d313dda8e5f9", "name": "Debug logging residue appears in source files", "shortDescription": {"text": "Debug logging residue appears in source files"}, "fullDescription": {"text": "Found 61 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 92 placeholder/mock markers across 45 source files. This often means the repo looks complete while core flows still use generated scaffolding or fake data."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-2d0c7b7ab8f8aacf", "name": "Critical user flow still appears backed by mock or placeholder data", "shortDescription": {"text": "Critical user flow still appears backed by mock or placeholder data"}, "fullDescription": {"text": "A payment/auth/admin/order/billing-style flow contains mock, fake, TODO, dummy, or placeholder markers in runtime source. In the Fable corpus this is a high-leverage completeness smell: the app can look finished while the money, identity, or tenant flow is still scaffolded."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-b9088664ace7f748", "name": "Composite production-readiness gap", "shortDescription": {"text": "Composite production-readiness gap"}, "fullDescription": {"text": "Multiple low-cost hardening controls are missing together: license, ci, operator-readme, lockfile. Opus verification showed these co-occurring gaps are a better readiness signal than reading each flag in isolation."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-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, ci, operator-readme, lockfile. Treat this as a contract gap: the agent is guided, but the generated output is not yet guarded by the controls that make it repeatable."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-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-902f7ffca17549ab", "name": "Commented-code block (5 lines) in apps/api/src/billing.ts:202", "shortDescription": {"text": "Commented-code block (5 lines) in apps/api/src/billing.ts:202"}, "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-a62a047a5ef75704", "name": "Commented-code block (5 lines) in apps/api/src/internal.ts:330", "shortDescription": {"text": "Commented-code block (5 lines) in apps/api/src/internal.ts:330"}, "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-d366aef92073caa6", "name": "Commented-code block (6 lines) in apps/api/src/documents.ts:222", "shortDescription": {"text": "Commented-code block (6 lines) in apps/api/src/documents.ts:222"}, "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-59d7460832230357", "name": "Commented-code block (5 lines) in apps/api/src/vocab.ts:26", "shortDescription": {"text": "Commented-code block (5 lines) in apps/api/src/vocab.ts:26"}, "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-5537685049948039", "name": "Commented-code block (5 lines) in apps/web/src/App.tsx:121", "shortDescription": {"text": "Commented-code block (5 lines) in apps/web/src/App.tsx:121"}, "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-1a7c5975e45ed79b", "name": "Commented-code block (5 lines) in apps/web/src/sync/chartSync.ts:551", "shortDescription": {"text": "Commented-code block (5 lines) in apps/web/src/sync/chartSync.ts:551"}, "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-8ff584092c2f14d4", "name": "Commented-code block (9 lines) in apps/web/src/sync/practiceSync.ts:145", "shortDescription": {"text": "Commented-code block (9 lines) in apps/web/src/sync/practiceSync.ts:145"}, "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-139cb5ddb10e5b34", "name": "Commented-code block (7 lines) in apps/web/src/sync/schedule.ts:140", "shortDescription": {"text": "Commented-code block (7 lines) in apps/web/src/sync/schedule.ts:140"}, "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-3e30ac3dac8fc2e2", "name": "Commented-code block (9 lines) in apps/web/src/sync/labsSync.ts:230", "shortDescription": {"text": "Commented-code block (9 lines) in apps/web/src/sync/labsSync.ts:230"}, "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-1a59f77d41218fec", "name": "Commented-code block (5 lines) in apps/web/src/sync/writes.ts:303", "shortDescription": {"text": "Commented-code block (5 lines) in apps/web/src/sync/writes.ts:303"}, "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-a5ae6d334c6c5f8f", "name": "Commented-code block (6 lines) in apps/web/src/components/ObjectiveBoard.tsx:40", "shortDescription": {"text": "Commented-code block (6 lines) in apps/web/src/components/ObjectiveBoard.tsx:40"}, "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-426a7d99c057da50", "name": "Commented-code block (5 lines) in apps/web/src/components/BillingScreen.tsx:86", "shortDescription": {"text": "Commented-code block (5 lines) in apps/web/src/components/BillingScreen.tsx:86"}, "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-0e4a97b620548fcd", "name": "Commented-code block (5 lines) in apps/web/src/components/DispensaryScreen.tsx:269", "shortDescription": {"text": "Commented-code block (5 lines) in apps/web/src/components/DispensaryScreen.tsx:269"}, "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-7be8a5522c53d125", "name": "Commented-code block (6 lines) in apps/web/src/components/ScheduleScreen.tsx:719", "shortDescription": {"text": "Commented-code block (6 lines) in apps/web/src/components/ScheduleScreen.tsx:719"}, "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-f15ff35e3fba182d", "name": "Commented-code block (6 lines) in apps/web/src/components/LabsScreen.tsx:191", "shortDescription": {"text": "Commented-code block (6 lines) in apps/web/src/components/LabsScreen.tsx:191"}, "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-cfbbc573fde01797", "name": "Commented-code block (6 lines) in apps/web/src/components/PatientGlance.tsx:87", "shortDescription": {"text": "Commented-code block (6 lines) in apps/web/src/components/PatientGlance.tsx:87"}, "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-fe2e36ff2bdc9282", "name": "Commented-code block (5 lines) in apps/web/src/components/AppointmentSheet.tsx:352", "shortDescription": {"text": "Commented-code block (5 lines) in apps/web/src/components/AppointmentSheet.tsx:352"}, "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-f0a24309b2c31154", "name": "Commented-code block (5 lines) in apps/web/src/components/FlowBoard.tsx:106", "shortDescription": {"text": "Commented-code block (5 lines) in apps/web/src/components/FlowBoard.tsx:106"}, "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-cc90f368213f3a67", "name": "Commented-code block (5 lines) in apps/web/src/components/cockpit/RightRail.tsx:584", "shortDescription": {"text": "Commented-code block (5 lines) in apps/web/src/components/cockpit/RightRail.tsx:584"}, "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-31f79b3e0007a99d", "name": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/src/lib/api.ts:21", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/src/lib/api.ts:21"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-08323bc1588f8fc5", "name": "Commented-code block (7 lines) in apps/web/src/lib/cockpit.ts:291", "shortDescription": {"text": "Commented-code block (7 lines) in apps/web/src/lib/cockpit.ts:291"}, "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-c2ed1b1ed172d282", "name": "Commented-code block (6 lines) in apps/web/src/lib/unsignedNotes.ts:75", "shortDescription": {"text": "Commented-code block (6 lines) in apps/web/src/lib/unsignedNotes.ts:75"}, "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-956bda49edf4ca8f", "name": "Commented-code block (6 lines) in apps/web/src/lib/recording.ts:347", "shortDescription": {"text": "Commented-code block (6 lines) in apps/web/src/lib/recording.ts:347"}, "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-c30d08a7c3616c1f", "name": "Commented-code block (5 lines) in apps/web/src/store/authStore.ts:79", "shortDescription": {"text": "Commented-code block (5 lines) in apps/web/src/store/authStore.ts:79"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-31601fe7ee4002d4", "name": "Commented-code block (5 lines) in apps/web/src/store/chartStore.ts:38", "shortDescription": {"text": "Commented-code block (5 lines) in apps/web/src/store/chartStore.ts:38"}, "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-6fa6f78fe278ae3c", "name": "Commented-code block (5 lines) in apps/web/src/store/dispensaryStore.ts:36", "shortDescription": {"text": "Commented-code block (5 lines) in apps/web/src/store/dispensaryStore.ts:36"}, "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-5155691ebbb1ece8", "name": "Commented-code block (6 lines) in apps/web/src/store/lockStore.ts:61", "shortDescription": {"text": "Commented-code block (6 lines) in apps/web/src/store/lockStore.ts:61"}, "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-aa9dd6245e156ca4", "name": "Commented-code block (11 lines) in packages/domain/test/narrative-hash.test.mjs:3", "shortDescription": {"text": "Commented-code block (11 lines) in packages/domain/test/narrative-hash.test.mjs:3"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-b6d9f2e0a5822399", "name": "Commented-code block (5 lines) in packages/domain/src/ai.ts:49", "shortDescription": {"text": "Commented-code block (5 lines) in packages/domain/src/ai.ts:49"}, "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-7fce65e17f4adbd5", "name": "Commented-code block (8 lines) in packages/domain/src/scheduling.ts:178", "shortDescription": {"text": "Commented-code block (8 lines) in packages/domain/src/scheduling.ts:178"}, "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-75aaeab9d7056dd6", "name": "Commented-code block (5 lines) in packages/domain/src/cockpit.ts:11", "shortDescription": {"text": "Commented-code block (5 lines) in packages/domain/src/cockpit.ts:11"}, "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-faee7d9e6e6321e6", "name": "Commented-code block (6 lines) in packages/domain/src/billing.ts:181", "shortDescription": {"text": "Commented-code block (6 lines) in packages/domain/src/billing.ts:181"}, "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-df0b6e6c159af469", "name": "Commented-code block (5 lines) in packages/domain/src/users.ts:79", "shortDescription": {"text": "Commented-code block (5 lines) in packages/domain/src/users.ts:79"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-1bae08c96f2309c5", "name": "Commented-code block (5 lines) in packages/domain/src/schemas.ts:247", "shortDescription": {"text": "Commented-code block (5 lines) in packages/domain/src/schemas.ts:247"}, "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-6d5bc20289f4ff2d", "name": "Commented-code block (5 lines) in packages/domain/src/documents.ts:182", "shortDescription": {"text": "Commented-code block (5 lines) in packages/domain/src/documents.ts:182"}, "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-aec0979d9d44afe8", "name": "Commented-code block (6 lines) in packages/domain/src/outcomes.ts:547", "shortDescription": {"text": "Commented-code block (6 lines) in packages/domain/src/outcomes.ts:547"}, "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-e6ef4f07ef00c163", "name": "Commented-code block (5 lines) in packages/domain/src/labs.ts:25", "shortDescription": {"text": "Commented-code block (5 lines) in packages/domain/src/labs.ts:25"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-8721b8bbac698d39", "name": "Commented-code block (5 lines) in packages/domain/src/availability.ts:156", "shortDescription": {"text": "Commented-code block (5 lines) in packages/domain/src/availability.ts: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-522544979f0fc35f", "name": "Commented-code block (6 lines) in packages/domain/src/labs-pdf.ts:67", "shortDescription": {"text": "Commented-code block (6 lines) in packages/domain/src/labs-pdf.ts:67"}, "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-7aa1ecc3464c71e3", "name": "`fetch()` without try/.catch or AbortSignal \u2014 infra/seed-demo-labs.mjs:38", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 infra/seed-demo-labs.mjs:38"}, "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-d55cebfae45e1272", "name": "Commented-code block (9 lines) in infra/gen-legacy-map.mjs:421", "shortDescription": {"text": "Commented-code block (9 lines) in infra/gen-legacy-map.mjs:421"}, "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-214488bf618ded58", "name": "`fetch()` without try/.catch or AbortSignal \u2014 infra/backfill-visit-practiceid.mjs:28", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 infra/backfill-visit-practiceid.mjs:28"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-37bdd1d1d0907077", "name": "`fetch()` without try/.catch or AbortSignal \u2014 infra/import-oldapp.mjs:850", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 infra/import-oldapp.mjs:850"}, "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-c09812a438064838", "name": "`fetch()` without try/.catch or AbortSignal \u2014 infra/deploy-rules.mjs:28", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 infra/deploy-rules.mjs:28"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-8ab391d3c258e764", "name": "`fetch()` without try/.catch or AbortSignal \u2014 infra/seed-practice.mjs:29", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 infra/seed-practice.mjs:29"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-da19e5388f98b137", "name": "`fetch()` without try/.catch or AbortSignal \u2014 infra/verify-visit-tenancy.mjs:36", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 infra/verify-visit-tenancy.mjs:36"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-28b37768cebb53c6", "name": "Dangling fetch: GET https://streaming.assemblyai.com/v3/token?expires_in_seconds=${TOKEN_TTL_SECONDS} (apps/api/src/dict", "shortDescription": {"text": "Dangling fetch: GET https://streaming.assemblyai.com/v3/token?expires_in_seconds=${TOKEN_TTL_SECONDS} (apps/api/src/dictation.ts:89)"}, "fullDescription": {"text": "`apps/api/src/dictation.ts:89` calls `GET https://streaming.assemblyai.com/v3/token?expires_in_seconds=${TOKEN_TTL_SECONDS}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/https:/streaming.assemblyai.com/v3/token`\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-f7ecfd385e7a54a4", "name": "Unused endpoint: POST /pin", "shortDescription": {"text": "Unused endpoint: POST /pin"}, "fullDescription": {"text": "`apps/api/src/api.ts` declares `POST /pin` 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-8290c88ccf5b4608", "name": "Unused endpoint: GET /pin", "shortDescription": {"text": "Unused endpoint: GET /pin"}, "fullDescription": {"text": "`apps/api/src/api.ts` declares `GET /pin` 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-7a009b1a56794f45", "name": "Unused endpoint: POST /", "shortDescription": {"text": "Unused endpoint: POST /"}, "fullDescription": {"text": "`apps/api/src/aiNote.ts` declares `POST /` 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-2d729e26437a9d20", "name": "Unused endpoint: GET /billing/config", "shortDescription": {"text": "Unused endpoint: GET /billing/config"}, "fullDescription": {"text": "`apps/api/src/billing.ts` declares `GET /billing/config` 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-8fd8b3d2df5b4f69", "name": "Unused endpoint: PUT /prices/:itemId", "shortDescription": {"text": "Unused endpoint: PUT /prices/:itemId"}, "fullDescription": {"text": "`apps/api/src/billing.ts` declares `PUT /prices/:itemId` 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-0e8bc4aeb4a23e76", "name": "Unused endpoint: PUT /icd-favorites", "shortDescription": {"text": "Unused endpoint: PUT /icd-favorites"}, "fullDescription": {"text": "`apps/api/src/billing.ts` declares `PUT /icd-favorites` 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-6731d3796da15b7e", "name": "Unused endpoint: PUT /tax/config", "shortDescription": {"text": "Unused endpoint: PUT /tax/config"}, "fullDescription": {"text": "`apps/api/src/billing.ts` declares `PUT /tax/config` 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-52de1441db404ed9", "name": "Unused endpoint: GET /inventory", "shortDescription": {"text": "Unused endpoint: GET /inventory"}, "fullDescription": {"text": "`apps/api/src/billing.ts` declares `GET /inventory` 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-c4bf8f3e68c09b8d", "name": "Unused endpoint: POST /inventory/receive", "shortDescription": {"text": "Unused endpoint: POST /inventory/receive"}, "fullDescription": {"text": "`apps/api/src/billing.ts` declares `POST /inventory/receive` 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-6e2d5886899c8302", "name": "Unused endpoint: POST /inventory/adjust", "shortDescription": {"text": "Unused endpoint: POST /inventory/adjust"}, "fullDescription": {"text": "`apps/api/src/billing.ts` declares `POST /inventory/adjust` 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-6385cd0e163a390f", "name": "Unused endpoint: POST /checkout", "shortDescription": {"text": "Unused endpoint: POST /checkout"}, "fullDescription": {"text": "`apps/api/src/billing.ts` declares `POST /checkout` 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-5e51fe21c8f43269", "name": "Unused endpoint: POST /refund", "shortDescription": {"text": "Unused endpoint: POST /refund"}, "fullDescription": {"text": "`apps/api/src/billing.ts` declares `POST /refund` 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-e5006457a4f69d46", "name": "Unused endpoint: POST /payments", "shortDescription": {"text": "Unused endpoint: POST /payments"}, "fullDescription": {"text": "`apps/api/src/billing.ts` declares `POST /payments` 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-ca3179556b619c60", "name": "Unused endpoint: GET /ledger/:patientId", "shortDescription": {"text": "Unused endpoint: GET /ledger/:patientId"}, "fullDescription": {"text": "`apps/api/src/billing.ts` declares `GET /ledger/:patientId` 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-2fc2f1e0ef8ed465", "name": "Unused endpoint: GET /daysheet", "shortDescription": {"text": "Unused endpoint: GET /daysheet"}, "fullDescription": {"text": "`apps/api/src/billing.ts` declares `GET /daysheet` 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-87ad81b67c93627a", "name": "Unused endpoint: POST /superbill", "shortDescription": {"text": "Unused endpoint: POST /superbill"}, "fullDescription": {"text": "`apps/api/src/billing.ts` declares `POST /superbill` 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-d5b0960ee7310ba0", "name": "Unused endpoint: GET /superbill/:patientId/:visitId", "shortDescription": {"text": "Unused endpoint: GET /superbill/:patientId/:visitId"}, "fullDescription": {"text": "`apps/api/src/billing.ts` declares `GET /superbill/:patientId/:visitId` 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-8d5fea72f1b28a8c", "name": "Unused endpoint: PATCH /:uid", "shortDescription": {"text": "Unused endpoint: PATCH /:uid"}, "fullDescription": {"text": "`apps/api/src/users.ts` declares `PATCH /:uid` 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-358815753e8867f1", "name": "Unused endpoint: POST /token", "shortDescription": {"text": "Unused endpoint: POST /token"}, "fullDescription": {"text": "`apps/api/src/dictation.ts` declares `POST /token` 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-76d4f8cfb9c4f6e7", "name": "Unused endpoint: GET /api/healthz", "shortDescription": {"text": "Unused endpoint: GET /api/healthz"}, "fullDescription": {"text": "`apps/api/src/index.ts` declares `GET /api/healthz` 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-8ff425f9594e3b41", "name": "Unused endpoint: USE /assets/*", "shortDescription": {"text": "Unused endpoint: USE /assets/*"}, "fullDescription": {"text": "`apps/api/src/index.ts` declares `USE /assets/*` 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": "`apps/api/src/index.ts` 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-edf20b1fd2ebb76c", "name": "Unused endpoint: POST /audit-fanout", "shortDescription": {"text": "Unused endpoint: POST /audit-fanout"}, "fullDescription": {"text": "`apps/api/src/internal.ts` declares `POST /audit-fanout` 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-d5b2bf4f02dbb539", "name": "Unused endpoint: POST /sign-finalizer", "shortDescription": {"text": "Unused endpoint: POST /sign-finalizer"}, "fullDescription": {"text": "`apps/api/src/internal.ts` declares `POST /sign-finalizer` 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-c844fe0bf20605e0", "name": "Unused endpoint: POST /canary", "shortDescription": {"text": "Unused endpoint: POST /canary"}, "fullDescription": {"text": "`apps/api/src/internal.ts` declares `POST /canary` 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-b72f8ff91dc8e127", "name": "Unused endpoint: POST /canary-check", "shortDescription": {"text": "Unused endpoint: POST /canary-check"}, "fullDescription": {"text": "`apps/api/src/internal.ts` declares `POST /canary-check` 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-fbf37139aa25d03c", "name": "Unused endpoint: POST /upload-url", "shortDescription": {"text": "Unused endpoint: POST /upload-url"}, "fullDescription": {"text": "`apps/api/src/documents.ts` declares `POST /upload-url` 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-f7fbe3e6dec7fcb8", "name": "Unused endpoint: POST /:docId/confirm", "shortDescription": {"text": "Unused endpoint: POST /:docId/confirm"}, "fullDescription": {"text": "`apps/api/src/documents.ts` declares `POST /:docId/confirm` 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-142d48338320d86d", "name": "Unused endpoint: GET /:patientId/:docId/url", "shortDescription": {"text": "Unused endpoint: GET /:patientId/:docId/url"}, "fullDescription": {"text": "`apps/api/src/documents.ts` declares `GET /:patientId/:docId/url` 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-ae34a7e7d6064100", "name": "Unused endpoint: DELETE /:patientId/:docId", "shortDescription": {"text": "Unused endpoint: DELETE /:patientId/:docId"}, "fullDescription": {"text": "`apps/api/src/documents.ts` declares `DELETE /:patientId/:docId` 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/20878"}, "properties": {"repository": "tdander26/triad-ehr", "repoUrl": "https://github.com/tdander26/triad-ehr", "branch": "main"}, "results": [{"ruleId": "scanner-0d990be4c4bf952f", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 apps/api/src/index.ts:44"}, "properties": {"repobilityId": "a178156af585d748", "scanner": "scanner-primary", "fingerprint": "0d990be4c4bf952f", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-0a066deb333a69d3", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/components/AddNewPatientOption.tsx:43"}, "properties": {"repobilityId": "068e4f8214ed5cea", "scanner": "scanner-primary", "fingerprint": "0a066deb333a69d3", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-010b73850c8040c2", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/components/OrganChain.tsx:96"}, "properties": {"repobilityId": "14968702a9b97ca8", "scanner": "scanner-primary", "fingerprint": "010b73850c8040c2", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-208b64490b2f39e9", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/components/RecordsPatientBar.tsx:226"}, "properties": {"repobilityId": "83ccc61e653ca671", "scanner": "scanner-primary", "fingerprint": "208b64490b2f39e9", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-132f1fc3bced0b93", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/components/AddTermSheet.tsx:127"}, "properties": {"repobilityId": "ca4bef75f2ebc56f", "scanner": "scanner-primary", "fingerprint": "132f1fc3bced0b93", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-60247019e26414ec", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/components/ObjectiveBoard.tsx:169"}, "properties": {"repobilityId": "2cab487fbad9ce35", "scanner": "scanner-primary", "fingerprint": "60247019e26414ec", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-8a1dd230a2b38db3", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/components/BillingScreen.tsx:588"}, "properties": {"repobilityId": "24883dde6aeca83a", "scanner": "scanner-primary", "fingerprint": "8a1dd230a2b38db3", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-d4a316ddd98f48f2", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/components/SuggestPanel.tsx:81"}, "properties": {"repobilityId": "721289f004dadd7e", "scanner": "scanner-primary", "fingerprint": "d4a316ddd98f48f2", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-c6de85ac088db34f", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/components/MacroManagerSheet.tsx:42"}, "properties": {"repobilityId": "308d1457e284e92b", "scanner": "scanner-primary", "fingerprint": "c6de85ac088db34f", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-fa154216da44954d", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/components/TabBar.tsx:175"}, "properties": {"repobilityId": "7d56362178bc4e7d", "scanner": "scanner-primary", "fingerprint": "fa154216da44954d", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-ed93446163f9b0cf", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/components/LabImportSheet.tsx:392"}, "properties": {"repobilityId": "5c0f87dc5d038c96", "scanner": "scanner-primary", "fingerprint": "ed93446163f9b0cf", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-571efb009162abb2", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/components/DispensaryScreen.tsx:594"}, "properties": {"repobilityId": "37ec1f9f08a7412c", "scanner": "scanner-primary", "fingerprint": "571efb009162abb2", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-de0190ff26411a2b", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/components/SubjectiveStrip.tsx:76"}, "properties": {"repobilityId": "d36ff670df4678c5", "scanner": "scanner-primary", "fingerprint": "de0190ff26411a2b", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-e31a5678638d48ba", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/components/ScheduleScreen.tsx:285"}, "properties": {"repobilityId": "6ac2c9c34843e655", "scanner": "scanner-primary", "fingerprint": "e31a5678638d48ba", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-2bfcd3ba396f6b27", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/components/LabsScreen.tsx:331"}, "properties": {"repobilityId": "39c67ec063758ddb", "scanner": "scanner-primary", "fingerprint": "2bfcd3ba396f6b27", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-c1118fe2cc97e650", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/components/PatientBar.tsx:174"}, "properties": {"repobilityId": "a4aeac169a0484f7", "scanner": "scanner-primary", "fingerprint": "c1118fe2cc97e650", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-64484be3087f0c38", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/components/CheckoutSheet.tsx:405"}, "properties": {"repobilityId": "27c23c110175f1e9", "scanner": "scanner-primary", "fingerprint": "64484be3087f0c38", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-2bebd469cea08865", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/components/LastVisitPanel.tsx:137"}, "properties": {"repobilityId": "b7e527f198e1c5b9", "scanner": "scanner-primary", "fingerprint": "2bebd469cea08865", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-479a38248d5b0707", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/components/ScheduleSettingsSection.tsx:219"}, "properties": {"repobilityId": "14d5f30b7b72644b", "scanner": "scanner-primary", "fingerprint": "479a38248d5b0707", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-a9498000bce8b355", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/components/PatientGlance.tsx:136"}, "properties": {"repobilityId": "d683ccbffab32c0c", "scanner": "scanner-primary", "fingerprint": "a9498000bce8b355", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-3583b670428cba73", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/components/CheckoutPanel.tsx:150"}, "properties": {"repobilityId": "5ab4fbff4ccb6f03", "scanner": "scanner-primary", "fingerprint": "3583b670428cba73", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-49a6737b1d5795e4", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/components/AppointmentSheet.tsx:552"}, "properties": {"repobilityId": "b542bdea32b5c21c", "scanner": "scanner-primary", "fingerprint": "49a6737b1d5795e4", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-fa147a339cfbe52a", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/components/FlowBoard.tsx:166"}, "properties": {"repobilityId": "12476c61cffc397a", "scanner": "scanner-primary", "fingerprint": "fa147a339cfbe52a", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-ec70bd76767aa87f", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/components/TeamSection.tsx:226"}, "properties": {"repobilityId": "677878abb569862f", "scanner": "scanner-primary", "fingerprint": "ec70bd76767aa87f", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-c367ebd7c7408f7f", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/components/QuickPick.tsx:145"}, "properties": {"repobilityId": "70e3d8fb260083d5", "scanner": "scanner-primary", "fingerprint": "c367ebd7c7408f7f", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-1a9f0bd0d4a8993a", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/components/PatientsScreen.tsx:81"}, "properties": {"repobilityId": "270978da09112aaf", "scanner": "scanner-primary", "fingerprint": "1a9f0bd0d4a8993a", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-b304c140992c8075", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/components/DocumentsScreen.tsx:332"}, "properties": {"repobilityId": "fbf1fd4453f539cd", "scanner": "scanner-primary", "fingerprint": "b304c140992c8075", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-666e7055dc282c1f", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/components/WaitlistSheet.tsx:138"}, "properties": {"repobilityId": "6d25bb695a2fe619", "scanner": "scanner-primary", "fingerprint": "666e7055dc282c1f", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-65001a86c38e8482", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/components/ProgressView.tsx:163"}, "properties": {"repobilityId": "3aa97e40faa83662", "scanner": "scanner-primary", "fingerprint": "65001a86c38e8482", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-7e3aa96378dd2a91", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/components/cockpit/OutOfRangeLabs.tsx:180"}, "properties": {"repobilityId": "ca1103e7e99264b2", "scanner": "scanner-primary", "fingerprint": "7e3aa96378dd2a91", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-b05023dba800a562", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/components/reports/PatientOutcomesView.tsx:121"}, "properties": {"repobilityId": "08f8fe213a45ff1b", "scanner": "scanner-primary", "fingerprint": "b05023dba800a562", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-1ed9c2e661857db5", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 apps/web/src/components/reports/UnsignedNotesView.tsx:82"}, "properties": {"repobilityId": "21b378f32bdc8547", "scanner": "scanner-primary", "fingerprint": "1ed9c2e661857db5", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-93e02e0d67c8f3e8", "level": "note", "message": {"text": "Docker base image is tag-pinned but not digest-pinned: node:22-slim"}, "properties": {"repobilityId": "e2d1833a9bb124b3", "scanner": "scanner-primary", "fingerprint": "93e02e0d67c8f3e8", "layer": "hardware", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "docker", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "Dockerfile"}, "region": {"startLine": 4}}}]}, {"ruleId": "scanner-93e02e0d67c8f3e8", "level": "note", "message": {"text": "Docker base image is tag-pinned but not digest-pinned: node:22-slim"}, "properties": {"repobilityId": "bf461b78ca622b2d", "scanner": "scanner-primary", "fingerprint": "93e02e0d67c8f3e8", "layer": "hardware", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "docker", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "Dockerfile"}, "region": {"startLine": 15}}}]}, {"ruleId": "scanner-aa5acaa49eb8315b", "level": "note", "message": {"text": "Containers defined but no K8s/orchestration manifest found"}, "properties": {"repobilityId": "b230ea9b68736081", "scanner": "scanner-primary", "fingerprint": "aa5acaa49eb8315b", "layer": "hardware", "severity": "low", "confidence": 1.0, "tags": ["coverage", "deployment"]}}, {"ruleId": "scanner-ee448cb153955502", "level": "warning", "message": {"text": "Insecure pattern 'node_child_process' in infra/seed-demo-labs.mjs:15"}, "properties": {"repobilityId": "f14d2588375e82bb", "scanner": "scanner-primary", "fingerprint": "ee448cb153955502", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "node_child_process"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "infra/seed-demo-labs.mjs"}, "region": {"startLine": 15}}}]}, {"ruleId": "scanner-5f7829c6be420f8f", "level": "warning", "message": {"text": "Insecure pattern 'node_child_process' in infra/backfill-visit-practiceid.mjs:17"}, "properties": {"repobilityId": "b0f1397baab88d92", "scanner": "scanner-primary", "fingerprint": "5f7829c6be420f8f", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "node_child_process"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "infra/backfill-visit-practiceid.mjs"}, "region": {"startLine": 17}}}]}, {"ruleId": "scanner-c85ecbabfbb16471", "level": "warning", "message": {"text": "Insecure pattern 'node_child_process' in infra/dev-metadata-stub.mjs:18"}, "properties": {"repobilityId": "1b1e807f4798b263", "scanner": "scanner-primary", "fingerprint": "c85ecbabfbb16471", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "node_child_process"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "infra/dev-metadata-stub.mjs"}, "region": {"startLine": 18}}}]}, {"ruleId": "scanner-a9d52d1bf787de51", "level": "warning", "message": {"text": "Insecure pattern 'node_child_process' in infra/import-oldapp.mjs:52"}, "properties": {"repobilityId": "8bed8e8b17fe3150", "scanner": "scanner-primary", "fingerprint": "a9d52d1bf787de51", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "node_child_process"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "infra/import-oldapp.mjs"}, "region": {"startLine": 52}}}]}, {"ruleId": "scanner-c9e6c23f80a3f93b", "level": "warning", "message": {"text": "Insecure pattern 'node_child_process' in infra/deploy-rules.mjs:12"}, "properties": {"repobilityId": "f54addead7616f41", "scanner": "scanner-primary", "fingerprint": "c9e6c23f80a3f93b", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "node_child_process"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "infra/deploy-rules.mjs"}, "region": {"startLine": 12}}}]}, {"ruleId": "scanner-f23bffe80b66f205", "level": "warning", "message": {"text": "Insecure pattern 'node_child_process' in infra/seed-practice.mjs:17"}, "properties": {"repobilityId": "876aac87a9bc0b31", "scanner": "scanner-primary", "fingerprint": "f23bffe80b66f205", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "node_child_process"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "infra/seed-practice.mjs"}, "region": {"startLine": 17}}}]}, {"ruleId": "scanner-bbae94f0d8304908", "level": "error", "message": {"text": "Possible secret in infra/verify-visit-tenancy.mjs"}, "properties": {"repobilityId": "e5a08971ab11b7e0", "scanner": "scanner-primary", "fingerprint": "bbae94f0d8304908", "layer": "security", "severity": "critical", "confidence": 1.0, "tags": ["secrets"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "infra/verify-visit-tenancy.mjs"}, "region": {"startLine": 29}}}]}, {"ruleId": "scanner-99e2e71d79d2edf8", "level": "warning", "message": {"text": "Insecure pattern 'node_child_process' in infra/verify-visit-tenancy.mjs:25"}, "properties": {"repobilityId": "c1b47a159da92e36", "scanner": "scanner-primary", "fingerprint": "99e2e71d79d2edf8", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "node_child_process"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "infra/verify-visit-tenancy.mjs"}, "region": {"startLine": 25}}}]}, {"ruleId": "scanner-5770c5e61ec2278f", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in mockups/design-option-a.html:350"}, "properties": {"repobilityId": "55629afe0810b826", "scanner": "scanner-primary", "fingerprint": "5770c5e61ec2278f", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "mockups/design-option-a.html"}, "region": {"startLine": 350}}}]}, {"ruleId": "scanner-5679c1097206e673", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in mockups/design-option-b.html:237"}, "properties": {"repobilityId": "7b861c471c394c10", "scanner": "scanner-primary", "fingerprint": "5679c1097206e673", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "mockups/design-option-b.html"}, "region": {"startLine": 237}}}]}, {"ruleId": "scanner-ed184b4570bbef59", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in mockups/design-option-d.html:438"}, "properties": {"repobilityId": "529365a012944e23", "scanner": "scanner-primary", "fingerprint": "ed184b4570bbef59", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "mockups/design-option-d.html"}, "region": {"startLine": 438}}}]}, {"ruleId": "scanner-dca00dd997f2bee8", "level": "warning", "message": {"text": "Insecure pattern 'direct_innerhtml_assignment' in mockups/design-option-c.html:224"}, "properties": {"repobilityId": "c5f7cde943782110", "scanner": "scanner-primary", "fingerprint": "dca00dd997f2bee8", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "direct_innerhtml_assignment"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "mockups/design-option-c.html"}, "region": {"startLine": 224}}}]}, {"ruleId": "scanner-4601e3ad3bb28677", "level": "warning", "message": {"text": "No CI/CD pipelines detected"}, "properties": {"repobilityId": "c3ee439bce2bc51e", "scanner": "scanner-primary", "fingerprint": "4601e3ad3bb28677", "layer": "cicd", "severity": "medium", "confidence": 1.0, "tags": ["coverage"]}}, {"ruleId": "scanner-16cafbd59bfdbaca", "level": "note", "message": {"text": "Very large file: apps/api/src/billing.ts (1428 lines)"}, "properties": {"repobilityId": "a0f2d153ba81ab8e", "scanner": "scanner-primary", "fingerprint": "16cafbd59bfdbaca", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-47cce7d88d963754", "level": "note", "message": {"text": "Very large file: apps/web/src/components/ScheduleScreen.tsx (1313 lines)"}, "properties": {"repobilityId": "b2d53bf7ac2a1a8a", "scanner": "scanner-primary", "fingerprint": "47cce7d88d963754", "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": "b4b8c48f200ac7b0", "scanner": "scanner-primary", "fingerprint": "141b30a41e03817b", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["license", "repo-hardening", "generated-repo-pattern"]}}, {"ruleId": "scanner-01f96f71d9907a8c", "level": "note", "message": {"text": "README lacks setup or run instructions"}, "properties": {"repobilityId": "5d6896930a2183ba", "scanner": "scanner-primary", "fingerprint": "01f96f71d9907a8c", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["docs", "readme", "repo-hardening", "generated-repo-pattern"]}}, {"ruleId": "scanner-b06b8d86f24c77f9", "level": "note", "message": {"text": "Node manifest has dependencies but no lockfile: apps/api/package.json"}, "properties": {"repobilityId": "ce77cd34ed0306d4", "scanner": "scanner-primary", "fingerprint": "b06b8d86f24c77f9", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["dependency", "lockfile", "reproducibility", "generated-repo-pattern"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "apps/api/package.json"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-4a9eb7dc7c6e3880", "level": "note", "message": {"text": "Node manifest has dependencies but no lockfile: apps/web/package.json"}, "properties": {"repobilityId": "6c1704bf24cf19ac", "scanner": "scanner-primary", "fingerprint": "4a9eb7dc7c6e3880", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["dependency", "lockfile", "reproducibility", "generated-repo-pattern"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "apps/web/package.json"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-9acab6e258601a71", "level": "note", "message": {"text": "Node manifest has dependencies but no lockfile: packages/domain/package.json"}, "properties": {"repobilityId": "355a076ceb659600", "scanner": "scanner-primary", "fingerprint": "9acab6e258601a71", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["dependency", "lockfile", "reproducibility", "generated-repo-pattern"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "packages/domain/package.json"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-3ab5d313dda8e5f9", "level": "note", "message": {"text": "Debug logging residue appears in source files"}, "properties": {"repobilityId": "f68ed194aae7fcf0", "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": "1890ff5748081d97", "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": "9af2f0cc49e6cfa4", "scanner": "scanner-primary", "fingerprint": "2d0c7b7ab8f8aacf", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["placeholder", "mock-data", "critical-flow", "generated-repo-pattern"]}}, {"ruleId": "scanner-b9088664ace7f748", "level": "warning", "message": {"text": "Composite production-readiness gap"}, "properties": {"repobilityId": "194b3b26d31af8fd", "scanner": "scanner-primary", "fingerprint": "b9088664ace7f748", "layer": "quality", "severity": "medium", "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": "3e7efc992e12ad9c", "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": "8f07183431c83e88", "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": "c0c9f6269112722c", "scanner": "scanner-primary", "fingerprint": "8424db9c75e04ba4", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["provenance", "git-history", "generated-repo-pattern"]}}, {"ruleId": "scanner-902f7ffca17549ab", "level": "none", "message": {"text": "Commented-code block (5 lines) in apps/api/src/billing.ts:202"}, "properties": {"repobilityId": "1621b5c6f0cb5c81", "scanner": "scanner-primary", "fingerprint": "902f7ffca17549ab", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-a62a047a5ef75704", "level": "none", "message": {"text": "Commented-code block (5 lines) in apps/api/src/internal.ts:330"}, "properties": {"repobilityId": "7d9cf047285e7749", "scanner": "scanner-primary", "fingerprint": "a62a047a5ef75704", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-d366aef92073caa6", "level": "none", "message": {"text": "Commented-code block (6 lines) in apps/api/src/documents.ts:222"}, "properties": {"repobilityId": "440b25a32779c570", "scanner": "scanner-primary", "fingerprint": "d366aef92073caa6", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-59d7460832230357", "level": "none", "message": {"text": "Commented-code block (5 lines) in apps/api/src/vocab.ts:26"}, "properties": {"repobilityId": "c1bad3c08adb23ec", "scanner": "scanner-primary", "fingerprint": "59d7460832230357", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-5537685049948039", "level": "none", "message": {"text": "Commented-code block (5 lines) in apps/web/src/App.tsx:121"}, "properties": {"repobilityId": "169269e4fbe2e369", "scanner": "scanner-primary", "fingerprint": "5537685049948039", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-1a7c5975e45ed79b", "level": "none", "message": {"text": "Commented-code block (5 lines) in apps/web/src/sync/chartSync.ts:551"}, "properties": {"repobilityId": "ba805e1246bbbf89", "scanner": "scanner-primary", "fingerprint": "1a7c5975e45ed79b", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-8ff584092c2f14d4", "level": "none", "message": {"text": "Commented-code block (9 lines) in apps/web/src/sync/practiceSync.ts:145"}, "properties": {"repobilityId": "acca96b521b2c4ea", "scanner": "scanner-primary", "fingerprint": "8ff584092c2f14d4", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-139cb5ddb10e5b34", "level": "none", "message": {"text": "Commented-code block (7 lines) in apps/web/src/sync/schedule.ts:140"}, "properties": {"repobilityId": "eb1b9220c41ceaaf", "scanner": "scanner-primary", "fingerprint": "139cb5ddb10e5b34", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-3e30ac3dac8fc2e2", "level": "none", "message": {"text": "Commented-code block (9 lines) in apps/web/src/sync/labsSync.ts:230"}, "properties": {"repobilityId": "7736a8db673fd45e", "scanner": "scanner-primary", "fingerprint": "3e30ac3dac8fc2e2", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-1a59f77d41218fec", "level": "none", "message": {"text": "Commented-code block (5 lines) in apps/web/src/sync/writes.ts:303"}, "properties": {"repobilityId": "7e0ae3fcc508bfe4", "scanner": "scanner-primary", "fingerprint": "1a59f77d41218fec", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-a5ae6d334c6c5f8f", "level": "none", "message": {"text": "Commented-code block (6 lines) in apps/web/src/components/ObjectiveBoard.tsx:40"}, "properties": {"repobilityId": "ab7ee2a6a3ef8ae5", "scanner": "scanner-primary", "fingerprint": "a5ae6d334c6c5f8f", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-426a7d99c057da50", "level": "none", "message": {"text": "Commented-code block (5 lines) in apps/web/src/components/BillingScreen.tsx:86"}, "properties": {"repobilityId": "1f45d6808b2e2aa1", "scanner": "scanner-primary", "fingerprint": "426a7d99c057da50", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-0e4a97b620548fcd", "level": "none", "message": {"text": "Commented-code block (5 lines) in apps/web/src/components/DispensaryScreen.tsx:269"}, "properties": {"repobilityId": "3ab930d3abb20ccd", "scanner": "scanner-primary", "fingerprint": "0e4a97b620548fcd", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-7be8a5522c53d125", "level": "none", "message": {"text": "Commented-code block (6 lines) in apps/web/src/components/ScheduleScreen.tsx:719"}, "properties": {"repobilityId": "ea2bb4ef1e106e6d", "scanner": "scanner-primary", "fingerprint": "7be8a5522c53d125", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-f15ff35e3fba182d", "level": "none", "message": {"text": "Commented-code block (6 lines) in apps/web/src/components/LabsScreen.tsx:191"}, "properties": {"repobilityId": "7ce820bf47a875f7", "scanner": "scanner-primary", "fingerprint": "f15ff35e3fba182d", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-cfbbc573fde01797", "level": "none", "message": {"text": "Commented-code block (6 lines) in apps/web/src/components/PatientGlance.tsx:87"}, "properties": {"repobilityId": "06b25911fb37d3e3", "scanner": "scanner-primary", "fingerprint": "cfbbc573fde01797", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-fe2e36ff2bdc9282", "level": "none", "message": {"text": "Commented-code block (5 lines) in apps/web/src/components/AppointmentSheet.tsx:352"}, "properties": {"repobilityId": "c4a382ba44d802e7", "scanner": "scanner-primary", "fingerprint": "fe2e36ff2bdc9282", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-f0a24309b2c31154", "level": "none", "message": {"text": "Commented-code block (5 lines) in apps/web/src/components/FlowBoard.tsx:106"}, "properties": {"repobilityId": "122c0a6cfb54782b", "scanner": "scanner-primary", "fingerprint": "f0a24309b2c31154", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-cc90f368213f3a67", "level": "none", "message": {"text": "Commented-code block (5 lines) in apps/web/src/components/cockpit/RightRail.tsx:584"}, "properties": {"repobilityId": "ea63e9dcc2a62eec", "scanner": "scanner-primary", "fingerprint": "cc90f368213f3a67", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-31f79b3e0007a99d", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 apps/web/src/lib/api.ts:21"}, "properties": {"repobilityId": "39d236b119ba20eb", "scanner": "scanner-primary", "fingerprint": "31f79b3e0007a99d", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-08323bc1588f8fc5", "level": "none", "message": {"text": "Commented-code block (7 lines) in apps/web/src/lib/cockpit.ts:291"}, "properties": {"repobilityId": "ed3abbd611511c50", "scanner": "scanner-primary", "fingerprint": "08323bc1588f8fc5", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-c2ed1b1ed172d282", "level": "none", "message": {"text": "Commented-code block (6 lines) in apps/web/src/lib/unsignedNotes.ts:75"}, "properties": {"repobilityId": "e7b751c8eabc0896", "scanner": "scanner-primary", "fingerprint": "c2ed1b1ed172d282", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-956bda49edf4ca8f", "level": "none", "message": {"text": "Commented-code block (6 lines) in apps/web/src/lib/recording.ts:347"}, "properties": {"repobilityId": "79bed0510cbe59de", "scanner": "scanner-primary", "fingerprint": "956bda49edf4ca8f", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-c30d08a7c3616c1f", "level": "none", "message": {"text": "Commented-code block (5 lines) in apps/web/src/store/authStore.ts:79"}, "properties": {"repobilityId": "766924e85cf23493", "scanner": "scanner-primary", "fingerprint": "c30d08a7c3616c1f", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-31601fe7ee4002d4", "level": "none", "message": {"text": "Commented-code block (5 lines) in apps/web/src/store/chartStore.ts:38"}, "properties": {"repobilityId": "65897dc2af5a732a", "scanner": "scanner-primary", "fingerprint": "31601fe7ee4002d4", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-6fa6f78fe278ae3c", "level": "none", "message": {"text": "Commented-code block (5 lines) in apps/web/src/store/dispensaryStore.ts:36"}, "properties": {"repobilityId": "53032267e54da95e", "scanner": "scanner-primary", "fingerprint": "6fa6f78fe278ae3c", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-5155691ebbb1ece8", "level": "none", "message": {"text": "Commented-code block (6 lines) in apps/web/src/store/lockStore.ts:61"}, "properties": {"repobilityId": "98c0fc3438ae3e43", "scanner": "scanner-primary", "fingerprint": "5155691ebbb1ece8", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-aa9dd6245e156ca4", "level": "none", "message": {"text": "Commented-code block (11 lines) in packages/domain/test/narrative-hash.test.mjs:3"}, "properties": {"repobilityId": "5527901bee1ed071", "scanner": "scanner-primary", "fingerprint": "aa9dd6245e156ca4", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-b6d9f2e0a5822399", "level": "none", "message": {"text": "Commented-code block (5 lines) in packages/domain/src/ai.ts:49"}, "properties": {"repobilityId": "f2e31050b5f7605d", "scanner": "scanner-primary", "fingerprint": "b6d9f2e0a5822399", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-7fce65e17f4adbd5", "level": "none", "message": {"text": "Commented-code block (8 lines) in packages/domain/src/scheduling.ts:178"}, "properties": {"repobilityId": "61acb06d316dc60a", "scanner": "scanner-primary", "fingerprint": "7fce65e17f4adbd5", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-75aaeab9d7056dd6", "level": "none", "message": {"text": "Commented-code block (5 lines) in packages/domain/src/cockpit.ts:11"}, "properties": {"repobilityId": "838fabfc49891940", "scanner": "scanner-primary", "fingerprint": "75aaeab9d7056dd6", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-faee7d9e6e6321e6", "level": "none", "message": {"text": "Commented-code block (6 lines) in packages/domain/src/billing.ts:181"}, "properties": {"repobilityId": "28c7cc71216fad2a", "scanner": "scanner-primary", "fingerprint": "faee7d9e6e6321e6", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-df0b6e6c159af469", "level": "none", "message": {"text": "Commented-code block (5 lines) in packages/domain/src/users.ts:79"}, "properties": {"repobilityId": "20b8c98e83e3a19c", "scanner": "scanner-primary", "fingerprint": "df0b6e6c159af469", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-1bae08c96f2309c5", "level": "none", "message": {"text": "Commented-code block (5 lines) in packages/domain/src/schemas.ts:247"}, "properties": {"repobilityId": "bc2e17c0edeb26c3", "scanner": "scanner-primary", "fingerprint": "1bae08c96f2309c5", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-6d5bc20289f4ff2d", "level": "none", "message": {"text": "Commented-code block (5 lines) in packages/domain/src/documents.ts:182"}, "properties": {"repobilityId": "521a6c3cf31140ec", "scanner": "scanner-primary", "fingerprint": "6d5bc20289f4ff2d", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-aec0979d9d44afe8", "level": "none", "message": {"text": "Commented-code block (6 lines) in packages/domain/src/outcomes.ts:547"}, "properties": {"repobilityId": "95df961296be5c83", "scanner": "scanner-primary", "fingerprint": "aec0979d9d44afe8", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-e6ef4f07ef00c163", "level": "none", "message": {"text": "Commented-code block (5 lines) in packages/domain/src/labs.ts:25"}, "properties": {"repobilityId": "695185c514c637c0", "scanner": "scanner-primary", "fingerprint": "e6ef4f07ef00c163", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-8721b8bbac698d39", "level": "none", "message": {"text": "Commented-code block (5 lines) in packages/domain/src/availability.ts:156"}, "properties": {"repobilityId": "3fa982069fcdf1e0", "scanner": "scanner-primary", "fingerprint": "8721b8bbac698d39", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-522544979f0fc35f", "level": "none", "message": {"text": "Commented-code block (6 lines) in packages/domain/src/labs-pdf.ts:67"}, "properties": {"repobilityId": "f02c0c9af3895325", "scanner": "scanner-primary", "fingerprint": "522544979f0fc35f", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-7aa1ecc3464c71e3", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 infra/seed-demo-labs.mjs:38"}, "properties": {"repobilityId": "4737b5759ac3255e", "scanner": "scanner-primary", "fingerprint": "7aa1ecc3464c71e3", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-d55cebfae45e1272", "level": "none", "message": {"text": "Commented-code block (9 lines) in infra/gen-legacy-map.mjs:421"}, "properties": {"repobilityId": "b9faaa723854e31e", "scanner": "scanner-primary", "fingerprint": "d55cebfae45e1272", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-214488bf618ded58", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 infra/backfill-visit-practiceid.mjs:28"}, "properties": {"repobilityId": "7f06048717e09a38", "scanner": "scanner-primary", "fingerprint": "214488bf618ded58", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-37bdd1d1d0907077", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 infra/import-oldapp.mjs:850"}, "properties": {"repobilityId": "b2f764479cf60740", "scanner": "scanner-primary", "fingerprint": "37bdd1d1d0907077", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-c09812a438064838", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 infra/deploy-rules.mjs:28"}, "properties": {"repobilityId": "aa821960dba6ba3a", "scanner": "scanner-primary", "fingerprint": "c09812a438064838", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-8ab391d3c258e764", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 infra/seed-practice.mjs:29"}, "properties": {"repobilityId": "74a0edceaf1ddeab", "scanner": "scanner-primary", "fingerprint": "8ab391d3c258e764", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-da19e5388f98b137", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 infra/verify-visit-tenancy.mjs:36"}, "properties": {"repobilityId": "ed5d5c792a0ca540", "scanner": "scanner-primary", "fingerprint": "da19e5388f98b137", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-28b37768cebb53c6", "level": "error", "message": {"text": "Dangling fetch: GET https://streaming.assemblyai.com/v3/token?expires_in_seconds=${TOKEN_TTL_SECONDS} (apps/api/src/dictation.ts:89)"}, "properties": {"repobilityId": "230cce040ae2ec44", "scanner": "scanner-primary", "fingerprint": "28b37768cebb53c6", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-f7ecfd385e7a54a4", "level": "note", "message": {"text": "Unused endpoint: POST /pin"}, "properties": {"repobilityId": "ff35c0774503441d", "scanner": "scanner-primary", "fingerprint": "f7ecfd385e7a54a4", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-8290c88ccf5b4608", "level": "note", "message": {"text": "Unused endpoint: GET /pin"}, "properties": {"repobilityId": "583a0ed85fe5c027", "scanner": "scanner-primary", "fingerprint": "8290c88ccf5b4608", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-7a009b1a56794f45", "level": "note", "message": {"text": "Unused endpoint: POST /"}, "properties": {"repobilityId": "353e10a841c4ebc7", "scanner": "scanner-primary", "fingerprint": "7a009b1a56794f45", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-2d729e26437a9d20", "level": "note", "message": {"text": "Unused endpoint: GET /billing/config"}, "properties": {"repobilityId": "549ed2c62b03439e", "scanner": "scanner-primary", "fingerprint": "2d729e26437a9d20", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-8fd8b3d2df5b4f69", "level": "note", "message": {"text": "Unused endpoint: PUT /prices/:itemId"}, "properties": {"repobilityId": "0ac9ac721fe6dbb7", "scanner": "scanner-primary", "fingerprint": "8fd8b3d2df5b4f69", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-0e8bc4aeb4a23e76", "level": "note", "message": {"text": "Unused endpoint: PUT /icd-favorites"}, "properties": {"repobilityId": "5212b8ccc904bacd", "scanner": "scanner-primary", "fingerprint": "0e8bc4aeb4a23e76", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-6731d3796da15b7e", "level": "note", "message": {"text": "Unused endpoint: PUT /tax/config"}, "properties": {"repobilityId": "15cd0130ca6404fd", "scanner": "scanner-primary", "fingerprint": "6731d3796da15b7e", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-52de1441db404ed9", "level": "note", "message": {"text": "Unused endpoint: GET /inventory"}, "properties": {"repobilityId": "dc0579c420f230c2", "scanner": "scanner-primary", "fingerprint": "52de1441db404ed9", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-c4bf8f3e68c09b8d", "level": "note", "message": {"text": "Unused endpoint: POST /inventory/receive"}, "properties": {"repobilityId": "c6d416aa9d2d501c", "scanner": "scanner-primary", "fingerprint": "c4bf8f3e68c09b8d", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-6e2d5886899c8302", "level": "note", "message": {"text": "Unused endpoint: POST /inventory/adjust"}, "properties": {"repobilityId": "42817d251a508f72", "scanner": "scanner-primary", "fingerprint": "6e2d5886899c8302", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-6385cd0e163a390f", "level": "note", "message": {"text": "Unused endpoint: POST /checkout"}, "properties": {"repobilityId": "b4faa496a7a98181", "scanner": "scanner-primary", "fingerprint": "6385cd0e163a390f", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-5e51fe21c8f43269", "level": "note", "message": {"text": "Unused endpoint: POST /refund"}, "properties": {"repobilityId": "9d71f3591fae676d", "scanner": "scanner-primary", "fingerprint": "5e51fe21c8f43269", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-e5006457a4f69d46", "level": "note", "message": {"text": "Unused endpoint: POST /payments"}, "properties": {"repobilityId": "7c8575696a5dd9f4", "scanner": "scanner-primary", "fingerprint": "e5006457a4f69d46", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-ca3179556b619c60", "level": "note", "message": {"text": "Unused endpoint: GET /ledger/:patientId"}, "properties": {"repobilityId": "ae73216f1db21188", "scanner": "scanner-primary", "fingerprint": "ca3179556b619c60", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-2fc2f1e0ef8ed465", "level": "note", "message": {"text": "Unused endpoint: GET /daysheet"}, "properties": {"repobilityId": "af54f0981ef90d75", "scanner": "scanner-primary", "fingerprint": "2fc2f1e0ef8ed465", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-87ad81b67c93627a", "level": "note", "message": {"text": "Unused endpoint: POST /superbill"}, "properties": {"repobilityId": "fe1fdd8f3e638e1c", "scanner": "scanner-primary", "fingerprint": "87ad81b67c93627a", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-d5b0960ee7310ba0", "level": "note", "message": {"text": "Unused endpoint: GET /superbill/:patientId/:visitId"}, "properties": {"repobilityId": "142520307d80d7a8", "scanner": "scanner-primary", "fingerprint": "d5b0960ee7310ba0", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-8d5fea72f1b28a8c", "level": "note", "message": {"text": "Unused endpoint: PATCH /:uid"}, "properties": {"repobilityId": "e96872ccf593e079", "scanner": "scanner-primary", "fingerprint": "8d5fea72f1b28a8c", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-358815753e8867f1", "level": "note", "message": {"text": "Unused endpoint: POST /token"}, "properties": {"repobilityId": "c8da5cfec66a2d10", "scanner": "scanner-primary", "fingerprint": "358815753e8867f1", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-76d4f8cfb9c4f6e7", "level": "note", "message": {"text": "Unused endpoint: GET /api/healthz"}, "properties": {"repobilityId": "ebe974a1f87f3e48", "scanner": "scanner-primary", "fingerprint": "76d4f8cfb9c4f6e7", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-8ff425f9594e3b41", "level": "note", "message": {"text": "Unused endpoint: USE /assets/*"}, "properties": {"repobilityId": "2611a026ca91c86d", "scanner": "scanner-primary", "fingerprint": "8ff425f9594e3b41", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-3abf952b8d28d710", "level": "note", "message": {"text": "Unused endpoint: USE /*"}, "properties": {"repobilityId": "52ece31717057e83", "scanner": "scanner-primary", "fingerprint": "3abf952b8d28d710", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-edf20b1fd2ebb76c", "level": "note", "message": {"text": "Unused endpoint: POST /audit-fanout"}, "properties": {"repobilityId": "914c1937545401b6", "scanner": "scanner-primary", "fingerprint": "edf20b1fd2ebb76c", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-d5b2bf4f02dbb539", "level": "note", "message": {"text": "Unused endpoint: POST /sign-finalizer"}, "properties": {"repobilityId": "34d2b9f1d11793ae", "scanner": "scanner-primary", "fingerprint": "d5b2bf4f02dbb539", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-c844fe0bf20605e0", "level": "note", "message": {"text": "Unused endpoint: POST /canary"}, "properties": {"repobilityId": "a126bf8170d4e917", "scanner": "scanner-primary", "fingerprint": "c844fe0bf20605e0", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-b72f8ff91dc8e127", "level": "note", "message": {"text": "Unused endpoint: POST /canary-check"}, "properties": {"repobilityId": "cb46d16abe94a416", "scanner": "scanner-primary", "fingerprint": "b72f8ff91dc8e127", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-fbf37139aa25d03c", "level": "note", "message": {"text": "Unused endpoint: POST /upload-url"}, "properties": {"repobilityId": "26ad39fe89fb04c4", "scanner": "scanner-primary", "fingerprint": "fbf37139aa25d03c", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-f7fbe3e6dec7fcb8", "level": "note", "message": {"text": "Unused endpoint: POST /:docId/confirm"}, "properties": {"repobilityId": "70f60293854aa245", "scanner": "scanner-primary", "fingerprint": "f7fbe3e6dec7fcb8", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-142d48338320d86d", "level": "note", "message": {"text": "Unused endpoint: GET /:patientId/:docId/url"}, "properties": {"repobilityId": "42102f70e54f2e34", "scanner": "scanner-primary", "fingerprint": "142d48338320d86d", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-ae34a7e7d6064100", "level": "note", "message": {"text": "Unused endpoint: DELETE /:patientId/:docId"}, "properties": {"repobilityId": "22bb043fa6fe5c40", "scanner": "scanner-primary", "fingerprint": "ae34a7e7d6064100", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}]}]}