sourcecode 2.1.0__tar.gz → 2.3.0__tar.gz

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.
Files changed (140) hide show
  1. {sourcecode-2.1.0 → sourcecode-2.3.0}/CHANGELOG.md +128 -0
  2. {sourcecode-2.1.0 → sourcecode-2.3.0}/PKG-INFO +4 -4
  3. {sourcecode-2.1.0 → sourcecode-2.3.0}/README.md +3 -3
  4. {sourcecode-2.1.0 → sourcecode-2.3.0}/pyproject.toml +1 -1
  5. {sourcecode-2.1.0 → sourcecode-2.3.0}/src/sourcecode/__init__.py +1 -1
  6. sourcecode-2.3.0/src/sourcecode/archetype.py +605 -0
  7. {sourcecode-2.1.0 → sourcecode-2.3.0}/src/sourcecode/architecture_summary.py +41 -0
  8. sourcecode-2.3.0/src/sourcecode/caller_metrics.py +42 -0
  9. {sourcecode-2.1.0 → sourcecode-2.3.0}/src/sourcecode/classifier.py +94 -1
  10. {sourcecode-2.1.0 → sourcecode-2.3.0}/src/sourcecode/cli.py +191 -29
  11. {sourcecode-2.1.0 → sourcecode-2.3.0}/src/sourcecode/detectors/java.py +29 -1
  12. sourcecode-2.3.0/src/sourcecode/endpoint_metrics.py +42 -0
  13. {sourcecode-2.1.0 → sourcecode-2.3.0}/src/sourcecode/explain.py +2 -0
  14. sourcecode-2.3.0/src/sourcecode/graph_evidence.py +352 -0
  15. {sourcecode-2.1.0 → sourcecode-2.3.0}/src/sourcecode/path_filters.py +2 -1
  16. {sourcecode-2.1.0 → sourcecode-2.3.0}/src/sourcecode/repository_ir.py +50 -14
  17. {sourcecode-2.1.0 → sourcecode-2.3.0}/src/sourcecode/semantic_integration_engine.py +18 -2
  18. {sourcecode-2.1.0 → sourcecode-2.3.0}/src/sourcecode/serializer.py +23 -3
  19. {sourcecode-2.1.0 → sourcecode-2.3.0}/src/sourcecode/spring_semantic.py +18 -5
  20. {sourcecode-2.1.0 → sourcecode-2.3.0}/src/sourcecode/spring_tx_analyzer.py +21 -6
  21. {sourcecode-2.1.0 → sourcecode-2.3.0}/.github/workflows/build-windows.yml +0 -0
  22. {sourcecode-2.1.0 → sourcecode-2.3.0}/.gitignore +0 -0
  23. {sourcecode-2.1.0 → sourcecode-2.3.0}/.ruff.toml +0 -0
  24. {sourcecode-2.1.0 → sourcecode-2.3.0}/CONTRIBUTING.md +0 -0
  25. {sourcecode-2.1.0 → sourcecode-2.3.0}/LICENSE +0 -0
  26. {sourcecode-2.1.0 → sourcecode-2.3.0}/SECURITY.md +0 -0
  27. {sourcecode-2.1.0 → sourcecode-2.3.0}/raw +0 -0
  28. {sourcecode-2.1.0 → sourcecode-2.3.0}/scripts/compare_integration_engines.py +0 -0
  29. {sourcecode-2.1.0 → sourcecode-2.3.0}/scripts/customer_smoke_test.sh +0 -0
  30. {sourcecode-2.1.0 → sourcecode-2.3.0}/scripts/generate_jdk_exports.py +0 -0
  31. {sourcecode-2.1.0 → sourcecode-2.3.0}/src/sourcecode/adaptive_scanner.py +0 -0
  32. {sourcecode-2.1.0 → sourcecode-2.3.0}/src/sourcecode/architecture_analyzer.py +0 -0
  33. {sourcecode-2.1.0 → sourcecode-2.3.0}/src/sourcecode/ast_extractor.py +0 -0
  34. {sourcecode-2.1.0 → sourcecode-2.3.0}/src/sourcecode/cache.py +0 -0
  35. {sourcecode-2.1.0 → sourcecode-2.3.0}/src/sourcecode/call_surface.py +0 -0
  36. {sourcecode-2.1.0 → sourcecode-2.3.0}/src/sourcecode/canonical_ir.py +0 -0
  37. {sourcecode-2.1.0 → sourcecode-2.3.0}/src/sourcecode/cir_graphs.py +0 -0
  38. {sourcecode-2.1.0 → sourcecode-2.3.0}/src/sourcecode/code_notes_analyzer.py +0 -0
  39. {sourcecode-2.1.0 → sourcecode-2.3.0}/src/sourcecode/confidence_analyzer.py +0 -0
  40. {sourcecode-2.1.0 → sourcecode-2.3.0}/src/sourcecode/context_graph.py +0 -0
  41. {sourcecode-2.1.0 → sourcecode-2.3.0}/src/sourcecode/context_scorer.py +0 -0
  42. {sourcecode-2.1.0 → sourcecode-2.3.0}/src/sourcecode/context_summarizer.py +0 -0
  43. {sourcecode-2.1.0 → sourcecode-2.3.0}/src/sourcecode/contract_model.py +0 -0
  44. {sourcecode-2.1.0 → sourcecode-2.3.0}/src/sourcecode/contract_pipeline.py +0 -0
  45. {sourcecode-2.1.0 → sourcecode-2.3.0}/src/sourcecode/coverage_parser.py +0 -0
  46. {sourcecode-2.1.0 → sourcecode-2.3.0}/src/sourcecode/dependency_analyzer.py +0 -0
  47. {sourcecode-2.1.0 → sourcecode-2.3.0}/src/sourcecode/detectors/__init__.py +0 -0
  48. {sourcecode-2.1.0 → sourcecode-2.3.0}/src/sourcecode/detectors/base.py +0 -0
  49. {sourcecode-2.1.0 → sourcecode-2.3.0}/src/sourcecode/detectors/csproj_parser.py +0 -0
  50. {sourcecode-2.1.0 → sourcecode-2.3.0}/src/sourcecode/detectors/dart.py +0 -0
  51. {sourcecode-2.1.0 → sourcecode-2.3.0}/src/sourcecode/detectors/dotnet.py +0 -0
  52. {sourcecode-2.1.0 → sourcecode-2.3.0}/src/sourcecode/detectors/elixir.py +0 -0
  53. {sourcecode-2.1.0 → sourcecode-2.3.0}/src/sourcecode/detectors/go.py +0 -0
  54. {sourcecode-2.1.0 → sourcecode-2.3.0}/src/sourcecode/detectors/heuristic.py +0 -0
  55. {sourcecode-2.1.0 → sourcecode-2.3.0}/src/sourcecode/detectors/hybrid.py +0 -0
  56. {sourcecode-2.1.0 → sourcecode-2.3.0}/src/sourcecode/detectors/jvm_ext.py +0 -0
  57. {sourcecode-2.1.0 → sourcecode-2.3.0}/src/sourcecode/detectors/nodejs.py +0 -0
  58. {sourcecode-2.1.0 → sourcecode-2.3.0}/src/sourcecode/detectors/parsers.py +0 -0
  59. {sourcecode-2.1.0 → sourcecode-2.3.0}/src/sourcecode/detectors/php.py +0 -0
  60. {sourcecode-2.1.0 → sourcecode-2.3.0}/src/sourcecode/detectors/project.py +0 -0
  61. {sourcecode-2.1.0 → sourcecode-2.3.0}/src/sourcecode/detectors/python.py +0 -0
  62. {sourcecode-2.1.0 → sourcecode-2.3.0}/src/sourcecode/detectors/ruby.py +0 -0
  63. {sourcecode-2.1.0 → sourcecode-2.3.0}/src/sourcecode/detectors/rust.py +0 -0
  64. {sourcecode-2.1.0 → sourcecode-2.3.0}/src/sourcecode/detectors/systems.py +0 -0
  65. {sourcecode-2.1.0 → sourcecode-2.3.0}/src/sourcecode/detectors/terraform.py +0 -0
  66. {sourcecode-2.1.0 → sourcecode-2.3.0}/src/sourcecode/detectors/tooling.py +0 -0
  67. {sourcecode-2.1.0 → sourcecode-2.3.0}/src/sourcecode/doc_analyzer.py +0 -0
  68. {sourcecode-2.1.0 → sourcecode-2.3.0}/src/sourcecode/dynamic_argument_surface.py +0 -0
  69. {sourcecode-2.1.0 → sourcecode-2.3.0}/src/sourcecode/endpoint_literals.py +0 -0
  70. {sourcecode-2.1.0 → sourcecode-2.3.0}/src/sourcecode/entrypoint_classifier.py +0 -0
  71. {sourcecode-2.1.0 → sourcecode-2.3.0}/src/sourcecode/env_analyzer.py +0 -0
  72. {sourcecode-2.1.0 → sourcecode-2.3.0}/src/sourcecode/error_schema.py +0 -0
  73. {sourcecode-2.1.0 → sourcecode-2.3.0}/src/sourcecode/evidence_provider.py +0 -0
  74. {sourcecode-2.1.0 → sourcecode-2.3.0}/src/sourcecode/file_chunker.py +0 -0
  75. {sourcecode-2.1.0 → sourcecode-2.3.0}/src/sourcecode/file_classifier.py +0 -0
  76. {sourcecode-2.1.0 → sourcecode-2.3.0}/src/sourcecode/format_contract.py +0 -0
  77. {sourcecode-2.1.0 → sourcecode-2.3.0}/src/sourcecode/fqn_utils.py +0 -0
  78. {sourcecode-2.1.0 → sourcecode-2.3.0}/src/sourcecode/git_analyzer.py +0 -0
  79. {sourcecode-2.1.0 → sourcecode-2.3.0}/src/sourcecode/graph_analyzer.py +0 -0
  80. {sourcecode-2.1.0 → sourcecode-2.3.0}/src/sourcecode/hibernate_strat.py +0 -0
  81. {sourcecode-2.1.0 → sourcecode-2.3.0}/src/sourcecode/jdk_exports.py +0 -0
  82. {sourcecode-2.1.0 → sourcecode-2.3.0}/src/sourcecode/license.py +0 -0
  83. {sourcecode-2.1.0 → sourcecode-2.3.0}/src/sourcecode/mcp/__init__.py +0 -0
  84. {sourcecode-2.1.0 → sourcecode-2.3.0}/src/sourcecode/mcp/onboarding/__init__.py +0 -0
  85. {sourcecode-2.1.0 → sourcecode-2.3.0}/src/sourcecode/mcp/onboarding/applier.py +0 -0
  86. {sourcecode-2.1.0 → sourcecode-2.3.0}/src/sourcecode/mcp/onboarding/backup.py +0 -0
  87. {sourcecode-2.1.0 → sourcecode-2.3.0}/src/sourcecode/mcp/onboarding/detector.py +0 -0
  88. {sourcecode-2.1.0 → sourcecode-2.3.0}/src/sourcecode/mcp/onboarding/planner.py +0 -0
  89. {sourcecode-2.1.0 → sourcecode-2.3.0}/src/sourcecode/mcp/orchestrator.py +0 -0
  90. {sourcecode-2.1.0 → sourcecode-2.3.0}/src/sourcecode/mcp/registry.py +0 -0
  91. {sourcecode-2.1.0 → sourcecode-2.3.0}/src/sourcecode/mcp/runner.py +0 -0
  92. {sourcecode-2.1.0 → sourcecode-2.3.0}/src/sourcecode/mcp/server.py +0 -0
  93. {sourcecode-2.1.0 → sourcecode-2.3.0}/src/sourcecode/mcp_nudge.py +0 -0
  94. {sourcecode-2.1.0 → sourcecode-2.3.0}/src/sourcecode/metrics_analyzer.py +0 -0
  95. {sourcecode-2.1.0 → sourcecode-2.3.0}/src/sourcecode/migrate_check.py +0 -0
  96. {sourcecode-2.1.0 → sourcecode-2.3.0}/src/sourcecode/openapi_surface.py +0 -0
  97. {sourcecode-2.1.0 → sourcecode-2.3.0}/src/sourcecode/output_budget.py +0 -0
  98. {sourcecode-2.1.0 → sourcecode-2.3.0}/src/sourcecode/pr_comment_renderer.py +0 -0
  99. {sourcecode-2.1.0 → sourcecode-2.3.0}/src/sourcecode/pr_impact.py +0 -0
  100. {sourcecode-2.1.0 → sourcecode-2.3.0}/src/sourcecode/prepare_context.py +0 -0
  101. {sourcecode-2.1.0 → sourcecode-2.3.0}/src/sourcecode/progress.py +0 -0
  102. {sourcecode-2.1.0 → sourcecode-2.3.0}/src/sourcecode/ranking_engine.py +0 -0
  103. {sourcecode-2.1.0 → sourcecode-2.3.0}/src/sourcecode/redactor.py +0 -0
  104. {sourcecode-2.1.0 → sourcecode-2.3.0}/src/sourcecode/relevance_scorer.py +0 -0
  105. {sourcecode-2.1.0 → sourcecode-2.3.0}/src/sourcecode/rename_refactor.py +0 -0
  106. {sourcecode-2.1.0 → sourcecode-2.3.0}/src/sourcecode/repo_classifier.py +0 -0
  107. {sourcecode-2.1.0 → sourcecode-2.3.0}/src/sourcecode/ris.py +0 -0
  108. {sourcecode-2.1.0 → sourcecode-2.3.0}/src/sourcecode/runtime_classifier.py +0 -0
  109. {sourcecode-2.1.0 → sourcecode-2.3.0}/src/sourcecode/scanner.py +0 -0
  110. {sourcecode-2.1.0 → sourcecode-2.3.0}/src/sourcecode/schema.py +0 -0
  111. {sourcecode-2.1.0 → sourcecode-2.3.0}/src/sourcecode/security_config.py +0 -0
  112. {sourcecode-2.1.0 → sourcecode-2.3.0}/src/sourcecode/security_posture.py +0 -0
  113. {sourcecode-2.1.0 → sourcecode-2.3.0}/src/sourcecode/semantic_analyzer.py +0 -0
  114. {sourcecode-2.1.0 → sourcecode-2.3.0}/src/sourcecode/semantic_impact_engine.py +0 -0
  115. {sourcecode-2.1.0 → sourcecode-2.3.0}/src/sourcecode/semantic_services.py +0 -0
  116. {sourcecode-2.1.0 → sourcecode-2.3.0}/src/sourcecode/spring_event_topology.py +0 -0
  117. {sourcecode-2.1.0 → sourcecode-2.3.0}/src/sourcecode/spring_findings.py +0 -0
  118. {sourcecode-2.1.0 → sourcecode-2.3.0}/src/sourcecode/spring_impact.py +0 -0
  119. {sourcecode-2.1.0 → sourcecode-2.3.0}/src/sourcecode/spring_model.py +0 -0
  120. {sourcecode-2.1.0 → sourcecode-2.3.0}/src/sourcecode/spring_security_audit.py +0 -0
  121. {sourcecode-2.1.0 → sourcecode-2.3.0}/src/sourcecode/summarizer.py +0 -0
  122. {sourcecode-2.1.0 → sourcecode-2.3.0}/src/sourcecode/telemetry/__init__.py +0 -0
  123. {sourcecode-2.1.0 → sourcecode-2.3.0}/src/sourcecode/telemetry/config.py +0 -0
  124. {sourcecode-2.1.0 → sourcecode-2.3.0}/src/sourcecode/telemetry/consent.py +0 -0
  125. {sourcecode-2.1.0 → sourcecode-2.3.0}/src/sourcecode/telemetry/events.py +0 -0
  126. {sourcecode-2.1.0 → sourcecode-2.3.0}/src/sourcecode/telemetry/filters.py +0 -0
  127. {sourcecode-2.1.0 → sourcecode-2.3.0}/src/sourcecode/telemetry/transport.py +0 -0
  128. {sourcecode-2.1.0 → sourcecode-2.3.0}/src/sourcecode/tree_utils.py +0 -0
  129. {sourcecode-2.1.0 → sourcecode-2.3.0}/src/sourcecode/type_usage_surface.py +0 -0
  130. {sourcecode-2.1.0 → sourcecode-2.3.0}/src/sourcecode/validation_inference.py +0 -0
  131. {sourcecode-2.1.0 → sourcecode-2.3.0}/src/sourcecode/validation_surface.py +0 -0
  132. {sourcecode-2.1.0 → sourcecode-2.3.0}/src/sourcecode/version_check.py +0 -0
  133. {sourcecode-2.1.0 → sourcecode-2.3.0}/src/sourcecode/workspace.py +0 -0
  134. {sourcecode-2.1.0 → sourcecode-2.3.0}/supabase/functions/README.md +0 -0
  135. {sourcecode-2.1.0 → sourcecode-2.3.0}/supabase/functions/get-license/index.ts +0 -0
  136. {sourcecode-2.1.0 → sourcecode-2.3.0}/supabase/functions/lemonsqueezy-webhook/index.ts +0 -0
  137. {sourcecode-2.1.0 → sourcecode-2.3.0}/supabase/functions/telemetry/index.ts +0 -0
  138. {sourcecode-2.1.0 → sourcecode-2.3.0}/supabase/sql/license_event_ordering.sql +0 -0
  139. {sourcecode-2.1.0 → sourcecode-2.3.0}/supabase/sql/licensing_schema.sql +0 -0
  140. {sourcecode-2.1.0 → sourcecode-2.3.0}/supabase/sql/telemetry_events.sql +0 -0
@@ -1,5 +1,133 @@
1
1
  # Changelog
2
2
 
3
+ ## [2.3.0] — 2026-07-12
4
+
5
+ **Module graph promoted to a first-class Evidence Provider for architectural
6
+ characterization (ADR-0003 step 2).** The experimental `archetype` model can now
7
+ derive architectural style from the *directed structure* of the module
8
+ dependency graph rather than from directory names — names become secondary
9
+ evidence. This consolidates a new evidence source; the legacy report wording is
10
+ unchanged (no cutover) pending cross-repo validation.
11
+
12
+ ### Added
13
+
14
+ - **`graph_evidence.py` — a pure, archetype-agnostic Graph Evidence Provider.**
15
+ Transforms a `ModuleGraph` into reusable topological evidence
16
+ (`ModuleGraph → metrics → GraphEvidence`). It knows graphs, not archetypes: it
17
+ never classifies, emits no prose, and does not import the scorer. Seven
18
+ name-free metrics, each O(V+E)/O(V log V): `scc_mass` (non-trivial
19
+ strongly-connected-component node fraction, iterative Tarjan), `cyclic_density`
20
+ (intra-SCC back-edges), `hub_concentration`, `module_centralization` (Freeman),
21
+ `downward_edge_ratio` and `dependency_inversion_ratio` (both via Martin
22
+ instability `I = out/(in+out)`), and `fan_in_gini`. Graphs below 4 nodes / 3
23
+ edges report `available=False` and degrade cleanly.
24
+ - **`archetype` consumes topological evidence via a declarative `_GRAPH_MAP`.**
25
+ The map (`metric → [(dimension, label, weight, polarity, lo, hi)]`) is the only
26
+ place that couples graphs to archetypes; the scorer reads `Evidence` objects and
27
+ never traverses the graph. Polarity `-1` *refutes* (a dense cyclic core refutes
28
+ `layered`/`microkernel`/`hexagonal`). Architectural style now emerges from
29
+ structure: `layered` from downward flow + acyclicity, `engine` from a woven
30
+ cyclic core, `microkernel` from a stable hub, `hexagonal` from dependency
31
+ inversion into a distributed core.
32
+ - **`ask archetype` builds a bounded `ModuleGraph`** (`GraphAnalyzer`) and feeds it
33
+ to the classifier, best-effort with graceful degradation to the previous
34
+ name-mass-only behaviour on failure or oversized trees. Output gains top-level
35
+ `graph_metrics` and `graph_*` entries in candidate evidence traces.
36
+
37
+ ### Changed
38
+
39
+ - **Confidence is now tied to topological support for the winning label.**
40
+ `graph_backed` is true only when the winning candidate carries positive
41
+ `graph_*` evidence — so "high" confidence requires real structure behind *that*
42
+ conclusion, not merely that a graph exists. (The prior gate keyed on
43
+ `module_graph_summary` was effectively dead, since the command never populated
44
+ it.) A new absolute-score floor (`_MIN_CONFIDENT_SCORE`) keeps a near-floor lone
45
+ winner at "low".
46
+
47
+ ### Notes
48
+
49
+ - **No report cutover.** Legacy `project_type` / `architecture.pattern` and the
50
+ report's first two lines are unchanged; `archetype` remains parallel and
51
+ experimental while the new evidence is validated across repositories.
52
+ - Tests: `tests/test_graph_evidence.py` adds 12 synthetic-graph tests (no real
53
+ repository) covering metric ranges for layered/engine/microkernel/hexagonal
54
+ topologies and the archetype integration. Full battery: 3220 passed.
55
+
56
+ ## [2.2.0] — 2026-07-12
57
+
58
+ **Field-validation hardening — narrative/reporting-layer correctness across the
59
+ audit corpus.** A refute-first pass over ten real repositories fixed a batch of
60
+ mislabeling and miscount bugs where the headline framing contradicted the
61
+ structured output the engine had already produced. No Semantic IR change — every
62
+ fix is in the reporting/narrative layer and reuses facts already extracted.
63
+
64
+ ### Fixed
65
+
66
+ - **`endpoints` — modeled JAX-RS no longer double-reported as un-modeled surface
67
+ (A2).** `_build_route_surface` fully models JAX-RS, but `extract_java_endpoints`
68
+ also counted every `@Path` file into `non_spring_rest_surface{modeled:false}` and
69
+ warned "count covers Spring-MVC-annotated endpoints only" — contradicting the
70
+ JAX-RS routes just emitted (18 on eureka, 689 on keycloak). Modeled routes now
71
+ carry framework provenance (`jax_rs`/`spring_mvc`); when JAX-RS routes were
72
+ modeled, `jax_rs` is dropped from the un-modeled surface. Genuinely un-modeled
73
+ surfaces (WebScripts/Servlets, or JAX-RS that produced no route) still surface and
74
+ still warn.
75
+ - **`spring-audit` — overloaded `@Transactional` methods counted separately (A1).**
76
+ `TransactionBoundaryIndex.by_symbol` is keyed by signature-less FQN, so overloaded
77
+ methods (`findAll()` / `findAll(Pageable)`) collapsed to one entry and `stats()`
78
+ undercounted. A new `all_declared` list (one entry per site) drives the count
79
+ (petclinic 1→2, matching source); FQN-keyed lookups are unchanged.
80
+ - **`spring-audit` — per-site TX overloads no longer hidden by `by_symbol` collapse
81
+ (A1-RESIDUAL).** TX-001 (proxy-bypass) and TX-005 (exception-swallow) are per-site
82
+ checks but iterated the collapsed FQN map; a non-risky overload could overwrite a
83
+ risky one sharing an FQN, silently dropping the finding. Both now iterate
84
+ `all_declared` with a dedupe guard. Corpus TX counts unchanged (the residual was
85
+ latent).
86
+ - **`compact` — Spring Boot version surfaced from pom property (A3).** `--compact`
87
+ deployment omitted the Boot version when it lived in a `<spring.boot.version>`
88
+ property rather than the starter-parent, while `migrate-check` resolved it. The
89
+ serializer now falls back to the property-resolving detector (single source of
90
+ truth), gated on Boot presence so non-Boot repos gain no phantom version
91
+ (Broadleaf 3.5.14, consistent).
92
+ - **`endpoints` — `Map.put("/", literal)` no longer treated as a router-DSL route
93
+ (B1).** The router-DSL detector matched an HTTP-verb name + `"/"` first arg; a
94
+ plain map write (`swapChars.put("/", "slash")`) was reported as a `PUT /`
95
+ endpoint. A negative lookahead now rejects a literal second argument — a handler
96
+ is never a bare literal (openmrs 3→2, jobrunr 12/12 kept).
97
+ - **`endpoints` — test-suite module controllers excluded from entry points (B2).**
98
+ A scaffolding `@Controller` in openmrs' `test-suite` module (sources under
99
+ `src/main`) surfaced as a production entry point. Entry-point collection now uses
100
+ the broader `is_test_or_fixture_path`, and `test-suite`/`test-suites` are
101
+ recognized test-module segments (openmrs 19→18; petclinic/eureka/keycloak
102
+ unchanged).
103
+ - **`stack` — JAX-RS API surfaced in the headline stack from source annotations
104
+ (C1).** Eureka reported `project_type=library` with an empty stack despite 18
105
+ JAX-RS routes, because the manifest scan has no Jersey/Guice/jsr311 vocabulary and
106
+ (for gradle) reads only the root build file. When the `.java` scan found JAX-RS
107
+ entry points and no Jakarta EE framework was inferred, the stack now surfaces
108
+ `Jakarta EE` from the `@Path`/`@GET` evidence (eureka → `Java rest api using
109
+ Jakarta EE`). Manifest-only jsr311 still infers nothing (honesty preserved).
110
+
111
+ ### Changed
112
+
113
+ - **`modernize` — cyclic tangles distinguished from one-way deps in
114
+ `cross_module_tangles` (TANGLE-1).** A directional dependency is normal layering,
115
+ not a tangle. Each entry now carries `coupling_type` (`cyclic` when mutual, else
116
+ `directional`); the note and recommendation state only cyclic entries are real
117
+ tangles. The key is retained (mcp/USER_GUIDE/tests reference it); cyclic entries
118
+ still sort first.
119
+ - **CLI — consistent progress spinner across all long-running commands (UX-1).** The
120
+ TTY-gated progress spinner ran on only 5 code paths; the slowest commands
121
+ (`spring-audit`, `validation`, `migrate-check`, `endpoints`, `export`,
122
+ `impact-chain`, `pr-impact`, `explain`) ran silent. All 9 now show the same
123
+ stderr-only, TTY/CI-gated indicator (never pollutes stdout JSON, zero cost in CI).
124
+
125
+ ### Notes
126
+
127
+ - No breaking changes. All fixes are reporting/narrative-layer; the Semantic IR and
128
+ default JSON schemas are unchanged (`cross_module_tangles` gains an additive
129
+ `coupling_type` field). 3193 tests passing.
130
+
3
131
  ## [2.1.0] — 2026-07-10
4
132
 
5
133
  **Robustness & Security Inference — vendor-agnostic security & validation posture.**
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: sourcecode
3
- Version: 2.1.0
3
+ Version: 2.3.0
4
4
  Summary: Persistent structural context and ultra-fast repeated analysis for AI coding agents
5
5
  License-File: LICENSE
6
6
  Keywords: agents,ai,codebase,context,developer-tools,llm
@@ -38,11 +38,11 @@ Description-Content-Type: text/markdown
38
38
 
39
39
  # ASK Engine
40
40
 
41
- > **Persistent structural intelligence for AI coding agents.**
41
+ > **ASK — Actionable Software Knowledge.** Persistent structural intelligence for AI coding agents.
42
42
 
43
43
  **Context · Impact · Migration · Architecture · Review — everything from one structural model.**
44
44
 
45
- ![Version](https://img.shields.io/badge/version-2.1.0-blue)
45
+ ![Version](https://img.shields.io/badge/version-2.3.0-blue)
46
46
  ![Python](https://img.shields.io/badge/python-3.9%2B-green)
47
47
 
48
48
  > **ASK Engine** is the product. The CLI command is **`ask`**. The legacy **`sourcecode`**
@@ -84,7 +84,7 @@ brew tap haroundominique/sourcecode && brew install sourcecode
84
84
  # pip / pipx
85
85
  pipx install sourcecode # or: pip install sourcecode
86
86
 
87
- ask version # ask 2.1.0
87
+ ask version # ask 2.3.0
88
88
  ```
89
89
 
90
90
  > **Package vs. command.** The install package is named `sourcecode` this release
@@ -1,10 +1,10 @@
1
1
  # ASK Engine
2
2
 
3
- > **Persistent structural intelligence for AI coding agents.**
3
+ > **ASK — Actionable Software Knowledge.** Persistent structural intelligence for AI coding agents.
4
4
 
5
5
  **Context · Impact · Migration · Architecture · Review — everything from one structural model.**
6
6
 
7
- ![Version](https://img.shields.io/badge/version-2.1.0-blue)
7
+ ![Version](https://img.shields.io/badge/version-2.3.0-blue)
8
8
  ![Python](https://img.shields.io/badge/python-3.9%2B-green)
9
9
 
10
10
  > **ASK Engine** is the product. The CLI command is **`ask`**. The legacy **`sourcecode`**
@@ -46,7 +46,7 @@ brew tap haroundominique/sourcecode && brew install sourcecode
46
46
  # pip / pipx
47
47
  pipx install sourcecode # or: pip install sourcecode
48
48
 
49
- ask version # ask 2.1.0
49
+ ask version # ask 2.3.0
50
50
  ```
51
51
 
52
52
  > **Package vs. command.** The install package is named `sourcecode` this release
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "sourcecode"
7
- version = "2.1.0"
7
+ version = "2.3.0"
8
8
  description = "Persistent structural context and ultra-fast repeated analysis for AI coding agents"
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.9"
@@ -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__ = "2.1.0"
7
+ __version__ = "2.3.0"