{"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-93f138b851cedb7a", "name": "Stray `console.log` in TS/JS \u2014 scripts/seed-vagas-guep.ts:177", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/seed-vagas-guep.ts:177"}, "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-585f494052f36d16", "name": "Stray `console.log` in TS/JS \u2014 scripts/check-tables.ts:7", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/check-tables.ts:7"}, "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-f2b57af6d2777f21", "name": "Stray `console.log` in TS/JS \u2014 scripts/seed.ts:8", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/seed.ts:8"}, "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-1c73f68843fce840", "name": "Stray `console.log` in TS/JS \u2014 scripts/test-ipip-api.ts:26", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/test-ipip-api.ts:26"}, "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-d2851429e0216906", "name": "Stray `console.log` in TS/JS \u2014 scripts/import-talentos.ts:59", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/import-talentos.ts:59"}, "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-038213a6184f1ec6", "name": "Stray `console.log` in TS/JS \u2014 scripts/test-ipip.ts:28", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/test-ipip.ts:28"}, "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-3d9f99783699b2c8", "name": "Stray `console.log` in TS/JS \u2014 scripts/seed-demo-extra.ts:103", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/seed-demo-extra.ts:103"}, "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-91b4fba8cd705bd6", "name": "Stray `console.log` in TS/JS \u2014 scripts/rename-bobo-to-curinga.ts:22", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/rename-bobo-to-curinga.ts:22"}, "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-634572c4371625b9", "name": "Stray `console.log` in TS/JS \u2014 scripts/seed-demo.ts:330", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/seed-demo.ts:330"}, "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-dc7313976bb437c5", "name": "Stray `console.log` in TS/JS \u2014 scripts/apply-deep-data.ts:62", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/apply-deep-data.ts:62"}, "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-927b357c26712783", "name": "Stray `console.log` in TS/JS \u2014 scripts/setup.ts:17", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/setup.ts:17"}, "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-78d030aa8cb647c9", "name": "Stray `console.log` in TS/JS \u2014 scripts/seed-inbox.ts:22", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/seed-inbox.ts:22"}, "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-0d746c93b8fb4fd4", "name": "Stray `console.log` in TS/JS \u2014 scripts/test-public-flow.ts:24", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 scripts/test-public-flow.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-edc5122a241eb9e0", "name": "`truncate` class without `title=` for hover reveal \u2014 components/instrument-cards.tsx:179", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/instrument-cards.tsx:179"}, "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-952e4b7459f3ed6a", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 components/kyid-print-sheet.tsx:178", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 components/kyid-print-sheet.tsx:178"}, "fullDescription": {"text": "Open XSS surface unless the input is provably trusted. Replace with explicit JSX or sanitize via a vetted library.\n\nWhy: OWASP basics. Already partially flagged by the security analyzer.\nRule id: fq.dangerous-html"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-feb56579f0b61c9c", "name": "`dangerouslySetInnerHTML` used in a React component \u2014 components/kyid-seal.tsx:49", "shortDescription": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 components/kyid-seal.tsx:49"}, "fullDescription": {"text": "Open XSS surface unless the input is provably trusted. Replace with explicit JSX or sanitize via a vetted library.\n\nWhy: OWASP basics. Already partially flagged by the security analyzer.\nRule id: fq.dangerous-html"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-2b06e7054b00d1d2", "name": "`truncate` class without `title=` for hover reveal \u2014 components/select.tsx:189", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/select.tsx:189"}, "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-c554954da8269aab", "name": "`truncate` class without `title=` for hover reveal \u2014 components/app-shell.tsx:105", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/app-shell.tsx:105"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-52bb2d2267a1e05b", "name": "`truncate` class without `title=` for hover reveal \u2014 components/apostila-ich.tsx:167", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/apostila-ich.tsx:167"}, "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-f17e6610855e271d", "name": "`truncate` class without `title=` for hover reveal \u2014 app/dashboard-chart.tsx:132", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/dashboard-chart.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-88f5bf0f34440ad5", "name": "`truncate` class without `title=` for hover reveal \u2014 app/aplicar/[token]/client.tsx:507", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/aplicar/[token]/client.tsx:507"}, "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-d2a8e24e02118f09", "name": "`truncate` class without `title=` for hover reveal \u2014 app/settings/integracoes/client.tsx:241", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/settings/integracoes/client.tsx:241"}, "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-b1a12e2e3c45d260", "name": "`truncate` class without `title=` for hover reveal \u2014 app/empresas-clientes/page.tsx:95", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/empresas-clientes/page.tsx:95"}, "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-ec56fd5190b30d94", "name": "Icon-only button without accessible name \u2014 app/empresas-clientes/[id]/colaboradores/colaboradores-client.tsx:598", "shortDescription": {"text": "Icon-only button without accessible name \u2014 app/empresas-clientes/[id]/colaboradores/colaboradores-client.tsx:598"}, "fullDescription": {"text": "A `<button>` whose only child is a single glyph or symbol needs `title=` or `aria-label=` so screen readers (and tooltips on hover) work.\n\nWhy: P3 in CHECKLIST.md \u2014 icon-only buttons skipped a title.\nRule id: fq.button.no-label"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "low", "confidence": 1.0}}, {"id": "scanner-af990e764081ea04", "name": "`truncate` class without `title=` for hover reveal \u2014 app/kanban/client.tsx:234", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/kanban/client.tsx:234"}, "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-38d5303aee314178", "name": "`truncate` class without `title=` for hover reveal \u2014 app/mapa/mapa-client.tsx:240", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/mapa/mapa-client.tsx:240"}, "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-b13c50f01d93a5f4", "name": "`truncate` class without `title=` for hover reveal \u2014 app/vagas/[id]/kanban/board.tsx:136", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/vagas/[id]/kanban/board.tsx:136"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-07d5d9a578ec0b71", "name": "`truncate` class without `title=` for hover reveal \u2014 app/portal/me/applications-section.tsx:112", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/portal/me/applications-section.tsx:112"}, "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-d05ab52c3e926286", "name": "`truncate` class without `title=` for hover reveal \u2014 app/portal/me/me-client.tsx:1762", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/portal/me/me-client.tsx:1762"}, "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-bb9cb932fe7dec71", "name": "`truncate` class without `title=` for hover reveal \u2014 app/portal/me/suggested-jobs.tsx:92", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/portal/me/suggested-jobs.tsx:92"}, "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-0d97b7c09b08e37e", "name": "`truncate` class without `title=` for hover reveal \u2014 app/candidatos/list-client.tsx:338", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/candidatos/list-client.tsx:338"}, "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-956efc8bf275b9d1", "name": "`truncate` class without `title=` for hover reveal \u2014 app/candidatos/[id]/page.tsx:396", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/candidatos/[id]/page.tsx:396"}, "fullDescription": {"text": "A truncated value should reveal the full text on hover. Pass the full string via `title={...}` so the user can read it.\n\nWhy: P2 in CHECKLIST.md \u2014 truncate without hover-reveal.\nRule id: fq.truncate.no-title"}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "confidence": 1.0}}, {"id": "scanner-bbf317a958b6286f", "name": "`truncate` class without `title=` for hover reveal \u2014 app/candidatos/[id]/invite-button.tsx:244", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/candidatos/[id]/invite-button.tsx:244"}, "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-aff44d29522ec0a1", "name": "`truncate` class without `title=` for hover reveal \u2014 app/inbox/client.tsx:440", "shortDescription": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/inbox/client.tsx:440"}, "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-e968df53b42db0e4", "name": "Stray `console.log` in TS/JS \u2014 lib/email/transport.ts:45", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 lib/email/transport.ts:45"}, "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-4d3244ae99737994", "name": "Stray `console.log` in TS/JS \u2014 lib/channels/registry.ts:88", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 lib/channels/registry.ts: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-401007b7f6ccc491", "name": "Stray `console.log` in TS/JS \u2014 lib/channels/baileys-driver.ts:126", "shortDescription": {"text": "Stray `console.log` in TS/JS \u2014 lib/channels/baileys-driver.ts:126"}, "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-01192a51cdd526ff", "name": "Possible secret in scripts/test-ipip-api.ts", "shortDescription": {"text": "Possible secret in scripts/test-ipip-api.ts"}, "fullDescription": {"text": "Detected pattern matching password_literal. Rotate the credential and move to a secret manager."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "critical", "confidence": 1.0}}, {"id": "scanner-176bebd0d1cceace", "name": "Insecure pattern 'node_child_process' in scripts/setup.ts:8", "shortDescription": {"text": "Insecure pattern 'node_child_process' in scripts/setup.ts:8"}, "fullDescription": {"text": "Found a known-risky pattern (node_child_process). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-3b55eb26d7ca8420", "name": "Possible secret in scripts/test-public-flow.ts", "shortDescription": {"text": "Possible secret in scripts/test-public-flow.ts"}, "fullDescription": {"text": "Detected pattern matching password_literal. Rotate the credential and move to a secret manager."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "critical", "confidence": 1.0}}, {"id": "scanner-884808301027b9a7", "name": "Insecure pattern 'dangerous_innerhtml' in components/kyid-print-sheet.tsx:178", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in components/kyid-print-sheet.tsx:178"}, "fullDescription": {"text": "Found a known-risky pattern (dangerous_innerhtml). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-be8f493856b7e344", "name": "Insecure pattern 'dangerous_innerhtml' in components/kyid-seal.tsx:49", "shortDescription": {"text": "Insecure pattern 'dangerous_innerhtml' in components/kyid-seal.tsx:49"}, "fullDescription": {"text": "Found a known-risky pattern (dangerous_innerhtml). Review and replace if possible."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-4601e3ad3bb28677", "name": "No CI/CD pipelines detected", "shortDescription": {"text": "No CI/CD pipelines detected"}, "fullDescription": {"text": "No GitHub Actions, GitLab CI, or CircleCI configs found. Without CI you can't gate deploys on tests/lints."}, "properties": {"scanner": "scanner-primary", "layer": "cicd", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-428fbfcd09667bb8", "name": "Very large file: app/portal/me/me-client.tsx (2149 lines)", "shortDescription": {"text": "Very large file: app/portal/me/me-client.tsx (2149 lines)"}, "fullDescription": {"text": "Files with >800 lines often hide complexity hotspots and discourage tests."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-6893a6c8b0861585", "name": "Very low test-to-source ratio", "shortDescription": {"text": "Very low test-to-source ratio"}, "fullDescription": {"text": "6 test file(s) for 236 source file(s) (ratio 0.03). Consider adding integration or unit tests for critical paths."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-141b30a41e03817b", "name": "No license file detected", "shortDescription": {"text": "No license file detected"}, "fullDescription": {"text": "No LICENSE/COPYING/NOTICE file was found. Generated repositories often omit licensing, which blocks reuse and automated intake."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-a35ddbf285c0f028", "name": "Node manifest has dependencies but no lockfile: services/ipip-neo-120/package.json", "shortDescription": {"text": "Node manifest has dependencies but no lockfile: services/ipip-neo-120/package.json"}, "fullDescription": {"text": "`package.json` declares dependencies, but no same-directory npm/pnpm/yarn/bun lockfile was found. Generated projects without lockfiles are less reproducible and harder to secure-scan precisely."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-3ab5d313dda8e5f9", "name": "Debug logging residue appears in source files", "shortDescription": {"text": "Debug logging residue appears in source files"}, "fullDescription": {"text": "Found 149 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 126 placeholder/mock markers across 21 source files. This often means the repo looks complete while core flows still use generated scaffolding or fake data."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-2d0c7b7ab8f8aacf", "name": "Critical user flow still appears backed by mock or placeholder data", "shortDescription": {"text": "Critical user flow still appears backed by mock or placeholder data"}, "fullDescription": {"text": "A payment/auth/admin/order/billing-style flow contains mock, fake, TODO, dummy, or placeholder markers in runtime source. In the Fable corpus this is a high-leverage completeness smell: the app can look finished while the money, identity, or tenant flow is still scaffolded."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-b9088664ace7f748", "name": "Composite production-readiness gap", "shortDescription": {"text": "Composite production-readiness gap"}, "fullDescription": {"text": "Multiple low-cost hardening controls are missing together: license, ci, lockfile. Opus verification showed these co-occurring gaps are a better readiness signal than reading each flag in isolation."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-749d4bc1bd66df5f", "name": "Agent instructions exist but release-hardening basics are missing", "shortDescription": {"text": "Agent instructions exist but release-hardening basics are missing"}, "fullDescription": {"text": "AI-coder instruction files were found, but the repo is missing license, ci, lockfile. Treat this as a contract gap: the agent is guided, but the generated output is not yet guarded by the controls that make it repeatable."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-ea8f3013f588db25", "name": "Shallow git history limits provenance confidence", "shortDescription": {"text": "Shallow git history limits provenance confidence"}, "fullDescription": {"text": "The repository is a shallow clone. Origin/evolution analysis cannot distinguish fresh generation, imported legacy code, or long-lived human code with high confidence."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-8424db9c75e04ba4", "name": "Very short observed git history", "shortDescription": {"text": "Very short observed git history"}, "fullDescription": {"text": "The repo has multiple source files but two or fewer visible commits. This is not a failure by itself, but it lowers confidence in evolution-based diagnosis."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-e725d2ab884fbd49", "name": "Multiple root agent instruction files without precedence", "shortDescription": {"text": "Multiple root agent instruction files without precedence"}, "fullDescription": {"text": "The repo has multiple top-level AI-coder instruction files. Without precedence rules, different agents may follow different policies."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-8ea519b2aabe8286", "name": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/test-ipip-api.ts:29", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/test-ipip-api.ts:29"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-cf42daefb2f5c60d", "name": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/test-public-flow.ts:27", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/test-public-flow.ts:27"}, "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-bb8b463379db87af", "name": "`fetch()` without try/.catch or AbortSignal \u2014 app/aplicar/[token]/client.tsx:176", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/aplicar/[token]/client.tsx:176"}, "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-8865a79c253bb328", "name": "`fetch()` without try/.catch or AbortSignal \u2014 app/settings/integracoes/client.tsx:111", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/settings/integracoes/client.tsx:111"}, "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-38299496ac52e4e9", "name": "`fetch()` without try/.catch or AbortSignal \u2014 app/empresas-clientes/[id]/colaboradores/colaboradores-client.tsx:205", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/empresas-clientes/[id]/colaboradores/colaboradores-client.tsx:205"}, "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-0df4431298962f57", "name": "`fetch()` without try/.catch or AbortSignal \u2014 app/empresas-clientes/[id]/nr1/[campaignId]/campaign-dashboard-client.tsx:", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/empresas-clientes/[id]/nr1/[campaignId]/campaign-dashboard-client.tsx:100"}, "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-abe88d1f8b4e6120", "name": "`fetch()` without try/.catch or AbortSignal \u2014 app/vagas/[id]/add-candidate.tsx:26", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/vagas/[id]/add-candidate.tsx:26"}, "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-a95c97e0bf9e3654", "name": "`fetch()` without try/.catch or AbortSignal \u2014 app/portal/logout-button.tsx:14", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/portal/logout-button.tsx:14"}, "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-6405efc88f234411", "name": "`fetch()` without try/.catch or AbortSignal \u2014 app/portal/me/me-client.tsx:279", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/portal/me/me-client.tsx:279"}, "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-90c275c41753eee8", "name": "`fetch()` without try/.catch or AbortSignal \u2014 app/candidatos/[id]/avaliar/[slug]/form.tsx:116", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/candidatos/[id]/avaliar/[slug]/form.tsx:116"}, "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-a7f0e29f26163f52", "name": "`fetch()` without try/.catch or AbortSignal \u2014 app/inbox/client.tsx:223", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/inbox/client.tsx:223"}, "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-60d71950c34694be", "name": "`fetch()` without try/.catch or AbortSignal \u2014 lib/auth/context.tsx:30", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 lib/auth/context.tsx:30"}, "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-7b37547a9b549837", "name": "`fetch()` without try/.catch or AbortSignal \u2014 lib/channels/instagram-driver.ts:80", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 lib/channels/instagram-driver.ts:80"}, "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-575e35de88e0b545", "name": "`fetch()` without try/.catch or AbortSignal \u2014 lib/channels/email-driver.ts:111", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 lib/channels/email-driver.ts:111"}, "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-210678aa29f62825", "name": "Legacy-named symbol `guep_br_pilot_v1` in services/_contract/schema.ts:159", "shortDescription": {"text": "Legacy-named symbol `guep_br_pilot_v1` in services/_contract/schema.ts:159"}, "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-250f57e8a1dbd3c5", "name": "4 env vars used in code but missing from .env.example", "shortDescription": {"text": "4 env vars used in code but missing from .env.example"}, "fullDescription": {"text": "Drift between code and config docs. The first few: `GEMINI_API_KEY`, `NEXT_PHASE`, `NEXT_RUNTIME`, `PORTAL_COOKIE_DOMAIN`. Add them (with a placeholder/comment) to .env.example so onboarding doesn't break."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}]}}, "automationDetails": {"id": "repobility/22606"}, "properties": {"repository": "webdesenrolado/kavukaexperts", "repoUrl": "https://github.com/webdesenrolado/kavukaexperts", "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-93f138b851cedb7a", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/seed-vagas-guep.ts:177"}, "properties": {"repobilityId": "71e9eef60eacf18e", "scanner": "scanner-primary", "fingerprint": "93f138b851cedb7a", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-585f494052f36d16", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/check-tables.ts:7"}, "properties": {"repobilityId": "1f5b4fe3cb63d87b", "scanner": "scanner-primary", "fingerprint": "585f494052f36d16", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-f2b57af6d2777f21", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/seed.ts:8"}, "properties": {"repobilityId": "6b45b8d4fff61a2c", "scanner": "scanner-primary", "fingerprint": "f2b57af6d2777f21", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-1c73f68843fce840", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/test-ipip-api.ts:26"}, "properties": {"repobilityId": "56b1d936ba38afea", "scanner": "scanner-primary", "fingerprint": "1c73f68843fce840", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-d2851429e0216906", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/import-talentos.ts:59"}, "properties": {"repobilityId": "6dfe422993963d57", "scanner": "scanner-primary", "fingerprint": "d2851429e0216906", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-038213a6184f1ec6", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/test-ipip.ts:28"}, "properties": {"repobilityId": "0760dc2a3d8129ee", "scanner": "scanner-primary", "fingerprint": "038213a6184f1ec6", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-3d9f99783699b2c8", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/seed-demo-extra.ts:103"}, "properties": {"repobilityId": "817d80b6ad872454", "scanner": "scanner-primary", "fingerprint": "3d9f99783699b2c8", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-91b4fba8cd705bd6", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/rename-bobo-to-curinga.ts:22"}, "properties": {"repobilityId": "277d1aafc5e85d11", "scanner": "scanner-primary", "fingerprint": "91b4fba8cd705bd6", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-634572c4371625b9", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/seed-demo.ts:330"}, "properties": {"repobilityId": "b7f1ec3c1a06f2fb", "scanner": "scanner-primary", "fingerprint": "634572c4371625b9", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-dc7313976bb437c5", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/apply-deep-data.ts:62"}, "properties": {"repobilityId": "0dda8030a7e970ba", "scanner": "scanner-primary", "fingerprint": "dc7313976bb437c5", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-927b357c26712783", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/setup.ts:17"}, "properties": {"repobilityId": "6b5357ac89817640", "scanner": "scanner-primary", "fingerprint": "927b357c26712783", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-78d030aa8cb647c9", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/seed-inbox.ts:22"}, "properties": {"repobilityId": "5e05ee72ab9bc7ae", "scanner": "scanner-primary", "fingerprint": "78d030aa8cb647c9", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-0d746c93b8fb4fd4", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 scripts/test-public-flow.ts:24"}, "properties": {"repobilityId": "1da0a729cf283c33", "scanner": "scanner-primary", "fingerprint": "0d746c93b8fb4fd4", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-edc5122a241eb9e0", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/instrument-cards.tsx:179"}, "properties": {"repobilityId": "ad66866afb2f9374", "scanner": "scanner-primary", "fingerprint": "edc5122a241eb9e0", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-952e4b7459f3ed6a", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 components/kyid-print-sheet.tsx:178"}, "properties": {"repobilityId": "7c952383b504c1e0", "scanner": "scanner-primary", "fingerprint": "952e4b7459f3ed6a", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-feb56579f0b61c9c", "level": "warning", "message": {"text": "`dangerouslySetInnerHTML` used in a React component \u2014 components/kyid-seal.tsx:49"}, "properties": {"repobilityId": "fe22f9799494a5e0", "scanner": "scanner-primary", "fingerprint": "feb56579f0b61c9c", "layer": "frontend", "severity": "medium", "confidence": 1.0, "tags": ["frontend-quality", "fq.dangerous-html"]}}, {"ruleId": "scanner-2b06e7054b00d1d2", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/select.tsx:189"}, "properties": {"repobilityId": "da3f4b0b7f576ca0", "scanner": "scanner-primary", "fingerprint": "2b06e7054b00d1d2", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-c554954da8269aab", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/app-shell.tsx:105"}, "properties": {"repobilityId": "fbef7160ae2694ed", "scanner": "scanner-primary", "fingerprint": "c554954da8269aab", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-52bb2d2267a1e05b", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 components/apostila-ich.tsx:167"}, "properties": {"repobilityId": "cc3952a8da11d24e", "scanner": "scanner-primary", "fingerprint": "52bb2d2267a1e05b", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-f17e6610855e271d", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/dashboard-chart.tsx:132"}, "properties": {"repobilityId": "696a0a50a0fd39a2", "scanner": "scanner-primary", "fingerprint": "f17e6610855e271d", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-88f5bf0f34440ad5", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/aplicar/[token]/client.tsx:507"}, "properties": {"repobilityId": "60f1a9e811ca44fe", "scanner": "scanner-primary", "fingerprint": "88f5bf0f34440ad5", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-d2a8e24e02118f09", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/settings/integracoes/client.tsx:241"}, "properties": {"repobilityId": "e0412b2c48feca8d", "scanner": "scanner-primary", "fingerprint": "d2a8e24e02118f09", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-b1a12e2e3c45d260", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/empresas-clientes/page.tsx:95"}, "properties": {"repobilityId": "2cefefbecd46b42a", "scanner": "scanner-primary", "fingerprint": "b1a12e2e3c45d260", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-ec56fd5190b30d94", "level": "note", "message": {"text": "Icon-only button without accessible name \u2014 app/empresas-clientes/[id]/colaboradores/colaboradores-client.tsx:598"}, "properties": {"repobilityId": "efbd47aefc0084ee", "scanner": "scanner-primary", "fingerprint": "ec56fd5190b30d94", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.button.no-label"]}}, {"ruleId": "scanner-af990e764081ea04", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/kanban/client.tsx:234"}, "properties": {"repobilityId": "5a836693671db957", "scanner": "scanner-primary", "fingerprint": "af990e764081ea04", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-38d5303aee314178", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/mapa/mapa-client.tsx:240"}, "properties": {"repobilityId": "32deb609d14dbc97", "scanner": "scanner-primary", "fingerprint": "38d5303aee314178", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-b13c50f01d93a5f4", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/vagas/[id]/kanban/board.tsx:136"}, "properties": {"repobilityId": "a394dcd46ca5450e", "scanner": "scanner-primary", "fingerprint": "b13c50f01d93a5f4", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-07d5d9a578ec0b71", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/portal/me/applications-section.tsx:112"}, "properties": {"repobilityId": "a7c86d49597288cb", "scanner": "scanner-primary", "fingerprint": "07d5d9a578ec0b71", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-d05ab52c3e926286", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/portal/me/me-client.tsx:1762"}, "properties": {"repobilityId": "71d1287e48cdd9e3", "scanner": "scanner-primary", "fingerprint": "d05ab52c3e926286", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-bb9cb932fe7dec71", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/portal/me/suggested-jobs.tsx:92"}, "properties": {"repobilityId": "77865db7de38c4b6", "scanner": "scanner-primary", "fingerprint": "bb9cb932fe7dec71", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-0d97b7c09b08e37e", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/candidatos/list-client.tsx:338"}, "properties": {"repobilityId": "90c5b9b8ab4e64ea", "scanner": "scanner-primary", "fingerprint": "0d97b7c09b08e37e", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-956efc8bf275b9d1", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/candidatos/[id]/page.tsx:396"}, "properties": {"repobilityId": "fdd62613463938c2", "scanner": "scanner-primary", "fingerprint": "956efc8bf275b9d1", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-bbf317a958b6286f", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/candidatos/[id]/invite-button.tsx:244"}, "properties": {"repobilityId": "12182325a3df3672", "scanner": "scanner-primary", "fingerprint": "bbf317a958b6286f", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-aff44d29522ec0a1", "level": "none", "message": {"text": "`truncate` class without `title=` for hover reveal \u2014 app/inbox/client.tsx:440"}, "properties": {"repobilityId": "f50005d66c766430", "scanner": "scanner-primary", "fingerprint": "aff44d29522ec0a1", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["frontend-quality", "fq.truncate.no-title"]}}, {"ruleId": "scanner-e968df53b42db0e4", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 lib/email/transport.ts:45"}, "properties": {"repobilityId": "7520002f13bdde54", "scanner": "scanner-primary", "fingerprint": "e968df53b42db0e4", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-4d3244ae99737994", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 lib/channels/registry.ts:88"}, "properties": {"repobilityId": "ae9a85b4f2452698", "scanner": "scanner-primary", "fingerprint": "4d3244ae99737994", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-401007b7f6ccc491", "level": "note", "message": {"text": "Stray `console.log` in TS/JS \u2014 lib/channels/baileys-driver.ts:126"}, "properties": {"repobilityId": "9d431670bf4f41b5", "scanner": "scanner-primary", "fingerprint": "401007b7f6ccc491", "layer": "frontend", "severity": "low", "confidence": 1.0, "tags": ["frontend-quality", "fq.console-leak"]}}, {"ruleId": "scanner-01192a51cdd526ff", "level": "error", "message": {"text": "Possible secret in scripts/test-ipip-api.ts"}, "properties": {"repobilityId": "820030902191ab5f", "scanner": "scanner-primary", "fingerprint": "01192a51cdd526ff", "layer": "security", "severity": "critical", "confidence": 1.0, "tags": ["secrets"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "scripts/test-ipip-api.ts"}, "region": {"startLine": 13}}}]}, {"ruleId": "scanner-176bebd0d1cceace", "level": "warning", "message": {"text": "Insecure pattern 'node_child_process' in scripts/setup.ts:8"}, "properties": {"repobilityId": "9b3db7368ebec43d", "scanner": "scanner-primary", "fingerprint": "176bebd0d1cceace", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "node_child_process"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "scripts/setup.ts"}, "region": {"startLine": 8}}}]}, {"ruleId": "scanner-3b55eb26d7ca8420", "level": "error", "message": {"text": "Possible secret in scripts/test-public-flow.ts"}, "properties": {"repobilityId": "ffce5bc55fc93d66", "scanner": "scanner-primary", "fingerprint": "3b55eb26d7ca8420", "layer": "security", "severity": "critical", "confidence": 1.0, "tags": ["secrets"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "scripts/test-public-flow.ts"}, "region": {"startLine": 13}}}]}, {"ruleId": "scanner-884808301027b9a7", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in components/kyid-print-sheet.tsx:178"}, "properties": {"repobilityId": "090eb685b2ae2495", "scanner": "scanner-primary", "fingerprint": "884808301027b9a7", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "components/kyid-print-sheet.tsx"}, "region": {"startLine": 178}}}]}, {"ruleId": "scanner-be8f493856b7e344", "level": "warning", "message": {"text": "Insecure pattern 'dangerous_innerhtml' in components/kyid-seal.tsx:49"}, "properties": {"repobilityId": "70f073d1d97ae5f2", "scanner": "scanner-primary", "fingerprint": "be8f493856b7e344", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["owasp", "dangerous_innerhtml"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "components/kyid-seal.tsx"}, "region": {"startLine": 49}}}]}, {"ruleId": "scanner-4601e3ad3bb28677", "level": "warning", "message": {"text": "No CI/CD pipelines detected"}, "properties": {"repobilityId": "c3ee439bce2bc51e", "scanner": "scanner-primary", "fingerprint": "4601e3ad3bb28677", "layer": "cicd", "severity": "medium", "confidence": 1.0, "tags": ["coverage"]}}, {"ruleId": "scanner-428fbfcd09667bb8", "level": "note", "message": {"text": "Very large file: app/portal/me/me-client.tsx (2149 lines)"}, "properties": {"repobilityId": "6268c8ccfbdfb050", "scanner": "scanner-primary", "fingerprint": "428fbfcd09667bb8", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-6893a6c8b0861585", "level": "warning", "message": {"text": "Very low test-to-source ratio"}, "properties": {"repobilityId": "54a7de3f06314bf0", "scanner": "scanner-primary", "fingerprint": "6893a6c8b0861585", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["tests", "coverage"]}}, {"ruleId": "scanner-141b30a41e03817b", "level": "note", "message": {"text": "No license file detected"}, "properties": {"repobilityId": "29a0589284d403ae", "scanner": "scanner-primary", "fingerprint": "141b30a41e03817b", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["license", "repo-hardening", "generated-repo-pattern"]}}, {"ruleId": "scanner-a35ddbf285c0f028", "level": "note", "message": {"text": "Node manifest has dependencies but no lockfile: services/ipip-neo-120/package.json"}, "properties": {"repobilityId": "028f6958cc8a8792", "scanner": "scanner-primary", "fingerprint": "a35ddbf285c0f028", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["dependency", "lockfile", "reproducibility", "generated-repo-pattern"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "services/ipip-neo-120/package.json"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-3ab5d313dda8e5f9", "level": "note", "message": {"text": "Debug logging residue appears in source files"}, "properties": {"repobilityId": "d593bee0c18e38a5", "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": "bf58492d55ea7644", "scanner": "scanner-primary", "fingerprint": "72b2a6250083a784", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["placeholder", "mock-data", "incomplete", "generated-repo-pattern"]}}, {"ruleId": "scanner-2d0c7b7ab8f8aacf", "level": "warning", "message": {"text": "Critical user flow still appears backed by mock or placeholder data"}, "properties": {"repobilityId": "87e16d012b13b844", "scanner": "scanner-primary", "fingerprint": "2d0c7b7ab8f8aacf", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["placeholder", "mock-data", "critical-flow", "generated-repo-pattern"]}}, {"ruleId": "scanner-b9088664ace7f748", "level": "warning", "message": {"text": "Composite production-readiness gap"}, "properties": {"repobilityId": "d9f38802f4798090", "scanner": "scanner-primary", "fingerprint": "b9088664ace7f748", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["production-readiness", "repo-hardening", "generated-repo-pattern"]}}, {"ruleId": "scanner-749d4bc1bd66df5f", "level": "warning", "message": {"text": "Agent instructions exist but release-hardening basics are missing"}, "properties": {"repobilityId": "a5cfd61df0976db8", "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": "1803e9debab28998", "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": "9a200ba23d4615bf", "scanner": "scanner-primary", "fingerprint": "8424db9c75e04ba4", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["provenance", "git-history", "generated-repo-pattern"]}}, {"ruleId": "scanner-e725d2ab884fbd49", "level": "note", "message": {"text": "Multiple root agent instruction files without precedence"}, "properties": {"repobilityId": "1953db6c89508d22", "scanner": "scanner-primary", "fingerprint": "e725d2ab884fbd49", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["agent-instructions", "governance"]}}, {"ruleId": "scanner-8ea519b2aabe8286", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/test-ipip-api.ts:29"}, "properties": {"repobilityId": "7b39cc1990f73c2c", "scanner": "scanner-primary", "fingerprint": "8ea519b2aabe8286", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-cf42daefb2f5c60d", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 scripts/test-public-flow.ts:27"}, "properties": {"repobilityId": "e7542c5ec9aef149", "scanner": "scanner-primary", "fingerprint": "cf42daefb2f5c60d", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-bb8b463379db87af", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/aplicar/[token]/client.tsx:176"}, "properties": {"repobilityId": "be3d0104b76b6e5b", "scanner": "scanner-primary", "fingerprint": "bb8b463379db87af", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-8865a79c253bb328", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/settings/integracoes/client.tsx:111"}, "properties": {"repobilityId": "9fa978eee4414ec4", "scanner": "scanner-primary", "fingerprint": "8865a79c253bb328", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-38299496ac52e4e9", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/empresas-clientes/[id]/colaboradores/colaboradores-client.tsx:205"}, "properties": {"repobilityId": "7629f1807ac2fec9", "scanner": "scanner-primary", "fingerprint": "38299496ac52e4e9", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-0df4431298962f57", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/empresas-clientes/[id]/nr1/[campaignId]/campaign-dashboard-client.tsx:100"}, "properties": {"repobilityId": "a2302b6a901391c7", "scanner": "scanner-primary", "fingerprint": "0df4431298962f57", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-abe88d1f8b4e6120", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/vagas/[id]/add-candidate.tsx:26"}, "properties": {"repobilityId": "40adecbe158f0cbe", "scanner": "scanner-primary", "fingerprint": "abe88d1f8b4e6120", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-a95c97e0bf9e3654", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/portal/logout-button.tsx:14"}, "properties": {"repobilityId": "8c1eb7c339899686", "scanner": "scanner-primary", "fingerprint": "a95c97e0bf9e3654", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-6405efc88f234411", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/portal/me/me-client.tsx:279"}, "properties": {"repobilityId": "565162e193a77041", "scanner": "scanner-primary", "fingerprint": "6405efc88f234411", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-90c275c41753eee8", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/candidatos/[id]/avaliar/[slug]/form.tsx:116"}, "properties": {"repobilityId": "e1239fd7a5682783", "scanner": "scanner-primary", "fingerprint": "90c275c41753eee8", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-a7f0e29f26163f52", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 app/inbox/client.tsx:223"}, "properties": {"repobilityId": "a9c5f2f63e1d4f4e", "scanner": "scanner-primary", "fingerprint": "a7f0e29f26163f52", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-60d71950c34694be", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 lib/auth/context.tsx:30"}, "properties": {"repobilityId": "8d82d03a3af91544", "scanner": "scanner-primary", "fingerprint": "60d71950c34694be", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-7b37547a9b549837", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 lib/channels/instagram-driver.ts:80"}, "properties": {"repobilityId": "8e46a1150e828e8d", "scanner": "scanner-primary", "fingerprint": "7b37547a9b549837", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-575e35de88e0b545", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 lib/channels/email-driver.ts:111"}, "properties": {"repobilityId": "aa888ce730ba4a11", "scanner": "scanner-primary", "fingerprint": "575e35de88e0b545", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-210678aa29f62825", "level": "note", "message": {"text": "Legacy-named symbol `guep_br_pilot_v1` in services/_contract/schema.ts:159"}, "properties": {"repobilityId": "4097fc68df6ac3a1", "scanner": "scanner-primary", "fingerprint": "210678aa29f62825", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-250f57e8a1dbd3c5", "level": "none", "message": {"text": "4 env vars used in code but missing from .env.example"}, "properties": {"repobilityId": "57584f22b735b5ee", "scanner": "scanner-primary", "fingerprint": "250f57e8a1dbd3c5", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "config-drift"]}}]}]}