{"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": "foundry_unresolved_feedback", "name": "Foundry mined unresolved feedback: riponcm/projectmem", "shortDescription": {"text": "Foundry mined unresolved feedback: riponcm/projectmem"}, "fullDescription": {"text": "Graph query export: Human feedback without linked fix evidence\nQuery id: unresolved_feedback\nQuery type: motif_query\nIntent: Negative/unresolved examples that should not be hallucinated into fixes.\nMotif: unlinked_feedback_needs_evidence\nTraining usage: negative_or_unresolved\nGraph gold label: needs_more_evidence\nRepo: riponcm/projectmem\nThread: riponcm/projectmem#2\nEvidence:\nGraph motif: Human feedback exists without a linked fix\nMotif id: unlinked_feedback_needs_evidence\nPolarity: bad\nTraining usage: negative_or_unresolved\nSeverity: medium\nRepo: riponcm/projectmem\nThread: riponcm/projectmem#2\nGraph gold label: needs_more_evidence\nThread graph evidence:\nGitHub issue/PR evidence subgraph\nThread: riponcm/projectmem#2\nRepo: riponcm/projectmem\nIssue/PR number: 2\nGraph consistency label: needs_more_evidence\nNodes: 26\nEdges: 52\nNode types: {'pr_file': 17, 'link_quality': 3, 'thread': 1, 'repo': 1, 'comment': 1, 'comment_chain': 1, 'issue_chain': 1, 'fix_outcome': 1}\nEdge types: {'thread_tou"}, "properties": {"scanner": "foundry_dataset", "category": "practices", "severity": "medium", "confidence": 0.7, "cwe": "", "owasp": ""}}, {"id": "foundry_bad_chain", "name": "Foundry mined bad chains: riponcm/projectmem", "shortDescription": {"text": "Foundry mined bad chains: riponcm/projectmem"}, "fullDescription": {"text": "Comment chain pattern product: bad_chains\nRepo: riponcm/projectmem\nThread: riponcm/projectmem#2\nOutcome: not_resolved_or_not_observed\nThread label: thread_has_human_issue_without_fix_context\nSource graph label: source_artifact_without_verification_graph\nReasons: source_graph_has_real_artifacts, link_quality_unresolved\nChain evidence:\nIssue/PR evidence chain: riponcm/projectmem#2\nRepo: riponcm/projectmem\nThread label: thread_has_human_issue_without_fix_context\nOutcome: not_resolved_or_not_observed\nComment count: 1\nLinked commit count: 0\nLinked CI commit count: 0\nLinked CI labels: {}\nChanged file count: 17\nLabels: {'agent_instruction_gap': 1}\nPolarities: {'bad': 1}\nChanged file labels: {'source_or_other': 2, 'docs_or_claims': 2, 'ui_or_frontend': 9, 'api_or_backend': 1, 'test_or_ci': 3}\nExamples:\n[\n  {\n    \"id\": \"github-feedback-comment-9128ea4c1482acd7\",\n    \"kind\": \"pull_request_body\",\n    \"label\": \"agent_instruction_gap\",\n    \"polarity\": \"bad\",\n    \"url\": \"https://github.com/riponcm/p"}, "properties": {"scanner": "foundry_dataset", "category": "practices", "severity": "high", "confidence": 0.84, "cwe": "", "owasp": ""}}, {"id": "scanner-540bc0c13eb843bc", "name": "Possibly dead Python function: stale_label", "shortDescription": {"text": "Possibly dead Python function: stale_label"}, "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-92732269b5886d1c", "name": "Very large file: src/projectmem/commands/visualize.py (1724 lines)", "shortDescription": {"text": "Very large file: src/projectmem/commands/visualize.py (1724 lines)"}, "fullDescription": {"text": "Files with >800 lines often hide complexity hotspots and discourage tests."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-ea3b5e389d8c9c0f", "name": "Low test-to-source ratio", "shortDescription": {"text": "Low test-to-source ratio"}, "fullDescription": {"text": "8 tests / 35 src (ratio 0.23)."}, "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 6 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 28 placeholder/mock markers across 4 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-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-c237ce94a84ef196", "name": "Commented-code block (5 lines) in src/projectmem/mcp_server.py:425", "shortDescription": {"text": "Commented-code block (5 lines) in src/projectmem/mcp_server.py:425"}, "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-731322aa03dae75f", "name": "Commented-code block (7 lines) in src/projectmem/storage.py:437", "shortDescription": {"text": "Commented-code block (7 lines) in src/projectmem/storage.py:437"}, "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-b52dd6e7ffc819c0", "name": "Commented-code block (6 lines) in src/projectmem/global_memory.py:579", "shortDescription": {"text": "Commented-code block (6 lines) in src/projectmem/global_memory.py:579"}, "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-e1cce6859d630560", "name": "Commented-code block (5 lines) in src/projectmem/summary.py:40", "shortDescription": {"text": "Commented-code block (5 lines) in src/projectmem/summary.py:40"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-13012c3abd91d206", "name": "Commented-code block (5 lines) in src/projectmem/commands/precheck.py:45", "shortDescription": {"text": "Commented-code block (5 lines) in src/projectmem/commands/precheck.py:45"}, "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-cd99406456834e6a", "name": "Commented-code block (7 lines) in src/projectmem/commands/hooks.py:21", "shortDescription": {"text": "Commented-code block (7 lines) in src/projectmem/commands/hooks.py:21"}, "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-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/projectmem/storage.py:ai_instructions_path, src/projectmem/storage.py:ai_instructions\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/18181"}, "properties": {"repository": "riponcm/projectmem", "repoUrl": "https://github.com/riponcm/projectmem", "branch": "main"}, "results": [{"ruleId": "foundry_unresolved_feedback", "level": "warning", "message": {"text": "Foundry mined unresolved feedback: riponcm/projectmem"}, "properties": {"repobilityId": 369525, "scanner": "foundry_dataset", "fingerprint": "02fb50119e3161017e2c0d79641158d8ce956f9aef5145323e9c18049818f653", "category": "practices", "severity": "medium", "confidence": 0.7, "triageState": "open", "verdict": "needs_review", "isResolved": false, "reason": "Imported from mined Foundry/Fable5 evidence with real GitHub/source provenance. Review source_id before acting.", "evidence": {"meta": {"kind": "graph_query_record", "title": "Human feedback without linked fix evidence", "intent": "Negative/unresolved examples that should not be hallucinated into fixes.", "labels": {"test_or_ci": 3, "api_or_backend": 1, "docs_or_claims": 2, "ui_or_frontend": 9, "source_or_other": 2, "agent_instruction_gap": 1, "issue_or_pull_request_thread": 1, "not_resolved_or_not_observed": 3, "human_reported_issue_no_linked_fix": 1, "thread_has_human_issue_without_fix_context": 2}, "source": "graph_query_export", "motif_id": "unlinked_feedback_needs_evidence", "outcomes": {"not_resolved_or_not_observed": 6}, "polarity": "bad", "query_id": "unresolved_feedback", "severity": "medium", "ci_labels": {}, "synthetic": false, "edge_count": 52, "edge_types": {"repo_has_thread": 1, "comment_has_chain": 1, "thread_has_comment": 1, "thread_touches_file": 17, "chain_has_link_quality": 3, "thread_has_fix_outcome": 1, "thread_has_issue_chain": 1, "issue_chain_touches_file": 12, "thread_has_comment_chain": 1, "comment_chain_touches_file": 12, "issue_chain_has_fix_outcome": 1, "issue_chain_has_comment_chain": 1}, "node_count": 26, "node_types": {"repo": 1, "thread": 1, "comment": 1, "pr_file": 17, "fix_outcome": 1, "issue_chain": 1, "link_quality": 3, "comment_chain": 1}, "query_type": "motif_query", "thread_key": "riponcm/projectmem#2", "issue_number": "2", "quality_tiers": {"unresolved": 3}, "repo_full_name": "riponcm/projectmem", "training_usage": "negative_or_unresolved", "source_motif_id": "graph-pattern-motif-thread-f6f64361258736fc", "graph_gold_label": "needs_more_evidence", "changed_file_labels": {"test_or_ci": 12, "api_or_backend": 4, "docs_or_claims": 8, "ui_or_frontend": 36, "source_or_other": 8}}, "text": "Graph query export: Human feedback without linked fix evidence\nQuery id: unresolved_feedback\nQuery type: motif_query\nIntent: Negative/unresolved examples that should not be hallucinated into fixes.\nMotif: unlinked_feedback_needs_evidence\nTraining usage: negative_or_unresolved\nGraph gold label: needs_more_evidence\nRepo: riponcm/projectmem\nThread: riponcm/projectmem#2\nEvidence:\nGraph motif: Human feedback exists without a linked fix\nMotif id: unlinked_feedback_needs_evidence\nPolarity: bad\nTraining usage: negative_or_unresolved\nSeverity: medium\nRepo: riponcm/projectmem\nThread: riponcm/projectmem#2\nGraph gold label: needs_more_evidence\nThread graph evidence:\nGitHub issue/PR evidence subgraph\nThread: riponcm/projectmem#2\nRepo: riponcm/projectmem\nIssue/PR number: 2\nGraph consistency label: needs_more_evidence\nNodes: 26\nEdges: 52\nNode types: {'pr_file': 17, 'link_quality': 3, 'thread': 1, 'repo': 1, 'comment': 1, 'comment_chain': 1, 'issue_chain': 1, 'fix_outcome': 1}\nEdge types: {'thread_touches_file': 17, 'comment_chain_touches_file': 12, 'issue_chain_touches_file': 12, 'chain_has_link_quality': 3, 'repo_has_thread': 1, 'thread_has_comment': 1, 'thread_has_comment_chain': 1, 'comment_has_chain': 1, 'thread_has_issue_chain': 1, 'issue_chain_has_comment_chain': 1, 'thread_has_fix_outcome': 1, 'issue_chain_has_fix_outcome': 1}\nLabels: {'ui_or_frontend': 9, 'test_or_ci': 3, 'not_resolved_or_not_observed': 3, 'source_or_other': 2, 'docs_or_claims': 2, 'thread_has_human_issue_without_fix_context': 2, 'issue_or_pull_request_thread': 1, 'agent_instruction_gap': 1, 'api_or_backend': 1, 'human_reported_issue_no_linked_fix': 1}\nOutcomes: {'not_resolved_or_not_observed': 6}\nQuality tiers: {'unresolved': 3}\nCI labels: {}\nCurriculum targets:\n- Teach models to preserve unresolved human feedback instead of hallucinating fixes.\n- Build issue-to-regression examples where no accepted fix exists yet.\nAssumption checks:\n- Can a commit be linked by issue number, SHA, changed path, or time window?\n- If no link exists, is this explicitly labelled unresolved?", "source": "foundry_mined_dataset", "repo_url": "https://github.com/riponcm/projectmem", "source_id": "graph-query-motif_query-b62c87ace067a558", "synthetic": false, "gold_label": "", "graph_label": "", "source_path": "/data/distillate/foundry_data/graph_queries/unresolved_feedback/shard-0.jsonl", "bundle_label": "", "priority_band": "", "priority_score": 0, "repo_full_name": "riponcm/projectmem", "source_dataset": "graph_queries/unresolved_feedback", "training_usage": "negative_or_unresolved"}}}, {"ruleId": "foundry_bad_chain", "level": "error", "message": {"text": "Foundry mined bad chains: riponcm/projectmem"}, "properties": {"repobilityId": 322348, "scanner": "foundry_dataset", "fingerprint": "47db4ed353562596ae7f3ed5c6c7c546efacb379e741118085e12bc11032ba0f", "category": "practices", "severity": "high", "confidence": 0.84, "triageState": "open", "verdict": "confirmed", "isResolved": false, "reason": "Imported from mined Foundry/Fable5 evidence with real GitHub/source provenance. Review source_id before acting.", "evidence": {"meta": {"kind": "comment_chain_pattern_product", "source": "comment_chain_pattern_miner", "product": "bad_chains", "synthetic": false, "thread_key": "riponcm/projectmem#2", "human_labels": ["agent_instruction_gap", "api_or_backend", "docs_or_claims", "source_or_other", "test_or_ci", "ui_or_frontend"], "issue_number": "2", "thread_label": "thread_has_human_issue_without_fix_context", "outcome_label": "not_resolved_or_not_observed", "source_backed": true, "max_confidence": 0.0, "repo_full_name": "riponcm/projectmem", "training_usage": "negative_or_unresolved", "confidence_tier": "unresolved", "source_chain_id": "evidence-chain-issue_chain-8ad0b4f552c9d81b", "helicopter_views": {}, "artifact_families": {"docs": 1}, "source_chain_kind": "issue_chain", "changed_file_count": 17, "source_graph_label": "source_artifact_without_verification_graph", "changed_file_labels": {"test_or_ci": 3, "api_or_backend": 1, "docs_or_claims": 2, "ui_or_frontend": 9, "source_or_other": 2}, "linked_commit_count": 0, "helicopter_view_count": 0, "source_artifact_count": 1, "classification_reasons": ["source_graph_has_real_artifacts", "link_quality_unresolved"], "linked_ci_commit_count": 0, "verification_artifact_count": 0, "design_schema_api_artifact_count": 0}, "text": "Comment chain pattern product: bad_chains\nRepo: riponcm/projectmem\nThread: riponcm/projectmem#2\nOutcome: not_resolved_or_not_observed\nThread label: thread_has_human_issue_without_fix_context\nSource graph label: source_artifact_without_verification_graph\nReasons: source_graph_has_real_artifacts, link_quality_unresolved\nChain evidence:\nIssue/PR evidence chain: riponcm/projectmem#2\nRepo: riponcm/projectmem\nThread label: thread_has_human_issue_without_fix_context\nOutcome: not_resolved_or_not_observed\nComment count: 1\nLinked commit count: 0\nLinked CI commit count: 0\nLinked CI labels: {}\nChanged file count: 17\nLabels: {'agent_instruction_gap': 1}\nPolarities: {'bad': 1}\nChanged file labels: {'source_or_other': 2, 'docs_or_claims': 2, 'ui_or_frontend': 9, 'api_or_backend': 1, 'test_or_ci': 3}\nExamples:\n[\n  {\n    \"id\": \"github-feedback-comment-9128ea4c1482acd7\",\n    \"kind\": \"pull_request_body\",\n    \"label\": \"agent_instruction_gap\",\n    \"polarity\": \"bad\",\n    \"url\": \"https://github.com/riponcm/projectmem/pull/2\",\n    \"text\": \"GitHub feedback: agent_instruction_gap\\nPolarity: bad\\nKind: pull_request_body\\nRepo: riponcm/projectmem\\nAuthor: hanley-development (User)\\nURL: https://github.com/riponcm/projectmem/pull/2\\nTitle: Add issue selector to pjm fix and MCP record_fix\\nBody:\\n## Summary\\r\\n\\r\\nAdds support for closing a specific issue by ID when recording a confirmed fix.\\r\\n\\r\\n## Why\\r\\n\\r\\n`pjm attempt` already supports `--issue`, but `pjm fix` only closes the active issue pointer. In real workflows, users may create issue `#0002` before finishing `#0001`. Without an issue selector, a verified fix for `#0001` can be recorded against the wrong active issue or leave `#0001` displayed as open.\\r\\n\\r\\n## Changes\\r\\n\\r\\n- Add optional `issue` parameter to `projectmem.commands.fix.run`.\\r\\n- Add `pjm fix --issue <id>`.\\r\\n- Add optional `issue_id` parameter to MCP `record_fix`.\\r\\n- Normalize numeric issue IDs so `1`, `001`, and `0001` all target `0001`.\\r\\n- Preserve existing behavior when no issue ID is provided.\\r\\n- Only clear the active issue marker when fixing the active issue.\\r\\n\\r\\n## Example\\r\\n\\r\\n```bash\\r\\npjm fix --issue 0001 \\\"resolved MCP artifact leakage in skill/agent workflows\\\"\"\n  }\n]\nChanged files:\n[\n  {\n    \"id\": \"github-pr-file-file-5dc28a1e85a7d1bb\",\n    \"filename\": \".gitignore\",\n    \"label\": \"source_or_other\",\n    \"status\": \"modified\",\n    \"additions\": 6,\n    \"deletions\": 0,\n    \"changes\": 6,\n    \"blob_url\": \"https://github.com/riponcm/projectmem/blob/e311e20d1c93e101ef2f84f0ff904e374e6f22d7/.gitignore\"\n  },\n  {\n    \"id\": \"github-pr-file-file-0d6bc659c59955bd\",\n    \"filename\": \"CHANGELOG.md\",\n    \"label\": \"docs_or_claims\",\n    \"status\": \"modified\",\n    \"additions\": 17,\n    \"deletions\": 0,\n    \"changes\": 17,\n    \"blob_url\": \"https://github.com/riponcm/projectmem/blob/e311e20d1c93e101ef2f84f0ff904e374e6f22d7/CHANGELOG.md\"\n  },\n  {\n    \"id\": \"github-pr-file-file-cc911e49cb02d2db\",\n    \"filename\": \"README.\n[truncated by importer]", "source": "foundry_mined_dataset", "repo_url": "https://github.com/riponcm/projectmem", "source_id": "comment-chain-pattern-bad_chains-765bf147d8113bdd", "synthetic": false, "gold_label": "", "graph_label": "source_artifact_without_verification_graph", "source_path": "/data/distillate/foundry_data/comment_chain_patterns/bad_chains/shard-0.jsonl", "bundle_label": "", "priority_band": "", "priority_score": 0, "repo_full_name": "riponcm/projectmem", "source_dataset": "comment_chain_patterns/bad_chains", "training_usage": "negative_or_unresolved"}}}, {"ruleId": "scanner-540bc0c13eb843bc", "level": "note", "message": {"text": "Possibly dead Python function: stale_label"}, "properties": {"repobilityId": "32eb602f15d2af6e", "scanner": "scanner-primary", "fingerprint": "540bc0c13eb843bc", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "src/projectmem/staleness.py:102"}, "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-92732269b5886d1c", "level": "note", "message": {"text": "Very large file: src/projectmem/commands/visualize.py (1724 lines)"}, "properties": {"repobilityId": "bea84d8520dfa075", "scanner": "scanner-primary", "fingerprint": "92732269b5886d1c", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-ea3b5e389d8c9c0f", "level": "note", "message": {"text": "Low test-to-source ratio"}, "properties": {"repobilityId": "ef7b2552cc00a375", "scanner": "scanner-primary", "fingerprint": "ea3b5e389d8c9c0f", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["tests"]}}, {"ruleId": "scanner-3ab5d313dda8e5f9", "level": "note", "message": {"text": "Debug logging residue appears in source files"}, "properties": {"repobilityId": "69ed9def6eddf76d", "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": "bccd26f9c3e7c24d", "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": "bc00affaac5c9850", "scanner": "scanner-primary", "fingerprint": "2d0c7b7ab8f8aacf", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["placeholder", "mock-data", "critical-flow", "generated-repo-pattern"]}}, {"ruleId": "scanner-ea8f3013f588db25", "level": "note", "message": {"text": "Shallow git history limits provenance confidence"}, "properties": {"repobilityId": "7b634f67c7214c28", "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": "a9e29bff532626c4", "scanner": "scanner-primary", "fingerprint": "8424db9c75e04ba4", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["provenance", "git-history", "generated-repo-pattern"]}}, {"ruleId": "scanner-c237ce94a84ef196", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/projectmem/mcp_server.py:425"}, "properties": {"repobilityId": "0dc870b33a019482", "scanner": "scanner-primary", "fingerprint": "c237ce94a84ef196", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-731322aa03dae75f", "level": "none", "message": {"text": "Commented-code block (7 lines) in src/projectmem/storage.py:437"}, "properties": {"repobilityId": "a29488529ce5815a", "scanner": "scanner-primary", "fingerprint": "731322aa03dae75f", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-b52dd6e7ffc819c0", "level": "none", "message": {"text": "Commented-code block (6 lines) in src/projectmem/global_memory.py:579"}, "properties": {"repobilityId": "bf36955543056a57", "scanner": "scanner-primary", "fingerprint": "b52dd6e7ffc819c0", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-e1cce6859d630560", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/projectmem/summary.py:40"}, "properties": {"repobilityId": "831c32ae51e4073d", "scanner": "scanner-primary", "fingerprint": "e1cce6859d630560", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-13012c3abd91d206", "level": "none", "message": {"text": "Commented-code block (5 lines) in src/projectmem/commands/precheck.py:45"}, "properties": {"repobilityId": "d97d90fc79c232b5", "scanner": "scanner-primary", "fingerprint": "13012c3abd91d206", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-cd99406456834e6a", "level": "none", "message": {"text": "Commented-code block (7 lines) in src/projectmem/commands/hooks.py:21"}, "properties": {"repobilityId": "34b8b353e2398057", "scanner": "scanner-primary", "fingerprint": "cd99406456834e6a", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-2c04133e54348533", "level": "note", "message": {"text": "Near-duplicate function bodies in 2 places"}, "properties": {"repobilityId": "1f55317ade79f47c", "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": "e56bb184e38ca930", "scanner": "scanner-primary", "fingerprint": "2c04133e54348533", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}]}]}