secure-code-agent 0.12.8__tar.gz → 0.12.9__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (53) hide show
  1. {secure_code_agent-0.12.8/src/secure_code_agent.egg-info → secure_code_agent-0.12.9}/PKG-INFO +2 -2
  2. {secure_code_agent-0.12.8 → secure_code_agent-0.12.9}/README.md +1 -1
  3. {secure_code_agent-0.12.8 → secure_code_agent-0.12.9/src/secure_code_agent.egg-info}/PKG-INFO +2 -2
  4. {secure_code_agent-0.12.8 → secure_code_agent-0.12.9}/src/secure_code_audit/__init__.py +1 -1
  5. {secure_code_agent-0.12.8 → secure_code_agent-0.12.9}/src/secure_code_audit/triage.py +20 -1
  6. {secure_code_agent-0.12.8 → secure_code_agent-0.12.9}/LICENSE +0 -0
  7. {secure_code_agent-0.12.8 → secure_code_agent-0.12.9}/pyproject.toml +0 -0
  8. {secure_code_agent-0.12.8 → secure_code_agent-0.12.9}/setup.cfg +0 -0
  9. {secure_code_agent-0.12.8 → secure_code_agent-0.12.9}/src/secure_code_agent.egg-info/SOURCES.txt +0 -0
  10. {secure_code_agent-0.12.8 → secure_code_agent-0.12.9}/src/secure_code_agent.egg-info/dependency_links.txt +0 -0
  11. {secure_code_agent-0.12.8 → secure_code_agent-0.12.9}/src/secure_code_agent.egg-info/entry_points.txt +0 -0
  12. {secure_code_agent-0.12.8 → secure_code_agent-0.12.9}/src/secure_code_agent.egg-info/requires.txt +0 -0
  13. {secure_code_agent-0.12.8 → secure_code_agent-0.12.9}/src/secure_code_agent.egg-info/top_level.txt +0 -0
  14. {secure_code_agent-0.12.8 → secure_code_agent-0.12.9}/src/secure_code_audit/baseline.py +0 -0
  15. {secure_code_agent-0.12.8 → secure_code_agent-0.12.9}/src/secure_code_audit/capabilities.py +0 -0
  16. {secure_code_agent-0.12.8 → secure_code_agent-0.12.9}/src/secure_code_audit/cli.py +0 -0
  17. {secure_code_agent-0.12.8 → secure_code_agent-0.12.9}/src/secure_code_audit/config.py +0 -0
  18. {secure_code_agent-0.12.8 → secure_code_agent-0.12.9}/src/secure_code_audit/data/semgrep-offline.yaml +0 -0
  19. {secure_code_agent-0.12.8 → secure_code_agent-0.12.9}/src/secure_code_audit/demo.py +0 -0
  20. {secure_code_agent-0.12.8 → secure_code_agent-0.12.9}/src/secure_code_audit/findings.py +0 -0
  21. {secure_code_agent-0.12.8 → secure_code_agent-0.12.9}/src/secure_code_audit/git_tools.py +0 -0
  22. {secure_code_agent-0.12.8 → secure_code_agent-0.12.9}/src/secure_code_audit/history.py +0 -0
  23. {secure_code_agent-0.12.8 → secure_code_agent-0.12.9}/src/secure_code_audit/instructions.py +0 -0
  24. {secure_code_agent-0.12.8 → secure_code_agent-0.12.9}/src/secure_code_audit/mcp_server.py +0 -0
  25. {secure_code_agent-0.12.8 → secure_code_agent-0.12.9}/src/secure_code_audit/pillar.py +0 -0
  26. {secure_code_agent-0.12.8 → secure_code_agent-0.12.9}/src/secure_code_audit/practice.py +0 -0
  27. {secure_code_agent-0.12.8 → secure_code_agent-0.12.9}/src/secure_code_audit/remediation.py +0 -0
  28. {secure_code_agent-0.12.8 → secure_code_agent-0.12.9}/src/secure_code_audit/renderers.py +0 -0
  29. {secure_code_agent-0.12.8 → secure_code_agent-0.12.9}/src/secure_code_audit/ruleset.py +0 -0
  30. {secure_code_agent-0.12.8 → secure_code_agent-0.12.9}/src/secure_code_audit/sarif.py +0 -0
  31. {secure_code_agent-0.12.8 → secure_code_agent-0.12.9}/src/secure_code_audit/scanner_status.py +0 -0
  32. {secure_code_agent-0.12.8 → secure_code_agent-0.12.9}/src/secure_code_audit/scanners/__init__.py +0 -0
  33. {secure_code_agent-0.12.8 → secure_code_agent-0.12.9}/src/secure_code_audit/scanners/bandit_scanner.py +0 -0
  34. {secure_code_agent-0.12.8 → secure_code_agent-0.12.9}/src/secure_code_audit/scanners/base.py +0 -0
  35. {secure_code_agent-0.12.8 → secure_code_agent-0.12.9}/src/secure_code_audit/scanners/builtin_rules.py +0 -0
  36. {secure_code_agent-0.12.8 → secure_code_agent-0.12.9}/src/secure_code_audit/scanners/checkov_scanner.py +0 -0
  37. {secure_code_agent-0.12.8 → secure_code_agent-0.12.9}/src/secure_code_audit/scanners/floor.py +0 -0
  38. {secure_code_agent-0.12.8 → secure_code_agent-0.12.9}/src/secure_code_audit/scanners/gitleaks_scanner.py +0 -0
  39. {secure_code_agent-0.12.8 → secure_code_agent-0.12.9}/src/secure_code_audit/scanners/gosec_scanner.py +0 -0
  40. {secure_code_agent-0.12.8 → secure_code_agent-0.12.9}/src/secure_code_audit/scanners/hadolint_scanner.py +0 -0
  41. {secure_code_agent-0.12.8 → secure_code_agent-0.12.9}/src/secure_code_audit/scanners/njsscan_scanner.py +0 -0
  42. {secure_code_agent-0.12.8 → secure_code_agent-0.12.9}/src/secure_code_audit/scanners/npm_audit_scanner.py +0 -0
  43. {secure_code_agent-0.12.8 → secure_code_agent-0.12.9}/src/secure_code_audit/scanners/osv_scanner.py +0 -0
  44. {secure_code_agent-0.12.8 → secure_code_agent-0.12.9}/src/secure_code_audit/scanners/pip_audit_scanner.py +0 -0
  45. {secure_code_agent-0.12.8 → secure_code_agent-0.12.9}/src/secure_code_audit/scanners/rubocop_scanner.py +0 -0
  46. {secure_code_agent-0.12.8 → secure_code_agent-0.12.9}/src/secure_code_audit/scanners/scorecard_scanner.py +0 -0
  47. {secure_code_agent-0.12.8 → secure_code_agent-0.12.9}/src/secure_code_audit/scanners/semgrep_scanner.py +0 -0
  48. {secure_code_agent-0.12.8 → secure_code_agent-0.12.9}/src/secure_code_audit/scanners/trivy_scanner.py +0 -0
  49. {secure_code_agent-0.12.8 → secure_code_agent-0.12.9}/src/secure_code_audit/scanners/trufflehog_scanner.py +0 -0
  50. {secure_code_agent-0.12.8 → secure_code_agent-0.12.9}/src/secure_code_audit/scoring.py +0 -0
  51. {secure_code_agent-0.12.8 → secure_code_agent-0.12.9}/src/secure_code_audit/standards.py +0 -0
  52. {secure_code_agent-0.12.8 → secure_code_agent-0.12.9}/src/secure_code_audit/suppressions.py +0 -0
  53. {secure_code_agent-0.12.8 → secure_code_agent-0.12.9}/src/secure_code_audit/verify.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: secure-code-agent
3
- Version: 0.12.8
3
+ Version: 0.12.9
4
4
  Summary: Deterministic security gate + bounded AI remediation prompt generator. NIST SSDF / OWASP ASVS / CWE Top 25 anchored.
5
5
  Author: Marshall Guillory
6
6
  License: MIT
@@ -515,7 +515,7 @@ For agents that support invokable skills, this repo ships a portable skill under
515
515
  ## GitHub Action
516
516
 
517
517
  ```yaml
518
- - uses: marshallguillory86/secure-code-agent@v0.12.8
518
+ - uses: marshallguillory86/secure-code-agent@v0.12.9
519
519
  with:
520
520
  config: secure-code-agent.json
521
521
  fail-on-gate: true
@@ -467,7 +467,7 @@ For agents that support invokable skills, this repo ships a portable skill under
467
467
  ## GitHub Action
468
468
 
469
469
  ```yaml
470
- - uses: marshallguillory86/secure-code-agent@v0.12.8
470
+ - uses: marshallguillory86/secure-code-agent@v0.12.9
471
471
  with:
472
472
  config: secure-code-agent.json
473
473
  fail-on-gate: true
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: secure-code-agent
3
- Version: 0.12.8
3
+ Version: 0.12.9
4
4
  Summary: Deterministic security gate + bounded AI remediation prompt generator. NIST SSDF / OWASP ASVS / CWE Top 25 anchored.
5
5
  Author: Marshall Guillory
6
6
  License: MIT
@@ -515,7 +515,7 @@ For agents that support invokable skills, this repo ships a portable skill under
515
515
  ## GitHub Action
516
516
 
517
517
  ```yaml
518
- - uses: marshallguillory86/secure-code-agent@v0.12.8
518
+ - uses: marshallguillory86/secure-code-agent@v0.12.9
519
519
  with:
520
520
  config: secure-code-agent.json
521
521
  fail-on-gate: true
@@ -12,4 +12,4 @@
12
12
  #:
13
13
  #: PyPI is immutable, so 0.4.0 stays wrong. 0.5.0 is the first build whose
14
14
  #: artifacts name their own producer correctly.
15
- __version__ = "0.12.8"
15
+ __version__ = "0.12.9"
@@ -30,6 +30,7 @@ import re
30
30
  from collections.abc import Iterable
31
31
  from pathlib import Path
32
32
 
33
+ from secure_code_audit.capabilities import AXIS_PREFIX
33
34
  from secure_code_audit.findings import Category, Confidence, Finding, Severity
34
35
 
35
36
 
@@ -75,6 +76,24 @@ LOW_PRECISION: dict[str, str] = {
75
76
  _ACCEPT_AXES = frozenset({"test tree", "documentation"})
76
77
 
77
78
 
79
+ def _is_accepted_axis(axis: str) -> bool:
80
+ """Is this an axis whose findings are not patch targets?
81
+
82
+ The named pair, plus every declared capability. A declaration says the
83
+ finding is the project's architecture being exercised (D24) — the
84
+ scorer already routes it off the code condition and the report already
85
+ lists it as reported-not-scored. Nominating the same finding in §FIX
86
+ asks an agent to change the thing the operator declared.
87
+
88
+ That is what shipped. `capabilities` reached the scorer and the
89
+ renderer and never reached here, so one run said "no findings" in the
90
+ pillar and "68 to fix" in the work order — the same 68, all of them
91
+ `subprocess` calls in a tool whose purpose is running subprocesses
92
+ (D28).
93
+ """
94
+ return axis in _ACCEPT_AXES or axis.startswith(AXIS_PREFIX)
95
+
96
+
78
97
  #: Bandit quotes the offending value: `Possible hardcoded password: 'x'`.
79
98
  _QUOTED_VALUE = re.compile(r"password: '(.*)'\s*$")
80
99
 
@@ -233,7 +252,7 @@ def tier_of(finding: Finding, axis: str = "primary", root: Path | None = None) -
233
252
  genuine hardcoded key in a test fixture is still deliberate, and a
234
253
  high-confidence rule firing there does not make it a patch target.
235
254
  """
236
- if axis in _ACCEPT_AXES:
255
+ if _is_accepted_axis(axis):
237
256
  return Tier.ACCEPT
238
257
  if finding.rule_id in LOW_PRECISION:
239
258
  # Unless the value itself gives it away.