sourcecode 5.9.28__py3-none-any.whl → 5.9.29__py3-none-any.whl
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.
- sourcecode/__init__.py +1 -1
- sourcecode/_build_commit.py +3 -3
- sourcecode/_docs/DEFECT-LEDGER.md +104 -0
- sourcecode/_docs/USER_GUIDE.md +1 -1
- sourcecode/audit_recipe.py +6 -0
- sourcecode/cli.py +78 -3
- sourcecode/concurrency.py +37 -6
- sourcecode/dependency_analyzer.py +25 -0
- sourcecode/empty_answer_diagnostics.py +11 -0
- sourcecode/inflight.py +287 -0
- sourcecode/manifest_cache.py +11 -9
- sourcecode/progress.py +34 -0
- sourcecode/risk.py +99 -19
- sourcecode/rule_pass.py +18 -0
- sourcecode/spring_findings.py +8 -0
- sourcecode/spring_security_audit.py +15 -2
- {sourcecode-5.9.28.dist-info → sourcecode-5.9.29.dist-info}/METADATA +3 -3
- {sourcecode-5.9.28.dist-info → sourcecode-5.9.29.dist-info}/RECORD +22 -21
- {sourcecode-5.9.28.dist-info → sourcecode-5.9.29.dist-info}/WHEEL +0 -0
- {sourcecode-5.9.28.dist-info → sourcecode-5.9.29.dist-info}/entry_points.txt +0 -0
- {sourcecode-5.9.28.dist-info → sourcecode-5.9.29.dist-info}/licenses/LICENSE +0 -0
- {sourcecode-5.9.28.dist-info → sourcecode-5.9.29.dist-info}/licenses/NOTICE +0 -0
sourcecode/__init__.py
CHANGED
sourcecode/_build_commit.py
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
"""Generated at build time by hatch_build.py. Do not edit (AUD-592-D04)."""
|
|
2
2
|
|
|
3
|
-
BUILD_COMMIT = '
|
|
4
|
-
CLOSURE_PROVENANCE = {'AUD-611-B05': {'commit': '', 'status': 'uncited'}, 'AUD-611-B06': {'commit': '', 'status': 'uncited'}, 'AUD-611-B07': {'commit': '', 'status': 'uncited'}, 'AUD-611-B08': {'commit': '', 'status': 'uncited'}, 'AUD-611-B09': {'commit': '', 'status': 'uncited'}, 'AUD-611-B10': {'commit': '', 'status': 'uncited'}, 'AUD-611-B11': {'commit': '', 'status': 'uncited'}, 'AUD-612-07': {'commit': '', 'status': 'uncited'}, 'AUD-612-09': {'commit': '', 'status': 'uncited'}, 'AUD-612-14': {'commit': '', 'status': 'uncited'}, 'AUD-612-B03': {'commit': '', 'status': 'uncited'}, 'AUD-612-B07': {'commit': '', 'status': 'uncited'}, 'AUD-612-B13': {'commit': '', 'status': 'uncited'}, 'AUD-612-E': {'commit': '', 'status': 'uncited'}, 'AUD-612-G': {'commit': '', 'status': 'uncited'}, 'AUD-612-I': {'commit': '', 'status': 'uncited'}, 'AUD-612-K': {'commit': '', 'status': 'uncited'}, 'AUD-612-M': {'commit': '', 'status': 'uncited'}, 'AUD-612-R': {'commit': '', 'status': 'uncited'}, 'AUD-613-ROOT': {'commit': '', 'status': 'uncited'}, 'AUD-614-07': {'commit': '', 'status': 'uncited'}, 'AUD-614-E': {'commit': '', 'status': 'uncited'}, 'AUD-614-F': {'commit': '', 'status': 'uncited'}, 'AUD-614-G': {'commit': '', 'status': 'uncited'}, 'AUD-614-I': {'commit': '', 'status': 'uncited'}, 'AUD-614-INTENT-TIE': {'commit': '', 'status': 'uncited'}, 'AUD-614-JUNIT4': {'commit': '', 'status': 'uncited'}, 'AUD-614-RISK-L0': {'commit': '', 'status': 'uncited'}, 'AUD-614-SELFTEST-TIMEOUT': {'commit': '', 'status': 'uncited'}, 'AUD-615-07': {'commit': '', 'status': 'uncited'}, 'AUD-615-COLD-COMPACT': {'commit': '', 'status': 'uncited'}, 'AUD-615-DRIFT': {'commit': '', 'status': 'uncited'}, 'AUD-615-E': {'commit': '', 'status': 'uncited'}, 'AUD-615-F': {'commit': '', 'status': 'uncited'}, 'AUD-615-INTENT-TIE': {'commit': '', 'status': 'uncited'}, 'AUD-615-JUNIT4': {'commit': '', 'status': 'uncited'}, 'AUD-615-RISK-L0': {'commit': '', 'status': 'uncited'}, 'AUD-615-SELFTEST-TIMEOUT': {'commit': '', 'status': 'uncited'}, 'AUD-616-E-PROV': {'commit': '', 'status': 'uncited'}, 'AUD-616-F, -RISK-L0, -SELFTEST-TIMEOUT, -INTENT-TIE, -DRIFT, -COLD-COMPACT, -E, -07': {'commit': '', 'status': 'uncited'}, 'AUD-616-INTENT-TIE-COV': {'commit': '', 'status': 'uncited'}, 'AUD-616-JUNIT4-SELF': {'commit': '', 'status': 'uncited'}, 'AUD-616-KOTLIN': {'commit': '', 'status': 'uncited'}, 'AUD-616-O': {'commit': '', 'status': 'uncited'}, 'AUD-616-P': {'commit': '', 'status': 'uncited'}, 'Window': {'commit': '', 'status': 'uncited'}, '`ASK-FIELD-01`': {'commit': '829f9fa', 'status': 'present'}, '`ASK-FIELD-02`': {'commit': '6a659fa', 'status': 'present'}, '`ASK-FIELD-03`': {'commit': '55b0d51', 'status': 'present'}, '`AUD-588-F05`': {'commit': '470e4a4', 'status': 'present'}, '`AUD-590-B01` / `B-01`, `F-01`': {'commit': '', 'status': 'uncited'}, '`AUD-590-B02` / `B-02`, `F-02`': {'commit': '', 'status': 'uncited'}, '`AUD-590-B03` / `B-03`, `F-03`': {'commit': '', 'status': 'uncited'}, '`AUD-590-B04` / `B-04`, `F-04`': {'commit': '', 'status': 'uncited'}, '`AUD-590-R01` / `R-01`': {'commit': '', 'status': 'uncited'}, '`AUD-591-A01` / `A-1`': {'commit': '', 'status': 'uncited'}, '`AUD-591-A02` / `A-2`, `A-4`': {'commit': '', 'status': 'uncited'}, '`AUD-591-A03` / `A-3`': {'commit': '', 'status': 'uncited'}, '`AUD-591-A05` / `A-5`': {'commit': '', 'status': 'uncited'}, '`AUD-591-A06` / `A-6`, `A-7`': {'commit': '', 'status': 'uncited'}, '`AUD-591-A08` / `A-8`': {'commit': '', 'status': 'uncited'}, '`AUD-591-A09` / `A-9`': {'commit': '', 'status': 'uncited'}, '`AUD-591-A10` / `A-10`': {'commit': '', 'status': 'uncited'}, '`AUD-592-A02` / `A-1` second half, `§12.5`': {'commit': '63f3d61', 'status': 'present'}, '`AUD-592-B01` / `B-8`': {'commit': '8329614', 'status': 'present'}, '`AUD-592-D01` / `D-1`': {'commit': '0f8e03f', 'status': 'present'}, '`AUD-592-D02` / `D-2`': {'commit': '1d3db4d', 'status': 'present'}, '`AUD-592-D03` / `D-3`': {'commit': 'f28fe40', 'status': 'present'}, '`AUD-592-R01` / `A-1`': {'commit': '216025f', 'status': 'present'}, '`AUD-592-R02` / `N-4`, reopens `AUD-513-N04`': {'commit': 'ec3050d', 'status': 'present'}, '`AUD-593-N01` / `N-01`': {'commit': 'dd6a706', 'status': 'present'}, '`AUD-593-N02` / `N-02`': {'commit': 'f539787', 'status': 'present'}, '`AUD-593-N03` / `N-03`': {'commit': '1dd0b1c', 'status': 'present'}, '`AUD-593-N05` / `N-05`': {'commit': 'aa89388', 'status': 'present'}, '`AUD-593-N06` / `N-06`': {'commit': 'aa584a6', 'status': 'present'}, '`AUD-594-N04` / `D-5`, disclosure half of `B-3`': {'commit': 'a0060b7', 'status': 'present'}, '`AUD-594-X01` / `A-1`, residual of `AUD-593-N03`': {'commit': 'dd222b9', 'status': 'present'}, '`AUD-594-X02` / `A-1` second half': {'commit': '1193937', 'status': 'present'}, '`AUD-594-X03` / `X-03`, residual of `AUD-593-N01`': {'commit': 'e89e8f0', 'status': 'present'}, '`AUD-594-X04`': {'commit': '05b8cc9', 'status': 'present'}, '`AUD-595-A02` / `N-5`, advisory half of `AUD-588-B11`': {'commit': '3e15227', 'status': 'present'}, '`AUD-595-A03` / `B-6` exit-code half': {'commit': 'ab7285f', 'status': 'present'}, '`AUD-595-A05`': {'commit': 'e0b3d10', 'status': 'present'}, '`AUD-595-A07`, narrow half of `AUD-592-A02`': {'commit': 'cc15177', 'status': 'present'}, '`AUD-595-B01` / §B': {'commit': 'b77a1ad', 'status': 'present'}, '`AUD-595-Q01`': {'commit': '91a6566', 'status': 'present'}, '`AUD-596-A01` / `ASK-DET-001`': {'commit': 'fa508b4', 'status': 'present'}, '`AUD-596-A02` / `ASK-SELF-001`': {'commit': '4dfadc8', 'status': 'present'}, '`AUD-596-A03` / `ASK-C1-001`': {'commit': 'bffa3a6', 'status': 'present'}, '`AUD-596-A04` / `ASK-UX-003` + `ASK-UX-004`': {'commit': 'f0aac3c', 'status': 'present'}, '`AUD-596-B01` / `B-01`, harder witness for `BUG-6`': {'commit': '567d09d', 'status': 'present'}, '`AUD-596-B02` / `B-02`, class residual of `R2`': {'commit': '', 'status': 'uncited'}, '`AUD-596-B03` / `B-03`': {'commit': 'a8cb814', 'status': 'present'}, '`AUD-596-B06` / `B-06`': {'commit': '8107927', 'status': 'present'}, '`AUD-596-B07` / `B-07`, class residual of `AUD-592-R02`': {'commit': 'e060485', 'status': 'present'}, '`AUD-596-B09` / `B-09`': {'commit': '5b8146c', 'status': 'present'}, '`AUD-596-B10` / `B-10`': {'commit': '5cb994d', 'status': 'present'}, '`AUD-596-B16` / `B-16`': {'commit': '1507f69', 'status': 'present'}, '`AUD-596-D01` / `B-13` + `B-14`': {'commit': '0b1bdf0', 'status': 'present'}, '`AUD-596-D02` / `B-08`, residual of `AUD-594-N04`': {'commit': 'e7f73c3', 'status': 'present'}, '`AUD-596-D03` / `ASK-AGT-001`': {'commit': '8c46967', 'status': 'present'}, '`AUD-596-D04` / `B-18`': {'commit': '040f027', 'status': 'present'}, '`AUD-596-D05` / `B-19`': {'commit': 'fd2bf68', 'status': 'present'}, '`AUD-596-D06` / `B-20`': {'commit': '784cd83', 'status': 'present'}, '`AUD-596-D07` / `B-17`, half refuted': {'commit': 'c3ff822', 'status': 'present'}, '`AUD-596-D08` / `B-22`, class residual of `AUD-591-A06`': {'commit': 'b396c6a', 'status': 'present'}, '`AUD-596-D09` / `B-23`, surviving half of `B26`': {'commit': 'fd3d63f', 'status': 'present'}, '`AUD-596-D10` / `B-29`': {'commit': '', 'status': 'uncited'}, '`AUD-596-D11` / `ASK-UX-005`': {'commit': 'f4b4f77', 'status': 'present'}, '`AUD-596-D12` — six hints that send the reader back to the error': {'commit': '498df44', 'status': 'present'}, '`AUD-596-D13` / `B-28`': {'commit': '1014c72', 'status': 'present'}, '`AUD-596-D14` / `B-15`, narrow half of `B20`': {'commit': '10f2827', 'status': 'present'}, '`AUD-596-R01` / `B-05`': {'commit': '', 'status': 'uncited'}, '`AUD-596-X01` / `ASK-GATE-001`, gating half of `B24`': {'commit': 'e59c655', 'status': 'present'}, '`AUD-596-X02` / `ASK-UX-001` + `ASK-UX-002` + `B-21`': {'commit': 'f6ebf50', 'status': 'present'}, '`AUD-597-A01` / `ASK-UX-001` + `N-01`': {'commit': 'f8cf061', 'status': 'present'}, '`AUD-597-A02` / `ASK-UX-008` + `ASK-DOC-002`': {'commit': '9d47a4c', 'status': 'present'}, '`AUD-597-A03` / `ASK-DET-001`': {'commit': '4c7622a', 'status': 'present'}, '`AUD-597-A04` / `ASK-LEDGER-001`': {'commit': '46fb870', 'status': 'present'}, '`AUD-597-D01` / `B-04`': {'commit': '1094e6a', 'status': 'present'}, '`AUD-597-D02` / `ASK-DOC-001`': {'commit': 'ecb1bb7', 'status': 'present'}, '`AUD-597-D03` / `N-06`': {'commit': '9784333', 'status': 'present'}, '`AUD-597-D04` / `N-05`': {'commit': 'e51c087', 'status': 'present'}, '`AUD-597-D05` / `N-04`, fourth appearance of `C4-27`': {'commit': '9cccc15', 'status': 'present'}, '`AUD-597-D06` / `ASK-CLI-001`': {'commit': '178aa6d', 'status': 'present'}, '`AUD-597-D07` / `N-03`': {'commit': '9245e35', 'status': 'present'}, '`AUD-597-R01` / `ASK-PERF-001`': {'commit': '6910054', 'status': 'present'}, '`AUD-597-R02` / `ASK-ENC-001`': {'commit': 'ce6dac1', 'status': 'present'}, '`AUD-597-R03` / `ASK-UX-002`': {'commit': 'c57e50b', 'status': 'present'}, '`AUD-597-X01` / `ASK-BUILD-001` + `ASK-META-001` / `B-12`': {'commit': '354338b', 'status': 'present'}, '`AUD-598-B01` / `ASK-META-001`': {'commit': 'b2f7c65', 'status': 'present'}, '`AUD-598-B02` / `ASK-UX-002`': {'commit': '56a4bf7', 'status': 'present'}, '`AUD-598-B03` / `B-11`': {'commit': 'c63cb24', 'status': 'present'}, '`AUD-598-B04` / `N-02`': {'commit': '187937f', 'status': 'present'}, '`AUD-598-R01` / `ASK-PERF-002`': {'commit': '', 'status': 'uncited'}, '`AUD-598-X01` / `N-01` + `B-13` + `B-14` + `B-29` + `N-06`': {'commit': '6f2f5a4', 'status': 'present'}, '`AUD-600-B01` / `P-01`': {'commit': '366ffed', 'status': 'present'}, '`AUD-600-B02` / `P-02` + `ASK-PACK-002`': {'commit': '2a814c3', 'status': 'present'}, '`AUD-600-B03` / `ASK-PACK-001`': {'commit': '452f2a0', 'status': 'present'}, '`AUD-600-D01`': {'commit': '1224e1b', 'status': 'present'}, '`AUD-600-D02`': {'commit': 'eab8172', 'status': 'present'}, '`AUD-600-R01` / `R-01`': {'commit': '88add64', 'status': 'present'}, '`AUD-601-B01` / `N-02`, 5th round': {'commit': '', 'status': 'uncited'}, '`AUD-601-B02` / `ASK-PACK-004`': {'commit': '', 'status': 'uncited'}, '`AUD-601-D01` / `N-01`, `ASK-UX-001`, 5th round': {'commit': '', 'status': 'uncited'}, '`AUD-601-D02` / `B-13`, `B-14`, 5th round': {'commit': '', 'status': 'uncited'}, '`AUD-601-M01` / `B-26`, `B-27` retracted': {'commit': '', 'status': 'uncited'}, '`AUD-601-R01` / `R-02`': {'commit': '', 'status': 'uncited'}, '`AUD-619-WATCH`': {'commit': '', 'status': 'uncited'}, '`AUD-620-COMMAND-SURFACE`': {'commit': '', 'status': 'uncited'}, '`AUD-620-REVIEW-PR`': {'commit': '', 'status': 'uncited'}, '`AUD-621-REVIEW-PR`': {'commit': '', 'status': 'uncited'}, '`B-3`': {'commit': '773268d', 'status': 'present'}, '`B-6`': {'commit': '17c6e06', 'status': 'present'}, '`B-8`': {'commit': '8329614', 'status': 'present'}, '`BUG-15`': {'commit': '', 'status': 'uncited'}, '`BUG-21`': {'commit': '', 'status': 'uncited'}, '`BUG-3` / `443b345`': {'commit': '', 'status': 'uncited'}, '`BUG-4a` / `AUD-588-B11` residual': {'commit': '24b4185', 'status': 'present'}, '`BUG-4b` / `AUD-588-B11` residual': {'commit': '0376350', 'status': 'present'}, '`E-39`, class residual of `AUD-593-N06`': {'commit': '25fc11f', 'status': 'present'}, '`N-5`': {'commit': 'c68083f', 'status': 'present'}, '`N-7`': {'commit': '082e9de', 'status': 'present'}, '`R-1`': {'commit': '424fb1c', 'status': 'present'}, '`R-2`': {'commit': '5158b92', 'status': 'present'}, '`R-3`': {'commit': '88aec04', 'status': 'present'}, '`R-4`': {'commit': '04fd04f', 'status': 'present'}, '`REG-01`': {'commit': '', 'status': 'uncited'}, '`REG-04`': {'commit': '', 'status': 'uncited'}}
|
|
5
|
-
CLOSURE_COVERAGE = {'closed_rows':
|
|
3
|
+
BUILD_COMMIT = '6df1bd2436f8b562ee173fbaf7ba499ee783f0f8'
|
|
4
|
+
CLOSURE_PROVENANCE = {'AUD-611-B05': {'commit': '', 'status': 'uncited'}, 'AUD-611-B06': {'commit': '', 'status': 'uncited'}, 'AUD-611-B07': {'commit': '', 'status': 'uncited'}, 'AUD-611-B08': {'commit': '', 'status': 'uncited'}, 'AUD-611-B09': {'commit': '', 'status': 'uncited'}, 'AUD-611-B10': {'commit': '', 'status': 'uncited'}, 'AUD-611-B11': {'commit': '', 'status': 'uncited'}, 'AUD-612-07': {'commit': '', 'status': 'uncited'}, 'AUD-612-09': {'commit': '', 'status': 'uncited'}, 'AUD-612-14': {'commit': '', 'status': 'uncited'}, 'AUD-612-B03': {'commit': '', 'status': 'uncited'}, 'AUD-612-B07': {'commit': '', 'status': 'uncited'}, 'AUD-612-B13': {'commit': '', 'status': 'uncited'}, 'AUD-612-E': {'commit': '', 'status': 'uncited'}, 'AUD-612-G': {'commit': '', 'status': 'uncited'}, 'AUD-612-I': {'commit': '', 'status': 'uncited'}, 'AUD-612-K': {'commit': '', 'status': 'uncited'}, 'AUD-612-M': {'commit': '', 'status': 'uncited'}, 'AUD-612-R': {'commit': '', 'status': 'uncited'}, 'AUD-613-ROOT': {'commit': '', 'status': 'uncited'}, 'AUD-614-07': {'commit': '', 'status': 'uncited'}, 'AUD-614-E': {'commit': '', 'status': 'uncited'}, 'AUD-614-F': {'commit': '', 'status': 'uncited'}, 'AUD-614-G': {'commit': '', 'status': 'uncited'}, 'AUD-614-I': {'commit': '', 'status': 'uncited'}, 'AUD-614-INTENT-TIE': {'commit': '', 'status': 'uncited'}, 'AUD-614-JUNIT4': {'commit': '', 'status': 'uncited'}, 'AUD-614-RISK-L0': {'commit': '', 'status': 'uncited'}, 'AUD-614-SELFTEST-TIMEOUT': {'commit': '', 'status': 'uncited'}, 'AUD-615-07': {'commit': '', 'status': 'uncited'}, 'AUD-615-COLD-COMPACT': {'commit': '', 'status': 'uncited'}, 'AUD-615-DRIFT': {'commit': '', 'status': 'uncited'}, 'AUD-615-E': {'commit': '', 'status': 'uncited'}, 'AUD-615-F': {'commit': '', 'status': 'uncited'}, 'AUD-615-INTENT-TIE': {'commit': '', 'status': 'uncited'}, 'AUD-615-JUNIT4': {'commit': '', 'status': 'uncited'}, 'AUD-615-RISK-L0': {'commit': '', 'status': 'uncited'}, 'AUD-615-SELFTEST-TIMEOUT': {'commit': '', 'status': 'uncited'}, 'AUD-616-E-PROV': {'commit': '', 'status': 'uncited'}, 'AUD-616-F, -RISK-L0, -SELFTEST-TIMEOUT, -INTENT-TIE, -DRIFT, -COLD-COMPACT, -E, -07': {'commit': '', 'status': 'uncited'}, 'AUD-616-INTENT-TIE-COV': {'commit': '', 'status': 'uncited'}, 'AUD-616-JUNIT4-SELF': {'commit': '', 'status': 'uncited'}, 'AUD-616-KOTLIN': {'commit': '', 'status': 'uncited'}, 'AUD-616-O': {'commit': '', 'status': 'uncited'}, 'AUD-616-P': {'commit': '', 'status': 'uncited'}, 'Suite hygiene': {'commit': '', 'status': 'uncited'}, 'Window': {'commit': '', 'status': 'uncited'}, '`ALT-25`': {'commit': '', 'status': 'uncited'}, '`ASK-FIELD-01`': {'commit': '829f9fa', 'status': 'present'}, '`ASK-FIELD-02`': {'commit': '6a659fa', 'status': 'present'}, '`ASK-FIELD-03`': {'commit': '55b0d51', 'status': 'present'}, '`AUD-588-F05`': {'commit': '470e4a4', 'status': 'present'}, '`AUD-590-B01` / `B-01`, `F-01`': {'commit': '', 'status': 'uncited'}, '`AUD-590-B02` / `B-02`, `F-02`': {'commit': '', 'status': 'uncited'}, '`AUD-590-B03` / `B-03`, `F-03`': {'commit': '', 'status': 'uncited'}, '`AUD-590-B04` / `B-04`, `F-04`': {'commit': '', 'status': 'uncited'}, '`AUD-590-R01` / `R-01`': {'commit': '', 'status': 'uncited'}, '`AUD-591-A01` / `A-1`': {'commit': '', 'status': 'uncited'}, '`AUD-591-A02` / `A-2`, `A-4`': {'commit': '', 'status': 'uncited'}, '`AUD-591-A03` / `A-3`': {'commit': '', 'status': 'uncited'}, '`AUD-591-A05` / `A-5`': {'commit': '', 'status': 'uncited'}, '`AUD-591-A06` / `A-6`, `A-7`': {'commit': '', 'status': 'uncited'}, '`AUD-591-A08` / `A-8`': {'commit': '', 'status': 'uncited'}, '`AUD-591-A09` / `A-9`': {'commit': '', 'status': 'uncited'}, '`AUD-591-A10` / `A-10`': {'commit': '', 'status': 'uncited'}, '`AUD-592-A02` / `A-1` second half, `§12.5`': {'commit': '63f3d61', 'status': 'present'}, '`AUD-592-B01` / `B-8`': {'commit': '8329614', 'status': 'present'}, '`AUD-592-D01` / `D-1`': {'commit': '0f8e03f', 'status': 'present'}, '`AUD-592-D02` / `D-2`': {'commit': '1d3db4d', 'status': 'present'}, '`AUD-592-D03` / `D-3`': {'commit': 'f28fe40', 'status': 'present'}, '`AUD-592-R01` / `A-1`': {'commit': '216025f', 'status': 'present'}, '`AUD-592-R02` / `N-4`, reopens `AUD-513-N04`': {'commit': 'ec3050d', 'status': 'present'}, '`AUD-593-N01` / `N-01`': {'commit': 'dd6a706', 'status': 'present'}, '`AUD-593-N02` / `N-02`': {'commit': 'f539787', 'status': 'present'}, '`AUD-593-N03` / `N-03`': {'commit': '1dd0b1c', 'status': 'present'}, '`AUD-593-N05` / `N-05`': {'commit': 'aa89388', 'status': 'present'}, '`AUD-593-N06` / `N-06`': {'commit': 'aa584a6', 'status': 'present'}, '`AUD-594-N04` / `D-5`, disclosure half of `B-3`': {'commit': 'a0060b7', 'status': 'present'}, '`AUD-594-X01` / `A-1`, residual of `AUD-593-N03`': {'commit': 'dd222b9', 'status': 'present'}, '`AUD-594-X02` / `A-1` second half': {'commit': '1193937', 'status': 'present'}, '`AUD-594-X03` / `X-03`, residual of `AUD-593-N01`': {'commit': 'e89e8f0', 'status': 'present'}, '`AUD-594-X04`': {'commit': '05b8cc9', 'status': 'present'}, '`AUD-595-A02` / `N-5`, advisory half of `AUD-588-B11`': {'commit': '3e15227', 'status': 'present'}, '`AUD-595-A03` / `B-6` exit-code half': {'commit': 'ab7285f', 'status': 'present'}, '`AUD-595-A05`': {'commit': 'e0b3d10', 'status': 'present'}, '`AUD-595-A07`, narrow half of `AUD-592-A02`': {'commit': 'cc15177', 'status': 'present'}, '`AUD-595-B01` / §B': {'commit': 'b77a1ad', 'status': 'present'}, '`AUD-595-Q01`': {'commit': '91a6566', 'status': 'present'}, '`AUD-596-A01` / `ASK-DET-001`': {'commit': 'fa508b4', 'status': 'present'}, '`AUD-596-A02` / `ASK-SELF-001`': {'commit': '4dfadc8', 'status': 'present'}, '`AUD-596-A03` / `ASK-C1-001`': {'commit': 'bffa3a6', 'status': 'present'}, '`AUD-596-A04` / `ASK-UX-003` + `ASK-UX-004`': {'commit': 'f0aac3c', 'status': 'present'}, '`AUD-596-B01` / `B-01`, harder witness for `BUG-6`': {'commit': '567d09d', 'status': 'present'}, '`AUD-596-B02` / `B-02`, class residual of `R2`': {'commit': '', 'status': 'uncited'}, '`AUD-596-B03` / `B-03`': {'commit': 'a8cb814', 'status': 'present'}, '`AUD-596-B06` / `B-06`': {'commit': '8107927', 'status': 'present'}, '`AUD-596-B07` / `B-07`, class residual of `AUD-592-R02`': {'commit': 'e060485', 'status': 'present'}, '`AUD-596-B09` / `B-09`': {'commit': '5b8146c', 'status': 'present'}, '`AUD-596-B10` / `B-10`': {'commit': '5cb994d', 'status': 'present'}, '`AUD-596-B16` / `B-16`': {'commit': '1507f69', 'status': 'present'}, '`AUD-596-D01` / `B-13` + `B-14`': {'commit': '0b1bdf0', 'status': 'present'}, '`AUD-596-D02` / `B-08`, residual of `AUD-594-N04`': {'commit': 'e7f73c3', 'status': 'present'}, '`AUD-596-D03` / `ASK-AGT-001`': {'commit': '8c46967', 'status': 'present'}, '`AUD-596-D04` / `B-18`': {'commit': '040f027', 'status': 'present'}, '`AUD-596-D05` / `B-19`': {'commit': 'fd2bf68', 'status': 'present'}, '`AUD-596-D06` / `B-20`': {'commit': '784cd83', 'status': 'present'}, '`AUD-596-D07` / `B-17`, half refuted': {'commit': 'c3ff822', 'status': 'present'}, '`AUD-596-D08` / `B-22`, class residual of `AUD-591-A06`': {'commit': 'b396c6a', 'status': 'present'}, '`AUD-596-D09` / `B-23`, surviving half of `B26`': {'commit': 'fd3d63f', 'status': 'present'}, '`AUD-596-D10` / `B-29`': {'commit': '', 'status': 'uncited'}, '`AUD-596-D11` / `ASK-UX-005`': {'commit': 'f4b4f77', 'status': 'present'}, '`AUD-596-D12` — six hints that send the reader back to the error': {'commit': '498df44', 'status': 'present'}, '`AUD-596-D13` / `B-28`': {'commit': '1014c72', 'status': 'present'}, '`AUD-596-D14` / `B-15`, narrow half of `B20`': {'commit': '10f2827', 'status': 'present'}, '`AUD-596-R01` / `B-05`': {'commit': '', 'status': 'uncited'}, '`AUD-596-X01` / `ASK-GATE-001`, gating half of `B24`': {'commit': 'e59c655', 'status': 'present'}, '`AUD-596-X02` / `ASK-UX-001` + `ASK-UX-002` + `B-21`': {'commit': 'f6ebf50', 'status': 'present'}, '`AUD-597-A01` / `ASK-UX-001` + `N-01`': {'commit': 'f8cf061', 'status': 'present'}, '`AUD-597-A02` / `ASK-UX-008` + `ASK-DOC-002`': {'commit': '9d47a4c', 'status': 'present'}, '`AUD-597-A03` / `ASK-DET-001`': {'commit': '4c7622a', 'status': 'present'}, '`AUD-597-A04` / `ASK-LEDGER-001`': {'commit': '46fb870', 'status': 'present'}, '`AUD-597-D01` / `B-04`': {'commit': '1094e6a', 'status': 'present'}, '`AUD-597-D02` / `ASK-DOC-001`': {'commit': 'ecb1bb7', 'status': 'present'}, '`AUD-597-D03` / `N-06`': {'commit': '9784333', 'status': 'present'}, '`AUD-597-D04` / `N-05`': {'commit': 'e51c087', 'status': 'present'}, '`AUD-597-D05` / `N-04`, fourth appearance of `C4-27`': {'commit': '9cccc15', 'status': 'present'}, '`AUD-597-D06` / `ASK-CLI-001`': {'commit': '178aa6d', 'status': 'present'}, '`AUD-597-D07` / `N-03`': {'commit': '9245e35', 'status': 'present'}, '`AUD-597-R01` / `ASK-PERF-001`': {'commit': '6910054', 'status': 'present'}, '`AUD-597-R02` / `ASK-ENC-001`': {'commit': 'ce6dac1', 'status': 'present'}, '`AUD-597-R03` / `ASK-UX-002`': {'commit': 'c57e50b', 'status': 'present'}, '`AUD-597-X01` / `ASK-BUILD-001` + `ASK-META-001` / `B-12`': {'commit': '354338b', 'status': 'present'}, '`AUD-598-B01` / `ASK-META-001`': {'commit': 'b2f7c65', 'status': 'present'}, '`AUD-598-B02` / `ASK-UX-002`': {'commit': '56a4bf7', 'status': 'present'}, '`AUD-598-B03` / `B-11`': {'commit': 'c63cb24', 'status': 'present'}, '`AUD-598-B04` / `N-02`': {'commit': '187937f', 'status': 'present'}, '`AUD-598-R01` / `ASK-PERF-002`': {'commit': '', 'status': 'uncited'}, '`AUD-598-X01` / `N-01` + `B-13` + `B-14` + `B-29` + `N-06`': {'commit': '6f2f5a4', 'status': 'present'}, '`AUD-600-B01` / `P-01`': {'commit': '366ffed', 'status': 'present'}, '`AUD-600-B02` / `P-02` + `ASK-PACK-002`': {'commit': '2a814c3', 'status': 'present'}, '`AUD-600-B03` / `ASK-PACK-001`': {'commit': '452f2a0', 'status': 'present'}, '`AUD-600-D01`': {'commit': '1224e1b', 'status': 'present'}, '`AUD-600-D02`': {'commit': 'eab8172', 'status': 'present'}, '`AUD-600-R01` / `R-01`': {'commit': '88add64', 'status': 'present'}, '`AUD-601-B01` / `N-02`, 5th round': {'commit': '', 'status': 'uncited'}, '`AUD-601-B02` / `ASK-PACK-004`': {'commit': '', 'status': 'uncited'}, '`AUD-601-D01` / `N-01`, `ASK-UX-001`, 5th round': {'commit': '', 'status': 'uncited'}, '`AUD-601-D02` / `B-13`, `B-14`, 5th round': {'commit': '', 'status': 'uncited'}, '`AUD-601-M01` / `B-26`, `B-27` retracted': {'commit': '', 'status': 'uncited'}, '`AUD-601-R01` / `R-02`': {'commit': '', 'status': 'uncited'}, '`AUD-619-WATCH`': {'commit': '', 'status': 'uncited'}, '`AUD-620-COMMAND-SURFACE`': {'commit': '', 'status': 'uncited'}, '`AUD-620-REVIEW-PR`': {'commit': '', 'status': 'uncited'}, '`AUD-621-REVIEW-PR`': {'commit': '', 'status': 'uncited'}, '`B-3`': {'commit': '773268d', 'status': 'present'}, '`B-6`': {'commit': '17c6e06', 'status': 'present'}, '`B-8`': {'commit': '8329614', 'status': 'present'}, '`BUG-13`': {'commit': '', 'status': 'uncited'}, '`BUG-15`': {'commit': '', 'status': 'uncited'}, '`BUG-16`': {'commit': '', 'status': 'uncited'}, '`BUG-21`': {'commit': '', 'status': 'uncited'}, '`BUG-3` / `443b345`': {'commit': '', 'status': 'uncited'}, '`BUG-4a` / `AUD-588-B11` residual': {'commit': '24b4185', 'status': 'present'}, '`BUG-4b` / `AUD-588-B11` residual': {'commit': '0376350', 'status': 'present'}, '`E-39`, class residual of `AUD-593-N06`': {'commit': '25fc11f', 'status': 'present'}, '`N-5`': {'commit': 'c68083f', 'status': 'present'}, '`N-7`': {'commit': '082e9de', 'status': 'present'}, '`NEW-02` / `BUG-05`': {'commit': '', 'status': 'uncited'}, '`R-1`': {'commit': '424fb1c', 'status': 'present'}, '`R-2`': {'commit': '5158b92', 'status': 'present'}, '`R-3`': {'commit': '88aec04', 'status': 'present'}, '`R-4`': {'commit': '04fd04f', 'status': 'present'}, '`REG-01`': {'commit': '', 'status': 'uncited'}, '`REG-04`': {'commit': '', 'status': 'uncited'}, '`retrieve security-surface --target`': {'commit': '', 'status': 'uncited'}}
|
|
5
|
+
CLOSURE_COVERAGE = {'closed_rows': 175, 'present': 91, 'absent': 0, 'unresolved': 0, 'uncited': 84, 'unknown': 0}
|
|
@@ -14,6 +14,110 @@ Status values: `open` · `in-progress` · `closed <version>` · `by-design` (wit
|
|
|
14
14
|
The facts these rows are keyed to are published: `ask schema facts-v1` prints the registry
|
|
15
15
|
(authority, definition, consumers, parity test) that the release battery enforces.
|
|
16
16
|
|
|
17
|
+
## Current Synchronization — Release `5.9.29`, hardening pass and a green suite (2026-09-02)
|
|
18
|
+
|
|
19
|
+
**The suite is green — 13 748 tests, 0 failures — for the first time in
|
|
20
|
+
several releases.** It had carried twenty-one standing reds, which is how a
|
|
21
|
+
real regression becomes indistinguishable from the background. Two of them
|
|
22
|
+
were product defects, not stale assertions.
|
|
23
|
+
|
|
24
|
+
| ID | Severity | Status | Evidence and required closure |
|
|
25
|
+
|---|---:|---|---|
|
|
26
|
+
| `manifest-cache-key` (new) | High | **fixed** | `manifest_cache` keyed its entries on a hand-kept copy of the manifest names that omitted **every lockfile** — `poetry.lock`, `Cargo.lock`, `Gemfile.lock`, `pnpm-lock.yaml`, `yarn.lock`, `composer.lock`, `uv.lock`, `Pipfile.lock`. Two repositories with identical manifests and different *resolved* dependencies hashed the same, so the second was served the first's answer: a stale result with nothing in it to say so. The key now reads `dependency_analyzer.INPUT_FILENAMES`, and a battery reads that module's own source and fails if it opens a file the declared set does not name. |
|
|
27
|
+
| `BUG-03` (merge half) | High | **fixed** | `SpringAuditResult.merge()` dropped `spring_footprint`, so the marginal-detection disclosure closed in 5.9.26 was switched back off on every `--scope all` run — the default. Fixing a producer and leaving a consumer unbound is the exact failure this ledger's maintenance rule exists for, found here by the battery that pins every dataclass field through the merge. |
|
|
28
|
+
| `R-01` (lease liveness) | — | **hardened before shipping** | A lease outlived its process by up to an hour, and the field's harness kills runs with `timeout` constantly — on Windows, where liveness cannot be probed, every later run would have believed it was sharing the machine with a corpse and halved its pool for the whole TTL. Live runs refresh the lease at each phase change; the TTL drops to 900 s, which only has to outlast the longest single phase; the directory is capped. |
|
|
29
|
+
| `R-01-INFLIGHT` (coverage) | — | **widened** | The marker covered the audit family only. `ALT-10` (`onboard`, 904 ms to a 200-second kill in one session) and `ALT-07` (`remediate`, 23,6 s to hangs past 400 s) are the field's other unexplained hangs, and a marker is the only evidence either row can leave behind. Both are covered now; `--help` and the light path still pay nothing. |
|
|
30
|
+
| Suite hygiene | — | **closed** | Nineteen further rows were assertions that had fallen behind: a missing import and a missing fixture parameter, a `--jobs` bound stated twice (one `JOBS_MAX` now feeds the range and the help), a budget block that gained a field, a deadline modelled as a count of consultations rather than a state of the run, a no-context emulation importing a Typer module this version does not ship, `SEC-010` declaring neither a repair recipe nor a reason it cannot be mechanised, and the budget-authority battery holding external audit records to a rule meant for documents that instruct. |
|
|
31
|
+
|
|
32
|
+
## Current Synchronization — P1 closed: the expensive family, profiled and fixed (2026-09-02)
|
|
33
|
+
|
|
34
|
+
**The row asked for two things and both are done: `SEC-010` now reports while
|
|
35
|
+
it runs, and the walk underneath it is between 3 and 24 times faster with a
|
|
36
|
+
byte-identical answer.** Profiling `risk._http_input_query_sinks` on a
|
|
37
|
+
3 860-file repository found the mechanism in one line of the profile: `get()`
|
|
38
|
+
re-read every remaining source, from disk, **once per callee name it
|
|
39
|
+
resolved** — 96 399 `_text_of` calls for 28 lookups, six seconds of pure I/O
|
|
40
|
+
inside an 18,3-second walk, with the parse it triggers accounting for the
|
|
41
|
+
rest.
|
|
42
|
+
|
|
43
|
+
| ID | Severity | Status | Evidence and required closure |
|
|
44
|
+
|---|---:|---|---|
|
|
45
|
+
| `SEC-010` cost | Medium | **fixed** | `seeds()` already reads every source once, so it now indexes, per file, the names that could be *declared* there. The predicate is unchanged where it matters — a Java declaration is never preceded by a dot, so `helper.lookup(` cannot declare `lookup`, while every file that could declare a name stays a candidate — which preserves the walk's own claim that reading fewer files cannot change the answer. Measured warm, serialized, `spring-audit --compact`: `SEC-010` 10 830 → 3 246 ms and the audit 15,5 → 12,2 s on a 3 860-file repository; **64 391 → 2 628 ms** and the audit **71,1 → 8,4 s** on an 878-file one where the family had been 90 % of the clock; unchanged on a repository with no HTTP-input seeds. `content_id` byte-identical on all three. |
|
|
46
|
+
| `SEC-010` silence | Medium | **fixed** | The family owned the most expensive stretch of an audit and reported nothing while it ran — one heartbeat line, unchanged, which from outside is exactly what the field calls a hang. It ticks through `FamilyBudget` now (`SEC-010: parsing callees 129/772 files`), which also makes the family that spends the most time the one a deadline can stop *inside*: a cut returns what it measured, and is recorded as a cut rather than surfacing as an analysis error. |
|
|
47
|
+
| `ALT-01` / `ALT-03` | Critical maximum | **open, one contributing factor removed** | The field's failing runs sat in `SEC-010` and this release makes that stretch several times shorter and, for the first time, visible while it happens. That is not a claim the hang is fixed: an 878-file repository spending 71 s on one family is a plausible contributor to a 150-second timeout, not a proven cause of one, and the field's own repository was never available here. What the next round can do that no previous one could: read `inflight/<pid>.json` after a hang and see whether the stage is still `SEC-010`. |
|
|
48
|
+
|
|
49
|
+
## Current Synchronization — The two 5.9.28 P0s, worked (2026-09-02)
|
|
50
|
+
|
|
51
|
+
**The bisection ran, and its headline result is negative: there is no knee.**
|
|
52
|
+
`spring-audit --compact` over deterministic subsets of a 4 772-file repository
|
|
53
|
+
took 5,8 s (250 files), 6,0 s (500), 9,2 s (1 000), 10,4 s (2 000), 16,9 s
|
|
54
|
+
(3 342 — the field's own file count) and 24,1 s (4 772); a second corpus of
|
|
55
|
+
9 195 files finished in 39,6 s. Sublinear per file, `rc=0` everywhere, no hang
|
|
56
|
+
at any size. **File count alone does not explain the field's failure on this
|
|
57
|
+
platform**, and the auditor's hypothesis — a costly loop that trips at a
|
|
58
|
+
certain size — is not reproducible here at up to 2,75× their repository.
|
|
59
|
+
|
|
60
|
+
What the bisection did find is where the time goes, and why the heartbeat
|
|
61
|
+
looks stuck: **one family dominates**. On the 4 772-file repository, `SEC-010`
|
|
62
|
+
measured **10 670 ms of a 30 099 ms run — 85 % of the rule phase** — and its
|
|
63
|
+
heartbeat line stops changing for the last 10,6 s of it. That is precisely the
|
|
64
|
+
shape the field reports as a hang, and `timings.phases` could say
|
|
65
|
+
`security_rules: 12 617 ms` while never naming which of the six families spent
|
|
66
|
+
it. `SEC-010` delegates to `risk._http_input_query_sinks`, already recorded as
|
|
67
|
+
the CLI's single most expensive walk on two corpora in the 5.8.5 round.
|
|
68
|
+
|
|
69
|
+
| ID | Severity | Status | Evidence and required closure |
|
|
70
|
+
|---|---:|---|---|
|
|
71
|
+
| `R-01-INFLIGHT` | Critical maximum | **shipped** | `inflight/<pid>.json` is written when an audit-family command starts, rewritten at each phase and stage change the heartbeat already reports, and deleted on the way out. A run killed externally leaves it behind carrying argv, start time, the phase, the stage (the rule family) and how long it had been in each. Abandoned markers are published by a later run in `_meta.incomplete_runs` and attached to the forensic snapshot when a guard fires — the run that stops cannot report anything itself. Each row states its basis: a dead pid is a measurement, an old timestamp is an inference, and Windows offers only the second. `ASK_NO_INFLIGHT_MARKER=1` disables it. Field closure: the next hang should leave a marker naming its stage. |
|
|
72
|
+
| `ALT-03` (bisection) | High | **measured, hypothesis not reproduced** | Six sizes on one corpus, three on a second, serialized on a quiet machine: no size at which the behaviour changes from *answers* to *hangs*. The remaining differences with the field are the platform (native Windows, four-worker cap), that repository's own content, and a dirty working tree. The bisection is not repeatable from outside without the repository, so the instruments below move the next attempt inside the product. |
|
|
73
|
+
| `ALT-03` (attribution) | High | **instrumented** | `timings.rule_families` publishes wall time per family, highest first, with a basis stating that it ranks cost and not complexity (the families are not comparable units). Two `perf_counter` reads per family. A family the budget cut stays absent and is named in `_partial.rules_not_run`, so a missing entry is never read as a free family. |
|
|
74
|
+
| `SEC-010` cost | Medium | **open, new, measured** | 85 % of the rule phase and 35 % of the whole audit on a 4 772-file repository; growth measured at roughly `n^1.2` between 1 553 and 3 860 analysed files (3,6 s → 10,6 s of unchanged heartbeat). Its own sub-progress is not reported, so a slow run and a stopped one look identical from outside for the whole stretch. Two separable pieces of work: report progress *inside* the family, and profile `risk._http_input_query_sinks`, which the 5.8.5 round already measured as this CLI's most expensive walk on two corpora. |
|
|
75
|
+
|
|
76
|
+
## Current Synchronization — Alternative External Audit `5.9.28`, the hang reproduces on a near-idle machine (2026-09-02)
|
|
77
|
+
|
|
78
|
+
**First substantial score rise in five rounds (4.6 → 6.2/10), with no
|
|
79
|
+
regression found — and the sharpest evidence yet that contention was never the
|
|
80
|
+
whole story.** The auditor isolated the contention variable to its lowest
|
|
81
|
+
observable level in six sessions (120 s of monitoring, 100 s of confirmed calm
|
|
82
|
+
before launch, one light foreign invocation across the whole 150 s window,
|
|
83
|
+
against dozens in the 5.9.27 round) and `spring-audit . --compact` still hung
|
|
84
|
+
**4 of 4 times**, `rc=124`, 0 bytes. The 5.9.28 release note said "one hang was
|
|
85
|
+
observed with nothing else running, and that is unexplained"; this round turns
|
|
86
|
+
that into *unexplained and reproducible*, which is a better-defined problem and
|
|
87
|
+
still an open one. Full evidence:
|
|
88
|
+
[`AUDIT-2026-09-02-ALTERNATIVE-5.9.28.md`](AUDIT-2026-09-02-ALTERNATIVE-5.9.28.md).
|
|
89
|
+
|
|
90
|
+
**Five rows are confirmed closed with the auditor's own data, not on the
|
|
91
|
+
changelog's word:** `NEW-02`/`BUG-05` (cross-checked against the real source —
|
|
92
|
+
`anchor_candidate_lines: [134, 145]` matches two annotations the auditor had
|
|
93
|
+
verified by hand three sessions earlier, and it is the first defect tracked
|
|
94
|
+
since 5.9.22 that is genuinely resolved rather than "not reproduced this
|
|
95
|
+
time"), `BUG-13` (373 ms refusal against a purpose-built two-repository
|
|
96
|
+
workspace), `BUG-16`, `ALT-25`, and the `retrieve security-surface --target`
|
|
97
|
+
refusal. `_meta.concurrency` is described as the best instrumentation to appear
|
|
98
|
+
in six sessions.
|
|
99
|
+
|
|
100
|
+
| ID | Severity | Status | Evidence and required closure |
|
|
101
|
+
|---|---:|---|---|
|
|
102
|
+
| `R-01` (contention) | Critical maximum | **mechanism confirmed real and quantified; no longer sufficient as an explanation** | Measured on a successful run: `{"peer_invocations_at_start": 17, "worker_budget_shared": true, "jobs": 1, "jobs_unshared": 4}` — exact and actionable, and it settles from the outside what the 5.9.27 round could only infer from timestamps. But `spring-audit` hung 4/4 with third-party contention verified at its lowest in six sessions, so the division of the worker budget is a real fix for a real defect that is **not** the whole cause. Closure now needs the bisection below, not another contention measurement. |
|
|
103
|
+
| `R-01-INFLIGHT` (new) | Critical maximum | **open, instrumentation gap named precisely** | `_meta.concurrency` never appears on a hung or empty run — zero mentions of `concurrency` across the four hangs' stderr — because those processes die before assembling any payload. Same blind spot as the 5.9.26 `R-01` (the run does not reach the output guard), now with the knowledge that the disclosure would be useful if it got there. The auditor's proposal, adopted as the row's required work: write `inflight/<pid>.json` with `{argv, started_at, last_phase}` when an audit-family command starts, update it at each phase change the heartbeat already reports, delete it on completion. An orphaned file is the forensic record no external observer can reconstruct by correlating a shared trace. |
|
|
104
|
+
| `ALT-01` / `ALT-03` | Critical maximum | **open, now systematic and reproducible for this repository** | `spring-audit . --compact` 0/4 this round (0/5, 0/8, 0/18, 0/24 in the four before it); `verify` 0/1, `risk` 0/1, `audit-report` 0/1. The bisection the row has asked for since 5.9.25 now has a specific target: profile the `applying all rules over 3342 Java files` phase — the one the stderr heartbeat names — over a growing subset (250, 500, 1 000, 2 000, 3 342 files) and find where the behaviour changes from *answers* to *hangs indefinitely*. If it is deterministic on this tree, contention worsens a failure that already exists in isolation rather than causing one. |
|
|
105
|
+
| `NEW-02` / `BUG-05` | High | **closed 5.9.28, confirmed in the field** | `anchor_ambiguity: true`, `overload_count: 2`, `anchor_candidate_lines: [134, 145]`, cross-checked against the two real annotations on the overloaded handler pair. Correct, not merely present. |
|
|
106
|
+
| `BUG-13` | High | **closed 5.9.28, confirmed against an independent fixture** | Two real nested Git repositories, refusal in 373 ms with `nested_repositories: 2` and `--allow-nested` documented — against 1 of 12 rows passing in 120 s before. |
|
|
107
|
+
| `BUG-16` | High | **closed 5.9.28, confirmed** | `cache status` prints each store's eviction contract; the auditor notes the information had been absent for four versions. |
|
|
108
|
+
| `ALT-25` | Low | **closed 5.9.28, confirmed** | `audit_time_ms: null` with `findings_status: "not_computed"` and the rule stated beside it. |
|
|
109
|
+
| `retrieve security-surface --target` | Low | **closed 5.9.28, confirmed** | The refusal states the intent is repository-wide and names `ask retrieve security-chain --target <symbol>`. |
|
|
110
|
+
| `ALT-08` (arithmetic half) | Low | **fixed, field verification still owed** | Not verified this round and the auditor says so plainly: they exercised `ask review-pr`, which carries no `_truncation_summary` at all, instead of `ask prepare-context review-pr`, the command the field owns. Neither claimed nor refuted. Re-verify with the correct command before treating the field evidence as either way. |
|
|
111
|
+
| `migrate-check` / `migrate-apply` | — | **reliable two sessions running** | 1/1 and 1/1 again (38–39 s, correct payloads). Two consecutive clean sessions after 0/5 in 5.9.26 — a trend rather than luck, and the shape of what a fixed audit-family command should look like. |
|
|
112
|
+
| `ask --help` latency | Low | **open, still not a command-level defect** | 12.3 s cold, 2.9 s on immediate repetition on the audit machine, against 0.41–0.44 s on the engineering host. Consistent with residual contention; not reproduced as a defect of the command in either place. |
|
|
113
|
+
| `BUG-22`/`REG-02`, `BUG-10`, `ALT-07`, `ALT-10`, `BUG-02`, `BUG-12`, `BUG-09`, `BUG-23` | — | **open/unchanged, not relaunched** | Time budget, and no regression signal. `BUG-10` in particular cannot be exercised on this repository — it has none of the routing styles that fix detects. |
|
|
114
|
+
|
|
115
|
+
**No regression was found against 5.9.27, and the upgrade is recommended
|
|
116
|
+
unconditionally** — the first round in six where the auditor reports a net,
|
|
117
|
+
verified improvement with nothing new broken. The release gate is unchanged:
|
|
118
|
+
the audit-command family is still not usable for unattended CI on this
|
|
119
|
+
repository.
|
|
120
|
+
|
|
17
121
|
## Current Synchronization — Release `5.9.28`, nine rows closed on the 5.9.27 queue (2026-09-02)
|
|
18
122
|
|
|
19
123
|
**`R-01`'s architectural question is answered in source, and the answer was
|
sourcecode/_docs/USER_GUIDE.md
CHANGED
sourcecode/audit_recipe.py
CHANGED
|
@@ -127,6 +127,12 @@ MANUAL_BASIS: "dict[str, str]" = {
|
|
|
127
127
|
"clause) and an injection sink for a value, and an executor cannot tell "
|
|
128
128
|
"them apart without the caller's intent"
|
|
129
129
|
),
|
|
130
|
+
"SEC-010": (
|
|
131
|
+
"the repair is a parameterised query, and turning a concatenated string "
|
|
132
|
+
"into a bound statement changes both the SQL and the call that issues "
|
|
133
|
+
"it — the placeholders, their order and their types are decisions about "
|
|
134
|
+
"the query, not a rewrite an executor can derive from the concatenation"
|
|
135
|
+
),
|
|
130
136
|
"SEC-009": (
|
|
131
137
|
"whether an anonymous request matcher is intentional depends on the "
|
|
132
138
|
"deployment profile and authorization policy, so removing it would be "
|
sourcecode/cli.py
CHANGED
|
@@ -2243,6 +2243,18 @@ def _stamp_envelope(content: str) -> str:
|
|
|
2243
2243
|
except Exception as _exc:
|
|
2244
2244
|
degraded = degraded or f"concurrency disclosure unavailable: {type(_exc).__name__}"
|
|
2245
2245
|
|
|
2246
|
+
# R-01-INFLIGHT: an earlier invocation on this machine that stopped where
|
|
2247
|
+
# it could not report from. Published by this run because that one cannot
|
|
2248
|
+
# publish anything — absent, never invented, when there is nothing to say.
|
|
2249
|
+
try:
|
|
2250
|
+
from sourcecode import inflight as _inflight
|
|
2251
|
+
|
|
2252
|
+
_incomplete = _inflight.disclosure()
|
|
2253
|
+
if _incomplete is not None:
|
|
2254
|
+
extra["incomplete_runs"] = _incomplete
|
|
2255
|
+
except Exception as _exc:
|
|
2256
|
+
degraded = degraded or f"inflight disclosure unavailable: {type(_exc).__name__}"
|
|
2257
|
+
|
|
2246
2258
|
# AUD-601-M01: the state a figure was taken in, from the lookups the layers
|
|
2247
2259
|
# actually answered. Four retracted performance findings in six rounds were
|
|
2248
2260
|
# all measured honestly against a cache state nobody could establish; a
|
|
@@ -3082,6 +3094,18 @@ REQUIRED_ANSWER_COMMANDS: "frozenset[str]" = frozenset({
|
|
|
3082
3094
|
"verify",
|
|
3083
3095
|
})
|
|
3084
3096
|
|
|
3097
|
+
#: Commands that open an in-flight marker (`R-01-INFLIGHT`). The audit family
|
|
3098
|
+
#: is where the empty-`exit 0` defect lives, and these two are where the field
|
|
3099
|
+
#: reports the *other* unexplained shape: `onboard` swung from 904 ms to a full
|
|
3100
|
+
#: 200-second external kill inside one session (`ALT-10`) and `remediate` went
|
|
3101
|
+
#: from a 23,6-second answer to hangs past 400 s (`ALT-07`). A marker costs one
|
|
3102
|
+
#: small write per phase change and is the only evidence either row can leave
|
|
3103
|
+
#: behind, so the gate covers them too. `--help` and the light path are not
|
|
3104
|
+
#: charged for it.
|
|
3105
|
+
MARKED_COMMANDS: "frozenset[str]" = REQUIRED_ANSWER_COMMANDS | {
|
|
3106
|
+
"onboard", "remediate",
|
|
3107
|
+
}
|
|
3108
|
+
|
|
3085
3109
|
|
|
3086
3110
|
def _record_output_promise(argv: "list[str]") -> None:
|
|
3087
3111
|
"""Note that this invocation asked for a file, before anything is parsed.
|
|
@@ -4270,6 +4294,12 @@ COMMANDS_WITHOUT_BOUNDING: "frozenset[str]" = frozenset({
|
|
|
4270
4294
|
|
|
4271
4295
|
|
|
4272
4296
|
#: The one help string for `--jobs` (F-AQ; the scope sentence is C3-84/CL-18).
|
|
4297
|
+
#: The largest worker count `--jobs` accepts. One constant, because the number
|
|
4298
|
+
#: appeared twice — in the range Click enforces and in the sentence the help
|
|
4299
|
+
#: prints — and a bound stated in two places is a bound that can disagree with
|
|
4300
|
+
#: itself.
|
|
4301
|
+
JOBS_MAX = 128
|
|
4302
|
+
|
|
4273
4303
|
JOBS_OPTION_HELP = (
|
|
4274
4304
|
"Worker processes used to parse files (default: CPU count − 1). "
|
|
4275
4305
|
"`--jobs 1` parses in this process. Parallelism only warms the "
|
|
@@ -4279,6 +4309,7 @@ JOBS_OPTION_HELP = (
|
|
|
4279
4309
|
"clock and every rule together 8 %, so this flag covers the phase that holds "
|
|
4280
4310
|
"the cost — but only while there is something to parse, and on a warm cache "
|
|
4281
4311
|
"there is not, so raising it buys nothing there. Env: ASK_JOBS."
|
|
4312
|
+
f" Maximum accepted value: {JOBS_MAX}."
|
|
4282
4313
|
)
|
|
4283
4314
|
|
|
4284
4315
|
|
|
@@ -4311,8 +4342,8 @@ def _jobs_option() -> Any:
|
|
|
4311
4342
|
"--jobs",
|
|
4312
4343
|
"-j",
|
|
4313
4344
|
min=1,
|
|
4314
|
-
max=
|
|
4315
|
-
help=JOBS_OPTION_HELP
|
|
4345
|
+
max=JOBS_MAX,
|
|
4346
|
+
help=JOBS_OPTION_HELP,
|
|
4316
4347
|
)
|
|
4317
4348
|
|
|
4318
4349
|
|
|
@@ -12899,6 +12930,11 @@ def spring_audit_cmd(
|
|
|
12899
12930
|
# that the rule pass asks it.
|
|
12900
12931
|
_rules_cut: list[str] = []
|
|
12901
12932
|
_phases_cut: list[str] = []
|
|
12933
|
+
# ALT-03: the two rule-pass observers, named before the scope
|
|
12934
|
+
# branches so a scope that runs one of them can still publish the
|
|
12935
|
+
# family timings of the one that ran.
|
|
12936
|
+
_tx_watch: Any = None
|
|
12937
|
+
_sec_watch: Any = None
|
|
12902
12938
|
# C3-79: families the budget stopped *inside*, with how far each got.
|
|
12903
12939
|
_rules_partial: list[dict] = []
|
|
12904
12940
|
_projection_stages_cut: list[str] = []
|
|
@@ -13009,6 +13045,28 @@ def spring_audit_cmd(
|
|
|
13009
13045
|
# assembled — so `unaccounted_ms` covers exactly what it claims:
|
|
13010
13046
|
# serialization, ceiling estimation and interpreter start.
|
|
13011
13047
|
combined.metadata["timings"] = _timings.to_dict()
|
|
13048
|
+
# ALT-03 (5.9.28 bisection): `security_rules` is one phase and six
|
|
13049
|
+
# families, and the bisection measured 47 % of a 3 860-file audit
|
|
13050
|
+
# inside a single one of them — with the heartbeat line for that
|
|
13051
|
+
# family unchanged for 10.6 s at the end, which from outside is
|
|
13052
|
+
# indistinguishable from a hang. The phase split could not say
|
|
13053
|
+
# which family; this can. Absent when no family ran, never zeroed.
|
|
13054
|
+
_family_ms: "dict[str, float]" = {}
|
|
13055
|
+
for _watch in (_tx_watch, _sec_watch):
|
|
13056
|
+
for _rule_id, _ms in (getattr(_watch, "durations_ms", {}) or {}).items():
|
|
13057
|
+
_family_ms[_rule_id] = round(_family_ms.get(_rule_id, 0.0) + _ms, 2)
|
|
13058
|
+
if _family_ms:
|
|
13059
|
+
combined.metadata["timings"]["rule_families"] = dict(
|
|
13060
|
+
sorted(_family_ms.items(), key=lambda kv: kv[1], reverse=True)
|
|
13061
|
+
)
|
|
13062
|
+
combined.metadata["timings"]["rule_families_basis"] = (
|
|
13063
|
+
"Wall time per rule family inside the rule phases above, "
|
|
13064
|
+
"highest first. The families are not comparable units — one "
|
|
13065
|
+
"walks every symbol in the repository, the next reads one "
|
|
13066
|
+
"annotation — so this ranks cost, not complexity. A family "
|
|
13067
|
+
"cut by the budget is absent here and named in "
|
|
13068
|
+
"`_partial.rules_not_run`."
|
|
13069
|
+
)
|
|
13012
13070
|
if _excluded_tests and not include_tests:
|
|
13013
13071
|
combined.limitations.append(
|
|
13014
13072
|
f"{len(_excluded_tests)} test source(s) were excluded from this "
|
|
@@ -21825,6 +21883,19 @@ def main_entry() -> None:
|
|
|
21825
21883
|
if any(tok in REQUIRED_ANSWER_COMMANDS for tok in sys.argv[1:]):
|
|
21826
21884
|
from sourcecode import empty_answer_diagnostics as _diag
|
|
21827
21885
|
_diag.record_entry_reached(sys.argv[1:])
|
|
21886
|
+
# R-01-INFLIGHT (5.9.28 re-audit): the entry trace proves the process
|
|
21887
|
+
# started and nothing after that. Four `spring-audit` hangs in one session
|
|
21888
|
+
# produced no payload, no sidecar and no phase — every diagnostic this
|
|
21889
|
+
# product had lived on a path a hung run never reaches. The marker opened
|
|
21890
|
+
# here survives an external kill and names the phase and stage the run
|
|
21891
|
+
# stopped in, over the commands the field reports hanging.
|
|
21892
|
+
if any(tok in MARKED_COMMANDS for tok in sys.argv[1:]):
|
|
21893
|
+
try:
|
|
21894
|
+
from sourcecode import inflight as _inflight
|
|
21895
|
+
|
|
21896
|
+
_inflight.begin(sys.argv[1:])
|
|
21897
|
+
except Exception:
|
|
21898
|
+
pass
|
|
21828
21899
|
# R-01 (5.9.27 alternative audit): announce this invocation on the machine
|
|
21829
21900
|
# before any work, so a peer that starts later sizes its worker pool
|
|
21830
21901
|
# against a census that includes this run — and so this run's own payload
|
|
@@ -21849,7 +21920,11 @@ def main_entry() -> None:
|
|
|
21849
21920
|
try:
|
|
21850
21921
|
from sourcecode import resource_budget as _rb_arm
|
|
21851
21922
|
|
|
21852
|
-
_rb_arm.arm(
|
|
21923
|
+
_rb_arm.arm(
|
|
21924
|
+
"ask " + next(
|
|
21925
|
+
(tok for tok in sys.argv[1:] if not tok.startswith("-")), ""
|
|
21926
|
+
).strip()
|
|
21927
|
+
)
|
|
21853
21928
|
except Exception:
|
|
21854
21929
|
pass
|
|
21855
21930
|
from sourcecode.perf import mark_command_start as _mark_command_start
|
sourcecode/concurrency.py
CHANGED
|
@@ -62,12 +62,18 @@ from typing import Any, Optional
|
|
|
62
62
|
#: is precisely the shape the 5.9.27 audit found).
|
|
63
63
|
_LEASE_DIR_NAME = "live"
|
|
64
64
|
|
|
65
|
-
#: A lease
|
|
66
|
-
#: signal available on Windows,
|
|
67
|
-
#:
|
|
68
|
-
#:
|
|
69
|
-
#:
|
|
70
|
-
|
|
65
|
+
#: A lease not refreshed for this long is treated as abandoned. It is the only
|
|
66
|
+
#: liveness signal available on Windows, and the number matters there: the
|
|
67
|
+
#: field's own harness kills runs with `timeout` constantly, so a lease that
|
|
68
|
+
#: outlives its process by an hour would make every later run on that machine
|
|
69
|
+
#: believe it is sharing the cores with a corpse and halve its pool. Live runs
|
|
70
|
+
#: refresh the lease at every phase change (`touch`), so this only has to
|
|
71
|
+
#: outlast the longest single phase, not the longest run.
|
|
72
|
+
LEASE_TTL_S = 900.0
|
|
73
|
+
|
|
74
|
+
#: Leases kept before the oldest are dropped. A machine whose runs are killed
|
|
75
|
+
#: faster than the sweep can prove them dead must not grow this directory.
|
|
76
|
+
_MAX_LEASES = 200
|
|
71
77
|
|
|
72
78
|
#: Set inside parallel workers (`parallel.ENV_WORKER`). A worker is not an
|
|
73
79
|
#: invocation and must never be counted as one, or a pool would be observed
|
|
@@ -139,11 +145,36 @@ def register(argv: "Optional[list[str]]" = None) -> None:
|
|
|
139
145
|
encoding="utf-8",
|
|
140
146
|
)
|
|
141
147
|
_own_lease = path
|
|
148
|
+
_prune(directory)
|
|
142
149
|
atexit.register(release)
|
|
143
150
|
except Exception:
|
|
144
151
|
_own_lease = None
|
|
145
152
|
|
|
146
153
|
|
|
154
|
+
def touch() -> None:
|
|
155
|
+
"""Refresh this invocation's lease so a peer can tell it from a corpse.
|
|
156
|
+
|
|
157
|
+
Called from `progress._record_phase`, the same seam the in-flight marker
|
|
158
|
+
uses: a run that is reporting phases is a run that is alive, and on
|
|
159
|
+
Windows that timestamp is the only liveness evidence a peer can read.
|
|
160
|
+
"""
|
|
161
|
+
if _own_lease is None:
|
|
162
|
+
return
|
|
163
|
+
try:
|
|
164
|
+
os.utime(_own_lease, None)
|
|
165
|
+
except Exception:
|
|
166
|
+
pass
|
|
167
|
+
|
|
168
|
+
|
|
169
|
+
def _prune(directory: Path) -> None:
|
|
170
|
+
try:
|
|
171
|
+
leases = sorted(directory.glob("*.json"), key=lambda p: p.stat().st_mtime)
|
|
172
|
+
for stale in leases[: max(0, len(leases) - _MAX_LEASES)]:
|
|
173
|
+
stale.unlink(missing_ok=True)
|
|
174
|
+
except Exception:
|
|
175
|
+
pass
|
|
176
|
+
|
|
177
|
+
|
|
147
178
|
def release() -> None:
|
|
148
179
|
"""Drop this invocation's lease. Idempotent; never raises."""
|
|
149
180
|
global _own_lease
|
|
@@ -153,6 +153,31 @@ def _infer_role(name: str, ecosystem: str, scope: str) -> str:
|
|
|
153
153
|
return "devtool" if is_dev else "runtime"
|
|
154
154
|
|
|
155
155
|
|
|
156
|
+
#: Every file this analyzer reads from a repository root, and therefore every
|
|
157
|
+
#: file whose bytes decide its answer. `manifest_cache` keys its entries on
|
|
158
|
+
#: exactly this set: the lockfiles were missing from that key, so two roots
|
|
159
|
+
#: with identical manifests and *different* resolved dependencies shared one
|
|
160
|
+
#: cache entry — a stale answer with nothing in it to say so. The battery in
|
|
161
|
+
#: `tests/test_manifest_cache.py` reads this module's own source and fails if a
|
|
162
|
+
#: filename it opens is absent here, because a vocabulary kept by hand beside
|
|
163
|
+
#: the code that uses it is the drift this repository has a rule against.
|
|
164
|
+
INPUT_FILENAMES = frozenset({
|
|
165
|
+
# Java / JVM
|
|
166
|
+
"pom.xml", "build.gradle", "build.gradle.kts", "gradle.properties",
|
|
167
|
+
# Node
|
|
168
|
+
"package.json", "package-lock.json", "pnpm-lock.yaml", "yarn.lock",
|
|
169
|
+
# Python
|
|
170
|
+
"pyproject.toml", "requirements.txt", "requirements-dev.txt",
|
|
171
|
+
"requirements.lock", "poetry.lock", "uv.lock", "Pipfile.lock",
|
|
172
|
+
# PHP / Ruby / Rust / Go / .NET
|
|
173
|
+
"composer.json", "composer.lock", "Gemfile", "Gemfile.lock",
|
|
174
|
+
"Cargo.toml", "Cargo.lock", "go.mod", "packages.lock.json",
|
|
175
|
+
})
|
|
176
|
+
|
|
177
|
+
#: Matched by suffix rather than by name (one project file per directory).
|
|
178
|
+
INPUT_SUFFIXES = (".csproj",)
|
|
179
|
+
|
|
180
|
+
|
|
156
181
|
class DependencyAnalyzer:
|
|
157
182
|
"""Resuelve dependencias desde manifests y lockfiles sin ejecutar toolchains."""
|
|
158
183
|
|
|
@@ -79,6 +79,17 @@ def record(command: Optional[str], reason: str, **extra: Any) -> Optional[str]:
|
|
|
79
79
|
"python": sys.version.split()[0],
|
|
80
80
|
"platform": sys.platform,
|
|
81
81
|
}
|
|
82
|
+
# R-01-INFLIGHT: what else on this machine stopped without reporting.
|
|
83
|
+
# A guard firing now, with three abandoned markers beside it, is a
|
|
84
|
+
# different situation from a guard firing on a quiet machine.
|
|
85
|
+
try:
|
|
86
|
+
from sourcecode import inflight as _inflight
|
|
87
|
+
|
|
88
|
+
_abandoned = _inflight.abandoned()
|
|
89
|
+
if _abandoned:
|
|
90
|
+
snapshot["abandoned_runs"] = _abandoned[:10]
|
|
91
|
+
except Exception:
|
|
92
|
+
pass
|
|
82
93
|
snapshot.update(extra)
|
|
83
94
|
directory = _diagnostics_dir()
|
|
84
95
|
directory.mkdir(parents=True, exist_ok=True)
|