{"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-fea197493103d79e", "name": "Possibly dead Python function: is_num", "shortDescription": {"text": "Possibly dead Python function: is_num"}, "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-35eca29a22aeab2a", "name": "Possibly dead Python function: run_fase_1", "shortDescription": {"text": "Possibly dead Python function: run_fase_1"}, "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-d35e266f70d1b0df", "name": "Possibly dead Python function: run_fase_2", "shortDescription": {"text": "Possibly dead Python function: run_fase_2"}, "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-df1844a22452bf9c", "name": "Possibly dead Python function: run_fase_3", "shortDescription": {"text": "Possibly dead Python function: run_fase_3"}, "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-cdfd583d3d32cd7b", "name": "Possibly dead Python function: run_fase_4", "shortDescription": {"text": "Possibly dead Python function: run_fase_4"}, "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-6136e04faab14588", "name": "Possibly dead Python function: run_fase_5", "shortDescription": {"text": "Possibly dead Python function: run_fase_5"}, "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-5128093e80f16af7", "name": "Possibly dead Python function: run_fase_6", "shortDescription": {"text": "Possibly dead Python function: run_fase_6"}, "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-9563828e45b6e2d8", "name": "Possibly dead Python function: run_fase_7", "shortDescription": {"text": "Possibly dead Python function: run_fase_7"}, "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-b171ab4ff9765197", "name": "Possibly dead Python function: run_fase_8", "shortDescription": {"text": "Possibly dead Python function: run_fase_8"}, "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-dac40f37552e7d8f", "name": "Possibly dead Python function: col_letter_to_idx", "shortDescription": {"text": "Possibly dead Python function: col_letter_to_idx"}, "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-2380ea4a70db02b9", "name": "Possibly dead Python function: register_agent", "shortDescription": {"text": "Possibly dead Python function: register_agent"}, "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-13e6a4f6177bc1ab", "name": "Possibly dead Python function: decorator", "shortDescription": {"text": "Possibly dead Python function: decorator"}, "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-808e225dda86e4e2", "name": "Possible secret in backend/apps/users/management/commands/setup_e2e_user.py", "shortDescription": {"text": "Possible secret in backend/apps/users/management/commands/setup_e2e_user.py"}, "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-1a50467f36b413ec", "name": "GitHub Action is tag-pinned rather than SHA-pinned", "shortDescription": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "fullDescription": {"text": "actions/setup-python@v5 can move without a code change in this repo. Pin third-party actions to a reviewed 40-character commit SHA."}, "properties": {"scanner": "scanner-primary", "layer": "cicd", "severity": "low", "confidence": 1.0}}, {"id": "scanner-d8c462d2a3cfc550", "name": "Very large file: backend/scripts/import_estudio_excel.py (1517 lines)", "shortDescription": {"text": "Very large file: backend/scripts/import_estudio_excel.py (1517 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-035705e471b359a5", "name": "Very large file: backend/core/tests/test_rbac_matrix.py (1198 lines)", "shortDescription": {"text": "Very large file: backend/core/tests/test_rbac_matrix.py (1198 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-1731e4138e5c866a", "name": "Very large file: backend/core/management/commands/load_dummy_data.py (1545 lines)", "shortDescription": {"text": "Very large file: backend/core/management/commands/load_dummy_data.py (1545 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-b257c9a47463d0cd", "name": "Very large file: backend/apps/proyeccion/routers.py (1777 lines)", "shortDescription": {"text": "Very large file: backend/apps/proyeccion/routers.py (1777 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-c29ea1ad5dfcffff", "name": "Very large file: backend/apps/proyeccion/models.py (1803 lines)", "shortDescription": {"text": "Very large file: backend/apps/proyeccion/models.py (1803 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-1efab6b2e33d75f8", "name": "Very large file: backend/apps/proyeccion/services.py (6430 lines)", "shortDescription": {"text": "Very large file: backend/apps/proyeccion/services.py (6430 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-f9473d0f28799df6", "name": "Very large file: backend/apps/proyeccion/tests/test_services.py (2162 lines)", "shortDescription": {"text": "Very large file: backend/apps/proyeccion/tests/test_services.py (2162 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-2da0e79ec7291e9b", "name": "Very large file: backend/apps/products/management/commands/generate_dummy_products.py (1530 lines)", "shortDescription": {"text": "Very large file: backend/apps/products/management/commands/generate_dummy_products.py (1530 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 276 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 18 placeholder/mock markers across 6 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-749d4bc1bd66df5f", "name": "Agent instructions exist but release-hardening basics are missing", "shortDescription": {"text": "Agent instructions exist but release-hardening basics are missing"}, "fullDescription": {"text": "AI-coder instruction files were found, but the repo is missing license. Treat this as a contract gap: the agent is guided, but the generated output is not yet guarded by the controls that make it repeatable."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-d750434f01b5fa77", "name": "Agent authority lacks a verifier contract: .claude/commands/speckit.checklist.md", "shortDescription": {"text": "Agent authority lacks a verifier contract: .claude/commands/speckit.checklist.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-abe388630798be6c", "name": "Agent authority lacks a verifier contract: .claude/commands/speckit.clarify.md", "shortDescription": {"text": "Agent authority lacks a verifier contract: .claude/commands/speckit.clarify.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-2882da8270959730", "name": "Agent authority lacks a verifier contract: .claude/commands/speckit.plan.md", "shortDescription": {"text": "Agent authority lacks a verifier contract: .claude/commands/speckit.plan.md"}, "fullDescription": {"text": "This agent instruction grants code or shell authority but does not state the verification gate that decides promotion. The recurring safe pattern is: LLM proposes; deterministic tests/build/security checks verify; only verified code promotes."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-6b0fa4b05bfb2b24", "name": "Agent authority lacks a verifier contract: .claude/commands/speckit.taskstoissues.md", "shortDescription": {"text": "Agent authority lacks a verifier contract: .claude/commands/speckit.taskstoissues.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-9b0af7bab915e880", "name": "Likely N+1 query: `for bd in \u2026` triggers a query per row \u2014 backend/scripts/seed_san_cristobal_fase5.py:95", "shortDescription": {"text": "Likely N+1 query: `for bd in \u2026` triggers a query per row \u2014 backend/scripts/seed_san_cristobal_fase5.py:95"}, "fullDescription": {"text": "The loop iterates a Django queryset and accesses `bd.description.strip` per row, which fires an additional database query each iteration. Add `.select_related('<fk_field>')` for FK / O2O relations or `.prefetch_related('<m2m_or_reverse>')` for many-related lookups, to load everything in 1-2 queries instead of N."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-652ef0ac8d7caaed", "name": "Likely N+1 query: `for bd in \u2026` triggers a query per row \u2014 backend/scripts/import_estudio_excel.py:967", "shortDescription": {"text": "Likely N+1 query: `for bd in \u2026` triggers a query per row \u2014 backend/scripts/import_estudio_excel.py:967"}, "fullDescription": {"text": "The loop iterates a Django queryset and accesses `bd.description.strip` per row, which fires an additional database query each iteration. Add `.select_related('<fk_field>')` for FK / O2O relations or `.prefetch_related('<m2m_or_reverse>')` for many-related lookups, to load everything in 1-2 queries instead of N."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-97808ac17c2fac38", "name": "Likely N+1 query: `for quote in \u2026` triggers a query per row \u2014 backend/core/management/commands/load_dummy_data.py:1231", "shortDescription": {"text": "Likely N+1 query: `for quote in \u2026` triggers a query per row \u2014 backend/core/management/commands/load_dummy_data.py:1231"}, "fullDescription": {"text": "The loop iterates a Django queryset and accesses `quote.name.replace` per row, which fires an additional database query each iteration. Add `.select_related('<fk_field>')` for FK / O2O relations or `.prefetch_related('<m2m_or_reverse>')` for many-related lookups, to load everything in 1-2 queries instead of N."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-6ce53d718dbedc43", "name": "Likely N+1 query: `for order in \u2026` triggers a query per row \u2014 backend/core/management/commands/load_dummy_data.py:1293", "shortDescription": {"text": "Likely N+1 query: `for order in \u2026` triggers a query per row \u2014 backend/core/management/commands/load_dummy_data.py:1293"}, "fullDescription": {"text": "The loop iterates a Django queryset and accesses `order.name.replace` per row, which fires an additional database query each iteration. Add `.select_related('<fk_field>')` for FK / O2O relations or `.prefetch_related('<m2m_or_reverse>')` for many-related lookups, to load everything in 1-2 queries instead of N."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-0721cd8742214220", "name": "Likely N+1 query: `for act in \u2026` triggers a query per row \u2014 backend/apps/agents/engines/meeting_prep.py:183", "shortDescription": {"text": "Likely N+1 query: `for act in \u2026` triggers a query per row \u2014 backend/apps/agents/engines/meeting_prep.py:183"}, "fullDescription": {"text": "The loop iterates a Django queryset and accesses `act.createdon.isoformat` per row, which fires an additional database query each iteration. Add `.select_related('<fk_field>')` for FK / O2O relations or `.prefetch_related('<m2m_or_reverse>')` for many-related lookups, to load everything in 1-2 queries instead of N."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-6c18f7ab9e70af9d", "name": "Likely N+1 query: `for assignment in \u2026` triggers a query per row \u2014 backend/apps/agents/engines/project_staffing.py:72", "shortDescription": {"text": "Likely N+1 query: `for assignment in \u2026` triggers a query per row \u2014 backend/apps/agents/engines/project_staffing.py:72"}, "fullDescription": {"text": "The loop iterates a Django queryset and accesses `assignment.projectid.name` per row, which fires an additional database query each iteration. Add `.select_related('<fk_field>')` for FK / O2O relations or `.prefetch_related('<m2m_or_reverse>')` for many-related lookups, to load everything in 1-2 queries instead of N."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-f136019563b758ec", "name": "Likely N+1 query: `for user in \u2026` triggers a query per row \u2014 backend/apps/agents/engines/permission_anomaly.py:94", "shortDescription": {"text": "Likely N+1 query: `for user in \u2026` triggers a query per row \u2014 backend/apps/agents/engines/permission_anomaly.py:94"}, "fullDescription": {"text": "The loop iterates a Django queryset and accesses `user.lastlogindate.isoformat` per row, which fires an additional database query each iteration. Add `.select_related('<fk_field>')` for FK / O2O relations or `.prefetch_related('<m2m_or_reverse>')` for many-related lookups, to load everything in 1-2 queries instead of N."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-b17f96bdc842065e", "name": "Likely N+1 query: `for user in \u2026` triggers a query per row \u2014 backend/apps/agents/engines/permission_anomaly.py:154", "shortDescription": {"text": "Likely N+1 query: `for user in \u2026` triggers a query per row \u2014 backend/apps/agents/engines/permission_anomaly.py:154"}, "fullDescription": {"text": "The loop iterates a Django queryset and accesses `user.securityroleid.name` per row, which fires an additional database query each iteration. Add `.select_related('<fk_field>')` for FK / O2O relations or `.prefetch_related('<m2m_or_reverse>')` for many-related lookups, to load everything in 1-2 queries instead of N."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-151f5a1f66d85e76", "name": "Likely N+1 query: `for user in \u2026` triggers a query per row \u2014 backend/apps/agents/engines/permission_anomaly.py:176", "shortDescription": {"text": "Likely N+1 query: `for user in \u2026` triggers a query per row \u2014 backend/apps/agents/engines/permission_anomaly.py:176"}, "fullDescription": {"text": "The loop iterates a Django queryset and accesses `user.securityroleid.name` per row, which fires an additional database query each iteration. Add `.select_related('<fk_field>')` for FK / O2O relations or `.prefetch_related('<m2m_or_reverse>')` for many-related lookups, to load everything in 1-2 queries instead of N."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-f6259bed8e0a4516", "name": "Likely N+1 query: `for opp in \u2026` triggers a query per row \u2014 backend/apps/agents/engines/pipeline_forecast.py:104", "shortDescription": {"text": "Likely N+1 query: `for opp in \u2026` triggers a query per row \u2014 backend/apps/agents/engines/pipeline_forecast.py:104"}, "fullDescription": {"text": "The loop iterates a Django queryset and accesses `opp.createdon.date` per row, which fires an additional database query each iteration. Add `.select_related('<fk_field>')` for FK / O2O relations or `.prefetch_related('<m2m_or_reverse>')` for many-related lookups, to load everything in 1-2 queries instead of N."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-4a5387cd1ad4d92d", "name": "Likely N+1 query: `for opp in \u2026` triggers a query per row \u2014 backend/apps/agents/engines/pipeline_forecast.py:139", "shortDescription": {"text": "Likely N+1 query: `for opp in \u2026` triggers a query per row \u2014 backend/apps/agents/engines/pipeline_forecast.py:139"}, "fullDescription": {"text": "The loop iterates a Django queryset and accesses `opp.ownerid.fullname` per row, which fires an additional database query each iteration. Add `.select_related('<fk_field>')` for FK / O2O relations or `.prefetch_related('<m2m_or_reverse>')` for many-related lookups, to load everything in 1-2 queries instead of N."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-7a7904ac21030f33", "name": "Likely N+1 query: `for absence in \u2026` triggers a query per row \u2014 backend/apps/agents/engines/attendance_anomaly.py:98", "shortDescription": {"text": "Likely N+1 query: `for absence in \u2026` triggers a query per row \u2014 backend/apps/agents/engines/attendance_anomaly.py:98"}, "fullDescription": {"text": "The loop iterates a Django queryset and accesses `absence.attendancedate.strftime` per row, which fires an additional database query each iteration. Add `.select_related('<fk_field>')` for FK / O2O relations or `.prefetch_related('<m2m_or_reverse>')` for many-related lookups, to load everything in 1-2 queries instead of N."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-378fea9626925c65", "name": "Likely N+1 query: `for log in \u2026` triggers a query per row \u2014 backend/apps/agents/engines/audit_compliance.py:99", "shortDescription": {"text": "Likely N+1 query: `for log in \u2026` triggers a query per row \u2014 backend/apps/agents/engines/audit_compliance.py:99"}, "fullDescription": {"text": "The loop iterates a Django queryset and accesses `log.timestamp.hour` per row, which fires an additional database query each iteration. Add `.select_related('<fk_field>')` for FK / O2O relations or `.prefetch_related('<m2m_or_reverse>')` for many-related lookups, to load everything in 1-2 queries instead of N."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-6ebff27170cb7a6c", "name": "Likely N+1 query: `for log in \u2026` triggers a query per row \u2014 backend/apps/agents/engines/audit_compliance.py:171", "shortDescription": {"text": "Likely N+1 query: `for log in \u2026` triggers a query per row \u2014 backend/apps/agents/engines/audit_compliance.py:171"}, "fullDescription": {"text": "The loop iterates a Django queryset and accesses `log.timestamp.isoformat` per row, which fires an additional database query each iteration. Add `.select_related('<fk_field>')` for FK / O2O relations or `.prefetch_related('<m2m_or_reverse>')` for many-related lookups, to load everything in 1-2 queries instead of N."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-d91c99db33da2ed1", "name": "Likely N+1 query: `for provision in \u2026` triggers a query per row \u2014 backend/apps/agents/engines/provision_reconciliation.p", "shortDescription": {"text": "Likely N+1 query: `for provision in \u2026` triggers a query per row \u2014 backend/apps/agents/engines/provision_reconciliation.py:51"}, "fullDescription": {"text": "The loop iterates a Django queryset and accesses `provision.createdon.date` per row, which fires an additional database query each iteration. Add `.select_related('<fk_field>')` for FK / O2O relations or `.prefetch_related('<m2m_or_reverse>')` for many-related lookups, to load everything in 1-2 queries instead of N."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-f824e81afff81d49", "name": "Likely N+1 query: `for entry in \u2026` triggers a query per row \u2014 backend/apps/agents/engines/payroll_validation.py:148", "shortDescription": {"text": "Likely N+1 query: `for entry in \u2026` triggers a query per row \u2014 backend/apps/agents/engines/payroll_validation.py:148"}, "fullDescription": {"text": "The loop iterates a Django queryset and accesses `entry.employeeid.employeeid` per row, which fires an additional database query each iteration. Add `.select_related('<fk_field>')` for FK / O2O relations or `.prefetch_related('<m2m_or_reverse>')` for many-related lookups, to load everything in 1-2 queries instead of N."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-c5080c921f2fba90", "name": "Commented-code block (6 lines) in backend/apps/machinery/services.py:930", "shortDescription": {"text": "Commented-code block (6 lines) in backend/apps/machinery/services.py:930"}, "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-6adfd6dc8f3d35b6", "name": "Commented-code block (6 lines) in backend/apps/machinery/tests/test_conciliation_workflow.py:98", "shortDescription": {"text": "Commented-code block (6 lines) in backend/apps/machinery/tests/test_conciliation_workflow.py:98"}, "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-a882f04046ad7ac7", "name": "Legacy-named symbol `test_create_budget_creates_v1` in backend/apps/corporate/tests/test_services.py:36", "shortDescription": {"text": "Legacy-named symbol `test_create_budget_creates_v1` in backend/apps/corporate/tests/test_services.py:36"}, "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-a673033b82dde621", "name": "Commented-code block (9 lines) in backend/apps/expenses/management/commands/import_sym_kabat.py:608", "shortDescription": {"text": "Commented-code block (9 lines) in backend/apps/expenses/management/commands/import_sym_kabat.py:608"}, "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-9a49440e7d004670", "name": "Legacy-named symbol `needs_old` in backend/apps/audit/services.py:232", "shortDescription": {"text": "Legacy-named symbol `needs_old` in backend/apps/audit/services.py:232"}, "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-84bde51857d9fb2b", "name": "Likely N+1 query: `for model in \u2026` triggers a query per row \u2014 backend/apps/audit/services.py:240", "shortDescription": {"text": "Likely N+1 query: `for model in \u2026` triggers a query per row \u2014 backend/apps/audit/services.py:240"}, "fullDescription": {"text": "The loop iterates a Django queryset and accesses `model._meta.pk` per row, which fires an additional database query each iteration. Add `.select_related('<fk_field>')` for FK / O2O relations or `.prefetch_related('<m2m_or_reverse>')` for many-related lookups, to load everything in 1-2 queries instead of N."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-20342ddb8d039c1c", "name": "Likely N+1 query: `for exp in \u2026` triggers a query per row \u2014 backend/apps/invoiceinbox/services.py:370", "shortDescription": {"text": "Likely N+1 query: `for exp in \u2026` triggers a query per row \u2014 backend/apps/invoiceinbox/services.py:370"}, "fullDescription": {"text": "The loop iterates a Django queryset and accesses `exp.projectid.name` per row, which fires an additional database query each iteration. Add `.select_related('<fk_field>')` for FK / O2O relations or `.prefetch_related('<m2m_or_reverse>')` for many-related lookups, to load everything in 1-2 queries instead of N."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-7547f8f869bf70fd", "name": "Likely N+1 query: `for exp in \u2026` triggers a query per row \u2014 backend/apps/invoiceinbox/services.py:388", "shortDescription": {"text": "Likely N+1 query: `for exp in \u2026` triggers a query per row \u2014 backend/apps/invoiceinbox/services.py:388"}, "fullDescription": {"text": "The loop iterates a Django queryset and accesses `exp.projectid.name` per row, which fires an additional database query each iteration. Add `.select_related('<fk_field>')` for FK / O2O relations or `.prefetch_related('<m2m_or_reverse>')` for many-related lookups, to load everything in 1-2 queries instead of N."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-dcec279757b9447b", "name": "Likely N+1 query: `for exp in \u2026` triggers a query per row \u2014 backend/apps/invoiceinbox/services.py:410", "shortDescription": {"text": "Likely N+1 query: `for exp in \u2026` triggers a query per row \u2014 backend/apps/invoiceinbox/services.py:410"}, "fullDescription": {"text": "The loop iterates a Django queryset and accesses `exp.projectid.name` per row, which fires an additional database query each iteration. Add `.select_related('<fk_field>')` for FK / O2O relations or `.prefetch_related('<m2m_or_reverse>')` for many-related lookups, to load everything in 1-2 queries instead of N."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-8aa284819ef4f7c0", "name": "Legacy-named symbol `_adapt_v1_to_v2` in backend/apps/proyeccion/versioning.py:28", "shortDescription": {"text": "Legacy-named symbol `_adapt_v1_to_v2` in backend/apps/proyeccion/versioning.py:28"}, "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-f78b9fdd5c4d802b", "name": "Commented-code block (8 lines) in backend/apps/proyeccion/services.py:3772", "shortDescription": {"text": "Commented-code block (8 lines) in backend/apps/proyeccion/services.py:3772"}, "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-7e4fd9a6d35ddd79", "name": "Likely N+1 query: `for bd in \u2026` triggers a query per row \u2014 backend/apps/proyeccion/services.py:2112", "shortDescription": {"text": "Likely N+1 query: `for bd in \u2026` triggers a query per row \u2014 backend/apps/proyeccion/services.py:2112"}, "fullDescription": {"text": "The loop iterates a Django queryset and accesses `bd.supplyid.supplyid` per row, which fires an additional database query each iteration. Add `.select_related('<fk_field>')` for FK / O2O relations or `.prefetch_related('<m2m_or_reverse>')` for many-related lookups, to load everything in 1-2 queries instead of N."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-871a1044d9ca1c73", "name": "Legacy-named symbol `include_copy` in backend/apps/proyeccion/management/commands/import_historical_pu.py:97", "shortDescription": {"text": "Legacy-named symbol `include_copy` in backend/apps/proyeccion/management/commands/import_historical_pu.py:97"}, "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-3afadec840a4843b", "name": "Stub function `noop_reverse` (body is just `pass`/`return`) \u2014 backend/apps/proyeccion/migrations/0023_unify_external_int", "shortDescription": {"text": "Stub function `noop_reverse` (body is just `pass`/`return`) \u2014 backend/apps/proyeccion/migrations/0023_unify_external_into_indirect.py:34"}, "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-4dd1c795114e39d6", "name": "Commented-code block (7 lines) in backend/apps/activities/matching_service.py:145", "shortDescription": {"text": "Commented-code block (7 lines) in backend/apps/activities/matching_service.py:145"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-68da84deba555592", "name": "Likely N+1 query: `for opp in \u2026` triggers a query per row \u2014 backend/apps/activities/matching_service.py:282", "shortDescription": {"text": "Likely N+1 query: `for opp in \u2026` triggers a query per row \u2014 backend/apps/activities/matching_service.py:282"}, "fullDescription": {"text": "The loop iterates a Django queryset and accesses `opp.modifiedon.isoformat` per row, which fires an additional database query each iteration. Add `.select_related('<fk_field>')` for FK / O2O relations or `.prefetch_related('<m2m_or_reverse>')` for many-related lookups, to load everything in 1-2 queries instead of N."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-892ae0a63650b29d", "name": "Legacy-named symbol `unpaid_old` in backend/apps/projects/services.py:801", "shortDescription": {"text": "Legacy-named symbol `unpaid_old` in backend/apps/projects/services.py:801"}, "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-04cfca7248edbc03", "name": "Commented-code block (6 lines) in backend/crm/settings.py:324", "shortDescription": {"text": "Commented-code block (6 lines) in backend/crm/settings.py:324"}, "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-1b5a76780c3df9aa", "name": "1 env vars used in code but missing from .env.example", "shortDescription": {"text": "1 env vars used in code but missing from .env.example"}, "fullDescription": {"text": "Drift between code and config docs. The first few: `DEBUG_USER_EMAIL`. 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:\nbackend/scripts/seed_san_cristobal_fase8.py:to_int, backend/scripts/import_estudio_excel.py:to_int\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-49c98f7cedd9c977", "name": "Near-duplicate function bodies in 4 places", "shortDescription": {"text": "Near-duplicate function bodies in 4 places"}, "fullDescription": {"text": "Functions with the same first-5-line body hash:\nbackend/scripts/seed_san_cristobal_fase8.py:read_sheet, backend/scripts/seed_san_cristobal_fase3.py:read_sheet, backend/scripts/seed_san_cristobal_fase4.py:read_sheet, backend/scripts/seed_san_cristobal_fase6.py:read_sheet\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:\nbackend/scripts/seed_san_cristobal_fase3.py:to_decimal, backend/scripts/seed_san_cristobal_fase2.py:to_decimal, backend/scripts/seed_san_cristobal_fase4.py:to_decimal\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:\nbackend/apps/opportunities/admin.py:save_model, backend/apps/users/admin.py:save_model, backend/apps/contacts/admin.py:save_model, backend/apps/accounts/admin.py:save_model\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-380b7cb95b387b9c", "name": "Near-duplicate function bodies in 11 places", "shortDescription": {"text": "Near-duplicate function bodies in 11 places"}, "fullDescription": {"text": "Functions with the same first-5-line body hash:\nbackend/apps/opportunities/schemas.py:resolve_state_name, backend/apps/leads/schemas.py:resolve_state_name, backend/apps/leads/schemas.py:resolve_state_name, backend/apps/contacts/schemas.py:resolve_state_name\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-76a2f6818267a9a8", "name": "Near-duplicate function bodies in 8 places", "shortDescription": {"text": "Near-duplicate function bodies in 8 places"}, "fullDescription": {"text": "Functions with the same first-5-line body hash:\nbackend/apps/opportunities/schemas.py:resolve_customerid, backend/apps/orders/schemas.py:resolve_customerid, backend/apps/orders/schemas.py:resolve_customerid, backend/apps/quotes/schemas.py:resolve_customerid\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-9dad557909b86499", "name": "Near-duplicate function bodies in 10 places", "shortDescription": {"text": "Near-duplicate function bodies in 10 places"}, "fullDescription": {"text": "Functions with the same first-5-line body hash:\nbackend/apps/machinery/schemas.py:resolve_ownername, backend/apps/machinery/schemas.py:resolve_ownername, backend/apps/machinery/schemas.py:resolve_ownername, backend/apps/machinery/schemas.py:resolve_ownername\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/24838"}, "properties": {"repository": "carlosmega/erp_constructoras_backend", "repoUrl": "https://github.com/carlosmega/erp_constructoras_backend", "branch": "main"}, "results": [{"ruleId": "scanner-fea197493103d79e", "level": "note", "message": {"text": "Possibly dead Python function: is_num"}, "properties": {"repobilityId": "c275c624b1197203", "scanner": "scanner-primary", "fingerprint": "fea197493103d79e", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/scripts/seed_san_cristobal_fase2.py:50"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-35eca29a22aeab2a", "level": "note", "message": {"text": "Possibly dead Python function: run_fase_1"}, "properties": {"repobilityId": "a7b16c1cb8020753", "scanner": "scanner-primary", "fingerprint": "35eca29a22aeab2a", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/scripts/import_estudio_excel.py:294"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-d35e266f70d1b0df", "level": "note", "message": {"text": "Possibly dead Python function: run_fase_2"}, "properties": {"repobilityId": "6058efac3774cc96", "scanner": "scanner-primary", "fingerprint": "d35e266f70d1b0df", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/scripts/import_estudio_excel.py:505"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-df1844a22452bf9c", "level": "note", "message": {"text": "Possibly dead Python function: run_fase_3"}, "properties": {"repobilityId": "fc0268ac0db45f5c", "scanner": "scanner-primary", "fingerprint": "df1844a22452bf9c", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/scripts/import_estudio_excel.py:718"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-cdfd583d3d32cd7b", "level": "note", "message": {"text": "Possibly dead Python function: run_fase_4"}, "properties": {"repobilityId": "5cdf23a91fda2b0c", "scanner": "scanner-primary", "fingerprint": "cdfd583d3d32cd7b", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/scripts/import_estudio_excel.py:884"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-6136e04faab14588", "level": "note", "message": {"text": "Possibly dead Python function: run_fase_5"}, "properties": {"repobilityId": "78526778e88e1fbd", "scanner": "scanner-primary", "fingerprint": "6136e04faab14588", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/scripts/import_estudio_excel.py:942"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-5128093e80f16af7", "level": "note", "message": {"text": "Possibly dead Python function: run_fase_6"}, "properties": {"repobilityId": "9e53cc3915b087c0", "scanner": "scanner-primary", "fingerprint": "5128093e80f16af7", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/scripts/import_estudio_excel.py:1038"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-9563828e45b6e2d8", "level": "note", "message": {"text": "Possibly dead Python function: run_fase_7"}, "properties": {"repobilityId": "600250afbea7a927", "scanner": "scanner-primary", "fingerprint": "9563828e45b6e2d8", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/scripts/import_estudio_excel.py:1121"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-b171ab4ff9765197", "level": "note", "message": {"text": "Possibly dead Python function: run_fase_8"}, "properties": {"repobilityId": "f17736e2e2a1a106", "scanner": "scanner-primary", "fingerprint": "b171ab4ff9765197", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/scripts/import_estudio_excel.py:1162"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-dac40f37552e7d8f", "level": "note", "message": {"text": "Possibly dead Python function: col_letter_to_idx"}, "properties": {"repobilityId": "7a8ef273022c2946", "scanner": "scanner-primary", "fingerprint": "dac40f37552e7d8f", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/scripts/seed_san_cristobal_fase6.py:58"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-2380ea4a70db02b9", "level": "note", "message": {"text": "Possibly dead Python function: register_agent"}, "properties": {"repobilityId": "b7552b70fdc18a2e", "scanner": "scanner-primary", "fingerprint": "2380ea4a70db02b9", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/apps/agents/services.py:36"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-13e6a4f6177bc1ab", "level": "note", "message": {"text": "Possibly dead Python function: decorator"}, "properties": {"repobilityId": "ffbcbc9bc189af1c", "scanner": "scanner-primary", "fingerprint": "13e6a4f6177bc1ab", "layer": "software", "severity": "low", "confidence": 1.0, "tags": ["dead-code"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/apps/audit/services.py:207"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-808e225dda86e4e2", "level": "error", "message": {"text": "Possible secret in backend/apps/users/management/commands/setup_e2e_user.py"}, "properties": {"repobilityId": "fac48a1f19ddc237", "scanner": "scanner-primary", "fingerprint": "808e225dda86e4e2", "layer": "security", "severity": "critical", "confidence": 1.0, "tags": ["secrets"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/apps/users/management/commands/setup_e2e_user.py"}, "region": {"startLine": 20}}}]}, {"ruleId": "scanner-1a50467f36b413ec", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "926b5aa2fc342af4", "scanner": "scanner-primary", "fingerprint": "1a50467f36b413ec", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/tests.yml"}, "region": {"startLine": 21}}}]}, {"ruleId": "scanner-1a50467f36b413ec", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "926b5aa2fc342af4", "scanner": "scanner-primary", "fingerprint": "1a50467f36b413ec", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/tests.yml"}, "region": {"startLine": 47}}}]}, {"ruleId": "scanner-1a50467f36b413ec", "level": "note", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "b34e143cdd267736", "scanner": "scanner-primary", "fingerprint": "1a50467f36b413ec", "layer": "cicd", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/tests.yml"}, "region": {"startLine": 63}}}]}, {"ruleId": "scanner-d8c462d2a3cfc550", "level": "note", "message": {"text": "Very large file: backend/scripts/import_estudio_excel.py (1517 lines)"}, "properties": {"repobilityId": "e39517d41e174367", "scanner": "scanner-primary", "fingerprint": "d8c462d2a3cfc550", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-035705e471b359a5", "level": "note", "message": {"text": "Very large file: backend/core/tests/test_rbac_matrix.py (1198 lines)"}, "properties": {"repobilityId": "95f4568fffcdcaf5", "scanner": "scanner-primary", "fingerprint": "035705e471b359a5", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-1731e4138e5c866a", "level": "note", "message": {"text": "Very large file: backend/core/management/commands/load_dummy_data.py (1545 lines)"}, "properties": {"repobilityId": "6f92d5ba76b0f1bb", "scanner": "scanner-primary", "fingerprint": "1731e4138e5c866a", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-b257c9a47463d0cd", "level": "note", "message": {"text": "Very large file: backend/apps/proyeccion/routers.py (1777 lines)"}, "properties": {"repobilityId": "be21b9a356a278aa", "scanner": "scanner-primary", "fingerprint": "b257c9a47463d0cd", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-c29ea1ad5dfcffff", "level": "note", "message": {"text": "Very large file: backend/apps/proyeccion/models.py (1803 lines)"}, "properties": {"repobilityId": "6432a4656772d4bd", "scanner": "scanner-primary", "fingerprint": "c29ea1ad5dfcffff", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-1efab6b2e33d75f8", "level": "note", "message": {"text": "Very large file: backend/apps/proyeccion/services.py (6430 lines)"}, "properties": {"repobilityId": "e57c7fe001adbdd5", "scanner": "scanner-primary", "fingerprint": "1efab6b2e33d75f8", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-f9473d0f28799df6", "level": "note", "message": {"text": "Very large file: backend/apps/proyeccion/tests/test_services.py (2162 lines)"}, "properties": {"repobilityId": "e72ff4dbfe8ebff1", "scanner": "scanner-primary", "fingerprint": "f9473d0f28799df6", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-2da0e79ec7291e9b", "level": "note", "message": {"text": "Very large file: backend/apps/products/management/commands/generate_dummy_products.py (1530 lines)"}, "properties": {"repobilityId": "c46487e11b5e3fab", "scanner": "scanner-primary", "fingerprint": "2da0e79ec7291e9b", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-141b30a41e03817b", "level": "note", "message": {"text": "No license file detected"}, "properties": {"repobilityId": "92364aa7bf573f66", "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": "9d6adc1bc6f2a7f8", "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": "fe019b670fa9d42f", "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": "8c53960886489a1e", "scanner": "scanner-primary", "fingerprint": "2d0c7b7ab8f8aacf", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["placeholder", "mock-data", "critical-flow", "generated-repo-pattern"]}}, {"ruleId": "scanner-749d4bc1bd66df5f", "level": "warning", "message": {"text": "Agent instructions exist but release-hardening basics are missing"}, "properties": {"repobilityId": "2cbae15c15e3e795", "scanner": "scanner-primary", "fingerprint": "749d4bc1bd66df5f", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "repo-hardening", "generated-repo-pattern"]}}, {"ruleId": "scanner-d750434f01b5fa77", "level": "warning", "message": {"text": "Agent authority lacks a verifier contract: .claude/commands/speckit.checklist.md"}, "properties": {"repobilityId": "490b975dd58ca941", "scanner": "scanner-primary", "fingerprint": "d750434f01b5fa77", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "verification", "claude_instruction"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".claude/commands/speckit.checklist.md"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-abe388630798be6c", "level": "warning", "message": {"text": "Agent authority lacks a verifier contract: .claude/commands/speckit.clarify.md"}, "properties": {"repobilityId": "f2dd5747f05d2b9f", "scanner": "scanner-primary", "fingerprint": "abe388630798be6c", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "verification", "claude_instruction"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".claude/commands/speckit.clarify.md"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-2882da8270959730", "level": "warning", "message": {"text": "Agent authority lacks a verifier contract: .claude/commands/speckit.plan.md"}, "properties": {"repobilityId": "e3b80b5ed1a4169d", "scanner": "scanner-primary", "fingerprint": "2882da8270959730", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "verification", "claude_instruction"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".claude/commands/speckit.plan.md"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-6b0fa4b05bfb2b24", "level": "warning", "message": {"text": "Agent authority lacks a verifier contract: .claude/commands/speckit.taskstoissues.md"}, "properties": {"repobilityId": "25a2f2db8174b383", "scanner": "scanner-primary", "fingerprint": "6b0fa4b05bfb2b24", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["agent-instructions", "verification", "claude_instruction"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".claude/commands/speckit.taskstoissues.md"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-9b0af7bab915e880", "level": "warning", "message": {"text": "Likely N+1 query: `for bd in \u2026` triggers a query per row \u2014 backend/scripts/seed_san_cristobal_fase5.py:95"}, "properties": {"repobilityId": "e4873e11ec18f5ed", "scanner": "scanner-primary", "fingerprint": "9b0af7bab915e880", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "n-plus-one", "performance"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/scripts/seed_san_cristobal_fase5.py"}, "region": {"startLine": 95}}}]}, {"ruleId": "scanner-652ef0ac8d7caaed", "level": "warning", "message": {"text": "Likely N+1 query: `for bd in \u2026` triggers a query per row \u2014 backend/scripts/import_estudio_excel.py:967"}, "properties": {"repobilityId": "03e0d2ebe436c686", "scanner": "scanner-primary", "fingerprint": "652ef0ac8d7caaed", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "n-plus-one", "performance"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/scripts/import_estudio_excel.py"}, "region": {"startLine": 967}}}]}, {"ruleId": "scanner-97808ac17c2fac38", "level": "warning", "message": {"text": "Likely N+1 query: `for quote in \u2026` triggers a query per row \u2014 backend/core/management/commands/load_dummy_data.py:1231"}, "properties": {"repobilityId": "541cf19c30cd51c3", "scanner": "scanner-primary", "fingerprint": "97808ac17c2fac38", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "n-plus-one", "performance"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/core/management/commands/load_dummy_data.py"}, "region": {"startLine": 1231}}}]}, {"ruleId": "scanner-6ce53d718dbedc43", "level": "warning", "message": {"text": "Likely N+1 query: `for order in \u2026` triggers a query per row \u2014 backend/core/management/commands/load_dummy_data.py:1293"}, "properties": {"repobilityId": "30fac33cb091d92b", "scanner": "scanner-primary", "fingerprint": "6ce53d718dbedc43", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "n-plus-one", "performance"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/core/management/commands/load_dummy_data.py"}, "region": {"startLine": 1293}}}]}, {"ruleId": "scanner-0721cd8742214220", "level": "warning", "message": {"text": "Likely N+1 query: `for act in \u2026` triggers a query per row \u2014 backend/apps/agents/engines/meeting_prep.py:183"}, "properties": {"repobilityId": "cec54079624930b0", "scanner": "scanner-primary", "fingerprint": "0721cd8742214220", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "n-plus-one", "performance"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/apps/agents/engines/meeting_prep.py"}, "region": {"startLine": 183}}}]}, {"ruleId": "scanner-6c18f7ab9e70af9d", "level": "warning", "message": {"text": "Likely N+1 query: `for assignment in \u2026` triggers a query per row \u2014 backend/apps/agents/engines/project_staffing.py:72"}, "properties": {"repobilityId": "aa3df7c6f30028c8", "scanner": "scanner-primary", "fingerprint": "6c18f7ab9e70af9d", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "n-plus-one", "performance"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/apps/agents/engines/project_staffing.py"}, "region": {"startLine": 72}}}]}, {"ruleId": "scanner-f136019563b758ec", "level": "warning", "message": {"text": "Likely N+1 query: `for user in \u2026` triggers a query per row \u2014 backend/apps/agents/engines/permission_anomaly.py:94"}, "properties": {"repobilityId": "786a0fca1534ff57", "scanner": "scanner-primary", "fingerprint": "f136019563b758ec", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "n-plus-one", "performance"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/apps/agents/engines/permission_anomaly.py"}, "region": {"startLine": 94}}}]}, {"ruleId": "scanner-b17f96bdc842065e", "level": "warning", "message": {"text": "Likely N+1 query: `for user in \u2026` triggers a query per row \u2014 backend/apps/agents/engines/permission_anomaly.py:154"}, "properties": {"repobilityId": "370886aa73632f65", "scanner": "scanner-primary", "fingerprint": "b17f96bdc842065e", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "n-plus-one", "performance"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/apps/agents/engines/permission_anomaly.py"}, "region": {"startLine": 154}}}]}, {"ruleId": "scanner-151f5a1f66d85e76", "level": "warning", "message": {"text": "Likely N+1 query: `for user in \u2026` triggers a query per row \u2014 backend/apps/agents/engines/permission_anomaly.py:176"}, "properties": {"repobilityId": "acfc196f8e600da9", "scanner": "scanner-primary", "fingerprint": "151f5a1f66d85e76", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "n-plus-one", "performance"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/apps/agents/engines/permission_anomaly.py"}, "region": {"startLine": 176}}}]}, {"ruleId": "scanner-f6259bed8e0a4516", "level": "warning", "message": {"text": "Likely N+1 query: `for opp in \u2026` triggers a query per row \u2014 backend/apps/agents/engines/pipeline_forecast.py:104"}, "properties": {"repobilityId": "b3a242c0b66b2da7", "scanner": "scanner-primary", "fingerprint": "f6259bed8e0a4516", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "n-plus-one", "performance"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/apps/agents/engines/pipeline_forecast.py"}, "region": {"startLine": 104}}}]}, {"ruleId": "scanner-4a5387cd1ad4d92d", "level": "warning", "message": {"text": "Likely N+1 query: `for opp in \u2026` triggers a query per row \u2014 backend/apps/agents/engines/pipeline_forecast.py:139"}, "properties": {"repobilityId": "a8e0ddd981eecf44", "scanner": "scanner-primary", "fingerprint": "4a5387cd1ad4d92d", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "n-plus-one", "performance"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/apps/agents/engines/pipeline_forecast.py"}, "region": {"startLine": 139}}}]}, {"ruleId": "scanner-7a7904ac21030f33", "level": "warning", "message": {"text": "Likely N+1 query: `for absence in \u2026` triggers a query per row \u2014 backend/apps/agents/engines/attendance_anomaly.py:98"}, "properties": {"repobilityId": "5f4cafd3aeccecb8", "scanner": "scanner-primary", "fingerprint": "7a7904ac21030f33", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "n-plus-one", "performance"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/apps/agents/engines/attendance_anomaly.py"}, "region": {"startLine": 98}}}]}, {"ruleId": "scanner-378fea9626925c65", "level": "warning", "message": {"text": "Likely N+1 query: `for log in \u2026` triggers a query per row \u2014 backend/apps/agents/engines/audit_compliance.py:99"}, "properties": {"repobilityId": "16dca1a5ed655bcc", "scanner": "scanner-primary", "fingerprint": "378fea9626925c65", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "n-plus-one", "performance"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/apps/agents/engines/audit_compliance.py"}, "region": {"startLine": 99}}}]}, {"ruleId": "scanner-6ebff27170cb7a6c", "level": "warning", "message": {"text": "Likely N+1 query: `for log in \u2026` triggers a query per row \u2014 backend/apps/agents/engines/audit_compliance.py:171"}, "properties": {"repobilityId": "0d55b4335deb5569", "scanner": "scanner-primary", "fingerprint": "6ebff27170cb7a6c", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "n-plus-one", "performance"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/apps/agents/engines/audit_compliance.py"}, "region": {"startLine": 171}}}]}, {"ruleId": "scanner-d91c99db33da2ed1", "level": "warning", "message": {"text": "Likely N+1 query: `for provision in \u2026` triggers a query per row \u2014 backend/apps/agents/engines/provision_reconciliation.py:51"}, "properties": {"repobilityId": "fb55bde702aa9242", "scanner": "scanner-primary", "fingerprint": "d91c99db33da2ed1", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "n-plus-one", "performance"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/apps/agents/engines/provision_reconciliation.py"}, "region": {"startLine": 51}}}]}, {"ruleId": "scanner-f824e81afff81d49", "level": "warning", "message": {"text": "Likely N+1 query: `for entry in \u2026` triggers a query per row \u2014 backend/apps/agents/engines/payroll_validation.py:148"}, "properties": {"repobilityId": "07f885ef390bca7d", "scanner": "scanner-primary", "fingerprint": "f824e81afff81d49", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "n-plus-one", "performance"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/apps/agents/engines/payroll_validation.py"}, "region": {"startLine": 148}}}]}, {"ruleId": "scanner-c5080c921f2fba90", "level": "none", "message": {"text": "Commented-code block (6 lines) in backend/apps/machinery/services.py:930"}, "properties": {"repobilityId": "61b9e66bae83efb8", "scanner": "scanner-primary", "fingerprint": "c5080c921f2fba90", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-6adfd6dc8f3d35b6", "level": "none", "message": {"text": "Commented-code block (6 lines) in backend/apps/machinery/tests/test_conciliation_workflow.py:98"}, "properties": {"repobilityId": "bcbdf4c9f80366dc", "scanner": "scanner-primary", "fingerprint": "6adfd6dc8f3d35b6", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-a882f04046ad7ac7", "level": "note", "message": {"text": "Legacy-named symbol `test_create_budget_creates_v1` in backend/apps/corporate/tests/test_services.py:36"}, "properties": {"repobilityId": "a101cf396c53d868", "scanner": "scanner-primary", "fingerprint": "a882f04046ad7ac7", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-a673033b82dde621", "level": "none", "message": {"text": "Commented-code block (9 lines) in backend/apps/expenses/management/commands/import_sym_kabat.py:608"}, "properties": {"repobilityId": "b509c8c3e80d744d", "scanner": "scanner-primary", "fingerprint": "a673033b82dde621", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-9a49440e7d004670", "level": "note", "message": {"text": "Legacy-named symbol `needs_old` in backend/apps/audit/services.py:232"}, "properties": {"repobilityId": "6e460e7e852f01fd", "scanner": "scanner-primary", "fingerprint": "9a49440e7d004670", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-84bde51857d9fb2b", "level": "warning", "message": {"text": "Likely N+1 query: `for model in \u2026` triggers a query per row \u2014 backend/apps/audit/services.py:240"}, "properties": {"repobilityId": "31954e42be2ecb2c", "scanner": "scanner-primary", "fingerprint": "84bde51857d9fb2b", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "n-plus-one", "performance"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/apps/audit/services.py"}, "region": {"startLine": 240}}}]}, {"ruleId": "scanner-20342ddb8d039c1c", "level": "warning", "message": {"text": "Likely N+1 query: `for exp in \u2026` triggers a query per row \u2014 backend/apps/invoiceinbox/services.py:370"}, "properties": {"repobilityId": "702e86082e186072", "scanner": "scanner-primary", "fingerprint": "20342ddb8d039c1c", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "n-plus-one", "performance"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/apps/invoiceinbox/services.py"}, "region": {"startLine": 370}}}]}, {"ruleId": "scanner-7547f8f869bf70fd", "level": "warning", "message": {"text": "Likely N+1 query: `for exp in \u2026` triggers a query per row \u2014 backend/apps/invoiceinbox/services.py:388"}, "properties": {"repobilityId": "e560396d0da458f0", "scanner": "scanner-primary", "fingerprint": "7547f8f869bf70fd", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "n-plus-one", "performance"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/apps/invoiceinbox/services.py"}, "region": {"startLine": 388}}}]}, {"ruleId": "scanner-dcec279757b9447b", "level": "warning", "message": {"text": "Likely N+1 query: `for exp in \u2026` triggers a query per row \u2014 backend/apps/invoiceinbox/services.py:410"}, "properties": {"repobilityId": "9d1ea719ee3f7ef6", "scanner": "scanner-primary", "fingerprint": "dcec279757b9447b", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "n-plus-one", "performance"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/apps/invoiceinbox/services.py"}, "region": {"startLine": 410}}}]}, {"ruleId": "scanner-8aa284819ef4f7c0", "level": "note", "message": {"text": "Legacy-named symbol `_adapt_v1_to_v2` in backend/apps/proyeccion/versioning.py:28"}, "properties": {"repobilityId": "258fa23e5cda7642", "scanner": "scanner-primary", "fingerprint": "8aa284819ef4f7c0", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-f78b9fdd5c4d802b", "level": "none", "message": {"text": "Commented-code block (8 lines) in backend/apps/proyeccion/services.py:3772"}, "properties": {"repobilityId": "f981cf4c09b5ab9b", "scanner": "scanner-primary", "fingerprint": "f78b9fdd5c4d802b", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-7e4fd9a6d35ddd79", "level": "warning", "message": {"text": "Likely N+1 query: `for bd in \u2026` triggers a query per row \u2014 backend/apps/proyeccion/services.py:2112"}, "properties": {"repobilityId": "95d7bc8e0eed89d6", "scanner": "scanner-primary", "fingerprint": "7e4fd9a6d35ddd79", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "n-plus-one", "performance"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/apps/proyeccion/services.py"}, "region": {"startLine": 2112}}}]}, {"ruleId": "scanner-871a1044d9ca1c73", "level": "note", "message": {"text": "Legacy-named symbol `include_copy` in backend/apps/proyeccion/management/commands/import_historical_pu.py:97"}, "properties": {"repobilityId": "07a8194a154021ec", "scanner": "scanner-primary", "fingerprint": "871a1044d9ca1c73", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-3afadec840a4843b", "level": "note", "message": {"text": "Stub function `noop_reverse` (body is just `pass`/`return`) \u2014 backend/apps/proyeccion/migrations/0023_unify_external_into_indirect.py:34"}, "properties": {"repobilityId": "e3b5befc60533851", "scanner": "scanner-primary", "fingerprint": "3afadec840a4843b", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "empty-handler", "dead-code"]}}, {"ruleId": "scanner-4dd1c795114e39d6", "level": "none", "message": {"text": "Commented-code block (7 lines) in backend/apps/activities/matching_service.py:145"}, "properties": {"repobilityId": "04f13f3226dd61c0", "scanner": "scanner-primary", "fingerprint": "4dd1c795114e39d6", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-68da84deba555592", "level": "warning", "message": {"text": "Likely N+1 query: `for opp in \u2026` triggers a query per row \u2014 backend/apps/activities/matching_service.py:282"}, "properties": {"repobilityId": "c21170d6dd2dc4e3", "scanner": "scanner-primary", "fingerprint": "68da84deba555592", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "n-plus-one", "performance"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/apps/activities/matching_service.py"}, "region": {"startLine": 282}}}]}, {"ruleId": "scanner-892ae0a63650b29d", "level": "note", "message": {"text": "Legacy-named symbol `unpaid_old` in backend/apps/projects/services.py:801"}, "properties": {"repobilityId": "8b6de9c3f7e46d26", "scanner": "scanner-primary", "fingerprint": "892ae0a63650b29d", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-04cfca7248edbc03", "level": "none", "message": {"text": "Commented-code block (6 lines) in backend/crm/settings.py:324"}, "properties": {"repobilityId": "4f551cca10b4f6c4", "scanner": "scanner-primary", "fingerprint": "04cfca7248edbc03", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-1b5a76780c3df9aa", "level": "none", "message": {"text": "1 env vars used in code but missing from .env.example"}, "properties": {"repobilityId": "d04379b337b44a15", "scanner": "scanner-primary", "fingerprint": "1b5a76780c3df9aa", "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": "508e7be1a1ef83e6", "scanner": "scanner-primary", "fingerprint": "2c04133e54348533", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-49c98f7cedd9c977", "level": "note", "message": {"text": "Near-duplicate function bodies in 4 places"}, "properties": {"repobilityId": "86a1d3e3f47cdb74", "scanner": "scanner-primary", "fingerprint": "49c98f7cedd9c977", "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": "361de8daf7eff775", "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": "2dd22affb618e8fc", "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": "c0e4bc8bc5d30789", "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": "05de97777fab3814", "scanner": "scanner-primary", "fingerprint": "be46ea126aa5d8dc", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-49c98f7cedd9c977", "level": "note", "message": {"text": "Near-duplicate function bodies in 4 places"}, "properties": {"repobilityId": "1d7b27de1626030e", "scanner": "scanner-primary", "fingerprint": "49c98f7cedd9c977", "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": "dfdf7ef631f5ce5a", "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": "45758783a2ee1a01", "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": "bf166563dbf17afc", "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": "d8e19c5085306980", "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": "48d1ca9313a76d42", "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": "9e95a38f875bbe2f", "scanner": "scanner-primary", "fingerprint": "2c04133e54348533", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-380b7cb95b387b9c", "level": "note", "message": {"text": "Near-duplicate function bodies in 11 places"}, "properties": {"repobilityId": "c457bfb9930011d3", "scanner": "scanner-primary", "fingerprint": "380b7cb95b387b9c", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-76a2f6818267a9a8", "level": "note", "message": {"text": "Near-duplicate function bodies in 8 places"}, "properties": {"repobilityId": "bf96eb6d0215edb2", "scanner": "scanner-primary", "fingerprint": "76a2f6818267a9a8", "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": "09d2a8e0baaea149", "scanner": "scanner-primary", "fingerprint": "2c04133e54348533", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-9dad557909b86499", "level": "note", "message": {"text": "Near-duplicate function bodies in 10 places"}, "properties": {"repobilityId": "b8f28baaf66bc3c7", "scanner": "scanner-primary", "fingerprint": "9dad557909b86499", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-49c98f7cedd9c977", "level": "note", "message": {"text": "Near-duplicate function bodies in 4 places"}, "properties": {"repobilityId": "3e8b5053c66f3c07", "scanner": "scanner-primary", "fingerprint": "49c98f7cedd9c977", "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": "eaec15096a0879a3", "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": "c6271150ae693120", "scanner": "scanner-primary", "fingerprint": "2c04133e54348533", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}]}]}