Generated 2026-10-02T22:42:35+00:00 · commit 4603288a35fc5cf83e2ae707595e39746e39e485 · branch fix/risk-findings · root /Users/marshallguillory/repos/secure-code-agent · standard ISO/IEC 25010 maintainability-inspired 0-5 scale, rate-based
| Severity | Findings |
|---|---|
| Severe | 5 |
| High | 35 |
| Medium | 5 |
| Low | 0 |
| Total findings | 45 |
11 of 17 tools contributed — concerns all, depth heavy, license policy copyleft-any. Plus 8 built-in detectors.
| Source | Tier | Outcome | Version | Measurements | Findings |
|---|---|---|---|---|---|
| cohesion | analyzer | failed | — | — | — |
| eslint | analyzer | not-applicable | — | — | — |
| fortitude | analyzer | not-applicable | — | — | — |
| spotbugs | analyzer | not-applicable | — | — | — |
| interrogate | analyzer | parse-error | interrogate, version 1.7.0 | — | — |
| pylint | analyzer | parse-error | pylint 4.0.7 | — | — |
| checkstyle | analyzer | ran | Checkstyle version: 14.0.0 | 0 | 37 |
| complexipy | analyzer | ran | 7.0.1 | 1232 | 0 |
| jscpd | analyzer | ran | cpd 5.1.1 | 1 | 75 |
| lizard | analyzer | ran | 1.24.0 | 3975 | 0 |
| multimetric | analyzer | ran | usage: multimetric [-h] [--warn_compiler WARN_COMPILER] | 504 | 0 |
| mypy | analyzer | ran | mypy 2.3.1 (compiled: yes) | 0 | 0 |
| pmd | analyzer | ran | PMD 7.26.0 (8fd38edf285a33e1164f66205ebe243441db9557, 2026-06-29T08:22:36Z) | 0 | 0 |
| pydocstyle | analyzer | ran | 6.3.0 | 0 | 201 |
| radon | analyzer | ran | 6.0.1 | 118 | 0 |
| ruff | analyzer | ran | ruff 0.16.5 | 0 | 0 |
| vulture | analyzer | ran | vulture 2.16 | 0 | 0 |
| competing-libraries | built-in | ran | — | 152 | 0 |
| dead-code | built-in | ran | — | 1385 | 0 |
| declaration-size | built-in | ran | — | 1385 | 70 |
| duplicate-blocks | built-in | ran | — | 152 | 20 |
| file-size | built-in | ran | — | 152 | 20 |
| history | built-in | ran | — | 152 | 23 |
| near-duplicates | built-in | ran | — | 1385 | 1 |
| risk-patterns | built-in | ran | — | 152 | 5 |
One source only: complexity, dead-code, metrics.
A built-in detector examined these and no external tool did, so nothing corroborates them. Install a tool covering the concern to get a second opinion.
declarations measured by analyzers, completed by built-in detectors: no analyzer supplies cognitive_complexity for Go, Java, JavaScript, Ruby, so the built-in scanner supplied it for those declarations and the analyzers supplied the rest; the criterion set is complete per declaration, which is what makes the rate comparable to the rubric's.
Nothing examined: documentation, structure, style, testing, types.
These concerns are unmeasured, not clean. Install a tool that covers them, or widen analyzers.depth, to have them reported.
Analyzer children are not network-isolated. 11 external tools ran as local child processes. This agent does not transmit the audited source and opens no socket of its own, but it does not sandbox what it spawns: a third-party analyzer that reaches the network is outside what this run controls or observes. Determinism and no upload are the promise; a kernel air-gap is not.
| Recorded | Commit | Estimate | Findings |
|---|---|---|---|
| 2026-10-02T18:05:36Z | 16b46248 | 3.9 | 47 |
| 2026-10-02T21:23:10Z | 808ca7ca | 3.9 | 47 |
| 2026-10-02T21:31:16Z | 808ca7ca | 4.0 | 43 |
| 2026-10-02T21:42:02Z | bb5c9db0 | 4.0 | 43 |
| 2026-10-02T22:21:49Z | 7fb8b976 | 4.0 | 44 |
| 2026-10-02T22:35:49Z | b9f9b788 | 4.1 | 44 |
| 2026-10-02T22:45:23Z | 4603288a | 4.1 | 44 |
7 scans, 2026-10-02T18:05:36Z to 2026-10-02T22:45:23Z.
Every figure describes scans that happened; nothing forecasts.
4,030 – 68,200 USD over 12 months (base 20,460 USD), across 45 work-order item(s).
This is a scenario, not a prediction.
Assumptions:
TDD-shaped tests: detected beside 42 of 42 production source files (path pairing). Constructs: pytest in 72 file(s), unittest in 1 file(s), describe_it in 2 file(s), parametrize in 27 file(s), given_when_then in 2 file(s).
Chronology is not measured. Effectiveness is unscored unless the operator opted into suite execution.
The operator opted in to running the repository's test command; it passed.
Command: pytest
Program run: /Users/marshallguillory/.local/share/maintainability-agent/venv/bin/pytest
Coverage: no coverage reported by the run
Practice level 4 of 5 — CI holds a numeric quality gate.
| Pillar | Scope | Practice | Condition | Reading |
|---|---|---|---|---|
| readability | partial | 4 | 4.5 | healthy: enforced, and the code reflects it |
| maintainability | owned | 4 | 4.0 | healthy: enforced, and the code reflects it |
| efficiency | out-of-scope | — | — | not measured — see below |
| security | delegated | 5 | — | unverified: not graded — scanner coverage is failed; findings: no findings |
| testability | partial | 4 | 5.0 | healthy: enforced, and the code reflects it |
Not measured here, and why:
Enforcement found: linter-config, recorded-decisions, lint-in-ci, coverage-gate.
| Category | Score |
|---|---|
| modularity | 3.6 |
| reusability | 4.5 |
| analyzability | 4.1 |
| modifiability | 3.8 |
| testability | 4.6 |
| Aspect | Score |
|---|---|
| file size | 3.7 |
| declaration size | 3.6 |
| duplication | 4.5 |
| risk patterns | 3.8 |
| policy gates | 5.0 |
| test presence | 5.0 |
| dead code | 5.0 |
| near duplication | 4.5 |
| idiom consistency | 5.0 |
| documentation | 5.0 |
| churn hotspots | 3.0 |
| change coupling | 3.0 |
| knowledge concentration | 4.0 |
| test effectiveness | not measurable |
| Aspect | Why |
|---|---|
| naming quality | no static proxy survives contact; a wrong-name detector needs semantics |
| comment accuracy | comments are deliberately unparsed; staleness needs meaning, not structure |
| indirection depth | call-graph construction is not implemented for the supported languages |
| architectural coherence | no measurement distinguishes a wrong boundary from an unusual one statically |
| File | Lines | Status |
|---|---|---|
docs/decisions.md | 1857 | fail |
src/secure_code_audit/cli.py | 1577 | fail |
CHANGELOG.md | 1391 | fail |
src/secure_code_audit/scoring.py | 951 | fail |
src/secure_code_audit/standards.py | 705 | warn |
tests/unit/test_calibrate.py | 698 | warn |
src/secure_code_audit/config.py | 677 | warn |
src/secure_code_audit/renderers.py | 590 | warn |
README.md | 569 | warn |
calibration/calibrate.py | 557 | warn |
src/secure_code_audit/sarif.py | 500 | warn |
tests/unit/test_cli_coverage.py | 493 | warn |
tests/unit/test_tier2_scanners.py | 488 | warn |
src/secure_code_audit/scanners/base.py | 459 | warn |
tests/unit/test_offline_ruleset.py | 430 | warn |
tests/unit/test_plan_features.py | 430 | warn |
src/secure_code_audit/remediation.py | 421 | warn |
src/secure_code_audit/verify.py | 417 | warn |
src/secure_code_audit/findings.py | 408 | warn |
tests/integration/test_scoring_drift.py | 407 | warn |
tests/integration/test_finding_paths_are_repository_relative.py | 392 | ok |
docs/calibration.md | 372 | ok |
tests/unit/test_language_scanners.py | 368 | ok |
docs/architecture.md | 362 | ok |
docs/design.md | 358 | ok |
| File | Declaration | Line | Lines | Complexity | Cognitive | Status |
|---|---|---|---|---|---|---|
src/secure_code_audit/scanners/base.py | Scanner (class) | 33 | 423 | - | - | fail |
calibration/calibrate.py | summarize | 366 | 70 | 31 | 12 | fail |
src/secure_code_audit/suppressions.py | load | 113 | 111 | 30 | 44 | fail |
src/secure_code_audit/cli.py | _do_audit | 495 | 272 | 29 | 18 | fail |
src/secure_code_audit/practice.py | assess | 207 | 94 | 28 | 35 | fail |
src/secure_code_audit/verify.py | compare | 294 | 79 | 25 | 7 | fail |
src/secure_code_audit/scanners/semgrep_scanner.py | _parse_sarif | 150 | 56 | 24 | 32 | fail |
src/secure_code_audit/config.py | _validate_gates | 641 | 32 | 21 | 21 | fail |
src/secure_code_audit/cli.py | _print_summary | 1334 | 76 | 19 | 19 | fail |
calibration/calibrate.py | main | 438 | 116 | 18 | 17 | fail |
src/secure_code_audit/scanners/base.py | _make_finding | 236 | 85 | 17 | 24 | fail |
src/secure_code_audit/config.py | _apply_scanners | 478 | 36 | 17 | 21 | fail |
src/secure_code_audit/scanners/pip_audit_scanner.py | _audit_inputs | 107 | 33 | 17 | 13 | fail |
src/secure_code_audit/cli.py | _split_axes | 385 | 108 | 8 | 14 | fail |
src/secure_code_audit/cli.py | _parser | 70 | 159 | 2 | 0 | fail |
src/secure_code_audit/git_tools.py | loc_under | 169 | 61 | 15 | 19 | warn |
src/secure_code_audit/scanners/bandit_scanner.py | scan | 47 | 57 | 15 | 15 | warn |
src/secure_code_audit/pillar.py | build | 135 | 48 | 15 | 13 | warn |
src/secure_code_audit/scanners/gosec_scanner.py | _finding_for | 114 | 24 | 15 | 19 | warn |
calibration/calibrate.py | variants | 244 | 59 | 14 | 7 | warn |
src/secure_code_audit/scoring.py | score | 687 | 55 | 14 | 14 | warn |
src/secure_code_audit/renderers.py | _findings_sections | 449 | 47 | 14 | 17 | warn |
src/secure_code_audit/renderers.py | _pr_comment | 547 | 44 | 14 | 16 | warn |
src/secure_code_audit/scanners/npm_audit_scanner.py | _parse | 88 | 43 | 14 | 11 | warn |
src/secure_code_audit/sarif.py | _finding_from_result | 433 | 41 | 14 | 21 | warn |
tests/integration/test_finding_paths_are_repository_relative.py | test_no_written_output_names_the_checkout | 243 | 34 | 14 | 3 | warn |
src/secure_code_audit/scanners/njsscan_scanner.py | _findings_for_rule | 78 | 31 | 14 | 19 | warn |
src/secure_code_audit/sarif.py | ingest_with_coverage | 262 | 72 | 13 | 14 | warn |
src/secure_code_audit/scanners/pip_audit_scanner.py | scan | 45 | 61 | 13 | 17 | warn |
src/secure_code_audit/renderers.py | _summary_section | 287 | 59 | 13 | 21 | warn |
src/secure_code_audit/renderers.py | _scanners_section | 408 | 39 | 13 | 16 | warn |
src/secure_code_audit/scanners/base.py | _resolve_candidate | 104 | 24 | 13 | 19 | warn |
src/secure_code_audit/renderers.py | to_json | 24 | 59 | 12 | 13 | warn |
src/secure_code_audit/cli.py | _do_preflight | 280 | 56 | 12 | 13 | warn |
src/secure_code_audit/cli.py | _measurable_categories | 882 | 48 | 12 | 11 | warn |
src/secure_code_audit/findings.py | merge_corroborating | 364 | 45 | 12 | 17 | warn |
src/secure_code_audit/scanners/rubocop_scanner.py | scan | 59 | 40 | 12 | 15 | warn |
src/secure_code_audit/history.py | read | 102 | 31 | 12 | 14 | warn |
src/secure_code_audit/renderers.py | _one_finding_md | 498 | 31 | 12 | 15 | warn |
src/secure_code_audit/suppressions.py | matches | 70 | 31 | 12 | 10 | warn |
src/secure_code_audit/scanners/gitleaks_scanner.py | _parse | 132 | 24 | 12 | 11 | warn |
src/secure_code_audit/scanners/gosec_scanner.py | _load_failure | 89 | 24 | 12 | 18 | warn |
src/secure_code_audit/sarif.py | _location_from_result | 491 | 10 | 12 | 14 | warn |
src/secure_code_audit/verify.py | measure_scope | 97 | 56 | 11 | 10 | warn |
src/secure_code_audit/scanners/trufflehog_scanner.py | scan | 36 | 54 | 11 | 15 | warn |
src/secure_code_audit/scanners/hadolint_scanner.py | scan | 50 | 29 | 11 | 7 | warn |
src/secure_code_audit/scanners/osv_scanner.py | _parse | 87 | 28 | 11 | 15 | warn |
src/secure_code_audit/cli.py | _print_preflight | 338 | 24 | 11 | 16 | warn |
src/secure_code_audit/config.py | _apply_file_and_loc | 568 | 19 | 11 | 13 | warn |
src/secure_code_audit/scanners/semgrep_scanner.py | _cwe_from_rule | 33 | 19 | 11 | 11 | warn |
| Severity | Band | Finding | Location | Do |
|---|---|---|---|---|
| High | quick-win | _do_audit in src/secure_code_audit/cli.py | src/secure_code_audit/cli.py:495 | reduce below the configured limits (currently 272 lines against 80, complexity 29 against 15, cognitive 18 against 25) |
| High | quick-win | _parser in src/secure_code_audit/cli.py | src/secure_code_audit/cli.py:70 | reduce below the configured limits (currently 159 lines against 80, complexity 2 against 15, cognitive 0 against 25) |
| High | quick-win | _print_summary in src/secure_code_audit/cli.py | src/secure_code_audit/cli.py:1334 | reduce below the configured limits (currently 76 lines against 80, complexity 19 against 15, cognitive 19 against 25) |
| High | quick-win | _split_axes in src/secure_code_audit/cli.py | src/secure_code_audit/cli.py:385 | reduce below the configured limits (currently 108 lines against 80, complexity 8 against 15, cognitive 14 against 25) |
| High | quick-win | _apply_scanners in src/secure_code_audit/config.py | src/secure_code_audit/config.py:478 | reduce below the configured limits (currently 36 lines against 80, complexity 17 against 15, cognitive 21 against 25) |
| High | quick-win | _validate_gates in src/secure_code_audit/config.py | src/secure_code_audit/config.py:641 | reduce below the configured limits (currently 32 lines against 80, complexity 21 against 15, cognitive 21 against 25) |
| High | quick-win | Scanner in src/secure_code_audit/scanners/base.py | src/secure_code_audit/scanners/base.py:33 | reduce below the configured limits (currently 423 lines against the 300-line class limit) |
| High | quick-win | _make_finding in src/secure_code_audit/scanners/base.py | src/secure_code_audit/scanners/base.py:236 | reduce below the configured limits (currently 85 lines against 80, complexity 17 against 15, cognitive 24 against 25) |
| Severe | quick-win | configured risk pattern in src/secure_code_audit/findings.py | src/secure_code_audit/findings.py:181 | act on what the `silent-truncation` rule matched here, or say why it stays; deleting the matched text alone hides the finding without resolving it |
| High | quick-win | _parse_sarif in src/secure_code_audit/scanners/semgrep_scanner.py | src/secure_code_audit/scanners/semgrep_scanner.py:150 | reduce below the configured limits (currently 56 lines against 80, complexity 24 against 15, cognitive 32 against 25) |
| Severe | quick-win | configured risk pattern in src/secure_code_audit/remediation.py | src/secure_code_audit/remediation.py:37 | act on what the `debt-marker` rule matched here, or say why it stays; deleting the matched text alone hides the finding without resolving it |
| High | quick-win | load in src/secure_code_audit/suppressions.py | src/secure_code_audit/suppressions.py:113 | reduce below the configured limits (currently 111 lines against 80, complexity 30 against 15, cognitive 44 against 25) |
| High | quick-win | main in calibration/calibrate.py | calibration/calibrate.py:438 | reduce below the configured limits (currently 116 lines against 80, complexity 18 against 15, cognitive 17 against 25) |
| High | quick-win | summarize in calibration/calibrate.py | calibration/calibrate.py:366 | reduce below the configured limits (currently 70 lines against 80, complexity 31 against 15, cognitive 12 against 25) |
| High | quick-win | _audit_inputs in src/secure_code_audit/scanners/pip_audit_scanner.py | src/secure_code_audit/scanners/pip_audit_scanner.py:107 | reduce below the configured limits (currently 33 lines against 80, complexity 17 against 15, cognitive 13 against 25) |
| High | quick-win | compare in src/secure_code_audit/verify.py | src/secure_code_audit/verify.py:294 | reduce below the configured limits (currently 79 lines against 80, complexity 25 against 15, cognitive 7 against 25) |
| High | quick-win | assess in src/secure_code_audit/practice.py | src/secure_code_audit/practice.py:207 | reduce below the configured limits (currently 94 lines against 80, complexity 28 against 15, cognitive 35 against 25) |
| Severe | quick-win | configured risk pattern in README.md | README.md:139 | act on what the `debt-marker` rule matched here, or say why it stays; deleting the matched text alone hides the finding without resolving it |
| Severe | quick-win | configured risk pattern in docs/remediation.md | docs/remediation.md:57 | act on what the `debt-marker` rule matched here, or say why it stays; deleting the matched text alone hides the finding without resolving it |
| Severe | quick-win | configured risk pattern in skills/secure-code-agent/references/finding-taxonomy.md | skills/secure-code-agent/references/finding-taxonomy.md:75 | act on what the `debt-marker` rule matched here, or say why it stays; deleting the matched text alone hides the finding without resolving it |
| High | major-project | duplicated block in src/secure_code_audit/cli.py | src/secure_code_audit/cli.py:162 | remove the duplicated block |
| Medium | major-project | src/secure_code_audit/cli.py is 1577 lines | src/secure_code_audit/cli.py | split below the configured file-length limit |
| Medium | major-project | near-duplicate declaration in src/secure_code_audit/scoring.py | src/secure_code_audit/scoring.py:842 | consolidate the two into one declaration, or say why they are deliberately separate; editing one alone leaves the other |
| Medium | major-project | src/secure_code_audit/scoring.py is 951 lines | src/secure_code_audit/scoring.py | split below the configured file-length limit |
| High | major-project | duplicated block in src/secure_code_audit/scanners/semgrep_scanner.py | src/secure_code_audit/scanners/semgrep_scanner.py:128 | extract the shared block so its 2 copies become one; editing one copy alone leaves the rest |
| High | major-project | duplicated block in src/secure_code_audit/scanners/bandit_scanner.py | src/secure_code_audit/scanners/bandit_scanner.py:11 | extract the shared block so its 3 copies become one; editing one copy alone leaves the rest |
| High | major-project | duplicated block in src/secure_code_audit/scanners/osv_scanner.py | src/secure_code_audit/scanners/osv_scanner.py:44 | extract the shared block so its 2 copies become one; editing one copy alone leaves the rest |
| High | major-project | duplicated block in src/secure_code_audit/scanners/npm_audit_scanner.py | src/secure_code_audit/scanners/npm_audit_scanner.py:103 | extract the shared block so its 2 copies become one; editing one copy alone leaves the rest |
| Medium | major-project | CHANGELOG.md is 1391 lines | CHANGELOG.md | split below the configured file-length limit |
| Medium | major-project | docs/decisions.md is 1857 lines | docs/decisions.md | split below the configured file-length limit |
| High | major-project | duplicated block in README.md | README.md:112 | extract the shared block so its 2 copies become one; editing one copy alone leaves the rest |
| High | major-project | duplicated block in skills/secure-code-agent/SKILL.md | skills/secure-code-agent/SKILL.md:30 | extract the shared block so its 2 copies become one; editing one copy alone leaves the rest |
| High | major-project | duplicated block in tests/integration/test_gated_findings_are_reportable.py | tests/integration/test_gated_findings_are_reportable.py:99 | remove the duplicated block |
| High | major-project | duplicated block in tests/integration/test_target_shapes.py | tests/integration/test_target_shapes.py:136 | extract the shared block so its 3 copies become one; editing one copy alone leaves the rest |
| High | major-project | duplicated block in tests/unit/test_cli_coverage.py | tests/unit/test_cli_coverage.py:51 | extract the shared block so its 2 copies become one; editing one copy alone leaves the rest |
| High | major-project | duplicated block in tests/unit/test_code_scanning_sarif_raises_only_alerts.py | tests/unit/test_code_scanning_sarif_raises_only_alerts.py:57 | extract the shared block so its 2 copies become one; editing one copy alone leaves the rest |
| High | major-project | duplicated block in tests/unit/test_declared_capabilities.py | tests/unit/test_declared_capabilities.py:45 | extract the shared block so its 2 copies become one; editing one copy alone leaves the rest |
| High | major-project | duplicated block in tests/unit/test_gate_reporting.py | tests/unit/test_gate_reporting.py:105 | extract the shared block so its 3 copies become one; editing one copy alone leaves the rest |
| High | major-project | duplicated block in tests/unit/test_offline_ruleset.py | tests/unit/test_offline_ruleset.py:63 | remove the duplicated block |
| High | major-project | duplicated block in tests/unit/test_offline_ruleset.py | tests/unit/test_offline_ruleset.py:218 | remove the duplicated block |
| High | major-project | duplicated block in tests/unit/test_plan_features.py | tests/unit/test_plan_features.py:37 | remove the duplicated block |
| High | major-project | duplicated block in tests/unit/test_practice.py | tests/unit/test_practice.py:98 | remove the duplicated block |
| High | major-project | duplicated block in tests/unit/test_sarif_roundtrip.py | tests/unit/test_sarif_roundtrip.py:255 | remove the duplicated block |
| High | major-project | duplicated block in tests/unit/test_sarif_roundtrip.py | tests/unit/test_sarif_roundtrip.py:135 | remove the duplicated block |
| High | major-project | duplicated block in tests/unit/test_tier2_scanners.py | tests/unit/test_tier2_scanners.py:145 | remove the duplicated block |
One self-contained prompt per item — copy any block into a coding agent. A block for an item that needs a design decision asks for that decision, not a patch.
Repository: /Users/marshallguillory/repos/secure-code-agent Task: reduce below the configured limits (currently 272 lines against 80, complexity 29 against 15, cognitive 18 against 25). Location: src/secure_code_audit/cli.py:495 Why: a long, branching function is where defects concentrate and where every future change has to be understood first Make one small, reviewable change. Do not alter public behavior or refactor unrelated code. If this is a false positive, say so and leave it unchanged; add or update a test when behavior changes. Verify when done: /Users/marshallguillory/.local/share/maintainability-agent/venv/bin/python -m maintainability_audit --root . --format json
Repository: /Users/marshallguillory/repos/secure-code-agent Task: reduce below the configured limits (currently 159 lines against 80, complexity 2 against 15, cognitive 0 against 25). Location: src/secure_code_audit/cli.py:70 Why: a long function is where every future change has to be understood first Make one small, reviewable change. Do not alter public behavior or refactor unrelated code. If this is a false positive, say so and leave it unchanged; add or update a test when behavior changes. Verify when done: /Users/marshallguillory/.local/share/maintainability-agent/venv/bin/python -m maintainability_audit --root . --format json
Repository: /Users/marshallguillory/repos/secure-code-agent Task: reduce below the configured limits (currently 76 lines against 80, complexity 19 against 15, cognitive 19 against 25). Location: src/secure_code_audit/cli.py:1334 Why: a long, branching function is where defects concentrate and where every future change has to be understood first Make one small, reviewable change. Do not alter public behavior or refactor unrelated code. If this is a false positive, say so and leave it unchanged; add or update a test when behavior changes. Verify when done: /Users/marshallguillory/.local/share/maintainability-agent/venv/bin/python -m maintainability_audit --root . --format json
Repository: /Users/marshallguillory/repos/secure-code-agent Task: reduce below the configured limits (currently 108 lines against 80, complexity 8 against 15, cognitive 14 against 25). Location: src/secure_code_audit/cli.py:385 Why: a long function is where every future change has to be understood first Make one small, reviewable change. Do not alter public behavior or refactor unrelated code. If this is a false positive, say so and leave it unchanged; add or update a test when behavior changes. Verify when done: /Users/marshallguillory/.local/share/maintainability-agent/venv/bin/python -m maintainability_audit --root . --format json
Repository: /Users/marshallguillory/repos/secure-code-agent Task: reduce below the configured limits (currently 36 lines against 80, complexity 17 against 15, cognitive 21 against 25). Location: src/secure_code_audit/config.py:478 Why: a long, branching function is where defects concentrate and where every future change has to be understood first Make one small, reviewable change. Do not alter public behavior or refactor unrelated code. If this is a false positive, say so and leave it unchanged; add or update a test when behavior changes. Verify when done: /Users/marshallguillory/.local/share/maintainability-agent/venv/bin/python -m maintainability_audit --root . --format json
Repository: /Users/marshallguillory/repos/secure-code-agent Task: reduce below the configured limits (currently 32 lines against 80, complexity 21 against 15, cognitive 21 against 25). Location: src/secure_code_audit/config.py:641 Why: a long, branching function is where defects concentrate and where every future change has to be understood first Make one small, reviewable change. Do not alter public behavior or refactor unrelated code. If this is a false positive, say so and leave it unchanged; add or update a test when behavior changes. Verify when done: /Users/marshallguillory/.local/share/maintainability-agent/venv/bin/python -m maintainability_audit --root . --format json
Repository: /Users/marshallguillory/repos/secure-code-agent Task: reduce below the configured limits (currently 423 lines against the 300-line class limit). Location: src/secure_code_audit/scanners/base.py:33 Why: an oversized class hides its own structure, and every change to it is read against all of it Make one small, reviewable change. Do not alter public behavior or refactor unrelated code. If this is a false positive, say so and leave it unchanged; add or update a test when behavior changes. Verify when done: /Users/marshallguillory/.local/share/maintainability-agent/venv/bin/python -m maintainability_audit --root . --format json
Repository: /Users/marshallguillory/repos/secure-code-agent Task: reduce below the configured limits (currently 85 lines against 80, complexity 17 against 15, cognitive 24 against 25). Location: src/secure_code_audit/scanners/base.py:236 Why: a long, branching function is where defects concentrate and where every future change has to be understood first Make one small, reviewable change. Do not alter public behavior or refactor unrelated code. If this is a false positive, say so and leave it unchanged; add or update a test when behavior changes. Verify when done: /Users/marshallguillory/.local/share/maintainability-agent/venv/bin/python -m maintainability_audit --root . --format json
Repository: /Users/marshallguillory/repos/secure-code-agent Task: act on what the `silent-truncation` rule matched here, or say why it stays; deleting the matched text alone hides the finding without resolving it. Location: src/secure_code_audit/findings.py:181 Why: a risk pattern is a rule the active configuration enforces, and each hit is a single located line Make one small, reviewable change. Do not alter public behavior or refactor unrelated code. If this is a false positive, say so and leave it unchanged; add or update a test when behavior changes. Verify when done: /Users/marshallguillory/.local/share/maintainability-agent/venv/bin/python -m maintainability_audit --root . --format json
Repository: /Users/marshallguillory/repos/secure-code-agent Task: reduce below the configured limits (currently 56 lines against 80, complexity 24 against 15, cognitive 32 against 25). Location: src/secure_code_audit/scanners/semgrep_scanner.py:150 Why: a long, branching function is where defects concentrate and where every future change has to be understood first Make one small, reviewable change. Do not alter public behavior or refactor unrelated code. If this is a false positive, say so and leave it unchanged; add or update a test when behavior changes. Verify when done: /Users/marshallguillory/.local/share/maintainability-agent/venv/bin/python -m maintainability_audit --root . --format json
Repository: /Users/marshallguillory/repos/secure-code-agent Task: act on what the `debt-marker` rule matched here, or say why it stays; deleting the matched text alone hides the finding without resolving it. Location: src/secure_code_audit/remediation.py:37 Why: a risk pattern is a rule the active configuration enforces, and each hit is a single located line Make one small, reviewable change. Do not alter public behavior or refactor unrelated code. If this is a false positive, say so and leave it unchanged; add or update a test when behavior changes. Verify when done: /Users/marshallguillory/.local/share/maintainability-agent/venv/bin/python -m maintainability_audit --root . --format json
Repository: /Users/marshallguillory/repos/secure-code-agent Task: reduce below the configured limits (currently 111 lines against 80, complexity 30 against 15, cognitive 44 against 25). Location: src/secure_code_audit/suppressions.py:113 Why: a long, branching function is where defects concentrate and where every future change has to be understood first Make one small, reviewable change. Do not alter public behavior or refactor unrelated code. If this is a false positive, say so and leave it unchanged; add or update a test when behavior changes. Verify when done: /Users/marshallguillory/.local/share/maintainability-agent/venv/bin/python -m maintainability_audit --root . --format json
Repository: /Users/marshallguillory/repos/secure-code-agent Task: reduce below the configured limits (currently 116 lines against 80, complexity 18 against 15, cognitive 17 against 25). Location: calibration/calibrate.py:438 Why: a long, branching function is where defects concentrate and where every future change has to be understood first Make one small, reviewable change. Do not alter public behavior or refactor unrelated code. If this is a false positive, say so and leave it unchanged; add or update a test when behavior changes. Verify when done: /Users/marshallguillory/.local/share/maintainability-agent/venv/bin/python -m maintainability_audit --root . --format json
Repository: /Users/marshallguillory/repos/secure-code-agent Task: reduce below the configured limits (currently 70 lines against 80, complexity 31 against 15, cognitive 12 against 25). Location: calibration/calibrate.py:366 Why: a long, branching function is where defects concentrate and where every future change has to be understood first Make one small, reviewable change. Do not alter public behavior or refactor unrelated code. If this is a false positive, say so and leave it unchanged; add or update a test when behavior changes. Verify when done: /Users/marshallguillory/.local/share/maintainability-agent/venv/bin/python -m maintainability_audit --root . --format json
Repository: /Users/marshallguillory/repos/secure-code-agent Task: reduce below the configured limits (currently 33 lines against 80, complexity 17 against 15, cognitive 13 against 25). Location: src/secure_code_audit/scanners/pip_audit_scanner.py:107 Why: a long, branching function is where defects concentrate and where every future change has to be understood first Make one small, reviewable change. Do not alter public behavior or refactor unrelated code. If this is a false positive, say so and leave it unchanged; add or update a test when behavior changes. Verify when done: /Users/marshallguillory/.local/share/maintainability-agent/venv/bin/python -m maintainability_audit --root . --format json
Repository: /Users/marshallguillory/repos/secure-code-agent Task: reduce below the configured limits (currently 79 lines against 80, complexity 25 against 15, cognitive 7 against 25). Location: src/secure_code_audit/verify.py:294 Why: a long, branching function is where defects concentrate and where every future change has to be understood first Make one small, reviewable change. Do not alter public behavior or refactor unrelated code. If this is a false positive, say so and leave it unchanged; add or update a test when behavior changes. Verify when done: /Users/marshallguillory/.local/share/maintainability-agent/venv/bin/python -m maintainability_audit --root . --format json
Repository: /Users/marshallguillory/repos/secure-code-agent Task: reduce below the configured limits (currently 94 lines against 80, complexity 28 against 15, cognitive 35 against 25). Location: src/secure_code_audit/practice.py:207 Why: a long, branching function is where defects concentrate and where every future change has to be understood first Make one small, reviewable change. Do not alter public behavior or refactor unrelated code. If this is a false positive, say so and leave it unchanged; add or update a test when behavior changes. Verify when done: /Users/marshallguillory/.local/share/maintainability-agent/venv/bin/python -m maintainability_audit --root . --format json
Repository: /Users/marshallguillory/repos/secure-code-agent Task: act on what the `debt-marker` rule matched here, or say why it stays; deleting the matched text alone hides the finding without resolving it. Location: README.md:139 Why: a risk pattern is a rule the active configuration enforces, and each hit is a single located line Make one small, reviewable change. Do not alter public behavior or refactor unrelated code. If this is a false positive, say so and leave it unchanged; add or update a test when behavior changes. Verify when done: /Users/marshallguillory/.local/share/maintainability-agent/venv/bin/python -m maintainability_audit --root . --format json
Repository: /Users/marshallguillory/repos/secure-code-agent Task: act on what the `debt-marker` rule matched here, or say why it stays; deleting the matched text alone hides the finding without resolving it. Location: docs/remediation.md:57 Why: a risk pattern is a rule the active configuration enforces, and each hit is a single located line Make one small, reviewable change. Do not alter public behavior or refactor unrelated code. If this is a false positive, say so and leave it unchanged; add or update a test when behavior changes. Verify when done: /Users/marshallguillory/.local/share/maintainability-agent/venv/bin/python -m maintainability_audit --root . --format json
Repository: /Users/marshallguillory/repos/secure-code-agent Task: act on what the `debt-marker` rule matched here, or say why it stays; deleting the matched text alone hides the finding without resolving it. Location: skills/secure-code-agent/references/finding-taxonomy.md:75 Why: a risk pattern is a rule the active configuration enforces, and each hit is a single located line Make one small, reviewable change. Do not alter public behavior or refactor unrelated code. If this is a false positive, say so and leave it unchanged; add or update a test when behavior changes. Verify when done: /Users/marshallguillory/.local/share/maintainability-agent/venv/bin/python -m maintainability_audit --root . --format json
Repository: /Users/marshallguillory/repos/secure-code-agent Design decision needed, not a patch: duplicated block in src/secure_code_audit/cli.py. Location: src/secure_code_audit/cli.py:162 Why: duplicated logic means a fix applied in one place and missed in the others; deduplicating across a codebase is a design change, not a tidy-up Direction once decided: remove the duplicated block. Do not change code for this item, because it is a Major Project — the change it needs is a design decision before code moves, not one reviewable patch. Lay out the options for the surrounding design — what each would change, and where — then stop for a human decision. If this is a false positive, say so.
Repository: /Users/marshallguillory/repos/secure-code-agent Design decision needed, not a patch: src/secure_code_audit/cli.py is 1577 lines. Location: src/secure_code_audit/cli.py Why: a file past the limit hides its own structure, but splitting one touches every importer and is a change worth reviewing on its own Direction once decided: split below the configured file-length limit. Do not change code for this item, because it is a Major Project — the change it needs is a design decision before code moves, not one reviewable patch. Lay out the options for the surrounding design — what each would change, and where — then stop for a human decision. If this is a false positive, say so.
Repository: /Users/marshallguillory/repos/secure-code-agent Design decision needed, not a patch: near-duplicate declaration in src/secure_code_audit/scoring.py. Location: src/secure_code_audit/scoring.py:842 Also at: src/secure_code_audit/scoring.py:858 Why: near-copies drift apart silently, which is worse than exact duplication; reconciling them requires deciding which behaviour was intended Direction once decided: consolidate the two into one declaration, or say why they are deliberately separate; editing one alone leaves the other. Do not change code for this item, because it is a Major Project — the change it needs is a design decision before code moves, not one reviewable patch. Lay out the options for the surrounding design — what each would change, and where — then stop for a human decision. If this is a false positive, say so.
Repository: /Users/marshallguillory/repos/secure-code-agent Design decision needed, not a patch: src/secure_code_audit/scoring.py is 951 lines. Location: src/secure_code_audit/scoring.py Why: a file past the limit hides its own structure, but splitting one touches every importer and is a change worth reviewing on its own Direction once decided: split below the configured file-length limit. Do not change code for this item, because it is a Major Project — the change it needs is a design decision before code moves, not one reviewable patch. Lay out the options for the surrounding design — what each would change, and where — then stop for a human decision. If this is a false positive, say so.
Repository: /Users/marshallguillory/repos/secure-code-agent Design decision needed, not a patch: duplicated block in src/secure_code_audit/scanners/semgrep_scanner.py. Location: src/secure_code_audit/scanners/semgrep_scanner.py:128 Also at: src/secure_code_audit/scanners/trivy_scanner.py:54 Why: duplicated logic means a fix applied in one place and missed in the others; deduplicating across a codebase is a design change, not a tidy-up Direction once decided: extract the shared block so its 2 copies become one; editing one copy alone leaves the rest. Do not change code for this item, because it is a Major Project — the change it needs is a design decision before code moves, not one reviewable patch. Lay out the options for the surrounding design — what each would change, and where — then stop for a human decision. If this is a false positive, say so.
Repository: /Users/marshallguillory/repos/secure-code-agent Design decision needed, not a patch: duplicated block in src/secure_code_audit/scanners/bandit_scanner.py. Location: src/secure_code_audit/scanners/bandit_scanner.py:11 Also at: src/secure_code_audit/scanners/gosec_scanner.py:32, src/secure_code_audit/scanners/njsscan_scanner.py:26 Why: duplicated logic means a fix applied in one place and missed in the others; deduplicating across a codebase is a design change, not a tidy-up Direction once decided: extract the shared block so its 3 copies become one; editing one copy alone leaves the rest. Do not change code for this item, because it is a Major Project — the change it needs is a design decision before code moves, not one reviewable patch. Lay out the options for the surrounding design — what each would change, and where — then stop for a human decision. If this is a false positive, say so.
Repository: /Users/marshallguillory/repos/secure-code-agent Design decision needed, not a patch: duplicated block in src/secure_code_audit/scanners/osv_scanner.py. Location: src/secure_code_audit/scanners/osv_scanner.py:44 Also at: src/secure_code_audit/scanners/trufflehog_scanner.py:32 Why: duplicated logic means a fix applied in one place and missed in the others; deduplicating across a codebase is a design change, not a tidy-up Direction once decided: extract the shared block so its 2 copies become one; editing one copy alone leaves the rest. Do not change code for this item, because it is a Major Project — the change it needs is a design decision before code moves, not one reviewable patch. Lay out the options for the surrounding design — what each would change, and where — then stop for a human decision. If this is a false positive, say so.
Repository: /Users/marshallguillory/repos/secure-code-agent Design decision needed, not a patch: duplicated block in src/secure_code_audit/scanners/npm_audit_scanner.py. Location: src/secure_code_audit/scanners/npm_audit_scanner.py:103 Also at: src/secure_code_audit/scanners/osv_scanner.py:106 Why: duplicated logic means a fix applied in one place and missed in the others; deduplicating across a codebase is a design change, not a tidy-up Direction once decided: extract the shared block so its 2 copies become one; editing one copy alone leaves the rest. Do not change code for this item, because it is a Major Project — the change it needs is a design decision before code moves, not one reviewable patch. Lay out the options for the surrounding design — what each would change, and where — then stop for a human decision. If this is a false positive, say so.
Repository: /Users/marshallguillory/repos/secure-code-agent Design decision needed, not a patch: CHANGELOG.md is 1391 lines. Location: CHANGELOG.md Why: a file past the limit hides its own structure, but splitting one touches every importer and is a change worth reviewing on its own Direction once decided: split below the configured file-length limit. Do not change code for this item, because it is a Major Project — the change it needs is a design decision before code moves, not one reviewable patch. Lay out the options for the surrounding design — what each would change, and where — then stop for a human decision. If this is a false positive, say so.
Repository: /Users/marshallguillory/repos/secure-code-agent Design decision needed, not a patch: docs/decisions.md is 1857 lines. Location: docs/decisions.md Why: a file past the limit hides its own structure, but splitting one touches every importer and is a change worth reviewing on its own Direction once decided: split below the configured file-length limit. Do not change code for this item, because it is a Major Project — the change it needs is a design decision before code moves, not one reviewable patch. Lay out the options for the surrounding design — what each would change, and where — then stop for a human decision. If this is a false positive, say so.
Repository: /Users/marshallguillory/repos/secure-code-agent Design decision needed, not a patch: duplicated block in README.md. Location: README.md:112 Also at: docs/remediation.md:27 Why: duplicated logic means a fix applied in one place and missed in the others; deduplicating across a codebase is a design change, not a tidy-up Direction once decided: extract the shared block so its 2 copies become one; editing one copy alone leaves the rest. Do not change code for this item, because it is a Major Project — the change it needs is a design decision before code moves, not one reviewable patch. Lay out the options for the surrounding design — what each would change, and where — then stop for a human decision. If this is a false positive, say so.
Repository: /Users/marshallguillory/repos/secure-code-agent Design decision needed, not a patch: duplicated block in skills/secure-code-agent/SKILL.md. Location: skills/secure-code-agent/SKILL.md:30 Also at: skills/secure-code-agent/copilot/secure-code-agent.prompt.md:23 Why: duplicated logic means a fix applied in one place and missed in the others; deduplicating across a codebase is a design change, not a tidy-up Direction once decided: extract the shared block so its 2 copies become one; editing one copy alone leaves the rest. Do not change code for this item, because it is a Major Project — the change it needs is a design decision before code moves, not one reviewable patch. Lay out the options for the surrounding design — what each would change, and where — then stop for a human decision. If this is a false positive, say so.
Repository: /Users/marshallguillory/repos/secure-code-agent Design decision needed, not a patch: duplicated block in tests/integration/test_gated_findings_are_reportable.py. Location: tests/integration/test_gated_findings_are_reportable.py:99 Why: duplicated logic means a fix applied in one place and missed in the others; deduplicating across a codebase is a design change, not a tidy-up Direction once decided: remove the duplicated block. Do not change code for this item, because it is a Major Project — the change it needs is a design decision before code moves, not one reviewable patch. Lay out the options for the surrounding design — what each would change, and where — then stop for a human decision. If this is a false positive, say so.
Repository: /Users/marshallguillory/repos/secure-code-agent Design decision needed, not a patch: duplicated block in tests/integration/test_target_shapes.py. Location: tests/integration/test_target_shapes.py:136 Also at: tests/unit/test_cli_coverage.py:226, tests/unit/test_declared_capabilities.py:220 Why: duplicated logic means a fix applied in one place and missed in the others; deduplicating across a codebase is a design change, not a tidy-up Direction once decided: extract the shared block so its 3 copies become one; editing one copy alone leaves the rest. Do not change code for this item, because it is a Major Project — the change it needs is a design decision before code moves, not one reviewable patch. Lay out the options for the surrounding design — what each would change, and where — then stop for a human decision. If this is a false positive, say so.
Repository: /Users/marshallguillory/repos/secure-code-agent Design decision needed, not a patch: duplicated block in tests/unit/test_cli_coverage.py. Location: tests/unit/test_cli_coverage.py:51 Also at: tests/unit/test_declared_capabilities.py:235 Why: duplicated logic means a fix applied in one place and missed in the others; deduplicating across a codebase is a design change, not a tidy-up Direction once decided: extract the shared block so its 2 copies become one; editing one copy alone leaves the rest. Do not change code for this item, because it is a Major Project — the change it needs is a design decision before code moves, not one reviewable patch. Lay out the options for the surrounding design — what each would change, and where — then stop for a human decision. If this is a false positive, say so.
Repository: /Users/marshallguillory/repos/secure-code-agent Design decision needed, not a patch: duplicated block in tests/unit/test_code_scanning_sarif_raises_only_alerts.py. Location: tests/unit/test_code_scanning_sarif_raises_only_alerts.py:57 Also at: tests/unit/test_finding_path_consumers.py:49 Why: duplicated logic means a fix applied in one place and missed in the others; deduplicating across a codebase is a design change, not a tidy-up Direction once decided: extract the shared block so its 2 copies become one; editing one copy alone leaves the rest. Do not change code for this item, because it is a Major Project — the change it needs is a design decision before code moves, not one reviewable patch. Lay out the options for the surrounding design — what each would change, and where — then stop for a human decision. If this is a false positive, say so.
Repository: /Users/marshallguillory/repos/secure-code-agent Design decision needed, not a patch: duplicated block in tests/unit/test_declared_capabilities.py. Location: tests/unit/test_declared_capabilities.py:45 Also at: tests/unit/test_declared_findings_are_not_patch_targets.py:46 Why: duplicated logic means a fix applied in one place and missed in the others; deduplicating across a codebase is a design change, not a tidy-up Direction once decided: extract the shared block so its 2 copies become one; editing one copy alone leaves the rest. Do not change code for this item, because it is a Major Project — the change it needs is a design decision before code moves, not one reviewable patch. Lay out the options for the surrounding design — what each would change, and where — then stop for a human decision. If this is a false positive, say so.
Repository: /Users/marshallguillory/repos/secure-code-agent Design decision needed, not a patch: duplicated block in tests/unit/test_gate_reporting.py. Location: tests/unit/test_gate_reporting.py:105 Also at: tests/unit/test_plan_features.py:66, tests/unit/test_scan_scope.py:34 Why: duplicated logic means a fix applied in one place and missed in the others; deduplicating across a codebase is a design change, not a tidy-up Direction once decided: extract the shared block so its 3 copies become one; editing one copy alone leaves the rest. Do not change code for this item, because it is a Major Project — the change it needs is a design decision before code moves, not one reviewable patch. Lay out the options for the surrounding design — what each would change, and where — then stop for a human decision. If this is a false positive, say so.
Repository: /Users/marshallguillory/repos/secure-code-agent Design decision needed, not a patch: duplicated block in tests/unit/test_offline_ruleset.py. Location: tests/unit/test_offline_ruleset.py:63 Why: duplicated logic means a fix applied in one place and missed in the others; deduplicating across a codebase is a design change, not a tidy-up Direction once decided: remove the duplicated block. Do not change code for this item, because it is a Major Project — the change it needs is a design decision before code moves, not one reviewable patch. Lay out the options for the surrounding design — what each would change, and where — then stop for a human decision. If this is a false positive, say so.
Repository: /Users/marshallguillory/repos/secure-code-agent Design decision needed, not a patch: duplicated block in tests/unit/test_offline_ruleset.py. Location: tests/unit/test_offline_ruleset.py:218 Why: duplicated logic means a fix applied in one place and missed in the others; deduplicating across a codebase is a design change, not a tidy-up Direction once decided: remove the duplicated block. Do not change code for this item, because it is a Major Project — the change it needs is a design decision before code moves, not one reviewable patch. Lay out the options for the surrounding design — what each would change, and where — then stop for a human decision. If this is a false positive, say so.
Repository: /Users/marshallguillory/repos/secure-code-agent Design decision needed, not a patch: duplicated block in tests/unit/test_plan_features.py. Location: tests/unit/test_plan_features.py:37 Why: duplicated logic means a fix applied in one place and missed in the others; deduplicating across a codebase is a design change, not a tidy-up Direction once decided: remove the duplicated block. Do not change code for this item, because it is a Major Project — the change it needs is a design decision before code moves, not one reviewable patch. Lay out the options for the surrounding design — what each would change, and where — then stop for a human decision. If this is a false positive, say so.
Repository: /Users/marshallguillory/repos/secure-code-agent Design decision needed, not a patch: duplicated block in tests/unit/test_practice.py. Location: tests/unit/test_practice.py:98 Why: duplicated logic means a fix applied in one place and missed in the others; deduplicating across a codebase is a design change, not a tidy-up Direction once decided: remove the duplicated block. Do not change code for this item, because it is a Major Project — the change it needs is a design decision before code moves, not one reviewable patch. Lay out the options for the surrounding design — what each would change, and where — then stop for a human decision. If this is a false positive, say so.
Repository: /Users/marshallguillory/repos/secure-code-agent Design decision needed, not a patch: duplicated block in tests/unit/test_sarif_roundtrip.py. Location: tests/unit/test_sarif_roundtrip.py:255 Why: duplicated logic means a fix applied in one place and missed in the others; deduplicating across a codebase is a design change, not a tidy-up Direction once decided: remove the duplicated block. Do not change code for this item, because it is a Major Project — the change it needs is a design decision before code moves, not one reviewable patch. Lay out the options for the surrounding design — what each would change, and where — then stop for a human decision. If this is a false positive, say so.
Repository: /Users/marshallguillory/repos/secure-code-agent Design decision needed, not a patch: duplicated block in tests/unit/test_sarif_roundtrip.py. Location: tests/unit/test_sarif_roundtrip.py:135 Why: duplicated logic means a fix applied in one place and missed in the others; deduplicating across a codebase is a design change, not a tidy-up Direction once decided: remove the duplicated block. Do not change code for this item, because it is a Major Project — the change it needs is a design decision before code moves, not one reviewable patch. Lay out the options for the surrounding design — what each would change, and where — then stop for a human decision. If this is a false positive, say so.
Repository: /Users/marshallguillory/repos/secure-code-agent Design decision needed, not a patch: duplicated block in tests/unit/test_tier2_scanners.py. Location: tests/unit/test_tier2_scanners.py:145 Why: duplicated logic means a fix applied in one place and missed in the others; deduplicating across a codebase is a design change, not a tidy-up Direction once decided: remove the duplicated block. Do not change code for this item, because it is a Major Project — the change it needs is a design decision before code moves, not one reviewable patch. Lay out the options for the surrounding design — what each would change, and where — then stop for a human decision. If this is a false positive, say so.
Written by secure-code-agent 0.12.10 and reproduced as it wrote it. It is that tool's work order, not this one's: its findings are not re-ranked or merged into the maintainability work order above.
0 to fix · 0 to review · 1596 suppression candidates.
TypeScript semantic coverage: unknown — no recorded type analysis and no local type checker: semantic coverage for TypeScript is unknown. Absence of analysis is not absence of findings.