arcgraph 0.2.0__tar.gz → 0.2.1__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 (270) hide show
  1. {arcgraph-0.2.0 → arcgraph-0.2.1}/.github/workflows/ci.yml +8 -8
  2. {arcgraph-0.2.0 → arcgraph-0.2.1}/PKG-INFO +32 -15
  3. {arcgraph-0.2.0 → arcgraph-0.2.1}/README.md +31 -14
  4. {arcgraph-0.2.0 → arcgraph-0.2.1}/RELEASE_NOTES.md +2 -1
  5. {arcgraph-0.2.0 → arcgraph-0.2.1}/arcgraph/_build_provenance.json +3 -3
  6. {arcgraph-0.2.0 → arcgraph-0.2.1}/arcgraph/analyzers/coverage.py +114 -21
  7. {arcgraph-0.2.0 → arcgraph-0.2.1}/arcgraph/interfaces/cli.py +2 -5
  8. {arcgraph-0.2.0 → arcgraph-0.2.1}/arcgraph/interfaces/cli_support.py +25 -0
  9. {arcgraph-0.2.0 → arcgraph-0.2.1}/arcgraph/interfaces/docs.py +18 -10
  10. {arcgraph-0.2.0 → arcgraph-0.2.1}/arcgraph/interfaces/precision.py +19 -6
  11. {arcgraph-0.2.0 → arcgraph-0.2.1}/docs/client-setup.md +9 -5
  12. {arcgraph-0.2.0 → arcgraph-0.2.1}/docs/external-trial-guide.md +5 -5
  13. {arcgraph-0.2.0 → arcgraph-0.2.1}/docs/package-readiness.md +1 -1
  14. {arcgraph-0.2.0 → arcgraph-0.2.1}/docs/release-tooling.md +11 -4
  15. {arcgraph-0.2.0 → arcgraph-0.2.1}/docs/release_notes/v0.2.0.md +7 -3
  16. arcgraph-0.2.1/docs/release_notes/v0.2.1.md +65 -0
  17. {arcgraph-0.2.0 → arcgraph-0.2.1}/package-lock.json +2 -2
  18. {arcgraph-0.2.0 → arcgraph-0.2.1}/package.json +1 -1
  19. {arcgraph-0.2.0 → arcgraph-0.2.1}/pyproject.toml +1 -1
  20. {arcgraph-0.2.0 → arcgraph-0.2.1}/scripts/arcgraph_external_trial_bundle.py +3 -3
  21. {arcgraph-0.2.0 → arcgraph-0.2.1}/scripts/install-arcgraph-precision-tools.ps1 +38 -13
  22. {arcgraph-0.2.0 → arcgraph-0.2.1}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
  23. {arcgraph-0.2.0 → arcgraph-0.2.1}/.github/ISSUE_TEMPLATE/config.yml +0 -0
  24. {arcgraph-0.2.0 → arcgraph-0.2.1}/.github/ISSUE_TEMPLATE/feature_request.md +0 -0
  25. {arcgraph-0.2.0 → arcgraph-0.2.1}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
  26. {arcgraph-0.2.0 → arcgraph-0.2.1}/.github/dependabot.yml +0 -0
  27. {arcgraph-0.2.0 → arcgraph-0.2.1}/.gitignore +0 -0
  28. {arcgraph-0.2.0 → arcgraph-0.2.1}/CODE_OF_CONDUCT.md +0 -0
  29. {arcgraph-0.2.0 → arcgraph-0.2.1}/CONTRIBUTING.md +0 -0
  30. {arcgraph-0.2.0 → arcgraph-0.2.1}/LICENSE +0 -0
  31. {arcgraph-0.2.0 → arcgraph-0.2.1}/SECURITY.md +0 -0
  32. {arcgraph-0.2.0 → arcgraph-0.2.1}/SUPPORT.md +0 -0
  33. {arcgraph-0.2.0 → arcgraph-0.2.1}/arcgraph/__init__.py +0 -0
  34. {arcgraph-0.2.0 → arcgraph-0.2.1}/arcgraph/adapters/__init__.py +0 -0
  35. {arcgraph-0.2.0 → arcgraph-0.2.1}/arcgraph/adapters/arq_adapter.py +0 -0
  36. {arcgraph-0.2.0 → arcgraph-0.2.1}/arcgraph/adapters/celery_adapter.py +0 -0
  37. {arcgraph-0.2.0 → arcgraph-0.2.1}/arcgraph/adapters/common.py +0 -0
  38. {arcgraph-0.2.0 → arcgraph-0.2.1}/arcgraph/adapters/django_adapter.py +0 -0
  39. {arcgraph-0.2.0 → arcgraph-0.2.1}/arcgraph/adapters/fastapi_adapter.py +0 -0
  40. {arcgraph-0.2.0 → arcgraph-0.2.1}/arcgraph/adapters/fastapi_routes.py +0 -0
  41. {arcgraph-0.2.0 → arcgraph-0.2.1}/arcgraph/adapters/logging_adapter.py +0 -0
  42. {arcgraph-0.2.0 → arcgraph-0.2.1}/arcgraph/adapters/mcp_adapter.py +0 -0
  43. {arcgraph-0.2.0 → arcgraph-0.2.1}/arcgraph/adapters/pydantic_adapter.py +0 -0
  44. {arcgraph-0.2.0 → arcgraph-0.2.1}/arcgraph/adapters/pytest_adapter.py +0 -0
  45. {arcgraph-0.2.0 → arcgraph-0.2.1}/arcgraph/adapters/pytest_collection.py +0 -0
  46. {arcgraph-0.2.0 → arcgraph-0.2.1}/arcgraph/adapters/pytest_fixtures.py +0 -0
  47. {arcgraph-0.2.0 → arcgraph-0.2.1}/arcgraph/adapters/pytest_types.py +0 -0
  48. {arcgraph-0.2.0 → arcgraph-0.2.1}/arcgraph/adapters/registry.py +0 -0
  49. {arcgraph-0.2.0 → arcgraph-0.2.1}/arcgraph/adapters/service_container_adapter.py +0 -0
  50. {arcgraph-0.2.0 → arcgraph-0.2.1}/arcgraph/adapters/sqlalchemy_adapter.py +0 -0
  51. {arcgraph-0.2.0 → arcgraph-0.2.1}/arcgraph/adapters/typer_click_adapter.py +0 -0
  52. {arcgraph-0.2.0 → arcgraph-0.2.1}/arcgraph/analyzers/__init__.py +0 -0
  53. {arcgraph-0.2.0 → arcgraph-0.2.1}/arcgraph/analyzers/bindings.py +0 -0
  54. {arcgraph-0.2.0 → arcgraph-0.2.1}/arcgraph/analyzers/callable_types.py +0 -0
  55. {arcgraph-0.2.0 → arcgraph-0.2.1}/arcgraph/analyzers/calls/__init__.py +0 -0
  56. {arcgraph-0.2.0 → arcgraph-0.2.1}/arcgraph/analyzers/calls/analyzer.py +0 -0
  57. {arcgraph-0.2.0 → arcgraph-0.2.1}/arcgraph/analyzers/calls/constants.py +0 -0
  58. {arcgraph-0.2.0 → arcgraph-0.2.1}/arcgraph/analyzers/calls/context.py +0 -0
  59. {arcgraph-0.2.0 → arcgraph-0.2.1}/arcgraph/analyzers/calls/lexical.py +0 -0
  60. {arcgraph-0.2.0 → arcgraph-0.2.1}/arcgraph/analyzers/constructor_methods.py +0 -0
  61. {arcgraph-0.2.0 → arcgraph-0.2.1}/arcgraph/analyzers/exports.py +0 -0
  62. {arcgraph-0.2.0 → arcgraph-0.2.1}/arcgraph/analyzers/external_dependencies.py +0 -0
  63. {arcgraph-0.2.0 → arcgraph-0.2.1}/arcgraph/analyzers/external_types.py +0 -0
  64. {arcgraph-0.2.0 → arcgraph-0.2.1}/arcgraph/analyzers/fastapi_dependencies.py +0 -0
  65. {arcgraph-0.2.0 → arcgraph-0.2.1}/arcgraph/analyzers/har_trace.py +0 -0
  66. {arcgraph-0.2.0 → arcgraph-0.2.1}/arcgraph/analyzers/imports.py +0 -0
  67. {arcgraph-0.2.0 → arcgraph-0.2.1}/arcgraph/analyzers/operators.py +0 -0
  68. {arcgraph-0.2.0 → arcgraph-0.2.1}/arcgraph/analyzers/otel_trace.py +0 -0
  69. {arcgraph-0.2.0 → arcgraph-0.2.1}/arcgraph/analyzers/overloads.py +0 -0
  70. {arcgraph-0.2.0 → arcgraph-0.2.1}/arcgraph/analyzers/precise_references.py +0 -0
  71. {arcgraph-0.2.0 → arcgraph-0.2.1}/arcgraph/analyzers/precision_positions.py +0 -0
  72. {arcgraph-0.2.0 → arcgraph-0.2.1}/arcgraph/analyzers/python_scopes.py +0 -0
  73. {arcgraph-0.2.0 → arcgraph-0.2.1}/arcgraph/analyzers/runtime_trace.py +0 -0
  74. {arcgraph-0.2.0 → arcgraph-0.2.1}/arcgraph/analyzers/similarity.py +0 -0
  75. {arcgraph-0.2.0 → arcgraph-0.2.1}/arcgraph/analyzers/stdlib_functions.py +0 -0
  76. {arcgraph-0.2.0 → arcgraph-0.2.1}/arcgraph/analyzers/symbols.py +0 -0
  77. {arcgraph-0.2.0 → arcgraph-0.2.1}/arcgraph/analyzers/type_unions.py +0 -0
  78. {arcgraph-0.2.0 → arcgraph-0.2.1}/arcgraph/analyzers/types.py +0 -0
  79. {arcgraph-0.2.0 → arcgraph-0.2.1}/arcgraph/assets/__init__.py +0 -0
  80. {arcgraph-0.2.0 → arcgraph-0.2.1}/arcgraph/assets/workbench/__init__.py +0 -0
  81. {arcgraph-0.2.0 → arcgraph-0.2.1}/arcgraph/assets/workbench/index.html +0 -0
  82. {arcgraph-0.2.0 → arcgraph-0.2.1}/arcgraph/assets/workbench/vendor/LICENSE.d3.txt +0 -0
  83. {arcgraph-0.2.0 → arcgraph-0.2.1}/arcgraph/assets/workbench/vendor/d3.v7.min.js +0 -0
  84. {arcgraph-0.2.0 → arcgraph-0.2.1}/arcgraph/change/__init__.py +0 -0
  85. {arcgraph-0.2.0 → arcgraph-0.2.1}/arcgraph/change/baseline.py +0 -0
  86. {arcgraph-0.2.0 → arcgraph-0.2.1}/arcgraph/change/changed_regions.py +0 -0
  87. {arcgraph-0.2.0 → arcgraph-0.2.1}/arcgraph/change/contracts.py +0 -0
  88. {arcgraph-0.2.0 → arcgraph-0.2.1}/arcgraph/change/errors.py +0 -0
  89. {arcgraph-0.2.0 → arcgraph-0.2.1}/arcgraph/change/evidence.py +0 -0
  90. {arcgraph-0.2.0 → arcgraph-0.2.1}/arcgraph/change/graph_delta.py +0 -0
  91. {arcgraph-0.2.0 → arcgraph-0.2.1}/arcgraph/change/identities.py +0 -0
  92. {arcgraph-0.2.0 → arcgraph-0.2.1}/arcgraph/change/paths.py +0 -0
  93. {arcgraph-0.2.0 → arcgraph-0.2.1}/arcgraph/change/pins.py +0 -0
  94. {arcgraph-0.2.0 → arcgraph-0.2.1}/arcgraph/change/planner.py +0 -0
  95. {arcgraph-0.2.0 → arcgraph-0.2.1}/arcgraph/change/protected_surfaces.py +0 -0
  96. {arcgraph-0.2.0 → arcgraph-0.2.1}/arcgraph/change/provider.py +0 -0
  97. {arcgraph-0.2.0 → arcgraph-0.2.1}/arcgraph/change/service.py +0 -0
  98. {arcgraph-0.2.0 → arcgraph-0.2.1}/arcgraph/change/source_provider.py +0 -0
  99. {arcgraph-0.2.0 → arcgraph-0.2.1}/arcgraph/change/store.py +0 -0
  100. {arcgraph-0.2.0 → arcgraph-0.2.1}/arcgraph/change/trusted_runners.py +0 -0
  101. {arcgraph-0.2.0 → arcgraph-0.2.1}/arcgraph/change/verdicts.py +0 -0
  102. {arcgraph-0.2.0 → arcgraph-0.2.1}/arcgraph/change/verification_plan.py +0 -0
  103. {arcgraph-0.2.0 → arcgraph-0.2.1}/arcgraph/change/verifier.py +0 -0
  104. {arcgraph-0.2.0 → arcgraph-0.2.1}/arcgraph/core/__init__.py +0 -0
  105. {arcgraph-0.2.0 → arcgraph-0.2.1}/arcgraph/core/_structure_worker.py +0 -0
  106. {arcgraph-0.2.0 → arcgraph-0.2.1}/arcgraph/core/artifact_inputs.py +0 -0
  107. {arcgraph-0.2.0 → arcgraph-0.2.1}/arcgraph/core/assurance.py +0 -0
  108. {arcgraph-0.2.0 → arcgraph-0.2.1}/arcgraph/core/binding_metrics.py +0 -0
  109. {arcgraph-0.2.0 → arcgraph-0.2.1}/arcgraph/core/build_inputs.py +0 -0
  110. {arcgraph-0.2.0 → arcgraph-0.2.1}/arcgraph/core/cleanup.py +0 -0
  111. {arcgraph-0.2.0 → arcgraph-0.2.1}/arcgraph/core/confidence_profiles.py +0 -0
  112. {arcgraph-0.2.0 → arcgraph-0.2.1}/arcgraph/core/evidence_manifest.py +0 -0
  113. {arcgraph-0.2.0 → arcgraph-0.2.1}/arcgraph/core/expression_kinds.py +0 -0
  114. {arcgraph-0.2.0 → arcgraph-0.2.1}/arcgraph/core/fact_storage.py +0 -0
  115. {arcgraph-0.2.0 → arcgraph-0.2.1}/arcgraph/core/force_graph_export.py +0 -0
  116. {arcgraph-0.2.0 → arcgraph-0.2.1}/arcgraph/core/freshness.py +0 -0
  117. {arcgraph-0.2.0 → arcgraph-0.2.1}/arcgraph/core/graph_store.py +0 -0
  118. {arcgraph-0.2.0 → arcgraph-0.2.1}/arcgraph/core/ids.py +0 -0
  119. {arcgraph-0.2.0 → arcgraph-0.2.1}/arcgraph/core/language_tiers.py +0 -0
  120. {arcgraph-0.2.0 → arcgraph-0.2.1}/arcgraph/core/merge.py +0 -0
  121. {arcgraph-0.2.0 → arcgraph-0.2.1}/arcgraph/core/metadata.py +0 -0
  122. {arcgraph-0.2.0 → arcgraph-0.2.1}/arcgraph/core/operation_lock.py +0 -0
  123. {arcgraph-0.2.0 → arcgraph-0.2.1}/arcgraph/core/passes.py +0 -0
  124. {arcgraph-0.2.0 → arcgraph-0.2.1}/arcgraph/core/payload_policy.py +0 -0
  125. {arcgraph-0.2.0 → arcgraph-0.2.1}/arcgraph/core/precise_references.py +0 -0
  126. {arcgraph-0.2.0 → arcgraph-0.2.1}/arcgraph/core/project_environment.py +0 -0
  127. {arcgraph-0.2.0 → arcgraph-0.2.1}/arcgraph/core/query_engine.py +0 -0
  128. {arcgraph-0.2.0 → arcgraph-0.2.1}/arcgraph/core/recovery.py +0 -0
  129. {arcgraph-0.2.0 → arcgraph-0.2.1}/arcgraph/core/scanner.py +0 -0
  130. {arcgraph-0.2.0 → arcgraph-0.2.1}/arcgraph/core/schemas.py +0 -0
  131. {arcgraph-0.2.0 → arcgraph-0.2.1}/arcgraph/core/semantic.py +0 -0
  132. {arcgraph-0.2.0 → arcgraph-0.2.1}/arcgraph/core/semantic_metrics.py +0 -0
  133. {arcgraph-0.2.0 → arcgraph-0.2.1}/arcgraph/core/sharing_retry.py +0 -0
  134. {arcgraph-0.2.0 → arcgraph-0.2.1}/arcgraph/core/storage_codec.py +0 -0
  135. {arcgraph-0.2.0 → arcgraph-0.2.1}/arcgraph/core/structural.py +0 -0
  136. {arcgraph-0.2.0 → arcgraph-0.2.1}/arcgraph/core/structure.py +0 -0
  137. {arcgraph-0.2.0 → arcgraph-0.2.1}/arcgraph/core/target_resolver.py +0 -0
  138. {arcgraph-0.2.0 → arcgraph-0.2.1}/arcgraph/core/type_metrics.py +0 -0
  139. {arcgraph-0.2.0 → arcgraph-0.2.1}/arcgraph/core/unresolved_classification.py +0 -0
  140. {arcgraph-0.2.0 → arcgraph-0.2.1}/arcgraph/core/utils.py +0 -0
  141. {arcgraph-0.2.0 → arcgraph-0.2.1}/arcgraph/core/visual_contract.py +0 -0
  142. {arcgraph-0.2.0 → arcgraph-0.2.1}/arcgraph/core/visual_slice_engine.py +0 -0
  143. {arcgraph-0.2.0 → arcgraph-0.2.1}/arcgraph/interfaces/__init__.py +0 -0
  144. {arcgraph-0.2.0 → arcgraph-0.2.1}/arcgraph/interfaces/agent_capabilities.py +0 -0
  145. {arcgraph-0.2.0 → arcgraph-0.2.1}/arcgraph/interfaces/agent_help.py +0 -0
  146. {arcgraph-0.2.0 → arcgraph-0.2.1}/arcgraph/interfaces/benchmark.py +0 -0
  147. {arcgraph-0.2.0 → arcgraph-0.2.1}/arcgraph/interfaces/ci.py +0 -0
  148. {arcgraph-0.2.0 → arcgraph-0.2.1}/arcgraph/interfaces/cli_change.py +0 -0
  149. {arcgraph-0.2.0 → arcgraph-0.2.1}/arcgraph/interfaces/cli_feedback.py +0 -0
  150. {arcgraph-0.2.0 → arcgraph-0.2.1}/arcgraph/interfaces/cli_ops.py +0 -0
  151. {arcgraph-0.2.0 → arcgraph-0.2.1}/arcgraph/interfaces/cli_trial.py +0 -0
  152. {arcgraph-0.2.0 → arcgraph-0.2.1}/arcgraph/interfaces/cli_visual.py +0 -0
  153. {arcgraph-0.2.0 → arcgraph-0.2.1}/arcgraph/interfaces/cli_workspace.py +0 -0
  154. {arcgraph-0.2.0 → arcgraph-0.2.1}/arcgraph/interfaces/client_setup.py +0 -0
  155. {arcgraph-0.2.0 → arcgraph-0.2.1}/arcgraph/interfaces/human_output.py +0 -0
  156. {arcgraph-0.2.0 → arcgraph-0.2.1}/arcgraph/interfaces/local_state.py +0 -0
  157. {arcgraph-0.2.0 → arcgraph-0.2.1}/arcgraph/interfaces/mcp_server.py +0 -0
  158. {arcgraph-0.2.0 → arcgraph-0.2.1}/arcgraph/interfaces/mcp_tools.py +0 -0
  159. {arcgraph-0.2.0 → arcgraph-0.2.1}/arcgraph/interfaces/metrics.py +0 -0
  160. {arcgraph-0.2.0 → arcgraph-0.2.1}/arcgraph/interfaces/ops.py +0 -0
  161. {arcgraph-0.2.0 → arcgraph-0.2.1}/arcgraph/interfaces/project_probe.py +0 -0
  162. {arcgraph-0.2.0 → arcgraph-0.2.1}/arcgraph/interfaces/reports.py +0 -0
  163. {arcgraph-0.2.0 → arcgraph-0.2.1}/arcgraph/interfaces/stdio_encoding.py +0 -0
  164. {arcgraph-0.2.0 → arcgraph-0.2.1}/arcgraph/interfaces/trace.py +0 -0
  165. {arcgraph-0.2.0 → arcgraph-0.2.1}/arcgraph/interfaces/trace_recorder.py +0 -0
  166. {arcgraph-0.2.0 → arcgraph-0.2.1}/arcgraph/interfaces/trial_feedback.py +0 -0
  167. {arcgraph-0.2.0 → arcgraph-0.2.1}/arcgraph/interfaces/trial_setup.py +0 -0
  168. {arcgraph-0.2.0 → arcgraph-0.2.1}/arcgraph/interfaces/visual_server.py +0 -0
  169. {arcgraph-0.2.0 → arcgraph-0.2.1}/arcgraph/interfaces/visual_slice.py +0 -0
  170. {arcgraph-0.2.0 → arcgraph-0.2.1}/arcgraph/interfaces/visual_smoke.py +0 -0
  171. {arcgraph-0.2.0 → arcgraph-0.2.1}/arcgraph/interfaces/workbench.py +0 -0
  172. {arcgraph-0.2.0 → arcgraph-0.2.1}/arcgraph/interfaces/workspace.py +0 -0
  173. {arcgraph-0.2.0 → arcgraph-0.2.1}/arcgraph/pipeline/__init__.py +0 -0
  174. {arcgraph-0.2.0 → arcgraph-0.2.1}/arcgraph/pipeline/contracts.py +0 -0
  175. {arcgraph-0.2.0 → arcgraph-0.2.1}/arcgraph/pipeline/external_frontend.py +0 -0
  176. {arcgraph-0.2.0 → arcgraph-0.2.1}/arcgraph/pipeline/external_l3_frontends.py +0 -0
  177. {arcgraph-0.2.0 → arcgraph-0.2.1}/arcgraph/pipeline/external_protocol.py +0 -0
  178. {arcgraph-0.2.0 → arcgraph-0.2.1}/arcgraph/pipeline/frontends.py +0 -0
  179. {arcgraph-0.2.0 → arcgraph-0.2.1}/arcgraph/pipeline/indexer.py +0 -0
  180. {arcgraph-0.2.0 → arcgraph-0.2.1}/arcgraph/pipeline/openapi_frontend.py +0 -0
  181. {arcgraph-0.2.0 → arcgraph-0.2.1}/arcgraph/pipeline/python_frontend.py +0 -0
  182. {arcgraph-0.2.0 → arcgraph-0.2.1}/arcgraph/pipeline/python_reuse.py +0 -0
  183. {arcgraph-0.2.0 → arcgraph-0.2.1}/arcgraph/pipeline/reindexer.py +0 -0
  184. {arcgraph-0.2.0 → arcgraph-0.2.1}/arcgraph/pipeline/scip_frontend.py +0 -0
  185. {arcgraph-0.2.0 → arcgraph-0.2.1}/arcgraph/pipeline/typescript_extractor/declarations.mjs +0 -0
  186. {arcgraph-0.2.0 → arcgraph-0.2.1}/arcgraph/pipeline/typescript_extractor/edges.mjs +0 -0
  187. {arcgraph-0.2.0 → arcgraph-0.2.1}/arcgraph/pipeline/typescript_extractor/graph_primitives.mjs +0 -0
  188. {arcgraph-0.2.0 → arcgraph-0.2.1}/arcgraph/pipeline/typescript_extractor/module_resolution.mjs +0 -0
  189. {arcgraph-0.2.0 → arcgraph-0.2.1}/arcgraph/pipeline/typescript_extractor/runtime.mjs +0 -0
  190. {arcgraph-0.2.0 → arcgraph-0.2.1}/arcgraph/pipeline/typescript_extractor/similarity.mjs +0 -0
  191. {arcgraph-0.2.0 → arcgraph-0.2.1}/arcgraph/pipeline/typescript_extractor/similarity_runner.mjs +0 -0
  192. {arcgraph-0.2.0 → arcgraph-0.2.1}/arcgraph/pipeline/typescript_extractor/sources.mjs +0 -0
  193. {arcgraph-0.2.0 → arcgraph-0.2.1}/arcgraph/pipeline/typescript_extractor.mjs +0 -0
  194. {arcgraph-0.2.0 → arcgraph-0.2.1}/arcgraph/pipeline/typescript_frameworks.py +0 -0
  195. {arcgraph-0.2.0 → arcgraph-0.2.1}/arcgraph/pipeline/typescript_frontend.py +0 -0
  196. {arcgraph-0.2.0 → arcgraph-0.2.1}/arcgraph/pipeline/typescript_references.mjs +0 -0
  197. {arcgraph-0.2.0 → arcgraph-0.2.1}/arcgraph/providers/__init__.py +0 -0
  198. {arcgraph-0.2.0 → arcgraph-0.2.1}/arcgraph/providers/context_provider.py +0 -0
  199. {arcgraph-0.2.0 → arcgraph-0.2.1}/arcgraph/providers/flow_payload.py +0 -0
  200. {arcgraph-0.2.0 → arcgraph-0.2.1}/arcgraph/providers/memory_connector.py +0 -0
  201. {arcgraph-0.2.0 → arcgraph-0.2.1}/arcgraph/providers/orchestrator.py +0 -0
  202. {arcgraph-0.2.0 → arcgraph-0.2.1}/arcgraph/providers/relationship_payload.py +0 -0
  203. {arcgraph-0.2.0 → arcgraph-0.2.1}/arcgraph/providers/risk_provider.py +0 -0
  204. {arcgraph-0.2.0 → arcgraph-0.2.1}/arcgraph/providers/why_provider.py +0 -0
  205. {arcgraph-0.2.0 → arcgraph-0.2.1}/arcgraph/semantic/__init__.py +0 -0
  206. {arcgraph-0.2.0 → arcgraph-0.2.1}/arcgraph/semantic/anchors.py +0 -0
  207. {arcgraph-0.2.0 → arcgraph-0.2.1}/arcgraph/semantic/artifact_inputs.py +0 -0
  208. {arcgraph-0.2.0 → arcgraph-0.2.1}/arcgraph/semantic/backends.py +0 -0
  209. {arcgraph-0.2.0 → arcgraph-0.2.1}/arcgraph/semantic/build.py +0 -0
  210. {arcgraph-0.2.0 → arcgraph-0.2.1}/arcgraph/semantic/contract.py +0 -0
  211. {arcgraph-0.2.0 → arcgraph-0.2.1}/arcgraph/semantic/declaration_policy.py +0 -0
  212. {arcgraph-0.2.0 → arcgraph-0.2.1}/arcgraph/semantic/disk_structure.py +0 -0
  213. {arcgraph-0.2.0 → arcgraph-0.2.1}/arcgraph/semantic/external_targets.py +0 -0
  214. {arcgraph-0.2.0 → arcgraph-0.2.1}/arcgraph/semantic/frozen.py +0 -0
  215. {arcgraph-0.2.0 → arcgraph-0.2.1}/arcgraph/semantic/graph_projection.py +0 -0
  216. {arcgraph-0.2.0 → arcgraph-0.2.1}/arcgraph/semantic/implementation.py +0 -0
  217. {arcgraph-0.2.0 → arcgraph-0.2.1}/arcgraph/semantic/import_scan.py +0 -0
  218. {arcgraph-0.2.0 → arcgraph-0.2.1}/arcgraph/semantic/install.py +0 -0
  219. {arcgraph-0.2.0 → arcgraph-0.2.1}/arcgraph/semantic/journal.py +0 -0
  220. {arcgraph-0.2.0 → arcgraph-0.2.1}/arcgraph/semantic/json_stream.py +0 -0
  221. {arcgraph-0.2.0 → arcgraph-0.2.1}/arcgraph/semantic/lsp.py +0 -0
  222. {arcgraph-0.2.0 → arcgraph-0.2.1}/arcgraph/semantic/projection.py +0 -0
  223. {arcgraph-0.2.0 → arcgraph-0.2.1}/arcgraph/semantic/public_owners.py +0 -0
  224. {arcgraph-0.2.0 → arcgraph-0.2.1}/arcgraph/semantic/records.py +0 -0
  225. {arcgraph-0.2.0 → arcgraph-0.2.1}/arcgraph/semantic/reuse.py +0 -0
  226. {arcgraph-0.2.0 → arcgraph-0.2.1}/arcgraph/semantic/runtime.py +0 -0
  227. {arcgraph-0.2.0 → arcgraph-0.2.1}/arcgraph/semantic/search_paths.py +0 -0
  228. {arcgraph-0.2.0 → arcgraph-0.2.1}/arcgraph/semantic/snapshot.py +0 -0
  229. {arcgraph-0.2.0 → arcgraph-0.2.1}/arcgraph/semantic/static_writes.py +0 -0
  230. {arcgraph-0.2.0 → arcgraph-0.2.1}/arcgraph/semantic/structure_facts.py +0 -0
  231. {arcgraph-0.2.0 → arcgraph-0.2.1}/arcgraph/semantic/structure_provider.py +0 -0
  232. {arcgraph-0.2.0 → arcgraph-0.2.1}/arcgraph/semantic/transport.py +0 -0
  233. {arcgraph-0.2.0 → arcgraph-0.2.1}/arcgraph/semantic/uri_paths.py +0 -0
  234. {arcgraph-0.2.0 → arcgraph-0.2.1}/arcgraph/version_info.py +0 -0
  235. {arcgraph-0.2.0 → arcgraph-0.2.1}/docs/agent-reading-guide.md +0 -0
  236. {arcgraph-0.2.0 → arcgraph-0.2.1}/docs/architecture.md +0 -0
  237. {arcgraph-0.2.0 → arcgraph-0.2.1}/docs/change-preflight.md +0 -0
  238. {arcgraph-0.2.0 → arcgraph-0.2.1}/docs/change-safety.md +0 -0
  239. {arcgraph-0.2.0 → arcgraph-0.2.1}/docs/clean-checkout-smoke.md +0 -0
  240. {arcgraph-0.2.0 → arcgraph-0.2.1}/docs/examples/agent-context.md +0 -0
  241. {arcgraph-0.2.0 → arcgraph-0.2.1}/docs/examples/evidence-inputs.md +0 -0
  242. {arcgraph-0.2.0 → arcgraph-0.2.1}/docs/examples/external-l3-payload.md +0 -0
  243. {arcgraph-0.2.0 → arcgraph-0.2.1}/docs/examples/impact-analysis.md +0 -0
  244. {arcgraph-0.2.0 → arcgraph-0.2.1}/docs/examples/mcp_readonly_host.py +0 -0
  245. {arcgraph-0.2.0 → arcgraph-0.2.1}/docs/examples/source-checkout-smoke.md +0 -0
  246. {arcgraph-0.2.0 → arcgraph-0.2.1}/docs/language-support.md +0 -0
  247. {arcgraph-0.2.0 → arcgraph-0.2.1}/docs/mcp-usage.md +0 -0
  248. {arcgraph-0.2.0 → arcgraph-0.2.1}/docs/provenance.md +0 -0
  249. {arcgraph-0.2.0 → arcgraph-0.2.1}/docs/release_notes/v0.1.0-rc10.md +0 -0
  250. {arcgraph-0.2.0 → arcgraph-0.2.1}/docs/release_notes/v0.1.0-rc7.md +0 -0
  251. {arcgraph-0.2.0 → arcgraph-0.2.1}/docs/release_notes/v0.1.0-rc8.md +0 -0
  252. {arcgraph-0.2.0 → arcgraph-0.2.1}/docs/release_notes/v0.1.0-rc9.md +0 -0
  253. {arcgraph-0.2.0 → arcgraph-0.2.1}/docs/release_notes/v0.1.0.md +0 -0
  254. {arcgraph-0.2.0 → arcgraph-0.2.1}/docs/runbook.md +0 -0
  255. {arcgraph-0.2.0 → arcgraph-0.2.1}/hatch_build.py +0 -0
  256. {arcgraph-0.2.0 → arcgraph-0.2.1}/scripts/arcgraph.py +0 -0
  257. {arcgraph-0.2.0 → arcgraph-0.2.1}/scripts/arcgraph_clean_checkout_smoke.py +0 -0
  258. {arcgraph-0.2.0 → arcgraph-0.2.1}/scripts/arcgraph_mcp_protocol_probe.py +0 -0
  259. {arcgraph-0.2.0 → arcgraph-0.2.1}/scripts/arcgraph_multi_project_trial_probe.py +0 -0
  260. {arcgraph-0.2.0 → arcgraph-0.2.1}/scripts/arcgraph_package_readiness_smoke.py +0 -0
  261. {arcgraph-0.2.0 → arcgraph-0.2.1}/scripts/arcgraph_release_candidate_check.py +0 -0
  262. {arcgraph-0.2.0 → arcgraph-0.2.1}/scripts/arcgraph_release_gate.py +0 -0
  263. {arcgraph-0.2.0 → arcgraph-0.2.1}/scripts/arcgraph_source_checkout_smoke.py +0 -0
  264. {arcgraph-0.2.0 → arcgraph-0.2.1}/scripts/arcgraph_text_encoding_check.py +0 -0
  265. {arcgraph-0.2.0 → arcgraph-0.2.1}/scripts/arcgraph_trial_contract.py +0 -0
  266. {arcgraph-0.2.0 → arcgraph-0.2.1}/scripts/arcgraph_wheel_policy.py +0 -0
  267. {arcgraph-0.2.0 → arcgraph-0.2.1}/scripts/semantic_shadow.py +0 -0
  268. {arcgraph-0.2.0 → arcgraph-0.2.1}/viz/.gitignore +0 -0
  269. {arcgraph-0.2.0 → arcgraph-0.2.1}/viz/extract_graph.py +0 -0
  270. {arcgraph-0.2.0 → arcgraph-0.2.1}/viz/index.html +0 -0
@@ -37,7 +37,7 @@ jobs:
37
37
  python-version: '3.11'
38
38
  cache: pip
39
39
 
40
- - uses: actions/setup-node@820762786026740c76f36085b0efc47a31fe5020 # v7
40
+ - uses: actions/setup-node@949feb2413d6458794dcd2491c4babbbce0c15c1 # v7
41
41
  with:
42
42
  node-version: '20'
43
43
  cache: npm
@@ -78,7 +78,7 @@ jobs:
78
78
 
79
79
  - name: Upload coverage evidence
80
80
  if: always()
81
- uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7
81
+ uses: actions/upload-artifact@cf430e030ddbb5b0abf93d22962f4752f3646cd9 # v7
82
82
  with:
83
83
  name: coverage-python-3.11
84
84
  path: output/arcgraph/coverage.xml
@@ -118,7 +118,7 @@ jobs:
118
118
  python-version: ${{ matrix.python }}
119
119
  cache: pip
120
120
 
121
- - uses: actions/setup-node@820762786026740c76f36085b0efc47a31fe5020 # v7
121
+ - uses: actions/setup-node@949feb2413d6458794dcd2491c4babbbce0c15c1 # v7
122
122
  with:
123
123
  node-version: '20'
124
124
  cache: npm
@@ -178,7 +178,7 @@ jobs:
178
178
  python-version: ${{ matrix.python }}
179
179
  cache: pip
180
180
 
181
- - uses: actions/setup-node@820762786026740c76f36085b0efc47a31fe5020 # v7
181
+ - uses: actions/setup-node@949feb2413d6458794dcd2491c4babbbce0c15c1 # v7
182
182
  with:
183
183
  node-version: '20'
184
184
  cache: npm
@@ -195,7 +195,7 @@ jobs:
195
195
 
196
196
  - name: Upload package provenance
197
197
  if: always()
198
- uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7
198
+ uses: actions/upload-artifact@cf430e030ddbb5b0abf93d22962f4752f3646cd9 # v7
199
199
  with:
200
200
  name: package-readiness-${{ matrix.os }}-py${{ matrix.python }}-${{ matrix.mcp_line }}
201
201
  path: output/release/package-readiness.json
@@ -225,7 +225,7 @@ jobs:
225
225
  python-version: '3.11'
226
226
  cache: pip
227
227
 
228
- - uses: actions/setup-node@820762786026740c76f36085b0efc47a31fe5020 # v7
228
+ - uses: actions/setup-node@949feb2413d6458794dcd2491c4babbbce0c15c1 # v7
229
229
  with:
230
230
  node-version: ${{ matrix.node }}
231
231
  cache: npm
@@ -259,7 +259,7 @@ jobs:
259
259
  python-version: '3.12'
260
260
  cache: pip
261
261
 
262
- - uses: actions/setup-node@820762786026740c76f36085b0efc47a31fe5020 # v7
262
+ - uses: actions/setup-node@949feb2413d6458794dcd2491c4babbbce0c15c1 # v7
263
263
  with:
264
264
  node-version: '20'
265
265
  cache: npm
@@ -290,7 +290,7 @@ jobs:
290
290
 
291
291
  - name: Upload security evidence
292
292
  if: always()
293
- uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7
293
+ uses: actions/upload-artifact@cf430e030ddbb5b0abf93d22962f4752f3646cd9 # v7
294
294
  with:
295
295
  name: security-evidence
296
296
  path: output/security
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: arcgraph
3
- Version: 0.2.0
3
+ Version: 0.2.1
4
4
  Summary: Local-first code semantic graph engine for AI agents and code intelligence.
5
5
  Project-URL: Homepage, https://github.com/glyphevo/arcgraph
6
6
  Project-URL: Repository, https://github.com/glyphevo/arcgraph
@@ -80,7 +80,7 @@ With ArcGraph:
80
80
 
81
81
  ArcGraph is published on PyPI, and
82
82
  [RELEASE_NOTES.md](https://github.com/glyphevo/arcgraph/blob/main/RELEASE_NOTES.md)
83
- lists the published versions. This source version, 0.2.0, is a beta release.
83
+ lists the published versions. This source version, 0.2.1, is a beta release.
84
84
  Install ArcGraph into a dedicated virtual environment or tool environment and
85
85
  reuse that one `arcgraph` executable across projects:
86
86
 
@@ -94,13 +94,13 @@ or, with uv:
94
94
  uv tool install --python 3.11 "arcgraph[mcp]"
95
95
  ```
96
96
 
97
- 0.1.0 on PyPI requires Python 3.11 or 3.12; pip refuses other versions. The
98
- source on `main` (0.2.0) is tested on and requires 3.11–3.14. Pin the exact version you tested, for example `arcgraph[mcp]==0.1.0`. An unpinned install
97
+ 0.2.0 requires Python 3.11 to 3.14; pip refuses other versions (0.1.0 required
98
+ 3.11 or 3.12). Pin the exact version you tested, for example `arcgraph[mcp]==0.2.0`. An unpinned install
99
99
  picks the newest version on PyPI that is not a pre-release; pip installs one of the earlier 0.1.0rc7–0.1.0rc10 pre-releases
100
100
  only when you name its version or pass `--pre`. The `mcp` extra is only needed
101
- to run the MCP server. Installs of 0.1.0 from PyPI were tested: pip with the
101
+ to run the MCP server. Installs of 0.2.0 from PyPI were tested: pip with the
102
102
  `mcp` extra on macOS, Windows and Linux (Ubuntu 24.04 under WSL), each with
103
- Python 3.11 and 3.12, and `uv tool install --python 3.11` on macOS.
103
+ Python 3.11, 3.12, 3.13 and 3.14, and `uv tool install --python 3.11` on macOS.
104
104
  `arcgraph version --json` reports the commit the installed copy was built from.
105
105
 
106
106
  To install the development version from this repository instead, replace the
@@ -121,8 +121,8 @@ commit you are using.
121
121
 
122
122
  Requirements:
123
123
 
124
- - Python 3.11 or 3.12 for 0.1.0 from PyPI; 3.11 to 3.14 for the source on
125
- `main`.
124
+ - Python 3.11 to 3.14 for 0.2.0 and the source on `main`; 3.11 or 3.12 for
125
+ 0.1.0 from PyPI.
126
126
  - Node.js and a resolvable TypeScript compiler API when analyzing
127
127
  TypeScript/JavaScript projects. The Python wheel includes ArcGraph's `.mjs`
128
128
  extractor but does not include `node_modules/typescript`; provide the runtime
@@ -240,7 +240,10 @@ python scripts/arcgraph.py <command>
240
240
  ```
241
241
 
242
242
  On a clean Windows machine, install Python 3.11 to 3.14 and Node.js/npm first. Optional
243
- precision tools can be installed with:
243
+ precision tools can be installed with the script below. It installs `pyright` and, since
244
+ scip v0.7.1 publishes no Windows binary, builds `scip.exe` from a clone of the v0.7.1 tag,
245
+ so it also needs Go and Git. `scip-python` 0.6.6 fails while loading on native Windows;
246
+ run `arcgraph precision scip-python` in WSL with the macOS/Linux steps below.
244
247
 
245
248
  ```powershell
246
249
  powershell -ExecutionPolicy Bypass -File scripts\install-arcgraph-precision-tools.ps1
@@ -252,14 +255,28 @@ tools directly:
252
255
 
253
256
  ```bash
254
257
  npm install -g @sourcegraph/scip-python@0.6.6 pyright@1.1.409
255
- go install github.com/scip-code/scip/cmd/scip@v0.7.1
256
258
  ```
257
259
 
258
- The first command provides `scip-python`, `pyright`, and `pyright-langserver`;
259
- the second requires a local Go toolchain and provides `scip`. Then pass the
260
- generated JSON artifacts to `arcgraph build`. The GitHub Actions `CI`
261
- workflow does not install these tools, so it is not a fallback for generating
262
- this evidence.
260
+ The first command provides `scip-python`, `pyright`, and `pyright-langserver`.
261
+ `scip` is not installable with `go install package@version`: scip v0.7.1
262
+ declares a `replace` directive in its `go.mod`, and the Go toolchain refuses
263
+ that for a versioned install. Download the prebuilt binary for your platform
264
+ from the [scip v0.7.1 release](https://github.com/scip-code/scip/releases/tag/v0.7.1)
265
+ and verify the published checksum:
266
+
267
+ ```bash
268
+ curl -fsSLO https://github.com/scip-code/scip/releases/download/v0.7.1/scip-darwin-arm64.tar.gz
269
+ curl -fsSLO https://github.com/scip-code/scip/releases/download/v0.7.1/scip-darwin-arm64.tar.gz.sha256
270
+ shasum -a 256 -c scip-darwin-arm64.tar.gz.sha256
271
+ tar -xzf scip-darwin-arm64.tar.gz
272
+ ```
273
+
274
+ The same release publishes `scip-darwin-amd64.tar.gz`,
275
+ `scip-linux-amd64.tar.gz` and `scip-linux-arm64.tar.gz`, each with its own
276
+ `.sha256` file; use `sha256sum -c` instead of `shasum -a 256 -c` on Linux.
277
+ The extracted `scip` binary provides `scip`. Then pass the generated JSON
278
+ artifacts to `arcgraph build`. The GitHub Actions `CI` workflow does not
279
+ install these tools, so it is not a fallback for generating this evidence.
263
280
 
264
281
  ## Quickstart
265
282
 
@@ -38,7 +38,7 @@ With ArcGraph:
38
38
 
39
39
  ArcGraph is published on PyPI, and
40
40
  [RELEASE_NOTES.md](https://github.com/glyphevo/arcgraph/blob/main/RELEASE_NOTES.md)
41
- lists the published versions. This source version, 0.2.0, is a beta release.
41
+ lists the published versions. This source version, 0.2.1, is a beta release.
42
42
  Install ArcGraph into a dedicated virtual environment or tool environment and
43
43
  reuse that one `arcgraph` executable across projects:
44
44
 
@@ -52,13 +52,13 @@ or, with uv:
52
52
  uv tool install --python 3.11 "arcgraph[mcp]"
53
53
  ```
54
54
 
55
- 0.1.0 on PyPI requires Python 3.11 or 3.12; pip refuses other versions. The
56
- source on `main` (0.2.0) is tested on and requires 3.11–3.14. Pin the exact version you tested, for example `arcgraph[mcp]==0.1.0`. An unpinned install
55
+ 0.2.0 requires Python 3.11 to 3.14; pip refuses other versions (0.1.0 required
56
+ 3.11 or 3.12). Pin the exact version you tested, for example `arcgraph[mcp]==0.2.0`. An unpinned install
57
57
  picks the newest version on PyPI that is not a pre-release; pip installs one of the earlier 0.1.0rc7–0.1.0rc10 pre-releases
58
58
  only when you name its version or pass `--pre`. The `mcp` extra is only needed
59
- to run the MCP server. Installs of 0.1.0 from PyPI were tested: pip with the
59
+ to run the MCP server. Installs of 0.2.0 from PyPI were tested: pip with the
60
60
  `mcp` extra on macOS, Windows and Linux (Ubuntu 24.04 under WSL), each with
61
- Python 3.11 and 3.12, and `uv tool install --python 3.11` on macOS.
61
+ Python 3.11, 3.12, 3.13 and 3.14, and `uv tool install --python 3.11` on macOS.
62
62
  `arcgraph version --json` reports the commit the installed copy was built from.
63
63
 
64
64
  To install the development version from this repository instead, replace the
@@ -79,8 +79,8 @@ commit you are using.
79
79
 
80
80
  Requirements:
81
81
 
82
- - Python 3.11 or 3.12 for 0.1.0 from PyPI; 3.11 to 3.14 for the source on
83
- `main`.
82
+ - Python 3.11 to 3.14 for 0.2.0 and the source on `main`; 3.11 or 3.12 for
83
+ 0.1.0 from PyPI.
84
84
  - Node.js and a resolvable TypeScript compiler API when analyzing
85
85
  TypeScript/JavaScript projects. The Python wheel includes ArcGraph's `.mjs`
86
86
  extractor but does not include `node_modules/typescript`; provide the runtime
@@ -198,7 +198,10 @@ python scripts/arcgraph.py <command>
198
198
  ```
199
199
 
200
200
  On a clean Windows machine, install Python 3.11 to 3.14 and Node.js/npm first. Optional
201
- precision tools can be installed with:
201
+ precision tools can be installed with the script below. It installs `pyright` and, since
202
+ scip v0.7.1 publishes no Windows binary, builds `scip.exe` from a clone of the v0.7.1 tag,
203
+ so it also needs Go and Git. `scip-python` 0.6.6 fails while loading on native Windows;
204
+ run `arcgraph precision scip-python` in WSL with the macOS/Linux steps below.
202
205
 
203
206
  ```powershell
204
207
  powershell -ExecutionPolicy Bypass -File scripts\install-arcgraph-precision-tools.ps1
@@ -210,14 +213,28 @@ tools directly:
210
213
 
211
214
  ```bash
212
215
  npm install -g @sourcegraph/scip-python@0.6.6 pyright@1.1.409
213
- go install github.com/scip-code/scip/cmd/scip@v0.7.1
214
216
  ```
215
217
 
216
- The first command provides `scip-python`, `pyright`, and `pyright-langserver`;
217
- the second requires a local Go toolchain and provides `scip`. Then pass the
218
- generated JSON artifacts to `arcgraph build`. The GitHub Actions `CI`
219
- workflow does not install these tools, so it is not a fallback for generating
220
- this evidence.
218
+ The first command provides `scip-python`, `pyright`, and `pyright-langserver`.
219
+ `scip` is not installable with `go install package@version`: scip v0.7.1
220
+ declares a `replace` directive in its `go.mod`, and the Go toolchain refuses
221
+ that for a versioned install. Download the prebuilt binary for your platform
222
+ from the [scip v0.7.1 release](https://github.com/scip-code/scip/releases/tag/v0.7.1)
223
+ and verify the published checksum:
224
+
225
+ ```bash
226
+ curl -fsSLO https://github.com/scip-code/scip/releases/download/v0.7.1/scip-darwin-arm64.tar.gz
227
+ curl -fsSLO https://github.com/scip-code/scip/releases/download/v0.7.1/scip-darwin-arm64.tar.gz.sha256
228
+ shasum -a 256 -c scip-darwin-arm64.tar.gz.sha256
229
+ tar -xzf scip-darwin-arm64.tar.gz
230
+ ```
231
+
232
+ The same release publishes `scip-darwin-amd64.tar.gz`,
233
+ `scip-linux-amd64.tar.gz` and `scip-linux-arm64.tar.gz`, each with its own
234
+ `.sha256` file; use `sha256sum -c` instead of `shasum -a 256 -c` on Linux.
235
+ The extracted `scip` binary provides `scip`. Then pass the generated JSON
236
+ artifacts to `arcgraph build`. The GitHub Actions `CI` workflow does not
237
+ install these tools, so it is not a fallback for generating this evidence.
221
238
 
222
239
  ## Quickstart
223
240
 
@@ -5,7 +5,8 @@ notes themselves are the only place their content is written down.
5
5
 
6
6
  | Version | Status | Notes |
7
7
  | --- | --- | --- |
8
- | 0.2.0 | Declared source version on `main`; not yet published | [v0.2.0](docs/release_notes/v0.2.0.md) |
8
+ | 0.2.1 | Declared source version on `main`; not yet published | [v0.2.1](docs/release_notes/v0.2.1.md) |
9
+ | 0.2.0 | Published on PyPI on 2026-10-21 as a beta release | [v0.2.0](docs/release_notes/v0.2.0.md) |
9
10
  | 0.1.0 | Published on PyPI on 2026-10-05 as a beta release | [v0.1.0](docs/release_notes/v0.1.0.md) |
10
11
  | 0.1.0rc10 | Published on PyPI on 2026-10-04 as an alpha developer-preview pre-release | [v0.1.0-rc10](docs/release_notes/v0.1.0-rc10.md) |
11
12
  | 0.1.0rc9 | Published on PyPI on 2026-10-03 as an alpha developer-preview pre-release | [v0.1.0-rc9](docs/release_notes/v0.1.0-rc9.md) |
@@ -1,9 +1,9 @@
1
1
  {
2
- "build_version": "0.2.0",
2
+ "build_version": "0.2.1",
3
3
  "schema_version": "1.0.0",
4
4
  "source": {
5
- "commit_sha": "6f5cd85c40774990838dbf62b9ae7f80af0feb64",
6
- "tree_sha": "9e7d20b129c47dab9c90496e68adb461917eeff3",
5
+ "commit_sha": "282eb8a89ecb063c573d40e32b65b794c32d1664",
6
+ "tree_sha": "aaa5ce029ba8d0a08d40933498eeffcbdc235544",
7
7
  "working_tree_clean": true,
8
8
  "working_tree_status_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
9
9
  }
@@ -26,6 +26,10 @@ class CoverageAnalysis:
26
26
  warnings: list[BuildWarning] = field(default_factory=list)
27
27
  status: str = "unavailable"
28
28
  metrics: dict[str, Any] = field(default_factory=dict)
29
+ # True when a file's test contexts all failed to match an indexed test
30
+ # node: the per-test evidence for that file is missing, so the coverage
31
+ # status is partial even when aggregate edges exist.
32
+ test_contexts_unmatched: bool = False
29
33
 
30
34
 
31
35
  class CoverageCollector:
@@ -209,10 +213,14 @@ class CoverageCollector:
209
213
  metrics={"format": "coverage.py"},
210
214
  )
211
215
  symbols = self._symbol_nodes(nodes)
216
+ context_index = self._coverage_context_index(nodes)
217
+ resolved_contexts: dict[str, Node | None] = {}
212
218
  aggregate = self._coverage_node(path, "coverage.py")
213
219
  edges = {}
214
220
  unmatched = malformed = 0
215
221
  unknown_contexts = set()
222
+ unmatched_test_contexts = set()
223
+ matched_test_contexts = set()
216
224
  for raw_path, item in payload["files"].items():
217
225
  if not isinstance(item, dict) or not isinstance(
218
226
  item.get("executed_lines"), list
@@ -246,14 +254,20 @@ class CoverageCollector:
246
254
  if isinstance(name, str) and name:
247
255
  contexts.setdefault(name, set()).add(int(number))
248
256
  for name, covered in contexts.items():
249
- source = (
250
- aggregate
251
- if not name
252
- else self._coverage_test_context(name, nodes, module_by_path)
253
- )
254
- if source is None:
255
- unknown_contexts.add(name)
256
- continue
257
+ if not name:
258
+ source = aggregate
259
+ else:
260
+ is_test_context = self._coverage_context_parts(name) is not None
261
+ source = self._coverage_test_context(
262
+ name, context_index, module_by_path, resolved_contexts
263
+ )
264
+ if source is None:
265
+ unknown_contexts.add(name)
266
+ if is_test_context:
267
+ unmatched_test_contexts.add(name)
268
+ continue
269
+ if is_test_context:
270
+ matched_test_contexts.add(name)
257
271
  targets = [
258
272
  module_by_path[file_path],
259
273
  *[
@@ -297,9 +311,25 @@ class CoverageCollector:
297
311
  properties["contexts"] = sorted(
298
312
  set(properties["contexts"]) | {name}
299
313
  )
314
+ warnings = []
315
+ if unmatched_test_contexts:
316
+ examples = sorted(unmatched_test_contexts)[:5]
317
+ warnings.append(
318
+ BuildWarning(
319
+ kind="coverage_python_unmatched_contexts",
320
+ path=self._display_path(path),
321
+ message=(
322
+ f"{len(unmatched_test_contexts)} coverage.py test context(s) "
323
+ "did not match an indexed test node: " + ", ".join(examples)
324
+ ),
325
+ )
326
+ )
300
327
  return CoverageAnalysis(
301
328
  nodes=[aggregate] if edges else [],
302
329
  edges=sorted(edges.values(), key=lambda e: (e.source, e.target, e.kind)),
330
+ warnings=warnings,
331
+ test_contexts_unmatched=bool(unmatched_test_contexts)
332
+ and not matched_test_contexts,
303
333
  metrics={
304
334
  "format": "coverage.py",
305
335
  "entries_total": len(payload["files"]),
@@ -309,24 +339,83 @@ class CoverageCollector:
309
339
  },
310
340
  )
311
341
 
312
- def _coverage_test_context(self, context, nodes, modules):
313
- # pytest-cov node ids may have static prefixes and phase suffixes.
342
+ @staticmethod
343
+ def _coverage_context_index(nodes: list[Node]) -> dict[tuple[str, str], list[Node]]:
344
+ """Index the nodes a coverage.py test context can name, once per analysis.
345
+
346
+ Keyed by (path, qualname): the pytest adapter adds a ``test_case`` node
347
+ with the same path and qualname as the test function, so one key can
348
+ hold both.
349
+ """
350
+ index: dict[tuple[str, str], list[Node]] = {}
351
+ for node in nodes:
352
+ if (
353
+ node.kind not in {"function", "method", "test_case"}
354
+ or not node.path
355
+ or not node.qualname
356
+ ):
357
+ continue
358
+ index.setdefault((node.path, node.qualname), []).append(node)
359
+ return index
360
+
361
+ @staticmethod
362
+ def _coverage_context_parts(context: str) -> tuple[str, list[str]] | None:
363
+ """Split a pytest-cov context name into (path, qualname parts).
364
+
365
+ Returns None for a name that is not a single pytest node id: static
366
+ contexts (``""``, ``production``) and names with several node ids are
367
+ not test contexts and are never matched to a test node.
368
+ """
314
369
  identifiers = [part for part in context.split("|") if "::" in part]
315
370
  if len(identifiers) != 1:
316
371
  return None
317
372
  path, *parts = identifiers[0].split("::")
318
- file_path = self._match_file_path(self._normalized_path(path), modules)
319
- if file_path is None or not parts:
373
+ if not path or not parts:
320
374
  return None
321
- qualname = ".".join(part.split("[", 1)[0] for part in parts)
322
- matches = [
323
- node
324
- for node in nodes
325
- if node.path == file_path
326
- and node.kind in {"function", "method", "test_case"}
327
- and node.qualname == modules[file_path].qualname + "." + qualname
328
- ]
329
- return matches[0] if len(matches) == 1 else None
375
+ return path, parts
376
+
377
+ def _coverage_test_context(
378
+ self,
379
+ context: str,
380
+ index: dict[tuple[str, str], list[Node]],
381
+ modules: dict[str, Node],
382
+ resolved: dict[str, Node | None],
383
+ ) -> Node | None:
384
+ # pytest-cov node ids may have static prefixes and phase suffixes.
385
+ if context in resolved:
386
+ return resolved[context]
387
+ parts = self._coverage_context_parts(context)
388
+ node: Node | None = None
389
+ if parts is not None:
390
+ path, qualname_parts = parts
391
+ file_path = self._match_file_path(self._normalized_path(path), modules)
392
+ if file_path is not None:
393
+ qualname = ".".join(part.split("[", 1)[0] for part in qualname_parts)
394
+ node = self._match_context_node(
395
+ index, file_path, modules[file_path].qualname + "." + qualname
396
+ )
397
+ resolved[context] = node
398
+ return node
399
+
400
+ @staticmethod
401
+ def _match_context_node(
402
+ index: dict[tuple[str, str], list[Node]], file_path: str, qualname: str
403
+ ) -> Node | None:
404
+ """Pick the node a context names: the test case first, then the function.
405
+
406
+ The pytest adapter registers a ``test_case`` node with the same path and
407
+ qualname as the test function; the test case is the node that carries
408
+ the per-test evidence, so it wins. Without one, a single function or
409
+ method is the only unambiguous match.
410
+ """
411
+ matches = index.get((file_path, qualname), [])
412
+ test_cases = [node for node in matches if node.kind == "test_case"]
413
+ if len(test_cases) == 1:
414
+ return test_cases[0]
415
+ if test_cases:
416
+ return None
417
+ functions = [node for node in matches if node.kind in {"function", "method"}]
418
+ return functions[0] if len(functions) == 1 else None
330
419
 
331
420
  def _analyze_istanbul_json(
332
421
  self,
@@ -657,6 +746,10 @@ class CoverageCollector:
657
746
  ),
658
747
  )
659
748
  )
749
+ if analysis.test_contexts_unmatched:
750
+ # The report has test contexts and none of them matched, so the
751
+ # per-test evidence is missing even if aggregate edges exist.
752
+ status = "partial"
660
753
 
661
754
  covered_files = sorted(
662
755
  {
@@ -132,6 +132,7 @@ from arcgraph.interfaces.cli_visual import ( # noqa: F401
132
132
  from arcgraph.interfaces.cli_support import ( # noqa: F401
133
133
  output_location,
134
134
  handle_export,
135
+ precision_tools_fix,
135
136
  print_json,
136
137
  python_checks,
137
138
  query_engine,
@@ -1860,11 +1861,7 @@ def handle_doctor(args: argparse.Namespace) -> dict[str, Any]:
1860
1861
  "name": "precision_tools",
1861
1862
  "status": "warn",
1862
1863
  "message": f"Missing: {', '.join(missing_tools)}.",
1863
- "fix": (
1864
- "Run scripts/install-arcgraph-precision-tools.ps1 (Windows) or "
1865
- "install scip-python, scip, pyright manually. "
1866
- "Precision tools are optional; builds work without them."
1867
- ),
1864
+ "fix": precision_tools_fix(),
1868
1865
  }
1869
1866
  )
1870
1867
 
@@ -174,6 +174,31 @@ def python_checks(repo_root: Path, *, semantic_state=None) -> list[dict[str, Any
174
174
  return checks
175
175
 
176
176
 
177
+ def precision_tools_fix() -> str:
178
+ """doctor's repair hint for missing precision tools, per platform.
179
+
180
+ Windows has a repository script that installs scip and pyright; scip-python
181
+ 0.6.6 does not run on native Windows and is run in WSL. macOS and Linux
182
+ install the npm tools and take scip from its official release, which is
183
+ what the README documents for those platforms.
184
+ """
185
+
186
+ if platform.system() == "Windows":
187
+ return (
188
+ "Run scripts/install-arcgraph-precision-tools.ps1 to install scip "
189
+ "and pyright; scip-python 0.6.6 does not run on native Windows, so "
190
+ "run `arcgraph precision scip-python` in WSL. Precision tools are "
191
+ "optional; builds work without them."
192
+ )
193
+ return (
194
+ "Install scip-python and pyright with `npm install -g "
195
+ "@sourcegraph/scip-python@0.6.6 pyright@1.1.409`, and scip v0.7.1 from "
196
+ "the official release "
197
+ "(https://github.com/scip-code/scip/releases/tag/v0.7.1). "
198
+ "Precision tools are optional; builds work without them."
199
+ )
200
+
201
+
177
202
  def query_engine(args: argparse.Namespace) -> QueryEngine:
178
203
  repo_root = Path(args.repo_root).resolve()
179
204
  return QueryEngine((repo_root / args.output_dir).resolve())
@@ -51,7 +51,7 @@ def _docs_payload(topic: str) -> dict[str, Any]:
51
51
  {
52
52
  "title": "Prepare One Project",
53
53
  "items": [
54
- 'Install ArcGraph in a persistent tool environment or venv; MCP clients require the mcp extra. ArcGraph is beta software; the repository\'s RELEASE_NOTES.md lists the published versions. ArcGraph is published on PyPI: install it with `uv tool install --python 3.11 "arcgraph[mcp]"` or `python -m pip install "arcgraph[mcp]"` (pip installs of 0.1.0 from PyPI were tested on macOS, Windows and Linux with Python 3.11 and 3.12; pin the exact version you tested, for example `arcgraph[mcp]==0.1.0`), or from the GitHub repository with `"arcgraph[mcp] @ git+https://github.com/glyphevo/arcgraph.git"`. A disposable uvx environment is not managed by setup. Git tags and GitHub releases carry the same files as the matching PyPI version; npm and Docker/GHCR are not published.',
54
+ 'Install ArcGraph in a persistent tool environment or venv; MCP clients require the mcp extra. ArcGraph is beta software; the repository\'s RELEASE_NOTES.md lists the published versions. ArcGraph is published on PyPI: install it with `uv tool install --python 3.11 "arcgraph[mcp]"` or `python -m pip install "arcgraph[mcp]"` (pip installs of 0.2.0 from PyPI were tested on macOS, Windows and Linux with Python 3.11 to 3.14; pin the exact version you tested, for example `arcgraph[mcp]==0.2.0`), or from the GitHub repository with `"arcgraph[mcp] @ git+https://github.com/glyphevo/arcgraph.git"`. A disposable uvx environment is not managed by setup. Git tags and GitHub releases carry the same files as the matching PyPI version; npm and Docker/GHCR are not published.',
55
55
  "From the target project, run `arcgraph setup --client claude|codex|cursor|hermes|pi`, selecting one client. It explicitly builds or refreshes the index, probes the runtime, then writes one client entry.",
56
56
  "Use `--dry-run` for a plan without writes, indexing or subprocesses; `--client-config PATH` overrides the destination, not client discovery; `--timeout SECONDS` sets a positive per-step timeout.",
57
57
  "Global options precede setup: `arcgraph --repo-root /path/to/project --output-dir /path/to/index setup --client codex`. Default output is project/output/arcgraph. Indexing, MCP and CLI guidance share the same absolute paths. Source scope follows ordinary project configuration and detection; inspect it with doctor.",
@@ -209,7 +209,7 @@ def _docs_payload(topic: str) -> dict[str, Any]:
209
209
  "title": "Local Install And Upgrade",
210
210
  "items": [
211
211
  "ArcGraph is on PyPI and can also be installed from a source checkout; ArcGraph is beta software. Git tags (`v` followed by the version) and GitHub releases carry the same two files as the matching version on PyPI. npm and Docker/GHCR package paths are not published.",
212
- "ArcGraph requires Python 3.11 to 3.14 (`requires-python >=3.11,<3.15`); 0.1.0 on PyPI requires 3.11 or 3.12. Create and activate a virtual environment before installing when you want an isolated local tool.",
212
+ "ArcGraph requires Python 3.11 to 3.14 (`requires-python >=3.11,<3.15`); 0.1.0 required 3.11 or 3.12. Create and activate a virtual environment before installing when you want an isolated local tool.",
213
213
  "From a source checkout, run `python -m pip install --upgrade -e .` in the ArcGraph project directory to install or refresh the `arcgraph` CLI.",
214
214
  'For development and local validation, run `python -m pip install -e ".[dev]"`; use the analyzed project\'s locked npm install when TypeScript/JavaScript analysis is required.',
215
215
  "Node.js and a resolvable TypeScript compiler API are runtime dependencies for TypeScript/JavaScript analysis, not merely test dependencies. The Python wheel includes the `.mjs` extractor but not `node_modules/typescript`.",
@@ -233,7 +233,7 @@ def _docs_payload(topic: str) -> dict[str, Any]:
233
233
  "Pyright export metrics include total probes, requestable probes, skipped unmappable probes, request count, resolved type info, and unresolved probes.",
234
234
  "The Windows precision-tools install script pins `pyright@1.1.409`; local full evidence profiles should use the same version unless intentionally testing compatibility. GitHub Actions does not currently install or run Pyright.",
235
235
  "Pass the resulting JSON to `arcgraph build --scip-index output/arcgraph/scip-index.json --pyright-export output/arcgraph/pyright-export.json`; missing or invalid precision input remains explicit as `precision=ast_fallback_only` or `precision_partial`.",
236
- "On Windows, run `scripts/install-arcgraph-precision-tools.ps1` to install `@sourcegraph/scip-python@0.6.6`, `pyright@1.1.409`, and build `scip.exe v0.7.1` with Go. WSL remains a fallback (use the Linux install steps there); GitHub Actions is not currently a working fallback for this, since it neither installs these tools nor runs at all while disabled.",
236
+ "On Windows, run `scripts/install-arcgraph-precision-tools.ps1` to install `pyright@1.1.409` and build `scip.exe v0.7.1` with Go from a clone of the v0.7.1 tag (Go and Git are required; scip publishes no Windows binary). `@sourcegraph/scip-python@0.6.6` does not run on native Windows (it fails while loading), so run `arcgraph precision scip-python` in WSL with the Linux install steps. On macOS and Linux, take `scip` v0.7.1 from the prebuilt binary on its official release and check the published checksum. GitHub Actions is not currently a working fallback for this, since it neither installs these tools nor runs at all while disabled.",
237
237
  ],
238
238
  },
239
239
  {
@@ -749,7 +749,7 @@ def _docs_payload(topic: str) -> dict[str, Any]:
749
749
  "`arcgraph precision scip-python`, `arcgraph precision scip-json`, and `arcgraph precision pyright` generate JSON artifacts accepted by `arcgraph build --scip-index ... --pyright-export ...`.",
750
750
  "`runtime_trace=available|partial|unavailable` describes explicit runtime trace import status.",
751
751
  "A small CI smoke trace proves the runtime evidence chain and stale detection only; broad dynamic behavior coverage requires an intentionally broader trace profile.",
752
- "`coverage=available|partial|unavailable` describes test coverage input status; `partial` means the file was stale, invalid, or produced only partial evidence.",
752
+ "`coverage=available|partial|unavailable` describes test coverage input status; `partial` means the file was stale, invalid, or produced only partial evidence, including a coverage.py report whose test contexts all failed to match an indexed test.",
753
753
  ],
754
754
  },
755
755
  {
@@ -849,11 +849,12 @@ def _docs_payload(topic: str) -> dict[str, Any]:
849
849
  "title": "ArcGraph Quickstart",
850
850
  "sections": [
851
851
  {
852
- "title": "Install From A Checkout",
852
+ "title": "Install",
853
853
  "items": [
854
- "ArcGraph requires Python 3.11 to 3.14 (`requires-python >=3.11,<3.15`; 0.1.0 on PyPI requires 3.11 or 3.12) and is currently installed from a source checkout.",
855
- "Create and activate a virtual environment, then run `python -m pip install --upgrade pip`.",
856
- "Run `python -m pip install -e .` for the normal CLI install.",
854
+ 'ArcGraph requires Python 3.11 to 3.14 (`requires-python >=3.11,<3.15`; 0.1.0 required 3.11 or 3.12) and is published on PyPI: `python -m pip install "arcgraph[mcp]"` or `uv tool install --python 3.11 "arcgraph[mcp]"` installs the CLI, and the `mcp` extra is only needed to run the MCP server.',
855
+ "Pin the exact version you tested, for example `arcgraph[mcp]==0.2.0`; `arcgraph version --json` reports the commit the installed copy was built from.",
856
+ "From a source checkout, create and activate a virtual environment, then run `python -m pip install --upgrade pip`.",
857
+ "Run `python -m pip install -e .` to install the CLI from that checkout.",
857
858
  'Run `python -m pip install -e ".[dev]"` when you need development dependencies or local validation.',
858
859
  "For TypeScript/JavaScript analysis, Node.js and a TypeScript compiler API must be resolvable at runtime. Use the analyzed project's locked npm install; the Python wheel includes the `.mjs` extractor but not `node_modules/typescript`.",
859
860
  "For ArcGraph's own TypeScript golden tests from a source checkout, run `npm ci` in the ArcGraph checkout; that is development setup, not the analyzed project's product runtime.",
@@ -972,7 +973,7 @@ def _docs_payload(topic: str) -> dict[str, Any]:
972
973
  "Run `python scripts/arcgraph.py build` to rebuild the self-index at the current commit.",
973
974
  "Run `python scripts/arcgraph.py ci` and require 0 fail / 0 warn.",
974
975
  "Run `python scripts/arcgraph_release_gate.py` to validate freshness, CI status, wheel buildability, and packaged release assets.",
975
- "Run `python scripts/arcgraph_release_candidate_check.py --wheel dist/arcgraph-0.2.0-py3-none-any.whl --sdist dist/arcgraph-0.2.0.tar.gz --repo-root . --output output/arcgraph/reports/v0.2.0-smoke.json` to smoke the installed wheel before tagging or publishing. Its `wheel-source-provenance` check records the wheel SHA-256 and passes only when the wheel's embedded build provenance names the same commit and tree as `--repo-root` HEAD and records a clean build working tree, so neither a stale `dist/` artifact from an earlier commit nor a wheel built over uncommitted edits can be validated under the current version label. Its `clean-rebuild-identical` check then clones that HEAD into a fresh directory, runs an isolated `python -m build` there, and requires the rebuilt wheel and sdist to carry the same file names and identical bytes as the two files given, so an archive edited after the build (a changed dependency declaration, entry point or script) is rejected even when its RECORD was regenerated to match. The build backend is pinned to an exact version in `pyproject.toml` to reduce drift between the two builds; the pin covers only that direct requirement, so a change in a transitive build dependency or in the environment can still make the comparison fail, which is the safe direction, and the check records the Python, build frontend and backend versions it used. A side carrying no provenance at all, or no repository head to rebuild, is reported as `warn` rather than claimed as bound, and `--allow-source-mismatch` downgrades a real disagreement to a disclosed warning; report `status` is then `warn`, never `pass`, and the bundle assembler accepts only `pass`.",
976
+ "Run `python scripts/arcgraph_release_candidate_check.py --wheel dist/arcgraph-0.2.1-py3-none-any.whl --sdist dist/arcgraph-0.2.1.tar.gz --repo-root . --output output/arcgraph/reports/v0.2.1-smoke.json` to smoke the installed wheel before tagging or publishing. Its `wheel-source-provenance` check records the wheel SHA-256 and passes only when the wheel's embedded build provenance names the same commit and tree as `--repo-root` HEAD and records a clean build working tree, so neither a stale `dist/` artifact from an earlier commit nor a wheel built over uncommitted edits can be validated under the current version label. Its `clean-rebuild-identical` check then clones that HEAD into a fresh directory, runs an isolated `python -m build` there, and requires the rebuilt wheel and sdist to carry the same file names and identical bytes as the two files given, so an archive edited after the build (a changed dependency declaration, entry point or script) is rejected even when its RECORD was regenerated to match. The build backend is pinned to an exact version in `pyproject.toml` to reduce drift between the two builds; the pin covers only that direct requirement, so a change in a transitive build dependency or in the environment can still make the comparison fail, which is the safe direction, and the check records the Python, build frontend and backend versions it used. A side carrying no provenance at all, or no repository head to rebuild, is reported as `warn` rather than claimed as bound, and `--allow-source-mismatch` downgrades a real disagreement to a disclosed warning; report `status` is then `warn`, never `pass`, and the bundle assembler accepts only `pass`.",
976
977
  "Maintainers can assemble a local external-trial bundle with `python scripts/arcgraph_external_trial_bundle.py`; run it with `--help` for its inputs. It publishes, tags and pushes nothing, and it requires saved evidence of a completed successful remote CI push run on `main` for the exact candidate commit.",
977
978
  "Review `arcgraph docs schema-governance` before changing `SCHEMA_VERSION`, graph storage, resolver defaults, or evidence import schemas.",
978
979
  "Review `arcgraph docs frontend-contract` before adding, removing, or changing a language frontend.",
@@ -1110,7 +1111,7 @@ def _docs_payload(topic: str) -> dict[str, Any]:
1110
1111
  "title": "Partial Semantic Results",
1111
1112
  "items": [
1112
1113
  "When precision inputs are missing, `precision=ast_fallback_only` is expected and should be reported.",
1113
- "If `arcgraph precision scip-python` fails on Windows because tools are missing, run `scripts/install-arcgraph-precision-tools.ps1`; if Go is missing, install it with `winget install --id GoLang.Go -e` or pass `-InstallGoWithWinget`.",
1114
+ "On native Windows, run `arcgraph precision scip-python` in WSL: `@sourcegraph/scip-python@0.6.6` fails while loading on Windows. If `scip` or `pyright` is missing on Windows, run `scripts/install-arcgraph-precision-tools.ps1`; if Go is missing, install it with `winget install --id GoLang.Go -e` or pass `-InstallGoWithWinget`, and if Git is missing, install it with `winget install --id Git.Git -e`.",
1114
1115
  "If local `scip-python`, `scip`, or `pyright-langserver` is unavailable and cannot be installed, use WSL/Linux/CI for evidence generation or run fast `arcgraph ci` while reporting `precision=ast_fallback_only`, `precision_partial`, or `type_precision_complete=false` explicitly.",
1115
1116
  "Unresolved callsites are diagnostics, not silent drops; inspect `arcgraph unresolved TARGET`, filter with `--category`, or use `--release-blocking-only` before a python_full release.",
1116
1117
  "Do not infer unresolved risk from a callback-like name or a test path. `true_dynamic_call` requires analyzer-recorded dynamic dispatch (including a visible runtime local binding), while ordinary unresolved test calls remain `static_candidate`.",
@@ -1135,6 +1136,13 @@ def _docs_payload(topic: str) -> dict[str, Any]:
1135
1136
  "topic": topic,
1136
1137
  "title": "Schema Migration Notes",
1137
1138
  "sections": [
1139
+ {
1140
+ "title": "0.2.1",
1141
+ "items": [
1142
+ "coverage.py test contexts resolve to the pytest test case node; rebuild with `--coverage` to replace the aggregate-only edges an earlier build imported. Unmatched test contexts raise coverage_python_unmatched_contexts; when none match, coverage is `partial` and the coverage_inputs check of `arcgraph ci` warns (fails with --require-coverage).",
1143
+ "On native Windows, run `arcgraph precision scip-python` in WSL; scripts/install-arcgraph-precision-tools.ps1 builds scip from source with Go and Git and no longer installs scip-python.",
1144
+ ],
1145
+ },
1138
1146
  {
1139
1147
  "title": "0.2.0",
1140
1148
  "items": [