sourcecode 5.9.16__py3-none-any.whl → 5.9.18__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 +63 -0
- sourcecode/_docs/USER_GUIDE.md +18 -4
- sourcecode/cli.py +63 -36
- sourcecode/packs.py +15 -5
- sourcecode/parallel.py +8 -1
- {sourcecode-5.9.16.dist-info → sourcecode-5.9.18.dist-info}/METADATA +7 -6
- {sourcecode-5.9.16.dist-info → sourcecode-5.9.18.dist-info}/RECORD +13 -13
- {sourcecode-5.9.16.dist-info → sourcecode-5.9.18.dist-info}/WHEEL +0 -0
- {sourcecode-5.9.16.dist-info → sourcecode-5.9.18.dist-info}/entry_points.txt +0 -0
- {sourcecode-5.9.16.dist-info → sourcecode-5.9.18.dist-info}/licenses/LICENSE +0 -0
- {sourcecode-5.9.16.dist-info → sourcecode-5.9.18.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'}, '`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':
|
|
3
|
+
BUILD_COMMIT = 'e60fde756124d84699d9c2112b653f3e832e3717'
|
|
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-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': 165, 'present': 91, 'absent': 0, 'unresolved': 0, 'uncited': 74, 'unknown': 0}
|
|
@@ -14,6 +14,69 @@ 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 — External Audit `AUD-621`
|
|
18
|
+
|
|
19
|
+
**Release `5.9.18` remediation.** `AUD-621-PACK-STDERR` is corrected in code: the child pipe is read as UTF-8 with replacement and the forwarding loop retains a decode-failure guard. `AUD-621-R` has a second Windows barrier at process-pool construction, complementing the sequential fallback. Both findings remain open until their required native Windows evidence is recorded; `AUD-621-CONTEXT` and `AUD-621-WIN-PROC` are unchanged.
|
|
20
|
+
|
|
21
|
+
**Re-audit of release `5.9.17`, received 2026-08-31.** Four independent
|
|
22
|
+
Windows measurements overturn the apparent partial recovery of the shared
|
|
23
|
+
worker failure: `risk` with a non-zero limit and Markdown `audit-report` had
|
|
24
|
+
zero successful runs; `verify`, `spring-audit`, `migrate-check` and
|
|
25
|
+
`migrate-apply` succeeded only intermittently (roughly 0-27% by command and
|
|
26
|
+
session). The known `PermissionError: [WinError 5]` in `DuplicateHandle` remains
|
|
27
|
+
the governing mechanism. A successful run from one session is not closure
|
|
28
|
+
evidence for this race.
|
|
29
|
+
|
|
30
|
+
The audit also isolates a new, high-confidence Windows defect in `pack gate`:
|
|
31
|
+
the `_forward_stderr` thread decodes child output using the active codepage,
|
|
32
|
+
raises `UnicodeDecodeError` on UTF-8 bytes, then stops draining the pipe. The
|
|
33
|
+
child can block once that pipe fills. Two independent forks captured the same
|
|
34
|
+
traceback. The full evidence is
|
|
35
|
+
[`AUDIT-2026-08-31-EXTERNAL-5.9.17.md`](AUDIT-2026-08-31-EXTERNAL-5.9.17.md).
|
|
36
|
+
|
|
37
|
+
| ID | Severity | Status | Evidence and required closure |
|
|
38
|
+
|---|---:|---|---|
|
|
39
|
+
| `AUD-621-R` | Critical maximum | **open, P0** | All direct shared-worker commands remain unreliable on Windows: `risk --limit != 0` and Markdown `audit-report` were 0% successful; `verify`, `spring-audit`, `migrate-check` and plan-mode `migrate-apply` were 0-27%. Detect pool startup failure, fall back to one process or emit structured non-zero failure, and validate >=25 repetitions in >=2 native Windows sessions per command. |
|
|
40
|
+
| `AUD-621-PACK-STDERR` | Critical | **open, P0** | `packs.py:_forward_stderr` uses the Windows default codepage and crashes on UTF-8 progress bytes; the unread stderr pipe then deadlocks `pack gate`. Open the child stream with UTF-8 and `errors="replace"`, keep draining on decode errors, and test CP1252 plus UTF-8 output. |
|
|
41
|
+
| `AUD-621-CONTEXT` | High | **open, P1** | `analyzing repository context` is stable below about 5,000 Java files but ceases to advance on the 24,073-file corpus for more than 190 seconds. It also explains the `cache warm` agent-view exit 143. Profile this one phase and locate its threshold with 8,000-12,000-file subsets or a synthetic fixture. |
|
|
42
|
+
| `AUD-621-WIN-PROC` | Medium | **open, platform-blocked** | Four `ask.exe` descendants remained after the audit run. Native Windows process-tree evidence is still required. |
|
|
43
|
+
| `AUD-621-REVIEW-PR` | Medium | **closed/no-repro** | No recurrence in five further runs; retain the regression test. |
|
|
44
|
+
|
|
45
|
+
The restored command surface, Bug F, Bug Q, baseline behavior and endpoint/posture
|
|
46
|
+
validation are now independently stable across multiple rounds. They remain
|
|
47
|
+
closed. Production CI-gating and enterprise-scale claims remain blocked by
|
|
48
|
+
`AUD-621-R`, `AUD-621-PACK-STDERR` and the Windows lifecycle evidence.
|
|
49
|
+
|
|
50
|
+
## Current Synchronization — External Audit `AUD-620`
|
|
51
|
+
|
|
52
|
+
**Re-audit of release `5.9.16`, received 2026-08-31.** This audit confirms that
|
|
53
|
+
the defective `5.9.15` command surface was restored: all nine missing commands
|
|
54
|
+
are again registered and independently invoked. It also confirms the `/dev/null`,
|
|
55
|
+
space-form `--max-output-tokens`, input-validation, baseline and `risk --limit 0`
|
|
56
|
+
repairs. On the same Windows corpus, `tutorials` manifest parsing fell from more
|
|
57
|
+
than four minutes to 21.5 seconds; total root analysis was 4m52.6s.
|
|
58
|
+
|
|
59
|
+
The recovery does **not** close the shared reliability defect. Independent forks
|
|
60
|
+
agree that `risk` with a non-zero limit, `verify`, and Markdown `audit-report`
|
|
61
|
+
can still fail silently. Results for `spring-audit`, `migrate-check`, and
|
|
62
|
+
`migrate-apply` conflict between forks, so they remain open pending a single
|
|
63
|
+
controlled Windows matrix of at least 30 repetitions per command. The authoritative
|
|
64
|
+
record is [`AUDIT-2026-08-31-EXTERNAL-5.9.16.md`](AUDIT-2026-08-31-EXTERNAL-5.9.16.md).
|
|
65
|
+
|
|
66
|
+
| ID | Severity | Status | Evidence and required closure |
|
|
67
|
+
|---|---:|---|---|
|
|
68
|
+
| `AUD-620-COMMAND-SURFACE` | Critical | **closed 5.9.16** | The nine commands absent from `5.9.15` are present in `ask --help`, `self-audit` reports 104 registered CLI commands, and three forks invoked them. Keep the installed-wheel command-surface gate. |
|
|
69
|
+
| `AUD-620-R` | Critical maximum | **open, P0** | `risk` with `--limit != 0`, `verify`, and Markdown `audit-report` still have independently observed silent failures. `spring-audit`, `migrate-check`, and `migrate-apply` gave conflicting results. Capture target identity and run >=30 native-Windows/pipx repetitions per command, recording exit code, stdout/stderr bytes, output file and timeout. |
|
|
70
|
+
| `AUD-620-TUTORIALS` | High | **partially fixed, P1** | Manifest parsing improved to 21.5s, but `analyzing repository context` now dominates and total time remains 4m52.6s. Profile that phase on the auditor platform and publish a sustained size/time envelope. |
|
|
71
|
+
| `AUD-620-I` | High | **open, P1** | `cold-start --compact` remains state-dependent (3,496, 31,260, 19,781 and 15,034 bytes across rounds); `cache warm` can fail its agent view with exit 143. Define the priming sequence and investigate the agent-view failure separately. |
|
|
72
|
+
| `AUD-620-WIN-PROC` | Medium | **open, platform-blocked** | Two to four `ask.exe` descendants were still observed. Establish native Windows/Git Bash process-tree evidence before shipping platform-specific teardown. |
|
|
73
|
+
| `AUD-620-REVIEW-PR` | Medium | **closed/no-repro** | The historical lowercase `no_git_repo` path did not reproduce in 38 accumulated repetitions. Retain its regression test. |
|
|
74
|
+
|
|
75
|
+
The release remains suitable for bounded use, but production CI-gating and
|
|
76
|
+
enterprise-scale reliability claims stay blocked until `AUD-620-R`, the Windows
|
|
77
|
+
process lifecycle and the remaining `tutorials` scale work close with repeatable
|
|
78
|
+
native evidence.
|
|
79
|
+
|
|
17
80
|
## Current Synchronization — External Audit `AUD-619`
|
|
18
81
|
|
|
19
82
|
**Re-audit of release `5.9.13`, received 2026-08-28.** The previous apparent
|
sourcecode/_docs/USER_GUIDE.md
CHANGED
|
@@ -46,16 +46,30 @@ 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.
|
|
49
|
+
5.9.18, `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.
|
|
55
|
+
the two pack fixes are included in release 5.9.18, with release-artifact verification
|
|
56
56
|
remaining for detached execution and pack evidence.
|
|
57
57
|
|
|
58
|
-
### Reliability contracts in 5.9.
|
|
58
|
+
### Reliability contracts in 5.9.18
|
|
59
|
+
|
|
60
|
+
**Failures must be visible.** `risk`, `verify`, `audit-report` and
|
|
61
|
+
`migrate-check` turn unexpected analysis failures into structured
|
|
62
|
+
`EXECUTION_FAILED` output and a non-zero exit, rather than an empty success.
|
|
63
|
+
The release battery includes a repeatable six-command Windows matrix; it records
|
|
64
|
+
exit codes and output sizes, but native Windows evidence remains required before
|
|
65
|
+
closing platform-specific findings.
|
|
66
|
+
|
|
67
|
+
**Current Windows limitation.** The `5.9.17` external audit reproduced the
|
|
68
|
+
shared worker-start failure in `risk`, `verify`, `audit-report`, `spring-audit`,
|
|
69
|
+
`migrate-check` and `migrate-apply`. Do not use these commands as a production
|
|
70
|
+
CI gate on Windows until the native matrix closes them. `pack gate --since` now
|
|
71
|
+
uses safe UTF-8 stderr forwarding, but still requires native repeat evidence. See the
|
|
72
|
+
[development roadmap](DEVELOPMENT-ROADMAP.md#external-audit-intake--aud-621-re-audit-release-5917).
|
|
59
73
|
|
|
60
74
|
**A deadline the root analysis honours.** `ASK_MAX_ANALYSIS_SECONDS=<seconds>` now
|
|
61
75
|
stops `ask <repo>` at a measured phase boundary. A run that spends its budget
|
|
@@ -260,7 +274,7 @@ pipx install sourcecode # isolated install, no venv needed
|
|
|
260
274
|
|
|
261
275
|
# Verify
|
|
262
276
|
ask version
|
|
263
|
-
# ask 5.9.
|
|
277
|
+
# ask 5.9.17
|
|
264
278
|
```
|
|
265
279
|
|
|
266
280
|
Requires Python 3.9+.
|
sourcecode/cli.py
CHANGED
|
@@ -3015,6 +3015,26 @@ def _require_answer_delivery(command: str) -> None:
|
|
|
3015
3015
|
_ANSWER_REQUIRED_BY = command
|
|
3016
3016
|
|
|
3017
3017
|
|
|
3018
|
+
def _analysis_failed(command: str, phase: str, exc: Exception) -> NoReturn:
|
|
3019
|
+
"""Fail a costly command with evidence instead of an empty successful exit.
|
|
3020
|
+
|
|
3021
|
+
The Windows worker failure reported in AUD-620 can surface below the
|
|
3022
|
+
command-specific exception types. These commands are consumed by CI, so an
|
|
3023
|
+
unexpected analysis exception must retain a machine-readable cause and a
|
|
3024
|
+
non-zero process status rather than relying on a framework traceback.
|
|
3025
|
+
"""
|
|
3026
|
+
_emit_error_json(
|
|
3027
|
+
EXECUTION_FAILED_CODE,
|
|
3028
|
+
f"{command} failed while {phase}.",
|
|
3029
|
+
command=command,
|
|
3030
|
+
phase=phase,
|
|
3031
|
+
exception_type=type(exc).__name__,
|
|
3032
|
+
hint="Retry once; if it persists, retain this error envelope and the run record.",
|
|
3033
|
+
expected="a completed analysis with a parseable answer",
|
|
3034
|
+
)
|
|
3035
|
+
raise typer.Exit(code=1) from exc
|
|
3036
|
+
|
|
3037
|
+
|
|
3018
3038
|
def _fail_on_missing_required_answer(exit_code: object) -> None:
|
|
3019
3039
|
"""Turn a silent successful composed run into a typed failure (C3-122)."""
|
|
3020
3040
|
if exit_code not in (0, None) or _OUTPUT_DELIVERED or not _ANSWER_REQUIRED_BY:
|
|
@@ -6430,20 +6450,22 @@ def main(
|
|
|
6430
6450
|
# name the broader work that follows instead of leaving a completed stage on
|
|
6431
6451
|
# screen.
|
|
6432
6452
|
_progress.update("analyzing repository context")
|
|
6453
|
+
# Graph, documentation and metrics all analyse the root-only portion of the
|
|
6454
|
+
# same tree. Pruning a large monorepo is itself a full traversal, so derive
|
|
6455
|
+
# that view once instead of repeating it for every optional analyzer.
|
|
6456
|
+
root_context_tree = (
|
|
6457
|
+
prune_workspace_paths(
|
|
6458
|
+
file_tree,
|
|
6459
|
+
[workspace.path for workspace in workspace_analysis.workspaces],
|
|
6460
|
+
)
|
|
6461
|
+
if workspace_analysis.workspaces
|
|
6462
|
+
else file_tree
|
|
6463
|
+
)
|
|
6433
6464
|
module_graphs = []
|
|
6434
6465
|
if graph_analyzer is not None:
|
|
6435
|
-
root_graph_tree = (
|
|
6436
|
-
prune_workspace_paths(
|
|
6437
|
-
file_tree,
|
|
6438
|
-
[workspace.path for workspace in workspace_analysis.workspaces],
|
|
6439
|
-
)
|
|
6440
|
-
if workspace_analysis.workspaces
|
|
6441
|
-
else file_tree
|
|
6442
|
-
)
|
|
6443
6466
|
module_graphs.append(
|
|
6444
6467
|
graph_analyzer.analyze(
|
|
6445
|
-
target,
|
|
6446
|
-
root_graph_tree,
|
|
6468
|
+
target, root_context_tree,
|
|
6447
6469
|
detail="full",
|
|
6448
6470
|
entry_points=entry_points,
|
|
6449
6471
|
)
|
|
@@ -6451,17 +6473,8 @@ def main(
|
|
|
6451
6473
|
doc_records: list[DocRecord] = []
|
|
6452
6474
|
doc_summaries: list[DocSummary] = []
|
|
6453
6475
|
if doc_analyzer is not None:
|
|
6454
|
-
root_doc_tree = (
|
|
6455
|
-
prune_workspace_paths(
|
|
6456
|
-
file_tree,
|
|
6457
|
-
[workspace.path for workspace in workspace_analysis.workspaces],
|
|
6458
|
-
)
|
|
6459
|
-
if workspace_analysis.workspaces
|
|
6460
|
-
else file_tree
|
|
6461
|
-
)
|
|
6462
6476
|
root_doc_records, root_doc_summary = doc_analyzer.analyze(
|
|
6463
|
-
target,
|
|
6464
|
-
root_doc_tree,
|
|
6477
|
+
target, root_context_tree,
|
|
6465
6478
|
depth=docs_depth_typed,
|
|
6466
6479
|
entry_points=[ep.path for ep in entry_points], # LQN-03
|
|
6467
6480
|
)
|
|
@@ -6471,21 +6484,16 @@ def main(
|
|
|
6471
6484
|
file_metrics_records: list[Any] = []
|
|
6472
6485
|
metrics_summaries = []
|
|
6473
6486
|
if metrics_analyzer is not None:
|
|
6474
|
-
root_metrics_tree = (
|
|
6475
|
-
prune_workspace_paths(
|
|
6476
|
-
file_tree,
|
|
6477
|
-
[workspace.path for workspace in workspace_analysis.workspaces],
|
|
6478
|
-
)
|
|
6479
|
-
if workspace_analysis.workspaces
|
|
6480
|
-
else file_tree
|
|
6481
|
-
)
|
|
6482
6487
|
root_file_metrics, root_metrics_summary = metrics_analyzer.analyze(
|
|
6483
|
-
target,
|
|
6484
|
-
root_metrics_tree,
|
|
6488
|
+
target, root_context_tree,
|
|
6485
6489
|
)
|
|
6486
6490
|
file_metrics_records.extend(root_file_metrics)
|
|
6487
6491
|
metrics_summaries.append(root_metrics_summary)
|
|
6488
6492
|
|
|
6493
|
+
# Semantic analysis follows this loop. Keep each already filtered workspace
|
|
6494
|
+
# tree so it does not walk the same files a second time when --semantics is
|
|
6495
|
+
# enabled; on large monorepos that duplicated the context phase's I/O.
|
|
6496
|
+
workspace_trees: dict[str, Any] = {}
|
|
6489
6497
|
for workspace in workspace_analysis.workspaces:
|
|
6490
6498
|
workspace_root = target / workspace.path
|
|
6491
6499
|
if not workspace_root.exists() or not workspace_root.is_dir():
|
|
@@ -6502,6 +6510,7 @@ def main(
|
|
|
6502
6510
|
_ws_topology = RepoClassifier().classify(workspace_root)
|
|
6503
6511
|
workspace_scanner = AdaptiveScanner(workspace_root, topology=_ws_topology, base_depth=depth)
|
|
6504
6512
|
workspace_tree = filter_sensitive_files(workspace_scanner.scan_tree(), redactor)
|
|
6513
|
+
workspace_trees[workspace.path] = workspace_tree
|
|
6505
6514
|
workspace_manifests = workspace_scanner.find_manifests()
|
|
6506
6515
|
workspace_stacks, workspace_entry_points, _ = detector.detect(
|
|
6507
6516
|
workspace_root,
|
|
@@ -6672,14 +6681,15 @@ def main(
|
|
|
6672
6681
|
all_sem_links: list[Any] = []
|
|
6673
6682
|
all_sem_summaries: list[Any] = []
|
|
6674
6683
|
for ws in workspace_analysis.workspaces:
|
|
6684
|
+
workspace_tree = workspace_trees.get(ws.path)
|
|
6685
|
+
if workspace_tree is None:
|
|
6686
|
+
# The general pass deliberately skipped this workspace (for
|
|
6687
|
+
# example because --exclude named it), so semantics must not
|
|
6688
|
+
# reintroduce it through a fresh scan.
|
|
6689
|
+
continue
|
|
6675
6690
|
ws_calls, ws_syms, ws_links, ws_sum = semantic_analyzer.analyze(
|
|
6676
6691
|
target / ws.path,
|
|
6677
|
-
|
|
6678
|
-
filter_sensitive_files(
|
|
6679
|
-
AdaptiveScanner(target / ws.path, base_depth=depth).scan_tree(),
|
|
6680
|
-
redactor,
|
|
6681
|
-
)
|
|
6682
|
-
),
|
|
6692
|
+
workspace_tree,
|
|
6683
6693
|
workspace=ws.path,
|
|
6684
6694
|
)
|
|
6685
6695
|
# Prefix paths to repo-root-relative (sm.file_paths uses root-relative)
|
|
@@ -13412,6 +13422,11 @@ def verify_cmd(
|
|
|
13412
13422
|
hint=f"--fail-on accepts: {' | '.join(_vr.FAIL_ON_CHOICES)}.",
|
|
13413
13423
|
)
|
|
13414
13424
|
raise typer.Exit(code=2 if ci else 0)
|
|
13425
|
+
except typer.Exit:
|
|
13426
|
+
raise
|
|
13427
|
+
except Exception as exc:
|
|
13428
|
+
_prog.stop()
|
|
13429
|
+
_analysis_failed("verify", "verifying contracts", exc)
|
|
13415
13430
|
_prog.stop()
|
|
13416
13431
|
|
|
13417
13432
|
payload = report.to_dict()
|
|
@@ -13678,6 +13693,10 @@ def risk_cmd(
|
|
|
13678
13693
|
ci=ci,
|
|
13679
13694
|
allow_partial=allow_partial,
|
|
13680
13695
|
)
|
|
13696
|
+
except typer.Exit:
|
|
13697
|
+
raise
|
|
13698
|
+
except Exception as exc:
|
|
13699
|
+
_analysis_failed("risk", phase, exc)
|
|
13681
13700
|
finally:
|
|
13682
13701
|
_prog.stop()
|
|
13683
13702
|
if table:
|
|
@@ -14179,6 +14198,10 @@ def audit_report_cmd(
|
|
|
14179
14198
|
checkpoint=_run.checkpoint,
|
|
14180
14199
|
partial_status=lambda **cut: _run.status(_WHY_BUDGET, **cut),
|
|
14181
14200
|
)
|
|
14201
|
+
except typer.Exit:
|
|
14202
|
+
raise
|
|
14203
|
+
except Exception as exc:
|
|
14204
|
+
_analysis_failed("audit-report", _phase, exc)
|
|
14182
14205
|
finally:
|
|
14183
14206
|
_prog.stop()
|
|
14184
14207
|
output = render_markdown(data) if fmt == "markdown" else _serialize_dict(data, fmt)
|
|
@@ -15579,6 +15602,10 @@ def migrate_check_cmd(
|
|
|
15579
15602
|
timings=_mig_timings,
|
|
15580
15603
|
)
|
|
15581
15604
|
report.include_hygiene = include_hygiene
|
|
15605
|
+
except typer.Exit:
|
|
15606
|
+
raise
|
|
15607
|
+
except Exception as exc:
|
|
15608
|
+
_analysis_failed("migrate-check", phase, exc)
|
|
15582
15609
|
finally:
|
|
15583
15610
|
_prog.finish()
|
|
15584
15611
|
if blast_radius:
|
sourcecode/packs.py
CHANGED
|
@@ -719,17 +719,27 @@ def _run_command(command: str, root: Path, output: Path, extra: list[str]) -> di
|
|
|
719
719
|
stdout=subprocess.PIPE,
|
|
720
720
|
stderr=subprocess.PIPE,
|
|
721
721
|
text=True,
|
|
722
|
+
# A Windows console often defaults to a legacy code page while ASK emits
|
|
723
|
+
# UTF-8 diagnostics. Decoding strictly lets the forwarding thread die,
|
|
724
|
+
# leaving stderr undrained and the child blocked on a full pipe.
|
|
725
|
+
encoding="utf-8",
|
|
726
|
+
errors="replace",
|
|
722
727
|
cwd=str(root),
|
|
723
728
|
)
|
|
724
729
|
stderr_lines: list[str] = []
|
|
725
730
|
|
|
726
731
|
def _forward_stderr() -> None:
|
|
727
732
|
assert process.stderr is not None
|
|
728
|
-
|
|
729
|
-
|
|
730
|
-
|
|
731
|
-
|
|
732
|
-
|
|
733
|
+
try:
|
|
734
|
+
for line in process.stderr:
|
|
735
|
+
stderr_lines.append(line)
|
|
736
|
+
# Child diagnostics are operational progress/errors, never pack data.
|
|
737
|
+
sys.stderr.write(line)
|
|
738
|
+
sys.stderr.flush()
|
|
739
|
+
except UnicodeDecodeError:
|
|
740
|
+
# `encoding`/`errors` above prevents this for ASK children. Keep the
|
|
741
|
+
# pack process alive even if a custom stream violates that contract.
|
|
742
|
+
stderr_lines.append("[ask] stderr contained undecodable bytes\n")
|
|
733
743
|
|
|
734
744
|
stderr_thread = threading.Thread(target=_forward_stderr, daemon=True)
|
|
735
745
|
stderr_thread.start()
|
sourcecode/parallel.py
CHANGED
|
@@ -113,7 +113,14 @@ def _reset_for_tests() -> None:
|
|
|
113
113
|
|
|
114
114
|
|
|
115
115
|
def _executor(max_workers: int):
|
|
116
|
-
"""Construct the process executor through one injectable seam.
|
|
116
|
+
"""Construct the process executor through one injectable seam.
|
|
117
|
+
|
|
118
|
+
Windows uses the sequential parse path. Keep that invariant at the only
|
|
119
|
+
construction point as well as at the caller, so a future caller cannot
|
|
120
|
+
reintroduce a ``DuplicateHandle`` worker-start failure.
|
|
121
|
+
"""
|
|
122
|
+
if os.name == "nt":
|
|
123
|
+
raise RuntimeError("Windows process pools are disabled; parse sequentially")
|
|
117
124
|
from concurrent.futures import ProcessPoolExecutor
|
|
118
125
|
|
|
119
126
|
return ProcessPoolExecutor(max_workers=max_workers)
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: sourcecode
|
|
3
|
-
Version: 5.9.
|
|
3
|
+
Version: 5.9.18
|
|
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
|
-

|
|
63
63
|

|
|
64
64
|
|
|
65
65
|
Copyright (c) 2026 Dominique Haroun. All rights reserved. ASK Engine 5.7.0 and
|
|
@@ -196,13 +196,14 @@ 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.
|
|
199
|
+
**Current performance status.** Release 5.9.17 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
202
|
not duration promises. It also removes two repeated walks of the same file tree in
|
|
203
203
|
the detection phase, measured at **1.69× on a 24,073-file monorepo** — 54.9 s to
|
|
204
204
|
32.5 s cold, with a byte-identical answer. A measurement on one repository and one
|
|
205
|
-
machine is not a duration promise either.
|
|
205
|
+
machine is not a duration promise either. It also avoids repeated monorepo tree
|
|
206
|
+
walks when optional context and semantic analysis share the same scan.
|
|
206
207
|
|
|
207
208
|
The root analysis now stops at `ASK_MAX_ANALYSIS_SECONDS` instead of running past
|
|
208
209
|
it: a spent budget returns a structured partial result naming the phases that
|
|
@@ -233,7 +234,7 @@ in `overlapping_paths`; a missing or non-directory path is rejected as structure
|
|
|
233
234
|
invalid input rather than treated as an empty repository. This prevents silent
|
|
234
235
|
entitlement errors in CI and does not change per-repository gates or billing.
|
|
235
236
|
|
|
236
|
-
Release 5.9.
|
|
237
|
+
Release 5.9.17 also carries the boundary-contract hardening: missing consumer repositories,
|
|
237
238
|
malformed CVE feeds and unresolved `pack gate --since` refs fail as structured
|
|
238
239
|
input errors; duplicate same-commit baselines are never overwritten. `posture
|
|
239
240
|
--diff` validates unknown profiles when the repository declares profiles. In
|
|
@@ -266,7 +267,7 @@ brew tap haroundominique/sourcecode && brew install sourcecode
|
|
|
266
267
|
# pip / pipx
|
|
267
268
|
pipx install sourcecode # or: pip install sourcecode
|
|
268
269
|
|
|
269
|
-
ask version # ask 5.9.
|
|
270
|
+
ask version # ask 5.9.18 — and, on a build that has aged,
|
|
270
271
|
# how many releases have probably shipped since
|
|
271
272
|
```
|
|
272
273
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
sourcecode/__init__.py,sha256=
|
|
1
|
+
sourcecode/__init__.py,sha256=S8oxgYH-Q4cv0cFrN88Z1pyCthtwbhP0i_nWVVBKMdo,309
|
|
2
2
|
sourcecode/__main__.py,sha256=qDFVkobwsdZrX0B3stiRqsUNivVpybKO-egzAwCW4xw,165
|
|
3
|
-
sourcecode/_build_commit.py,sha256=
|
|
3
|
+
sourcecode/_build_commit.py,sha256=vnTeW0cnEL6s4BeFQFFObMw4rIAwHS5kiQCKUC8bxcE,11638
|
|
4
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
|
|
@@ -35,7 +35,7 @@ sourcecode/change_plan.py,sha256=drAoDsqFplutCLc6Y0xue7sYkTls0SpYh7aOXvttv3I,129
|
|
|
35
35
|
sourcecode/ci_output.py,sha256=X4NRokWWMRF9Ex8OQrEO2g04GzJ00GDP5zYIoqI9YCc,4625
|
|
36
36
|
sourcecode/cir_graphs.py,sha256=RytqSv1WF8kdlfXj2fPQz16LY4akS2kyThbdWL8beCQ,14835
|
|
37
37
|
sourcecode/classifier.py,sha256=ft1RGPIChvO84q2QMrEH93x1J15AXNWMh26lnxvoRao,26476
|
|
38
|
-
sourcecode/cli.py,sha256=
|
|
38
|
+
sourcecode/cli.py,sha256=9PJjZid-sozU1bsnP12569hdIWouB4u5VE0kZJBWYhw,956514
|
|
39
39
|
sourcecode/click_runtime.py,sha256=K2cUdzFhbd6uEUpucWptXE89_z-ZNZGsqgd-34usUXk,1890
|
|
40
40
|
sourcecode/client_calls.py,sha256=YOPnfRZzRyqmdHvXSVeiunW8cuiuCuWXacNIQRgKMCw,22640
|
|
41
41
|
sourcecode/code_notes_analyzer.py,sha256=EJemNCNc9Dn-1RZYu-aNbK0ELzmsyC4s6FdHi3XyNEI,9392
|
|
@@ -113,8 +113,8 @@ sourcecode/output_ceiling.py,sha256=dY007vP4V3T9AI09EIz_W36A3FWARQiege_BZ72uMs0,
|
|
|
113
113
|
sourcecode/output_encoding.py,sha256=OxiZQtr7uWBDUtblNQviNHsTH1Xo9AZEpsegPlQWKFk,2139
|
|
114
114
|
sourcecode/output_sink.py,sha256=Eya-PnXxqc3RGulJoLhuC9LUF73SZD0aO5O2B0xAMXU,8762
|
|
115
115
|
sourcecode/pack_manifest.py,sha256=Qm6et6SQsFCLc-HJ-Uhz1XlcOa77ZDHgks4JVDEENss,20820
|
|
116
|
-
sourcecode/packs.py,sha256=
|
|
117
|
-
sourcecode/parallel.py,sha256=
|
|
116
|
+
sourcecode/packs.py,sha256=Oewt8fOkxvr1wwZJc_SOjc6sP_9cmKUzi-WOyVLmb7k,51344
|
|
117
|
+
sourcecode/parallel.py,sha256=xzaOOBmqKjbVNwdV2VHXXrWK57wd5sLYhhYRAnKVcdE,13762
|
|
118
118
|
sourcecode/parse_cache.py,sha256=BaPzh-KygmY4OpJQm2YGh6PWztYsj58vHWTu2eSF4s8,38769
|
|
119
119
|
sourcecode/partial_contract.py,sha256=FZUBACkClvRAmPeYVjxNWeQmP6Y22KW4fPeeTfmT80A,5951
|
|
120
120
|
sourcecode/path_admission.py,sha256=5IBfmHvOrSwrVLlXXwj9KAEg-ciVaHYHjcpAS8mriPg,5898
|
|
@@ -274,13 +274,13 @@ sourcecode/telemetry/consent.py,sha256=-Wb8BFGXEexOs8M0Eja7F-T6ZtLNPeRoZnHcHvlP7
|
|
|
274
274
|
sourcecode/telemetry/events.py,sha256=l3Z2SQUO4_C2D2ItXOOdVNimAmHedUHnUxqYFTxnsAE,2900
|
|
275
275
|
sourcecode/telemetry/filters.py,sha256=-lqT2oorECuqEIdeHb--7AZ6BCaUx0bya720a-Z5x6w,7335
|
|
276
276
|
sourcecode/telemetry/transport.py,sha256=4gGHsq0WeY9VywEZXA3vUxykfiYnw9uuqfjAAec7F8o,1681
|
|
277
|
-
sourcecode/_docs/DEFECT-LEDGER.md,sha256=
|
|
277
|
+
sourcecode/_docs/DEFECT-LEDGER.md,sha256=X4PwvNFYNDxjSIiHPP0si8b3YnE6bX_0MM3DMTKA8PE,1167330
|
|
278
278
|
sourcecode/_docs/LICENSE,sha256=23-fk61oSWGVmkWyka-FIM0rhAPM2hcYHnsaridL8Uo,1859
|
|
279
279
|
sourcecode/_docs/NOTICE,sha256=Br-AA8Y3iJo1WXa5uP8QBpzqI5nDu3iGLbFyvDt3BOs,321
|
|
280
|
-
sourcecode/_docs/USER_GUIDE.md,sha256=
|
|
281
|
-
sourcecode-5.9.
|
|
282
|
-
sourcecode-5.9.
|
|
283
|
-
sourcecode-5.9.
|
|
284
|
-
sourcecode-5.9.
|
|
285
|
-
sourcecode-5.9.
|
|
286
|
-
sourcecode-5.9.
|
|
280
|
+
sourcecode/_docs/USER_GUIDE.md,sha256=0pScky3oj00MBUgXFA21hZ-TRDVFhATbL3itSIs4-Ro,107847
|
|
281
|
+
sourcecode-5.9.18.dist-info/METADATA,sha256=eSKyx6_6LTKfEgaxVj_mV4UBVS0FI2_hJv4rTE1110g,66101
|
|
282
|
+
sourcecode-5.9.18.dist-info/WHEEL,sha256=QccIxa26bgl1E6uMy58deGWi-0aeIkkangHcxk2kWfw,87
|
|
283
|
+
sourcecode-5.9.18.dist-info/entry_points.txt,sha256=-JEAdChrK5We51kZcb7OaDcyil-dHBjBPL-NhuO-QY8,89
|
|
284
|
+
sourcecode-5.9.18.dist-info/licenses/LICENSE,sha256=23-fk61oSWGVmkWyka-FIM0rhAPM2hcYHnsaridL8Uo,1859
|
|
285
|
+
sourcecode-5.9.18.dist-info/licenses/NOTICE,sha256=Br-AA8Y3iJo1WXa5uP8QBpzqI5nDu3iGLbFyvDt3BOs,321
|
|
286
|
+
sourcecode-5.9.18.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|