{"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-a5ac9da6e7293904", "name": "Possibly dead Python function: is_valid", "shortDescription": {"text": "Possibly dead Python function: is_valid"}, "fullDescription": {"text": "No callers detected by AST scan in this repo. Could be exported for external callers or a framework handler."}, "properties": {"scanner": "scanner-primary", "layer": "software", "severity": "low", "confidence": 1.0}}, {"id": "scanner-d52daa368c3bbd5b", "name": "Possibly dead Python function: download_file", "shortDescription": {"text": "Possibly dead Python function: download_file"}, "fullDescription": {"text": "No callers detected by AST scan in this repo. Could be exported for external callers or a framework handler."}, "properties": {"scanner": "scanner-primary", "layer": "software", "severity": "low", "confidence": 1.0}}, {"id": "scanner-abf60c1fc0e48986", "name": "Possibly dead Python function: build_page_prompt", "shortDescription": {"text": "Possibly dead Python function: build_page_prompt"}, "fullDescription": {"text": "No callers detected by AST scan in this repo. Could be exported for external callers or a framework handler."}, "properties": {"scanner": "scanner-primary", "layer": "software", "severity": "low", "confidence": 1.0}}, {"id": "scanner-fe513214e2e70ff5", "name": "Possibly dead Python function: reset_provider", "shortDescription": {"text": "Possibly dead Python function: reset_provider"}, "fullDescription": {"text": "No callers detected by AST scan in this repo. Could be exported for external callers or a framework handler."}, "properties": {"scanner": "scanner-primary", "layer": "software", "severity": "low", "confidence": 1.0}}, {"id": "scanner-d9bd369f5e34d557", "name": "Possibly dead Python function: upload_many", "shortDescription": {"text": "Possibly dead Python function: upload_many"}, "fullDescription": {"text": "No callers detected by AST scan in this repo. Could be exported for external callers or a framework handler."}, "properties": {"scanner": "scanner-primary", "layer": "software", "severity": "low", "confidence": 1.0}}, {"id": "scanner-06bbb6f8c236010d", "name": "Possibly dead Python function: replace_page", "shortDescription": {"text": "Possibly dead Python function: replace_page"}, "fullDescription": {"text": "No callers detected by AST scan in this repo. Could be exported for external callers or a framework handler."}, "properties": {"scanner": "scanner-primary", "layer": "software", "severity": "low", "confidence": 1.0}}, {"id": "scanner-44a4d6032e2eff43", "name": "Possibly dead Python function: for_type", "shortDescription": {"text": "Possibly dead Python function: for_type"}, "fullDescription": {"text": "No callers detected by AST scan in this repo. Could be exported for external callers or a framework handler."}, "properties": {"scanner": "scanner-primary", "layer": "software", "severity": "low", "confidence": 1.0}}, {"id": "scanner-065d1bd02b6c594c", "name": "Possibly dead Python function: all_types", "shortDescription": {"text": "Possibly dead Python function: all_types"}, "fullDescription": {"text": "No callers detected by AST scan in this repo. Could be exported for external callers or a framework handler."}, "properties": {"scanner": "scanner-primary", "layer": "software", "severity": "low", "confidence": 1.0}}, {"id": "scanner-efaeacf1c45702be", "name": "Possibly dead Python function: repl", "shortDescription": {"text": "Possibly dead Python function: repl"}, "fullDescription": {"text": "No callers detected by AST scan in this repo. Could be exported for external callers or a framework handler."}, "properties": {"scanner": "scanner-primary", "layer": "software", "severity": "low", "confidence": 1.0}}, {"id": "scanner-9710c8d059e53154", "name": "No frontend routes/components detected", "shortDescription": {"text": "No frontend routes/components detected"}, "fullDescription": {"text": "No React/Vue/Next routes were found. This is fine for backend-only repos."}, "properties": {"scanner": "scanner-primary", "layer": "frontend", "severity": "info", "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-afae64770573d3bf", "name": "Very large file: src/report_skill/client.py (1947 lines)", "shortDescription": {"text": "Very large file: src/report_skill/client.py (1947 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-db00e91cbc6b456c", "name": "Very large file: src/report_skill/mcp_server.py (4070 lines)", "shortDescription": {"text": "Very large file: src/report_skill/mcp_server.py (4070 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-8129f968b0348c33", "name": "Very large file: src/report_skill/cli.py (3664 lines)", "shortDescription": {"text": "Very large file: src/report_skill/cli.py (3664 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-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 40 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-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. Opus verification showed these co-occurring gaps are a better readiness signal than reading each flag in isolation."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-749d4bc1bd66df5f", "name": "Agent instructions exist but release-hardening basics are missing", "shortDescription": {"text": "Agent instructions exist but release-hardening basics are missing"}, "fullDescription": {"text": "AI-coder instruction files were found, but the repo is missing license, ci. 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-cbc6ab5fe7e44767", "name": "Agent authority lacks a verifier contract: .claude/skills/widgets-sync/SKILL.md", "shortDescription": {"text": "Agent authority lacks a verifier contract: .claude/skills/widgets-sync/SKILL.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-a2a6aae2365944c0", "name": "Agent authority lacks a verifier contract: .claude/skills/bridge-process/SKILL.md", "shortDescription": {"text": "Agent authority lacks a verifier contract: .claude/skills/bridge-process/SKILL.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-86f4fbc26b871ce2", "name": "Agent authority lacks a verifier contract: .claude/skills/report-write/reference/errors-recovery.md", "shortDescription": {"text": "Agent authority lacks a verifier contract: .claude/skills/report-write/reference/errors-recovery.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-79ffde51c28e4a46", "name": "Agent authority lacks a verifier contract: .claude/skills/report-write/reference/widgets.md", "shortDescription": {"text": "Agent authority lacks a verifier contract: .claude/skills/report-write/reference/widgets.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-9d1fa18a89e02b14", "name": "Legacy-named symbol `report_copy` in tests/test_dispatch_parametrized.py:396", "shortDescription": {"text": "Legacy-named symbol `report_copy` in tests/test_dispatch_parametrized.py:396"}, "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-5296e101c27feb18", "name": "Commented-code block (5 lines) in tests/test_dispatch_parametrized.py:72", "shortDescription": {"text": "Commented-code block (5 lines) in tests/test_dispatch_parametrized.py:72"}, "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-738c8875e193c64d", "name": "Commented-code block (6 lines) in tests/test_authorlocked_mapping.py:212", "shortDescription": {"text": "Commented-code block (6 lines) in tests/test_authorlocked_mapping.py:212"}, "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-789e678ead87d931", "name": "Commented-code block (13 lines) in tests/test_mcp_roundtrip.py:250", "shortDescription": {"text": "Commented-code block (13 lines) in tests/test_mcp_roundtrip.py:250"}, "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-62005b9a8af3db59", "name": "Network/subprocess call without timeout or try/except \u2014 scripts/check_ra_impact.py:32", "shortDescription": {"text": "Network/subprocess call without timeout or try/except \u2014 scripts/check_ra_impact.py:32"}, "fullDescription": {"text": "`subprocess.run(...)` here lacks both a `timeout=` arg and an enclosing try/except. This is exactly the class of bug that took down our git-clone earlier (HTTP/2 stream cancel surfaced as a fatal). Add a `timeout=` and wrap in try/except, or use a wrapper that retries."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-471967751240e44f", "name": "Network/subprocess call without timeout or try/except \u2014 bridge/extract_content_schemas.py:40", "shortDescription": {"text": "Network/subprocess call without timeout or try/except \u2014 bridge/extract_content_schemas.py:40"}, "fullDescription": {"text": "`subprocess.run(...)` here lacks both a `timeout=` arg and an enclosing try/except. This is exactly the class of bug that took down our git-clone earlier (HTTP/2 stream cancel surfaced as a fatal). Add a `timeout=` and wrap in try/except, or use a wrapper that retries."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-38d29e53ef9ff555", "name": "Legacy-named symbol `include_deprecated` in src/report_skill/client.py:530", "shortDescription": {"text": "Legacy-named symbol `include_deprecated` in src/report_skill/client.py:530"}, "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-77604fe9838e1422", "name": "Legacy-named symbol `include_deprecated` in src/report_skill/mcp_server.py:677", "shortDescription": {"text": "Legacy-named symbol `include_deprecated` in src/report_skill/mcp_server.py:677"}, "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-093dbe04415d750e", "name": "Commented-code block (6 lines) in src/report_skill/mcp_server.py:3851", "shortDescription": {"text": "Commented-code block (6 lines) in src/report_skill/mcp_server.py:3851"}, "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-bd480936a2c8536e", "name": "Legacy-named symbol `row_copy` in src/report_skill/merge.py:154", "shortDescription": {"text": "Legacy-named symbol `row_copy` in src/report_skill/merge.py:154"}, "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-c986577a69f7c893", "name": "Commented-code block (8 lines) in src/report_skill/config.py:10", "shortDescription": {"text": "Commented-code block (8 lines) in src/report_skill/config.py:10"}, "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-ef00cdf5ecc34d49", "name": "Network/subprocess call without timeout or try/except \u2014 src/report_skill/catalog.py:77", "shortDescription": {"text": "Network/subprocess call without timeout or try/except \u2014 src/report_skill/catalog.py:77"}, "fullDescription": {"text": "`subprocess.run(...)` here lacks both a `timeout=` arg and an enclosing try/except. This is exactly the class of bug that took down our git-clone earlier (HTTP/2 stream cancel surfaced as a fatal). Add a `timeout=` and wrap in try/except, or use a wrapper that retries."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-37402caecb0c134f", "name": "Legacy-named symbol `include_deprecated` in src/report_skill/cli.py:807", "shortDescription": {"text": "Legacy-named symbol `include_deprecated` in src/report_skill/cli.py:807"}, "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-5776ac5bc78c5abf", "name": "Commented-code block (6 lines) in src/report_skill/cli.py:1126", "shortDescription": {"text": "Commented-code block (6 lines) in src/report_skill/cli.py:1126"}, "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-5cd97e739bc5776b", "name": "Commented-code block (6 lines) in src/report_skill/adapters/rich_text.py:29", "shortDescription": {"text": "Commented-code block (6 lines) in src/report_skill/adapters/rich_text.py:29"}, "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-3f660a386ff21481", "name": "Stub function `fallback_to` (body is just `pass`/`return`) \u2014 src/report_skill/adapters/heading.py:42", "shortDescription": {"text": "Stub function `fallback_to` (body is just `pass`/`return`) \u2014 src/report_skill/adapters/heading.py:42"}, "fullDescription": {"text": "Likely an AI scaffold that was never filled in. Remove or implement."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-147e2e74a300462c", "name": "Commented-code block (5 lines) in src/report_skill/adapters/key_value.py:37", "shortDescription": {"text": "Commented-code block (5 lines) in src/report_skill/adapters/key_value.py:37"}, "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-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: `ANTHROPIC_API_KEY`, `LOCALAPPDATA`, `OPENAI_API_KEY`, `REPORT_SKILL_ENV`. 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}}, {"id": "scanner-2c04133e54348533", "name": "Near-duplicate function bodies in 2 places", "shortDescription": {"text": "Near-duplicate function bodies in 2 places"}, "fullDescription": {"text": "Functions with the same first-5-line body hash:\nsrc/report_skill/client.py:fetch_templates, src/report_skill/client.py:fetch_template\n\nThis is *the* AI-coder failure mode (4\u00d7 more duplication in vibe-coded repos \u2014 see https://jw.hn/ai-code-hygiene). Consolidate or document why they're separate."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-02525d39071dd2c7", "name": "Near-duplicate function bodies in 5 places", "shortDescription": {"text": "Near-duplicate function bodies in 5 places"}, "fullDescription": {"text": "Functions with the same first-5-line body hash:\nsrc/report_skill/llm.py:generate, src/report_skill/llm.py:generate, src/report_skill/llm.py:generate, src/report_skill/llm.py:generate\n\nThis is *the* AI-coder failure mode (4\u00d7 more duplication in vibe-coded repos \u2014 see https://jw.hn/ai-code-hygiene). Consolidate or document why they're separate."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-33a6b62e30ce7ab4", "name": "Near-duplicate function bodies in 6 places", "shortDescription": {"text": "Near-duplicate function bodies in 6 places"}, "fullDescription": {"text": "Functions with the same first-5-line body hash:\nsrc/report_skill/adapters/bulleted_list.py:fallback_to, src/report_skill/adapters/cad_3d.py:fallback_to, src/report_skill/adapters/video.py:fallback_to, src/report_skill/adapters/image.py:fallback_to\n\nThis is *the* AI-coder failure mode (4\u00d7 more duplication in vibe-coded repos \u2014 see https://jw.hn/ai-code-hygiene). Consolidate or document why they're separate."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-be46ea126aa5d8dc", "name": "Near-duplicate function bodies in 3 places", "shortDescription": {"text": "Near-duplicate function bodies in 3 places"}, "fullDescription": {"text": "Functions with the same first-5-line body hash:\nsrc/report_skill/adapters/box.py:normalize, src/report_skill/adapters/tree.py:normalize, src/report_skill/adapters/mind_map.py:normalize\n\nThis is *the* AI-coder failure mode (4\u00d7 more duplication in vibe-coded repos \u2014 see https://jw.hn/ai-code-hygiene). Consolidate or document why they're separate."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}]}}, "automationDetails": {"id": "repobility/20160"}, "properties": {"repository": "squall321/report-skill", "repoUrl": "https://github.com/squall321/report-skill", "branch": "main"}, "results": [{"ruleId": "scanner-a5ac9da6e7293904", "level": "note", "message": {"text": "Possibly dead Python function: is_valid"}, "properties": {"repobilityId": "0f8af96dda222428", "scanner": "scanner-primary", "fingerprint": "a5ac9da6e7293904", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/report_skill/validate.py:84"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-d52daa368c3bbd5b", "level": "note", "message": {"text": "Possibly dead Python function: download_file"}, "properties": {"repobilityId": "9d5d70ce1b4ee0b7", "scanner": "scanner-primary", "fingerprint": "d52daa368c3bbd5b", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/report_skill/client.py:551"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-abf60c1fc0e48986", "level": "note", "message": {"text": "Possibly dead Python function: build_page_prompt"}, "properties": {"repobilityId": "c263bcb2d005bfed", "scanner": "scanner-primary", "fingerprint": "abf60c1fc0e48986", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/report_skill/prompt.py:561"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-fe513214e2e70ff5", "level": "note", "message": {"text": "Possibly dead Python function: reset_provider"}, "properties": {"repobilityId": "51a000b0c8cf1b63", "scanner": "scanner-primary", "fingerprint": "fe513214e2e70ff5", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/report_skill/llm.py:410"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-d9bd369f5e34d557", "level": "note", "message": {"text": "Possibly dead Python function: upload_many"}, "properties": {"repobilityId": "a16c5a0d4e4ebe85", "scanner": "scanner-primary", "fingerprint": "d9bd369f5e34d557", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/report_skill/files.py:136"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-06bbb6f8c236010d", "level": "note", "message": {"text": "Possibly dead Python function: replace_page"}, "properties": {"repobilityId": "3d1e2c28cff5a3e0", "scanner": "scanner-primary", "fingerprint": "06bbb6f8c236010d", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/report_skill/report_ops.py:430"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-44a4d6032e2eff43", "level": "note", "message": {"text": "Possibly dead Python function: for_type"}, "properties": {"repobilityId": "6a1c88fcce629595", "scanner": "scanner-primary", "fingerprint": "44a4d6032e2eff43", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/report_skill/adapters/__init__.py:91"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-065d1bd02b6c594c", "level": "note", "message": {"text": "Possibly dead Python function: all_types"}, "properties": {"repobilityId": "3e36758897cf73fb", "scanner": "scanner-primary", "fingerprint": "065d1bd02b6c594c", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/report_skill/adapters/__init__.py:95"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-efaeacf1c45702be", "level": "note", "message": {"text": "Possibly dead Python function: repl"}, "properties": {"repobilityId": "6f5d3779bbb8be8b", "scanner": "scanner-primary", "fingerprint": "efaeacf1c45702be", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/report_skill/adapters/rich_text.py:144"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-9710c8d059e53154", "level": "none", "message": {"text": "No frontend routes/components detected"}, "properties": {"repobilityId": "44ca61485762e494", "scanner": "scanner-primary", "fingerprint": "9710c8d059e53154", "layer": "frontend", "severity": "info", "confidence": 1.0, "tags": ["coverage"]}}, {"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-afae64770573d3bf", "level": "note", "message": {"text": "Very large file: src/report_skill/client.py (1947 lines)"}, "properties": {"repobilityId": "85e10d7dd91c9fe9", "scanner": "scanner-primary", "fingerprint": "afae64770573d3bf", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-db00e91cbc6b456c", "level": "note", "message": {"text": "Very large file: src/report_skill/mcp_server.py (4070 lines)"}, "properties": {"repobilityId": "fa67c89baeecf5ff", "scanner": "scanner-primary", "fingerprint": "db00e91cbc6b456c", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-8129f968b0348c33", "level": "note", "message": {"text": "Very large file: src/report_skill/cli.py (3664 lines)"}, "properties": {"repobilityId": "a9956e8c69fd876f", "scanner": "scanner-primary", "fingerprint": "8129f968b0348c33", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-141b30a41e03817b", "level": "note", "message": {"text": "No license file detected"}, "properties": {"repobilityId": "4b1c8dcd886133dd", "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": "322a457dbc02047d", "scanner": "scanner-primary", "fingerprint": "3ab5d313dda8e5f9", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["debug", "cleanup", "repo-hardening", "generated-repo-pattern"]}}, {"ruleId": "scanner-2d0c7b7ab8f8aacf", "level": "warning", "message": {"text": "Critical user flow still appears backed by mock or placeholder data"}, "properties": {"repobilityId": "c3372a7c39694a22", "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": "note", "message": {"text": "Composite production-readiness gap"}, "properties": {"repobilityId": "9a3e8f200cb598fc", "scanner": "scanner-primary", "fingerprint": "b9088664ace7f748", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["production-readiness", "repo-hardening", "generated-repo-pattern"]}}, {"ruleId": "scanner-749d4bc1bd66df5f", "level": "warning", "message": {"text": "Agent instructions exist but release-hardening basics are missing"}, "properties": {"repobilityId": "0004a4766c4e693a", "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": "7a21096fb85809f9", "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": "9d273873a7d50265", "scanner": "scanner-primary", "fingerprint": "8424db9c75e04ba4", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["provenance", "git-history", "generated-repo-pattern"]}}, {"ruleId": "scanner-cbc6ab5fe7e44767", "level": "warning", "message": {"text": "Agent authority lacks a verifier contract: .claude/skills/widgets-sync/SKILL.md"}, "properties": {"repobilityId": "6c6713fa0a3d7faa", "scanner": "scanner-primary", "fingerprint": "cbc6ab5fe7e44767", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "verification", "claude_instruction"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".claude/skills/widgets-sync/SKILL.md"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-a2a6aae2365944c0", "level": "warning", "message": {"text": "Agent authority lacks a verifier contract: .claude/skills/bridge-process/SKILL.md"}, "properties": {"repobilityId": "fd5e26011f0db3b8", "scanner": "scanner-primary", "fingerprint": "a2a6aae2365944c0", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "verification", "claude_instruction"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".claude/skills/bridge-process/SKILL.md"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-86f4fbc26b871ce2", "level": "warning", "message": {"text": "Agent authority lacks a verifier contract: .claude/skills/report-write/reference/errors-recovery.md"}, "properties": {"repobilityId": "c60e4e9e88accdb4", "scanner": "scanner-primary", "fingerprint": "86f4fbc26b871ce2", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "verification", "claude_instruction"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".claude/skills/report-write/reference/errors-recovery.md"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-79ffde51c28e4a46", "level": "warning", "message": {"text": "Agent authority lacks a verifier contract: .claude/skills/report-write/reference/widgets.md"}, "properties": {"repobilityId": "f20528f3908afdbc", "scanner": "scanner-primary", "fingerprint": "79ffde51c28e4a46", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "verification", "claude_instruction"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".claude/skills/report-write/reference/widgets.md"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-9d1fa18a89e02b14", "level": "note", "message": {"text": "Legacy-named symbol `report_copy` in tests/test_dispatch_parametrized.py:396"}, "properties": {"repobilityId": "d273986901d03005", "scanner": "scanner-primary", "fingerprint": "9d1fa18a89e02b14", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-5296e101c27feb18", "level": "none", "message": {"text": "Commented-code block (5 lines) in tests/test_dispatch_parametrized.py:72"}, "properties": {"repobilityId": "b11fe43ccdea2c53", "scanner": "scanner-primary", "fingerprint": "5296e101c27feb18", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-738c8875e193c64d", "level": "none", "message": {"text": "Commented-code block (6 lines) in tests/test_authorlocked_mapping.py:212"}, "properties": {"repobilityId": "a93e4e45d8de9e97", "scanner": "scanner-primary", "fingerprint": "738c8875e193c64d", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-789e678ead87d931", "level": "none", "message": {"text": "Commented-code block (13 lines) in tests/test_mcp_roundtrip.py:250"}, "properties": {"repobilityId": "3ec711ebb2224516", "scanner": "scanner-primary", "fingerprint": "789e678ead87d931", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-62005b9a8af3db59", "level": "warning", "message": {"text": "Network/subprocess call without timeout or try/except \u2014 scripts/check_ra_impact.py:32"}, "properties": {"repobilityId": "04c6533e472027c9", "scanner": "scanner-primary", "fingerprint": "62005b9a8af3db59", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-471967751240e44f", "level": "warning", "message": {"text": "Network/subprocess call without timeout or try/except \u2014 bridge/extract_content_schemas.py:40"}, "properties": {"repobilityId": "73c7080923cbc71c", "scanner": "scanner-primary", "fingerprint": "471967751240e44f", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-38d29e53ef9ff555", "level": "note", "message": {"text": "Legacy-named symbol `include_deprecated` in src/report_skill/client.py:530"}, "properties": {"repobilityId": "6d1aa1a93a9b3784", "scanner": "scanner-primary", "fingerprint": "38d29e53ef9ff555", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-77604fe9838e1422", "level": "note", "message": {"text": "Legacy-named symbol `include_deprecated` in src/report_skill/mcp_server.py:677"}, "properties": {"repobilityId": "aece7919fc078b37", "scanner": "scanner-primary", "fingerprint": "77604fe9838e1422", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-093dbe04415d750e", "level": "none", "message": {"text": "Commented-code block (6 lines) in src/report_skill/mcp_server.py:3851"}, "properties": {"repobilityId": "296528430d2bca8a", "scanner": "scanner-primary", "fingerprint": "093dbe04415d750e", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-bd480936a2c8536e", "level": "note", "message": {"text": "Legacy-named symbol `row_copy` in src/report_skill/merge.py:154"}, "properties": {"repobilityId": "ec41943fa85b09fe", "scanner": "scanner-primary", "fingerprint": "bd480936a2c8536e", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-c986577a69f7c893", "level": "none", "message": {"text": "Commented-code block (8 lines) in src/report_skill/config.py:10"}, "properties": {"repobilityId": "9dbe44195c7f9f0a", "scanner": "scanner-primary", "fingerprint": "c986577a69f7c893", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-ef00cdf5ecc34d49", "level": "warning", "message": {"text": "Network/subprocess call without timeout or try/except \u2014 src/report_skill/catalog.py:77"}, "properties": {"repobilityId": "c6efd1f4bb3f7a1f", "scanner": "scanner-primary", "fingerprint": "ef00cdf5ecc34d49", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-37402caecb0c134f", "level": "note", "message": {"text": "Legacy-named symbol `include_deprecated` in src/report_skill/cli.py:807"}, "properties": {"repobilityId": "034921f937c4966f", "scanner": "scanner-primary", "fingerprint": "37402caecb0c134f", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-5776ac5bc78c5abf", "level": "none", "message": {"text": "Commented-code block (6 lines) in src/report_skill/cli.py:1126"}, "properties": {"repobilityId": "6d60372c90bd7b61", "scanner": "scanner-primary", "fingerprint": "5776ac5bc78c5abf", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-5cd97e739bc5776b", "level": "none", "message": {"text": "Commented-code block (6 lines) in src/report_skill/adapters/rich_text.py:29"}, "properties": {"repobilityId": "cef86df3829abc63", "scanner": "scanner-primary", "fingerprint": "5cd97e739bc5776b", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-3f660a386ff21481", "level": "note", "message": {"text": "Stub function `fallback_to` (body is just `pass`/`return`) \u2014 src/report_skill/adapters/heading.py:42"}, "properties": {"repobilityId": "5800d3061d1b4a19", "scanner": "scanner-primary", "fingerprint": "3f660a386ff21481", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "empty-handler", "dead-code"]}}, {"ruleId": "scanner-147e2e74a300462c", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/report_skill/adapters/key_value.py:37"}, "properties": {"repobilityId": "e08c7697d8d27440", "scanner": "scanner-primary", "fingerprint": "147e2e74a300462c", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "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"]}}, {"ruleId": "scanner-2c04133e54348533", "level": "note", "message": {"text": "Near-duplicate function bodies in 2 places"}, "properties": {"repobilityId": "2fdb0ac0f89fce53", "scanner": "scanner-primary", "fingerprint": "2c04133e54348533", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-2c04133e54348533", "level": "note", "message": {"text": "Near-duplicate function bodies in 2 places"}, "properties": {"repobilityId": "9cbb1b7249965d3d", "scanner": "scanner-primary", "fingerprint": "2c04133e54348533", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-02525d39071dd2c7", "level": "note", "message": {"text": "Near-duplicate function bodies in 5 places"}, "properties": {"repobilityId": "62d2006a66eb6b84", "scanner": "scanner-primary", "fingerprint": "02525d39071dd2c7", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-2c04133e54348533", "level": "note", "message": {"text": "Near-duplicate function bodies in 2 places"}, "properties": {"repobilityId": "a1a031ec8d3f5a96", "scanner": "scanner-primary", "fingerprint": "2c04133e54348533", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-2c04133e54348533", "level": "note", "message": {"text": "Near-duplicate function bodies in 2 places"}, "properties": {"repobilityId": "cc4ce35733030332", "scanner": "scanner-primary", "fingerprint": "2c04133e54348533", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-2c04133e54348533", "level": "note", "message": {"text": "Near-duplicate function bodies in 2 places"}, "properties": {"repobilityId": "1b3c16b1aaea480f", "scanner": "scanner-primary", "fingerprint": "2c04133e54348533", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-2c04133e54348533", "level": "note", "message": {"text": "Near-duplicate function bodies in 2 places"}, "properties": {"repobilityId": "4d080f062552f2ad", "scanner": "scanner-primary", "fingerprint": "2c04133e54348533", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-33a6b62e30ce7ab4", "level": "note", "message": {"text": "Near-duplicate function bodies in 6 places"}, "properties": {"repobilityId": "d55e497d82e18580", "scanner": "scanner-primary", "fingerprint": "33a6b62e30ce7ab4", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-2c04133e54348533", "level": "note", "message": {"text": "Near-duplicate function bodies in 2 places"}, "properties": {"repobilityId": "dff4899920b9b0e8", "scanner": "scanner-primary", "fingerprint": "2c04133e54348533", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-be46ea126aa5d8dc", "level": "note", "message": {"text": "Near-duplicate function bodies in 3 places"}, "properties": {"repobilityId": "15c7ab17d02c81f2", "scanner": "scanner-primary", "fingerprint": "be46ea126aa5d8dc", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-2c04133e54348533", "level": "note", "message": {"text": "Near-duplicate function bodies in 2 places"}, "properties": {"repobilityId": "5881d98eda6fe8bf", "scanner": "scanner-primary", "fingerprint": "2c04133e54348533", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-2c04133e54348533", "level": "note", "message": {"text": "Near-duplicate function bodies in 2 places"}, "properties": {"repobilityId": "a59e770ba7c7fd16", "scanner": "scanner-primary", "fingerprint": "2c04133e54348533", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-2c04133e54348533", "level": "note", "message": {"text": "Near-duplicate function bodies in 2 places"}, "properties": {"repobilityId": "5dddc5e7fccfa416", "scanner": "scanner-primary", "fingerprint": "2c04133e54348533", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-be46ea126aa5d8dc", "level": "note", "message": {"text": "Near-duplicate function bodies in 3 places"}, "properties": {"repobilityId": "b0973595ffdca46a", "scanner": "scanner-primary", "fingerprint": "be46ea126aa5d8dc", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-2c04133e54348533", "level": "note", "message": {"text": "Near-duplicate function bodies in 2 places"}, "properties": {"repobilityId": "aec31fff17d151de", "scanner": "scanner-primary", "fingerprint": "2c04133e54348533", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}]}]}