sourcecode 5.8.10__py3-none-any.whl → 5.8.12__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/_docs/DEFECT-LEDGER.md +45 -9
- sourcecode/_docs/USER_GUIDE.md +16 -10
- sourcecode/audit_recipe.py +5 -0
- sourcecode/cache_model.py +3 -3
- sourcecode/cli.py +58 -4
- sourcecode/data_exposure.py +21 -1
- sourcecode/endpoint_disposition.py +7 -2
- sourcecode/hibernate_strat.py +8 -1
- sourcecode/migrate_check.py +22 -0
- sourcecode/openrewrite_recipe.py +17 -0
- sourcecode/perf.py +7 -0
- sourcecode/selftest.py +33 -31
- sourcecode/spring_security_audit.py +7 -2
- {sourcecode-5.8.10.dist-info → sourcecode-5.8.12.dist-info}/METADATA +20 -8
- {sourcecode-5.8.10.dist-info → sourcecode-5.8.12.dist-info}/RECORD +20 -20
- {sourcecode-5.8.10.dist-info → sourcecode-5.8.12.dist-info}/WHEEL +0 -0
- {sourcecode-5.8.10.dist-info → sourcecode-5.8.12.dist-info}/entry_points.txt +0 -0
- {sourcecode-5.8.10.dist-info → sourcecode-5.8.12.dist-info}/licenses/LICENSE +0 -0
- {sourcecode-5.8.10.dist-info → sourcecode-5.8.12.dist-info}/licenses/NOTICE +0 -0
sourcecode/__init__.py
CHANGED
|
@@ -16,20 +16,56 @@ The facts these rows are keyed to are published: `ask schema facts-v1` prints th
|
|
|
16
16
|
|
|
17
17
|
## Current Synchronization
|
|
18
18
|
|
|
19
|
-
**As of 2026-08-19, the `5.8.
|
|
20
|
-
the 5.8.9
|
|
21
|
-
|
|
19
|
+
**As of 2026-08-19, the external `5.8.11` re-audit:** this is the current status of
|
|
20
|
+
the 5.8.8/5.8.9 audit queue. The subject remained `saint-server` at `3dde0376`, with a
|
|
21
|
+
byte-identical CIR and the same 53/61 invocables exercised. The score is **78/100**
|
|
22
|
+
(75 in 5.8.8, 80 in 5.8.9). The observations below remain historical evidence; only
|
|
23
|
+
this table declares present state.
|
|
22
24
|
|
|
23
25
|
| Rows | Current status | Evidence |
|
|
24
26
|
|---|---|---|
|
|
25
|
-
| `AUD-588-B01`, `AUD-589-B01`, `C3-122` | **
|
|
26
|
-
| `AUD-588-B03` | **
|
|
27
|
-
| `AUD-588-B04` | **
|
|
27
|
+
| `AUD-588-B01`, `AUD-589-B01`, `C3-122` | **implemented in 5.8.12** | `9884488` requires `risk` and `audit-report` to deliver stdout or their requested artifact before exit 0; the remaining closure evidence is a field-scale subprocess reproduction. |
|
|
28
|
+
| `AUD-511-R01` / `AUD-588-B03` | **implemented in 5.8.12** | `13362ec` makes SEC-009 read comment-blanked Java, so a Javadoc profile cannot override the live `@Profile("!m3")` declaration. |
|
|
29
|
+
| `AUD-588-B04` | **retracted audit premise** | `data-exposure` correctly preserves `chain_decision`; the reported `coverage_unknown` routes were custom-gate annotations whose application was not configured. `fd34eb1` remains a valid additive disclosure, but no further B04 fix is due. |
|
|
28
30
|
| `AUD-588-B05` | **closed** | `c15f5b6`; changed container-wired components block a false `unaffected` disposition. |
|
|
29
|
-
| `AUD-588-B07` | **
|
|
31
|
+
| `AUD-511-R03` / `AUD-588-B07` | **implemented in 5.8.12** | `47aee1e` gives the published `OUTPUT_TOO_LARGE` envelope precedence over an inconsistent process status and preserves the excerpt in every branch. |
|
|
30
32
|
| `AUD-588-B08` | **closed** | `c084555`; `impact` publishes its independent stdout-byte budget. |
|
|
31
|
-
| `AUD-588-B11` (container/units subset) | **
|
|
32
|
-
| `AUD-
|
|
33
|
+
| `AUD-588-B11` (container/units subset) | **partially implemented in 5.8.12** | `d745d31` discovers nested Maven modules; `273ae8e` suppresses unsupported `pr-impact.unaffected_basis`. `impact` naming, source population units, risk tiers and plan narrative remain open. |
|
|
34
|
+
| `AUD-511-R02` / `AUD-589-B02` | **partially mitigated in 5.8.12, still under investigation** | `b93f230` reuses one `SpringSemanticModel` across every declared `data-exposure` seed; `473f47a` routes `validation` through the shared CIR cache, and `91bd0c0` retains subcommand `--no-cache` compatibility. On the local BroadleafCommerce corpus at the final analyzer fingerprint, a first shared-CIR fill took 10.46 s and its warm `validation --compact` hit took 4.01 s with byte-identical output. This is a same-host cache-state observation, not the 5.8.9/5.8.11 external A/B: the six-run C3-120 comparison and the configured `saint-server` reproduction remain required. |
|
|
35
|
+
| `AUD-588-B02`, `B06`, B11 residuals, `B12` | **partially open in 5.8.12** | `3869c87` excludes explicit EclipseLink from Hibernate applicability and effort; `037223e` publishes provider non-coverage. B11 parity and controlled cost calibration remain required. |
|
|
36
|
+
|
|
37
|
+
### Re-audit Intake: 5.8.11
|
|
38
|
+
|
|
39
|
+
The third external pass uses the same `saint-server` snapshot (`3dde0376`), read-only
|
|
40
|
+
protocol and warm-cache preparation as 5.8.8 and 5.8.9. The CIR hash is identical across
|
|
41
|
+
all three versions. It exercises 53/61 invocables (87%) and reports 78/100. That makes
|
|
42
|
+
rule, output and execution changes attributable without claiming that the application was
|
|
43
|
+
run or that the eight blocked invocables were covered.
|
|
44
|
+
|
|
45
|
+
| ID | Priority | Finding | Required correction / verification |
|
|
46
|
+
|---|---|---|---|
|
|
47
|
+
| `AUD-588-B01`, `AUD-589-B01`, `C3-122` | P0 | `risk -o` can exit 0 with no file; `risk` and `audit-report` can finish with empty stdout. The failure has fast and slow composition paths. | Add a real-subprocess invariant: exit 0 must produce parseable stdout or the requested artifact. Exercise `risk` and `audit-report` with and without `-o`, plus budget-cut partial output. |
|
|
48
|
+
| `AUD-511-R01` | P1 regression | SEC-009 takes `@Profile` from comments and reports an active `@Profile("!m3")` request chain as inactive. | Reuse comment-blanked source and declaration-local profile evidence, or consume posture's authority. Regress a misleading javadoc and both positive/negative profile forms. |
|
|
49
|
+
| `AUD-511-R02` / `AUD-589-B02` | P1 investigation | `endpoints`, `impact`, `spring-audit`, `modernize`, `validation` and `timeline` measure 1.4-2.4x slower than 5.8.9; `data-exposure --config` remains high. | **Partial implementation:** `b93f230` shares the data-exposure semantic model across seeds and `473f47a` makes `validation` reuse the shared CIR; `91bd0c0` confirms `--no-cache` remains a compatibility no-op. Re-run the idle-host, isolated-cache, interleaved-control protocol against the audited `saint-server` configuration before attributing or closing the field regression. |
|
|
50
|
+
| `AUD-511-R03`, `AUD-588-B07` | P1 regression | ASK-09 reports `not_applicable` even though its literal probe emits `OUTPUT_TOO_LARGE` 12x above the ceiling. | Derive branch selection exclusively from the output envelope. Publish `observed_payload_excerpt` for pass, fail, error and not-applicable rows. |
|
|
51
|
+
| `AUD-588-B02` + `B06` | P1 | The EclipseLink repository still receives Hibernate readiness, rewrite-zone classification and 32.9-66.2 person-days; `non_coverage` is null. | A declared competing provider must remove the Hibernate axis from readiness, effort and classification and add provider non-coverage. EclipseLink automation remains out of scope. |
|
|
52
|
+
| `AUD-588-B11` residual | P2 | `impact.matched_fqns` mixes exact resolution with 235 implementations; `migrate-recipe` misses nested Maven manifests; source-file populations lack units; `risk` tier labels diverge; plan/pr-impact prose trails their new container facts. | Bind consumers to established authorities, name populations and units, and add cross-command parity tests. Do not add parallel detection. |
|
|
53
|
+
| `AUD-588-B12` | P2 | 5.1.0 anchors disagree in both directions with 5.8.11 measurements; `timeline` is advertised as foreground despite a 404s sample. | Recalibrate only after controlled measurements and align foreground advice with the explicit opt-in progress policy. |
|
|
54
|
+
|
|
55
|
+
### Feature Recommendations: 5.8.11
|
|
56
|
+
|
|
57
|
+
| ID | Recommendation | Current decision |
|
|
58
|
+
|---|---|---|
|
|
59
|
+
| `AUD-588-F01` | EclipseLink/JPA-provider migration axis. | **Deferred product feature.** First close B02/B06 so the current Hibernate answer is honest about non-coverage. |
|
|
60
|
+
| `AUD-588-F02` | Shared answer-contract authority for profiles, units, populations, caveats and container reach. | **Partial.** The SEC-009 regression and B11 residuals show that new consumers are still re-deriving facts. |
|
|
61
|
+
| `AUD-588-F03` | Versioned cost model by repository size and cache state. | **Partial.** Existing dimensions do not make stale 5.1.0 anchors operationally safe; controlled remeasurement is prerequisite. |
|
|
62
|
+
| `AUD-588-F04` | Default foreground heartbeat without corrupting machine output. | **Explicit opt-in by decision.** Until revised, cost advice must not imply that long commands emit progress by default. |
|
|
63
|
+
| `AUD-588-F05` | Raise audit coverage through safe operational paths and dirty-tree `verify-edit`. | **Locally verified only.** The external run remains 53/61; treat dirty-tree behavior as a validation gap, not a closed product claim. |
|
|
64
|
+
|
|
65
|
+
**Recommended order:** composition-output invariant → SEC-009 profile regression → controlled
|
|
66
|
+
performance measurement → EclipseLink applicability/non-coverage → ASK-09 → B11 narrative
|
|
67
|
+
and parity residuals → cost-model calibration. Keep B04 closed as a retracted premise, and
|
|
68
|
+
do not implement EclipseLink migration automation as part of this bug battery.
|
|
33
69
|
|
|
34
70
|
**As of 2026-08-19, the `5.8.9` release commit:** the latest audit queue was implemented in
|
|
35
71
|
committed post-5.8.7 fixes. This table is
|
sourcecode/_docs/USER_GUIDE.md
CHANGED
|
@@ -39,10 +39,12 @@ Evidence — every answer is backed by auditable evidence, not a gues
|
|
|
39
39
|
CLI commands — impact, endpoints, spring-audit, explain, … each a projection
|
|
40
40
|
```
|
|
41
41
|
|
|
42
|
-
The key idea:
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
42
|
+
The key idea: the extraction is **content-addressed**. Commands reuse the parse cache and,
|
|
43
|
+
where their analysed scope matches, the shared Canonical IR; `ask cache model` names what a
|
|
44
|
+
warm buys for each command rather than implying that every projection costs the same. In
|
|
45
|
+
5.8.12, `validation` enters through that shared CIR and `data-exposure` reuses one semantic
|
|
46
|
+
model across all declared label seeds. (The extraction and consumption contract is fixed in
|
|
47
|
+
the architecture ADRs 0001–0004 under `docs/architecture/`.)
|
|
46
48
|
|
|
47
49
|
---
|
|
48
50
|
|
|
@@ -136,7 +138,7 @@ pipx install sourcecode # isolated install, no venv needed
|
|
|
136
138
|
|
|
137
139
|
# Verify
|
|
138
140
|
ask version
|
|
139
|
-
# ask 5.8.
|
|
141
|
+
# ask 5.8.12
|
|
140
142
|
```
|
|
141
143
|
|
|
142
144
|
Requires Python 3.9+.
|
|
@@ -1482,10 +1484,12 @@ the tree. Set `ASK_RUNS_IN_REPO=1` only when `.ask/runs` belongs in that
|
|
|
1482
1484
|
repository's own artefacts, or `ASK_RUNS_DIR=/path/to/runs` to choose an external
|
|
1483
1485
|
location explicitly.
|
|
1484
1486
|
|
|
1485
|
-
**Large-repo budgets.** Set `ASK_MAX_ANALYSIS_SECONDS=<seconds>` to bound
|
|
1486
|
-
|
|
1487
|
-
|
|
1488
|
-
|
|
1487
|
+
**Large-repo budgets.** Set `ASK_MAX_ANALYSIS_SECONDS=<seconds>` to bound the
|
|
1488
|
+
phase-runner commands `spring-audit`, `risk` and `audit-report`. It is not a
|
|
1489
|
+
process-wide timeout for every repo-wide or deep command. The budget is
|
|
1490
|
+
**honoured, not vetoed**: if the value is below the class floor ASK says so on
|
|
1491
|
+
stderr and runs anyway, and a run that spends its budget publishes what it
|
|
1492
|
+
measured with
|
|
1489
1493
|
|
|
1490
1494
|
```json
|
|
1491
1495
|
"_partial": {"partial": true,
|
|
@@ -1505,7 +1509,9 @@ inventories `rules_run` / `rules_not_run` with `rules_run_count` and
|
|
|
1505
1509
|
stops at 1 408 files inside the `SEC-004` group and ends at 5.1s.
|
|
1506
1510
|
|
|
1507
1511
|
Every count in such an answer is a floor over what ran — a family or phase that
|
|
1508
|
-
never ran is named, never reported as an absence of findings.
|
|
1512
|
+
never ran is named, never reported as an absence of findings. Commands outside
|
|
1513
|
+
that phase-runner set are not bounded by this variable and must not be CI-gated
|
|
1514
|
+
on it. The mark lives
|
|
1509
1515
|
where the numbers are as well as at the root: `summary.partial`,
|
|
1510
1516
|
`summary.counts_are_floor` and `summary.counts_basis`, with
|
|
1511
1517
|
`confidence_level` capped at `low` and `confidence_basis` saying the cut is the
|
sourcecode/audit_recipe.py
CHANGED
|
@@ -127,6 +127,11 @@ MANUAL_BASIS: "dict[str, str]" = {
|
|
|
127
127
|
"clause) and an injection sink for a value, and an executor cannot tell "
|
|
128
128
|
"them apart without the caller's intent"
|
|
129
129
|
),
|
|
130
|
+
"SEC-009": (
|
|
131
|
+
"whether an anonymous request matcher is intentional depends on the "
|
|
132
|
+
"deployment profile and authorization policy, so removing it would be "
|
|
133
|
+
"an unreviewed behaviour change rather than a safe rewrite"
|
|
134
|
+
),
|
|
130
135
|
"DEAD-001": (
|
|
131
136
|
"a disabled security control is a decision somebody made; re-enabling it "
|
|
132
137
|
"changes runtime behaviour nobody has measured here"
|
sourcecode/cache_model.py
CHANGED
|
@@ -653,9 +653,9 @@ def cost_sentence() -> str:
|
|
|
653
653
|
f"files, and a repository-wide audit measured {seconds:g} s on a "
|
|
654
654
|
f"{_thousands(FIELD_ANCHOR_JAVA_FILES)}-file repository "
|
|
655
655
|
f"({FIELD_ANCHOR_MEASURED_VERSION}{stale}).{gate} `ask cache model` prints "
|
|
656
|
-
f"the figure and the build behind it for every command; "
|
|
657
|
-
f"
|
|
658
|
-
f"
|
|
656
|
+
f"the figure and the build behind it for every command; ASK_PROGRESS "
|
|
657
|
+
f"narrates supervised work, while ASK_MAX_ANALYSIS_SECONDS bounds only "
|
|
658
|
+
f"the phase-runner commands (spring-audit, risk and audit-report)."
|
|
659
659
|
)
|
|
660
660
|
|
|
661
661
|
|
sourcecode/cli.py
CHANGED
|
@@ -572,7 +572,8 @@ def _build_help_text(scope: "Optional[Any]" = None) -> str:
|
|
|
572
572
|
|
|
573
573
|
Deterministic Java/Spring semantics and reusable structural context for AI coding agents.
|
|
574
574
|
|
|
575
|
-
|
|
575
|
+
Content-addressed parse and context caches reuse prior knowledge where a command's
|
|
576
|
+
scope matches; `ask cache model` says exactly what a warm buys per command.
|
|
576
577
|
{_cost_sentence()}
|
|
577
578
|
|
|
578
579
|
{_start_here_block(scope)}
|
|
@@ -584,6 +585,12 @@ Cache warms on first scan; later calls reuse pre-built context instead of rescan
|
|
|
584
585
|
ask --compact --git-context [dim]# + git hotspots and uncommitted files[/dim]
|
|
585
586
|
ask --agent [dim]# full structured JSON for AI agents[/dim]
|
|
586
587
|
|
|
588
|
+
[bold]Performance / CI:[/bold]
|
|
589
|
+
validation . --compact [dim]# reuses the shared CIR on a warm matching scope[/dim]
|
|
590
|
+
data-exposure . [dim]# one semantic model is shared across declared label seeds[/dim]
|
|
591
|
+
ASK_MAX_ANALYSIS_SECONDS=N [dim]# deadline only for spring-audit, risk, audit-report[/dim]
|
|
592
|
+
[dim]Other commands are not time-bounded by this variable; use `--progress` or `--detach` where offered.[/dim]
|
|
593
|
+
|
|
587
594
|
[bold]Change and risk:[/bold]
|
|
588
595
|
impact-chain <Class> . [dim]# blast radius; TX/SEC findings opt-in[/dim]
|
|
589
596
|
impact <Class> . [dim]# reverse deps → endpoints reached[/dim]
|
|
@@ -1954,6 +1961,7 @@ def _output_ceiling_error(content: str, *, to_file: bool) -> "Optional[dict[str,
|
|
|
1954
1961
|
#: that cannot produce the file it was asked for must not be able to say it did.
|
|
1955
1962
|
_OUTPUT_PROMISED: "Optional[str]" = None
|
|
1956
1963
|
_OUTPUT_DELIVERED: bool = False
|
|
1964
|
+
_ANSWER_REQUIRED_BY: "Optional[str]" = None
|
|
1957
1965
|
|
|
1958
1966
|
|
|
1959
1967
|
def _record_output_promise(argv: "list[str]") -> None:
|
|
@@ -1966,9 +1974,10 @@ def _record_output_promise(argv: "list[str]") -> None:
|
|
|
1966
1974
|
parser owns that. It is used only to ask, at the end, whether a file the run
|
|
1967
1975
|
promised exists.
|
|
1968
1976
|
"""
|
|
1969
|
-
global _OUTPUT_PROMISED, _OUTPUT_DELIVERED
|
|
1977
|
+
global _OUTPUT_PROMISED, _OUTPUT_DELIVERED, _ANSWER_REQUIRED_BY
|
|
1970
1978
|
_OUTPUT_PROMISED = None
|
|
1971
1979
|
_OUTPUT_DELIVERED = False
|
|
1980
|
+
_ANSWER_REQUIRED_BY = None
|
|
1972
1981
|
for i, token in enumerate(argv):
|
|
1973
1982
|
value: "Optional[str]" = None
|
|
1974
1983
|
if token in ("--output", "-o"):
|
|
@@ -1987,6 +1996,36 @@ def _mark_output_delivered() -> None:
|
|
|
1987
1996
|
_OUTPUT_DELIVERED = True
|
|
1988
1997
|
|
|
1989
1998
|
|
|
1999
|
+
def _require_answer_delivery(command: str) -> None:
|
|
2000
|
+
"""Require a composed-report command to publish an answer before exit 0.
|
|
2001
|
+
|
|
2002
|
+
A file promise catches only ``-o``. Risk composition also has a stdout
|
|
2003
|
+
contract: a successful invocation must leave one parseable document behind.
|
|
2004
|
+
Keeping that obligation opt-in avoids changing intentionally quiet commands
|
|
2005
|
+
while covering both expensive composition surfaces.
|
|
2006
|
+
"""
|
|
2007
|
+
global _ANSWER_REQUIRED_BY
|
|
2008
|
+
_ANSWER_REQUIRED_BY = command
|
|
2009
|
+
|
|
2010
|
+
|
|
2011
|
+
def _fail_on_missing_required_answer(exit_code: object) -> None:
|
|
2012
|
+
"""Turn a silent successful composed run into a typed failure (C3-122)."""
|
|
2013
|
+
if exit_code not in (0, None) or _OUTPUT_DELIVERED or not _ANSWER_REQUIRED_BY:
|
|
2014
|
+
return
|
|
2015
|
+
_emit_error_json(
|
|
2016
|
+
EXECUTION_FAILED_CODE,
|
|
2017
|
+
f"{_ANSWER_REQUIRED_BY} finished without publishing an answer.",
|
|
2018
|
+
hint=(
|
|
2019
|
+
"The command returned successfully before its output was delivered. "
|
|
2020
|
+
"Re-run with progress enabled and report the invocation; a composed "
|
|
2021
|
+
"report must produce parseable stdout or its requested file."
|
|
2022
|
+
),
|
|
2023
|
+
command=_ANSWER_REQUIRED_BY,
|
|
2024
|
+
expected="parseable stdout or the requested output artifact",
|
|
2025
|
+
)
|
|
2026
|
+
raise SystemExit(1)
|
|
2027
|
+
|
|
2028
|
+
|
|
1990
2029
|
def _fail_on_unkept_output_promise(exit_code: object) -> None:
|
|
1991
2030
|
"""Refuse to report success for an answer that was never produced (C3-122).
|
|
1992
2031
|
|
|
@@ -7946,11 +7985,22 @@ def validation_cmd(
|
|
|
7946
7985
|
target = _admit_path(path)
|
|
7947
7986
|
|
|
7948
7987
|
from sourcecode.context_graph import ContextGraph
|
|
7988
|
+
from sourcecode.repository_ir import find_java_files
|
|
7949
7989
|
from sourcecode.validation_surface import build_validation_surface
|
|
7950
7990
|
_prog = Progress()
|
|
7951
7991
|
_prog.start("mapping validation surface")
|
|
7952
|
-
# Structural facts come from the ContextGraph — the single access
|
|
7953
|
-
|
|
7992
|
+
# Structural facts still come from the ContextGraph — the single access
|
|
7993
|
+
# layer — but its CIR now follows the shared knowledge-cache door used by
|
|
7994
|
+
# the other repository-wide commands. A validation run therefore does not
|
|
7995
|
+
# parse the same tree again after `cache warm`, `impact`, or `explain`.
|
|
7996
|
+
# `--no-cache` remains the published no-op for subcommands; the direct build
|
|
7997
|
+
# is strictly the best-effort fallback if the shared layer cannot answer.
|
|
7998
|
+
try:
|
|
7999
|
+
from sourcecode.context_cache import shared_cir
|
|
8000
|
+
|
|
8001
|
+
_graph = ContextGraph.from_cir(shared_cir(target, find_java_files(target)))
|
|
8002
|
+
except Exception:
|
|
8003
|
+
_graph = ContextGraph.build_from_root(target)
|
|
7954
8004
|
data = build_validation_surface(target, graph=_graph)
|
|
7955
8005
|
|
|
7956
8006
|
# P1-C: classify the request-body validation *pattern* so a repo with a
|
|
@@ -10666,6 +10716,7 @@ def risk_cmd(
|
|
|
10666
10716
|
ask risk . --table --rule SEC-008 --band high --top-n 20
|
|
10667
10717
|
ask risk . --limit 10 -o risk.json
|
|
10668
10718
|
"""
|
|
10719
|
+
_require_answer_delivery("risk")
|
|
10669
10720
|
_apply_jobs(jobs)
|
|
10670
10721
|
from sourcecode.risk import build_risk
|
|
10671
10722
|
|
|
@@ -11023,6 +11074,7 @@ def audit_report_cmd(
|
|
|
11023
11074
|
ask audit-report . --profile prod --format markdown
|
|
11024
11075
|
ask audit-report . --sign-key audit.key -o audit-report.json
|
|
11025
11076
|
"""
|
|
11077
|
+
_require_answer_delivery("audit-report")
|
|
11026
11078
|
from sourcecode.audit_report import build_audit_report, render_markdown
|
|
11027
11079
|
|
|
11028
11080
|
path = _admit_path(path)
|
|
@@ -16406,8 +16458,10 @@ def main_entry() -> None:
|
|
|
16406
16458
|
try:
|
|
16407
16459
|
# prog_name pins usage/help to the canonical `ask`, whatever the alias.
|
|
16408
16460
|
app(prog_name="ask")
|
|
16461
|
+
_fail_on_missing_required_answer(0)
|
|
16409
16462
|
_fail_on_unkept_output_promise(0)
|
|
16410
16463
|
except SystemExit as _sysexit:
|
|
16464
|
+
_fail_on_missing_required_answer(_sysexit.code)
|
|
16411
16465
|
_fail_on_unkept_output_promise(_sysexit.code)
|
|
16412
16466
|
raise
|
|
16413
16467
|
except WriteRefused as _refused:
|
sourcecode/data_exposure.py
CHANGED
|
@@ -253,10 +253,30 @@ def build_data_exposure(
|
|
|
253
253
|
rows: dict[str, dict] = {}
|
|
254
254
|
seeds_report: list[dict] = []
|
|
255
255
|
|
|
256
|
+
# Every seed answers a different reachability question over the same CIR.
|
|
257
|
+
# `run_impact_chain` accepts a prepared model precisely so that a declaration
|
|
258
|
+
# with several types does not rebuild the repository-wide semantic indexes
|
|
259
|
+
# once per type. Build lazily: declarations whose labels do not resolve keep
|
|
260
|
+
# the existing failure isolation in `run_impact_chain`.
|
|
261
|
+
impact_model = model
|
|
262
|
+
|
|
256
263
|
for label in decl.labels:
|
|
257
264
|
for seed in label.seed_types:
|
|
258
265
|
found_signature = _signature_routes(graph, seed, handlers)
|
|
259
|
-
|
|
266
|
+
if impact_model is None:
|
|
267
|
+
try:
|
|
268
|
+
from sourcecode.spring_model import SpringSemanticModel
|
|
269
|
+
|
|
270
|
+
impact_model = SpringSemanticModel.build(cir)
|
|
271
|
+
except Exception:
|
|
272
|
+
# `run_impact_chain` owns its error envelope. Retaining None
|
|
273
|
+
# here preserves that per-seed fallback if the model cannot be
|
|
274
|
+
# assembled instead of turning a partial exposure answer into
|
|
275
|
+
# a command failure.
|
|
276
|
+
pass
|
|
277
|
+
chain = run_impact_chain(
|
|
278
|
+
cir, seed, root=root, model=impact_model, depth=depth,
|
|
279
|
+
)
|
|
260
280
|
resolution = str(getattr(chain, "resolution", "not_found"))
|
|
261
281
|
reached = list(getattr(chain, "endpoints_affected", []) or [])
|
|
262
282
|
|
|
@@ -220,7 +220,7 @@ class DispositionSummary:
|
|
|
220
220
|
return summary
|
|
221
221
|
|
|
222
222
|
def to_dict(self) -> dict:
|
|
223
|
-
|
|
223
|
+
out = {
|
|
224
224
|
"affected": self.affected,
|
|
225
225
|
"unknown": self.unknown,
|
|
226
226
|
"unaffected": self.unaffected,
|
|
@@ -230,6 +230,11 @@ class DispositionSummary:
|
|
|
230
230
|
"three counts sum to `total`, so the negative set is published "
|
|
231
231
|
"rather than left to subtraction (P0-3)"
|
|
232
232
|
),
|
|
233
|
-
"unaffected_basis": UNAFFECTED_BASIS,
|
|
234
233
|
"blockers": [b.to_dict() for b in self.blockers],
|
|
235
234
|
}
|
|
235
|
+
# A basis is evidence for the published negative set, not boilerplate.
|
|
236
|
+
# When no route is excluded (or a blocker demotes that whole set), showing
|
|
237
|
+
# it reads like a certification the report did not earn.
|
|
238
|
+
if self.unaffected and not self.blockers:
|
|
239
|
+
out["unaffected_basis"] = UNAFFECTED_BASIS
|
|
240
|
+
return out
|
sourcecode/hibernate_strat.py
CHANGED
|
@@ -1108,7 +1108,14 @@ def analyze_hibernate(file_paths: list[str], root: Path) -> HibernateStratificat
|
|
|
1108
1108
|
# right (it is the Spring Boot default) and was wrong in the field case that
|
|
1109
1109
|
# billed 45.6 rewrite days to an EclipseLink repository.
|
|
1110
1110
|
hibernate_evidence = dep_present or any_hibernate_import
|
|
1111
|
-
|
|
1111
|
+
# Spring Boot defaults the JPA starter to Hibernate, but an explicit provider
|
|
1112
|
+
# declaration overrides that default. Treating both as evidence made an
|
|
1113
|
+
# EclipseLink project inherit a fictional Boot-2 Hibernate-5 rewrite axis.
|
|
1114
|
+
transitive_starter_evidence = (
|
|
1115
|
+
jpa_starter_present
|
|
1116
|
+
and not hibernate_evidence
|
|
1117
|
+
and not competing_providers
|
|
1118
|
+
)
|
|
1112
1119
|
inferred_from_jpa_only = any_jpa_import and not hibernate_evidence and not transitive_starter_evidence
|
|
1113
1120
|
# Another declared provider refutes the inference outright. It cannot refute
|
|
1114
1121
|
# direct evidence: a repository may legitimately carry both.
|
sourcecode/migrate_check.py
CHANGED
|
@@ -2322,6 +2322,27 @@ class MigrationReport:
|
|
|
2322
2322
|
|
|
2323
2323
|
def to_dict(self) -> dict:
|
|
2324
2324
|
_listed, _floor = self._listed_findings()
|
|
2325
|
+
_provider_non_coverage: list[dict] = []
|
|
2326
|
+
_hib_evidence = self.hibernate.evidence if self.hibernate is not None else {}
|
|
2327
|
+
_providers = _hib_evidence.get("competing_jpa_providers") or []
|
|
2328
|
+
if _providers and _hib_evidence.get("not_applicable_reason"):
|
|
2329
|
+
_provider_non_coverage.append({
|
|
2330
|
+
"id": "NC-MIGRATION-001",
|
|
2331
|
+
"surface": "migrate-check",
|
|
2332
|
+
"not_covered": (
|
|
2333
|
+
"Provider-specific migration work for declared JPA provider(s): "
|
|
2334
|
+
+ ", ".join(str(provider) for provider in _providers)
|
|
2335
|
+
),
|
|
2336
|
+
"why": (
|
|
2337
|
+
"The Hibernate 5→6 model is inapplicable when a competing "
|
|
2338
|
+
"provider is declared and no direct Hibernate evidence exists."
|
|
2339
|
+
),
|
|
2340
|
+
"instead": (
|
|
2341
|
+
"Use the provider's migration guide and its own compatibility "
|
|
2342
|
+
"tooling; ASK currently reports Jakarta and Spring migration "
|
|
2343
|
+
"evidence without estimating provider-specific rewrite effort."
|
|
2344
|
+
),
|
|
2345
|
+
})
|
|
2325
2346
|
d: dict = {
|
|
2326
2347
|
"schema_version": self.schema_version,
|
|
2327
2348
|
"generated_at": self.generated_at,
|
|
@@ -2365,6 +2386,7 @@ class MigrationReport:
|
|
|
2365
2386
|
"effort_breakdown": self.effort_breakdown,
|
|
2366
2387
|
"hygiene_findings": self.hygiene_findings,
|
|
2367
2388
|
"non_blocking": self.non_blocking,
|
|
2389
|
+
"non_coverage": {"items": _provider_non_coverage},
|
|
2368
2390
|
"spring_present": self.spring_present,
|
|
2369
2391
|
"spring_boot_present": self.spring_boot_present,
|
|
2370
2392
|
"spring_test_only": self.spring_test_only,
|
sourcecode/openrewrite_recipe.py
CHANGED
|
@@ -123,12 +123,29 @@ class RecipePlan:
|
|
|
123
123
|
|
|
124
124
|
def detect_build_tool(root: Path) -> str:
|
|
125
125
|
"""`maven` | `gradle` | `unknown`, from what the repository actually declares."""
|
|
126
|
+
import os
|
|
127
|
+
|
|
126
128
|
root = Path(root)
|
|
127
129
|
if (root / "pom.xml").is_file():
|
|
128
130
|
return "maven"
|
|
129
131
|
for name in ("build.gradle", "build.gradle.kts", "settings.gradle", "settings.gradle.kts"):
|
|
130
132
|
if (root / name).is_file():
|
|
131
133
|
return "gradle"
|
|
134
|
+
# A multi-module repository can declare its only build below the checkout
|
|
135
|
+
# root. The recipe remains rooted at the checkout, but its invocation must
|
|
136
|
+
# name the build system used by the analysed source module.
|
|
137
|
+
skip = {".git", ".gradle", "build", "target", "node_modules", "out", "dist"}
|
|
138
|
+
found_gradle = False
|
|
139
|
+
for _directory, directories, files in os.walk(root):
|
|
140
|
+
directories[:] = [name for name in directories if name not in skip]
|
|
141
|
+
if "pom.xml" in files:
|
|
142
|
+
return "maven"
|
|
143
|
+
if any(name in files for name in (
|
|
144
|
+
"build.gradle", "build.gradle.kts", "settings.gradle", "settings.gradle.kts"
|
|
145
|
+
)):
|
|
146
|
+
found_gradle = True
|
|
147
|
+
if found_gradle:
|
|
148
|
+
return "gradle"
|
|
132
149
|
return "unknown"
|
|
133
150
|
|
|
134
151
|
|
sourcecode/perf.py
CHANGED
|
@@ -1171,6 +1171,13 @@ CONTROL_DISPERSION_LIMIT = 1.15
|
|
|
1171
1171
|
#: up in it first.
|
|
1172
1172
|
CONTROL_COMMAND = "impact"
|
|
1173
1173
|
|
|
1174
|
+
# The control is a real invocation, not a command name. `impact` takes a target
|
|
1175
|
+
# before the repository path; omitting it timed an argument error rather than
|
|
1176
|
+
# the shared IR work that the protocol is meant to observe. This symbol is part
|
|
1177
|
+
# of the fixed Broadleaf corpus used by the field protocol.
|
|
1178
|
+
STEADY_CONTROL_REPOSITORY = "BroadleafCommerce"
|
|
1179
|
+
STEADY_CONTROL_POSITIONAL_ARGS: tuple[str, ...] = ("BasicPersistenceModule",)
|
|
1180
|
+
|
|
1174
1181
|
|
|
1175
1182
|
def dispersion(samples: "Sequence[float]") -> "float | None":
|
|
1176
1183
|
"""`max/min` over a sample. `None` when there is nothing to divide."""
|
sourcecode/selftest.py
CHANGED
|
@@ -146,48 +146,50 @@ def _check_ask09(subject: Subject) -> "dict[str, Any]":
|
|
|
146
146
|
}
|
|
147
147
|
document = payload if isinstance(payload, dict) else {}
|
|
148
148
|
body = _payload_of(document)
|
|
149
|
-
if code == 0:
|
|
150
|
-
return _result(
|
|
151
|
-
NOT_APPLICABLE,
|
|
152
|
-
"this repository's `endpoints` answer fits under the output ceiling, "
|
|
153
|
-
"so the guard this row is about never ran — a bigger repository is "
|
|
154
|
-
"needed to exercise it here",
|
|
155
|
-
**evidence,
|
|
156
|
-
)
|
|
157
149
|
# The output seam may wrap the command payload and keep the envelope error
|
|
158
150
|
# beside it. Read both shapes; dropping the envelope first turns a real
|
|
159
|
-
# OUTPUT_TOO_LARGE refusal into a false
|
|
151
|
+
# OUTPUT_TOO_LARGE refusal into a false N/A when an entry point reports an
|
|
152
|
+
# inconsistent process code.
|
|
160
153
|
error = document.get("error") or body.get("error")
|
|
161
154
|
error_body = error if isinstance(error, dict) else body
|
|
162
|
-
if error_body.get("code")
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
155
|
+
if error_body.get("code") == "OUTPUT_TOO_LARGE":
|
|
156
|
+
hint = str(error_body.get("hint") or "")
|
|
157
|
+
basis = document.get("hint_basis") or body.get("hint_basis") or {}
|
|
158
|
+
declared = list(basis.get("declared_flags") or [])
|
|
159
|
+
if "No smaller inline variant is available" in hint and declared:
|
|
160
|
+
return _result(
|
|
161
|
+
FAIL,
|
|
162
|
+
f"the refusal denies a smaller view while declaring {declared}",
|
|
163
|
+
hint=hint, hint_basis=basis, **evidence,
|
|
164
|
+
)
|
|
165
|
+
if not basis:
|
|
166
|
+
return _result(
|
|
167
|
+
FAIL,
|
|
168
|
+
"the refusal carries no `hint_basis`, so what the hint was derived "
|
|
169
|
+
"from cannot be read from one run — the observability half of the row",
|
|
170
|
+
hint=hint,
|
|
171
|
+
**evidence,
|
|
172
|
+
)
|
|
173
173
|
return _result(
|
|
174
|
-
|
|
175
|
-
f"the refusal
|
|
174
|
+
PASS,
|
|
175
|
+
f"the refusal derives its hint from {basis.get('derived_from')!r} "
|
|
176
|
+
f"(context_found={basis.get('context_found')}) and offers {declared}",
|
|
176
177
|
hint=hint, hint_basis=basis, **evidence,
|
|
177
178
|
)
|
|
178
|
-
if
|
|
179
|
+
if code == 0:
|
|
179
180
|
return _result(
|
|
180
|
-
|
|
181
|
-
"
|
|
182
|
-
"
|
|
183
|
-
|
|
181
|
+
NOT_APPLICABLE,
|
|
182
|
+
"this repository's `endpoints` answer fits under the output ceiling, "
|
|
183
|
+
"so the guard this row is about never ran — a bigger repository is "
|
|
184
|
+
"needed to exercise it here",
|
|
184
185
|
**evidence,
|
|
185
186
|
)
|
|
186
187
|
return _result(
|
|
187
|
-
|
|
188
|
-
f"the
|
|
189
|
-
f"(
|
|
190
|
-
|
|
188
|
+
NOT_APPLICABLE,
|
|
189
|
+
f"the probe exited {code} without OUTPUT_TOO_LARGE "
|
|
190
|
+
f"(observed code={error_body.get('code')!r}), so this run did not "
|
|
191
|
+
"exercise the output-ceiling refusal",
|
|
192
|
+
**evidence,
|
|
191
193
|
)
|
|
192
194
|
|
|
193
195
|
|
|
@@ -631,14 +631,19 @@ def _line_of(source: str, offset: int) -> int:
|
|
|
631
631
|
|
|
632
632
|
|
|
633
633
|
def _profile_evidence(root: Optional[Path], rel: str) -> tuple[Optional[str], Optional[bool]]:
|
|
634
|
-
"""Return static @Profile evidence without claiming runtime activation."""
|
|
634
|
+
"""Return live static @Profile evidence without claiming runtime activation."""
|
|
635
635
|
if root is None:
|
|
636
636
|
return None, None
|
|
637
637
|
try:
|
|
638
638
|
source = (Path(root) / rel).read_text(encoding="utf-8", errors="replace")
|
|
639
639
|
except OSError:
|
|
640
640
|
return None, None
|
|
641
|
-
|
|
641
|
+
# The security scanner already evaluates only live Java. This evidence layer
|
|
642
|
+
# must read the same lexical view: otherwise a Javadoc example can override
|
|
643
|
+
# the actual declaration and invert the profile verdict on SEC-009.
|
|
644
|
+
from sourcecode.source_text import blank_java_comments
|
|
645
|
+
|
|
646
|
+
match = re.search(r"@Profile\s*\((?P<expr>[^)]*)\)", blank_java_comments(source))
|
|
642
647
|
if match is None:
|
|
643
648
|
return None, True
|
|
644
649
|
expr = match.group("expr").strip()
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: sourcecode
|
|
3
|
-
Version: 5.8.
|
|
3
|
+
Version: 5.8.12
|
|
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
|
|
@@ -49,7 +49,7 @@ Description-Content-Type: text/markdown
|
|
|
49
49
|
|
|
50
50
|
**Context · Impact · Migration · Architecture · Review — everything from one structural model.**
|
|
51
51
|
|
|
52
|
-

|
|
53
53
|

|
|
54
54
|
|
|
55
55
|
Copyright (c) 2026 Dominique Haroun. All rights reserved. ASK Engine 5.7.0 and
|
|
@@ -102,10 +102,12 @@ intentional. Use `ask audit-report --from-risk risk.json` to package an existing
|
|
|
102
102
|
risk run instead of recomputing it.
|
|
103
103
|
|
|
104
104
|
**A budget is honoured, never a veto.** `ASK_MAX_ANALYSIS_SECONDS=<seconds>`
|
|
105
|
-
bounds
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
105
|
+
currently bounds the phase-runner commands `spring-audit`, `risk` and
|
|
106
|
+
`audit-report`; it is not a process-wide timeout for every command. A value below
|
|
107
|
+
the class floor prints what that class typically needs and **runs anyway** —
|
|
108
|
+
refusing to answer is the opposite of this product's doctrine. A run that spends
|
|
109
|
+
its budget stops on the loop that is spending the time, not only between phases:
|
|
110
|
+
a rule family cut in flight is
|
|
109
111
|
published as `rules_partially_run` with how far it reached, families that never
|
|
110
112
|
started are named in `rules_not_run`, `_partial` names the phases that completed
|
|
111
113
|
and the ones that did not, and the findings measured before the cut are kept.
|
|
@@ -113,7 +115,17 @@ The answer marks itself where the numbers are — `summary.partial`,
|
|
|
113
115
|
`counts_are_floor`, `counts_basis` — and `confidence_level` is capped at `low`,
|
|
114
116
|
because the confidence of the findings that exist says nothing about the family
|
|
115
117
|
that did not run. Measured on BroadleafCommerce (2 766 Java files): a 4.5s budget
|
|
116
|
-
stops at 1 408 files and ends at 5.1s.
|
|
118
|
+
stops at 1 408 files and ends at 5.1s. Commands outside that phase-runner set
|
|
119
|
+
must not be gated on this variable; their budget applicability remains visible in
|
|
120
|
+
the [defect ledger](docs/DEFECT-LEDGER.md).
|
|
121
|
+
|
|
122
|
+
**Current performance status.** In 5.8.12, `validation` reuses the shared
|
|
123
|
+
Canonical IR and `data-exposure` reuses one semantic model across all declared
|
|
124
|
+
label seeds. On the local BroadleafCommerce corpus, the final fingerprint filled
|
|
125
|
+
the shared CIR in 10.46s and a warm `validation --compact` run took 4.01s with
|
|
126
|
+
byte-identical output. This is a same-host cache observation, not a replacement
|
|
127
|
+
for the controlled `saint-server` cross-version comparison still tracked in the
|
|
128
|
+
[roadmap](docs/DEVELOPMENT-ROADMAP.md).
|
|
117
129
|
|
|
118
130
|
**What a warm actually covers.** `ask cache warm` runs the compact analysis: it rebuilds the
|
|
119
131
|
shared structural layers (L1/L2 + the Repository Intelligence Snapshot + the shared Canonical
|
|
@@ -139,7 +151,7 @@ brew tap haroundominique/sourcecode && brew install sourcecode
|
|
|
139
151
|
# pip / pipx
|
|
140
152
|
pipx install sourcecode # or: pip install sourcecode
|
|
141
153
|
|
|
142
|
-
ask version # ask 5.8.
|
|
154
|
+
ask version # ask 5.8.12 — and, on a build that has aged,
|
|
143
155
|
# how many releases have probably shipped since
|
|
144
156
|
```
|
|
145
157
|
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
sourcecode/__init__.py,sha256=
|
|
1
|
+
sourcecode/__init__.py,sha256=Q8fdci0rXXKy6QVw6aRGJjGkWAMdn3wJ1bKYNOpngK4,309
|
|
2
2
|
sourcecode/adaptive_scanner.py,sha256=yJBKjNpkY6bpueYJ2YnRezen3sYZDecEt7WaaNWdqug,9466
|
|
3
3
|
sourcecode/answer_bounds.py,sha256=_51_DCuYEUmI_xwUFxDMiprSavkNakkLiIBbPjevQ3M,9793
|
|
4
4
|
sourcecode/archetype.py,sha256=uubguXP5ltQt25ACNVm9kX4KRTe7JCqkFfg4H9zckCo,40971
|
|
@@ -8,7 +8,7 @@ sourcecode/architecture_analyzer.py,sha256=GFc4ek-s1IHWM7pl-0L32WahZ93AmDgrAMcOu
|
|
|
8
8
|
sourcecode/architecture_summary.py,sha256=BVVRHd952cjRhjHnR6CPrvKgaa-tdM16l-pBi1yDCPs,32395
|
|
9
9
|
sourcecode/ast_extractor.py,sha256=aXJjZ7XjAdxa99hWNm4SyzPqx4gNWiTbUYjNWGNl-Vc,51213
|
|
10
10
|
sourcecode/audit_clusters.py,sha256=9uqUh8x2qlsqD0eiXdtu7RQEtFBCiC254xustlCcK40,12769
|
|
11
|
-
sourcecode/audit_recipe.py,sha256=
|
|
11
|
+
sourcecode/audit_recipe.py,sha256=bpFqKuf84SSZAjtTnfFsLUz_20SXx-B_ggppdXedNwY,12817
|
|
12
12
|
sourcecode/audit_report.py,sha256=ZPzFAcSyGBmHY2nVWCdEqPV0MIRKFI5Kl4ehLJsZOas,10740
|
|
13
13
|
sourcecode/audit_since.py,sha256=bkl2tUuYcmS0epvKR9SltXMYx7RSoWedJL0zDGe8xGI,9601
|
|
14
14
|
sourcecode/baseline_autocapture.py,sha256=i6wQLlmET-njeiZOKNk35x0sdlnWUIbnn4n7_MtCi4g,19980
|
|
@@ -16,7 +16,7 @@ sourcecode/breaking_changes.py,sha256=Ouof18CtVf9as9VA9n9vo9jm0WlZLMSO3Hdcc-H-c5
|
|
|
16
16
|
sourcecode/build_modules.py,sha256=rsT8reXoeOGztX28SNwem3yGdBhAC5VJx9RL2vRp_d0,15935
|
|
17
17
|
sourcecode/bundled_docs.py,sha256=hvQeUNDo9SEp_Mtf6o9bexKUmJ8YW76rXKn9spRfQQs,2581
|
|
18
18
|
sourcecode/cache.py,sha256=fozQb7ohE8TwwOhEcxA0lwsmvIuZNW7jxAeiget50z4,43471
|
|
19
|
-
sourcecode/cache_model.py,sha256=
|
|
19
|
+
sourcecode/cache_model.py,sha256=Fvz3f8PBY6Hu9YXBHcICKtyQJejoKbjkwbYDkd2QrH8,60179
|
|
20
20
|
sourcecode/call_surface.py,sha256=fiqYfHooxN1fX9oQoysq1LS3LoZcobhyUNjAGEZKpwk,4148
|
|
21
21
|
sourcecode/caller_metrics.py,sha256=--sFGDnIog_YGu9xZHMcB91F5xZakfaAKvy15xU54hg,7904
|
|
22
22
|
sourcecode/caller_reach.py,sha256=M7Ffs5CtlimihfdSy3HtC4WpDP97bRFX15QYOlOfMJw,16626
|
|
@@ -25,7 +25,7 @@ sourcecode/chain_rules.py,sha256=Bi6UHfgd-GxWswmnHRcPz5jdbAuqka3Zkz_P-MTvqhw,127
|
|
|
25
25
|
sourcecode/change_plan.py,sha256=wJ896V27a3qb-2vcZhrcOSOqFAwCmEyzbhdbdxM2LlQ,12504
|
|
26
26
|
sourcecode/cir_graphs.py,sha256=RytqSv1WF8kdlfXj2fPQz16LY4akS2kyThbdWL8beCQ,14835
|
|
27
27
|
sourcecode/classifier.py,sha256=JBzPwSSrDG-tUHAbcKB678HRbjLpD-ohzbzzO62mgpo,20114
|
|
28
|
-
sourcecode/cli.py,sha256=
|
|
28
|
+
sourcecode/cli.py,sha256=BPjurFlS8pfrQ7fiYUMZM6JGma79pdn6-q9-A-JMlHo,726997
|
|
29
29
|
sourcecode/client_calls.py,sha256=YOPnfRZzRyqmdHvXSVeiunW8cuiuCuWXacNIQRgKMCw,22640
|
|
30
30
|
sourcecode/code_notes_analyzer.py,sha256=EJemNCNc9Dn-1RZYu-aNbK0ELzmsyC4s6FdHi3XyNEI,9392
|
|
31
31
|
sourcecode/compare.py,sha256=Lj8epBqrHLWBhiccE2X0ZbaP2H3hNb7qecoN9Jvsj7c,14794
|
|
@@ -42,7 +42,7 @@ sourcecode/contract_init.py,sha256=bXRCqWM9tvrDLeT8j7ea6IWf87jB4VJxnlSzGBsRRXo,1
|
|
|
42
42
|
sourcecode/contract_model.py,sha256=nRxJKPMs1VHwFTa8AVXhGmaLjti3Lr2sjHDpWgv1bfE,3917
|
|
43
43
|
sourcecode/contract_pipeline.py,sha256=4XE-xhab7ysdExXyUOBl2hAH4MABo7moKnT9V4XcEwQ,30243
|
|
44
44
|
sourcecode/coverage_parser.py,sha256=X9scuUWxacahYTrTBGea2Ku-sf-WCVcnc9OEB35_3IU,19340
|
|
45
|
-
sourcecode/data_exposure.py,sha256=
|
|
45
|
+
sourcecode/data_exposure.py,sha256=1bcylZRC5vWO-C5jvUqECdS5rRTfiuQU9XHudvKDq-E,19009
|
|
46
46
|
sourcecode/data_labels.py,sha256=c_hmgudTE68cVRdywfbfonr7nUWIL-JH2HOXB8Pplv0,8453
|
|
47
47
|
sourcecode/declarations.py,sha256=Jr7oJDg004sFw0TvJySNVggXFT2jB6hQgbeQK2qreVo,7000
|
|
48
48
|
sourcecode/defect_identity.py,sha256=XS2VFDImg9NLaRImybKTeyk-CoDSsXmchldg0dwvM7c,7028
|
|
@@ -53,7 +53,7 @@ sourcecode/detach.py,sha256=PvkCcbIuTaDKKt5TGqtQLahmsmCkflui33jLnMEWkvg,8006
|
|
|
53
53
|
sourcecode/doc_analyzer.py,sha256=05bjTUbDbmnbajD_cgRnACzS8T7xxBKVX4CjkJlhZg8,24411
|
|
54
54
|
sourcecode/dynamic_argument_surface.py,sha256=u6zJoY-zChYVw1-SrgiyAq-rUwqMZ5ZqBwLfbPJ_8ng,2960
|
|
55
55
|
sourcecode/empty_reach.py,sha256=evKK2DyHbjqe_Wimq4-HfgD40Fdk-j6WiZwQaVXQ5t4,15671
|
|
56
|
-
sourcecode/endpoint_disposition.py,sha256=
|
|
56
|
+
sourcecode/endpoint_disposition.py,sha256=WXNoHIjQW2uORG54zUygi8LUJKWj6E_y8q9rps2rWoU,9595
|
|
57
57
|
sourcecode/endpoint_literals.py,sha256=Qf4gTZzvNSFDGDuOvF0YRL9NvaYKKj24klhR5LIOaXc,3263
|
|
58
58
|
sourcecode/endpoint_metrics.py,sha256=sLSLUIgiIyvNdOynaxVgHd9SjRF_DbN3QxevaquykaU,2840
|
|
59
59
|
sourcecode/entrypoint_classifier.py,sha256=jhTYlyqDJH2AtdEcLVaRU3lYRTJuF8DkxVzl4-W3zWE,5322
|
|
@@ -77,7 +77,7 @@ sourcecode/git_analyzer.py,sha256=irvEwddbd5_tbA_eYUZebf4mH7_nFhpjwaWAV1f7jUY,15
|
|
|
77
77
|
sourcecode/git_checkout.py,sha256=gCnkMwHpU6yLyc10FoGzE8W9-tI8KyYxKTgpbWPjayo,6009
|
|
78
78
|
sourcecode/graph_analyzer.py,sha256=lp0eB1PWC20BYF-GpPhAyegRpKrUKgOmXZIcZSIX_Ks,65777
|
|
79
79
|
sourcecode/graph_evidence.py,sha256=rENNsYRZeNstX_ExNCLlbHJAruFQwxo5d00x6wO3xwI,15030
|
|
80
|
-
sourcecode/hibernate_strat.py,sha256=
|
|
80
|
+
sourcecode/hibernate_strat.py,sha256=kLAa5GMwYFZgOI7edl-nDcJTr4SFVYAoxtMy-fj2BsA,77954
|
|
81
81
|
sourcecode/identity_fallback.py,sha256=uRC_j_80uaI4Ue4tf-OhKX4h472dmufYcjEFGSxY2jk,9190
|
|
82
82
|
sourcecode/integration_coordinates.py,sha256=rvuApnS7WdRUbeQLg_oKj-Gi0koO2RKdw6HenXNgrDo,12443
|
|
83
83
|
sourcecode/jdk_exports.py,sha256=fCrlwNAXUT9gge_joq6kMnY3zJxYB2pxqy-0w3o3MJI,874
|
|
@@ -85,11 +85,11 @@ sourcecode/license.py,sha256=vvgE1vBUWh8ozWI7USYuteh6noxntnjuzDQIPF-l4rA,27795
|
|
|
85
85
|
sourcecode/manifest_cache.py,sha256=HR0wPIFA5odNGzHrMHS_H2GdveU6ZnyBeoGThB0BLoY,2200
|
|
86
86
|
sourcecode/mcp_nudge.py,sha256=lKemOqK_wny2u7Ymcr2Idi5Kx8pXY02jCi-_nJYLGMg,2992
|
|
87
87
|
sourcecode/metrics_analyzer.py,sha256=gLoRWKygF18jLgwsqmGXSWopw-f5iO1VbM7Jjdif6ag,22809
|
|
88
|
-
sourcecode/migrate_check.py,sha256=
|
|
88
|
+
sourcecode/migrate_check.py,sha256=oJmLOWhdl02g_TvwxsycPDnLKGayZ8upmiOX6Bk9IHw,153902
|
|
89
89
|
sourcecode/migration_blast.py,sha256=OPryWkM6-PbvcG3eJFdcWUnlpXBje41nu2BkrZnE2hg,9359
|
|
90
90
|
sourcecode/non_coverage.py,sha256=I8ofuFpMqii6Kcrx4A7Dl6Vfltu3-uqlVzh7Fn3-F6s,25281
|
|
91
91
|
sourcecode/openapi_surface.py,sha256=BTt0K-woZbkbWTN77IkqeBm_Okag9owR0848fmot8sk,16207
|
|
92
|
-
sourcecode/openrewrite_recipe.py,sha256=
|
|
92
|
+
sourcecode/openrewrite_recipe.py,sha256=0pS-61falE6rSfkos2MPnmoDamvoeTT-8Kmj7smj_DI,12987
|
|
93
93
|
sourcecode/output_bounds.py,sha256=OtT7_g8ofuWkXRWlEeUSxx9X-CLMckXAbLCzzyG30so,7694
|
|
94
94
|
sourcecode/output_budget.py,sha256=GxoFnbwk0dvqScgmMRPZHj7m-zRIoHLwUKplrH0u89s,13872
|
|
95
95
|
sourcecode/output_ceiling.py,sha256=DZt9BtlMLuCLCwMdnLvFi8qEME2AKhDVuKZR5Ws1bMI,21003
|
|
@@ -100,7 +100,7 @@ sourcecode/parse_cache.py,sha256=cVYF2ZSC9F5RCRp4UBuAyMG_u_Tm0ZG78gBzMrER1Sg,367
|
|
|
100
100
|
sourcecode/partial_contract.py,sha256=x_N_0bF3mpNNjXd7JFB1zr6LSIroo2zN5GCz14GXvXQ,3510
|
|
101
101
|
sourcecode/path_admission.py,sha256=OGNSoluhVh8YYOBZBnACUrkmH4Tp_yxjGLifkcsxQpo,5838
|
|
102
102
|
sourcecode/path_filters.py,sha256=y2SmiExrKQMn-FUGgSelqo5Gr0SimDSQBwwnqtMcy3U,12491
|
|
103
|
-
sourcecode/perf.py,sha256=
|
|
103
|
+
sourcecode/perf.py,sha256=xooForXgzeOrL5KErEM9L0CezkmpdHYjMs1edRE8NnM,60871
|
|
104
104
|
sourcecode/phased_run.py,sha256=fZxxiCX-CykagFVR_Fp2Tin3H6FDSV8YRpYGtsRAXj8,18356
|
|
105
105
|
sourcecode/pipe_contract.py,sha256=PML0Er5d8uDyec4OrdUXuyqHbGPUYndjeaKUjkFz2u4,8369
|
|
106
106
|
sourcecode/posture.py,sha256=m1sYDLtGvVkvDEVqMxuDvAKz4-KPj0z5Q6x3V_5U-FM,83276
|
|
@@ -140,7 +140,7 @@ sourcecode/security_chain.py,sha256=1YZVeFLwy65kntMBhMNvz1cUpOoKCmvEqYICgxs66Gw,
|
|
|
140
140
|
sourcecode/security_config.py,sha256=LUppRDYQK0oKM4qdEOLObaeU3frFTS-paEZo7dMgtY8,5467
|
|
141
141
|
sourcecode/security_config_scan.py,sha256=Wv7QqEx_KbgmhbOGuX7RQfotzkkif43PFU1LohKNWCM,33818
|
|
142
142
|
sourcecode/security_posture.py,sha256=wj6WwvasIh6r-minwBz3oz1T9Zl8SPsPhn7zxDD-yng,55861
|
|
143
|
-
sourcecode/selftest.py,sha256=
|
|
143
|
+
sourcecode/selftest.py,sha256=z9SHFKXr1gi_zVxpTjYKaH-1Fk-J5gK6DL0-jgtoMbU,19300
|
|
144
144
|
sourcecode/semantic_analyzer.py,sha256=xGwQvhU9xeOlZ4N-TPXFZT8HBHx4Rg0nPwu8nDFl00Y,95621
|
|
145
145
|
sourcecode/semantic_impact_engine.py,sha256=t09IirGC3JjQDy33JZd1_WKzQVKXkoNl3-XEUr5kjis,20563
|
|
146
146
|
sourcecode/semantic_integration_engine.py,sha256=ZjyKJKOj-adScWlYBuWx8Ee_P0F4_OImUJVnCYgopuU,20952
|
|
@@ -154,7 +154,7 @@ sourcecode/spring_impact.py,sha256=yngLmb3ABL9_6b59xSuU6sn2bAJj1MVCGy9dsjgNaic,8
|
|
|
154
154
|
sourcecode/spring_model.py,sha256=7GqgcWnHC96ixusRJmD-9tDV93qTdkMh-8e7CBNK0pc,24126
|
|
155
155
|
sourcecode/spring_profiles.py,sha256=-kwrCK0O-MRjrCp6SA1d31t--o4Tg87iqPVrTwxoIUs,19605
|
|
156
156
|
sourcecode/spring_properties.py,sha256=kPTk5qAJxdbHc1hclhHAP0O-hCIzBn8PTh3lzl-I4a4,8400
|
|
157
|
-
sourcecode/spring_security_audit.py,sha256=
|
|
157
|
+
sourcecode/spring_security_audit.py,sha256=_5WBaSOfRh52O7jP4LHK2MxnP2Wpd4D6aNAjd7gl-eg,69992
|
|
158
158
|
sourcecode/spring_semantic.py,sha256=UrmLg_4gmBVmMqvSnUMgSReVEERVGv3X7LYDBEs6k_o,16598
|
|
159
159
|
sourcecode/spring_tx_analyzer.py,sha256=WBibPgkjQm33kFgERx6zLtp87FpJNE5V_4JI3xZ5zD4,50094
|
|
160
160
|
sourcecode/sql_taint.py,sha256=As1DbEdjXMBFjCTXU5ojksOzuKkP6LmnuMVnzzmckzc,26998
|
|
@@ -240,13 +240,13 @@ sourcecode/telemetry/consent.py,sha256=pQdl-QeLl6Gcibn0eWHSKZrm-HYSsjpVqOnjrgFp8
|
|
|
240
240
|
sourcecode/telemetry/events.py,sha256=4_yeO58U-Cwc1Qb27VB0_EjhmroY0k91n3_VGxeALB8,2776
|
|
241
241
|
sourcecode/telemetry/filters.py,sha256=RzxauTz8HliO4BllQnXEXc7zTeqdCZi5MgqGEDuW7OQ,6570
|
|
242
242
|
sourcecode/telemetry/transport.py,sha256=4gGHsq0WeY9VywEZXA3vUxykfiYnw9uuqfjAAec7F8o,1681
|
|
243
|
-
sourcecode/_docs/DEFECT-LEDGER.md,sha256=
|
|
243
|
+
sourcecode/_docs/DEFECT-LEDGER.md,sha256=eD0lIU59OtcDZow3n6TDuXeO3TWEzG3YeGi7qox65i8,742831
|
|
244
244
|
sourcecode/_docs/LICENSE,sha256=23-fk61oSWGVmkWyka-FIM0rhAPM2hcYHnsaridL8Uo,1859
|
|
245
245
|
sourcecode/_docs/NOTICE,sha256=Br-AA8Y3iJo1WXa5uP8QBpzqI5nDu3iGLbFyvDt3BOs,321
|
|
246
|
-
sourcecode/_docs/USER_GUIDE.md,sha256=
|
|
247
|
-
sourcecode-5.8.
|
|
248
|
-
sourcecode-5.8.
|
|
249
|
-
sourcecode-5.8.
|
|
250
|
-
sourcecode-5.8.
|
|
251
|
-
sourcecode-5.8.
|
|
252
|
-
sourcecode-5.8.
|
|
246
|
+
sourcecode/_docs/USER_GUIDE.md,sha256=u6BDmr3Kv9l10u5X7xpkP8fYf-aA-BreovysiPFaYTA,87104
|
|
247
|
+
sourcecode-5.8.12.dist-info/METADATA,sha256=QHhr0IK_Y1Nj9KJrieY-vs-xH60_Qr-dhDE-wHi4pt0,51594
|
|
248
|
+
sourcecode-5.8.12.dist-info/WHEEL,sha256=QccIxa26bgl1E6uMy58deGWi-0aeIkkangHcxk2kWfw,87
|
|
249
|
+
sourcecode-5.8.12.dist-info/entry_points.txt,sha256=-JEAdChrK5We51kZcb7OaDcyil-dHBjBPL-NhuO-QY8,89
|
|
250
|
+
sourcecode-5.8.12.dist-info/licenses/LICENSE,sha256=23-fk61oSWGVmkWyka-FIM0rhAPM2hcYHnsaridL8Uo,1859
|
|
251
|
+
sourcecode-5.8.12.dist-info/licenses/NOTICE,sha256=Br-AA8Y3iJo1WXa5uP8QBpzqI5nDu3iGLbFyvDt3BOs,321
|
|
252
|
+
sourcecode-5.8.12.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|