sourcecode 5.9.27__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 +223 -0
- sourcecode/_docs/USER_GUIDE.md +1 -1
- sourcecode/audit_recipe.py +6 -0
- sourcecode/cache.py +81 -4
- sourcecode/cli.py +238 -8
- sourcecode/concurrency.py +295 -0
- sourcecode/context_cache.py +43 -2
- sourcecode/degradation.py +15 -0
- 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/output_budget.py +49 -10
- sourcecode/parallel.py +35 -2
- sourcecode/progress.py +34 -0
- sourcecode/repository_ir.py +149 -0
- sourcecode/resource_budget.py +106 -0
- sourcecode/risk.py +99 -19
- sourcecode/rule_pass.py +18 -0
- sourcecode/spring_findings.py +8 -0
- sourcecode/spring_impact.py +17 -3
- sourcecode/spring_security_audit.py +15 -2
- {sourcecode-5.9.27.dist-info → sourcecode-5.9.29.dist-info}/METADATA +3 -3
- {sourcecode-5.9.27.dist-info → sourcecode-5.9.29.dist-info}/RECORD +30 -28
- {sourcecode-5.9.27.dist-info → sourcecode-5.9.29.dist-info}/WHEEL +0 -0
- {sourcecode-5.9.27.dist-info → sourcecode-5.9.29.dist-info}/entry_points.txt +0 -0
- {sourcecode-5.9.27.dist-info → sourcecode-5.9.29.dist-info}/licenses/LICENSE +0 -0
- {sourcecode-5.9.27.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,8 +14,231 @@ 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
|
+
|
|
121
|
+
## Current Synchronization — Release `5.9.28`, nine rows closed on the 5.9.27 queue (2026-09-02)
|
|
122
|
+
|
|
123
|
+
**`R-01`'s architectural question is answered in source, and the answer was
|
|
124
|
+
"exclusive use".** `parallel.default_jobs()` returned `cpu_count() - 1` for
|
|
125
|
+
each process independently, so `k` concurrent `ask` invocations started
|
|
126
|
+
`k × (N-1)` parsing workers on `N` cores — and no field in any payload said the
|
|
127
|
+
run had been sharing the machine. That is what four rounds of "same command,
|
|
128
|
+
sometimes fast, sometimes hung, no per-process variable distinguishing the two"
|
|
129
|
+
looks like from outside. The cache was *not* the same kind of defect: writes
|
|
130
|
+
are unique-temp + `os.replace` with retry and every read is guarded, so a
|
|
131
|
+
concurrent writer degrades a peer to a cache miss; the one operation that hurt
|
|
132
|
+
a peer was eviction, which now defers while a peer is live.
|
|
133
|
+
|
|
134
|
+
Every row marked **fixed** below is closed in release `5.9.28`; the two
|
|
135
|
+
open rows say what closure still needs. This batch does not claim to close
|
|
136
|
+
the erratic-failure row — one hang was
|
|
137
|
+
observed with nothing else running, and that is unexplained. It removes the
|
|
138
|
+
mechanism the 5.9.27 round evidenced, and gives the next round the variable it
|
|
139
|
+
did not have: `_meta.concurrency` on every answer.
|
|
140
|
+
|
|
141
|
+
**Measured here, for the two latency rows:** `ask --help` is 0.41–0.44 s on
|
|
142
|
+
this machine over three consecutive runs (the audit measured 14.4–14.7 s under
|
|
143
|
+
confirmed contention). That is not a refutation of the field figure — it is a
|
|
144
|
+
different machine — but it does put the row behind `R-01` rather than beside
|
|
145
|
+
it, and the next round can separate them with the disclosure block above.
|
|
146
|
+
|
|
147
|
+
| ID | Severity | Status | Evidence and required closure |
|
|
148
|
+
|---|---:|---|---|
|
|
149
|
+
| `R-01` (contention) | Critical maximum | **mechanism removed, row open pending field re-measure** | `concurrency.py` keeps a best-effort census of live invocations (one lease per process, swept by pid liveness on POSIX and lease age everywhere — never `os.kill(pid, 0)` on Windows, where CPython maps a non-console signal onto `TerminateProcess` and the POSIX idiom would kill the peer it was counting). `parallel.default_jobs()` divides the worker budget by that census; `cache._gc` defers eviction while a peer is live; `_meta.concurrency` publishes peers at start, whether the budget was shared, and that a shared run is not an isolated-machine measurement. `ASK_NO_CONCURRENCY_CENSUS=1` restores the previous behaviour. Closure needs a field round measuring the same commands with the block attached. |
|
|
150
|
+
| `BUG-22` / `REG-02` (enforcement half) | High | **fixed** | The ceiling was checked at phase boundaries only, so a phase could allocate without bound and be refused once it finished — the 2 029.92 MB peak under a 1 536 MB ceiling that was genuinely in force. `resource_budget` now arms a ceiling, samples it inside the parse loop (throttled to one footprint sample per 0.5 s; a per-file call costs one clock read) and raises a typed `CeilingExceeded` that the CLI renders as the same `MEMORY_TOO_LARGE` refusal the boundary check emits. Deliberately not a sampler thread: a thread can see the crossing but cannot unwind the main thread anywhere safe. `_meta.memory.enforcement` publishes when the ceiling is checked. |
|
|
151
|
+
| `BUG-10` | High | **fixed** | The zero-endpoint answer had four named detections and everything else fell through to "no recognized routing construct was found", which reads as *no HTTP surface*. `unmodeled_routing_evidence` now publishes files declaring an annotation whose argument is a path-like string literal that produced no endpoint — a rule that names no framework, per this repository's vendor-agnostic convention. Measured: `struts` reports 4 files under `@Action`/`@Namespace` where the answer used to say nothing was found; `spring-petclinic` reports none. |
|
|
152
|
+
| `NEW-02` / `BUG-05` | High | **fixed** | Overloaded handlers all inherited the final overload's line because the symbol index is keyed `Class#method` with no parameter types. The extractor has no signature to disambiguate with, so the row's other branch applies: `overload_count`, `anchor_ambiguity` and `anchor_candidate_lines` are published per entry, with `anchor_ambiguity_note` once beside the list, and an unambiguous anchor carries none of it. |
|
|
153
|
+
| `BUG-13` | High | **fixed** | `selftest .` over nested repositories warned and then ran the ledger against the workspace — the shape behind `selftest` falling from 9/12 to 1/12 rows inside one 120 s deadline. The implicit `.` now refuses with `INVALID_USAGE` before any row runs, naming the count, with `--allow-nested` for a caller who means the workspace. |
|
|
154
|
+
| `BUG-16` | High | **fixed** | The context cache's caps (30-day TTL, 256 entries) were real and lived inside `_gc`, so ~1.7 GB of growth had no readable contract. `cache.eviction_contract()` and `context_cache.eviction_contract()` are now the one authority each `_gc` reads, and `cache status` publishes them per store in JSON and text. The parse store already published its budget; its block projects those same figures rather than measuring them again. |
|
|
155
|
+
| `ALT-08` (arithmetic half) | Low | **fixed** | `_truncation_summary.final_size_bytes` was measured before the summary and `_budget_note` were attached, so the one part of the payload the accounting omitted was the accounting. It is now measured over the assembled object and republished to a fixed point, with `final_size_basis` written before the fixed point is sought and `content_size_bytes` keeping the trimmed-content figure under a name that says which it is. |
|
|
156
|
+
| `ALT-25` (`impact-chain` audit clock) | Low | **fixed** | `metadata.audit_time_ms` was always ~0.0 on the default path and the 5.9.25 round read it as a security phase skipped by `ALT-03`. It is not: `include_findings` is opt-in, so the clock measured the elapsed time of *not* running an audit. It is `null` when `findings_status` is `not_computed`, and `query_time_basis` states the rule. |
|
|
157
|
+
| `retrieve security-surface --target` | Low | **fixed** | Four rounds tried it and got "No such option: --target". The intent is repository-wide by construction, and the refusal now says so and names `security-chain --target`, derived from `intent_router.ANCHOR_KINDS` rather than a second list. |
|
|
158
|
+
| `ask --help` latency | Low | **open, not reproduced here** | 0.41–0.44 s over three runs on the engineering host against 14.4–14.7 s in the field under confirmed contention. Re-measure with `_meta.concurrency` attached before treating it as its own row. |
|
|
159
|
+
| `ALT-07` (`remediate` hang), `ALT-10` (`onboard`) | Medium | **open, unchanged** | Both share the erratic signature `R-01` now instruments. No separate mechanism found in source this round; neither reproduces on the engineering host. |
|
|
160
|
+
| `BUG-02`, `BUG-12` | Critical maximum | **open, unchanged** | Both need the field's own large repository to reproduce (`rc=127` with no output; multi-gigabyte RSS while building a small answer). `BUG-22`'s sampler bounds the second one's damage without closing it. |
|
|
161
|
+
|
|
162
|
+
## Current Synchronization — Alternative External Audit `5.9.27`, shared-machine contention confirmed (2026-09-02)
|
|
163
|
+
|
|
164
|
+
**First score uptick in four rounds (3.8 → 4.6/10), with a large
|
|
165
|
+
qualification found mid-session: the audit machine was shared with a second,
|
|
166
|
+
independent `ask` test harness.** The native-Windows auditor found
|
|
167
|
+
`entry-trace.jsonl` (this ledger's own diagnostic, added last round) growing
|
|
168
|
+
with invocations they never launched, against five OSS reference
|
|
169
|
+
repositories under the exact same `timeout N ask ...` harness pattern they
|
|
170
|
+
use, and confirmed a live foreign `ask.exe` process via `Get-CimInstance
|
|
171
|
+
Win32_Process` under their own Windows user. Two of their own `spring-audit`
|
|
172
|
+
hangs overlapped a 525-second window of 34 foreign invocations. Full
|
|
173
|
+
evidence:
|
|
174
|
+
[`AUDIT-2026-09-02-ALTERNATIVE-5.9.27.md`](AUDIT-2026-09-02-ALTERNATIVE-5.9.27.md).
|
|
175
|
+
|
|
176
|
+
**`R-01` (new, highest priority):** if ASK's shared worker pool and cache do
|
|
177
|
+
not isolate concurrent `ask` processes on one machine, contention could
|
|
178
|
+
produce exactly the pattern reported since 5.9.23 — the same command
|
|
179
|
+
sometimes hanging, sometimes returning empty near-instantly, no per-process
|
|
180
|
+
variable distinguishing the two. This is a real, evidenced contributing
|
|
181
|
+
factor, not a proven sole cause (one hang occurred after 20 seconds of no
|
|
182
|
+
foreign activity at all). The open question for engineering: is ASK's worker
|
|
183
|
+
pool designed to tolerate concurrent `ask` invocations on one machine, or
|
|
184
|
+
does it assume exclusive use? If the latter, that is an architectural
|
|
185
|
+
constraint, not a series of unrelated command bugs, and changes where the
|
|
186
|
+
fix belongs.
|
|
187
|
+
|
|
188
|
+
**Entry-point trace progress, confirmed:** the auditor's own invocations —
|
|
189
|
+
including ones that returned empty or hung — now appear in `entry-trace.jsonl`
|
|
190
|
+
(the fix from last round's `R-01`). This confirms `main_entry` is reached on
|
|
191
|
+
the failing runs. `empty_answer_diagnostics.record()` still never fired on
|
|
192
|
+
any observed failure this session, which narrows the search specifically to
|
|
193
|
+
somewhere between `main_entry` and the output-promise guard — a materially
|
|
194
|
+
smaller surface than "somewhere in the process," three rounds ago.
|
|
195
|
+
|
|
196
|
+
| ID | Severity | Status | Evidence and required closure |
|
|
197
|
+
|---|---:|---|---|
|
|
198
|
+
| `R-01` (contention) | Critical maximum | **open, new evidenced hypothesis** | Confirmed shared-machine contention during this audit session (foreign `ask` process, matching harness pattern, overlapping timing with 2 of the auditor's own hangs). Needs an internal answer, not more external symptom-chasing: does the worker pool serialize or isolate concurrent invocations, or assume exclusive use? If it assumes exclusive use, `ALT-01`/`ALT-03`/`NEW-01` may be one architectural defect, not several. |
|
|
199
|
+
| `R-01` (entry trace) | — | **confirmed working, narrows the search** | The auditor's own failing invocations now appear in `entry-trace.jsonl`. `main_entry` is reached; the gap is between there and `_fail_on_missing_required_answer`/`_fail_on_unkept_output_promise`, which still never fire. |
|
|
200
|
+
| `ALT-09` | Critical | **fixed, reconfirmed a third session** | Piped `n` to `cache clear` aborts correctly. |
|
|
201
|
+
| `BUG-15` / `BUG-21` | Low | **fixed, reconfirmed** | No markup leak; `--jobs` range validated. |
|
|
202
|
+
| `R-05` from last round (`selftest` itemization) | High | **fixed, reconfirmed** | `"10 ledger row(s) could not run: ASK-16, B6, E-37, ..."` replaces the prior generic slug. |
|
|
203
|
+
| `onboard` | Medium | **open, still the most erratic single measurement** | 904ms to a full 200s external kill, same invocation, same tree, within one session. Cross-reference against `entry-trace.jsonl` timing before assuming a cold/warm explanation. |
|
|
204
|
+
| `ask --help` latency | Low | **open, persisted a second round** | 14.4-14.7s this session (was 3-4s last round, flagged then as "worth its own row if it persists"). It has persisted. Not verified in isolation from `R-01`'s contention this session. |
|
|
205
|
+
|
|
206
|
+
The remaining rows (`BUG-01`, `BUG-03`, `BUG-06`, `BUG-08` through `BUG-23`,
|
|
207
|
+
`REG-02`, `REG-03`, `NEW-02`) were not relaunched this round for time budget;
|
|
208
|
+
no regression signal against them. `watch`'s ~55s warm-before-first-tick and
|
|
209
|
+
`retrieve security-surface --target` remain unchanged, correctly understood
|
|
210
|
+
as real cost and a known gap respectively, not new defects.
|
|
211
|
+
|
|
212
|
+
**Corroborating data point, unverified in detail:** a separate exchange the
|
|
213
|
+
same session referenced a distinct "External" lineage audit of 5.9.27 scoring
|
|
214
|
+
**8.1/10** on the five OSS reference repositories found in the trace above —
|
|
215
|
+
consistent with the shared-machine hypothesis (two lineages, two repo
|
|
216
|
+
populations, one machine) but not independently confirmed here; the
|
|
217
|
+
transcript fragment available was too corrupted to verify its table in
|
|
218
|
+
detail and is not published as a standalone audit document.
|
|
219
|
+
|
|
17
220
|
## Current Synchronization — External Audit `5.9.26`, self-contradictory session (2026-09-02)
|
|
18
221
|
|
|
222
|
+
> **Provenance correction, added during the 5.9.27 round.** The
|
|
223
|
+
> native-Windows auditor for 5.9.27 states plainly that the "initial
|
|
224
|
+
> 129-invocation pass ... 0/23 ... 7.4/10" described below does not
|
|
225
|
+
> correspond to anything they ran. The 5.9.27 round independently confirmed
|
|
226
|
+
> the audit machine was shared with a second, concurrent `ask` test harness
|
|
227
|
+
> exercising five OSS reference repositories (`thingsboard`, `mall`,
|
|
228
|
+
> `struts`, `spring-petclinic`, `jhipster-sample-app`) — a repo set and
|
|
229
|
+
> pattern that matches the "External" multi-repository lineage this ledger
|
|
230
|
+
> has tracked separately since 5.9.22 (`AUDIT-2026-09-02-EXTERNAL-5.9.26.md`
|
|
231
|
+
> below, and the 6.3→3.8 scores it reflects). The likely explanation is that
|
|
232
|
+
> the two-pass narrative below mixed observations from two independent,
|
|
233
|
+
> concurrent sessions on one shared machine rather than being one
|
|
234
|
+
> evaluator's self-revision. Left as written below rather than rewritten,
|
|
235
|
+
> with this correction attached, per this ledger's own discipline of
|
|
236
|
+
> recording when it got something wrong rather than quietly fixing the
|
|
237
|
+
> record. See
|
|
238
|
+
> [`AUDIT-2026-09-02-ALTERNATIVE-5.9.27.md`](AUDIT-2026-09-02-ALTERNATIVE-5.9.27.md)
|
|
239
|
+
> for the evidence (`entry-trace.jsonl` cross-contamination, a live foreign
|
|
240
|
+
> process confirmed via `Get-CimInstance Win32_Process`).
|
|
241
|
+
|
|
19
242
|
**The 5.9.26 fix batch did not close the release gate, and new evidence
|
|
20
243
|
narrows the failure to before the guard rather than inside it.** This audit
|
|
21
244
|
round is internally contradictory and both halves are published rather than
|
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/cache.py
CHANGED
|
@@ -151,6 +151,49 @@ _DEFAULT_KEEP_COMMITS: int = 5
|
|
|
151
151
|
_DEFAULT_MAX_CORES: int = 20
|
|
152
152
|
_DEFAULT_MAX_SIZE_MB: int = 50
|
|
153
153
|
|
|
154
|
+
|
|
155
|
+
def eviction_contract() -> "dict[str, Any]":
|
|
156
|
+
"""The three caps this store evicts under, read once (BUG-16).
|
|
157
|
+
|
|
158
|
+
`_gc` used to read the environment inline, so the only way to learn what
|
|
159
|
+
bounded the cache was to read the sweep. A consumer asking `cache status`
|
|
160
|
+
what will be evicted, and when, now gets the same numbers the sweep uses.
|
|
161
|
+
"""
|
|
162
|
+
def _int(name: str, default: int) -> int:
|
|
163
|
+
try:
|
|
164
|
+
return int(os.environ.get(name, default))
|
|
165
|
+
except (TypeError, ValueError):
|
|
166
|
+
return default
|
|
167
|
+
|
|
168
|
+
keep = _int("SOURCECODE_CACHE_KEEP_COMMITS", _DEFAULT_KEEP_COMMITS)
|
|
169
|
+
max_cores = _int("SOURCECODE_CACHE_MAX_CORES", _DEFAULT_MAX_CORES)
|
|
170
|
+
max_size_mb = _int("SOURCECODE_CACHE_MAX_SIZE_MB", _DEFAULT_MAX_SIZE_MB)
|
|
171
|
+
clauses = []
|
|
172
|
+
if keep > 0:
|
|
173
|
+
clauses.append(f"the last {keep} distinct commits are kept")
|
|
174
|
+
if max_cores > 0:
|
|
175
|
+
clauses.append(f"at most {max_cores} cores, least recently used evicted first")
|
|
176
|
+
if max_size_mb > 0:
|
|
177
|
+
clauses.append(f"the store is trimmed toward {max_size_mb} MB")
|
|
178
|
+
return {
|
|
179
|
+
"keep_commits": keep,
|
|
180
|
+
"max_cores": max_cores,
|
|
181
|
+
"max_size_mb": max_size_mb,
|
|
182
|
+
"keep_commits_env": "SOURCECODE_CACHE_KEEP_COMMITS",
|
|
183
|
+
"max_cores_env": "SOURCECODE_CACHE_MAX_CORES",
|
|
184
|
+
"max_size_env": "SOURCECODE_CACHE_MAX_SIZE_MB",
|
|
185
|
+
"policy": (
|
|
186
|
+
"; ".join(clauses) + ", swept after each write"
|
|
187
|
+
if clauses else
|
|
188
|
+
"no eviction — every cap was set to 0 deliberately"
|
|
189
|
+
),
|
|
190
|
+
"deferred_while_shared": (
|
|
191
|
+
"A sweep is skipped while another `ask` invocation is live on this "
|
|
192
|
+
"machine (R-01): eviction would delete the working set a concurrent "
|
|
193
|
+
"run is reading."
|
|
194
|
+
),
|
|
195
|
+
}
|
|
196
|
+
|
|
154
197
|
#: Windows hardening for _atomic_write: os.replace can raise PermissionError
|
|
155
198
|
#: (WinError 5/32) when an antivirus scanner, search indexer, or concurrent
|
|
156
199
|
#: reader transiently holds the destination open. Retry briefly to ride it out.
|
|
@@ -501,27 +544,45 @@ def _store_breakdown(repo_root: Path, core_bytes: int) -> "dict[str, Any]":
|
|
|
501
544
|
"bytes": core_bytes,
|
|
502
545
|
"scope": "this repository",
|
|
503
546
|
"holds": "core snapshots, rendered views and their CAS blobs",
|
|
547
|
+
"eviction": eviction_contract(),
|
|
504
548
|
},
|
|
505
549
|
}
|
|
506
550
|
try:
|
|
507
551
|
from sourcecode.context_cache import ContextCache # noqa: PLC0415
|
|
508
552
|
|
|
509
553
|
ctx = ContextCache.for_repo(repo_root).stats()
|
|
554
|
+
from sourcecode.context_cache import ( # noqa: PLC0415
|
|
555
|
+
eviction_contract as _ctx_eviction,
|
|
556
|
+
)
|
|
557
|
+
|
|
510
558
|
out["shared_cir"] = {
|
|
511
559
|
"cache_dir": ctx["cache_dir"],
|
|
512
560
|
"entries": ctx["contexts"],
|
|
513
561
|
"bytes": ctx["bytes_stored"],
|
|
514
562
|
"scope": "this repository",
|
|
515
563
|
"holds": "the shared Canonical IR that explain/impact/posture reuse",
|
|
564
|
+
# BUG-16: measured at ~1.7 GB in two rounds with nothing published
|
|
565
|
+
# about what bounds it. The caps were real and lived inside `_gc`.
|
|
566
|
+
"eviction": _ctx_eviction(),
|
|
516
567
|
}
|
|
517
568
|
except Exception:
|
|
518
569
|
out["shared_cir"] = {"available": False}
|
|
519
570
|
try:
|
|
520
571
|
from sourcecode import parse_cache as _pc # noqa: PLC0415
|
|
521
572
|
|
|
573
|
+
_parse_stats = _pc.store_stats()
|
|
522
574
|
out["parse"] = {
|
|
523
|
-
**
|
|
575
|
+
**_parse_stats,
|
|
524
576
|
"holds": "per-file parses, content-addressed across every repository",
|
|
577
|
+
# BUG-16: this store already published its budget under its own
|
|
578
|
+
# names; the block below is that same answer projected under the
|
|
579
|
+
# name every store now answers to, never a second measurement.
|
|
580
|
+
"eviction": {
|
|
581
|
+
"policy": _parse_stats.get("policy"),
|
|
582
|
+
"budget_mb": _parse_stats.get("budget_mb"),
|
|
583
|
+
"budget_env": _parse_stats.get("budget_env"),
|
|
584
|
+
"sweep_interval_mb": _parse_stats.get("sweep_interval_mb"),
|
|
585
|
+
},
|
|
525
586
|
}
|
|
526
587
|
except Exception:
|
|
527
588
|
out["parse"] = {"available": False}
|
|
@@ -1080,9 +1141,25 @@ def _gc(cache_d: Path) -> None:
|
|
|
1080
1141
|
oldest core+snapshot files until under budget.
|
|
1081
1142
|
Views and CAS blobs are swept after each pass.
|
|
1082
1143
|
"""
|
|
1083
|
-
|
|
1084
|
-
|
|
1085
|
-
|
|
1144
|
+
# R-01 (5.9.27): eviction is the one cache operation a concurrent peer can
|
|
1145
|
+
# be hurt by. Writes are unique-temp + `os.replace` and every read is
|
|
1146
|
+
# guarded, so a peer degrades to a cache miss at worst — but `_gc` deletes
|
|
1147
|
+
# the working set a peer may be halfway through reading, turning its warm
|
|
1148
|
+
# run into a cold one for reasons nothing in its payload could name. A
|
|
1149
|
+
# deferred sweep costs disk until the machine is quiet; it is bounded by
|
|
1150
|
+
# the same caps on the next single-tenant run.
|
|
1151
|
+
try:
|
|
1152
|
+
from sourcecode import concurrency as _concurrency
|
|
1153
|
+
|
|
1154
|
+
if _concurrency.peers() > 0:
|
|
1155
|
+
return
|
|
1156
|
+
except Exception:
|
|
1157
|
+
pass
|
|
1158
|
+
|
|
1159
|
+
_contract = eviction_contract()
|
|
1160
|
+
keep = int(_contract["keep_commits"])
|
|
1161
|
+
max_cores = int(_contract["max_cores"])
|
|
1162
|
+
max_size_bytes = int(_contract["max_size_mb"]) * 1024 * 1024
|
|
1086
1163
|
|
|
1087
1164
|
try:
|
|
1088
1165
|
all_snapshots = list(cache_d.glob("snapshot-*.json.gz"))
|