{"version": "2.1.0", "$schema": "https://json.schemastore.org/sarif-2.1.0.json", "runs": [{"tool": {"driver": {"name": "Repobility", "informationUri": "https://repobility.com", "rules": [{"id": "scanner-bead75b0f9233e05", "name": "No API endpoints detected", "shortDescription": {"text": "No API endpoints detected"}, "fullDescription": {"text": "The scanner did not find FastAPI/Flask/Express/NestJS/GraphQL/gRPC routes. If this repo exposes APIs, the framework may be unsupported."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "info", "confidence": 1.0}}, {"id": "scanner-bbc3eff0ce215599", "name": "Stray `console.log` in TS/JS \u2014 scripts/check-migration-prefixes.js:88", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/check-migration-prefixes.js:88"}, "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-63d36eb79e04a32d", "name": "Stray `console.log` in TS/JS \u2014 scripts/clean-bad-cache.ts:161", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/clean-bad-cache.ts:161"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-4f90850a19a7e9f3", "name": "Stray `console.log` in TS/JS \u2014 scripts/scrape-cleanup.ts:227", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/scrape-cleanup.ts:227"}, "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-b047089b3bc3fcc8", "name": "Stray `console.log` in TS/JS \u2014 scripts/discover-urls.ts:174", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/discover-urls.ts:174"}, "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-3ef2092806c6d545", "name": "Stray `console.log` in TS/JS \u2014 scripts/recompress-storage-images.ts:116", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/recompress-storage-images.ts:116"}, "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-fa263f80ed117d64", "name": "Stray `console.log` in TS/JS \u2014 scripts/generate-pwa-icons.ts:38", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/generate-pwa-icons.ts:38"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-8362d6c1c8128b91", "name": "Stray `console.log` in TS/JS \u2014 scripts/repair-hero-photos.ts:130", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/repair-hero-photos.ts:130"}, "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-79a09c52af574ee2", "name": "Stray `console.log` in TS/JS \u2014 scripts/backfill-global-cache.ts:142", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/backfill-global-cache.ts:142"}, "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-b1e9f36d00d6b1a7", "name": "Stray `console.log` in TS/JS \u2014 scripts/normalize-global-plant-cache.ts:61", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/normalize-global-plant-cache.ts:61"}, "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-5265727003def375", "name": "Stray `console.log` in TS/JS \u2014 scripts/cleanup-bad-heroes.ts:54", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/cleanup-bad-heroes.ts:54"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-91b278fa44bcc8a0", "name": "Stray `console.log` in TS/JS \u2014 scripts/import-pdf-catalog.ts:101", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/import-pdf-catalog.ts:101"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-2211a8c59287d216", "name": "Stray `console.log` in TS/JS \u2014 scripts/migrate-to-plant-packets.ts:52", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/migrate-to-plant-packets.ts:52"}, "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-72f9da89dd39cf9e", "name": "Stray `console.log` in TS/JS \u2014 scripts/bulk-scrape.ts:627", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/bulk-scrape.ts:627"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-4d5784b16f4df9ec", "name": "Stray `console.log` in TS/JS \u2014 scripts/backfill-plant-descriptions.ts:204", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/backfill-plant-descriptions.ts:204"}, "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-b68b39c2466c7f4b", "name": "Stray `console.log` in TS/JS \u2014 scripts/test-scrapers.ts:111", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/test-scrapers.ts:111"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-04737d0b07f7cca7", "name": "Stray `console.log` in TS/JS \u2014 scripts/cleanup-duplicate-care-tasks.ts:65", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/cleanup-duplicate-care-tasks.ts:65"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-4708044b5f051f71", "name": "Stray `console.log` in TS/JS \u2014 scripts/data-hygiene/cleanup.ts:153", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/data-hygiene/cleanup.ts:153"}, "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-6f49c285f6788299", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/GrowInstanceModal.tsx:980", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/GrowInstanceModal.tsx:980"}, "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-04392c21a217adea", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/BatchLogSheet.tsx:361", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/BatchLogSheet.tsx:361"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-b817982239c49065", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/GardenView.tsx:1262", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/GardenView.tsx:1262"}, "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-142796f3cb169577", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/Sidebar.tsx:77", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/Sidebar.tsx:77"}, "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-0d55b7847d3d0adc", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/PlantingForm.tsx:814", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/PlantingForm.tsx:814"}, "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-d357c7ed8dee45ca", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/AuthGuard.tsx:221", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/AuthGuard.tsx:221"}, "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-61bf7d427d3c9f10", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/ShedView.tsx:441", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/ShedView.tsx:441"}, "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-693c505db25cf9a4", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/SearchableMultiSelect.tsx:297", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/SearchableMultiSelect.tsx:297"}, "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-a78f729aed627f9b", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/PacketPickerModal.tsx:132", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/PacketPickerModal.tsx:132"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-e2f7e12e341d5352", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/PacketVaultView.tsx:688", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/PacketVaultView.tsx:688"}, "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-8469ad155478d7b3", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/SeedVaultView.tsx:1008", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/SeedVaultView.tsx:1008"}, "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-881f69c14044e3e0", "name": "`truncate` class without `title=` for hover reveal \u2014 src/components/schedule/AnnualRoadmapView.tsx:71", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/schedule/AnnualRoadmapView.tsx:71"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-d6d21e4a6b553772", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/settings/page.tsx:46", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/settings/page.tsx:46"}, "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-a6b2a540a3cb7e7e", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/settings/vendors/page.tsx:249", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/settings/vendors/page.tsx:249"}, "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-a468e6d6fc145328", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/settings/developer/page.tsx:708", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/settings/developer/page.tsx:708"}, "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-3909f9b3ca410443", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/settings/developer/feedback-inbox/page.tsx:223", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/settings/developer/feedback-inbox/page.tsx:223"}, "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-1a2f44ed190f3edd", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/settings/profile/page.tsx:310", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/settings/profile/page.tsx:310"}, "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-587a33cfe801da53", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/settings/family/page.tsx:575", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/settings/family/page.tsx:575"}, "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-99a0fb747ff1d118", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/settings/feedback/page.tsx:88", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/settings/feedback/page.tsx:88"}, "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-232ee4c12a00b301", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/library/[id]/VaultProfilePlantingsTab.tsx:59", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/library/[id]/VaultProfilePlantingsTab.tsx:59"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-36ad09f9e9d2e3b6", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/vault/import/page.tsx:1460", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/vault/import/page.tsx:1460"}, "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-28d0a5b90b39f542", "name": "Stray `console.log` in TS/JS \u2014 src/app/vault/import/page.tsx:985", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/app/vault/import/page.tsx:985"}, "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-97813aa593119158", "name": "`truncate` class without `title=` for hover reveal \u2014 src/app/vault/import/photos/hero/page.tsx:348", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/vault/import/photos/hero/page.tsx:348"}, "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-0346c059d9939869", "name": "Stray `console.log` in TS/JS \u2014 src/app/journal/page.tsx:415", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/app/journal/page.tsx:415"}, "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-7124d94322105174", "name": "Stray `console.log` in TS/JS \u2014 src/app/api/seed/extract-rescue/route.ts:23", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/app/api/seed/extract-rescue/route.ts:23"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-e572c727779aa538", "name": "Stray `console.log` in TS/JS \u2014 src/app/api/seed/enrich-from-name/route.ts:368", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/app/api/seed/enrich-from-name/route.ts:368"}, "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-24cfbe7d45d1e71b", "name": "Stray `console.log` in TS/JS \u2014 src/app/api/seed/scrape-url/route.ts:1042", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/app/api/seed/scrape-url/route.ts:1042"}, "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-033b61cea5562cb6", "name": "Stray `console.log` in TS/JS \u2014 src/app/api/seed/extract/route.ts:419", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/app/api/seed/extract/route.ts:419"}, "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-297dbc4f04eeea9a", "name": "Stray `console.log` in TS/JS \u2014 src/app/api/seed/extract-metadata/route.ts:221", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/app/api/seed/extract-metadata/route.ts:221"}, "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-cf9ab02d5cd7bf1f", "name": "Stray `console.log` in TS/JS \u2014 src/app/api/seed/find-hero-photo/route.ts:186", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/app/api/seed/find-hero-photo/route.ts:186"}, "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-947f823264a30c30", "name": "Stray `console.log` in TS/JS \u2014 src/lib/debugLogBuffer.test.ts:68", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/lib/debugLogBuffer.test.ts:68"}, "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-6eaf3ca509f71be2", "name": "Stray `console.log` in TS/JS \u2014 src/lib/debugLog.ts:14", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/lib/debugLog.ts:14"}, "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-c6f311611dd14edd", "name": "Stray `console.log` in TS/JS \u2014 src/lib/logRequestMetrics.ts:24", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/lib/logRequestMetrics.ts:24"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-f5c734c7bcbfcf5e", "name": "Stray `console.log` in TS/JS \u2014 src/lib/logClientMetrics.ts:13", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 src/lib/logClientMetrics.ts:13"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-fbf5233c6aa1ec0c", "name": "Stray `console.log` in TS/JS \u2014 e2e/synthetic-user.authenticated.spec.ts:29", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 e2e/synthetic-user.authenticated.spec.ts:29"}, "fullDescription": {"text": "Replace with the toast helper, an error boundary, or remove. `console.warn` / `console.error` are acceptable.\n\nWhy: Hygiene \u2014 easy to leak debug output.\nRule id: fq.console-leak"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-7efbda965f283c17", "name": "GitHub Action is tag-pinned rather than SHA-pinned", "shortDescription": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "fullDescription": {"text": "actions/upload-artifact@v4 can move without a code change in this repo. Pin third-party actions to a reviewed 40-character commit SHA."}, "properties": {"scanner": "scanner-primary", "layer": "cicd", "severity": "low", "confidence": 1.0}}, {"id": "scanner-476c316f9e0bbf43", "name": "Very large file: src/components/QuickAddSeed.tsx (1288 lines)", "shortDescription": {"text": "Very large file: src/components/QuickAddSeed.tsx (1288 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-5a162739193e147e", "name": "Very large file: src/components/GrowInstanceModal.tsx (1202 lines)", "shortDescription": {"text": "Very large file: src/components/GrowInstanceModal.tsx (1202 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-3f3556a3a82d8eb1", "name": "Very large file: src/components/GardenView.tsx (1456 lines)", "shortDescription": {"text": "Very large file: src/components/GardenView.tsx (1456 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-012ca5bff9e25f62", "name": "Very large file: src/components/AddPlantModal.tsx (1116 lines)", "shortDescription": {"text": "Very large file: src/components/AddPlantModal.tsx (1116 lines)"}, "fullDescription": {"text": "Files with >800 lines often hide complexity hotspots and discourage tests."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-4c44fbb1ab43242d", "name": "Very large file: src/components/SeedVaultView.tsx (1104 lines)", "shortDescription": {"text": "Very large file: src/components/SeedVaultView.tsx (1104 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-4ad0128ec4c415d0", "name": "Very large file: src/app/settings/developer/page.tsx (1108 lines)", "shortDescription": {"text": "Very large file: src/app/settings/developer/page.tsx (1108 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-92a44147ea305ef7", "name": "Very large file: src/app/library/[id]/page.tsx (1616 lines)", "shortDescription": {"text": "Very large file: src/app/library/[id]/page.tsx (1616 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-c1b23a57b03ea06e", "name": "Very large file: src/app/vault/VaultPageContent.tsx (1944 lines)", "shortDescription": {"text": "Very large file: src/app/vault/VaultPageContent.tsx (1944 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-30038d4f557a5937", "name": "Very large file: src/app/vault/import/page.tsx (1589 lines)", "shortDescription": {"text": "Very large file: src/app/vault/import/page.tsx (1589 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-52ac44272d891e83", "name": "Very large file: src/app/vault/components/VaultPacketWing.tsx (1148 lines)", "shortDescription": {"text": "Very large file: src/app/vault/components/VaultPacketWing.tsx (1148 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-e9cc9cfa129b5ce0", "name": "Very large file: src/app/vault/review-import/page.tsx (1776 lines)", "shortDescription": {"text": "Very large file: src/app/vault/review-import/page.tsx (1776 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-8f27d6400f79fbc7", "name": "Very large file: src/app/journal/page.tsx (1378 lines)", "shortDescription": {"text": "Very large file: src/app/journal/page.tsx (1378 lines)"}, "fullDescription": {"text": "Files with >800 lines often hide complexity hotspots and discourage tests."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-69a703f056933917", "name": "Very large file: src/app/api/seed/scrape-url/route.ts (4454 lines)", "shortDescription": {"text": "Very large file: src/app/api/seed/scrape-url/route.ts (4454 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-98d7909a0de280fb", "name": "Very large file: src/app/garden/page.tsx (1386 lines)", "shortDescription": {"text": "Very large file: src/app/garden/page.tsx (1386 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-6cdce8011b272c60", "name": "Very large file: src/app/calendar/page.tsx (2350 lines)", "shortDescription": {"text": "Very large file: src/app/calendar/page.tsx (2350 lines)"}, "fullDescription": {"text": "Files with >800 lines often hide complexity hotspots and discourage tests."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-ea3b5e389d8c9c0f", "name": "Low test-to-source ratio", "shortDescription": {"text": "Low test-to-source ratio"}, "fullDescription": {"text": "73 tests / 350 src (ratio 0.21)."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-141b30a41e03817b", "name": "No license file detected", "shortDescription": {"text": "No license file detected"}, "fullDescription": {"text": "No LICENSE/COPYING/NOTICE file was found. Generated repositories often omit licensing, which blocks reuse and automated intake."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-3ab5d313dda8e5f9", "name": "Debug logging residue appears in source files", "shortDescription": {"text": "Debug logging residue appears in source files"}, "fullDescription": {"text": "Found 265 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 282 placeholder/mock markers across 67 source files. This often means the repo looks complete while core flows still use generated scaffolding or fake data."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-9d79c4077342a7d0", "name": "Runtime service client appears to use placeholder configuration", "shortDescription": {"text": "Runtime service client appears to use placeholder configuration"}, "fullDescription": {"text": "A runtime source file appears to wire Supabase/Firebase/AI/payment-style clients to placeholder URLs, keys, or fallback values. In the Fable corpus this often means the UI/API shape is present while the backend service is not actually configured."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-2d0c7b7ab8f8aacf", "name": "Critical user flow still appears backed by mock or placeholder data", "shortDescription": {"text": "Critical user flow still appears backed by mock or placeholder data"}, "fullDescription": {"text": "A payment/auth/admin/order/billing-style flow contains mock, fake, TODO, dummy, or placeholder markers in runtime source. In the Fable corpus this is a high-leverage completeness smell: the app can look finished while the money, identity, or tenant flow is still scaffolded."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-749d4bc1bd66df5f", "name": "Agent instructions exist but release-hardening basics are missing", "shortDescription": {"text": "Agent instructions exist but release-hardening basics are missing"}, "fullDescription": {"text": "AI-coder instruction files were found, but the repo is missing license. Treat this as a contract gap: the agent is guided, but the generated output is not yet guarded by the controls that make it repeatable."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-ea8f3013f588db25", "name": "Shallow git history limits provenance confidence", "shortDescription": {"text": "Shallow git history limits provenance confidence"}, "fullDescription": {"text": "The repository is a shallow clone. Origin/evolution analysis cannot distinguish fresh generation, imported legacy code, or long-lived human code with high confidence."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-8424db9c75e04ba4", "name": "Very short observed git history", "shortDescription": {"text": "Very short observed git history"}, "fullDescription": {"text": "The repo has multiple source files but two or fewer visible commits. This is not a failure by itself, but it lowers confidence in evolution-based diagnosis."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-2c5f98b152cddb6d", "name": "Agent authority lacks a verifier contract: .claude/launch.json", "shortDescription": {"text": "Agent authority lacks a verifier contract: .claude/launch.json"}, "fullDescription": {"text": "This agent instruction grants code or shell authority but does not state the verification gate that decides promotion. The recurring safe pattern is: LLM proposes; deterministic tests/build/security checks verify; only verified code promotes."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-40a1cc1c7b6e716f", "name": "Agent instruction/config may expose a secret: .claude/plans/fab_form_submit_standardization.plan.md", "shortDescription": {"text": "Agent instruction/config may expose a secret: .claude/plans/fab_form_submit_standardization.plan.md"}, "fullDescription": {"text": "Agent-facing files are routinely pasted into LLM/tool contexts. Move literal tokens, keys, and passwords into a secret manager or document them as placeholders only."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-3769c656a334fc7f", "name": "Agent instruction/config may expose a secret: .claude/plans/sprint4_chunk_b_profile_display.md", "shortDescription": {"text": "Agent instruction/config may expose a secret: .claude/plans/sprint4_chunk_b_profile_display.md"}, "fullDescription": {"text": "Agent-facing files are routinely pasted into LLM/tool contexts. Move literal tokens, keys, and passwords into a secret manager or document them as placeholders only."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-83499ea22c154df6", "name": "Agent instruction/config may expose a secret: .claude/plans/fab_from_vault_in_menu_conversion.md", "shortDescription": {"text": "Agent instruction/config may expose a secret: .claude/plans/fab_from_vault_in_menu_conversion.md"}, "fullDescription": {"text": "Agent-facing files are routinely pasted into LLM/tool contexts. Move literal tokens, keys, and passwords into a secret manager or document them as placeholders only."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-ae299bc87dde53eb", "name": "Agent instruction/config may expose a secret: .cursor/plans/fab_addplantmodal_extraction.plan.md", "shortDescription": {"text": "Agent instruction/config may expose a secret: .cursor/plans/fab_addplantmodal_extraction.plan.md"}, "fullDescription": {"text": "Agent-facing files are routinely pasted into LLM/tool contexts. Move literal tokens, keys, and passwords into a secret manager or document them as placeholders only."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-a40c95f449a0b531", "name": "Agent authority lacks a verifier contract: .cursor/plans/add_plant_and_seed_packet_flows.plan.md", "shortDescription": {"text": "Agent authority lacks a verifier contract: .cursor/plans/add_plant_and_seed_packet_flows.plan.md"}, "fullDescription": {"text": "This agent instruction grants code or shell authority but does not state the verification gate that decides promotion. The recurring safe pattern is: LLM proposes; deterministic tests/build/security checks verify; only verified code promotes."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-8da7dc98afb628e0", "name": "Agent authority lacks a verifier contract: .cursor/plans/planting_and_journal_ux_fixes.plan.md", "shortDescription": {"text": "Agent authority lacks a verifier contract: .cursor/plans/planting_and_journal_ux_fixes.plan.md"}, "fullDescription": {"text": "This agent instruction grants code or shell authority but does not state the verification gate that decides promotion. The recurring safe pattern is: LLM proposes; deterministic tests/build/security checks verify; only verified code promotes."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-af13b3d98b44ebf2", "name": "Agent instruction/config may expose a secret: .cursor/plans/calendar_shed_fab_refactor.plan.md", "shortDescription": {"text": "Agent instruction/config may expose a secret: .cursor/plans/calendar_shed_fab_refactor.plan.md"}, "fullDescription": {"text": "Agent-facing files are routinely pasted into LLM/tool contexts. Move literal tokens, keys, and passwords into a secret manager or document them as placeholders only."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-0502e55b062197b1", "name": "Agent authority lacks a verifier contract: .cursor/plans/filter_default_save_remove_flow.plan.md", "shortDescription": {"text": "Agent authority lacks a verifier contract: .cursor/plans/filter_default_save_remove_flow.plan.md"}, "fullDescription": {"text": "This agent instruction grants code or shell authority but does not state the verification gate that decides promotion. The recurring safe pattern is: LLM proposes; deterministic tests/build/security checks verify; only verified code promotes."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-35dfda6d8d48ef7d", "name": "Agent authority lacks a verifier contract: .cursor/plans/loading_states_implementation.plan.md", "shortDescription": {"text": "Agent authority lacks a verifier contract: .cursor/plans/loading_states_implementation.plan.md"}, "fullDescription": {"text": "This agent instruction grants code or shell authority but does not state the verification gate that decides promotion. The recurring safe pattern is: LLM proposes; deterministic tests/build/security checks verify; only verified code promotes."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-71499eb870f8b5a7", "name": "Agent authority lacks a verifier contract: .cursor/plans/companion_planting_single_source_of_truth.md", "shortDescription": {"text": "Agent authority lacks a verifier contract: .cursor/plans/companion_planting_single_source_of_truth.md"}, "fullDescription": {"text": "This agent instruction grants code or shell authority but does not state the verification gate that decides promotion. The recurring safe pattern is: LLM proposes; deterministic tests/build/security checks verify; only verified code promotes."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-7c475c04cba797a2", "name": "Agent authority lacks a verifier contract: .cursor/plans/pre_seed_plant_library.md", "shortDescription": {"text": "Agent authority lacks a verifier contract: .cursor/plans/pre_seed_plant_library.md"}, "fullDescription": {"text": "This agent instruction grants code or shell authority but does not state the verification gate that decides promotion. The recurring safe pattern is: LLM proposes; deterministic tests/build/security checks verify; only verified code promotes."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-add4ce6bbb90bdd3", "name": "Commented-code block (5 lines) in scripts/check-migration-prefixes.js:43", "shortDescription": {"text": "Commented-code block (5 lines) in scripts/check-migration-prefixes.js:43"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-558679bfeee607c1", "name": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/clean-bad-cache.ts:88", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/clean-bad-cache.ts:88"}, "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-1ef27f3e8f601941", "name": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/scrape-cleanup.ts:56", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/scrape-cleanup.ts:56"}, "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-ff9ebd08b362a3b6", "name": "Legacy-named symbol `20250205800000_plant_profiles_drop_legacy` in scripts/migrate-to-plant-packets.ts:177", "shortDescription": {"text": "Legacy-named symbol `20250205800000_plant_profiles_drop_legacy` in scripts/migrate-to-plant-packets.ts:177"}, "fullDescription": {"text": "Names with suffixes like `_old`, `_v1`, `_deprecated` usually indicate replaced-but-not-removed code (typical AI-coder leftover). Confirm and delete, or rename if it's the active version."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-3e025aefde063429", "name": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/bulk-scrape.ts:79", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/bulk-scrape.ts:79"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-8f3c7cf06a1fd53f", "name": "`fetch()` without try/.catch or AbortSignal \u2014 public/sw.js:85", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 public/sw.js:85"}, "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-785fa06091e82b20", "name": "Commented-code block (6 lines) in src/components/AddVarietyModal.tsx:150", "shortDescription": {"text": "Commented-code block (6 lines) in src/components/AddVarietyModal.tsx:150"}, "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-a64b429c439898e7", "name": "Commented-code block (6 lines) in src/components/QuickAddSeed.tsx:455", "shortDescription": {"text": "Commented-code block (6 lines) in src/components/QuickAddSeed.tsx:455"}, "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-cdbc557b0202702d", "name": "Commented-code block (8 lines) in src/components/UniversalAddMenu.tsx:99", "shortDescription": {"text": "Commented-code block (8 lines) in src/components/UniversalAddMenu.tsx:99"}, "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-47d3b0404d184b6c", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/UniversalAddMenu.tsx:101", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/UniversalAddMenu.tsx:101"}, "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-b28bb1a46fd2c0e0", "name": "Commented-code block (6 lines) in src/components/GrowInstanceModal.tsx:354", "shortDescription": {"text": "Commented-code block (6 lines) in src/components/GrowInstanceModal.tsx:354"}, "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-ddaa4c7e2538b7ae", "name": "Legacy-named symbol `lastUsedLegacy` in src/components/ShedView.tsx:163", "shortDescription": {"text": "Legacy-named symbol `lastUsedLegacy` in src/components/ShedView.tsx:163"}, "fullDescription": {"text": "Names with suffixes like `_old`, `_v1`, `_deprecated` usually indicate replaced-but-not-removed code (typical AI-coder leftover). Confirm and delete, or rename if it's the active version."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-17d9989474825f98", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/settings/import-logs/page.tsx:38", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/settings/import-logs/page.tsx: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-6379667a95a38d23", "name": "Legacy-named symbol `isLegacy` in src/app/library/[id]/VaultProfileCareTab.tsx:17", "shortDescription": {"text": "Legacy-named symbol `isLegacy` in src/app/library/[id]/VaultProfileCareTab.tsx:17"}, "fullDescription": {"text": "Names with suffixes like `_old`, `_v1`, `_deprecated` usually indicate replaced-but-not-removed code (typical AI-coder leftover). Confirm and delete, or rename if it's the active version."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-563aafa7e06e29b0", "name": "Legacy-named symbol `isLegacy` in src/app/library/[id]/page.tsx:575", "shortDescription": {"text": "Legacy-named symbol `isLegacy` in src/app/library/[id]/page.tsx:575"}, "fullDescription": {"text": "Names with suffixes like `_old`, `_v1`, `_deprecated` usually indicate replaced-but-not-removed code (typical AI-coder leftover). Confirm and delete, or rename if it's the active version."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-1a165dc26616f10c", "name": "Commented-code block (5 lines) in src/app/library/[id]/page.tsx:129", "shortDescription": {"text": "Commented-code block (5 lines) in src/app/library/[id]/page.tsx:129"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-aa3c28f19a56105e", "name": "Legacy-named symbol `isLegacy` in src/app/library/[id]/VaultProfileAboutTab.tsx:21", "shortDescription": {"text": "Legacy-named symbol `isLegacy` in src/app/library/[id]/VaultProfileAboutTab.tsx:21"}, "fullDescription": {"text": "Names with suffixes like `_old`, `_v1`, `_deprecated` usually indicate replaced-but-not-removed code (typical AI-coder leftover). Confirm and delete, or rename if it's the active version."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-48e48908b923cce5", "name": "Commented-code block (5 lines) in src/app/library/[id]/VaultProfileAboutTab.tsx:150", "shortDescription": {"text": "Commented-code block (5 lines) in src/app/library/[id]/VaultProfileAboutTab.tsx:150"}, "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-c8da9f53574f73e1", "name": "Legacy-named symbol `isLegacy` in src/app/vault/permanentPlantProfile.regression.test.ts:68", "shortDescription": {"text": "Legacy-named symbol `isLegacy` in src/app/vault/permanentPlantProfile.regression.test.ts:68"}, "fullDescription": {"text": "Names with suffixes like `_old`, `_v1`, `_deprecated` usually indicate replaced-but-not-removed code (typical AI-coder leftover). Confirm and delete, or rename if it's the active version."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-26fb685f29b171f7", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/vault/review-import/page.tsx:706", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/vault/review-import/page.tsx:706"}, "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-98fe91c09b14e50b", "name": "Commented-code block (6 lines) in src/app/api/ai-fill/enqueue/route.ts:218", "shortDescription": {"text": "Commented-code block (6 lines) in src/app/api/ai-fill/enqueue/route.ts:218"}, "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-936c089ff54d3d7a", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/api/ai-fill/enqueue/route.ts:68", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/api/ai-fill/enqueue/route.ts:68"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-0028eb3f20eb2cfa", "name": "Commented-code block (5 lines) in src/app/api/ai-fill/enqueue/route.test.ts:240", "shortDescription": {"text": "Commented-code block (5 lines) in src/app/api/ai-fill/enqueue/route.test.ts:240"}, "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-74525bfe008a7206", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/api/seed/ocr-extract/route.ts:66", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/api/seed/ocr-extract/route.ts:66"}, "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-e2638f621d12be5f", "name": "Commented-code block (5 lines) in src/app/api/seed/enrich-from-name/route.ts:441", "shortDescription": {"text": "Commented-code block (5 lines) in src/app/api/seed/enrich-from-name/route.ts:441"}, "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-cbfa2e04089459b5", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/api/seed/scrape-url/route.ts:3738", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/api/seed/scrape-url/route.ts:3738"}, "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-7fa9c19786a7ed1c", "name": "Commented-code block (5 lines) in src/app/api/seed/extract/route.ts:598", "shortDescription": {"text": "Commented-code block (5 lines) in src/app/api/seed/extract/route.ts:598"}, "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-27a235e265f9629e", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/api/seed/extract-metadata/route.ts:209", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/api/seed/extract-metadata/route.ts:209"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-a47246fd65d6bcda", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/api/seed/perenual-enrich/route.ts:56", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/api/seed/perenual-enrich/route.ts:56"}, "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-312d1dacc588f069", "name": "Commented-code block (7 lines) in src/app/api/seed/fill-blanks-for-profile/route.ts:15", "shortDescription": {"text": "Commented-code block (7 lines) in src/app/api/seed/fill-blanks-for-profile/route.ts:15"}, "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-40075658dc290110", "name": "Commented-code block (5 lines) in src/app/garden/page.tsx:420", "shortDescription": {"text": "Commented-code block (5 lines) in src/app/garden/page.tsx:420"}, "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-817a6e71c4fb9089", "name": "Commented-code block (5 lines) in src/app/calendar/page.tsx:2206", "shortDescription": {"text": "Commented-code block (5 lines) in src/app/calendar/page.tsx:2206"}, "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-3d56a50a3890734d", "name": "Commented-code block (6 lines) in src/app/calendar/calendarBatchSelect.regression.test.ts:287", "shortDescription": {"text": "Commented-code block (6 lines) in src/app/calendar/calendarBatchSelect.regression.test.ts:287"}, "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-78f4cf5ed76d5cd3", "name": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/fetchWithRetry.ts:8", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/fetchWithRetry.ts:8"}, "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-67fdc475fed1dfad", "name": "Commented-code block (5 lines) in src/lib/researchVariety.ts:351", "shortDescription": {"text": "Commented-code block (5 lines) in src/lib/researchVariety.ts:351"}, "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-7008816c2ecc98c8", "name": "Commented-code block (5 lines) in src/lib/enrichProfileFromName.ts:243", "shortDescription": {"text": "Commented-code block (5 lines) in src/lib/enrichProfileFromName.ts:243"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-ea3381713aebc152", "name": "Legacy-named symbol `isLegacy` in src/lib/ai-fill/version.ts:67", "shortDescription": {"text": "Legacy-named symbol `isLegacy` in src/lib/ai-fill/version.ts:67"}, "fullDescription": {"text": "Names with suffixes like `_old`, `_v1`, `_deprecated` usually indicate replaced-but-not-removed code (typical AI-coder leftover). Confirm and delete, or rename if it's the active version."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-f808a4ef3e1071fb", "name": "14 env vars used in code but missing from .env.example", "shortDescription": {"text": "14 env vars used in code but missing from .env.example"}, "fullDescription": {"text": "Drift between code and config docs. The first few: `ANALYZE`, `CI`, `E2E_TEST_EMAIL`, `E2E_TEST_PASSWORD`, `GEMINI_API_KEY`, `GEMINI_DAILY_LIMIT_ALLOWLIST`, `GEMINI_DAILY_LIMIT_PER_USER`, `GOOGLE_AI_KEY` + 6 more. Add them (with a placeholder/comment) to .env.example so onboarding doesn't break."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}]}}, "automationDetails": {"id": "repobility/20647"}, "properties": {"repository": "sydknee09-web/Garden-Tracker", "repoUrl": "https://github.com/sydknee09-web/Garden-Tracker", "branch": "main"}, "results": [{"ruleId": "scanner-bead75b0f9233e05", "level": "none", "message": {"text": "No API endpoints detected"}, "properties": {"repobilityId": "0f8bb852027c38f8", "scanner": "scanner-primary", "fingerprint": "bead75b0f9233e05", "layer": "api", "severity": "info", "confidence": 1.0, "tags": ["coverage"]}}, {"ruleId": "scanner-bbc3eff0ce215599", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/check-migration-prefixes.js:88"}, "properties": {"repobilityId": "0471babeea41effc", "scanner": "scanner-primary", "fingerprint": "bbc3eff0ce215599", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-63d36eb79e04a32d", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/clean-bad-cache.ts:161"}, "properties": {"repobilityId": "5f2be67638dce75e", "scanner": "scanner-primary", "fingerprint": "63d36eb79e04a32d", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-4f90850a19a7e9f3", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/scrape-cleanup.ts:227"}, "properties": {"repobilityId": "f7d9cf8db33af253", "scanner": "scanner-primary", "fingerprint": "4f90850a19a7e9f3", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-b047089b3bc3fcc8", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/discover-urls.ts:174"}, "properties": {"repobilityId": "72bcae8e7e2d6f3c", "scanner": "scanner-primary", "fingerprint": "b047089b3bc3fcc8", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-3ef2092806c6d545", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/recompress-storage-images.ts:116"}, "properties": {"repobilityId": "a07739ec5e57786f", "scanner": "scanner-primary", "fingerprint": "3ef2092806c6d545", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-fa263f80ed117d64", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/generate-pwa-icons.ts:38"}, "properties": {"repobilityId": "5e682a15bee470a8", "scanner": "scanner-primary", "fingerprint": "fa263f80ed117d64", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-8362d6c1c8128b91", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/repair-hero-photos.ts:130"}, "properties": {"repobilityId": "6b0dc3d5bb9084bc", "scanner": "scanner-primary", "fingerprint": "8362d6c1c8128b91", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-79a09c52af574ee2", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/backfill-global-cache.ts:142"}, "properties": {"repobilityId": "1e4a775503283bb2", "scanner": "scanner-primary", "fingerprint": "79a09c52af574ee2", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-b1e9f36d00d6b1a7", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/normalize-global-plant-cache.ts:61"}, "properties": {"repobilityId": "d4fd9699cc54e769", "scanner": "scanner-primary", "fingerprint": "b1e9f36d00d6b1a7", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-5265727003def375", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/cleanup-bad-heroes.ts:54"}, "properties": {"repobilityId": "ad0dd659dacca323", "scanner": "scanner-primary", "fingerprint": "5265727003def375", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-91b278fa44bcc8a0", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/import-pdf-catalog.ts:101"}, "properties": {"repobilityId": "d99cb4f84197d6ed", "scanner": "scanner-primary", "fingerprint": "91b278fa44bcc8a0", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-2211a8c59287d216", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/migrate-to-plant-packets.ts:52"}, "properties": {"repobilityId": "beab594b65b4f126", "scanner": "scanner-primary", "fingerprint": "2211a8c59287d216", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-72f9da89dd39cf9e", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/bulk-scrape.ts:627"}, "properties": {"repobilityId": "97a540aeba9f4751", "scanner": "scanner-primary", "fingerprint": "72f9da89dd39cf9e", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-4d5784b16f4df9ec", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/backfill-plant-descriptions.ts:204"}, "properties": {"repobilityId": "898f0fa2fe8899e2", "scanner": "scanner-primary", "fingerprint": "4d5784b16f4df9ec", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-b68b39c2466c7f4b", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/test-scrapers.ts:111"}, "properties": {"repobilityId": "6c46735083f46a04", "scanner": "scanner-primary", "fingerprint": "b68b39c2466c7f4b", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-04737d0b07f7cca7", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/cleanup-duplicate-care-tasks.ts:65"}, "properties": {"repobilityId": "c717058887906c94", "scanner": "scanner-primary", "fingerprint": "04737d0b07f7cca7", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-4708044b5f051f71", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/data-hygiene/cleanup.ts:153"}, "properties": {"repobilityId": "552e21c596d603dc", "scanner": "scanner-primary", "fingerprint": "4708044b5f051f71", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-6f49c285f6788299", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/GrowInstanceModal.tsx:980"}, "properties": {"repobilityId": "cf3da3ede0c45010", "scanner": "scanner-primary", "fingerprint": "6f49c285f6788299", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-04392c21a217adea", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/BatchLogSheet.tsx:361"}, "properties": {"repobilityId": "6ec558f49962b935", "scanner": "scanner-primary", "fingerprint": "04392c21a217adea", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-b817982239c49065", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/GardenView.tsx:1262"}, "properties": {"repobilityId": "df785b24c13d5ac0", "scanner": "scanner-primary", "fingerprint": "b817982239c49065", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-142796f3cb169577", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/Sidebar.tsx:77"}, "properties": {"repobilityId": "450176a4d82f7dad", "scanner": "scanner-primary", "fingerprint": "142796f3cb169577", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-0d55b7847d3d0adc", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/PlantingForm.tsx:814"}, "properties": {"repobilityId": "4d8b494d76d8b12f", "scanner": "scanner-primary", "fingerprint": "0d55b7847d3d0adc", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-d357c7ed8dee45ca", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/AuthGuard.tsx:221"}, "properties": {"repobilityId": "324ace399ccd312a", "scanner": "scanner-primary", "fingerprint": "d357c7ed8dee45ca", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-61bf7d427d3c9f10", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/ShedView.tsx:441"}, "properties": {"repobilityId": "44192d5dfd890bc0", "scanner": "scanner-primary", "fingerprint": "61bf7d427d3c9f10", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-693c505db25cf9a4", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/SearchableMultiSelect.tsx:297"}, "properties": {"repobilityId": "e89797518a8b83ba", "scanner": "scanner-primary", "fingerprint": "693c505db25cf9a4", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-a78f729aed627f9b", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/PacketPickerModal.tsx:132"}, "properties": {"repobilityId": "1cb950a26a68a08e", "scanner": "scanner-primary", "fingerprint": "a78f729aed627f9b", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-e2f7e12e341d5352", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/PacketVaultView.tsx:688"}, "properties": {"repobilityId": "f5c67cd3d92446cc", "scanner": "scanner-primary", "fingerprint": "e2f7e12e341d5352", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-8469ad155478d7b3", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/SeedVaultView.tsx:1008"}, "properties": {"repobilityId": "df98fdbc1d45b511", "scanner": "scanner-primary", "fingerprint": "8469ad155478d7b3", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-881f69c14044e3e0", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/components/schedule/AnnualRoadmapView.tsx:71"}, "properties": {"repobilityId": "64e3491618c4cf84", "scanner": "scanner-primary", "fingerprint": "881f69c14044e3e0", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-d6d21e4a6b553772", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/settings/page.tsx:46"}, "properties": {"repobilityId": "5cda187ee19a1098", "scanner": "scanner-primary", "fingerprint": "d6d21e4a6b553772", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-a6b2a540a3cb7e7e", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/settings/vendors/page.tsx:249"}, "properties": {"repobilityId": "54b8720331a4a985", "scanner": "scanner-primary", "fingerprint": "a6b2a540a3cb7e7e", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-a468e6d6fc145328", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/settings/developer/page.tsx:708"}, "properties": {"repobilityId": "a2301c6ff18e14d6", "scanner": "scanner-primary", "fingerprint": "a468e6d6fc145328", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-3909f9b3ca410443", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/settings/developer/feedback-inbox/page.tsx:223"}, "properties": {"repobilityId": "563bbc91191ed165", "scanner": "scanner-primary", "fingerprint": "3909f9b3ca410443", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-1a2f44ed190f3edd", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/settings/profile/page.tsx:310"}, "properties": {"repobilityId": "da3feec6c81bb3b3", "scanner": "scanner-primary", "fingerprint": "1a2f44ed190f3edd", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-587a33cfe801da53", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/settings/family/page.tsx:575"}, "properties": {"repobilityId": "61424df777f65156", "scanner": "scanner-primary", "fingerprint": "587a33cfe801da53", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-99a0fb747ff1d118", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/settings/feedback/page.tsx:88"}, "properties": {"repobilityId": "ab2285a29e74a544", "scanner": "scanner-primary", "fingerprint": "99a0fb747ff1d118", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-232ee4c12a00b301", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/library/[id]/VaultProfilePlantingsTab.tsx:59"}, "properties": {"repobilityId": "550b1ba6438eb5b7", "scanner": "scanner-primary", "fingerprint": "232ee4c12a00b301", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-36ad09f9e9d2e3b6", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/vault/import/page.tsx:1460"}, "properties": {"repobilityId": "d73e827abdbf7ce9", "scanner": "scanner-primary", "fingerprint": "36ad09f9e9d2e3b6", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-28d0a5b90b39f542", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/app/vault/import/page.tsx:985"}, "properties": {"repobilityId": "b0d7462fefa09c07", "scanner": "scanner-primary", "fingerprint": "28d0a5b90b39f542", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-97813aa593119158", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 src/app/vault/import/photos/hero/page.tsx:348"}, "properties": {"repobilityId": "af076b99ac72a17b", "scanner": "scanner-primary", "fingerprint": "97813aa593119158", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-0346c059d9939869", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/app/journal/page.tsx:415"}, "properties": {"repobilityId": "35f7943f0e1d9d76", "scanner": "scanner-primary", "fingerprint": "0346c059d9939869", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-7124d94322105174", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/app/api/seed/extract-rescue/route.ts:23"}, "properties": {"repobilityId": "7c561f1939b1e840", "scanner": "scanner-primary", "fingerprint": "7124d94322105174", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-e572c727779aa538", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/app/api/seed/enrich-from-name/route.ts:368"}, "properties": {"repobilityId": "d4134fdc347370c1", "scanner": "scanner-primary", "fingerprint": "e572c727779aa538", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-24cfbe7d45d1e71b", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/app/api/seed/scrape-url/route.ts:1042"}, "properties": {"repobilityId": "9434c9f7ea908824", "scanner": "scanner-primary", "fingerprint": "24cfbe7d45d1e71b", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-033b61cea5562cb6", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/app/api/seed/extract/route.ts:419"}, "properties": {"repobilityId": "eba222c579b8f025", "scanner": "scanner-primary", "fingerprint": "033b61cea5562cb6", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-297dbc4f04eeea9a", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/app/api/seed/extract-metadata/route.ts:221"}, "properties": {"repobilityId": "cdbb43d0774410a9", "scanner": "scanner-primary", "fingerprint": "297dbc4f04eeea9a", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-cf9ab02d5cd7bf1f", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/app/api/seed/find-hero-photo/route.ts:186"}, "properties": {"repobilityId": "c95692a7317b782f", "scanner": "scanner-primary", "fingerprint": "cf9ab02d5cd7bf1f", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-947f823264a30c30", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/lib/debugLogBuffer.test.ts:68"}, "properties": {"repobilityId": "f959041ccfa5c1ee", "scanner": "scanner-primary", "fingerprint": "947f823264a30c30", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-6eaf3ca509f71be2", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/lib/debugLog.ts:14"}, "properties": {"repobilityId": "5b4aedf528a2adf6", "scanner": "scanner-primary", "fingerprint": "6eaf3ca509f71be2", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-c6f311611dd14edd", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/lib/logRequestMetrics.ts:24"}, "properties": {"repobilityId": "fa15648167e25dea", "scanner": "scanner-primary", "fingerprint": "c6f311611dd14edd", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-f5c734c7bcbfcf5e", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 src/lib/logClientMetrics.ts:13"}, "properties": {"repobilityId": "37d153fe224cb590", "scanner": "scanner-primary", "fingerprint": "f5c734c7bcbfcf5e", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-fbf5233c6aa1ec0c", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 e2e/synthetic-user.authenticated.spec.ts:29"}, "properties": {"repobilityId": "ac262a313a03f820", "scanner": "scanner-primary", "fingerprint": "fbf5233c6aa1ec0c", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-7efbda965f283c17", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "c7b0656e54a8a817", "scanner": "scanner-primary", "fingerprint": "7efbda965f283c17", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/test.yml"}, "region": {"startLine": 70}}}]}, {"ruleId": "scanner-476c316f9e0bbf43", "level": "note", "message": {"text": "Very large file: src/components/QuickAddSeed.tsx (1288 lines)"}, "properties": {"repobilityId": "81840af223f22aa1", "scanner": "scanner-primary", "fingerprint": "476c316f9e0bbf43", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-5a162739193e147e", "level": "note", "message": {"text": "Very large file: src/components/GrowInstanceModal.tsx (1202 lines)"}, "properties": {"repobilityId": "42b911cde555166a", "scanner": "scanner-primary", "fingerprint": "5a162739193e147e", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-3f3556a3a82d8eb1", "level": "note", "message": {"text": "Very large file: src/components/GardenView.tsx (1456 lines)"}, "properties": {"repobilityId": "d1b48852016411b6", "scanner": "scanner-primary", "fingerprint": "3f3556a3a82d8eb1", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-012ca5bff9e25f62", "level": "note", "message": {"text": "Very large file: src/components/AddPlantModal.tsx (1116 lines)"}, "properties": {"repobilityId": "e6cffcd0738a01b5", "scanner": "scanner-primary", "fingerprint": "012ca5bff9e25f62", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-4c44fbb1ab43242d", "level": "note", "message": {"text": "Very large file: src/components/SeedVaultView.tsx (1104 lines)"}, "properties": {"repobilityId": "0bd3f2dc0e185b6b", "scanner": "scanner-primary", "fingerprint": "4c44fbb1ab43242d", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-4ad0128ec4c415d0", "level": "note", "message": {"text": "Very large file: src/app/settings/developer/page.tsx (1108 lines)"}, "properties": {"repobilityId": "c08a58f6dfe1fcfd", "scanner": "scanner-primary", "fingerprint": "4ad0128ec4c415d0", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-92a44147ea305ef7", "level": "note", "message": {"text": "Very large file: src/app/library/[id]/page.tsx (1616 lines)"}, "properties": {"repobilityId": "4487f79c81038f0c", "scanner": "scanner-primary", "fingerprint": "92a44147ea305ef7", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-c1b23a57b03ea06e", "level": "note", "message": {"text": "Very large file: src/app/vault/VaultPageContent.tsx (1944 lines)"}, "properties": {"repobilityId": "adb2a2ffee47d541", "scanner": "scanner-primary", "fingerprint": "c1b23a57b03ea06e", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-30038d4f557a5937", "level": "note", "message": {"text": "Very large file: src/app/vault/import/page.tsx (1589 lines)"}, "properties": {"repobilityId": "f3d390b2815df82b", "scanner": "scanner-primary", "fingerprint": "30038d4f557a5937", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-52ac44272d891e83", "level": "note", "message": {"text": "Very large file: src/app/vault/components/VaultPacketWing.tsx (1148 lines)"}, "properties": {"repobilityId": "15bfd532ba6107f7", "scanner": "scanner-primary", "fingerprint": "52ac44272d891e83", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-e9cc9cfa129b5ce0", "level": "note", "message": {"text": "Very large file: src/app/vault/review-import/page.tsx (1776 lines)"}, "properties": {"repobilityId": "32621c463e61b1d0", "scanner": "scanner-primary", "fingerprint": "e9cc9cfa129b5ce0", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-8f27d6400f79fbc7", "level": "note", "message": {"text": "Very large file: src/app/journal/page.tsx (1378 lines)"}, "properties": {"repobilityId": "3ba2cb051c7dac5c", "scanner": "scanner-primary", "fingerprint": "8f27d6400f79fbc7", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-69a703f056933917", "level": "note", "message": {"text": "Very large file: src/app/api/seed/scrape-url/route.ts (4454 lines)"}, "properties": {"repobilityId": "9a8dcc237c51b5a1", "scanner": "scanner-primary", "fingerprint": "69a703f056933917", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-98d7909a0de280fb", "level": "note", "message": {"text": "Very large file: src/app/garden/page.tsx (1386 lines)"}, "properties": {"repobilityId": "d8756c769599769c", "scanner": "scanner-primary", "fingerprint": "98d7909a0de280fb", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-6cdce8011b272c60", "level": "note", "message": {"text": "Very large file: src/app/calendar/page.tsx (2350 lines)"}, "properties": {"repobilityId": "4ad53758fac797c8", "scanner": "scanner-primary", "fingerprint": "6cdce8011b272c60", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-ea3b5e389d8c9c0f", "level": "note", "message": {"text": "Low test-to-source ratio"}, "properties": {"repobilityId": "ef7b2552cc00a375", "scanner": "scanner-primary", "fingerprint": "ea3b5e389d8c9c0f", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["tests"]}}, {"ruleId": "scanner-141b30a41e03817b", "level": "note", "message": {"text": "No license file detected"}, "properties": {"repobilityId": "cb9bd7b162a8bb94", "scanner": "scanner-primary", "fingerprint": "141b30a41e03817b", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["license", "repo-hardening", "generated-repo-pattern"]}}, {"ruleId": "scanner-3ab5d313dda8e5f9", "level": "note", "message": {"text": "Debug logging residue appears in source files"}, "properties": {"repobilityId": "951e2d6cfc928292", "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": "5a3bb44b0f526081", "scanner": "scanner-primary", "fingerprint": "72b2a6250083a784", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["placeholder", "mock-data", "incomplete", "generated-repo-pattern"]}}, {"ruleId": "scanner-9d79c4077342a7d0", "level": "warning", "message": {"text": "Runtime service client appears to use placeholder configuration"}, "properties": {"repobilityId": "54b4c007c60659ed", "scanner": "scanner-primary", "fingerprint": "9d79c4077342a7d0", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["placeholder", "runtime-config", "service-client", "generated-repo-pattern"]}}, {"ruleId": "scanner-2d0c7b7ab8f8aacf", "level": "warning", "message": {"text": "Critical user flow still appears backed by mock or placeholder data"}, "properties": {"repobilityId": "f0c27dd42c3687c3", "scanner": "scanner-primary", "fingerprint": "2d0c7b7ab8f8aacf", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["placeholder", "mock-data", "critical-flow", "generated-repo-pattern"]}}, {"ruleId": "scanner-749d4bc1bd66df5f", "level": "warning", "message": {"text": "Agent instructions exist but release-hardening basics are missing"}, "properties": {"repobilityId": "c4d9ed22871a78ac", "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": "7ebefa1f7c1fea0e", "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": "0437b26e4f7ddb7b", "scanner": "scanner-primary", "fingerprint": "8424db9c75e04ba4", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["provenance", "git-history", "generated-repo-pattern"]}}, {"ruleId": "scanner-2c5f98b152cddb6d", "level": "warning", "message": {"text": "Agent authority lacks a verifier contract: .claude/launch.json"}, "properties": {"repobilityId": "0de48c0f4ab303d8", "scanner": "scanner-primary", "fingerprint": "2c5f98b152cddb6d", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "verification", "claude_instruction"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".claude/launch.json"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-40a1cc1c7b6e716f", "level": "error", "message": {"text": "Agent instruction/config may expose a secret: .claude/plans/fab_form_submit_standardization.plan.md"}, "properties": {"repobilityId": "01692569342781b1", "scanner": "scanner-primary", "fingerprint": "40a1cc1c7b6e716f", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["agent-instructions", "secrets", "claude_instruction"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".claude/plans/fab_form_submit_standardization.plan.md"}, "region": {"startLine": 239}}}]}, {"ruleId": "scanner-3769c656a334fc7f", "level": "error", "message": {"text": "Agent instruction/config may expose a secret: .claude/plans/sprint4_chunk_b_profile_display.md"}, "properties": {"repobilityId": "03c9072f8b590d15", "scanner": "scanner-primary", "fingerprint": "3769c656a334fc7f", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["agent-instructions", "secrets", "claude_instruction"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".claude/plans/sprint4_chunk_b_profile_display.md"}, "region": {"startLine": 48}}}]}, {"ruleId": "scanner-83499ea22c154df6", "level": "error", "message": {"text": "Agent instruction/config may expose a secret: .claude/plans/fab_from_vault_in_menu_conversion.md"}, "properties": {"repobilityId": "f77f2d12f0e4b445", "scanner": "scanner-primary", "fingerprint": "83499ea22c154df6", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["agent-instructions", "secrets", "claude_instruction"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".claude/plans/fab_from_vault_in_menu_conversion.md"}, "region": {"startLine": 66}}}]}, {"ruleId": "scanner-ae299bc87dde53eb", "level": "error", "message": {"text": "Agent instruction/config may expose a secret: .cursor/plans/fab_addplantmodal_extraction.plan.md"}, "properties": {"repobilityId": "e1b2debd2697a563", "scanner": "scanner-primary", "fingerprint": "ae299bc87dde53eb", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["agent-instructions", "secrets", "cursor_rule"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".cursor/plans/fab_addplantmodal_extraction.plan.md"}, "region": {"startLine": 75}}}]}, {"ruleId": "scanner-a40c95f449a0b531", "level": "warning", "message": {"text": "Agent authority lacks a verifier contract: .cursor/plans/add_plant_and_seed_packet_flows.plan.md"}, "properties": {"repobilityId": "9f207f2ce550db83", "scanner": "scanner-primary", "fingerprint": "a40c95f449a0b531", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "verification", "cursor_rule"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".cursor/plans/add_plant_and_seed_packet_flows.plan.md"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-8da7dc98afb628e0", "level": "warning", "message": {"text": "Agent authority lacks a verifier contract: .cursor/plans/planting_and_journal_ux_fixes.plan.md"}, "properties": {"repobilityId": "43810c8f045a5370", "scanner": "scanner-primary", "fingerprint": "8da7dc98afb628e0", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "verification", "cursor_rule"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".cursor/plans/planting_and_journal_ux_fixes.plan.md"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-af13b3d98b44ebf2", "level": "error", "message": {"text": "Agent instruction/config may expose a secret: .cursor/plans/calendar_shed_fab_refactor.plan.md"}, "properties": {"repobilityId": "c8b21c212fa5b017", "scanner": "scanner-primary", "fingerprint": "af13b3d98b44ebf2", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["agent-instructions", "secrets", "cursor_rule"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".cursor/plans/calendar_shed_fab_refactor.plan.md"}, "region": {"startLine": 27}}}]}, {"ruleId": "scanner-0502e55b062197b1", "level": "warning", "message": {"text": "Agent authority lacks a verifier contract: .cursor/plans/filter_default_save_remove_flow.plan.md"}, "properties": {"repobilityId": "082de7cfd6fd736b", "scanner": "scanner-primary", "fingerprint": "0502e55b062197b1", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "verification", "cursor_rule"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".cursor/plans/filter_default_save_remove_flow.plan.md"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-35dfda6d8d48ef7d", "level": "warning", "message": {"text": "Agent authority lacks a verifier contract: .cursor/plans/loading_states_implementation.plan.md"}, "properties": {"repobilityId": "1e65021d2babf729", "scanner": "scanner-primary", "fingerprint": "35dfda6d8d48ef7d", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "verification", "cursor_rule"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".cursor/plans/loading_states_implementation.plan.md"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-71499eb870f8b5a7", "level": "warning", "message": {"text": "Agent authority lacks a verifier contract: .cursor/plans/companion_planting_single_source_of_truth.md"}, "properties": {"repobilityId": "8a92a19912c9c048", "scanner": "scanner-primary", "fingerprint": "71499eb870f8b5a7", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "verification", "cursor_rule"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".cursor/plans/companion_planting_single_source_of_truth.md"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-7c475c04cba797a2", "level": "warning", "message": {"text": "Agent authority lacks a verifier contract: .cursor/plans/pre_seed_plant_library.md"}, "properties": {"repobilityId": "f9447858deb45853", "scanner": "scanner-primary", "fingerprint": "7c475c04cba797a2", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "verification", "cursor_rule"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".cursor/plans/pre_seed_plant_library.md"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-add4ce6bbb90bdd3", "level": "none", "message": {"text": "Commented-code block (5 lines) in scripts/check-migration-prefixes.js:43"}, "properties": {"repobilityId": "6349b9c6cf153cff", "scanner": "scanner-primary", "fingerprint": "add4ce6bbb90bdd3", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-558679bfeee607c1", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/clean-bad-cache.ts:88"}, "properties": {"repobilityId": "1728d70893b50f13", "scanner": "scanner-primary", "fingerprint": "558679bfeee607c1", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-1ef27f3e8f601941", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/scrape-cleanup.ts:56"}, "properties": {"repobilityId": "ce0a4205c14261e6", "scanner": "scanner-primary", "fingerprint": "1ef27f3e8f601941", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-ff9ebd08b362a3b6", "level": "note", "message": {"text": "Legacy-named symbol `20250205800000_plant_profiles_drop_legacy` in scripts/migrate-to-plant-packets.ts:177"}, "properties": {"repobilityId": "5dd1a6c9e74c39f5", "scanner": "scanner-primary", "fingerprint": "ff9ebd08b362a3b6", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-3e025aefde063429", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/bulk-scrape.ts:79"}, "properties": {"repobilityId": "09ec967c54c6919c", "scanner": "scanner-primary", "fingerprint": "3e025aefde063429", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-8f3c7cf06a1fd53f", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 public/sw.js:85"}, "properties": {"repobilityId": "e1d09e9748f63ba1", "scanner": "scanner-primary", "fingerprint": "8f3c7cf06a1fd53f", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-785fa06091e82b20", "level": "none", "message": {"text": "Commented-code block (6 lines) in src/components/AddVarietyModal.tsx:150"}, "properties": {"repobilityId": "df473f133b39f8ed", "scanner": "scanner-primary", "fingerprint": "785fa06091e82b20", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-a64b429c439898e7", "level": "none", "message": {"text": "Commented-code block (6 lines) in src/components/QuickAddSeed.tsx:455"}, "properties": {"repobilityId": "dae1f8cf1886a5c4", "scanner": "scanner-primary", "fingerprint": "a64b429c439898e7", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-cdbc557b0202702d", "level": "none", "message": {"text": "Commented-code block (8 lines) in src/components/UniversalAddMenu.tsx:99"}, "properties": {"repobilityId": "5b8e52a61ae9e49d", "scanner": "scanner-primary", "fingerprint": "cdbc557b0202702d", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-47d3b0404d184b6c", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/components/UniversalAddMenu.tsx:101"}, "properties": {"repobilityId": "1d44a3977120fe58", "scanner": "scanner-primary", "fingerprint": "47d3b0404d184b6c", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-b28bb1a46fd2c0e0", "level": "none", "message": {"text": "Commented-code block (6 lines) in src/components/GrowInstanceModal.tsx:354"}, "properties": {"repobilityId": "c3191d2f83fdcda8", "scanner": "scanner-primary", "fingerprint": "b28bb1a46fd2c0e0", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-ddaa4c7e2538b7ae", "level": "note", "message": {"text": "Legacy-named symbol `lastUsedLegacy` in src/components/ShedView.tsx:163"}, "properties": {"repobilityId": "4b9bf6838e6db363", "scanner": "scanner-primary", "fingerprint": "ddaa4c7e2538b7ae", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-17d9989474825f98", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/settings/import-logs/page.tsx:38"}, "properties": {"repobilityId": "cfa9d893146fa5ff", "scanner": "scanner-primary", "fingerprint": "17d9989474825f98", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-6379667a95a38d23", "level": "note", "message": {"text": "Legacy-named symbol `isLegacy` in src/app/library/[id]/VaultProfileCareTab.tsx:17"}, "properties": {"repobilityId": "cd4f74dde6146f1c", "scanner": "scanner-primary", "fingerprint": "6379667a95a38d23", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-563aafa7e06e29b0", "level": "note", "message": {"text": "Legacy-named symbol `isLegacy` in src/app/library/[id]/page.tsx:575"}, "properties": {"repobilityId": "330eba52599d7787", "scanner": "scanner-primary", "fingerprint": "563aafa7e06e29b0", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-1a165dc26616f10c", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/app/library/[id]/page.tsx:129"}, "properties": {"repobilityId": "d019e86ae6882d09", "scanner": "scanner-primary", "fingerprint": "1a165dc26616f10c", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-aa3c28f19a56105e", "level": "note", "message": {"text": "Legacy-named symbol `isLegacy` in src/app/library/[id]/VaultProfileAboutTab.tsx:21"}, "properties": {"repobilityId": "f3a505854e7353fa", "scanner": "scanner-primary", "fingerprint": "aa3c28f19a56105e", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-48e48908b923cce5", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/app/library/[id]/VaultProfileAboutTab.tsx:150"}, "properties": {"repobilityId": "1db9c583c1cfe2e7", "scanner": "scanner-primary", "fingerprint": "48e48908b923cce5", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-c8da9f53574f73e1", "level": "note", "message": {"text": "Legacy-named symbol `isLegacy` in src/app/vault/permanentPlantProfile.regression.test.ts:68"}, "properties": {"repobilityId": "8ce0936d8028fbf3", "scanner": "scanner-primary", "fingerprint": "c8da9f53574f73e1", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-26fb685f29b171f7", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/vault/review-import/page.tsx:706"}, "properties": {"repobilityId": "7c11bfd23610e12a", "scanner": "scanner-primary", "fingerprint": "26fb685f29b171f7", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-98fe91c09b14e50b", "level": "none", "message": {"text": "Commented-code block (6 lines) in src/app/api/ai-fill/enqueue/route.ts:218"}, "properties": {"repobilityId": "a3bf1713ceeef82a", "scanner": "scanner-primary", "fingerprint": "98fe91c09b14e50b", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-936c089ff54d3d7a", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/api/ai-fill/enqueue/route.ts:68"}, "properties": {"repobilityId": "5a4999d090826453", "scanner": "scanner-primary", "fingerprint": "936c089ff54d3d7a", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-0028eb3f20eb2cfa", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/app/api/ai-fill/enqueue/route.test.ts:240"}, "properties": {"repobilityId": "a5e3170985c20cd7", "scanner": "scanner-primary", "fingerprint": "0028eb3f20eb2cfa", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-74525bfe008a7206", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/api/seed/ocr-extract/route.ts:66"}, "properties": {"repobilityId": "71a31116411f9240", "scanner": "scanner-primary", "fingerprint": "74525bfe008a7206", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-e2638f621d12be5f", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/app/api/seed/enrich-from-name/route.ts:441"}, "properties": {"repobilityId": "fd1892293fcc9bc8", "scanner": "scanner-primary", "fingerprint": "e2638f621d12be5f", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-cbfa2e04089459b5", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/api/seed/scrape-url/route.ts:3738"}, "properties": {"repobilityId": "58b4fa99844a0578", "scanner": "scanner-primary", "fingerprint": "cbfa2e04089459b5", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-7fa9c19786a7ed1c", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/app/api/seed/extract/route.ts:598"}, "properties": {"repobilityId": "dc15aa4909681258", "scanner": "scanner-primary", "fingerprint": "7fa9c19786a7ed1c", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-27a235e265f9629e", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/api/seed/extract-metadata/route.ts:209"}, "properties": {"repobilityId": "c83b479decdf9442", "scanner": "scanner-primary", "fingerprint": "27a235e265f9629e", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-a47246fd65d6bcda", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/app/api/seed/perenual-enrich/route.ts:56"}, "properties": {"repobilityId": "7442267d4f85f856", "scanner": "scanner-primary", "fingerprint": "a47246fd65d6bcda", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-312d1dacc588f069", "level": "none", "message": {"text": "Commented-code block (7 lines) in src/app/api/seed/fill-blanks-for-profile/route.ts:15"}, "properties": {"repobilityId": "b084251cd284ab8e", "scanner": "scanner-primary", "fingerprint": "312d1dacc588f069", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-40075658dc290110", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/app/garden/page.tsx:420"}, "properties": {"repobilityId": "e2a15c9dad612c10", "scanner": "scanner-primary", "fingerprint": "40075658dc290110", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-817a6e71c4fb9089", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/app/calendar/page.tsx:2206"}, "properties": {"repobilityId": "290942aa31ab3d2c", "scanner": "scanner-primary", "fingerprint": "817a6e71c4fb9089", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-3d56a50a3890734d", "level": "none", "message": {"text": "Commented-code block (6 lines) in src/app/calendar/calendarBatchSelect.regression.test.ts:287"}, "properties": {"repobilityId": "5c7e991060ca8784", "scanner": "scanner-primary", "fingerprint": "3d56a50a3890734d", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-78f4cf5ed76d5cd3", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 src/lib/fetchWithRetry.ts:8"}, "properties": {"repobilityId": "64b3d32d74fdd351", "scanner": "scanner-primary", "fingerprint": "78f4cf5ed76d5cd3", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-67fdc475fed1dfad", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/lib/researchVariety.ts:351"}, "properties": {"repobilityId": "80667325f8c419ab", "scanner": "scanner-primary", "fingerprint": "67fdc475fed1dfad", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-7008816c2ecc98c8", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/lib/enrichProfileFromName.ts:243"}, "properties": {"repobilityId": "3bbc233fad502802", "scanner": "scanner-primary", "fingerprint": "7008816c2ecc98c8", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-ea3381713aebc152", "level": "note", "message": {"text": "Legacy-named symbol `isLegacy` in src/lib/ai-fill/version.ts:67"}, "properties": {"repobilityId": "d415ab1d70f179bd", "scanner": "scanner-primary", "fingerprint": "ea3381713aebc152", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-f808a4ef3e1071fb", "level": "note", "message": {"text": "14 env vars used in code but missing from .env.example"}, "properties": {"repobilityId": "ce6b2ec4be4ec75a", "scanner": "scanner-primary", "fingerprint": "f808a4ef3e1071fb", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "config-drift"]}}]}]}