sourcecode 5.9.6__py3-none-any.whl → 5.9.8__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 +59 -0
- sourcecode/_docs/USER_GUIDE.md +8 -4
- sourcecode/cli.py +166 -55
- sourcecode/git_checkout.py +1 -1
- sourcecode/intent_router.py +2 -1
- sourcecode/license.py +8 -6
- sourcecode/packs.py +25 -4
- sourcecode/prepare_context.py +2 -2
- sourcecode/progress.py +34 -1
- sourcecode/selftest.py +2 -0
- sourcecode/spring_impact.py +2 -0
- sourcecode/timeline.py +1 -1
- {sourcecode-5.9.6.dist-info → sourcecode-5.9.8.dist-info}/METADATA +9 -5
- {sourcecode-5.9.6.dist-info → sourcecode-5.9.8.dist-info}/RECORD +20 -20
- {sourcecode-5.9.6.dist-info → sourcecode-5.9.8.dist-info}/WHEEL +0 -0
- {sourcecode-5.9.6.dist-info → sourcecode-5.9.8.dist-info}/entry_points.txt +0 -0
- {sourcecode-5.9.6.dist-info → sourcecode-5.9.8.dist-info}/licenses/LICENSE +0 -0
- {sourcecode-5.9.6.dist-info → sourcecode-5.9.8.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 = {'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':
|
|
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}
|
|
@@ -41,6 +41,65 @@ polyglot repository. It also did not open zero endpoints, minimum token-budget
|
|
|
41
41
|
refusal, unsupported `explain --compact`, or contractless `verify`: each matched
|
|
42
42
|
the declared contract and non-coverage in the observed run.
|
|
43
43
|
|
|
44
|
+
**External audit intake AUD-611, re-audit of release 5.9.6 — 2026-08-27.**
|
|
45
|
+
The external scope was restricted to repositories under Documents/workspace/testing
|
|
46
|
+
and covered about 250 real invocations across seven forks, with 104/104 CLI
|
|
47
|
+
commands exercised. The auditor reports zero target-repository writes, commits
|
|
48
|
+
or dirty worktrees. The final score was 7.4/10; an earlier interim pass recorded
|
|
49
|
+
8/10, so 7.4/10 is the governing result.
|
|
50
|
+
|
|
51
|
+
The three TeaVM field fixes are confirmed across eight or more control
|
|
52
|
+
repositories with no regressions. The new and still-relevant queue is:
|
|
53
|
+
|
|
54
|
+
| ID | Severity | Status | Evidence / closure boundary |
|
|
55
|
+
|---|---:|---|---|
|
|
56
|
+
| AUD-611-B01 | Critical | open | With stdout redirected to /dev/null, an invalid invocation returned exit 0 and empty stderr in 5/5 runs; normal files, pipes and command substitution retained exit 1. Scope is currently INVALID_INPUT only. Fix error transport and exit status independently, then test every error class and redirection form. |
|
|
57
|
+
| AUD-611-B02 | Critical | open | tutorials has 24,073 Java files; cold root compact ran 240.092 seconds, ended with external timeout exit 124 and zero stdout/stderr. CPU was active, so deadlock versus extreme analysis cost is unresolved. Reproduce on supported Windows/Git Bash and POSIX environments, add progress/deadline/partial diagnostics and define a scale contract. |
|
|
58
|
+
| AUD-611-B03 | High | open | Root compact/agent YAML took 85-380 seconds and reported served_from_cache false on repeated unchanged runs. Add a format/view cache regression and publish latency expectations. |
|
|
59
|
+
| AUD-611-B04 | High | open | One selftest hang occurred in about 16 aggregate runs. Other suspected hangs were retracted after adequate-timeout reruns. Add phase correlation, bounded execution and structured timeout failure. |
|
|
60
|
+
| AUD-611-B05 | High | closed | Root help now exposes all 22 accepted functional flags. Dedicated parity coverage and a real TeaVM execution of `--tree --compact` pass; future internal-only options must be explicitly deprecated or hidden. |
|
|
61
|
+
| AUD-611-B06 | Medium | closed | `pr-risk --files -` now rejects an empty list with the same `INVALID_INPUT` stderr envelope and `exit 1` as `pr-impact`; dedicated TeaVM regression passes. No-diff behavior from implicit Git sources remains separately scoped. |
|
|
62
|
+
| AUD-611-B07 | Medium | closed | Shared Git-ref failures now publish canonical `GIT_REF_NOT_FOUND`; TeaVM regressions cover delta and contract-diff, and existing ref consumers were aligned. |
|
|
63
|
+
| AUD-611-B08 | Medium | closed | `cold-start --compact` now qualifies its size as snapshot-dependent instead of claiming `~10K`; the TeaVM no-RIS path and compact identity regressions pass. A hard ceiling remains an optional future product requirement. |
|
|
64
|
+
| AUD-611-B09 | Medium-high | closed | Non-interactive long runs now emit one delayed stderr warning after 60 seconds by default, configurable with `ASK_PROGRESS_WARNING_SECONDS`; short runs remain silent. TeaVM stdout JSON remains valid under the regression. |
|
|
65
|
+
| AUD-611-B10 | Medium | closed | Added the missing `which endpoints have no security` anchor for `security-surface`; natural TeaVM resolution succeeds without scanning, while equal security-intent questions still refuse deterministically. |
|
|
66
|
+
| AUD-611-B11 | Medium | closed | Missing-symbol `impact-chain` results now use `risk_score: null` and `risk_score_raw: null`, matching `impact`'s unscored semantics; both TeaVM command paths return `not_found`, `unknown`, and `exit 1`. |
|
|
67
|
+
| AUD-611-B12 | Medium | open | Compact endpoint omission now carries explicit `population_total` and an inline measured-population note; the JUnit4 project-type classification half remains open. |
|
|
68
|
+
| AUD-611-B13 | Medium | investigation | retrieve endpoint-security failed silently once in 15 runs (6.7%), exit 1 and zero bytes. Add phase/correlation capture and repeated/concurrent reproduction before closure. |
|
|
69
|
+
|
|
70
|
+
Commercially, the audit supports normal repositories up to several thousand
|
|
71
|
+
files and keeps a provisional $35-50/developer/month range, but B01/B02 block
|
|
72
|
+
annual-grade reliability and enterprise-scale positioning until resolved.
|
|
73
|
+
|
|
74
|
+
**External audit intake `AUD-612`, re-audit of release 5.9.7 — 2026-08-27.**
|
|
75
|
+
The external scope covered roughly 130 new invocations across three forks and direct
|
|
76
|
+
retests of all AUD-611 items. It reports five clean forks, no target writes, commits
|
|
77
|
+
or task-kills, and a score of **7.8/10**. It confirms B05, B06, B08, B09, B10 and B11,
|
|
78
|
+
and reports B01 fixed in its own matrix; B01 remains release-artifact verification
|
|
79
|
+
because the prior external round reproduced it. The new queue is:
|
|
80
|
+
|
|
81
|
+
| ID | Severity | Status | Evidence / closure boundary |
|
|
82
|
+
|---|---:|---|---|
|
|
83
|
+
| AUD-612-B02 | Critical | open | `tutorials` root compact still timed out after 300-311s with zero stdout; warning proves activity, not completion. Define scale, deadline and partial-diagnostic contracts. |
|
|
84
|
+
| AUD-612-B03 | High | closed | YAML cache-hit delivery now publishes `_cache.cache_source` and `timing_ms.served_from_cache` consistently; TeaVM YAML smoke plus the direct cache-hit seam regression pass. A real L2 benchmark remains follow-up because this environment rebuilt both runs. |
|
|
85
|
+
| AUD-612-B04 | High | partial | Each `selftest` row now has configurable 120 s default timeout and structured timeout diagnostics/code 75; valid-row scale latency remains open for profiling. Dedicated TeaVM timeout contract regression passes. |
|
|
86
|
+
| AUD-612-B07 | Medium | closed | `pr-impact --since` now resolves refs through the shared authority and publishes `GIT_REF_NOT_FOUND`; dedicated TeaVM and existing Git-ref regressions pass. |
|
|
87
|
+
| AUD-612-B13 | Medium | closed/no-repro | Controlled TeaVM campaign: 30/30 `retrieve endpoint-security --endpoint /` executions completed with exit 0, valid JSON, no errors and stable content identity after cache warm-up. Reopen on a new correlated failure. |
|
|
88
|
+
| AUD-612-L | High | open | `audit-report --format markdown` timed out at 420s/500s, 2/2, after ~228s in 5.9.6. Performance regression remains open; the one-shot heartbeat sub-issue is mitigated by repeated warnings. |
|
|
89
|
+
| AUD-612-K | Medium | closed | Pack orchestration now streams child stderr, forwarding inherited `ASK_PROGRESS=1` progress while preserving aggregate stdout JSON. Dedicated TeaVM gate regression passes. |
|
|
90
|
+
| AUD-612-M | Medium | closed | `explain` missing-class failures now use structured `INVALID_INPUT` stderr and `exit 1`; dedicated TeaVM regression passes. |
|
|
91
|
+
| AUD-612-E | Medium | closed | The events branch now applies `_exit_on_unresolved_target`; missing event symbols return `not_found` with `exit 1`. TeaVM regression passes. |
|
|
92
|
+
| AUD-612-G | Medium | closed | `review-pr` runtime failures and `activate` failures now publish the shared `error.code` envelope on stderr; stdout remains reserved for valid results. `no_diff` remains the intentional successful `no_changes` result. Dedicated TeaVM and contract tests pass. |
|
|
93
|
+
| AUD-612-I | Medium | closed | Removed the residual `~10K` wording from the large-output warning; help, runtime warning and compact payload consistently describe a snapshot-dependent subset with explicit `full_available` metadata. Dedicated TeaVM regression passes. |
|
|
94
|
+
| AUD-612-07 | Low | closed | Missing single tokens close to a registered command now use command admission with a nearest-command suggestion; existing paths retain implicit root-scan behavior. Dedicated TeaVM regression passes. |
|
|
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
|
+
| 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
|
+
| 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
|
+
|
|
99
|
+
Commercially, normal repositories up to about 4,000 files remain viable at a provisional
|
|
100
|
+
$40-55/developer/month. B02, B04 and L block annual CI-gating and extreme-monorepo claims;
|
|
101
|
+
B03, K, M and G weaken machine-consumable evidence.
|
|
102
|
+
|
|
44
103
|
**External audit intake `AUD-610`, release 5.9.3 — 2026-08-27.** The attached
|
|
45
104
|
report scored the build **7.2/10** after five parallel batches and approximately
|
|
46
105
|
120 invocations. It verified a clean target repository, no Java-file changes,
|
sourcecode/_docs/USER_GUIDE.md
CHANGED
|
@@ -46,16 +46,16 @@ 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.8, `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.8, 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.8
|
|
59
59
|
|
|
60
60
|
Invalid analysis inputs fail before expensive work and use the structured
|
|
61
61
|
`INVALID_INPUT` envelope: a missing `--consumer` repository, a malformed CVE
|
|
@@ -236,7 +236,7 @@ pipx install sourcecode # isolated install, no venv needed
|
|
|
236
236
|
|
|
237
237
|
# Verify
|
|
238
238
|
ask version
|
|
239
|
-
# ask 5.9.
|
|
239
|
+
# ask 5.9.8
|
|
240
240
|
```
|
|
241
241
|
|
|
242
242
|
Requires Python 3.9+.
|
|
@@ -1381,6 +1381,10 @@ explaining. The rest do one thing; `ask <command> --help` is the whole story.
|
|
|
1381
1381
|
| `ask chunk-file <file>` | supported | Split a large Java file into semantic chunks an agent can consume |
|
|
1382
1382
|
| `ask intent "<question>"` | supported | Resolve a plain-language question to the typed `retrieve` query that answers it (scored lexical match against a declared vocabulary — no model, no generation). Prints the query; `--run` executes it. A question fitting two intents too closely is refused with both named. |
|
|
1383
1383
|
| `ask rename-class` | supported | Word-boundary Java rename across the repository |
|
|
1384
|
+
|
|
1385
|
+
**Migration note:** `rename-class` requires the explicit `--from OldName --to NewName`
|
|
1386
|
+
options. Older positional name syntax is no longer accepted. Add `--dry-run` when
|
|
1387
|
+
updating an existing script so the planned file changes can be reviewed first.
|
|
1384
1388
|
| `ask schema <name>` | supported | Print a published JSON Schema for this tool's output |
|
|
1385
1389
|
| `ask self-audit` | supported | Check the SHIPPED build's own coherence — cache model, format contract, schema registry and output affordances. Declares explicitly that the semantic engine does not apply to this product's own source (ASK analyses Java; this build is Python), rather than reporting zeros. `ask selftest` is the different question: the defect ledger run against a real repository. |
|
|
1386
1390
|
| `ask auth workspace <repo>...` | supported | Aggregate workspace entitlement preview. `--enforce` opts into the named-buyer pilot that reuses the existing Pro gate when the organization-sized threshold is crossed; advisory mode remains the default and the CLI does not bill. |
|
sourcecode/cli.py
CHANGED
|
@@ -900,8 +900,8 @@ scope matches; `ask cache model` says exactly what a warm buys per command.
|
|
|
900
900
|
[bold]Change and risk:[/bold]
|
|
901
901
|
impact-chain <Class> . [dim]# blast radius; TX/SEC findings opt-in[/dim]
|
|
902
902
|
impact <Class> . [dim]# reverse deps → endpoints reached[/dim]
|
|
903
|
-
pr-impact . --files - [dim]#
|
|
904
|
-
pr-risk . --files - [dim]#
|
|
903
|
+
pr-impact . --files - [dim]# changed-file list on stdin; gating codes[/dim]
|
|
904
|
+
pr-risk . --files - [dim]# changed-file list on stdin; UNKNOWN fails the gate[/dim]
|
|
905
905
|
posture . --since main [dim]# did this branch open an endpoint? (exp.)[/dim]
|
|
906
906
|
drift . --profile prod [dim]# what opened up since the last capture[/dim]
|
|
907
907
|
audit-report . --format markdown [dim]# signed human evidence bundle (exp.)[/dim]
|
|
@@ -1299,6 +1299,15 @@ def _preprocess_args(args: list[str]) -> list[str]:
|
|
|
1299
1299
|
# got wrong instead of swallowing it and erroring on the next one.
|
|
1300
1300
|
if _has_trailing_nonsubcommand_positional(result, i):
|
|
1301
1301
|
_reject_unknown_command(arg)
|
|
1302
|
+
# A single missing token that is very close to a command is a command
|
|
1303
|
+
# typo, not a repository path. Existing directories retain the implicit
|
|
1304
|
+
# `ask <path>` grammar, including names that resemble commands.
|
|
1305
|
+
if not Path(arg).exists():
|
|
1306
|
+
_command_matches = difflib.get_close_matches(
|
|
1307
|
+
arg, sorted(_SUBCOMMANDS), n=3, cutoff=0.6
|
|
1308
|
+
)
|
|
1309
|
+
if _command_matches:
|
|
1310
|
+
_reject_unknown_command(arg)
|
|
1302
1311
|
_set_detected_path(arg)
|
|
1303
1312
|
_path_index = i
|
|
1304
1313
|
if _path_index >= 0:
|
|
@@ -1455,6 +1464,56 @@ def _inject_cache_meta(raw: str, meta: dict) -> str:
|
|
|
1455
1464
|
return raw
|
|
1456
1465
|
|
|
1457
1466
|
|
|
1467
|
+
def _inject_cache_meta_yaml(raw: str, meta: dict) -> str:
|
|
1468
|
+
"""Inject the same cache provenance into a YAML answer as into JSON."""
|
|
1469
|
+
try:
|
|
1470
|
+
from io import StringIO
|
|
1471
|
+
from ruamel.yaml import YAML as _YAML
|
|
1472
|
+
|
|
1473
|
+
yaml = _YAML()
|
|
1474
|
+
obj = yaml.load(raw)
|
|
1475
|
+
if isinstance(obj, dict):
|
|
1476
|
+
obj["_cache"] = meta
|
|
1477
|
+
if "cache_source" in meta:
|
|
1478
|
+
obj["cache_source"] = meta["cache_source"]
|
|
1479
|
+
out = StringIO()
|
|
1480
|
+
yaml.dump(obj, out)
|
|
1481
|
+
return out.getvalue()
|
|
1482
|
+
except Exception:
|
|
1483
|
+
pass
|
|
1484
|
+
return raw
|
|
1485
|
+
|
|
1486
|
+
|
|
1487
|
+
def _refresh_delivery_timing_yaml(raw: str, *, served_from_cache: bool, elapsed_ms: float) -> str:
|
|
1488
|
+
"""Refresh cache timing in YAML without routing the machine answer through JSON."""
|
|
1489
|
+
try:
|
|
1490
|
+
from io import StringIO
|
|
1491
|
+
from ruamel.yaml import YAML as _YAML
|
|
1492
|
+
|
|
1493
|
+
yaml = _YAML()
|
|
1494
|
+
obj = yaml.load(raw)
|
|
1495
|
+
if not isinstance(obj, dict):
|
|
1496
|
+
return raw
|
|
1497
|
+
meta = obj.setdefault("_meta", {})
|
|
1498
|
+
if not isinstance(meta, dict):
|
|
1499
|
+
return raw
|
|
1500
|
+
timing = meta.setdefault("timing_ms", {})
|
|
1501
|
+
if not isinstance(timing, dict):
|
|
1502
|
+
timing = {}
|
|
1503
|
+
meta["timing_ms"] = timing
|
|
1504
|
+
timing["total_ms"] = round(elapsed_ms, 2)
|
|
1505
|
+
timing["served_from_cache"] = served_from_cache
|
|
1506
|
+
timing["timing_basis"] = "served_from_snapshot" if served_from_cache else "computed"
|
|
1507
|
+
if served_from_cache:
|
|
1508
|
+
timing["phase_timing_basis"] = "snapshot_build"
|
|
1509
|
+
out = StringIO()
|
|
1510
|
+
yaml.dump(obj, out)
|
|
1511
|
+
return out.getvalue()
|
|
1512
|
+
except Exception:
|
|
1513
|
+
pass
|
|
1514
|
+
return raw
|
|
1515
|
+
|
|
1516
|
+
|
|
1458
1517
|
def _refresh_delivery_timing(
|
|
1459
1518
|
raw: str,
|
|
1460
1519
|
*,
|
|
@@ -3557,7 +3616,17 @@ def _resolve_files_option(
|
|
|
3557
3616
|
),
|
|
3558
3617
|
)
|
|
3559
3618
|
raise typer.Exit(code=1)
|
|
3560
|
-
|
|
3619
|
+
stdin_text = _text_input.read_stdin_text()
|
|
3620
|
+
if "diff --git " in stdin_text or "\n@@ " in stdin_text:
|
|
3621
|
+
_emit_error_json(
|
|
3622
|
+
INVALID_INPUT_CODE,
|
|
3623
|
+
"--files - expects a list of changed paths, not a raw unified diff.",
|
|
3624
|
+
hint=f"Pipe paths with: git diff --name-only REF | ask {command} . --files -",
|
|
3625
|
+
expected="One repository-relative file path per line.",
|
|
3626
|
+
reason="raw_diff_on_stdin",
|
|
3627
|
+
)
|
|
3628
|
+
raise typer.Exit(code=1)
|
|
3629
|
+
return _text_input.parse_path_lines(stdin_text), "stdin"
|
|
3561
3630
|
as_path = Path(raw)
|
|
3562
3631
|
if as_path.is_file():
|
|
3563
3632
|
return (
|
|
@@ -3587,6 +3656,20 @@ def _resolve_files_option(
|
|
|
3587
3656
|
def _git_changed_files(root: Path, since: Optional[str]) -> "tuple[list[str], str]":
|
|
3588
3657
|
"""Resolve a local Git diff without network access or repository mutation."""
|
|
3589
3658
|
if since:
|
|
3659
|
+
# Resolve the ref through the shared authority before asking Git for the
|
|
3660
|
+
# diff, so every consumer publishes the canonical ref error code.
|
|
3661
|
+
from sourcecode.git_checkout import RefError, resolve_ref
|
|
3662
|
+
|
|
3663
|
+
try:
|
|
3664
|
+
resolve_ref(root, since)
|
|
3665
|
+
except RefError as exc:
|
|
3666
|
+
_emit_error_json(
|
|
3667
|
+
exc.code,
|
|
3668
|
+
exc.message,
|
|
3669
|
+
hint="Check the repository and ref, or pass --files explicitly.",
|
|
3670
|
+
ref=since,
|
|
3671
|
+
)
|
|
3672
|
+
raise typer.Exit(code=1)
|
|
3590
3673
|
command = ["git", "diff", "--name-only", since, "HEAD"]
|
|
3591
3674
|
description = f"git diff {since} HEAD"
|
|
3592
3675
|
else:
|
|
@@ -5008,39 +5091,33 @@ def main(
|
|
|
5008
5091
|
dependencies: bool = typer.Option(
|
|
5009
5092
|
False,
|
|
5010
5093
|
"--dependencies",
|
|
5011
|
-
hidden=True,
|
|
5012
5094
|
help="Analyze direct dependencies from manifests and lockfiles. " + _IMPLIED_NOTE,
|
|
5013
5095
|
),
|
|
5014
5096
|
graph_modules: bool = typer.Option(
|
|
5015
5097
|
False,
|
|
5016
5098
|
"--graph-modules",
|
|
5017
|
-
hidden=True,
|
|
5018
5099
|
help="Include a structural module graph in output.",
|
|
5019
5100
|
),
|
|
5020
5101
|
graph_detail: str = typer.Option(
|
|
5021
5102
|
"high",
|
|
5022
5103
|
"--graph-detail",
|
|
5023
|
-
hidden=True,
|
|
5024
5104
|
help="Detail level for --graph-modules: high, medium, full.",
|
|
5025
5105
|
show_default=True,
|
|
5026
5106
|
),
|
|
5027
5107
|
max_nodes: Optional[int] = typer.Option(
|
|
5028
5108
|
None,
|
|
5029
5109
|
"--max-nodes",
|
|
5030
|
-
hidden=True,
|
|
5031
5110
|
help="Maximum nodes in --graph-modules output.",
|
|
5032
5111
|
min=1,
|
|
5033
5112
|
),
|
|
5034
5113
|
graph_edges: Optional[str] = typer.Option(
|
|
5035
5114
|
None,
|
|
5036
5115
|
"--graph-edges",
|
|
5037
|
-
hidden=True,
|
|
5038
5116
|
help="Edge types for --graph-modules, comma-separated: imports,calls,contains,extends.",
|
|
5039
5117
|
),
|
|
5040
5118
|
tree: bool = typer.Option(
|
|
5041
5119
|
False,
|
|
5042
5120
|
"--tree",
|
|
5043
|
-
hidden=True,
|
|
5044
5121
|
help="Include the full file_tree and flat file_paths list in output.",
|
|
5045
5122
|
),
|
|
5046
5123
|
no_redact: bool = typer.Option(
|
|
@@ -5066,32 +5143,27 @@ def main(
|
|
|
5066
5143
|
docs: bool = typer.Option(
|
|
5067
5144
|
False,
|
|
5068
5145
|
"--docs",
|
|
5069
|
-
hidden=True,
|
|
5070
5146
|
help="Extract documentation: docstrings, function signatures, and module-level comments.",
|
|
5071
5147
|
),
|
|
5072
5148
|
docs_depth: str = typer.Option(
|
|
5073
5149
|
"symbols",
|
|
5074
5150
|
"--docs-depth",
|
|
5075
|
-
hidden=True,
|
|
5076
5151
|
help="Documentation extraction depth: module, symbols, full.",
|
|
5077
5152
|
show_default=True,
|
|
5078
5153
|
),
|
|
5079
5154
|
full_metrics: bool = typer.Option(
|
|
5080
5155
|
False,
|
|
5081
5156
|
"--full-metrics",
|
|
5082
|
-
hidden=True,
|
|
5083
5157
|
help="Technical audit: LOC, complexity, test coverage per file.",
|
|
5084
5158
|
),
|
|
5085
5159
|
semantics: bool = typer.Option(
|
|
5086
5160
|
False,
|
|
5087
5161
|
"--semantics",
|
|
5088
|
-
hidden=True,
|
|
5089
5162
|
help="Cross-file symbol resolution and call graph analysis.",
|
|
5090
5163
|
),
|
|
5091
5164
|
architecture: bool = typer.Option(
|
|
5092
5165
|
False,
|
|
5093
5166
|
"--architecture",
|
|
5094
|
-
hidden=True,
|
|
5095
5167
|
help="Architectural layer inference (MVC/hexagonal/layered). " + _IMPLIED_NOTE,
|
|
5096
5168
|
),
|
|
5097
5169
|
git_context: bool = typer.Option(
|
|
@@ -5103,7 +5175,6 @@ def main(
|
|
|
5103
5175
|
git_depth: int = typer.Option(
|
|
5104
5176
|
20,
|
|
5105
5177
|
"--git-depth",
|
|
5106
|
-
hidden=True,
|
|
5107
5178
|
help="Number of recent commits to include with --git-context (default: 20).",
|
|
5108
5179
|
min=1,
|
|
5109
5180
|
max=100,
|
|
@@ -5111,7 +5182,6 @@ def main(
|
|
|
5111
5182
|
git_days: int = typer.Option(
|
|
5112
5183
|
90,
|
|
5113
5184
|
"--git-days",
|
|
5114
|
-
hidden=True,
|
|
5115
5185
|
help="Time window in days for change hotspot detection (default: 90).",
|
|
5116
5186
|
min=1,
|
|
5117
5187
|
max=3650,
|
|
@@ -5127,7 +5197,6 @@ def main(
|
|
|
5127
5197
|
code_notes: bool = typer.Option(
|
|
5128
5198
|
False,
|
|
5129
5199
|
"--code-notes",
|
|
5130
|
-
hidden=True,
|
|
5131
5200
|
help=(
|
|
5132
5201
|
"Extract inline annotations: TODO, FIXME, HACK, DEPRECATED, ADRs. "
|
|
5133
5202
|
+ _IMPLIED_NOTE
|
|
@@ -5153,26 +5222,22 @@ def main(
|
|
|
5153
5222
|
trace_pipeline: bool = typer.Option(
|
|
5154
5223
|
False,
|
|
5155
5224
|
"--trace-pipeline",
|
|
5156
|
-
hidden=True,
|
|
5157
5225
|
help="Diagnostic: include full pipeline trace in output.",
|
|
5158
5226
|
),
|
|
5159
5227
|
mode: str = typer.Option(
|
|
5160
5228
|
"contract",
|
|
5161
5229
|
"--mode",
|
|
5162
|
-
hidden=True,
|
|
5163
5230
|
help="Output mode: contract (default) | standard | raw.",
|
|
5164
5231
|
),
|
|
5165
5232
|
max_symbols: Optional[int] = typer.Option(
|
|
5166
5233
|
None,
|
|
5167
5234
|
"--max-symbols",
|
|
5168
|
-
hidden=True,
|
|
5169
5235
|
help="Limit total exported semantic nodes across all file contracts.",
|
|
5170
5236
|
min=1,
|
|
5171
5237
|
),
|
|
5172
5238
|
entrypoints_only: bool = typer.Option(
|
|
5173
5239
|
False,
|
|
5174
5240
|
"--entrypoints-only",
|
|
5175
|
-
hidden=True,
|
|
5176
5241
|
help="Include only files with exported symbols or runtime entrypoints.",
|
|
5177
5242
|
),
|
|
5178
5243
|
changed_only: bool = typer.Option(
|
|
@@ -5183,25 +5248,21 @@ def main(
|
|
|
5183
5248
|
rank_by: str = typer.Option(
|
|
5184
5249
|
"relevance",
|
|
5185
5250
|
"--rank-by",
|
|
5186
|
-
hidden=True,
|
|
5187
5251
|
help="Contract ranking strategy: relevance (default) | centrality | git-churn.",
|
|
5188
5252
|
),
|
|
5189
5253
|
emit_graph: bool = typer.Option(
|
|
5190
5254
|
False,
|
|
5191
5255
|
"--emit-graph",
|
|
5192
|
-
hidden=True,
|
|
5193
5256
|
help="Include a compact dependency graph in contract output.",
|
|
5194
5257
|
),
|
|
5195
5258
|
symbol: Optional[str] = typer.Option(
|
|
5196
5259
|
None,
|
|
5197
5260
|
"--symbol",
|
|
5198
|
-
hidden=True,
|
|
5199
5261
|
help="Extract context for a specific symbol (Python/TS/JS only — not supported for Java).",
|
|
5200
5262
|
),
|
|
5201
5263
|
max_importers: int = typer.Option(
|
|
5202
5264
|
50,
|
|
5203
5265
|
"--max-importers",
|
|
5204
|
-
hidden=True,
|
|
5205
5266
|
help="Maximum importer files returned by --symbol (default: 50).",
|
|
5206
5267
|
min=1,
|
|
5207
5268
|
max=10000,
|
|
@@ -6076,6 +6137,26 @@ def main(
|
|
|
6076
6137
|
)
|
|
6077
6138
|
except Exception:
|
|
6078
6139
|
pass # stale value better than crash
|
|
6140
|
+
else:
|
|
6141
|
+
_cache_hit_content = _inject_cache_meta_yaml(
|
|
6142
|
+
_cache_hit_content,
|
|
6143
|
+
_cache_meta_block(
|
|
6144
|
+
cache_source=_hit_source,
|
|
6145
|
+
git_head_at_generation=_git_sha,
|
|
6146
|
+
current_git_head=_git_sha,
|
|
6147
|
+
has_uncommitted_changes=False,
|
|
6148
|
+
has_uncommitted_changes_basis="YAML cache delivery",
|
|
6149
|
+
generated_at=None,
|
|
6150
|
+
data_scope=("COMPACT" if compact else ("AGENT" if agent else "FULL")),
|
|
6151
|
+
target=target,
|
|
6152
|
+
with_ris_fact=True,
|
|
6153
|
+
),
|
|
6154
|
+
)
|
|
6155
|
+
_cache_hit_content = _refresh_delivery_timing_yaml(
|
|
6156
|
+
_cache_hit_content,
|
|
6157
|
+
served_from_cache=True,
|
|
6158
|
+
elapsed_ms=(time.monotonic() - _t0) * 1000,
|
|
6159
|
+
)
|
|
6079
6160
|
# C1: token economy on the agent-facing views (cache-hit path).
|
|
6080
6161
|
if format == "json" and (compact or agent):
|
|
6081
6162
|
from sourcecode.token_estimate import inject_token_economy as _inj_te
|
|
@@ -7850,31 +7931,33 @@ def prepare_context_cmd(
|
|
|
7850
7931
|
# review-pr specific fields
|
|
7851
7932
|
if task == "review-pr":
|
|
7852
7933
|
if output.error_code:
|
|
7853
|
-
|
|
7854
|
-
|
|
7855
|
-
|
|
7856
|
-
|
|
7857
|
-
|
|
7858
|
-
|
|
7859
|
-
|
|
7860
|
-
|
|
7861
|
-
|
|
7862
|
-
|
|
7863
|
-
|
|
7864
|
-
|
|
7865
|
-
|
|
7866
|
-
|
|
7934
|
+
if output.error_code == "no_diff":
|
|
7935
|
+
_no_diff_out = {
|
|
7936
|
+
"task": output.task,
|
|
7937
|
+
"ci_decision": "no_changes",
|
|
7938
|
+
"summary": "No changes detected",
|
|
7939
|
+
}
|
|
7940
|
+
_no_diff_json = _stamp_envelope(
|
|
7941
|
+
json.dumps(_no_diff_out, indent=2, ensure_ascii=_json_ensure_ascii())
|
|
7942
|
+
)
|
|
7943
|
+
if output_path is not None:
|
|
7944
|
+
_safe_write_file(output_path, _no_diff_json)
|
|
7945
|
+
else:
|
|
7946
|
+
sys.stdout.buffer.write(_no_diff_json.encode("utf-8"))
|
|
7947
|
+
sys.stdout.buffer.write(b"\n")
|
|
7948
|
+
sys.stdout.buffer.flush()
|
|
7949
|
+
raise typer.Exit()
|
|
7950
|
+
_error_hint = " ".join(str(h) for h in (output.error_hints or []))
|
|
7951
|
+
_emit_error_json(
|
|
7952
|
+
output.error_code,
|
|
7953
|
+
output.error_message or "review-pr could not complete.",
|
|
7954
|
+
command="review-pr",
|
|
7955
|
+
ci_decision=output.ci_decision or "error",
|
|
7956
|
+
since=output.since or None,
|
|
7957
|
+
hint=_error_hint or None,
|
|
7958
|
+
hints=output.error_hints or None,
|
|
7867
7959
|
)
|
|
7868
|
-
|
|
7869
|
-
_safe_write_file(output_path, _err_json)
|
|
7870
|
-
else:
|
|
7871
|
-
sys.stdout.buffer.write(_err_json.encode("utf-8"))
|
|
7872
|
-
sys.stdout.buffer.write(b"\n")
|
|
7873
|
-
sys.stdout.buffer.flush()
|
|
7874
|
-
# FIX: no_diff (no PR changes) is not an error — exit 0, consistent
|
|
7875
|
-
# with delta's no_changes handling. Only true errors exit non-zero.
|
|
7876
|
-
_review_pr_exit = 0 if output.error_code == "no_diff" else 1
|
|
7877
|
-
raise typer.Exit(code=_review_pr_exit)
|
|
7960
|
+
raise typer.Exit(code=1)
|
|
7878
7961
|
out["review_type"] = "pull_request"
|
|
7879
7962
|
if output.ci_decision:
|
|
7880
7963
|
out["ci_decision"] = output.ci_decision
|
|
@@ -9156,12 +9239,15 @@ def endpoints_cmd(
|
|
|
9156
9239
|
data["endpoints"] = []
|
|
9157
9240
|
data["endpoints_note"] = (
|
|
9158
9241
|
f"The endpoints list is intentionally omitted by --compact; "
|
|
9159
|
-
f"{_listed} endpoint(s) were measured
|
|
9242
|
+
f"{data.get('total', _listed)} endpoint(s) were measured in the "
|
|
9243
|
+
f"selected population; {_listed} row(s) were present before omission. "
|
|
9244
|
+
"An empty `endpoints` list "
|
|
9160
9245
|
"does not mean that the repository has no endpoints. Re-run without "
|
|
9161
9246
|
"--compact or narrow the request to retrieve rows."
|
|
9162
9247
|
)
|
|
9163
9248
|
data["endpoints_omitted"] = {
|
|
9164
9249
|
"total": _listed,
|
|
9250
|
+
"population_total": data.get("total", _listed),
|
|
9165
9251
|
"shown": 0,
|
|
9166
9252
|
"omitted": _listed,
|
|
9167
9253
|
**cap_effect("display_list", limit=0, total=_listed),
|
|
@@ -15694,6 +15780,7 @@ def impact_chain_cmd(
|
|
|
15694
15780
|
f"{evt_result.metadata.get('consumer_count', 0)} consumers)"
|
|
15695
15781
|
),
|
|
15696
15782
|
)
|
|
15783
|
+
_exit_on_unresolved_target(evt_result.resolution)
|
|
15697
15784
|
return
|
|
15698
15785
|
|
|
15699
15786
|
result = run_impact_chain(
|
|
@@ -16070,6 +16157,15 @@ def explain_cmd(
|
|
|
16070
16157
|
else:
|
|
16071
16158
|
output = explanation.render_text()
|
|
16072
16159
|
|
|
16160
|
+
if not explanation.found:
|
|
16161
|
+
_emit_error_json(
|
|
16162
|
+
INVALID_INPUT_CODE,
|
|
16163
|
+
f"Class '{class_name}' was not found in repository symbols.",
|
|
16164
|
+
hint="Pass an existing class name or FQN; use `ask repo-ir` for the symbol list.",
|
|
16165
|
+
expected="A class present in the analyzed repository.",
|
|
16166
|
+
)
|
|
16167
|
+
raise typer.Exit(code=1)
|
|
16168
|
+
|
|
16073
16169
|
_emit_command_output(output, output_path, copy,
|
|
16074
16170
|
success_msg=f"Explanation written to {output_path}")
|
|
16075
16171
|
|
|
@@ -17328,6 +17424,14 @@ def pr_risk_cmd(
|
|
|
17328
17424
|
changed: "list[str]" = []
|
|
17329
17425
|
if files is not None:
|
|
17330
17426
|
changed, _origin = _resolve_files_option(files, command="pr-risk")
|
|
17427
|
+
if not changed:
|
|
17428
|
+
_emit_error_json(
|
|
17429
|
+
INVALID_INPUT_CODE,
|
|
17430
|
+
f"--files '{_origin}' is empty.",
|
|
17431
|
+
hint="Provide at least one changed file path.",
|
|
17432
|
+
expected="One file path per line, or a comma-separated list.",
|
|
17433
|
+
)
|
|
17434
|
+
raise typer.Exit(code=1)
|
|
17331
17435
|
else:
|
|
17332
17436
|
# The same helper `pr-impact` uses, so one diff means one file set.
|
|
17333
17437
|
changed, _files_desc = _git_changed_files(target, since)
|
|
@@ -18070,6 +18174,10 @@ def selftest_cmd(
|
|
|
18070
18174
|
"checkout's runner). Published with every verdict — the difference "
|
|
18071
18175
|
"ASK-09 hid in was the entry point, not the repository.",
|
|
18072
18176
|
),
|
|
18177
|
+
timeout: int = typer.Option(
|
|
18178
|
+
120, "--timeout", min=1,
|
|
18179
|
+
help="Maximum seconds allowed for each ledger row (default: 120).",
|
|
18180
|
+
),
|
|
18073
18181
|
output_path: Optional[Path] = typer.Option(
|
|
18074
18182
|
None, "--output", "-o", help="Write the verdicts to a file instead of stdout.",
|
|
18075
18183
|
),
|
|
@@ -18122,7 +18230,9 @@ def selftest_cmd(
|
|
|
18122
18230
|
_prog = Progress()
|
|
18123
18231
|
_prog.start("running the ledger against this repository")
|
|
18124
18232
|
try:
|
|
18125
|
-
data = run_selftest(
|
|
18233
|
+
data = run_selftest(
|
|
18234
|
+
target, rows=selected, entry_point=entry_point, timeout=timeout
|
|
18235
|
+
)
|
|
18126
18236
|
finally:
|
|
18127
18237
|
_prog.stop()
|
|
18128
18238
|
|
|
@@ -19335,7 +19445,7 @@ def cold_start_cmd(
|
|
|
19335
19445
|
compact: bool = typer.Option(
|
|
19336
19446
|
False,
|
|
19337
19447
|
"--compact",
|
|
19338
|
-
help="Emit a
|
|
19448
|
+
help="Emit a bounded orientation subset; size depends on the stored snapshot. It is not a fixed token ceiling.",
|
|
19339
19449
|
),
|
|
19340
19450
|
output_path: Optional[Path] = typer.Option(
|
|
19341
19451
|
None,
|
|
@@ -19357,8 +19467,9 @@ def cold_start_cmd(
|
|
|
19357
19467
|
|
|
19358
19468
|
\b
|
|
19359
19469
|
Note: Full output is large (~100K–200K tokens for medium repos).
|
|
19360
|
-
Use --compact for a
|
|
19361
|
-
|
|
19470
|
+
Use --compact for a bounded orientation subset; its size depends on the
|
|
19471
|
+
stored snapshot and it is not a fixed token ceiling. Use --output FILE to
|
|
19472
|
+
save the full snapshot for local search tools.
|
|
19362
19473
|
"""
|
|
19363
19474
|
import json as _json
|
|
19364
19475
|
from sourcecode.ris import get_cold_start_context as _gcs
|
|
@@ -19423,7 +19534,7 @@ def cold_start_cmd(
|
|
|
19423
19534
|
_notice(
|
|
19424
19535
|
f"WARNING: Output is ~{_tokens // 1000}K tokens. This exceeds the context window of "
|
|
19425
19536
|
"most LLMs (GPT-4o: 128K, Claude Sonnet: 200K). "
|
|
19426
|
-
"Use --compact for a
|
|
19537
|
+
"Use --compact for a snapshot-dependent orientation subset, or --output FILE to save."
|
|
19427
19538
|
)
|
|
19428
19539
|
# AUD-596-D01: this payload builds its own `_meta` above (estimated tokens,
|
|
19429
19540
|
# token economy) and used to skip the envelope for that reason — so the one
|
sourcecode/git_checkout.py
CHANGED
|
@@ -34,7 +34,7 @@ from pathlib import Path
|
|
|
34
34
|
from typing import Iterator, Optional
|
|
35
35
|
|
|
36
36
|
#: Error code published when a ref does not resolve in this repository.
|
|
37
|
-
REF_NOT_FOUND = "
|
|
37
|
+
REF_NOT_FOUND = "GIT_REF_NOT_FOUND"
|
|
38
38
|
|
|
39
39
|
#: Error code published when the path given is not a git repository at all.
|
|
40
40
|
NOT_A_REPOSITORY = "not_a_git_repository"
|
sourcecode/intent_router.py
CHANGED
|
@@ -154,7 +154,8 @@ INTENT_VOCABULARY: "dict[str, tuple[str, ...]]" = {
|
|
|
154
154
|
),
|
|
155
155
|
"security-surface": (
|
|
156
156
|
"security surface", "what is exposed", "attack surface",
|
|
157
|
-
"which endpoints are unprotected", "
|
|
157
|
+
"which endpoints are unprotected", "which endpoints have no security",
|
|
158
|
+
"unsecured endpoints",
|
|
158
159
|
),
|
|
159
160
|
"validation-points": (
|
|
160
161
|
"validation points", "where is input validated", "input validation",
|
sourcecode/license.py
CHANGED
|
@@ -715,8 +715,8 @@ def require_pro(feature_name: str) -> None:
|
|
|
715
715
|
def activate_license(license_key: str) -> None:
|
|
716
716
|
"""Validate license_key via Edge Function, write ~/.sourcecode/license.json.
|
|
717
717
|
|
|
718
|
-
Outputs JSON to stdout; exits 0 on success, 1 on any failure.
|
|
719
|
-
|
|
718
|
+
Outputs JSON to stdout on success; exits 0 on success, 1 on any failure.
|
|
719
|
+
Errors use the CLI JSON envelope on stderr so stdout remains machine-safe.
|
|
720
720
|
"""
|
|
721
721
|
if not _LICENSE_KEY_RE.match(license_key):
|
|
722
722
|
_fail("invalid_license", "License key format is invalid.")
|
|
@@ -760,8 +760,10 @@ def activate_license(license_key: str) -> None:
|
|
|
760
760
|
# ---------------------------------------------------------------------------
|
|
761
761
|
|
|
762
762
|
def _fail(error: str, message: str) -> None:
|
|
763
|
-
"""Emit
|
|
764
|
-
|
|
765
|
-
|
|
766
|
-
|
|
763
|
+
"""Emit the shared structured error envelope to stderr and exit 1."""
|
|
764
|
+
from sourcecode.error_schema import build_error_envelope
|
|
765
|
+
|
|
766
|
+
payload = build_error_envelope(error, message, command="activate")
|
|
767
|
+
sys.stderr.write(json.dumps(payload, ensure_ascii=False) + "\n")
|
|
768
|
+
sys.stderr.flush()
|
|
767
769
|
sys.exit(1)
|
sourcecode/packs.py
CHANGED
|
@@ -22,6 +22,7 @@ import json
|
|
|
22
22
|
import subprocess
|
|
23
23
|
import sys
|
|
24
24
|
import tempfile
|
|
25
|
+
import threading
|
|
25
26
|
import time
|
|
26
27
|
from pathlib import Path
|
|
27
28
|
from typing import Any, Callable, Optional, Sequence
|
|
@@ -681,9 +682,29 @@ def _run_command(command: str, root: Path, output: Path, extra: list[str]) -> di
|
|
|
681
682
|
# Run from the repository so relative deployment inputs and build-tool
|
|
682
683
|
# discovery have the same meaning as they do for a user invoking ASK there.
|
|
683
684
|
started = time.monotonic()
|
|
684
|
-
|
|
685
|
-
argv,
|
|
685
|
+
process = subprocess.Popen(
|
|
686
|
+
argv,
|
|
687
|
+
stdout=subprocess.PIPE,
|
|
688
|
+
stderr=subprocess.PIPE,
|
|
689
|
+
text=True,
|
|
690
|
+
cwd=str(root),
|
|
686
691
|
)
|
|
692
|
+
stderr_lines: list[str] = []
|
|
693
|
+
|
|
694
|
+
def _forward_stderr() -> None:
|
|
695
|
+
assert process.stderr is not None
|
|
696
|
+
for line in process.stderr:
|
|
697
|
+
stderr_lines.append(line)
|
|
698
|
+
# Child diagnostics are operational progress/errors, never pack data.
|
|
699
|
+
sys.stderr.write(line)
|
|
700
|
+
sys.stderr.flush()
|
|
701
|
+
|
|
702
|
+
stderr_thread = threading.Thread(target=_forward_stderr, daemon=True)
|
|
703
|
+
stderr_thread.start()
|
|
704
|
+
assert process.stdout is not None
|
|
705
|
+
stdout_text = process.stdout.read()
|
|
706
|
+
process.wait()
|
|
707
|
+
stderr_thread.join(timeout=1)
|
|
687
708
|
duration_ms = int((time.monotonic() - started) * 1000)
|
|
688
709
|
payload: Any = None
|
|
689
710
|
if output.is_file():
|
|
@@ -694,9 +715,9 @@ def _run_command(command: str, root: Path, output: Path, extra: list[str]) -> di
|
|
|
694
715
|
return {
|
|
695
716
|
"command": command,
|
|
696
717
|
"invocation": ["ask", command, *extra, str(root), "--format", "json"],
|
|
697
|
-
"exit_code":
|
|
718
|
+
"exit_code": process.returncode,
|
|
698
719
|
"payload": payload,
|
|
699
|
-
"stderr":
|
|
720
|
+
"stderr": "".join(stderr_lines)[-4000:] if stderr_lines else None,
|
|
700
721
|
# AUD-600-D02: the clock the manifest was missing, taken where the
|
|
701
722
|
# component actually runs.
|
|
702
723
|
"duration_ms": duration_ms,
|
sourcecode/prepare_context.py
CHANGED
|
@@ -1346,7 +1346,7 @@ class TaskContextBuilder:
|
|
|
1346
1346
|
key_dependencies=[], code_notes_summary=None,
|
|
1347
1347
|
limitations=[], confidence="low",
|
|
1348
1348
|
since=since,
|
|
1349
|
-
error_code="
|
|
1349
|
+
error_code="GIT_REF_NOT_FOUND",
|
|
1350
1350
|
error_message=f"Base ref '{since}' not found in this repository.",
|
|
1351
1351
|
error_hints=_pr_hints,
|
|
1352
1352
|
gaps=[f"Cannot compute PR diff: git ref '{since}' not found."] + _pr_hints,
|
|
@@ -1730,7 +1730,7 @@ class TaskContextBuilder:
|
|
|
1730
1730
|
limitations=[],
|
|
1731
1731
|
confidence="low",
|
|
1732
1732
|
since=since,
|
|
1733
|
-
error_code="
|
|
1733
|
+
error_code="GIT_REF_NOT_FOUND",
|
|
1734
1734
|
error_message=f"Git reference '{since}' does not exist in this repository.",
|
|
1735
1735
|
error_hints=_hints,
|
|
1736
1736
|
gaps=[f"Cannot compute delta: git ref '{since}' not found."] + _hints,
|
sourcecode/progress.py
CHANGED
|
@@ -34,6 +34,7 @@ def _duration(seconds: float) -> str:
|
|
|
34
34
|
|
|
35
35
|
#: Consecutive failed heartbeat writes before the loop gives up on the stream.
|
|
36
36
|
_MAX_WRITE_FAILURES = 5
|
|
37
|
+
_DEFAULT_SLOW_RUN_WARNING_SECONDS = 60.0
|
|
37
38
|
|
|
38
39
|
# --- Completion registry ----------------------------------------------------
|
|
39
40
|
# Module state, not per-instance: the emitter of the answer (the CLI output
|
|
@@ -152,6 +153,14 @@ class Progress:
|
|
|
152
153
|
|
|
153
154
|
def __init__(self) -> None:
|
|
154
155
|
self._enabled = _terminal_capable()
|
|
156
|
+
self._slow_warning = not self._enabled and _progress_setting() not in _PROGRESS_OFF
|
|
157
|
+
try:
|
|
158
|
+
self._slow_warning_after = max(
|
|
159
|
+
1.0,
|
|
160
|
+
float(os.environ.get("ASK_PROGRESS_WARNING_SECONDS", str(_DEFAULT_SLOW_RUN_WARNING_SECONDS))),
|
|
161
|
+
)
|
|
162
|
+
except ValueError:
|
|
163
|
+
self._slow_warning_after = _DEFAULT_SLOW_RUN_WARNING_SECONDS
|
|
155
164
|
self._line_mode = self._enabled and (
|
|
156
165
|
bool(progress_file_path()) or not sys.stderr.isatty()
|
|
157
166
|
)
|
|
@@ -164,6 +173,8 @@ class Progress:
|
|
|
164
173
|
self._lock = threading.Lock()
|
|
165
174
|
self._stop_event = threading.Event()
|
|
166
175
|
self._thread: Optional[threading.Thread] = None
|
|
176
|
+
self._slow_warning_thread: Optional[threading.Thread] = None
|
|
177
|
+
self._slow_warning_emitted = False
|
|
167
178
|
self._stopped = False
|
|
168
179
|
self._done_printed = False
|
|
169
180
|
self._outputs_at_start = 0
|
|
@@ -213,6 +224,11 @@ class Progress:
|
|
|
213
224
|
with _registry_lock:
|
|
214
225
|
self._outputs_at_start = _output_events
|
|
215
226
|
if not self._enabled:
|
|
227
|
+
if self._slow_warning:
|
|
228
|
+
self._slow_warning_thread = threading.Thread(
|
|
229
|
+
target=self._slow_warning_loop, daemon=True
|
|
230
|
+
)
|
|
231
|
+
self._slow_warning_thread.start()
|
|
216
232
|
return self
|
|
217
233
|
self._stop_event.clear()
|
|
218
234
|
self._thread = threading.Thread(target=self._loop, daemon=True)
|
|
@@ -313,9 +329,11 @@ class Progress:
|
|
|
313
329
|
if self._stopped:
|
|
314
330
|
return elapsed
|
|
315
331
|
self._stopped = True
|
|
332
|
+
self._stop_event.set()
|
|
333
|
+
if self._slow_warning_thread:
|
|
334
|
+
self._slow_warning_thread.join(timeout=1.0)
|
|
316
335
|
if not self._enabled:
|
|
317
336
|
return elapsed
|
|
318
|
-
self._stop_event.set()
|
|
319
337
|
if self._thread:
|
|
320
338
|
self._thread.join(timeout=1.0)
|
|
321
339
|
if not self._line_mode:
|
|
@@ -502,3 +520,18 @@ class Progress:
|
|
|
502
520
|
if not self._emit(idx):
|
|
503
521
|
break
|
|
504
522
|
idx += 1
|
|
523
|
+
|
|
524
|
+
def _slow_warning_loop(self) -> None:
|
|
525
|
+
"""Give non-interactive supervisors a delayed liveness signal only."""
|
|
526
|
+
while not self._stop_event.wait(timeout=self._slow_warning_after):
|
|
527
|
+
if self._stopped:
|
|
528
|
+
return
|
|
529
|
+
try:
|
|
530
|
+
elapsed = time.monotonic() - self._t0
|
|
531
|
+
self._write(
|
|
532
|
+
f"[ask] warning: run has exceeded {_duration(elapsed)}; "
|
|
533
|
+
"still working (set --progress stderr for periodic heartbeats)\n"
|
|
534
|
+
)
|
|
535
|
+
self._slow_warning_emitted = True
|
|
536
|
+
except Exception:
|
|
537
|
+
pass
|
sourcecode/selftest.py
CHANGED
|
@@ -872,6 +872,7 @@ def run_selftest(
|
|
|
872
872
|
*,
|
|
873
873
|
rows: "tuple[str, ...]" = (),
|
|
874
874
|
entry_point: "str | None" = None,
|
|
875
|
+
timeout: int = 120,
|
|
875
876
|
) -> "dict[str, Any]":
|
|
876
877
|
"""Run the ledger's assertions against *repo* and publish the verdicts."""
|
|
877
878
|
from sourcecode.repository_ir import find_java_files
|
|
@@ -881,6 +882,7 @@ def run_selftest(
|
|
|
881
882
|
entry_point=entry_point or _entry_point(),
|
|
882
883
|
platform=f"{_platform_label()} / python "
|
|
883
884
|
f"{_platform.python_version()}",
|
|
885
|
+
timeout=timeout,
|
|
884
886
|
)
|
|
885
887
|
try:
|
|
886
888
|
subject.java_files = len(find_java_files(Path(repo)))
|
sourcecode/spring_impact.py
CHANGED
|
@@ -1097,6 +1097,8 @@ class ImpactOrchestrator:
|
|
|
1097
1097
|
resolution="not_found",
|
|
1098
1098
|
analysis_warnings=warnings,
|
|
1099
1099
|
risk_level="unknown",
|
|
1100
|
+
risk_score=None,
|
|
1101
|
+
risk_score_raw=None,
|
|
1100
1102
|
confidence="low",
|
|
1101
1103
|
explanation=f"Symbol {symbol!r} not found in the IR.",
|
|
1102
1104
|
metadata={"analysis_depth": depth},
|
sourcecode/timeline.py
CHANGED
|
@@ -245,7 +245,7 @@ def commit_series(repo: Path, since: str, *, first_parent: bool = True) -> list[
|
|
|
245
245
|
result = _git(repo, *args)
|
|
246
246
|
if result.returncode != 0:
|
|
247
247
|
raise TimelineError(
|
|
248
|
-
"
|
|
248
|
+
"GIT_REF_NOT_FOUND",
|
|
249
249
|
f"{since!r} does not resolve in this repository, or has no path to HEAD.",
|
|
250
250
|
ref=since,
|
|
251
251
|
)
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: sourcecode
|
|
3
|
-
Version: 5.9.
|
|
3
|
+
Version: 5.9.8
|
|
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,7 +196,7 @@ 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.8 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. A controlled external warm-path audit has opened performance
|
|
@@ -218,7 +218,7 @@ in `overlapping_paths`; a missing or non-directory path is rejected as structure
|
|
|
218
218
|
invalid input rather than treated as an empty repository. This prevents silent
|
|
219
219
|
entitlement errors in CI and does not change per-repository gates or billing.
|
|
220
220
|
|
|
221
|
-
Release 5.9.
|
|
221
|
+
Release 5.9.8 also hardens the boundary contracts: missing consumer repositories,
|
|
222
222
|
malformed CVE feeds and unresolved `pack gate --since` refs fail as structured
|
|
223
223
|
input errors; duplicate same-commit baselines are never overwritten. `posture
|
|
224
224
|
--diff` validates unknown profiles when the repository declares profiles. In
|
|
@@ -251,7 +251,7 @@ brew tap haroundominique/sourcecode && brew install sourcecode
|
|
|
251
251
|
# pip / pipx
|
|
252
252
|
pipx install sourcecode # or: pip install sourcecode
|
|
253
253
|
|
|
254
|
-
ask version # ask 5.9.
|
|
254
|
+
ask version # ask 5.9.8 — and, on a build that has aged,
|
|
255
255
|
# how many releases have probably shipped since
|
|
256
256
|
```
|
|
257
257
|
|
|
@@ -501,6 +501,10 @@ The everyday loop: diff-based PR review, symptom-driven bug triage, and delta co
|
|
|
501
501
|
|
|
502
502
|
### 7 · Utilities
|
|
503
503
|
`ask rename-class` (word-boundary Java rename) · `ask chunk-file` (split large files for agents) · `ask cache` (status / warm / model / clear / freshness) · `ask self-audit` (does the installed build's own registry agree with itself?)
|
|
504
|
+
|
|
505
|
+
`rename-class` migration note: current releases require the explicit form
|
|
506
|
+
`ask rename-class <repo> --from OldName --to NewName`. Older positional forms are
|
|
507
|
+
not accepted; use `--dry-run` first when migrating scripts.
|
|
504
508
|
→ [reference](docs/USER_GUIDE.md)
|
|
505
509
|
|
|
506
510
|
---
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
sourcecode/__init__.py,sha256=
|
|
1
|
+
sourcecode/__init__.py,sha256=VaWEpHF7AmkJDgZPh7icZZV57BxpC4dhyJ60KSvRMGk,308
|
|
2
2
|
sourcecode/__main__.py,sha256=qDFVkobwsdZrX0B3stiRqsUNivVpybKO-egzAwCW4xw,165
|
|
3
|
-
sourcecode/_build_commit.py,sha256=
|
|
3
|
+
sourcecode/_build_commit.py,sha256=5AagM-XxyCpXU4voHWE61m8PiJyu8NusU-e7n9q3ZFc,9899
|
|
4
4
|
sourcecode/access_drift.py,sha256=1R7_fiAPvKNOnxc9uxkH3JH-k8MiAuyE7FwWUX1r4Fg,8995
|
|
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=JBzPwSSrDG-tUHAbcKB678HRbjLpD-ohzbzzO62mgpo,20114
|
|
38
|
-
sourcecode/cli.py,sha256=
|
|
38
|
+
sourcecode/cli.py,sha256=1WvEmGQjDGsYDCq4eMm7JM4opKHZjagoVvCKqCUdw6s,942911
|
|
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
|
|
@@ -87,16 +87,16 @@ sourcecode/fqn_utils.py,sha256=XLU7zDkNBXz_RZkIUNfpPmp1nekWtqP-fxV92tDV1vg,2158
|
|
|
87
87
|
sourcecode/functional_routes.py,sha256=KXMrDoBwj_GC80w10FvgA3zddIGE1iW9KjpDtCllSSs,16813
|
|
88
88
|
sourcecode/gate_anchors.py,sha256=26v8wUtzOk1K1Un5uXdUxAu20mqSPX3jo82zuM05ByE,2066
|
|
89
89
|
sourcecode/git_analyzer.py,sha256=irvEwddbd5_tbA_eYUZebf4mH7_nFhpjwaWAV1f7jUY,15755
|
|
90
|
-
sourcecode/git_checkout.py,sha256=
|
|
90
|
+
sourcecode/git_checkout.py,sha256=Vnv2OERMa5lUHx57dmefvEMfOzu3f72_RPnLv9zEBuo,6009
|
|
91
91
|
sourcecode/github_diff.py,sha256=H1woYKuCjb6S9sofBPpMlOpn0L4LoVxuVP7ddnhsNaA,3848
|
|
92
92
|
sourcecode/graph_analyzer.py,sha256=Gw2MzLp0P990TGx6D6Ie-WIPnjWVE6X6dNBQnoM9xPU,65857
|
|
93
93
|
sourcecode/graph_evidence.py,sha256=rENNsYRZeNstX_ExNCLlbHJAruFQwxo5d00x6wO3xwI,15030
|
|
94
94
|
sourcecode/hibernate_strat.py,sha256=kLAa5GMwYFZgOI7edl-nDcJTr4SFVYAoxtMy-fj2BsA,77954
|
|
95
95
|
sourcecode/identity_fallback.py,sha256=uRC_j_80uaI4Ue4tf-OhKX4h472dmufYcjEFGSxY2jk,9190
|
|
96
96
|
sourcecode/integration_coordinates.py,sha256=rvuApnS7WdRUbeQLg_oKj-Gi0koO2RKdw6HenXNgrDo,12443
|
|
97
|
-
sourcecode/intent_router.py,sha256=
|
|
97
|
+
sourcecode/intent_router.py,sha256=hC_o0VYfSjzSXecFkpiD7vzFgvt44YAw6E_jrMeGiZ4,15555
|
|
98
98
|
sourcecode/jdk_exports.py,sha256=fCrlwNAXUT9gge_joq6kMnY3zJxYB2pxqy-0w3o3MJI,874
|
|
99
|
-
sourcecode/license.py,sha256=
|
|
99
|
+
sourcecode/license.py,sha256=eIEuIVQXywl_S9LOIACOEpJ4M5RyaPvWrqg_jSNOrXA,31088
|
|
100
100
|
sourcecode/manifest_cache.py,sha256=aPRHUs781d00fVbtlTiSaq0-AS9bAqS7_zJ0snZvlJs,2244
|
|
101
101
|
sourcecode/mcp_nudge.py,sha256=beNjfyb7z09T1rnS4t6Q4qfbLzZQNaP6ddCA4XpmV0s,3256
|
|
102
102
|
sourcecode/metrics_analyzer.py,sha256=gLoRWKygF18jLgwsqmGXSWopw-f5iO1VbM7Jjdif6ag,22809
|
|
@@ -112,7 +112,7 @@ sourcecode/output_ceiling.py,sha256=rMLDHbXeC6C_uP8iQSVbbCGiJ_n0gMr2YI9zt5nltFA,
|
|
|
112
112
|
sourcecode/output_encoding.py,sha256=OxiZQtr7uWBDUtblNQviNHsTH1Xo9AZEpsegPlQWKFk,2139
|
|
113
113
|
sourcecode/output_sink.py,sha256=Eya-PnXxqc3RGulJoLhuC9LUF73SZD0aO5O2B0xAMXU,8762
|
|
114
114
|
sourcecode/pack_manifest.py,sha256=Qm6et6SQsFCLc-HJ-Uhz1XlcOa77ZDHgks4JVDEENss,20820
|
|
115
|
-
sourcecode/packs.py,sha256=
|
|
115
|
+
sourcecode/packs.py,sha256=_f3bRzGIy_Cv2cSUMSco3e6nKxJbApT47PUYMEZwZEw,49506
|
|
116
116
|
sourcecode/parallel.py,sha256=QocwdZoUabdxzd_jEz7f6B2XMsYWFaCFaIl0tIEQs3g,10546
|
|
117
117
|
sourcecode/parse_cache.py,sha256=BaPzh-KygmY4OpJQm2YGh6PWztYsj58vHWTu2eSF4s8,38769
|
|
118
118
|
sourcecode/partial_contract.py,sha256=FZUBACkClvRAmPeYVjxNWeQmP6Y22KW4fPeeTfmT80A,5951
|
|
@@ -126,9 +126,9 @@ sourcecode/posture.py,sha256=OQX3r0wBzdRNwMs6fuJcpFKPuyoC_uAkAVoKsYuwqgE,87190
|
|
|
126
126
|
sourcecode/pr_comment_renderer.py,sha256=239PmJdf95av_ZW236C7_tvq_ahECeuF9AZxrheJ4OQ,15573
|
|
127
127
|
sourcecode/pr_impact.py,sha256=8RgTJgvEThezh-Vm65eiFvJBdb45VjcbewEk5P144-0,39184
|
|
128
128
|
sourcecode/pr_risk.py,sha256=Qbj1aK-JsdTQd_nji_-RaZAL3WUbwqDg9aH-cHQkoog,11354
|
|
129
|
-
sourcecode/prepare_context.py,sha256=
|
|
129
|
+
sourcecode/prepare_context.py,sha256=QsJiKoJRNn5_1adyBbKguH_wiaM8hpPLE0fLG9J4ilU,245016
|
|
130
130
|
sourcecode/product_info.py,sha256=rpuCDf0KM2SD-WP8vw2tjdcbhWPsOGEVjSWqS8fkzlo,4966
|
|
131
|
-
sourcecode/progress.py,sha256=
|
|
131
|
+
sourcecode/progress.py,sha256=3tO-rKlRpPPFnRU-qIlQMyq4lsiecMo4GqxEsxAnpMA,23147
|
|
132
132
|
sourcecode/provenance.py,sha256=gLbsLv0gze7k7ChM4i5M3MwKfFPzs8wzM72rUd2C5sM,7342
|
|
133
133
|
sourcecode/ranking_engine.py,sha256=ZAucq_YX2KkWUuAZf4P0lhtQ_38vEFnUhuGtSZd1S0E,12970
|
|
134
134
|
sourcecode/readiness_timeline.py,sha256=KjghC1MWH7Tzto97TBR3N0F8FkR87w5z7lZ1QsWvAQE,8506
|
|
@@ -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=
|
|
170
|
+
sourcecode/selftest.py,sha256=PpQhoXqU4DTPMTIZL7am_N-R9byCWF7Ye3i4QjH1k-I,40105
|
|
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
|
|
@@ -177,7 +177,7 @@ sourcecode/servlet_surface.py,sha256=CeiebkxLXKojUQxIf7HV7tdQAwLM32ggDUwBnVQIjdo
|
|
|
177
177
|
sourcecode/source_text.py,sha256=R52gmSljz7L6YVPbixv5W-LOZ5eKUVvSUP3S-QH_IWc,9047
|
|
178
178
|
sourcecode/spring_event_topology.py,sha256=5_ON_21Le5zbG-1GRc5GLIi5HJfy_QjcXLVPC5WeUGQ,18055
|
|
179
179
|
sourcecode/spring_findings.py,sha256=U5gMDdSdhpJLstt3ghG4y5CCS9nzIU9NuRMHpNu7FpY,27766
|
|
180
|
-
sourcecode/spring_impact.py,sha256=
|
|
180
|
+
sourcecode/spring_impact.py,sha256=7gcP4MJcRl8SF5UjYnZXsvtwvIollUtYXlUn08q-JMM,98677
|
|
181
181
|
sourcecode/spring_model.py,sha256=MBUKR1tes5UVGxtYiv4J2WrydgOp_zReek7P7hO50hA,28962
|
|
182
182
|
sourcecode/spring_profiles.py,sha256=jDNBVhEZQAZXrpqt85FkP2URsMw4YWhQo3W3SLHuwpM,19617
|
|
183
183
|
sourcecode/spring_properties.py,sha256=kPTk5qAJxdbHc1hclhHAP0O-hCIzBn8PTh3lzl-I4a4,8400
|
|
@@ -190,7 +190,7 @@ sourcecode/target_admission.py,sha256=wFZ4pzlxhiF6Q6s2lEAZEzcCfj1Y6xNvujjt8MdO0Q
|
|
|
190
190
|
sourcecode/test_gap_ranking.py,sha256=hl-tTyQUXZGJycG1b6npbLeE_DaVHaOsvPwG9qqC5y8,15711
|
|
191
191
|
sourcecode/test_sources.py,sha256=MO6dYg5ogTN29n9G0-IbMqx8omCT23lkhQHbEze2p5M,9441
|
|
192
192
|
sourcecode/text_input.py,sha256=3pL8DxR_DMI3ece-B70DnppvrEaLh4R17Pp8dK9G_hc,3596
|
|
193
|
-
sourcecode/timeline.py,sha256=
|
|
193
|
+
sourcecode/timeline.py,sha256=d6LttvP7FXUx_FskB3mtb6o5xJnCnP3S9dlbj8-f8cY,22284
|
|
194
194
|
sourcecode/timeline_cache.py,sha256=99RQ-MW3wqxjtuHcVB_k83USsxWP6DqzeupfSzKR_CE,8277
|
|
195
195
|
sourcecode/token_estimate.py,sha256=_2cworfPkfP2ZxVcwX_Ltu0vFdMvK-FMuTY3qJAqI5M,9415
|
|
196
196
|
sourcecode/tree_utils.py,sha256=oAwkGyrixO2VMX4ZMIDzg9V2oBxt3KIxFN3ahVMxKJo,2174
|
|
@@ -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=
|
|
276
|
+
sourcecode/_docs/DEFECT-LEDGER.md,sha256=_ykq1oxsyb7OSPCiJ-9hP_NCqaKF5BGXCFwrjGLsJmw,1127987
|
|
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=
|
|
280
|
-
sourcecode-5.9.
|
|
281
|
-
sourcecode-5.9.
|
|
282
|
-
sourcecode-5.9.
|
|
283
|
-
sourcecode-5.9.
|
|
284
|
-
sourcecode-5.9.
|
|
285
|
-
sourcecode-5.9.
|
|
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,,
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|