sourcecode 5.9.8__py3-none-any.whl → 5.9.10__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 CHANGED
@@ -4,4 +4,4 @@ ASK Engine is the product. ``ask`` is the canonical CLI command; ``sourcecode``
4
4
  the legacy compatibility alias and the Python/PyPI package name. See
5
5
  docs/PRODUCT_IDENTITY.md (normative)."""
6
6
 
7
- __version__ = "5.9.8"
7
+ __version__ = "5.9.10"
@@ -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 = 'ac7c82deb24ccbea4ce12cb79d08c1d2f6461ff2'
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'}, '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'}, '`B-3`': {'commit': '773268d', 'status': 'present'}, '`B-6`': {'commit': '17c6e06', 'status': 'present'}, '`B-8`': {'commit': '8329614', 'status': 'present'}, '`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'}}
5
- CLOSURE_COVERAGE = {'closed_rows': 135, 'present': 91, 'absent': 0, 'unresolved': 0, 'uncited': 44, 'unknown': 0}
3
+ BUILD_COMMIT = '3d7178f2f1b249e6821bcd7fdd80046405476724'
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'}, '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'}, '`B-3`': {'commit': '773268d', 'status': 'present'}, '`B-6`': {'commit': '17c6e06', 'status': 'present'}, '`B-8`': {'commit': '8329614', 'status': 'present'}, '`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'}}
5
+ CLOSURE_COVERAGE = {'closed_rows': 154, 'present': 91, 'absent': 0, 'unresolved': 0, 'uncited': 63, 'unknown': 0}
@@ -95,6 +95,65 @@ because the prior external round reproduced it. The new queue is:
95
95
  | AUD-612-09 | Medium | closed | `--files -` is documented and enforced as a newline-delimited changed-path list; raw unified diffs fail with an `--name-only` conversion hint. Dedicated TeaVM regressions pass. |
96
96
  | AUD-612-14 | Medium | closed | The current population is 104 CLI leaves versus 110 MCP tools, explicitly decomposed as 101 runtime-derived plus 9 native orchestration tools; `mcp list-tools --json` matches and the relationship is published. Existing TeaVM-backed population regression passes. |
97
97
  | AUD-612-R | Medium | closed | README, English guide and Spanish manual document that `rename-class` requires `--from/--to`, the old positional syntax is unsupported, and `--dry-run` is the migration safety step. TeaVM dry-run verification passes. |
98
+ | AUD-613-ROOT | High | closed 5.9.8 | On a TTY, explicit `ask .` was misclassified as bare `ask` after path preprocessing and rendered only the welcome card. An explicit-path marker now distinguishes both flows; TeaVM pseudo-TTY and focused CLI regressions pass. |
99
+
100
+ **External audit intake `AUD-614`, re-audit of release 5.9.8 — 2026-08-27.**
101
+ Five clean forks exercised the `testing/` corpus without target-repository writes,
102
+ commits or Java-file changes. The initial **8.0/10** score was superseded by the
103
+ addendum confirming a second severe availability regression; the governing score is
104
+ **7.5/10**. Previously closed semantic fixes remained stable, but the following rows
105
+ are the current release blockers and contract gaps:
106
+
107
+ | ID | Severity | Status | Evidence / closure boundary |
108
+ |---|---:|---|---|
109
+ | AUD-614-F | Critical | closed 5.9.8 (reverified) | The external `/dev/null` false-success is not reproducible in the current checkout: invalid TeaVM input returns `exit 1` and identical structured stderr whether stdout is captured or discarded. A dedicated redirection regression protects the boundary. Native Windows/MSYS release-artifact verification remains required because the external evidence conflicts. |
110
+ | AUD-614-L | Critical / regression | open | `audit-report` is contention-sensitive on `thingsboard` (3,714 files): one clean run completed in 136 s, while concurrent/isolated runs exceeded 5 minutes; JSON, YAML and Markdown all exhibited the problem. `tutorials` reached 5m39.6s with zero stdout. Requires profiling, stage visibility, deadline and structured partial output. |
111
+ | AUD-614-RISK-L0 | High / regression | closed 5.9.8 | `risk --limit 0` now returns a fast explicit zero-row view without constructing the repository-wide composer. It publishes `risks: []`, `shown: 0`, null totals and `analysis_skipped: true`; the TeaVM flow and dedicated regression pass. |
112
+ | AUD-614-SELFTEST-TIMEOUT | High / contract regression | closed 5.9.8 | `selftest --timeout` is now an overall deadline; each child receives the remaining budget, interrupted/unstarted rows are structured as `error`, and the command returns code 75. The real TeaVM flow and dedicated regression pass. The separate fourth-run hang remains mixed evidence. |
113
+ | AUD-614-WIN-PROC | Medium | open | Windows/MSYS timeout or SIGTERM can leave `ask.exe` descendants alive, with MSYS PIDs unusable by native `taskkill`. Validate signal handling and Windows Job Objects from native Windows and Git Bash. |
114
+ | AUD-614-G | Medium | closed 5.9.8 | The shared error authority normalizes legacy producer spellings to canonical uppercase codes (`NO_DIFF_SOURCE`, `INVALID_LICENSE`). TeaVM `review-pr` and activation contract tests pass. |
115
+ | AUD-614-E | Low | closed 5.9.9 | Event topology now publishes `risk_level: unknown` for `not_found`, matching `impact` and normal `impact-chain`; `low` remains a resolved no-risk result. Focused TeaVM coverage protects the parity. |
116
+ | AUD-614-I | Medium | closed 5.9.8 | The user manual and internal compacting comment no longer promise `~10K`; they state that `cold-start --compact` is snapshot-dependent, expose `estimated_tokens`, and require size validation before direct AI injection. The CLI help and payload already used this contract. A hard ceiling remains optional future scope. |
117
+ | AUD-614-INTENT-TIE | Medium | closed 5.9.9 (reclassified) | The equal score belongs to different questions, not competing candidates. `endpoint security` selects a target-required intent and correctly refuses without a route; `security surface` is repository-wide and resolves. A focused regression locks the distinction. |
118
+ | AUD-614-07 | Low | closed 5.9.8 (reverified) | The installed `ask spring-audi` entry point returns `Did you mean: spring-audit?`; the TeaVM path/typo regression battery passes. The external wording report is not reproducible in the current checkout. |
119
+ | AUD-614-JUNIT4 | Medium | closed 5.9.9 | JUnit4 test-only repositories classify as `test` only with the `junit:junit` coordinate and test-only Java sources; ordinary applications/libraries retain their structural type. |
120
+
121
+ **External audit intake `AUD-615`, re-audit of release 5.9.9 — 2026-08-27.** The
122
+ auditor exercised only repositories under `testing/` and added three robustness subjects.
123
+ The report contains conflicting headline scores (8.0 and 8.4), and shared fork scratch
124
+ state invalidated the definitive output capture for the long `audit-report` retest. The
125
+ ledger records the evidence and closure boundaries, not either headline score.
126
+
127
+ | ID | Severity | Status | Evidence / closure boundary |
128
+ |---|---:|---|---|
129
+ | AUD-615-F | Critical | closed 5.9.9 (reverified) | Windows/Git Bash verification confirms 11/11 reproductions: stdout `/dev/null` preserves exit 1 and byte-identical structured stderr, including `INVALID_USAGE` as well as `INVALID_INPUT`. Keep release-artifact coverage. |
130
+ | AUD-615-RISK-L0 | High / regression | closed 5.9.9 (reverified) | `risk --limit 0` completes in about 0.8–1.5 s as `zero_row_view`, with `analysis_skipped: true` and null totals; full analysis is not built for a view that requests no rows. |
131
+ | AUD-615-SELFTEST-TIMEOUT | High / contract regression | closed 5.9.9 (reverified) | `selftest --timeout 5` returns exit 75 and a non-empty structured diagnostic payload, including the fourth attempt in this sample. The independent hang history remains mixed evidence. |
132
+ | AUD-615-L | Critical / regression | open | The defect is isolated to `audit-report --format markdown`: identical `thingsboard` runs measured 200 s timeout versus 137.98 s success, with an isolated 114 s run. JSON/YAML correctly returned structured `OUTPUT_TOO_LARGE`; they are not defective here. The 700 s fork lost output to shared scratch interference. |
133
+ | AUD-615-TUTORIALS | High / availability trend | open | Root compact on `tutorials` increased monotonically from 4m00.1s in 5.9.6 to 6m20.1s in 5.9.9, exit 124 with zero stdout. Attribute and bound the cost before large-monorepo claims. |
134
+ | AUD-615-WIN-PROC | Medium | open | Seven `ask.exe` processes remained after successful Windows runs. Validate descendant cleanup for successful and timed-out runs with native Windows/Git Bash process controls. |
135
+ | AUD-615-INTENT-TIE | Medium | closed 5.9.9 (reclassified) | Equal score across distinct questions is not a tie. The target-required endpoint intent refuses without a route while the global surface intent resolves; a focused regression protects that contract. |
136
+ | AUD-615-E | Low | closed 5.9.9 | All impact-family not-found paths publish `risk_level: unknown`; focused TeaVM coverage protects the former event-topology outlier. |
137
+ | AUD-615-07 | Low / evidence conflict | closed 5.9.9 (reverified) | Isolated TeaVM verification returns `Did you mean: spring-audit?` with exit 2, matching the installed-entry-point regression. The contrary report wording is not reproducible. |
138
+ | AUD-615-JUNIT4 | Medium | closed 5.9.9 | JUnit4 test-only repositories classify as `test` from dependency and source-location evidence, without a broad naming heuristic. |
139
+ | AUD-615-DRIFT | Low / investigation | closed 5.9.9 | Spring's explicit `default` profile is normalized to the implicit empty active-profile set at the access-snapshot boundary. An implicit capture and explicit `--profile default` now read one series; focused and TeaVM regression flows pass. |
140
+ | AUD-615-COLD-COMPACT | Low / product decision | closed 5.9.9 (accepted contract) | A repeated 88,265-byte result is compatible with the documented snapshot-dependent contract. ASK exposes `estimated_tokens`; no hard ceiling is claimed or introduced. |
141
+
142
+ **Audit-method control:** each parallel fork must use a unique scratch directory; shared
143
+ `~/askaudit_599` caused cross-fork file deletion/interleaving and blocked a definitive L
144
+ result. **Commercially**, conflicting `$25-40` and `$50-65` estimates are not evidence for
145
+ a price increase; retain the conservative band until the availability trend is closed.
146
+
147
+ The audit also confirms root cache reuse, stdin contracts, pack progress, explain and
148
+ impact error routing, self-audit population disclosure, endpoint compact disclosure,
149
+ Spring detection controls, baseline safety and the prior `/dev/null` fix matrix. The
150
+ intermittent endpoint-security retrieval issue had 0/18 failures in this pass and stays
151
+ under observation because its historical rate is about 2% over 51 runs.
152
+
153
+ **Commercial boundary.** The corrected assessment is `$25-40/developer/month`, not the
154
+ initial `$45-58` headline. Do not market enterprise-scale support or production CI
155
+ gating for repositories above roughly 3,000 files until the four critical/high
156
+ availability and error-transport rows are independently closed with bounded evidence.
98
157
 
99
158
  Commercially, normal repositories up to about 4,000 files remain viable at a provisional
100
159
  $40-55/developer/month. B02, B04 and L block annual CI-gating and extreme-monorepo claims;
@@ -46,16 +46,23 @@ CLI commands — impact, endpoints, spring-audit, explain, … each a pro
46
46
  The key idea: the extraction is **content-addressed**. Commands reuse the parse cache and,
47
47
  where their analysed scope matches, the shared Canonical IR; `ask cache model` names what a
48
48
  warm buys for each command rather than implying that every projection costs the same. In
49
- 5.9.8, `validation` enters through that shared CIR and `data-exposure` reuses one semantic
49
+ 5.9.10, `validation` enters through that shared CIR and `data-exposure` reuses one semantic
50
50
  model across all declared label seeds. (The extraction and consumption contract is fixed in
51
51
  the architecture ADRs 0001–0004 under `docs/architecture/`.)
52
52
 
53
53
  The current external pack audit intake is tracked in
54
54
  [`AUDIT-2026-08-26-EXTERNAL-5.8.28-PACK.md`](AUDIT-2026-08-26-EXTERNAL-5.8.28-PACK.md);
55
- the two pack fixes are included in release 5.9.8, with release-artifact verification
55
+ the two pack fixes are included in release 5.9.10, with release-artifact verification
56
56
  remaining for detached execution and pack evidence.
57
57
 
58
- ### Reliability contracts in 5.9.8
58
+ ### Reliability contracts in 5.9.10
59
+
60
+ **Known availability limits.** Do not place `ask audit-report . --format markdown`
61
+ or the root compact command behind a strict timeout on repositories above roughly
62
+ 3,000 files. Markdown audit-report delivery is still contention-sensitive; for a
63
+ supervised or CI workflow, save `risk` first and use `audit-report --from-risk`,
64
+ prefer JSON/YAML, and retain progress output. The current closure status is in the
65
+ [development roadmap](DEVELOPMENT-ROADMAP.md#aud-615-re-audit-release-599).
59
66
 
60
67
  Invalid analysis inputs fail before expensive work and use the structured
61
68
  `INVALID_INPUT` envelope: a missing `--consumer` repository, a malformed CVE
@@ -236,7 +243,7 @@ pipx install sourcecode # isolated install, no venv needed
236
243
 
237
244
  # Verify
238
245
  ask version
239
- # ask 5.9.8
246
+ # ask 5.9.10
240
247
  ```
241
248
 
242
249
  Requires Python 3.9+.
@@ -629,6 +636,11 @@ JSON output includes `evidence_manifest`: stable claim IDs mapped to source span
629
636
  inputs, ASK version, git HEAD and freshness metadata. Signed reports sign this manifest as
630
637
  part of the canonical payload.
631
638
 
639
+ On large repositories, do not use Markdown delivery in a strict-timeout CI path:
640
+ the current reliability queue records contention-sensitive completion. Persist a
641
+ `risk` payload first and use `--from-risk`; JSON/YAML are the safer supervised
642
+ formats while the Markdown issue remains open.
643
+
632
644
  ```bash
633
645
  ask audit-report .
634
646
  ask audit-report . --profile prod --format markdown
@@ -44,6 +44,12 @@ UNMATCHED = "no_rule_matched"
44
44
  _NOT_A_CLASS = frozenset({"chains", "summary"})
45
45
 
46
46
 
47
+ def normalise_profiles(profiles: "Optional[set[str]]") -> "set[str]":
48
+ """Map Spring's implicit ``default`` profile to the empty active set."""
49
+ return {str(profile).strip() for profile in (profiles or set())
50
+ if str(profile).strip() and str(profile).strip() != "default"}
51
+
52
+
47
53
  def _utc_now() -> str:
48
54
  return datetime.now(timezone.utc).replace(microsecond=0).isoformat()
49
55
 
@@ -83,10 +89,11 @@ def build_snapshot(
83
89
  """One capture of the effective access under a profile set."""
84
90
  from sourcecode.architectural_baseline import git_commit
85
91
 
92
+ active_profiles = normalise_profiles(profiles)
86
93
  if posture is None:
87
94
  from sourcecode.posture import build_posture
88
95
 
89
- posture = build_posture(Path(root), set(profiles or ()), properties)
96
+ posture = build_posture(Path(root), active_profiles, properties)
90
97
 
91
98
  routes = routes_from_posture(posture)
92
99
  by_class: "dict[str, int]" = {}
@@ -100,7 +107,7 @@ def build_snapshot(
100
107
  "captured_at": _utc_now(),
101
108
  "commit": commit if commit is not None else git_commit(Path(root)),
102
109
  "repo": Path(root).name,
103
- "profiles": sorted(profiles or ()),
110
+ "profiles": sorted(active_profiles),
104
111
  "counts": {
105
112
  "routes": len(routes),
106
113
  "by_access_class": dict(sorted(by_class.items())),
@@ -138,7 +145,7 @@ def load_series(out_dir: Path, *, profiles: "Optional[set]" = None) -> "list[dic
138
145
  if not out_dir.is_dir():
139
146
  return []
140
147
  series: "list[dict]" = []
141
- wanted = sorted(profiles) if profiles is not None else None
148
+ wanted = sorted(normalise_profiles(profiles)) if profiles is not None else None
142
149
  for path in sorted(out_dir.glob(f"{FILENAME_PREFIX}*.json")):
143
150
  try:
144
151
  payload = json.loads(path.read_text(encoding="utf-8"))
sourcecode/classifier.py CHANGED
@@ -280,6 +280,17 @@ class TypeClassifier:
280
280
  if stack_names & _JVM_STACKS and self._is_multi_module(file_tree):
281
281
  return "library"
282
282
 
283
+ # A JUnit 4-only repository is a test suite, not an unknown application.
284
+ # Require both the dependency and test-only Java sources so an ordinary
285
+ # library that uses JUnit for its own tests keeps its structural type.
286
+ java_paths = [path for path in flat_paths if path.endswith(".java")]
287
+ if (
288
+ "JUnit 4" in framework_names
289
+ and java_paths
290
+ and all("/src/test/" in path or path.startswith("src/test/") for path in java_paths)
291
+ ):
292
+ return "test"
293
+
283
294
  # Weak CLI heuristic: a top-level bin/ directory (only when nothing stronger).
284
295
  if any(path.startswith("bin/") for path in flat_paths):
285
296
  return "cli"
sourcecode/cli.py CHANGED
@@ -1029,6 +1029,11 @@ def _set_detected_path(value: str) -> None:
1029
1029
  _tls.detected_path = value
1030
1030
 
1031
1031
 
1032
+ def _explicit_path_was_supplied() -> bool:
1033
+ """Whether argv contained a repository path later removed by preprocessing."""
1034
+ return bool(_tls.__dict__.get("explicit_path", False))
1035
+
1036
+
1032
1037
  # Options that take a value token — their next arg must not be treated as a path.
1033
1038
  _OPTIONS_WITH_VALUE: frozenset[str] = frozenset({
1034
1039
  "--format", "-f",
@@ -1271,6 +1276,7 @@ def _preprocess_args(args: list[str]) -> list[str]:
1271
1276
  ``_reject_path_before_subcommand``.
1272
1277
  """
1273
1278
  result = _normalise_repository_option(list(args))
1279
+ _tls.explicit_path = False
1274
1280
  skip_next = False
1275
1281
  _path_index: int = -1
1276
1282
  for i, arg in enumerate(result):
@@ -1302,13 +1308,14 @@ def _preprocess_args(args: list[str]) -> list[str]:
1302
1308
  # A single missing token that is very close to a command is a command
1303
1309
  # typo, not a repository path. Existing directories retain the implicit
1304
1310
  # `ask <path>` grammar, including names that resemble commands.
1305
- if not Path(arg).exists():
1311
+ if not Path(arg).exists() and "/" not in arg and "\\" not in arg:
1306
1312
  _command_matches = difflib.get_close_matches(
1307
1313
  arg, sorted(_SUBCOMMANDS), n=3, cutoff=0.6
1308
1314
  )
1309
1315
  if _command_matches:
1310
1316
  _reject_unknown_command(arg)
1311
1317
  _set_detected_path(arg)
1318
+ _tls.explicit_path = True
1312
1319
  _path_index = i
1313
1320
  if _path_index >= 0:
1314
1321
  result.pop(_path_index)
@@ -5327,7 +5334,7 @@ def main(
5327
5334
  # Bare invocation at a human terminal → branded quickstart instead of
5328
5335
  # dumping a large JSON blob. Agents/pipes are untouched: any arg/flag, or a
5329
5336
  # non-TTY stdout (piped), falls through to the normal analysis + JSON.
5330
- if len(sys.argv) <= 1 and sys.stdout.isatty():
5337
+ if len(sys.argv) <= 1 and not _explicit_path_was_supplied() and sys.stdout.isatty():
5331
5338
  _print_welcome()
5332
5339
  raise typer.Exit()
5333
5340
 
@@ -13393,7 +13400,7 @@ def risk_cmd(
13393
13400
  """
13394
13401
  _require_answer_delivery("risk")
13395
13402
  _apply_jobs(jobs)
13396
- from sourcecode.risk import build_risk
13403
+ from sourcecode.risk import build_risk, zero_risk_payload
13397
13404
 
13398
13405
  path = _admit_path(path)
13399
13406
  # B18: both spellings of the same fact, resolved by the crosswalk the report
@@ -13433,6 +13440,19 @@ def risk_cmd(
13433
13440
  raise typer.Exit(code=1)
13434
13441
  band_filter = _resolved_band
13435
13442
 
13443
+ # AUD-614-RISK-L0: a zero-row view must not construct the full repository-wide
13444
+ # composer only to discard every result. The payload says totals were skipped,
13445
+ # rather than turning an empty requested view into a false zero census.
13446
+ if limit == 0 and not table and not rule_filter and band_filter is None and not top_n:
13447
+ data = zero_risk_payload(
13448
+ path, min_band=min_band, profiles=_profile_set(profile),
13449
+ )
13450
+ _emit_command_output(
13451
+ _serialize_dict(data, format), output_path, copy,
13452
+ success_msg=f"risk written to {output_path} (0 rows requested)",
13453
+ )
13454
+ return
13455
+
13436
13456
  # `risk` composes six axes by re-reading five other commands' authorities — it
13437
13457
  # is the slowest command in the CLI (15s on BroadleafCommerce) and shipped
13438
13458
  # without a single byte on stderr while it ran.
@@ -13841,6 +13861,10 @@ def audit_report_cmd(
13841
13861
  `--sign-key` adds an HMAC-SHA256 signature over the canonical JSON payload.
13842
13862
  The key is local and explicit; no network trust service or new PKI is implied.
13843
13863
 
13864
+ On repositories above roughly 3,000 files, do not put Markdown delivery
13865
+ behind a strict timeout: it remains contention-sensitive. For supervised
13866
+ automation, persist `risk` first, use `--from-risk`, and prefer JSON/YAML.
13867
+
13844
13868
  \b
13845
13869
  Examples:
13846
13870
  ask audit-report .
@@ -19483,7 +19507,8 @@ def cold_start_cmd(
19483
19507
  finally:
19484
19508
  _prog.stop()
19485
19509
  if compact:
19486
- # P1-C: cap at ~10K tokens — keep the fields that orient a reader.
19510
+ # Keep the fields that orient a reader; the resulting size depends on
19511
+ # the stored snapshot and is not a fixed token ceiling.
19487
19512
  #
19488
19513
  # B14. This used to be a fixed key allowlist and a silent `[:30]`, and it
19489
19514
  # took 1 968 807 characters to 16 452 (−99,2 %) while removing 11 of 19
@@ -38,6 +38,7 @@ _TYPE_LABELS: dict[str, str] = {
38
38
  "cli": "CLI tool",
39
39
  "worker": "Background worker / service",
40
40
  "library": "Library / package",
41
+ "test": "Test suite",
41
42
  "unknown": "Application",
42
43
  }
43
44
 
@@ -492,6 +492,8 @@ class JavaDetector(AbstractDetector):
492
492
  frameworks.append(FrameworkDetection(name="Spring AOP", source=source))
493
493
  if "spring-boot-starter-activemq" in text or "activemq-broker" in text or "activemq-client" in text:
494
494
  frameworks.append(FrameworkDetection(name="ActiveMQ", source=source))
495
+ if "junit:junit" in text:
496
+ frameworks.append(FrameworkDetection(name="JUnit 4", source=source))
495
497
  return frameworks
496
498
 
497
499
  def _collect_entry_points(self, context: DetectionContext) -> list[EntryPoint]:
@@ -8,6 +8,19 @@ INVALID_USAGE_CODE = "INVALID_USAGE"
8
8
  EXECUTION_FAILED_CODE = "EXECUTION_FAILED"
9
9
  INTERNAL_ERROR_CODE = "INTERNAL_ERROR"
10
10
 
11
+ # Domain-specific producers historically used snake_case while the public error
12
+ # contract uses canonical uppercase identifiers. Keep the normalization here so
13
+ # every CLI surface that builds the shared envelope agrees.
14
+ _CANONICAL_CODE_ALIASES = {
15
+ "no_diff_source": "NO_DIFF_SOURCE",
16
+ "invalid_license": "INVALID_LICENSE",
17
+ }
18
+
19
+
20
+ def canonical_error_code(code: str) -> str:
21
+ """Return the public spelling for a producer's error code."""
22
+ return _CANONICAL_CODE_ALIASES.get(code, code)
23
+
11
24
  #: The exit code each error class leaves with — the other half of `AUD-596-D11`.
12
25
  #:
13
26
  #: That row closed the *code* half: `INVALID_INPUT` used to exit 1 or 2 depending
@@ -59,6 +72,7 @@ def build_error_object(
59
72
  hint: str | None = None,
60
73
  expected: str | None = None,
61
74
  ) -> dict[str, str]:
75
+ code = canonical_error_code(code)
62
76
  return {
63
77
  "code": code,
64
78
  "message": message,
sourcecode/risk.py CHANGED
@@ -50,6 +50,67 @@ if TYPE_CHECKING:
50
50
  RISK_SCHEMA = "risk-v1"
51
51
 
52
52
 
53
+ def zero_risk_payload(
54
+ root: Path,
55
+ *,
56
+ min_band: str,
57
+ profiles: "Optional[set[str]]" = None,
58
+ ) -> dict:
59
+ """Return an honest zero-row view without paying for repository analysis.
60
+
61
+ `--limit 0` asks for no risk rows. Running the full composer and then slicing
62
+ to zero paid the repository-wide analysis cost while producing no evidence.
63
+ Totals are therefore explicitly unknown rather than falsely reported as zero.
64
+ """
65
+ from sourcecode import non_coverage
66
+ from sourcecode.provenance import build_evidence_manifest
67
+
68
+ payload: dict[str, Any] = {
69
+ "schema_version": RISK_SCHEMA,
70
+ "model": RISK_MODEL,
71
+ "status": "zero_row_view",
72
+ "note": (
73
+ "No risk rows were requested (`--limit 0`), so repository analysis was "
74
+ "skipped. `risks: []` means no rows were requested, not that the "
75
+ "repository has no defects. Re-run without zero limit to measure totals."
76
+ ),
77
+ "total_defects": None,
78
+ "total_findings": None,
79
+ "composition_working_set": {
80
+ "source_files": None,
81
+ "audit_findings": None,
82
+ "candidate_defects": None,
83
+ "defects_composed": 0,
84
+ "basis": "analysis skipped because the requested row limit was zero",
85
+ },
86
+ "counts_note": (
87
+ "Totals are null because no repository analysis ran; risks is an empty "
88
+ "requested view, not a finding census."
89
+ ),
90
+ "shown": 0,
91
+ "by_band": {},
92
+ "by_tier": {},
93
+ "risks": [],
94
+ "limit": 0,
95
+ "min_band": min_band,
96
+ "non_coverage": non_coverage.block("security_surface"),
97
+ "zero_row_view": {
98
+ "requested_limit": 0,
99
+ "analysis_skipped": True,
100
+ "rerun": "ask risk <repository> without --limit 0",
101
+ },
102
+ }
103
+ if profiles is not None:
104
+ payload["profile_set"] = sorted(profiles)
105
+ payload["evidence_manifest"] = build_evidence_manifest(
106
+ payload,
107
+ command="risk",
108
+ root=root,
109
+ inputs={"limit": 0, "min_band": min_band, "profiles": sorted(profiles) if profiles else None},
110
+ )
111
+ return payload
112
+
113
+
53
114
  #: What a bounded row keeps, in one place, so the view and the declaration of the
54
115
  #: view cannot be edited apart.
55
116
  #:
sourcecode/selftest.py CHANGED
@@ -87,7 +87,7 @@ class Subject:
87
87
  entry_point: str
88
88
  java_files: int = 0
89
89
  platform: str = ""
90
- timeout: int = 900
90
+ timeout: float = 900
91
91
 
92
92
  def run(
93
93
  self, *args: str, sanitize_environment: bool = False
@@ -882,8 +882,9 @@ def run_selftest(
882
882
  entry_point=entry_point or _entry_point(),
883
883
  platform=f"{_platform_label()} / python "
884
884
  f"{_platform.python_version()}",
885
- timeout=timeout,
885
+ timeout=float(timeout),
886
886
  )
887
+ deadline = time.monotonic() + float(timeout)
887
888
  try:
888
889
  subject.java_files = len(find_java_files(Path(repo)))
889
890
  except Exception:
@@ -894,12 +895,51 @@ def run_selftest(
894
895
  unknown = sorted(wanted - {row.id.upper() for row in ROWS})
895
896
 
896
897
  results: "list[dict[str, Any]]" = []
897
- for row in selected:
898
+ for index, row in enumerate(selected):
898
899
  started = time.perf_counter()
900
+ remaining = deadline - time.monotonic()
901
+ if remaining <= 0:
902
+ outcome = _result(
903
+ ERROR,
904
+ f"the check did not start before the overall {timeout}s deadline",
905
+ )
906
+ results.append({
907
+ "row": row.id,
908
+ "what": row.what,
909
+ "assertion": row.assertion,
910
+ "seconds": round(time.perf_counter() - started, 2),
911
+ **outcome,
912
+ })
913
+ for pending in selected[index + 1:]:
914
+ results.append({
915
+ "row": pending.id,
916
+ "what": pending.what,
917
+ "assertion": pending.assertion,
918
+ "seconds": 0.0,
919
+ **_result(ERROR, f"not started: overall {timeout}s deadline exhausted"),
920
+ })
921
+ break
922
+ subject.timeout = remaining
899
923
  try:
900
924
  outcome = row.check(subject)
901
925
  except subprocess.TimeoutExpired:
902
926
  outcome = _result(ERROR, f"the check did not finish in {subject.timeout}s")
927
+ results.append({
928
+ "row": row.id,
929
+ "what": row.what,
930
+ "assertion": row.assertion,
931
+ "seconds": round(time.perf_counter() - started, 2),
932
+ **outcome,
933
+ })
934
+ for pending in selected[index + 1:]:
935
+ results.append({
936
+ "row": pending.id,
937
+ "what": pending.what,
938
+ "assertion": pending.assertion,
939
+ "seconds": 0.0,
940
+ **_result(ERROR, f"not started: overall {timeout}s deadline exhausted"),
941
+ })
942
+ break
903
943
  except Exception as exc: # a broken check is not a passing row
904
944
  outcome = _result(ERROR, f"{type(exc).__name__}: {exc}")
905
945
  results.append({
@@ -909,6 +949,7 @@ def run_selftest(
909
949
  "seconds": round(time.perf_counter() - started, 2),
910
950
  **outcome,
911
951
  })
952
+ subject.timeout = float(timeout)
912
953
 
913
954
  counts = {status: 0 for status in (PASS, FAIL, NOT_APPLICABLE, ERROR)}
914
955
  for result in results:
@@ -254,6 +254,7 @@ class EventTopologyOrchestrator:
254
254
  return EventTopologyResult(
255
255
  event_class=event_class,
256
256
  resolution="not_found",
257
+ risk_level="unknown",
257
258
  limitations=limitations + [f"Event class '{event_class}' not found in CIR."],
258
259
  confidence="low",
259
260
  metadata={"query_time_ms": elapsed},
sourcecode/summarizer.py CHANGED
@@ -134,6 +134,7 @@ class ProjectSummarizer:
134
134
  "webapp": "Web application",
135
135
  "api": "API",
136
136
  "library": "Library",
137
+ "test": "Test suite",
137
138
  "cli": "CLI",
138
139
  "monorepo": "Monorepo",
139
140
  "fullstack": "Full-stack project",
@@ -606,6 +607,7 @@ class ProjectSummarizer:
606
607
  "web_mvc": "Server-side MVC web app",
607
608
  "webapp": "Web application",
608
609
  "library": "Library",
610
+ "test": "Test suite",
609
611
  "monorepo": "Monorepo",
610
612
  "fullstack": "Full-stack project",
611
613
  }
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: sourcecode
3
- Version: 5.9.8
3
+ Version: 5.9.10
4
4
  Summary: Persistent structural context and ultra-fast repeated analysis for AI coding agents
5
5
  Project-URL: Homepage, https://github.com/HarounDominique/sourcecode
6
6
  Project-URL: Repository, https://github.com/HarounDominique/sourcecode
@@ -59,7 +59,7 @@ Description-Content-Type: text/markdown
59
59
  > question. All analysis is local and deterministic; see [Privacy](#configuration--privacy)
60
60
  > before inspecting a repository whose telemetry policy you need to control.
61
61
 
62
- ![Version](https://img.shields.io/badge/version-5.9.8-blue)
62
+ ![Version](https://img.shields.io/badge/version-5.9.10-blue)
63
63
  ![Python](https://img.shields.io/badge/python-3.9%2B-green)
64
64
 
65
65
  Copyright (c) 2026 Dominique Haroun. All rights reserved. ASK Engine 5.7.0 and
@@ -196,14 +196,16 @@ set `ASK_MAX_RSS_MB=<megabytes>`; if the process exceeds it, ASK refuses the
196
196
  answer with `MEMORY_TOO_LARGE`, including the observed peak and limit. Leave it
197
197
  unset, or set it to `0`, to disable the ceiling explicitly.
198
198
 
199
- **Current performance status.** Release 5.9.8 retains the shared Canonical IR
199
+ **Current performance status.** Release 5.9.10 retains the shared Canonical IR
200
200
  path used by `validation` and now passes that same CIR into labelled `data-exposure`
201
201
  runs; the no-label path remains parse-free. These are implementation properties,
202
- not duration promises. A controlled external warm-path audit has opened performance
203
- and bounded-output regressions for this release; use `ask cache model <repo>` and
204
- `--progress stderr` for supervised runs, and consult the
205
- [latest external audit intake](docs/AUDIT-2026-08-26-EXTERNAL-5.9.0.md) before
206
- treating a historical timing or bounded flag as a current guarantee.
202
+ not duration promises. The current external audit records two open availability
203
+ limits: `audit-report --format markdown` is not reliable under contention, and
204
+ the root compact flow is not suitable for strict timeouts on very large monorepos.
205
+ Use `ask cache model <repo>`, `--progress stderr`, `audit-report --from-risk` and
206
+ JSON/YAML output for supervised runs; consult the
207
+ [current reliability queue](docs/DEVELOPMENT-ROADMAP.md#aud-615-re-audit-release-599)
208
+ before treating a historical timing or bounded flag as a current guarantee.
207
209
 
208
210
  **CI delivery and workspace licensing.** `migrate-check --format sarif` emits
209
211
  ASK-owned migration findings with source locations and provenance; it does not
@@ -218,7 +220,7 @@ in `overlapping_paths`; a missing or non-directory path is rejected as structure
218
220
  invalid input rather than treated as an empty repository. This prevents silent
219
221
  entitlement errors in CI and does not change per-repository gates or billing.
220
222
 
221
- Release 5.9.8 also hardens the boundary contracts: missing consumer repositories,
223
+ Release 5.9.10 also carries the boundary-contract hardening: missing consumer repositories,
222
224
  malformed CVE feeds and unresolved `pack gate --since` refs fail as structured
223
225
  input errors; duplicate same-commit baselines are never overwritten. `posture
224
226
  --diff` validates unknown profiles when the repository declares profiles. In
@@ -251,7 +253,7 @@ brew tap haroundominique/sourcecode && brew install sourcecode
251
253
  # pip / pipx
252
254
  pipx install sourcecode # or: pip install sourcecode
253
255
 
254
- ask version # ask 5.9.8 — and, on a build that has aged,
256
+ ask version # ask 5.9.10 — and, on a build that has aged,
255
257
  # how many releases have probably shipped since
256
258
  ```
257
259
 
@@ -1,7 +1,7 @@
1
- sourcecode/__init__.py,sha256=VaWEpHF7AmkJDgZPh7icZZV57BxpC4dhyJ60KSvRMGk,308
1
+ sourcecode/__init__.py,sha256=B71ZgKblsnZvswoejgyh9azzuvb3R2Ma19_sLpqeIc0,309
2
2
  sourcecode/__main__.py,sha256=qDFVkobwsdZrX0B3stiRqsUNivVpybKO-egzAwCW4xw,165
3
- sourcecode/_build_commit.py,sha256=5AagM-XxyCpXU4voHWE61m8PiJyu8NusU-e7n9q3ZFc,9899
4
- sourcecode/access_drift.py,sha256=1R7_fiAPvKNOnxc9uxkH3JH-k8MiAuyE7FwWUX1r4Fg,8995
3
+ sourcecode/_build_commit.py,sha256=KD8O-TpGt3jzMYsZMFY8W0KYJJanHaAUaKmqG58oekA,10939
4
+ sourcecode/access_drift.py,sha256=uYD8ipiEAaTnkz0IhG6ujU_KI3LghdY-6ycurs-BZnc,9355
5
5
  sourcecode/adaptive_scanner.py,sha256=yJBKjNpkY6bpueYJ2YnRezen3sYZDecEt7WaaNWdqug,9466
6
6
  sourcecode/analysis_budget.py,sha256=ZuNEboPF8A6GK-_V7WNt92ezgriga7_Rbr-vvSN4UEE,4183
7
7
  sourcecode/answer_bounds.py,sha256=_51_DCuYEUmI_xwUFxDMiprSavkNakkLiIBbPjevQ3M,9793
@@ -34,8 +34,8 @@ sourcecode/chain_rules.py,sha256=Bi6UHfgd-GxWswmnHRcPz5jdbAuqka3Zkz_P-MTvqhw,127
34
34
  sourcecode/change_plan.py,sha256=drAoDsqFplutCLc6Y0xue7sYkTls0SpYh7aOXvttv3I,12934
35
35
  sourcecode/ci_output.py,sha256=X4NRokWWMRF9Ex8OQrEO2g04GzJ00GDP5zYIoqI9YCc,4625
36
36
  sourcecode/cir_graphs.py,sha256=RytqSv1WF8kdlfXj2fPQz16LY4akS2kyThbdWL8beCQ,14835
37
- sourcecode/classifier.py,sha256=JBzPwSSrDG-tUHAbcKB678HRbjLpD-ohzbzzO62mgpo,20114
38
- sourcecode/cli.py,sha256=1WvEmGQjDGsYDCq4eMm7JM4opKHZjagoVvCKqCUdw6s,942911
37
+ sourcecode/classifier.py,sha256=x9fVE2VpW6VuyeF2E7NNS-57LFFcUEnc3Q5vdAJ1NTo,20647
38
+ sourcecode/cli.py,sha256=g2y92QEgohfBoazdjZaHatsYeWSp-RO_xUByn98e798,944198
39
39
  sourcecode/client_calls.py,sha256=YOPnfRZzRyqmdHvXSVeiunW8cuiuCuWXacNIQRgKMCw,22640
40
40
  sourcecode/code_notes_analyzer.py,sha256=EJemNCNc9Dn-1RZYu-aNbK0ELzmsyC4s6FdHi3XyNEI,9392
41
41
  sourcecode/compare.py,sha256=Lnfmm9I3k0H1jP1tV6ZJ-R7znjQPLPLCe5TzV1Jb_PM,15323
@@ -46,7 +46,7 @@ sourcecode/container_wiring.py,sha256=207Oh4ugGiF0JN-toOCfqTEY2S-30zzZE2r1o0K0Cp
46
46
  sourcecode/context_cache.py,sha256=lIjEGtoZy2eFDvYUVGbG3yhzlIlpdQd-Q5MldXwi0dA,36787
47
47
  sourcecode/context_graph.py,sha256=a6v2lgl2DxDnPAWE59K3yg6L5YFDak0LIUff3pi9p0c,47327
48
48
  sourcecode/context_scorer.py,sha256=QpChSpsmaAYz91rXA4Ue5xzQmNz_ZboZN09YOHScq1U,14679
49
- sourcecode/context_summarizer.py,sha256=cI2TZMvEhl0BEma12VtPaX6z03ZVBAetVzuK5GaCOvg,6852
49
+ sourcecode/context_summarizer.py,sha256=8a2chqDFvosLrfB2RnK96cnyDMOiuOpi4oK9Rm8Nsfc,6878
50
50
  sourcecode/contract_diff.py,sha256=pOvjLm-2YQ4KWD8G9HsPCs6Lkofkk2e2wve_y_QXjtU,10990
51
51
  sourcecode/contract_init.py,sha256=bXRCqWM9tvrDLeT8j7ea6IWf87jB4VJxnlSzGBsRRXo,19582
52
52
  sourcecode/contract_model.py,sha256=nRxJKPMs1VHwFTa8AVXhGmaLjti3Lr2sjHDpWgv1bfE,3917
@@ -72,7 +72,7 @@ sourcecode/entrypoint_classifier.py,sha256=jhTYlyqDJH2AtdEcLVaRU3lYRTJuF8DkxVzl4
72
72
  sourcecode/env_analyzer.py,sha256=tU2CcW-Lkl__60DMd4ibYnXnxfmPbV5Z9GrToSWLdSA,22029
73
73
  sourcecode/envelope.py,sha256=rISj4NXJZTX0scP7O01fmxl6xnCr_D_c482LkpPzVc0,17407
74
74
  sourcecode/environment_resolution.py,sha256=e86HT3RNbIIUIRChvz1Pu9Um81UvYu22BkpHNnwbUQI,30650
75
- sourcecode/error_schema.py,sha256=uAWEknt3Z-6pNoNaiaSVeiDHdBe-bmt08BDlkS1YaAs,2951
75
+ sourcecode/error_schema.py,sha256=DhxsIvpzAbEzluWFE4IWXYRyccECcJkq2mT2KJB5Tew,3485
76
76
  sourcecode/evidence_provider.py,sha256=GSSL44JEaouO5AHks2sB3d1YvC9xIKIld1yBYxZpXxo,4277
77
77
  sourcecode/execution_plan.py,sha256=R18LdPHnyfu8YMURwhs4PDUqpWFUVxJHgtb8bfg031k,30130
78
78
  sourcecode/explain.py,sha256=soWg-KevnESW9UIBCLTMJOnpR3U0fQi5vwbJnh7xr1c,34744
@@ -149,7 +149,7 @@ sourcecode/repo_classifier.py,sha256=FG1vaWKdWXsWdl-S8hjVMiTqcwgaRXkDyvK4rPcOGtQ
149
149
  sourcecode/repository_ir.py,sha256=xW3ahhhejolAaQL-EMEjOPYmrxhEx5S_3BNGxTEX56U,523074
150
150
  sourcecode/resource_budget.py,sha256=Bo-XMvVK9XyHY_S06fVirZrhXgwmnr3XI38-Li55NWY,7767
151
151
  sourcecode/ris.py,sha256=zlns4esv1tK8VDIYzOzRmw5yM6VLx7oxaPNB_kN3it4,28617
152
- sourcecode/risk.py,sha256=uwKSK5BLNVXaSnRDEmepmFGXODppGmzwS0c-yCEwKrc,100319
152
+ sourcecode/risk.py,sha256=98MhXPM4unAJZFTKKEeAbEjLq4NZ0Wy-66AHQfA3x7c,102506
153
153
  sourcecode/risk_model.py,sha256=RoC-G15qZP5BLEwwmcr4eJ0APgvIbh1WTqhTVT-5YFE,10895
154
154
  sourcecode/rule_catalog.py,sha256=QCx6ToFTMCtDt5uuX1uBMLuw3b9Cd92gGRsX34kud4U,5328
155
155
  sourcecode/rule_pass.py,sha256=DTNxD-nAecMJhIzI1LCd9FyRumInQSZjitacNh4Zoc8,14671
@@ -167,7 +167,7 @@ sourcecode/security_config_scan.py,sha256=LU8gfNUBB6wjKR8jkK-qRKtUrbkHZ301_Xsk6h
167
167
  sourcecode/security_posture.py,sha256=ZWgWMsVdvkDHOkTtAy6T3Q9Kp8ufWsdqPsFQZVBNAFM,56885
168
168
  sourcecode/selection_contract.py,sha256=O3q_zHBgUsp1SDukqmH9nOUO6HxLFH_7fAqVL7JMV_A,1974
169
169
  sourcecode/self_audit.py,sha256=ZK6VZwbkTL66f4Q4U_JD6sdl6KjQ4DvtPcn5XqGcZDY,11541
170
- sourcecode/selftest.py,sha256=PpQhoXqU4DTPMTIZL7am_N-R9byCWF7Ye3i4QjH1k-I,40105
170
+ sourcecode/selftest.py,sha256=eaKk7Cm2MPX8hry5yZh0qUnRgv8GwJGXTcHyHH6LZVw,41742
171
171
  sourcecode/semantic_analyzer.py,sha256=xGwQvhU9xeOlZ4N-TPXFZT8HBHx4Rg0nPwu8nDFl00Y,95621
172
172
  sourcecode/semantic_impact_engine.py,sha256=t09IirGC3JjQDy33JZd1_WKzQVKXkoNl3-XEUr5kjis,20563
173
173
  sourcecode/semantic_integration_engine.py,sha256=ZjyKJKOj-adScWlYBuWx8Ee_P0F4_OImUJVnCYgopuU,20952
@@ -175,7 +175,7 @@ sourcecode/semantic_services.py,sha256=nbUuPv-F01USTt_9CHT8iy_ucCIw3fz4W3Aquea_p
175
175
  sourcecode/serializer.py,sha256=T_AaYQniFFXald2vq1mXjfXz2bh7co6xNUqRRhwIUXc,157952
176
176
  sourcecode/servlet_surface.py,sha256=CeiebkxLXKojUQxIf7HV7tdQAwLM32ggDUwBnVQIjdo,13499
177
177
  sourcecode/source_text.py,sha256=R52gmSljz7L6YVPbixv5W-LOZ5eKUVvSUP3S-QH_IWc,9047
178
- sourcecode/spring_event_topology.py,sha256=5_ON_21Le5zbG-1GRc5GLIi5HJfy_QjcXLVPC5WeUGQ,18055
178
+ sourcecode/spring_event_topology.py,sha256=gm_1J7Dj9JQ1tXnkOzIfjPNFxPLmSN56Vcj8RisqB5I,18093
179
179
  sourcecode/spring_findings.py,sha256=U5gMDdSdhpJLstt3ghG4y5CCS9nzIU9NuRMHpNu7FpY,27766
180
180
  sourcecode/spring_impact.py,sha256=7gcP4MJcRl8SF5UjYnZXsvtwvIollUtYXlUn08q-JMM,98677
181
181
  sourcecode/spring_model.py,sha256=MBUKR1tes5UVGxtYiv4J2WrydgOp_zReek7P7hO50hA,28962
@@ -185,7 +185,7 @@ sourcecode/spring_security_audit.py,sha256=mJxrB-uKvMh2aF3Q8cFVOC8yOYb2JW8P-yK-p
185
185
  sourcecode/spring_semantic.py,sha256=zrUYWF7Gnz6hpP_3hRveHmGEntT95WpgXt6u7PzLSGg,16835
186
186
  sourcecode/spring_tx_analyzer.py,sha256=cFK9M3madb7dKbJ_d97cO-1fGMUPDOwB8KoJ-oocMeY,50951
187
187
  sourcecode/sql_taint.py,sha256=As1DbEdjXMBFjCTXU5ojksOzuKkP6LmnuMVnzzmckzc,26998
188
- sourcecode/summarizer.py,sha256=ldvynjFaKQmQKLiu4_QJEpdciI6WybEodvN7TPQzfwA,41350
188
+ sourcecode/summarizer.py,sha256=1q3znJEoyfeeTOeK217DbTIF46IC25LAIyesmX65jx8,41414
189
189
  sourcecode/target_admission.py,sha256=wFZ4pzlxhiF6Q6s2lEAZEzcCfj1Y6xNvujjt8MdO0Qo,7154
190
190
  sourcecode/test_gap_ranking.py,sha256=hl-tTyQUXZGJycG1b6npbLeE_DaVHaOsvPwG9qqC5y8,15711
191
191
  sourcecode/test_sources.py,sha256=MO6dYg5ogTN29n9G0-IbMqx8omCT23lkhQHbEze2p5M,9441
@@ -217,7 +217,7 @@ sourcecode/detectors/elixir.py,sha256=jCpvt5Yi6jvplc80ovRtWh17q-11ZGo9qX7o8b57TJ
217
217
  sourcecode/detectors/go.py,sha256=2r66uRQfeTWsqxr4HDhT6vExZErby0t46QXLHVBRv9w,2782
218
218
  sourcecode/detectors/heuristic.py,sha256=7cRxrip4yIaggYzZJB6ef8yHKh-gHgiH_pXMFcjlyFU,3723
219
219
  sourcecode/detectors/hybrid.py,sha256=IGFRUVsAZ1ooRlFdznCeJAV6vy1yVDx-VyghvLtddXc,9101
220
- sourcecode/detectors/java.py,sha256=Pf2K1yrBxrsu7Y2WVT0DmKzMDHRFJGEsCiGfTgDN3ew,45051
220
+ sourcecode/detectors/java.py,sha256=1maVLQKGM3FJSWso_pJV7BBaAHB3E4Q8BY0kfmmB7Q4,45166
221
221
  sourcecode/detectors/jvm_ext.py,sha256=EgHJ5W8EE-ZTN9V607mVzohyKgZE8Mc2jCi-DF8RAZU,2616
222
222
  sourcecode/detectors/nodejs.py,sha256=Hg3Gmr7yIMJFiLoDwOTk2wtu00wxIs6kZf-oQujTFUA,13187
223
223
  sourcecode/detectors/parsers.py,sha256=ug9K31tyHqinmv0HkIVQVjdTZpBv67FYKAEf52YXOSM,3178
@@ -273,13 +273,13 @@ sourcecode/telemetry/consent.py,sha256=-Wb8BFGXEexOs8M0Eja7F-T6ZtLNPeRoZnHcHvlP7
273
273
  sourcecode/telemetry/events.py,sha256=l3Z2SQUO4_C2D2ItXOOdVNimAmHedUHnUxqYFTxnsAE,2900
274
274
  sourcecode/telemetry/filters.py,sha256=-lqT2oorECuqEIdeHb--7AZ6BCaUx0bya720a-Z5x6w,7335
275
275
  sourcecode/telemetry/transport.py,sha256=4gGHsq0WeY9VywEZXA3vUxykfiYnw9uuqfjAAec7F8o,1681
276
- sourcecode/_docs/DEFECT-LEDGER.md,sha256=_ykq1oxsyb7OSPCiJ-9hP_NCqaKF5BGXCFwrjGLsJmw,1127987
276
+ sourcecode/_docs/DEFECT-LEDGER.md,sha256=nxh4M37oPSUpUrtyOJf6htNWV4Zi0RVvL-0eudtYuRw,1136723
277
277
  sourcecode/_docs/LICENSE,sha256=23-fk61oSWGVmkWyka-FIM0rhAPM2hcYHnsaridL8Uo,1859
278
278
  sourcecode/_docs/NOTICE,sha256=Br-AA8Y3iJo1WXa5uP8QBpzqI5nDu3iGLbFyvDt3BOs,321
279
- sourcecode/_docs/USER_GUIDE.md,sha256=rphp6Vh3E9tPKwKeeqIgtuY5v_QPcnV-YO588GnmBCI,104970
280
- sourcecode-5.9.8.dist-info/METADATA,sha256=ExptbMq0fys0kg8Jt196tJLfZQc8_VosmEN0j6o_bLM,64969
281
- sourcecode-5.9.8.dist-info/WHEEL,sha256=QccIxa26bgl1E6uMy58deGWi-0aeIkkangHcxk2kWfw,87
282
- sourcecode-5.9.8.dist-info/entry_points.txt,sha256=-JEAdChrK5We51kZcb7OaDcyil-dHBjBPL-NhuO-QY8,89
283
- sourcecode-5.9.8.dist-info/licenses/LICENSE,sha256=23-fk61oSWGVmkWyka-FIM0rhAPM2hcYHnsaridL8Uo,1859
284
- sourcecode-5.9.8.dist-info/licenses/NOTICE,sha256=Br-AA8Y3iJo1WXa5uP8QBpzqI5nDu3iGLbFyvDt3BOs,321
285
- sourcecode-5.9.8.dist-info/RECORD,,
279
+ sourcecode/_docs/USER_GUIDE.md,sha256=wUgVhX1FabtF9y7_62D30p6ZRZUwO4Qolb9sCeAXKPE,105750
280
+ sourcecode-5.9.10.dist-info/METADATA,sha256=dKQwqWX8C1uYEGKKeh9mUxF52qWUvWERLyJmhnSWjEM,65148
281
+ sourcecode-5.9.10.dist-info/WHEEL,sha256=QccIxa26bgl1E6uMy58deGWi-0aeIkkangHcxk2kWfw,87
282
+ sourcecode-5.9.10.dist-info/entry_points.txt,sha256=-JEAdChrK5We51kZcb7OaDcyil-dHBjBPL-NhuO-QY8,89
283
+ sourcecode-5.9.10.dist-info/licenses/LICENSE,sha256=23-fk61oSWGVmkWyka-FIM0rhAPM2hcYHnsaridL8Uo,1859
284
+ sourcecode-5.9.10.dist-info/licenses/NOTICE,sha256=Br-AA8Y3iJo1WXa5uP8QBpzqI5nDu3iGLbFyvDt3BOs,321
285
+ sourcecode-5.9.10.dist-info/RECORD,,