sourcecode 5.9.28__py3-none-any.whl → 5.9.30__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.
Potentially problematic release.
This version of sourcecode might be problematic. Click here for more details.
- sourcecode/__init__.py +1 -1
- sourcecode/_build_commit.py +3 -3
- sourcecode/_docs/DEFECT-LEDGER.md +174 -0
- sourcecode/_docs/USER_GUIDE.md +1 -1
- sourcecode/audit_recipe.py +6 -0
- sourcecode/cli.py +239 -20
- sourcecode/concurrency.py +37 -6
- sourcecode/dependency_analyzer.py +25 -0
- sourcecode/detach.py +21 -1
- sourcecode/empty_answer_diagnostics.py +11 -0
- sourcecode/inflight.py +287 -0
- sourcecode/manifest_cache.py +11 -9
- sourcecode/non_coverage.py +14 -3
- sourcecode/progress.py +34 -0
- sourcecode/repository_ir.py +148 -62
- 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.30.dist-info}/METADATA +3 -3
- {sourcecode-5.9.28.dist-info → sourcecode-5.9.30.dist-info}/RECORD +25 -24
- {sourcecode-5.9.28.dist-info → sourcecode-5.9.30.dist-info}/WHEEL +0 -0
- {sourcecode-5.9.28.dist-info → sourcecode-5.9.30.dist-info}/entry_points.txt +0 -0
- {sourcecode-5.9.28.dist-info → sourcecode-5.9.30.dist-info}/licenses/LICENSE +0 -0
- {sourcecode-5.9.28.dist-info → sourcecode-5.9.30.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 = '793177c8ed2a19311a6951f0ef42ac6db158c8af'
|
|
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-08` (arithmetic half)': {'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-03` (statement half)': {'commit': '', 'status': 'uncited'}, '`BUG-09`': {'commit': '', 'status': 'uncited'}, '`BUG-10` (Vert.x residual)': {'commit': '', 'status': 'uncited'}, '`BUG-13`': {'commit': '', 'status': 'uncited'}, '`BUG-13`, `BUG-15`, `BUG-17`, `BUG-21`, `BUG-08`, `BUG-10`/`BUG-23`': {'commit': '', 'status': 'uncited'}, '`BUG-14`': {'commit': '', 'status': 'uncited'}, '`BUG-15`': {'commit': '', 'status': 'uncited'}, '`BUG-16`': {'commit': '', 'status': 'uncited'}, '`BUG-20`': {'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-01` (regime row)': {'commit': '', 'status': 'uncited'}, '`NEW-02` / `BUG-05`': {'commit': '', 'status': 'uncited'}, '`R-01-INFLIGHT` (stage capture)': {'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'}, '`SEC-010` cost': {'commit': '', 'status': 'uncited'}, '`retrieve security-surface --target`': {'commit': '', 'status': 'uncited'}}
|
|
5
|
+
CLOSURE_COVERAGE = {'closed_rows': 185, 'present': 91, 'absent': 0, 'unresolved': 0, 'uncited': 94, 'unknown': 0}
|
|
@@ -14,6 +14,180 @@ 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.30`, nine rows worked on the 5.9.29 queue (2026-09-02)
|
|
18
|
+
|
|
19
|
+
**A full pass over the open queue from the two 5.9.29 audits, one commit per
|
|
20
|
+
row, batteries run against every change.** Nine rows closed or materially
|
|
21
|
+
narrowed; two — `R-02` and the `pack assessment` default — investigated and
|
|
22
|
+
left open with the reasoning recorded, rather than guessed at.
|
|
23
|
+
|
|
24
|
+
| ID | Severity | Status | Evidence and required closure |
|
|
25
|
+
|---|---:|---|---|
|
|
26
|
+
| `R-01-INFLIGHT` (stage capture) | High | **closed** | `Progress.work()`'s sink was built only when the visible heartbeat was *enabled* — false off a TTY, in CI, under `NO_COLOR`, and piped through `timeout`, the field's configuration in all seven sessions. `_work_sink`/`_rule_pass_progress` now build the sink whenever a `Progress`/deadline object exists at all: `Progress.work()` is cheap regardless of whether it prints (a lock, a tuple compare, `_beat()`'s own internal `enabled` check), so an unwatched run's hang now records its stage exactly as a watched one does. Two invariant tests that pinned the old contract are updated to the corrected one; two new tests assert the unwatched case directly. |
|
|
27
|
+
| `R-02` (the process does not exit) | High | **one confirmed instance fixed, not proven to be the field's exact mechanism** | Auditing every background thread and process pool in this codebase found one genuine defect of this shape: the root `ask` command's async cache write started a `daemon=True` thread — specifically so an unfinished write could not hold up exit — and then registered `atexit.register(_cache_write_thread.join, 30.0)`, re-joining it anyway. Removed. `verify` itself does not go through this code path, so this is not asserted to be the auditor's exact mechanism; it is a real, independently confirmed instance of the same failure class, fixed on the same principle the codebase already states elsewhere (`parse_cache._delete_behind`): a daemon thread's unfinished work costs the next run a cache miss, not the caller a wait after their answer already arrived. |
|
|
28
|
+
| `BUG-14` | High | **closed** | Same class as `BUG-13`, the pattern named by request: `plan TARGET [PATH]` read a lone positional as the change target, leaving `path` at its default `.` — over a workspace of nested repositories, that drove a full IR build with no validation. The same nested-repository guard now refuses before any build starts, naming the count, with `--allow-nested`, and the hint explicitly names the grammar confusion (`plan` reads a lone argument as the target, not the repository). |
|
|
29
|
+
| `BUG-01` | Critical maximum | **widened, closed for `endpoints`** | `build_repo_ir` already detected a file whose extracted symbols are not trustworthy and published it as `parse_failures`; `extract_java_endpoints` parses the same sources through its own independent loop and never ran that check. The exact field shape (`total: 1`, one file silently missing) had no honesty pattern to catch it — `zero_result_reason` only fires when the whole answer is empty. `_parse_health_row` is now the one authority both extractors call (`build_repo_ir`'s own behaviour verified byte-identical against its existing battery); `endpoints` publishes `parse_failures`/`parse_failures_basis` whenever non-empty, at any total. |
|
|
30
|
+
| `NEW-01` (regime row) | High | **closed** | 103/103 across four consecutive external rounds was never going to be closed by a fifth measurement — the ask was the product's own guarantee. `tests/test_new01_silent_empty_success_regime.py` runs the real CLI dispatch (not the guard functions mocked in isolation, which a separate existing file already covers) across the whole `REQUIRED_ANSWER_COMMANDS` population against a real fixture repository, and fails if any of them ever reports success with nothing behind it — verified non-vacuous before committing (5 of 6 commands exit 0 with 10-27 KB real payloads on the fixture; `verify` exits its own documented 2 for no contracts declared). |
|
|
31
|
+
| `BUG-03` (statement half) | High | **closed** | The merge-half fix (previous round) already made every audit-family surface correctly classify a majority non-Spring stack as `fit: "partial"` — verified end to end on struts (1,488 Java files, 5 beans) across `spring-audit`, `risk`, `posture` and `audit-report` (inherits it via the other two). What the audit's "mismo stack_fit.statement sin proporción" still named: the statement said only "marginal" in prose, with the raw counts published beside it but not divided for the reader. It now states the density directly — "5 of 1488 Java files carry a Spring bean (0.34%)" — and a `spring_density_pct` field carries the same number for a machine reader, published only on the partial branch. |
|
|
32
|
+
| `BUG-20` | Low | **closed** | The `--detach` envelope's `output` field carried whatever string the operator typed, with nothing saying which directory it was relative to — unusable from outside that invocation's shell. `_resolved_output_path` joins a relative path against the invocation's own root with `.absolute()`, not `.resolve()`: it states where the path points without canonicalising symlinks nobody asked to have normalised away, which is also what keeps the existing detach battery's exact-path assertions passing on macOS (`/var/...` vs `/private/var/...`). |
|
|
33
|
+
| `BUG-09` | Medium | **closed** | AUD-597-D06 unified three repository-flag spellings across the catalogue, but its mechanism only ever moved an alias into an empty *positional* slot. `compare`'s repository is the declared option `--path`, not a positional, so `compare A B --repo <r>` was never recognised — four rounds hit this exact repro. `_normalise_repository_option_flag` covers the second shape: where a command declares its repository as an option named `path`/`repo`/`dir`, any other alias is rewritten to the declared one, in place, with the same duplicate-spelling guard the positional case already has. |
|
|
34
|
+
| `BUG-10` (Vert.x residual) | Medium | **closed for Vert.x; Ktor stays out of scope** | The one repository of eleven left with only the generic disclaimer: Vert.x's Router is a fluent call chain (`router.get("/x").handler(...)`) with no `@` anywhere, structurally invisible to the annotation-shaped evidence rule. A second, equally vendor-neutral rule now catches it — an HTTP-verb method called with one path-like literal, chained into a handler-attachment call — guarded against firing on unrelated code (`Map.get("/key")` with no handler chain, a bare `.route().handler()` with no path). Ktor's routing DSL lives in `.kt` files, which this extractor never reads; extending file discovery to a second language is a different, larger change than this row. |
|
|
35
|
+
| `pack assessment` default | — | **investigated, left unchanged, reasoning recorded** | Reproduced on spring-petclinic: the unbounded default is 68.5K estimated tokens (over the 50K ceiling), `--compact` brings it to 35KB (well under). `--compact` genuinely bounds it — this was AUD-600-B02's own fix, verified still holding. The unbounded default measuring 2.29M tokens on a larger repository (that round's own number) makes clear the full report is a deliberately unbounded, opt-in answer, not an oversight: flipping the default would need a `--compact/--no-compact` toggle pair (today only `--compact` is declared) and would change behaviour for every existing caller who relies on the current default producing the full report on a repository small enough not to hit the ceiling. Left as a product-default question rather than changed unilaterally. |
|
|
36
|
+
|
|
37
|
+
Suite: run in full after the batch, same population as the last recorded
|
|
38
|
+
green run — see the commit history for the exact count. One vacuous
|
|
39
|
+
assertion introduced earlier in the session by this same battery (`or True`
|
|
40
|
+
in a stage-capture test) was caught by the suite's own mutation-testing
|
|
41
|
+
battery and fixed in the same pass, not left for an eighth round to find.
|
|
42
|
+
|
|
43
|
+
## Current Synchronization — Two audits of `5.9.29`: the audit family answers, and the marker's own gap (2026-09-02)
|
|
44
|
+
|
|
45
|
+
**Both lineages report the release positively and neither found a regression.**
|
|
46
|
+
The multi-repository round scores **8.5/10** (8.4 for 5.9.28, from 8.1) and
|
|
47
|
+
calls 5.9.29 a consolidation: nothing closed, nothing regressed, and the
|
|
48
|
+
coverage sweep byte-identical to the previous session across eleven
|
|
49
|
+
repositories — the 5.9.26–5.9.28 corrections hold under repetition rather than
|
|
50
|
+
being one-build accidents. The native-Windows round scores **7.8/10**, its
|
|
51
|
+
largest jump in seven, and reports the sentence six sessions could not
|
|
52
|
+
produce: **all six audit-family commands answered.** `spring-audit` 3/4,
|
|
53
|
+
`verify` 2/2, `risk` 1/1 and `audit-report` 1/1 (both firsts in six sessions),
|
|
54
|
+
`migrate-check`/`migrate-apply` 1/1 each, `remediate` 1/1 at 74,8 s after two
|
|
55
|
+
rounds of hanging. Full evidence:
|
|
56
|
+
[`AUDIT-2026-09-02-ALTERNATIVE-5.9.29.md`](AUDIT-2026-09-02-ALTERNATIVE-5.9.29.md)
|
|
57
|
+
and [`AUDIT-2026-09-02-EXTERNAL-5.9.29.md`](AUDIT-2026-09-02-EXTERNAL-5.9.29.md).
|
|
58
|
+
|
|
59
|
+
**The `SEC-010` work is confirmed from the field, with their numbers:** three
|
|
60
|
+
successive runs, one `content_id` (`4a0429c7784da360`), 385 findings each, and
|
|
61
|
+
the family's own clock falling 42,8 → 25,4 → 20,0 s as the cache warmed. The
|
|
62
|
+
command went 73,9 → 46,9 → 35,9 s. `selftest` rose from 1/12 to 6/12 passing
|
|
63
|
+
rows on the same deadline.
|
|
64
|
+
|
|
65
|
+
**And the in-flight marker did its job on the first try — including against
|
|
66
|
+
us.** It captured a hang, and what it captured contradicts part of what this
|
|
67
|
+
ledger assumed. See `R-01` below.
|
|
68
|
+
|
|
69
|
+
| ID | Severity | Status | Evidence and required closure |
|
|
70
|
+
|---|---:|---|---|
|
|
71
|
+
| `R-01` (phase attribution) | Critical maximum | **open, sharpest evidence in seven rounds** | The marker on the one hung run: `started_at` 1788411595,53 and `phase_entered_at` 1788411734,89 — **139,36 s spent before the run reached "applying all rules"**, about 70 % of the time it lived, with the stderr heartbeat agreeing (two warnings naming `auditing 3342 Java files`, then the rules phase for 41,4 s). The successful runs of the same session covered that whole stretch in ~72,7 s. The auditor's inference that the new `seeds()` pre-index moved the cost earlier is **refutable in source**: `_http_input_query_sinks` is called from `SEC-010`'s `analyze`, inside the `security_rules` phase — after the point their marker recorded. What sits in those 139 s is the CIR build, the XML security-configuration scan and the start of the semantic model, all published under one heartbeat label. Required work, adopted from their three requests: split that phase into visible sub-stages, publish the pre-index as its own timing entry, and repeat the bisection measuring that phase separately from the rules phase rather than only the total. |
|
|
72
|
+
| `R-01-INFLIGHT` (stage capture) | High | **open, defect in what 5.9.29 shipped, found by their evidence** | Their capture reads `last_stage: null` for the ~60 s the run spent in the rules phase, and null through the 139 s before it — in a phase whose stages the heartbeat does name. The cause is ours: stage capture rides on `Progress.work`, and the sink that calls it is built only when the heartbeat is **enabled**, which it is not off a TTY, in CI, under `NO_COLOR`, or piped through `timeout` — the field's configuration in all seven sessions. The marker's most useful field is therefore blank in exactly the environment it was built for. Closure: record the stage regardless of whether anything is watching. |
|
|
73
|
+
| `R-02` (the process does not exit) | High | **open, new failure class** | `timeout -k 5 200 ask verify .` returned `rc=124` with **5 333 bytes of a complete, valid answer** — `verdict: pass`, `contract_count: 14`, `content_id: ca00e3a40668e5bf`, `answer_bounds.complete: true`. Six sessions of hangs produced 0 bytes; this one finished the work and did not leave. Distinct from `ALT-01`/`ALT-03` and to be tracked apart: the analysis is not the problem here, the exit is. Candidates, one of them this product's own recent addition: a non-daemon thread outliving the answer — the parse worker pool, the heartbeat thread, or the concurrency lease. Closure: prove nothing this codebase starts can delay interpreter shutdown after the answer is written. |
|
|
74
|
+
| `SEC-010` cost | Medium | **closed 5.9.29, confirmed in the field** | Three runs, identical `content_id`, 42,8 → 25,4 → 20,0 s with the cache warming. The warm-path benefit the product promised and no session had observed. |
|
|
75
|
+
| `ALT-08` (arithmetic half) | Low | **closed, field verification received** | `ask prepare-context review-pr` — the correct command this time — gives `final_size_bytes: 93 462`, matching `len(json.dumps(payload without _meta))` byte for byte. |
|
|
76
|
+
| `ALT-01` / `ALT-03` | Critical maximum | **open, materially narrowed** | 3/4 and six families answering is the best measurement of seven rounds and is not the 25–30 repetitions per command this ledger requires. `R-01` above leaves open that the bottleneck was moved rather than removed, and this ledger does not close a row on a hypothesis it has just been given evidence against. |
|
|
77
|
+
| `NEW-01` (regime row) | High | **open, and the request is not for more measurement** | 103/103 across four consecutive versions in the multi-repository lineage. What is asked for is the product's own guarantee: the explanation of what fixed it, published in this ledger, plus an automated regime assertion, so closure stops depending on a recurring external audit. |
|
|
78
|
+
| `BUG-14` | High | **open, fourth round, fix pattern already exists here** | `ask plan <repo>` still hangs to an external kill at 45 s with an empty stderr, because a repository path is accepted where the signature reads `TARGET [PATH]`. Same class as `BUG-13`, which 5.9.28 closed by validating before starting, counting what it found and offering `--allow-nested`. The auditor asks for that pattern, by name, on this row. |
|
|
79
|
+
| `BUG-01` | Critical maximum | **open, and the honesty pattern needs widening** | A file with a parse error still disappears with no signal (`total: 1`, only `/ok`). `zero_result_reason` fires only at `total: 0`, so the disclosure that closed `BUG-10` does not reach this shape. Required: name files excluded by a parse failure at **any** total, not only when the answer is empty. |
|
|
80
|
+
| `BUG-10` (routing DSL residual) | Medium | **partially closed, residual named** | `unmodeled_routing_evidence` verified across 11 repositories (198 files of Micronaut annotations, 52 of Servlets, 6 of `@Route`/`@WebSocket`) and `null` where a repository has endpoints. A fluent router DSL carries no annotation and no path literal, so it yields neither evidence nor a declared gap — one repository of eleven is left with the generic disclaimer alone. |
|
|
81
|
+
| `REG-03` | Medium | **the auditor retracts their own claim** | The warm-path delta went −22,4 % → −9,2 % → **+24,0 %** on the same pair of consecutive invocations while absolute cold time fell 69,1 → 21,9 s. Their conclusion: system load at the moment of measurement dominates this metric, not ASK's cache state, and their 5.9.27 report of *the first real warm-cache gain ever observed* is withdrawn to "possible, not confirmed". Recorded here because a retraction by the party who made the claim is evidence, and because this product must not quote that figure as a benchmark either. |
|
|
82
|
+
| `REG-02` | Critical | **open, fourth consecutive round** | `--agent` fails by default on large repositories (1 623 MB and 2 572 MB observed, same range as three prior rounds, no trend either way). |
|
|
83
|
+
| `BUG-16` | Medium | **disclosure closed, size open** | The eviction contracts shipped in 5.9.29 are confirmed present through `cache status`. What the auditor still records is the size: 2,4 GB total, 1,8 GB of it the context cache. The contract this product publishes for that store is entry count and age, not bytes — which is honest and is also why the store can be this large. Whether it should have a byte budget is the open half. |
|
|
84
|
+
| `BUG-13`, `BUG-15`, `BUG-17`, `BUG-21`, `BUG-08`, `BUG-10`/`BUG-23` | — | **closed, stable under repetition** | Re-verified across four to five consecutive versions with no sign of relapse, and byte-identical coverage figures between the last two sessions. |
|
|
85
|
+
| `BUG-09`, `BUG-11`, `BUG-20`, `BUG-02`, `BUG-12`, `BUG-03` | — | **open, unchanged** | Flag vocabulary, `pack assessment` returning `OUTPUT_TOO_LARGE` by default (now with granular progress where it used to fail silently), an unresolved POSIX path under `--detach`, and the three rows that need the field's own large repository. |
|
|
86
|
+
|
|
87
|
+
## Current Synchronization — Release `5.9.29`, hardening pass and a green suite (2026-09-02)
|
|
88
|
+
|
|
89
|
+
**The suite is green — 13 748 tests, 0 failures — for the first time in
|
|
90
|
+
several releases.** It had carried twenty-one standing reds, which is how a
|
|
91
|
+
real regression becomes indistinguishable from the background. Two of them
|
|
92
|
+
were product defects, not stale assertions.
|
|
93
|
+
|
|
94
|
+
| ID | Severity | Status | Evidence and required closure |
|
|
95
|
+
|---|---:|---|---|
|
|
96
|
+
| `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. |
|
|
97
|
+
| `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. |
|
|
98
|
+
| `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. |
|
|
99
|
+
| `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. |
|
|
100
|
+
| 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. |
|
|
101
|
+
|
|
102
|
+
## Current Synchronization — P1 closed: the expensive family, profiled and fixed (2026-09-02)
|
|
103
|
+
|
|
104
|
+
**The row asked for two things and both are done: `SEC-010` now reports while
|
|
105
|
+
it runs, and the walk underneath it is between 3 and 24 times faster with a
|
|
106
|
+
byte-identical answer.** Profiling `risk._http_input_query_sinks` on a
|
|
107
|
+
3 860-file repository found the mechanism in one line of the profile: `get()`
|
|
108
|
+
re-read every remaining source, from disk, **once per callee name it
|
|
109
|
+
resolved** — 96 399 `_text_of` calls for 28 lookups, six seconds of pure I/O
|
|
110
|
+
inside an 18,3-second walk, with the parse it triggers accounting for the
|
|
111
|
+
rest.
|
|
112
|
+
|
|
113
|
+
| ID | Severity | Status | Evidence and required closure |
|
|
114
|
+
|---|---:|---|---|
|
|
115
|
+
| `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. |
|
|
116
|
+
| `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. |
|
|
117
|
+
| `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`. |
|
|
118
|
+
|
|
119
|
+
## Current Synchronization — The two 5.9.28 P0s, worked (2026-09-02)
|
|
120
|
+
|
|
121
|
+
**The bisection ran, and its headline result is negative: there is no knee.**
|
|
122
|
+
`spring-audit --compact` over deterministic subsets of a 4 772-file repository
|
|
123
|
+
took 5,8 s (250 files), 6,0 s (500), 9,2 s (1 000), 10,4 s (2 000), 16,9 s
|
|
124
|
+
(3 342 — the field's own file count) and 24,1 s (4 772); a second corpus of
|
|
125
|
+
9 195 files finished in 39,6 s. Sublinear per file, `rc=0` everywhere, no hang
|
|
126
|
+
at any size. **File count alone does not explain the field's failure on this
|
|
127
|
+
platform**, and the auditor's hypothesis — a costly loop that trips at a
|
|
128
|
+
certain size — is not reproducible here at up to 2,75× their repository.
|
|
129
|
+
|
|
130
|
+
What the bisection did find is where the time goes, and why the heartbeat
|
|
131
|
+
looks stuck: **one family dominates**. On the 4 772-file repository, `SEC-010`
|
|
132
|
+
measured **10 670 ms of a 30 099 ms run — 85 % of the rule phase** — and its
|
|
133
|
+
heartbeat line stops changing for the last 10,6 s of it. That is precisely the
|
|
134
|
+
shape the field reports as a hang, and `timings.phases` could say
|
|
135
|
+
`security_rules: 12 617 ms` while never naming which of the six families spent
|
|
136
|
+
it. `SEC-010` delegates to `risk._http_input_query_sinks`, already recorded as
|
|
137
|
+
the CLI's single most expensive walk on two corpora in the 5.8.5 round.
|
|
138
|
+
|
|
139
|
+
| ID | Severity | Status | Evidence and required closure |
|
|
140
|
+
|---|---:|---|---|
|
|
141
|
+
| `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. |
|
|
142
|
+
| `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. |
|
|
143
|
+
| `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. |
|
|
144
|
+
| `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. |
|
|
145
|
+
|
|
146
|
+
## Current Synchronization — Alternative External Audit `5.9.28`, the hang reproduces on a near-idle machine (2026-09-02)
|
|
147
|
+
|
|
148
|
+
**First substantial score rise in five rounds (4.6 → 6.2/10), with no
|
|
149
|
+
regression found — and the sharpest evidence yet that contention was never the
|
|
150
|
+
whole story.** The auditor isolated the contention variable to its lowest
|
|
151
|
+
observable level in six sessions (120 s of monitoring, 100 s of confirmed calm
|
|
152
|
+
before launch, one light foreign invocation across the whole 150 s window,
|
|
153
|
+
against dozens in the 5.9.27 round) and `spring-audit . --compact` still hung
|
|
154
|
+
**4 of 4 times**, `rc=124`, 0 bytes. The 5.9.28 release note said "one hang was
|
|
155
|
+
observed with nothing else running, and that is unexplained"; this round turns
|
|
156
|
+
that into *unexplained and reproducible*, which is a better-defined problem and
|
|
157
|
+
still an open one. Full evidence:
|
|
158
|
+
[`AUDIT-2026-09-02-ALTERNATIVE-5.9.28.md`](AUDIT-2026-09-02-ALTERNATIVE-5.9.28.md).
|
|
159
|
+
|
|
160
|
+
**Five rows are confirmed closed with the auditor's own data, not on the
|
|
161
|
+
changelog's word:** `NEW-02`/`BUG-05` (cross-checked against the real source —
|
|
162
|
+
`anchor_candidate_lines: [134, 145]` matches two annotations the auditor had
|
|
163
|
+
verified by hand three sessions earlier, and it is the first defect tracked
|
|
164
|
+
since 5.9.22 that is genuinely resolved rather than "not reproduced this
|
|
165
|
+
time"), `BUG-13` (373 ms refusal against a purpose-built two-repository
|
|
166
|
+
workspace), `BUG-16`, `ALT-25`, and the `retrieve security-surface --target`
|
|
167
|
+
refusal. `_meta.concurrency` is described as the best instrumentation to appear
|
|
168
|
+
in six sessions.
|
|
169
|
+
|
|
170
|
+
| ID | Severity | Status | Evidence and required closure |
|
|
171
|
+
|---|---:|---|---|
|
|
172
|
+
| `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. |
|
|
173
|
+
| `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. |
|
|
174
|
+
| `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. |
|
|
175
|
+
| `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. |
|
|
176
|
+
| `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. |
|
|
177
|
+
| `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. |
|
|
178
|
+
| `ALT-25` | Low | **closed 5.9.28, confirmed** | `audit_time_ms: null` with `findings_status: "not_computed"` and the rule stated beside it. |
|
|
179
|
+
| `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>`. |
|
|
180
|
+
| `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. |
|
|
181
|
+
| `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. |
|
|
182
|
+
| `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. |
|
|
183
|
+
| `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. |
|
|
184
|
+
|
|
185
|
+
**No regression was found against 5.9.27, and the upgrade is recommended
|
|
186
|
+
unconditionally** — the first round in six where the auditor reports a net,
|
|
187
|
+
verified improvement with nothing new broken. The release gate is unchanged:
|
|
188
|
+
the audit-command family is still not usable for unattended CI on this
|
|
189
|
+
repository.
|
|
190
|
+
|
|
17
191
|
## Current Synchronization — Release `5.9.28`, nine rows closed on the 5.9.27 queue (2026-09-02)
|
|
18
192
|
|
|
19
193
|
**`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 "
|