sourcecode 5.8.8__py3-none-any.whl → 5.8.9__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of sourcecode might be problematic. Click here for more details.

sourcecode/__init__.py CHANGED
@@ -4,4 +4,4 @@ ASK Engine is the product. ``ask`` is the canonical CLI command; ``sourcecode``
4
4
  the legacy compatibility alias and the Python/PyPI package name. See
5
5
  docs/PRODUCT_IDENTITY.md (normative)."""
6
6
 
7
- __version__ = "5.8.8"
7
+ __version__ = "5.8.9"
@@ -16,8 +16,8 @@ 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, HEAD `f39432b`:** the latest audit queue was implemented in fourteen
20
- post-5.8.7 commits. These are committed follow-up fixes, not a tagged release. This table is
19
+ **As of 2026-08-19, the `5.8.9` release commit:** the latest audit queue was implemented in
20
+ committed post-5.8.7 fixes. This table is
21
21
  the authoritative status for round 11; detailed rows retain their original findings and
22
22
  acceptance criteria for auditability.
23
23
 
@@ -38,6 +38,43 @@ acceptance criteria for auditability.
38
38
  | `C3-55` | **closed** | `63249df`; below-floor analysis budgets warn in noninteractive runs while execution continues |
39
39
  | `C3-55` regression | **closed** | `f39432b`; above-floor provenance remains quiet off-TTY and is emitted interactively |
40
40
 
41
+ ## Current Audit Intake: 5.8.8
42
+
43
+ The external audit of `ask 5.8.8` against `saint-server` (`HEAD 3dde0376`, 3,342 Java
44
+ files, Windows 11/Git Bash, `ASK_READONLY=1`) scored **75/100** and exercised **53/61
45
+ invocables (87%)**. The repository stayed byte-identical. These findings are new relative
46
+ to the closed round-11 queue and are not marked closed until reproduced and covered here.
47
+
48
+ | ID | Severity | Defect | Initial status |
49
+ |---|---|---|---|
50
+ | `AUD-588-B01` | Critical | `risk` can exit 0 with empty stdout and fail to create `-o`; long runs also vary widely. | **open — reproduce first; require parseable output or typed non-zero error** |
51
+ | `AUD-588-B02` | High | `migrate-check` includes an inapplicable Hibernate axis and publishes ghost effort for an EclipseLink repository. | **open — fix applicability/aggregate; add fixture** |
52
+ | `AUD-588-B03` | High | `spring-audit` lacks an active `permitAll` rule and does not expose security-bean profile activation state. | **open — reuse posture access/profile projection** |
53
+ | `AUD-588-B04` | High | `explain-endpoint` and `data-exposure` discard a derived `permit_all` chain decision and emit `coverage_unknown`. | **open — make verdict consume the chain authority** |
54
+ | `AUD-588-B05` | High | `pr-impact.endpoint_disposition` marks all endpoints unaffected despite container-wired security changes. | **open — propagate to `unknown` or publish a disposition caveat** |
55
+ | `AUD-588-B06` | Medium | `migrate-check` is the only audited command without `non_coverage`, hiding the EclipseLink gap. | **open — disclosure before product expansion** |
56
+ | `AUD-588-B07` | Medium | ASK-09 selftest failure is not reproducible and the row omits its probe command and observed excerpt. | **open — publish probe provenance and assert error code first** |
57
+ | `AUD-588-B08` | Medium | Output-too-large hints recommend a rejected subcommand flag and omit the independent byte budget. | **open — derive flags and disclose both budgets** |
58
+ | `AUD-588-B09` | Medium | `rename-class` reuses `-f` for `--from`, conflicting with the CLI-wide format alias and allowing silent overwrite. | **open — remove collision or reject duplicate destinations** |
59
+ | `AUD-588-B10` | Medium | `baseline diff` lacks `--dir`, breaking the external read-only capture/trend/diff flow. | **open — restore flag parity with regression coverage** |
60
+ | `AUD-588-B11` | Medium | Seven cross-command contract inconsistencies mix naming, units, container-wired warnings, build discovery, populations and tier claims. | **open — solve through shared fact/units authorities** |
61
+ | `AUD-588-B12` | Low/Medium | Cost model is stale by up to 1.74x at warm cache and long commands can be silent until timeout. | **open — remeasure 5.8.8 and add default foreground progress** |
62
+
63
+ ### Recommended Features From This Audit
64
+
65
+ | ID | Recommendation | Classification |
66
+ |---|---|---|
67
+ | `AUD-588-F01` | Explicit EclipseLink/JPA-provider migration axis, including namespace and coordinate changes. | **Deferred**; `non_coverage` is the honest current contract. |
68
+ | `AUD-588-F02` | Shared answer-contract layer for units, populations, caveats and container-wired reach. | **Covered** by existing authorities and parity tests. |
69
+ | `AUD-588-F03` | Versioned cost-model calibration by repository size and cache state. | **Covered** by `perf-baseline-v1` and cache/scale metadata. |
70
+ | `AUD-588-F04` | Default progress/heartbeat for long foreground commands without contaminating machine-readable stdout. | **Covered as explicit opt-in** through `--progress`/`ASK_PROGRESS`. |
71
+ | `AUD-588-F05` | Controlled audit-coverage expansion from 87% to 90% via safe `auth logout`, reversible `telemetry disable` and dirty-tree `verify-edit` checks. | **Verified** in controlled regression coverage; verification scope. |
72
+
73
+ **Recommended fix order:** `B01`, `B02`, `B04`, `B03`, `B05/B11`, `B08/B09`, `B07`,
74
+ then `B06/B10/B12`. The dirty-tree `verify-edit` path remains unverified, not confirmed
75
+ broken; the audit's positive results for inheritance, profile posture, caps, non-coverage,
76
+ read-only flows and typed errors are regression anchors for this queue.
77
+
41
78
  The current full-suite exceptions are environmental or pre-existing measurement gaps,
42
79
  not silently accepted fixes: RIS tests cannot write the default `~/.sourcecode/cache`
43
80
  under the managed sandbox; `cold-start` therefore reports `no_ris`. The E-6 module-name
@@ -136,7 +136,7 @@ pipx install sourcecode # isolated install, no venv needed
136
136
 
137
137
  # Verify
138
138
  ask version
139
- # ask 5.8.8
139
+ # ask 5.8.9
140
140
  ```
141
141
 
142
142
  Requires Python 3.9+.
sourcecode/cli.py CHANGED
@@ -2860,15 +2860,10 @@ COMMANDS_WITHOUT_FORMAT: "frozenset[str]" = frozenset({
2860
2860
  "version", # a version string
2861
2861
  })
2862
2862
 
2863
- #: `--format` binds `-f` everywhere except here — the `COMMANDS_WITHOUT_COPY_
2864
- #: SHORTHAND` precedent, for the same reason. `rename-class` bound `-f` to
2865
- #: `--from` before this rule existed, and `ask rename-class . -f OldName` is a
2866
- #: documented invocation: rebinding it would silently give the reader a format
2867
- #: parser for a class name. The long `--format` works; the short form moves at
2868
- #: the next major.
2869
- COMMANDS_WITHOUT_FORMAT_SHORTHAND: "frozenset[str]" = frozenset({
2870
- "rename-class",
2871
- })
2863
+ #: Every payload command uses the same `--format/-f` spelling. A previous
2864
+ #: exception let `rename-class -f` overwrite `--from` silently; removing that
2865
+ #: alias is safer than making one short flag mean two unrelated facts.
2866
+ COMMANDS_WITHOUT_FORMAT_SHORTHAND: "frozenset[str]" = frozenset()
2872
2867
 
2873
2868
 
2874
2869
  #: The one help string for `--progress`, for the same reason as COPY_OPTION_HELP.
@@ -8722,6 +8717,10 @@ def baseline_diff_cmd(
8722
8717
  Path("."),
8723
8718
  help="Repository root to diff against the stored baseline (default: cwd).",
8724
8719
  ),
8720
+ history_dir: Optional[Path] = typer.Option(
8721
+ None, "--dir", "--history-dir",
8722
+ help="Directory containing stored architectural-baseline-v1 artifacts.",
8723
+ ),
8725
8724
  baseline_file: Optional[Path] = typer.Option(
8726
8725
  None, "--baseline", "-b",
8727
8726
  help="Path to a stored architectural-baseline-v1 JSON artifact. Omit it to "
@@ -8767,7 +8766,7 @@ def baseline_diff_cmd(
8767
8766
  if baseline_file is None:
8768
8767
  from sourcecode.architectural_baseline import latest_baseline_path
8769
8768
 
8770
- history = _resolve_history_dir(target_dir)
8769
+ history = _resolve_history_dir((history_dir or target_dir).resolve())
8771
8770
  latest = latest_baseline_path(history)
8772
8771
  if latest is None:
8773
8772
  _emit_error_json(
@@ -13330,7 +13329,7 @@ def rename_class_cmd(
13330
13329
  help="Repository root to operate on (default: current directory)",
13331
13330
  ),
13332
13331
  old_name: str = typer.Option(
13333
- ..., "--from", "-f",
13332
+ ..., "--from",
13334
13333
  help="Current class name (PascalCase, e.g. ServiceA)",
13335
13334
  ),
13336
13335
  new_name: str = typer.Option(
@@ -13350,10 +13349,7 @@ def rename_class_cmd(
13350
13349
  help="Write change audit JSON to a file instead of stdout.",
13351
13350
  ),
13352
13351
  copy: bool = _copy_option(),
13353
- # `-f` is `--from` on this command and has been since before `--format`
13354
- # existed: rebinding it would hand a class name to a format parser.
13355
- # On the record in cli.COMMANDS_WITHOUT_FORMAT_SHORTHAND (C3-59).
13356
- format: str = _format_option(help="Output format: json (default) or yaml.", shorthand=False),
13352
+ format: str = _format_option(help="Output format: json (default) or yaml."),
13357
13353
  progress_mode: Optional[str] = _progress_option(),
13358
13354
  ) -> None:
13359
13355
  """Rename a Java class throughout the repository.
@@ -232,12 +232,13 @@ def build_data_exposure(
232
232
  from sourcecode.security_posture import endpoint_security_surface
233
233
  from sourcecode.spring_impact import run_impact_chain
234
234
 
235
- surface = endpoint_security_surface(cir, root=root)
236
235
  profile_access: dict[str, str] = {}
237
- if profiles:
238
- from sourcecode.posture import endpoint_access_under
236
+ from sourcecode.posture import endpoint_access_under
239
237
 
240
- profile_access = endpoint_access_under(root, set(profiles), cir=cir)
238
+ profile_access = endpoint_access_under(root, set(profiles or ()), cir=cir)
239
+ surface = endpoint_security_surface(
240
+ cir, root=root, access_decisions=profile_access,
241
+ )
241
242
 
242
243
  handlers = {
243
244
  str(getattr(e, "handler_symbol", "") or (e.get("handler_symbol") if isinstance(e, dict) else "")): e
@@ -368,6 +368,10 @@ def _verdict_step(endpoint: Any, surface: "dict[str, dict]") -> "dict[str, Any]"
368
368
  verdict=answer.get("verdict"),
369
369
  confidence=answer.get("confidence"),
370
370
  declared_policy=answer.get("declared_policy"),
371
+ **(
372
+ {"chain_decision": answer["chain_decision"]}
373
+ if answer.get("chain_decision") is not None else {}
374
+ ),
371
375
  note=(
372
376
  "this is the coverage answer; `declared_policy` beside it is the "
373
377
  "annotation vocabulary, which is evidence and not a verdict"
@@ -439,7 +443,9 @@ def explain_endpoint(
439
443
  access_block, access = {"chains": {}, "_error": str(exc)}, {}
440
444
  evidence = dict(access_block.get("evidence") or {})
441
445
  try:
442
- surface = endpoint_security_surface(cir, root=root)
446
+ surface = endpoint_security_surface(
447
+ cir, root=root, access_decisions=access,
448
+ )
443
449
  except Exception:
444
450
  surface = {}
445
451
 
@@ -408,9 +408,7 @@ def ways_out(
408
408
  if destination != "file":
409
409
  # The env var is the bypass for *this* ceiling; the MB guard on a file is
410
410
  # a different one and is not moved by it, so it is not offered there.
411
- out.append(
412
- f"{ENV_CEILING}=0 (or --max-output-tokens 0) to print it anyway"
413
- )
411
+ out.append(f"{ENV_CEILING}=0 to print it anyway")
414
412
  return out
415
413
 
416
414
 
@@ -480,6 +478,7 @@ def exceeds(content: str, *, to_file: bool) -> "Optional[dict[str, Any]]":
480
478
  if tokens <= limit:
481
479
  return None
482
480
  basis = resolve()
481
+ output_bytes = len(content.encode("utf-8"))
483
482
  return {
484
483
  "code": ERROR_CODE,
485
484
  "message": (
@@ -489,6 +488,12 @@ def exceeds(content: str, *, to_file: bool) -> "Optional[dict[str, Any]]":
489
488
  "hint": build_hint(basis=basis),
490
489
  "expected": f"Output under {limit // 1000}K estimated tokens.",
491
490
  "estimated_tokens": tokens,
491
+ "estimated_bytes": output_bytes,
492
+ "stdout_byte_budget": None,
493
+ "stdout_byte_budget_basis": (
494
+ "No independent byte trimming budget; estimated_tokens is derived "
495
+ f"from UTF-8 bytes / {BYTES_PER_TOKEN}."
496
+ ),
492
497
  "ceiling_tokens": limit,
493
498
  "estimate_basis": (
494
499
  f"UTF-8 bytes ÷ {BYTES_PER_TOKEN}, an ordering estimate for JSON — "
@@ -672,6 +672,7 @@ def endpoint_security_surface(
672
672
  *,
673
673
  root: Optional[Path] = None,
674
674
  posture: Optional[Any] = None,
675
+ access_decisions: "Optional[dict[str, str]]" = None,
675
676
  ) -> dict[str, dict]:
676
677
  """THE per-endpoint security answer, keyed by ``endpoint_id`` (ADR-0008 R1).
677
678
 
@@ -711,11 +712,24 @@ def endpoint_security_surface(
711
712
  ep_id = v.get("endpoint_id") or ""
712
713
  if not ep_id:
713
714
  continue
715
+ verdict = v.get("verdict") or "coverage_unknown"
716
+ confidence = v.get("confidence") or Confidence.UNKNOWN.value
717
+ chain_decision = (
718
+ access_decisions.get(str(ep_id))
719
+ if access_decisions is not None else None
720
+ )
721
+ if chain_decision in {"permit_all", "anonymous"}:
722
+ verdict = "probably_exposed"
723
+ confidence = Confidence.VERIFIED.value
724
+ elif chain_decision in {"authenticated", "role_required", "deny_all"}:
725
+ verdict = "protected_standard"
726
+ confidence = Confidence.VERIFIED.value
714
727
  out[ep_id] = {
715
- "verdict": v.get("verdict") or "coverage_unknown",
716
- "confidence": v.get("confidence") or Confidence.UNKNOWN.value,
728
+ "verdict": verdict,
729
+ "confidence": confidence,
717
730
  # Evidence, not answer: the guard vocabulary declared on the handler.
718
731
  "declared_policy": v.get("policy") or "unknown",
732
+ **({"chain_decision": chain_decision} if chain_decision is not None else {}),
719
733
  }
720
734
  return out
721
735
 
sourcecode/selftest.py CHANGED
@@ -131,7 +131,19 @@ def _platform_label() -> str:
131
131
 
132
132
  def _check_ask09(subject: Subject) -> "dict[str, Any]":
133
133
  """The ceiling hint names the bounding flags the command declares."""
134
- code, payload, _ = subject.run("endpoints", str(subject.repo))
134
+ probe_args = ("endpoints", str(subject.repo))
135
+ code, payload, stdout = subject.run(*probe_args)
136
+ executable = (
137
+ subject.entry_point
138
+ if subject.entry_point.endswith("ask")
139
+ else f"{sys.executable} {subject.entry_point}"
140
+ )
141
+ probe_command = " ".join((executable, *probe_args))
142
+ observed_excerpt = (stdout or json.dumps(payload or {}, sort_keys=True))[:500]
143
+ evidence = {
144
+ "probe_command": probe_command,
145
+ "observed_payload_excerpt": observed_excerpt,
146
+ }
135
147
  body = _payload_of(payload)
136
148
  if code == 0:
137
149
  return _result(
@@ -139,9 +151,17 @@ def _check_ask09(subject: Subject) -> "dict[str, Any]":
139
151
  "this repository's `endpoints` answer fits under the output ceiling, "
140
152
  "so the guard this row is about never ran — a bigger repository is "
141
153
  "needed to exercise it here",
154
+ **evidence,
142
155
  )
143
156
  error = body.get("error")
144
157
  error_body = error if isinstance(error, dict) else body
158
+ if error_body.get("code") != "OUTPUT_TOO_LARGE":
159
+ return _result(
160
+ ERROR,
161
+ f"the probe exited {code} without OUTPUT_TOO_LARGE "
162
+ f"(observed code={error_body.get('code')!r})",
163
+ **evidence,
164
+ )
145
165
  hint = str(error_body.get("hint") or "")
146
166
  basis = body.get("hint_basis") or {}
147
167
  declared = list(basis.get("declared_flags") or [])
@@ -149,7 +169,7 @@ def _check_ask09(subject: Subject) -> "dict[str, Any]":
149
169
  return _result(
150
170
  FAIL,
151
171
  f"the refusal denies a smaller view while declaring {declared}",
152
- hint=hint, hint_basis=basis,
172
+ hint=hint, hint_basis=basis, **evidence,
153
173
  )
154
174
  if not basis:
155
175
  return _result(
@@ -157,12 +177,13 @@ def _check_ask09(subject: Subject) -> "dict[str, Any]":
157
177
  "the refusal carries no `hint_basis`, so what the hint was derived "
158
178
  "from cannot be read from one run — the observability half of the row",
159
179
  hint=hint,
180
+ **evidence,
160
181
  )
161
182
  return _result(
162
183
  PASS,
163
184
  f"the refusal derives its hint from {basis.get('derived_from')!r} "
164
185
  f"(context_found={basis.get('context_found')}) and offers {declared}",
165
- hint=hint, hint_basis=basis,
186
+ hint=hint, hint_basis=basis, **evidence,
166
187
  )
167
188
 
168
189
 
@@ -1288,6 +1288,42 @@ def run_security_audit(
1288
1288
  cir, model=model, tx_total=tx_index.stats()["total"]
1289
1289
  )
1290
1290
 
1291
+ _profile_state: dict[str, Any] = {
1292
+ "selected": [],
1293
+ "resolution": "unresolved",
1294
+ "note": (
1295
+ "No runtime Spring profile was supplied to spring-audit; the listed "
1296
+ "profiles are static candidates, not proof of activation."
1297
+ ),
1298
+ }
1299
+ _active_permit_all: list[dict[str, Any]] = []
1300
+ if root is not None:
1301
+ try:
1302
+ from sourcecode.spring_profiles import profile_population
1303
+ from sourcecode.source_text import blank_java_comments
1304
+
1305
+ _profile_state["population"] = profile_population(
1306
+ Path(root), list(cir.files or [])
1307
+ ).to_dict()
1308
+ for rel in (cir.files or []):
1309
+ if not isinstance(rel, str) or not rel.endswith(".java"):
1310
+ continue
1311
+ try:
1312
+ source = (Path(root) / rel).read_text(
1313
+ encoding="utf-8", errors="replace"
1314
+ )
1315
+ except OSError:
1316
+ continue
1317
+ live = blank_java_comments(source)
1318
+ for match in re.finditer(r"\bpermitAll\s*\(\s*\)", live):
1319
+ _active_permit_all.append({
1320
+ "file": rel,
1321
+ "line": live[:match.start()].count("\n") + 1,
1322
+ "evidence": match.group(0),
1323
+ })
1324
+ except Exception as exc:
1325
+ _profile_state["population_error"] = str(exc)
1326
+
1291
1327
  _sec_limitations = [
1292
1328
  "first_line is the earliest source token recorded for the symbol (SourceSpan index) — inside the declaration, not necessarily the declaration line itself; null when the symbol has no recorded span",
1293
1329
  "SEC-001: only emitted for annotation_based security model",
@@ -1361,6 +1397,15 @@ def run_security_audit(
1361
1397
  "separately under non_spring_rest_surface)."
1362
1398
  ),
1363
1399
  "security_model": cir.metadata.get("security_model", "unknown"),
1400
+ "security_profiles": _profile_state,
1401
+ "active_permit_all": {
1402
+ "rules": _active_permit_all,
1403
+ "count": len(_active_permit_all),
1404
+ "note": (
1405
+ "Rules are live source evidence; their runtime activation still "
1406
+ "depends on the selected Spring profile."
1407
+ ),
1408
+ },
1364
1409
  "analysis_time_ms": elapsed_ms,
1365
1410
  # C3-71: which families answered, and which the budget cut. Present on
1366
1411
  # every run, so "all of them" is a published fact rather than an
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: sourcecode
3
- Version: 5.8.8
3
+ Version: 5.8.9
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
- ![Version](https://img.shields.io/badge/version-5.8.8-blue)
52
+ ![Version](https://img.shields.io/badge/version-5.8.9-blue)
53
53
  ![Python](https://img.shields.io/badge/python-3.9%2B-green)
54
54
 
55
55
  Copyright (c) 2026 Dominique Haroun. All rights reserved. ASK Engine 5.7.0 and
@@ -139,7 +139,7 @@ brew tap haroundominique/sourcecode && brew install sourcecode
139
139
  # pip / pipx
140
140
  pipx install sourcecode # or: pip install sourcecode
141
141
 
142
- ask version # ask 5.8.8 — and, on a build that has aged,
142
+ ask version # ask 5.8.9 — and, on a build that has aged,
143
143
  # how many releases have probably shipped since
144
144
  ```
145
145
 
@@ -1,4 +1,4 @@
1
- sourcecode/__init__.py,sha256=yZjHsrmtVA5g1MKeZTpLxBVjvxCMkraqyf_rqnp0jpE,308
1
+ sourcecode/__init__.py,sha256=SEXDKNw2zepQYde4aTeTqJMfLe9te9ysvUaPtO8es-8,308
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
@@ -25,7 +25,7 @@ sourcecode/chain_rules.py,sha256=Bi6UHfgd-GxWswmnHRcPz5jdbAuqka3Zkz_P-MTvqhw,127
25
25
  sourcecode/change_plan.py,sha256=FAbLtexNThXp51STU-F2a_3AQd1LWd3NsKWMnMNJrPo,12333
26
26
  sourcecode/cir_graphs.py,sha256=RytqSv1WF8kdlfXj2fPQz16LY4akS2kyThbdWL8beCQ,14835
27
27
  sourcecode/classifier.py,sha256=JBzPwSSrDG-tUHAbcKB678HRbjLpD-ohzbzzO62mgpo,20114
28
- sourcecode/cli.py,sha256=FW8siR2aWLMR5Db81zH4N_pVGOqfPoi5RS_IOrWgK1s,723704
28
+ sourcecode/cli.py,sha256=p5ZvOcCyuV-9YftPfyKAL2whUR2zPwWVAQ9k3-Eel0c,723455
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=2GdDy0qkDSgmkkpgvoCHitoLj3mt30EeFgJ8PGEXJng,14712
@@ -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=8yhlPhLLQt1gcnFfsFO2OFOdDdPkSbzElugrB_nsIJ8,17706
45
+ sourcecode/data_exposure.py,sha256=geJCZ_DRgv-sZlyZiRQoCDbOXP9ByZdQ_MvSE3yBYFQ,17735
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
@@ -64,7 +64,7 @@ sourcecode/error_schema.py,sha256=uwosfNaSujtYm11_732Hu92z5ITV040fQDaIyefSvR4,16
64
64
  sourcecode/evidence_provider.py,sha256=GSSL44JEaouO5AHks2sB3d1YvC9xIKIld1yBYxZpXxo,4277
65
65
  sourcecode/execution_plan.py,sha256=5LyoIsgM5Fg2D1hz-dTD7iqU3xVFS3EyR5yHBlJW5M8,25679
66
66
  sourcecode/explain.py,sha256=o1xE-PEWOealHgdT-ZbfpdjHItghzz_HMR1CRCJQySg,31938
67
- sourcecode/explain_endpoint.py,sha256=rkNPoPAEkXLIH-rlYrOQDlJVbl6V_s3mkHtFBrdl3us,19604
67
+ sourcecode/explain_endpoint.py,sha256=NtAoNs4czD2WbBccWQx9KNHs40MyVEvTvutTIQhmEm4,19796
68
68
  sourcecode/field_deprecations.py,sha256=AL-0VWD0rolQQWfJAjLrfiYrhVEHlKuG0xadg1yBckc,7001
69
69
  sourcecode/file_chunker.py,sha256=3vkM3mDQ5eE_yTPvUgjyjpGFBIjkW6_mrBmIbrylnA8,16444
70
70
  sourcecode/file_classifier.py,sha256=pJCeN9KqWpAwKMCgGP4KDsBjuWMeo4zlbj5fv3hk9dA,15587
@@ -92,7 +92,7 @@ sourcecode/openapi_surface.py,sha256=BTt0K-woZbkbWTN77IkqeBm_Okag9owR0848fmot8sk
92
92
  sourcecode/openrewrite_recipe.py,sha256=4dyY5twRB6Xew-G9Zy5FafNZwlMU1S7DnRa2FqPkhpQ,12233
93
93
  sourcecode/output_bounds.py,sha256=OtT7_g8ofuWkXRWlEeUSxx9X-CLMckXAbLCzzyG30so,7694
94
94
  sourcecode/output_budget.py,sha256=GxoFnbwk0dvqScgmMRPZHj7m-zRIoHLwUKplrH0u89s,13872
95
- sourcecode/output_ceiling.py,sha256=deQ5ExPfuOGKRpIKqHUVElrsRhvpYkIpf05B1sKdbAo,20745
95
+ sourcecode/output_ceiling.py,sha256=DZt9BtlMLuCLCwMdnLvFi8qEME2AKhDVuKZR5Ws1bMI,21003
96
96
  sourcecode/output_encoding.py,sha256=OxiZQtr7uWBDUtblNQviNHsTH1Xo9AZEpsegPlQWKFk,2139
97
97
  sourcecode/output_sink.py,sha256=Eya-PnXxqc3RGulJoLhuC9LUF73SZD0aO5O2B0xAMXU,8762
98
98
  sourcecode/parallel.py,sha256=QocwdZoUabdxzd_jEz7f6B2XMsYWFaCFaIl0tIEQs3g,10546
@@ -139,8 +139,8 @@ sourcecode/schema_registry.py,sha256=ny9yqt_Mwt92TwRRviEXA8jfpeld-xB9KUTOaTiyhZs
139
139
  sourcecode/security_chain.py,sha256=1YZVeFLwy65kntMBhMNvz1cUpOoKCmvEqYICgxs66Gw,6823
140
140
  sourcecode/security_config.py,sha256=LUppRDYQK0oKM4qdEOLObaeU3frFTS-paEZo7dMgtY8,5467
141
141
  sourcecode/security_config_scan.py,sha256=iXDeulgdbAwUFR01p9PgrJED2vd4HE2FCZgqrxX5D0E,32824
142
- sourcecode/security_posture.py,sha256=rVCu5-InQshwI0bWqanxg5rg_fhV3o8d35ifQeQEM7M,55197
143
- sourcecode/selftest.py,sha256=mGvShPbOwNqayTJ8GnpTGsscMIh5gMSItLQvDiSmb2w,17999
142
+ sourcecode/security_posture.py,sha256=wj6WwvasIh6r-minwBz3oz1T9Zl8SPsPhn7zxDD-yng,55861
143
+ sourcecode/selftest.py,sha256=3z9pMvK4ujMDqrTKskAQbXwfpRu4lJU_yx4mbftFDVg,18772
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=NaAZbY8N8gmtf9NHBh5o550yvuiewtmBE7PfAEkCIk8,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=sn0FtdcBKbRFPZj6mZ3CMHbpGoqcj2Md9MlOt5uUUSY,66246
157
+ sourcecode/spring_security_audit.py,sha256=6_zbZaDFZiXe7fMMpAuVjbbbk1oz_wTZI3JfBmHwpqQ,68097
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=0XJFc2Eve4ht3IwZFqAbd4ct34uv4vB-PC7d8NZ6nv8,728714
243
+ sourcecode/_docs/DEFECT-LEDGER.md,sha256=cJPUezkF4LbU_8ZSOgeh_m2gUvhoidBCHIrW77AkqIk,732817
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=Sk3P7oOjsYF6YxhKaxIUsM8Y0Dm1pQqrpOYXD2dUnqg,86739
247
- sourcecode-5.8.8.dist-info/METADATA,sha256=vQdqwv4iB9WEAQyW1ihkDlzKeIlg8gvWVKNyqC-NTKY,50807
248
- sourcecode-5.8.8.dist-info/WHEEL,sha256=QccIxa26bgl1E6uMy58deGWi-0aeIkkangHcxk2kWfw,87
249
- sourcecode-5.8.8.dist-info/entry_points.txt,sha256=-JEAdChrK5We51kZcb7OaDcyil-dHBjBPL-NhuO-QY8,89
250
- sourcecode-5.8.8.dist-info/licenses/LICENSE,sha256=23-fk61oSWGVmkWyka-FIM0rhAPM2hcYHnsaridL8Uo,1859
251
- sourcecode-5.8.8.dist-info/licenses/NOTICE,sha256=Br-AA8Y3iJo1WXa5uP8QBpzqI5nDu3iGLbFyvDt3BOs,321
252
- sourcecode-5.8.8.dist-info/RECORD,,
246
+ sourcecode/_docs/USER_GUIDE.md,sha256=okCMd6CxD3_Nz9qrXA1EGf8D3jHNjK8zAcTClNcm0gE,86739
247
+ sourcecode-5.8.9.dist-info/METADATA,sha256=4RMPxZ4FCoQZASGy12Azs46i-7udfu2B5HseWc2OCpM,50807
248
+ sourcecode-5.8.9.dist-info/WHEEL,sha256=QccIxa26bgl1E6uMy58deGWi-0aeIkkangHcxk2kWfw,87
249
+ sourcecode-5.8.9.dist-info/entry_points.txt,sha256=-JEAdChrK5We51kZcb7OaDcyil-dHBjBPL-NhuO-QY8,89
250
+ sourcecode-5.8.9.dist-info/licenses/LICENSE,sha256=23-fk61oSWGVmkWyka-FIM0rhAPM2hcYHnsaridL8Uo,1859
251
+ sourcecode-5.8.9.dist-info/licenses/NOTICE,sha256=Br-AA8Y3iJo1WXa5uP8QBpzqI5nDu3iGLbFyvDt3BOs,321
252
+ sourcecode-5.8.9.dist-info/RECORD,,