gitgrip 2.0.0a7__tar.gz → 2.0.0a8__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 (373) hide show
  1. {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/PKG-INFO +49 -12
  2. {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/README.md +48 -11
  3. {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/gitgrip.egg-info/PKG-INFO +49 -12
  4. {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/gitgrip.egg-info/SOURCES.txt +13 -0
  5. {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/gitgrip.egg-info/entry_points.txt +1 -0
  6. gitgrip-2.0.0a8/gr2/PLATFORM_ADAPTER_CHANGELOG.md +67 -0
  7. {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/gr2/overlay/activate.py +2 -6
  8. {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/gr2/overlay/introspection.py +2 -6
  9. {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/gr2/overlay/objects.py +14 -77
  10. {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/gr2/overlay/refs.py +3 -12
  11. {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/gr2/python_cli/app.py +91 -48
  12. gitgrip-2.0.0a8/gr2/python_cli/approvals.py +302 -0
  13. {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/gr2/python_cli/check_records.py +7 -10
  14. {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/gr2/python_cli/clone_exec.py +2 -2
  15. {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/gr2/python_cli/context.py +2 -1
  16. {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/gr2/python_cli/defaults.py +5 -5
  17. {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/gr2/python_cli/git_review.py +2 -5
  18. {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/gr2/python_cli/gitops.py +137 -66
  19. {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/gr2/python_cli/gr_resolver.py +67 -14
  20. gitgrip-2.0.0a8/gr2/python_cli/gr_shadow.py +101 -0
  21. {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/gr2/python_cli/grip.py +89 -65
  22. {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/gr2/python_cli/grip_cli.py +4 -4
  23. {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/gr2/python_cli/hooks.py +3 -5
  24. {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/gr2/python_cli/lane_defaults.py +2 -4
  25. {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/gr2/python_cli/lane_downstream.py +15 -2
  26. {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/gr2/python_cli/launch_exec.py +58 -6
  27. {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/gr2/python_cli/merge_gate.py +34 -25
  28. {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/gr2/python_cli/merge_verification.py +2 -7
  29. {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/gr2/python_cli/open_gr_review.py +4 -0
  30. {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/gr2/python_cli/platform.py +5 -1
  31. {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/gr2/python_cli/pr.py +9 -1
  32. {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/gr2/python_cli/prune.py +2 -8
  33. {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/gr2/python_cli/review_ephemeral.py +5 -10
  34. {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/gr2/python_cli/review_field_tree.py +3 -3
  35. {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/gr2/python_cli/review_members.py +3 -3
  36. {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/gr2/python_cli/review_rebind.py +10 -9
  37. {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/gr2/python_cli/review_records.py +2 -4
  38. {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/gr2/python_cli/review_run.py +6 -10
  39. {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/pyproject.toml +5 -2
  40. {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_api_dump.py +5 -1
  41. {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_defaults_from_repo.py +4 -4
  42. gitgrip-2.0.0a8/tests/test_gitops_shared.py +334 -0
  43. gitgrip-2.0.0a8/tests/test_gr_installed_wheel.py +70 -0
  44. gitgrip-2.0.0a8/tests/test_gr_resolved_cleared.py +14 -0
  45. {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_gr_resolver_conformance.py +67 -9
  46. gitgrip-2.0.0a8/tests/test_gr_shadow.py +149 -0
  47. gitgrip-2.0.0a8/tests/test_lane_probe_batch.py +134 -0
  48. gitgrip-2.0.0a8/tests/test_platform_adapter_changelog.py +115 -0
  49. {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_platform_adapter_plugins.py +139 -54
  50. {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_pr_review_subject.py +21 -0
  51. {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_readme_verbs_exist.py +13 -0
  52. {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_review_a4.py +7 -7
  53. {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_review_a4_v2.py +4 -4
  54. gitgrip-2.0.0a8/tests/test_review_approvals.py +752 -0
  55. {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_review_bind_migration.py +1 -1
  56. {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_review_bind_native_store.py +1 -1
  57. {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_review_field_tree_reader_edges.py +1 -1
  58. gitgrip-2.0.0a8/tests/test_review_pin_stamp_names.py +57 -0
  59. {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_review_reader_defaults.py +5 -5
  60. {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_review_remote_safety.py +122 -0
  61. {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_review_subject.py +5 -5
  62. {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_review_transport.py +1 -1
  63. gitgrip-2.0.0a8/tests/test_review_vocabulary.py +66 -0
  64. {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_root_option_verbs.py +1 -1
  65. {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_sync_ssh_rewrite.py +6 -0
  66. {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_sync_status_probe.py +3 -0
  67. {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_tmux_launch_runtime.py +102 -5
  68. {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_version_static.py +2 -2
  69. gitgrip-2.0.0a8/tests/test_vocabulary.py +115 -0
  70. {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/gitgrip.egg-info/dependency_links.txt +0 -0
  71. {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/gitgrip.egg-info/requires.txt +0 -0
  72. {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/gitgrip.egg-info/top_level.txt +0 -0
  73. {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/gr2/__init__.py +0 -0
  74. {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/gr2/api_core.py +0 -0
  75. {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/gr2/overlay/__init__.py +0 -0
  76. {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/gr2/overlay/agent_manifest.py +0 -0
  77. {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/gr2/overlay/cli.py +0 -0
  78. {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/gr2/overlay/cross_repo.py +0 -0
  79. {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/gr2/overlay/drivers.py +0 -0
  80. {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/gr2/overlay/language_drivers.py +0 -0
  81. {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/gr2/overlay/perf.py +0 -0
  82. {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/gr2/overlay/trust.py +0 -0
  83. {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/gr2/overlay/types.py +0 -0
  84. {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/gr2/overlay/units.py +0 -0
  85. {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/gr2/overlay/workspace_spec.py +0 -0
  86. {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/gr2/prototypes/__init__.py +0 -0
  87. {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/gr2/prototypes/cache_materialization_probe.py +0 -0
  88. {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/gr2/prototypes/concurrent_event_stress.py +0 -0
  89. {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/gr2/prototypes/concurrent_lease_stress.py +0 -0
  90. {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/gr2/prototypes/concurrent_workspace_cap_stress.py +0 -0
  91. {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/gr2/prototypes/contribution_protocol.py +0 -0
  92. {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/gr2/prototypes/cross_mode_lane_stress.py +0 -0
  93. {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/gr2/prototypes/jsonl_store.py +0 -0
  94. {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/gr2/prototypes/lane_workspace_prototype.py +0 -0
  95. {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/gr2/prototypes/layout_model_probe.py +0 -0
  96. {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/gr2/prototypes/propagation_daemon.py +0 -0
  97. {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/gr2/prototypes/propagation_state_machine.py +0 -0
  98. {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/gr2/prototypes/python_exec_playground.py +0 -0
  99. {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/gr2/prototypes/python_hook_runtime_playground.py +0 -0
  100. {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/gr2/prototypes/python_migration_playground.py +0 -0
  101. {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/gr2/prototypes/python_review_checkout_playground.py +0 -0
  102. {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/gr2/prototypes/python_spec_apply_playground.py +0 -0
  103. {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/gr2/prototypes/real_git_lane_materialization.py +0 -0
  104. {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/gr2/prototypes/real_git_playground.py +0 -0
  105. {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/gr2/prototypes/recall_lane_history.py +0 -0
  106. {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/gr2/prototypes/repo_maintenance_prototype.py +0 -0
  107. {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/gr2/prototypes/repo_transport_probe.py +0 -0
  108. {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/gr2/python_cli/__init__.py +0 -0
  109. {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/gr2/python_cli/__main__.py +0 -0
  110. {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/gr2/python_cli/add.py +0 -0
  111. {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/gr2/python_cli/approval_schema.py +0 -0
  112. {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/gr2/python_cli/branch.py +0 -0
  113. {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/gr2/python_cli/channel_bridge.py +0 -0
  114. {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/gr2/python_cli/commit.py +0 -0
  115. {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/gr2/python_cli/config.py +0 -0
  116. {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/gr2/python_cli/consent.py +0 -0
  117. {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/gr2/python_cli/ecosystems_python.py +0 -0
  118. {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/gr2/python_cli/env_exec.py +0 -0
  119. {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/gr2/python_cli/events.py +0 -0
  120. {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/gr2/python_cli/execops.py +0 -0
  121. {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/gr2/python_cli/exit_codes.py +0 -0
  122. {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/gr2/python_cli/failures.py +0 -0
  123. {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/gr2/python_cli/file_exec.py +0 -0
  124. {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/gr2/python_cli/gitinclude.py +0 -0
  125. {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/gr2/python_cli/lane_graph.py +0 -0
  126. {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/gr2/python_cli/lane_plugins.py +0 -0
  127. {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/gr2/python_cli/layout.py +0 -0
  128. {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/gr2/python_cli/migration.py +0 -0
  129. {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/gr2/python_cli/project_review.py +0 -0
  130. {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/gr2/python_cli/push.py +0 -0
  131. {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/gr2/python_cli/review.py +0 -0
  132. {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/gr2/python_cli/review_allocation.py +0 -0
  133. {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/gr2/python_cli/review_dispatch.py +0 -0
  134. {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/gr2/python_cli/review_runners.py +0 -0
  135. {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/gr2/python_cli/root_option.py +0 -0
  136. {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/gr2/python_cli/spec_apply.py +0 -0
  137. {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/gr2/python_cli/staging_cleanup.py +0 -0
  138. {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/gr2/python_cli/syncops.py +0 -0
  139. {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/gr2/python_cli/target.py +0 -0
  140. {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/gr2/python_cli/version.py +0 -0
  141. {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/gr2/python_cli/workspace_guidance.py +0 -0
  142. {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/gr2/python_cli/workspace_snapshot.py +0 -0
  143. {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/gr2/schemas/dev.synapt.grip.approval.v1alpha1/approval.proto +0 -0
  144. {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/gr2/schemas/dev.synapt.grip.approval.v1alpha1/descriptor_set.pb +0 -0
  145. {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/gr2/schemas/dev.synapt.grip.check.v1alpha1/check.proto +0 -0
  146. {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/gr2/schemas/dev.synapt.grip.check.v1alpha1/descriptor_set.pb +0 -0
  147. {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/gr2/schemas/dev.synapt.grip.merge.v1alpha1/descriptor_set.pb +0 -0
  148. {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/gr2/schemas/dev.synapt.grip.merge.v1alpha1/merge.proto +0 -0
  149. {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/gr2/schemas/dev.synapt.grip.review.v1alpha1/descriptor_set.pb +0 -0
  150. {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/gr2/schemas/dev.synapt.grip.review.v1alpha1/review.proto +0 -0
  151. {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/gr2/schemas/gr2-materialization-plan-v1.schema.json +0 -0
  152. {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/gr2/schemas/gr2-workspace-spec-v1.schema.json +0 -0
  153. {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/gr2_overlay/__init__.py +0 -0
  154. {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/setup.cfg +0 -0
  155. {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_add.py +0 -0
  156. {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_agent_manifest_overlay_source.py +0 -0
  157. {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_api_core_seam.py +0 -0
  158. {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_app_event_outcomes.py +0 -0
  159. {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_apply_convergence.py +0 -0
  160. {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_apply_gr1_sibling_adoption.py +0 -0
  161. {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_approval_schema.py +0 -0
  162. {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_branch.py +0 -0
  163. {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_break_17_unit_path_containment.py +0 -0
  164. {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_break_18_gr1_sibling_units.py +0 -0
  165. {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_channel_bridge.py +0 -0
  166. {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_cli_adapter_error_boundary.py +0 -0
  167. {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_cli_shape_witnesses.py +0 -0
  168. {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_clone_materialization.py +0 -0
  169. {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_commit.py +0 -0
  170. {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_config_base_path_guard.py +0 -0
  171. {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_config_overlay.py +0 -0
  172. {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_conftest_git_isolation.py +0 -0
  173. {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_context_resolver.py +0 -0
  174. {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_contribution_protocol.py +0 -0
  175. {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_deprecation_registry.py +0 -0
  176. {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_ecosystems_python.py +0 -0
  177. {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_ensure_lane_checkout_reference_clone.py +0 -0
  178. {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_env_materialization.py +0 -0
  179. {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_event_log_integrity.py +0 -0
  180. {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_event_outcome_policy.py +0 -0
  181. {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_events.py +0 -0
  182. {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_events_torn_line.py +0 -0
  183. {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_exec_apostrophe_and_oserror.py +0 -0
  184. {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_exec_single_string_and_materialize_plan.py +0 -0
  185. {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_execops.py +0 -0
  186. {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_failure_event_outcome.py +0 -0
  187. {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_field_tree_name.py +0 -0
  188. {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_first_five_minutes.py +0 -0
  189. {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_foreground_launch_runtime.py +0 -0
  190. {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_git_review.py +0 -0
  191. {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_gitinclude_compiler.py +0 -0
  192. {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_gr1_first_run_guidance.py +0 -0
  193. {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_gr2_packaging.py +0 -0
  194. {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_gr2_review_receipt.py +0 -0
  195. {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_grip_cli.py +0 -0
  196. {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_grip_hardening.py +0 -0
  197. {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_grip_snapshot.py +0 -0
  198. {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_grip_toml_schema_v1.py +0 -0
  199. {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_hook_events.py +0 -0
  200. {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_hook_hardening.py +0 -0
  201. {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_hooks_consent.py +0 -0
  202. {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_hooks_group_names.py +0 -0
  203. {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_jsonl_store.py +0 -0
  204. {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_lane_checkout_root.py +0 -0
  205. {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_lane_create_defaults.py +0 -0
  206. {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_lane_create_fork_base_cli.py +0 -0
  207. {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_lane_create_refusal_leaves_nothing.py +0 -0
  208. {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_lane_create_refuses_own_branch.py +0 -0
  209. {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_lane_downstream.py +0 -0
  210. {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_lane_downstream_run.py +0 -0
  211. {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_lane_enter_hook_warnings.py +0 -0
  212. {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_lane_exit_keeps_dirty_work.py +0 -0
  213. {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_lane_graph.py +0 -0
  214. {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_lane_lease_show_json.py +0 -0
  215. {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_lane_lifecycle_safety.py +0 -0
  216. {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_lane_plugins.py +0 -0
  217. {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_lane_probe.py +0 -0
  218. {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_lane_repo_paths_and_all_skipped.py +0 -0
  219. {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_lane_roles.py +0 -0
  220. {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_lane_show_name.py +0 -0
  221. {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_lane_store_path_pins.py +0 -0
  222. {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_lane_toml_serialization.py +0 -0
  223. {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_launch_primitive.py +0 -0
  224. {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_layout_census.py +0 -0
  225. {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_linked_review_receipts.py +0 -0
  226. {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_m2_overlay_hindsight.py +0 -0
  227. {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_m2_overlay_mem0.py +0 -0
  228. {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_m2_overlay_zep.py +0 -0
  229. {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_materialization_plan_contract.py +0 -0
  230. {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_materialize_pin.py +0 -0
  231. {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_member_working_root_checkout_materialize.py +0 -0
  232. {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_merge_evidence.py +0 -0
  233. {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_merge_parent_verification.py +0 -0
  234. {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_migration.py +0 -0
  235. {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_migration_overlay_compatibility.py +0 -0
  236. {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_migration_unadopted_notice.py +0 -0
  237. {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_native_store_gitinclude.py +0 -0
  238. {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_native_store_review_record_probes.py +0 -0
  239. {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_no_bare_python_cli_imports.py +0 -0
  240. {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_null_current_lane_refusal.py +0 -0
  241. {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_open_gr_enter.py +0 -0
  242. {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_open_project_refusal_reason_cli.py +0 -0
  243. {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_outbox_ack_after_effect.py +0 -0
  244. {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_overlay_acceptance.py +0 -0
  245. {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_overlay_activate.py +0 -0
  246. {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_overlay_cli.py +0 -0
  247. {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_overlay_cli_wiring.py +0 -0
  248. {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_overlay_composition_merge.py +0 -0
  249. {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_overlay_cross_repo_atomic_apply.py +0 -0
  250. {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_overlay_cross_repo_perf_gate.py +0 -0
  251. {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_overlay_cross_repo_rollback.py +0 -0
  252. {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_overlay_driver_registry.py +0 -0
  253. {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_overlay_introspection.py +0 -0
  254. {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_overlay_multi_stack.py +0 -0
  255. {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_overlay_object_encoding.py +0 -0
  256. {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_overlay_perf_gates.py +0 -0
  257. {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_overlay_python_driver.py +0 -0
  258. {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_overlay_tier_b_encoding.py +0 -0
  259. {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_overlay_tier_b_perf_gates.py +0 -0
  260. {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_overlay_tier_b_repo_state.py +0 -0
  261. {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_overlay_tier_b_staging_discipline.py +0 -0
  262. {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_overlay_trust_model.py +0 -0
  263. {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_overlay_workspace_spec.py +0 -0
  264. {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_pr_events.py +0 -0
  265. {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_pr_group_legibility.py +0 -0
  266. {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_pr_merge_head_pin.py +0 -0
  267. {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_pr_merge_method.py +0 -0
  268. {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_pr_merge_missing_target.py +0 -0
  269. {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_pr_merge_partial_failure.py +0 -0
  270. {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_pr_view.py +0 -0
  271. {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_project_file_materialization.py +0 -0
  272. {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_project_review_range_reconstruction.py +0 -0
  273. {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_project_review_three_repo.py +0 -0
  274. {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_projection_tracked_dest.py +0 -0
  275. {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_propagation_contribution.py +0 -0
  276. {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_propagation_daemon.py +0 -0
  277. {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_propagation_state_machine.py +0 -0
  278. {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_prune.py +0 -0
  279. {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_push.py +0 -0
  280. {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_python_group_install.py +0 -0
  281. {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_record_schema_copies.py +0 -0
  282. {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_remote_check_records.py +0 -0
  283. {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_repo_path_read_through.py +0 -0
  284. {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_repo_status_linked_worktree.py +0 -0
  285. {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_repo_status_schema_version.py +0 -0
  286. {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_repo_status_symlinked_git_dir.py +0 -0
  287. {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_review_a4_v3.py +0 -0
  288. {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_review_allocation_recovery.py +0 -0
  289. {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_review_ansi_parse.py +0 -0
  290. {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_review_b3_reader_alignment.py +0 -0
  291. {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_review_bind_author.py +0 -0
  292. {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_review_bind_fork_base.py +0 -0
  293. {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_review_bind_from_range.py +0 -0
  294. {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_review_bind_root_refs.py +0 -0
  295. {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_review_bind_verify.py +0 -0
  296. {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_review_check_name.py +0 -0
  297. {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_review_cli.py +0 -0
  298. {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_review_close_gr.py +0 -0
  299. {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_review_close_keeps_local_work.py +0 -0
  300. {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_review_context_defaults.py +0 -0
  301. {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_review_context_witnesses.py +0 -0
  302. {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_review_create_project_cli.py +0 -0
  303. {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_review_dispatch.py +0 -0
  304. {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_review_ephemeral.py +0 -0
  305. {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_review_events.py +0 -0
  306. {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_review_field_tree.py +0 -0
  307. {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_review_field_tree_readers.py +0 -0
  308. {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_review_install_hint.py +0 -0
  309. {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_review_merge_gate.py +0 -0
  310. {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_review_merge_gate_lost_ack.py +0 -0
  311. {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_review_open_lane.py +0 -0
  312. {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_review_pr_marker_context.py +0 -0
  313. {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_review_rebind.py +0 -0
  314. {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_review_receipt_cleanup.py +0 -0
  315. {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_review_ref_v1_migration.py +0 -0
  316. {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_review_ref_v1_reader.py +0 -0
  317. {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_review_ref_v1_writer.py +0 -0
  318. {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_review_run.py +0 -0
  319. {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_review_run_context.py +0 -0
  320. {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_review_run_dependency_order.py +0 -0
  321. {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_review_run_import_isolation.py +0 -0
  322. {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_review_run_integrity_recheck.py +0 -0
  323. {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_review_run_multi_repo.py +0 -0
  324. {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_review_run_plugin_order.py +0 -0
  325. {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_review_run_rerun_and_refusal_receipt.py +0 -0
  326. {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_review_runners.py +0 -0
  327. {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_review_v1_format_guard.py +0 -0
  328. {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_review_verify_inside.py +0 -0
  329. {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_rmtree_or_refuse.py +0 -0
  330. {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_selected_workspace_commit.py +0 -0
  331. {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_single_repo_cwd_refusal.py +0 -0
  332. {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_snapshot_id_prefix_resolution.py +0 -0
  333. {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_spec_apply_event_outcomes.py +0 -0
  334. {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_spec_declaration_ref_pin.py +0 -0
  335. {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_sprint21_sync_platform.py +0 -0
  336. {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_staging_cleanup.py +0 -0
  337. {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_store_break_attempts.py +0 -0
  338. {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_store_checkout_atomicity.py +0 -0
  339. {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_store_commit_noop.py +0 -0
  340. {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_store_declared_members.py +0 -0
  341. {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_store_git_native_smoke.py +0 -0
  342. {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_store_init_branch_inference.py +0 -0
  343. {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_store_log_adoption_boundary.py +0 -0
  344. {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_store_member_path_hygiene.py +0 -0
  345. {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_store_member_state.py +0 -0
  346. {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_store_migrate_branch_inference.py +0 -0
  347. {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_store_moved_workspace_guard.py +0 -0
  348. {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_store_status_values.py +0 -0
  349. {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_store_verb_rename.py +0 -0
  350. {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_store_verb_witnesses.py +0 -0
  351. {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_submodule_member_predicate.py +0 -0
  352. {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_superproject_import.py +0 -0
  353. {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_sync_event_outcomes.py +0 -0
  354. {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_sync_fast_forward.py +0 -0
  355. {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_sync_fetch.py +0 -0
  356. {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_sync_seed_local.py +0 -0
  357. {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_target.py +0 -0
  358. {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_unit_abort.py +0 -0
  359. {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_unit_apply.py +0 -0
  360. {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_unit_apply_dry_run.py +0 -0
  361. {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_unit_manifest_schema.py +0 -0
  362. {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_unit_propose.py +0 -0
  363. {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_unit_topological_apply.py +0 -0
  364. {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_validate_repo_path_conflict.py +0 -0
  365. {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_version_identity.py +0 -0
  366. {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_workspace_convert_clone.py +0 -0
  367. {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_workspace_edit_lease_cap.py +0 -0
  368. {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_workspace_identity_boundary.py +0 -0
  369. {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_workspace_init_from_topology.py +0 -0
  370. {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_workspace_init_local_repos.py +0 -0
  371. {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_workspace_root_defaults.py +0 -0
  372. {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_workspace_root_nearest_marker.py +0 -0
  373. {gitgrip-2.0.0a7 → gitgrip-2.0.0a8}/tests/test_workspace_snapshot.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: gitgrip
3
- Version: 2.0.0a7
3
+ Version: 2.0.0a8
4
4
  Summary: Workspace layer for multi-repo work: workspaces, isolated lanes, and one grouped review per slice
5
5
  Requires-Python: >=3.11
6
6
  Description-Content-Type: text/markdown
@@ -21,7 +21,7 @@ Requires-Dist: packaging>=22; extra == "dev"
21
21
  ## Install
22
22
 
23
23
  ```bash
24
- uv tool install --pre gitgrip # the PyPI package is "gitgrip"; the command is "gr2"
24
+ uv tool install --pre gitgrip # the PyPI package is "gitgrip"; it installs `gr` and `gr2`
25
25
  gr2 --version
26
26
  ```
27
27
 
@@ -37,7 +37,9 @@ gr2 --version
37
37
 
38
38
  Already installed 1.5.0 or 1.5.1? The install commands above leave it in place, because an installed version already satisfies them. Upgrade explicitly: `uv tool upgrade --prerelease allow gitgrip`, or `pip install --pre -U gitgrip`. To run unreleased development code instead, install from a checkout: `pip install -e gr2/` from the repository root.
39
39
 
40
- The Rust `gr` (gr1, 1.x) installs with `brew install synapt-dev/tap/gitgrip` or `cargo install gitgrip`. The two do not collide; you can have both installed.
40
+ The package installs two commands. `gr2` always runs gr2. `gr` picks by the nearest workspace marker: in a gr1 workspace (`.gitgrip`) it runs gr1, and anywhere else, including outside any workspace, it runs gr2.
41
+
42
+ The Rust `gr` (gr1, 1.x) installs with `brew install synapt-dev/tap/gitgrip` or `cargo install gitgrip`, as `gr` and `gitgrip`. You can have both installed. Whichever `gr` comes first on `PATH` answers: gitgrip 1.5 and earlier always run gr1, so if it comes first, type `gr2` for gr2 (`gr2` says so once). In a gr1 workspace, this package's `gr` runs gr1 through `gitgrip`. With no gr1 installed, it serves a workspace already moved with `gr2 workspace migrate-gr1`, and in one not yet moved it says how to move it.
41
43
 
42
44
  ## First five minutes
43
45
 
@@ -108,13 +110,45 @@ Not there yet:
108
110
  | `sync` | status, run |
109
111
  | `pr` | create, status, checks, merge, view |
110
112
  | `check` | run, show |
111
- | `review` | open, close, checkout-pr, run, check, bind, publish, receive, verify, show, merge, rebind, create-project |
113
+ | `review` | open, close, checkout-pr, run, check, pin, publish, receive, verify, show, stamp, merge, repin, create-project, bind, approve, rebind |
112
114
  | `exec` | status, run |
113
115
  | `repo` | status, projection-run |
114
116
  | `hooks` | trust, revoke, status, show, run |
115
117
  | `store` | init, commit, check, push, status, log, diff, checkout, materialize, migrate, migrate-reviews |
116
118
  | `target`, `config` | stored PR target; config overlays |
117
119
 
120
+ `review bind`, `review approve` and `review rebind` remain as aliases of `pin`, `stamp` and `repin`.
121
+
122
+ The words these commands use (lane, pin, stamp, repin, gate, review) are defined in [docs/GLOSSARY.md](docs/GLOSSARY.md).
123
+
124
+ ## Stamps (unsigned approvals)
125
+
126
+ Inside a workspace with one pinned review matching every member's current head,
127
+ a reviewer stamps it as the workspace's Git `user.name`:
128
+
129
+ ```bash
130
+ gr2 review stamp
131
+ gr2 review merge
132
+ ```
133
+
134
+ The author recorded by the pin, and anyone who authored a commit in its range,
135
+ cannot stamp it. A stamp records an approval; approver names are self-declared and receipts say `signed: false`.
136
+ Repeated stamps by the same name count once. A moved head needs a new pin
137
+ and fresh stamps. Signing is not implemented by these commands.
138
+
139
+ The workspace's `grip.toml` sets the number required before merging:
140
+
141
+ ```toml
142
+ [approvals]
143
+ required = 2
144
+ ```
145
+
146
+ The default is zero; `review merge --approvals N` can raise the count for that
147
+ run, but cannot lower the workspace policy. With zero required, the merge gate
148
+ skips approval counting. When approvals are required, broken records or different
149
+ chain tips across member remotes refuse before this run pushes a merge. After a refused stamp, rerun
150
+ `review stamp` to read the current chain and retry with a lease.
151
+
118
152
  ## Overlay substrate
119
153
 
120
154
  gr2 also carries the config-overlay substrate (capture, compose, and materialize configuration layers over a workspace): see [docs/OVERLAY-SUBSTRATE.md](docs/OVERLAY-SUBSTRATE.md).
@@ -133,17 +167,17 @@ Migration: use `gr2 review check` for compiled review requirements. `review requ
133
167
  remains a hidden alias with a warning on stderr until beta. Both report `satisfied`
134
168
  in the same JSON payload, and a missing reviewer remains a reported status with exit 0.
135
169
 
136
- A bare `gr2 review open <workspace>` uses the workspace's sole review bind. Its default directory is `<workspace>.review/<sha8>` in the workspace's parent directory, and the command announces that path on stderr. Give `--lane-dir` to choose another location.
170
+ A bare `gr2 review open <workspace>` uses the workspace's sole pinned review. Its default directory is `<workspace>.review/<sha8>` in the workspace's parent directory, and the command announces that path on stderr. Give `--lane-dir` to choose another location.
137
171
 
138
- New review binds record the binder's Git `user.name` from the workspace root.
172
+ New pinned reviews record the author's Git `user.name` from the workspace root.
139
173
  Set it with `git config user.name 'Your Name'` there if Git has no configured name.
140
- `review show --json` and `review verify --json` include this author; older binds
174
+ `review show --json` and `review verify --json` include this author; older pinned reviews
141
175
  remain readable without an author field, and reading them does not invent one.
142
176
 
143
177
 
144
178
  ## Transfer a native review
145
179
 
146
- Publish an existing bound review and receive it in another native workspace:
180
+ Publish an existing pinned review and receive it in another native workspace:
147
181
 
148
182
  ```bash
149
183
  gr2 review publish gr:<full-review-id> --remote https://example.org/workspace.git
@@ -164,7 +198,7 @@ refused without falling back to context.
164
198
  Publish transfers only that review ref and confirms its returned target. Receive
165
199
  compares both the advertised and actual fetched raw target with the expected ID,
166
200
  requires a commit and recomputable review content, then creates the canonical
167
- local bind ref. A valid same-ID receive is idempotent. A conflicting existing ref
201
+ local review ref. A valid same-ID receive is idempotent. A conflicting existing ref
168
202
  is refused. Object downloads may remain after refusal. The owned temporary ref
169
203
  is removed separately, and cleanup failure is reported without replacing a
170
204
  primary failure.
@@ -183,6 +217,9 @@ or cleanup authority. Opening a reconstruction remains a separate operation.
183
217
  External packages can expose a zero-argument factory through the
184
218
  `gr2.platform_adapters` entry-point group. See [the adapter contract](docs/PR-LIFECYCLE.md#51-adapter-protocol-and-capabilities)
185
219
  for registration, optional operation capabilities and merge head-pin requirements.
220
+ What changed in that protocol, release by release, ships in the package: read it from
221
+ an install with `importlib.resources.files("gr2") / "PLATFORM_ADAPTER_CHANGELOG.md"`,
222
+ or in this repository at [gr2/PLATFORM_ADAPTER_CHANGELOG.md](gr2/PLATFORM_ADAPTER_CHANGELOG.md).
186
223
  Select the installed adapter with `gr2 pr create ... --platform NAME` on a
187
224
  materialized lane. The bound-lane path currently pushes and returns its receipt.
188
225
 
@@ -225,13 +262,13 @@ failure at that commit. Concurrent writes union observations with bounded
225
262
  compare-and-swap retries. An unmeasurable push acknowledgement is reported as
226
263
  indeterminate unless a fresh remote read confirms the observation.
227
264
 
228
- ## Merge a bound review into plain Git remotes
265
+ ## Merge a pinned review into plain Git remotes
229
266
 
230
267
  ```sh
231
268
  gr2 review merge
232
269
  ```
233
270
 
234
- This merges the review bound at the members' current heads, from their current branch, into the
271
+ This merges the review pinned at the members' current heads, from their current branch, into the
235
272
  branch on each remote that still sits at the reviewed base, and prints what it resolved. If several
236
273
  branches sit there, it asks for `--into`. It merges only if every member's remote feature
237
274
  branch is still the reviewed head, the target is still the reviewed base, and the exact-head check
@@ -243,7 +280,7 @@ Exit codes:
243
280
  - 3: none merged (refused);
244
281
  - 4: partial or unknown.
245
282
 
246
- A review id, `--from` and `--into` override the defaults. Zero or several matching binds, or members on
283
+ A review id, `--from` and `--into` override the defaults. Zero or several matching pinned reviews, or members on
247
284
  different branches, refuse and name the value to pass.
248
285
 
249
286
  These records are attestations by writers trusted with remote access, not signed
@@ -5,7 +5,7 @@
5
5
  ## Install
6
6
 
7
7
  ```bash
8
- uv tool install --pre gitgrip # the PyPI package is "gitgrip"; the command is "gr2"
8
+ uv tool install --pre gitgrip # the PyPI package is "gitgrip"; it installs `gr` and `gr2`
9
9
  gr2 --version
10
10
  ```
11
11
 
@@ -21,7 +21,9 @@ gr2 --version
21
21
 
22
22
  Already installed 1.5.0 or 1.5.1? The install commands above leave it in place, because an installed version already satisfies them. Upgrade explicitly: `uv tool upgrade --prerelease allow gitgrip`, or `pip install --pre -U gitgrip`. To run unreleased development code instead, install from a checkout: `pip install -e gr2/` from the repository root.
23
23
 
24
- The Rust `gr` (gr1, 1.x) installs with `brew install synapt-dev/tap/gitgrip` or `cargo install gitgrip`. The two do not collide; you can have both installed.
24
+ The package installs two commands. `gr2` always runs gr2. `gr` picks by the nearest workspace marker: in a gr1 workspace (`.gitgrip`) it runs gr1, and anywhere else, including outside any workspace, it runs gr2.
25
+
26
+ The Rust `gr` (gr1, 1.x) installs with `brew install synapt-dev/tap/gitgrip` or `cargo install gitgrip`, as `gr` and `gitgrip`. You can have both installed. Whichever `gr` comes first on `PATH` answers: gitgrip 1.5 and earlier always run gr1, so if it comes first, type `gr2` for gr2 (`gr2` says so once). In a gr1 workspace, this package's `gr` runs gr1 through `gitgrip`. With no gr1 installed, it serves a workspace already moved with `gr2 workspace migrate-gr1`, and in one not yet moved it says how to move it.
25
27
 
26
28
  ## First five minutes
27
29
 
@@ -92,13 +94,45 @@ Not there yet:
92
94
  | `sync` | status, run |
93
95
  | `pr` | create, status, checks, merge, view |
94
96
  | `check` | run, show |
95
- | `review` | open, close, checkout-pr, run, check, bind, publish, receive, verify, show, merge, rebind, create-project |
97
+ | `review` | open, close, checkout-pr, run, check, pin, publish, receive, verify, show, stamp, merge, repin, create-project, bind, approve, rebind |
96
98
  | `exec` | status, run |
97
99
  | `repo` | status, projection-run |
98
100
  | `hooks` | trust, revoke, status, show, run |
99
101
  | `store` | init, commit, check, push, status, log, diff, checkout, materialize, migrate, migrate-reviews |
100
102
  | `target`, `config` | stored PR target; config overlays |
101
103
 
104
+ `review bind`, `review approve` and `review rebind` remain as aliases of `pin`, `stamp` and `repin`.
105
+
106
+ The words these commands use (lane, pin, stamp, repin, gate, review) are defined in [docs/GLOSSARY.md](docs/GLOSSARY.md).
107
+
108
+ ## Stamps (unsigned approvals)
109
+
110
+ Inside a workspace with one pinned review matching every member's current head,
111
+ a reviewer stamps it as the workspace's Git `user.name`:
112
+
113
+ ```bash
114
+ gr2 review stamp
115
+ gr2 review merge
116
+ ```
117
+
118
+ The author recorded by the pin, and anyone who authored a commit in its range,
119
+ cannot stamp it. A stamp records an approval; approver names are self-declared and receipts say `signed: false`.
120
+ Repeated stamps by the same name count once. A moved head needs a new pin
121
+ and fresh stamps. Signing is not implemented by these commands.
122
+
123
+ The workspace's `grip.toml` sets the number required before merging:
124
+
125
+ ```toml
126
+ [approvals]
127
+ required = 2
128
+ ```
129
+
130
+ The default is zero; `review merge --approvals N` can raise the count for that
131
+ run, but cannot lower the workspace policy. With zero required, the merge gate
132
+ skips approval counting. When approvals are required, broken records or different
133
+ chain tips across member remotes refuse before this run pushes a merge. After a refused stamp, rerun
134
+ `review stamp` to read the current chain and retry with a lease.
135
+
102
136
  ## Overlay substrate
103
137
 
104
138
  gr2 also carries the config-overlay substrate (capture, compose, and materialize configuration layers over a workspace): see [docs/OVERLAY-SUBSTRATE.md](docs/OVERLAY-SUBSTRATE.md).
@@ -117,17 +151,17 @@ Migration: use `gr2 review check` for compiled review requirements. `review requ
117
151
  remains a hidden alias with a warning on stderr until beta. Both report `satisfied`
118
152
  in the same JSON payload, and a missing reviewer remains a reported status with exit 0.
119
153
 
120
- A bare `gr2 review open <workspace>` uses the workspace's sole review bind. Its default directory is `<workspace>.review/<sha8>` in the workspace's parent directory, and the command announces that path on stderr. Give `--lane-dir` to choose another location.
154
+ A bare `gr2 review open <workspace>` uses the workspace's sole pinned review. Its default directory is `<workspace>.review/<sha8>` in the workspace's parent directory, and the command announces that path on stderr. Give `--lane-dir` to choose another location.
121
155
 
122
- New review binds record the binder's Git `user.name` from the workspace root.
156
+ New pinned reviews record the author's Git `user.name` from the workspace root.
123
157
  Set it with `git config user.name 'Your Name'` there if Git has no configured name.
124
- `review show --json` and `review verify --json` include this author; older binds
158
+ `review show --json` and `review verify --json` include this author; older pinned reviews
125
159
  remain readable without an author field, and reading them does not invent one.
126
160
 
127
161
 
128
162
  ## Transfer a native review
129
163
 
130
- Publish an existing bound review and receive it in another native workspace:
164
+ Publish an existing pinned review and receive it in another native workspace:
131
165
 
132
166
  ```bash
133
167
  gr2 review publish gr:<full-review-id> --remote https://example.org/workspace.git
@@ -148,7 +182,7 @@ refused without falling back to context.
148
182
  Publish transfers only that review ref and confirms its returned target. Receive
149
183
  compares both the advertised and actual fetched raw target with the expected ID,
150
184
  requires a commit and recomputable review content, then creates the canonical
151
- local bind ref. A valid same-ID receive is idempotent. A conflicting existing ref
185
+ local review ref. A valid same-ID receive is idempotent. A conflicting existing ref
152
186
  is refused. Object downloads may remain after refusal. The owned temporary ref
153
187
  is removed separately, and cleanup failure is reported without replacing a
154
188
  primary failure.
@@ -167,6 +201,9 @@ or cleanup authority. Opening a reconstruction remains a separate operation.
167
201
  External packages can expose a zero-argument factory through the
168
202
  `gr2.platform_adapters` entry-point group. See [the adapter contract](docs/PR-LIFECYCLE.md#51-adapter-protocol-and-capabilities)
169
203
  for registration, optional operation capabilities and merge head-pin requirements.
204
+ What changed in that protocol, release by release, ships in the package: read it from
205
+ an install with `importlib.resources.files("gr2") / "PLATFORM_ADAPTER_CHANGELOG.md"`,
206
+ or in this repository at [gr2/PLATFORM_ADAPTER_CHANGELOG.md](gr2/PLATFORM_ADAPTER_CHANGELOG.md).
170
207
  Select the installed adapter with `gr2 pr create ... --platform NAME` on a
171
208
  materialized lane. The bound-lane path currently pushes and returns its receipt.
172
209
 
@@ -209,13 +246,13 @@ failure at that commit. Concurrent writes union observations with bounded
209
246
  compare-and-swap retries. An unmeasurable push acknowledgement is reported as
210
247
  indeterminate unless a fresh remote read confirms the observation.
211
248
 
212
- ## Merge a bound review into plain Git remotes
249
+ ## Merge a pinned review into plain Git remotes
213
250
 
214
251
  ```sh
215
252
  gr2 review merge
216
253
  ```
217
254
 
218
- This merges the review bound at the members' current heads, from their current branch, into the
255
+ This merges the review pinned at the members' current heads, from their current branch, into the
219
256
  branch on each remote that still sits at the reviewed base, and prints what it resolved. If several
220
257
  branches sit there, it asks for `--into`. It merges only if every member's remote feature
221
258
  branch is still the reviewed head, the target is still the reviewed base, and the exact-head check
@@ -227,7 +264,7 @@ Exit codes:
227
264
  - 3: none merged (refused);
228
265
  - 4: partial or unknown.
229
266
 
230
- A review id, `--from` and `--into` override the defaults. Zero or several matching binds, or members on
267
+ A review id, `--from` and `--into` override the defaults. Zero or several matching pinned reviews, or members on
231
268
  different branches, refuse and name the value to pass.
232
269
 
233
270
  These records are attestations by writers trusted with remote access, not signed
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: gitgrip
3
- Version: 2.0.0a7
3
+ Version: 2.0.0a8
4
4
  Summary: Workspace layer for multi-repo work: workspaces, isolated lanes, and one grouped review per slice
5
5
  Requires-Python: >=3.11
6
6
  Description-Content-Type: text/markdown
@@ -21,7 +21,7 @@ Requires-Dist: packaging>=22; extra == "dev"
21
21
  ## Install
22
22
 
23
23
  ```bash
24
- uv tool install --pre gitgrip # the PyPI package is "gitgrip"; the command is "gr2"
24
+ uv tool install --pre gitgrip # the PyPI package is "gitgrip"; it installs `gr` and `gr2`
25
25
  gr2 --version
26
26
  ```
27
27
 
@@ -37,7 +37,9 @@ gr2 --version
37
37
 
38
38
  Already installed 1.5.0 or 1.5.1? The install commands above leave it in place, because an installed version already satisfies them. Upgrade explicitly: `uv tool upgrade --prerelease allow gitgrip`, or `pip install --pre -U gitgrip`. To run unreleased development code instead, install from a checkout: `pip install -e gr2/` from the repository root.
39
39
 
40
- The Rust `gr` (gr1, 1.x) installs with `brew install synapt-dev/tap/gitgrip` or `cargo install gitgrip`. The two do not collide; you can have both installed.
40
+ The package installs two commands. `gr2` always runs gr2. `gr` picks by the nearest workspace marker: in a gr1 workspace (`.gitgrip`) it runs gr1, and anywhere else, including outside any workspace, it runs gr2.
41
+
42
+ The Rust `gr` (gr1, 1.x) installs with `brew install synapt-dev/tap/gitgrip` or `cargo install gitgrip`, as `gr` and `gitgrip`. You can have both installed. Whichever `gr` comes first on `PATH` answers: gitgrip 1.5 and earlier always run gr1, so if it comes first, type `gr2` for gr2 (`gr2` says so once). In a gr1 workspace, this package's `gr` runs gr1 through `gitgrip`. With no gr1 installed, it serves a workspace already moved with `gr2 workspace migrate-gr1`, and in one not yet moved it says how to move it.
41
43
 
42
44
  ## First five minutes
43
45
 
@@ -108,13 +110,45 @@ Not there yet:
108
110
  | `sync` | status, run |
109
111
  | `pr` | create, status, checks, merge, view |
110
112
  | `check` | run, show |
111
- | `review` | open, close, checkout-pr, run, check, bind, publish, receive, verify, show, merge, rebind, create-project |
113
+ | `review` | open, close, checkout-pr, run, check, pin, publish, receive, verify, show, stamp, merge, repin, create-project, bind, approve, rebind |
112
114
  | `exec` | status, run |
113
115
  | `repo` | status, projection-run |
114
116
  | `hooks` | trust, revoke, status, show, run |
115
117
  | `store` | init, commit, check, push, status, log, diff, checkout, materialize, migrate, migrate-reviews |
116
118
  | `target`, `config` | stored PR target; config overlays |
117
119
 
120
+ `review bind`, `review approve` and `review rebind` remain as aliases of `pin`, `stamp` and `repin`.
121
+
122
+ The words these commands use (lane, pin, stamp, repin, gate, review) are defined in [docs/GLOSSARY.md](docs/GLOSSARY.md).
123
+
124
+ ## Stamps (unsigned approvals)
125
+
126
+ Inside a workspace with one pinned review matching every member's current head,
127
+ a reviewer stamps it as the workspace's Git `user.name`:
128
+
129
+ ```bash
130
+ gr2 review stamp
131
+ gr2 review merge
132
+ ```
133
+
134
+ The author recorded by the pin, and anyone who authored a commit in its range,
135
+ cannot stamp it. A stamp records an approval; approver names are self-declared and receipts say `signed: false`.
136
+ Repeated stamps by the same name count once. A moved head needs a new pin
137
+ and fresh stamps. Signing is not implemented by these commands.
138
+
139
+ The workspace's `grip.toml` sets the number required before merging:
140
+
141
+ ```toml
142
+ [approvals]
143
+ required = 2
144
+ ```
145
+
146
+ The default is zero; `review merge --approvals N` can raise the count for that
147
+ run, but cannot lower the workspace policy. With zero required, the merge gate
148
+ skips approval counting. When approvals are required, broken records or different
149
+ chain tips across member remotes refuse before this run pushes a merge. After a refused stamp, rerun
150
+ `review stamp` to read the current chain and retry with a lease.
151
+
118
152
  ## Overlay substrate
119
153
 
120
154
  gr2 also carries the config-overlay substrate (capture, compose, and materialize configuration layers over a workspace): see [docs/OVERLAY-SUBSTRATE.md](docs/OVERLAY-SUBSTRATE.md).
@@ -133,17 +167,17 @@ Migration: use `gr2 review check` for compiled review requirements. `review requ
133
167
  remains a hidden alias with a warning on stderr until beta. Both report `satisfied`
134
168
  in the same JSON payload, and a missing reviewer remains a reported status with exit 0.
135
169
 
136
- A bare `gr2 review open <workspace>` uses the workspace's sole review bind. Its default directory is `<workspace>.review/<sha8>` in the workspace's parent directory, and the command announces that path on stderr. Give `--lane-dir` to choose another location.
170
+ A bare `gr2 review open <workspace>` uses the workspace's sole pinned review. Its default directory is `<workspace>.review/<sha8>` in the workspace's parent directory, and the command announces that path on stderr. Give `--lane-dir` to choose another location.
137
171
 
138
- New review binds record the binder's Git `user.name` from the workspace root.
172
+ New pinned reviews record the author's Git `user.name` from the workspace root.
139
173
  Set it with `git config user.name 'Your Name'` there if Git has no configured name.
140
- `review show --json` and `review verify --json` include this author; older binds
174
+ `review show --json` and `review verify --json` include this author; older pinned reviews
141
175
  remain readable without an author field, and reading them does not invent one.
142
176
 
143
177
 
144
178
  ## Transfer a native review
145
179
 
146
- Publish an existing bound review and receive it in another native workspace:
180
+ Publish an existing pinned review and receive it in another native workspace:
147
181
 
148
182
  ```bash
149
183
  gr2 review publish gr:<full-review-id> --remote https://example.org/workspace.git
@@ -164,7 +198,7 @@ refused without falling back to context.
164
198
  Publish transfers only that review ref and confirms its returned target. Receive
165
199
  compares both the advertised and actual fetched raw target with the expected ID,
166
200
  requires a commit and recomputable review content, then creates the canonical
167
- local bind ref. A valid same-ID receive is idempotent. A conflicting existing ref
201
+ local review ref. A valid same-ID receive is idempotent. A conflicting existing ref
168
202
  is refused. Object downloads may remain after refusal. The owned temporary ref
169
203
  is removed separately, and cleanup failure is reported without replacing a
170
204
  primary failure.
@@ -183,6 +217,9 @@ or cleanup authority. Opening a reconstruction remains a separate operation.
183
217
  External packages can expose a zero-argument factory through the
184
218
  `gr2.platform_adapters` entry-point group. See [the adapter contract](docs/PR-LIFECYCLE.md#51-adapter-protocol-and-capabilities)
185
219
  for registration, optional operation capabilities and merge head-pin requirements.
220
+ What changed in that protocol, release by release, ships in the package: read it from
221
+ an install with `importlib.resources.files("gr2") / "PLATFORM_ADAPTER_CHANGELOG.md"`,
222
+ or in this repository at [gr2/PLATFORM_ADAPTER_CHANGELOG.md](gr2/PLATFORM_ADAPTER_CHANGELOG.md).
186
223
  Select the installed adapter with `gr2 pr create ... --platform NAME` on a
187
224
  materialized lane. The bound-lane path currently pushes and returns its receipt.
188
225
 
@@ -225,13 +262,13 @@ failure at that commit. Concurrent writes union observations with bounded
225
262
  compare-and-swap retries. An unmeasurable push acknowledgement is reported as
226
263
  indeterminate unless a fresh remote read confirms the observation.
227
264
 
228
- ## Merge a bound review into plain Git remotes
265
+ ## Merge a pinned review into plain Git remotes
229
266
 
230
267
  ```sh
231
268
  gr2 review merge
232
269
  ```
233
270
 
234
- This merges the review bound at the members' current heads, from their current branch, into the
271
+ This merges the review pinned at the members' current heads, from their current branch, into the
235
272
  branch on each remote that still sits at the reviewed base, and prints what it resolved. If several
236
273
  branches sit there, it asks for `--into`. It merges only if every member's remote feature
237
274
  branch is still the reviewed head, the target is still the reviewed base, and the exact-head check
@@ -243,7 +280,7 @@ Exit codes:
243
280
  - 3: none merged (refused);
244
281
  - 4: partial or unknown.
245
282
 
246
- A review id, `--from` and `--into` override the defaults. Zero or several matching binds, or members on
283
+ A review id, `--from` and `--into` override the defaults. Zero or several matching pinned reviews, or members on
247
284
  different branches, refuse and name the value to pass.
248
285
 
249
286
  These records are attestations by writers trusted with remote access, not signed
@@ -6,6 +6,7 @@ gitgrip.egg-info/dependency_links.txt
6
6
  gitgrip.egg-info/entry_points.txt
7
7
  gitgrip.egg-info/requires.txt
8
8
  gitgrip.egg-info/top_level.txt
9
+ gr2/PLATFORM_ADAPTER_CHANGELOG.md
9
10
  gr2/__init__.py
10
11
  gr2/api_core.py
11
12
  gr2/overlay/__init__.py
@@ -50,6 +51,7 @@ gr2/python_cli/__main__.py
50
51
  gr2/python_cli/add.py
51
52
  gr2/python_cli/app.py
52
53
  gr2/python_cli/approval_schema.py
54
+ gr2/python_cli/approvals.py
53
55
  gr2/python_cli/branch.py
54
56
  gr2/python_cli/channel_bridge.py
55
57
  gr2/python_cli/check_records.py
@@ -70,6 +72,7 @@ gr2/python_cli/git_review.py
70
72
  gr2/python_cli/gitinclude.py
71
73
  gr2/python_cli/gitops.py
72
74
  gr2/python_cli/gr_resolver.py
75
+ gr2/python_cli/gr_shadow.py
73
76
  gr2/python_cli/grip.py
74
77
  gr2/python_cli/grip_cli.py
75
78
  gr2/python_cli/hooks.py
@@ -156,10 +159,14 @@ tests/test_first_five_minutes.py
156
159
  tests/test_foreground_launch_runtime.py
157
160
  tests/test_git_review.py
158
161
  tests/test_gitinclude_compiler.py
162
+ tests/test_gitops_shared.py
159
163
  tests/test_gr1_first_run_guidance.py
160
164
  tests/test_gr2_packaging.py
161
165
  tests/test_gr2_review_receipt.py
166
+ tests/test_gr_installed_wheel.py
167
+ tests/test_gr_resolved_cleared.py
162
168
  tests/test_gr_resolver_conformance.py
169
+ tests/test_gr_shadow.py
163
170
  tests/test_grip_cli.py
164
171
  tests/test_grip_hardening.py
165
172
  tests/test_grip_snapshot.py
@@ -183,6 +190,7 @@ tests/test_lane_lease_show_json.py
183
190
  tests/test_lane_lifecycle_safety.py
184
191
  tests/test_lane_plugins.py
185
192
  tests/test_lane_probe.py
193
+ tests/test_lane_probe_batch.py
186
194
  tests/test_lane_repo_paths_and_all_skipped.py
187
195
  tests/test_lane_roles.py
188
196
  tests/test_lane_show_name.py
@@ -229,6 +237,7 @@ tests/test_overlay_tier_b_repo_state.py
229
237
  tests/test_overlay_tier_b_staging_discipline.py
230
238
  tests/test_overlay_trust_model.py
231
239
  tests/test_overlay_workspace_spec.py
240
+ tests/test_platform_adapter_changelog.py
232
241
  tests/test_platform_adapter_plugins.py
233
242
  tests/test_pr_events.py
234
243
  tests/test_pr_group_legibility.py
@@ -260,6 +269,7 @@ tests/test_review_a4_v2.py
260
269
  tests/test_review_a4_v3.py
261
270
  tests/test_review_allocation_recovery.py
262
271
  tests/test_review_ansi_parse.py
272
+ tests/test_review_approvals.py
263
273
  tests/test_review_b3_reader_alignment.py
264
274
  tests/test_review_bind_author.py
265
275
  tests/test_review_bind_fork_base.py
@@ -285,6 +295,7 @@ tests/test_review_install_hint.py
285
295
  tests/test_review_merge_gate.py
286
296
  tests/test_review_merge_gate_lost_ack.py
287
297
  tests/test_review_open_lane.py
298
+ tests/test_review_pin_stamp_names.py
288
299
  tests/test_review_pr_marker_context.py
289
300
  tests/test_review_reader_defaults.py
290
301
  tests/test_review_rebind.py
@@ -306,6 +317,7 @@ tests/test_review_subject.py
306
317
  tests/test_review_transport.py
307
318
  tests/test_review_v1_format_guard.py
308
319
  tests/test_review_verify_inside.py
320
+ tests/test_review_vocabulary.py
309
321
  tests/test_rmtree_or_refuse.py
310
322
  tests/test_root_option_verbs.py
311
323
  tests/test_selected_workspace_commit.py
@@ -348,6 +360,7 @@ tests/test_unit_topological_apply.py
348
360
  tests/test_validate_repo_path_conflict.py
349
361
  tests/test_version_identity.py
350
362
  tests/test_version_static.py
363
+ tests/test_vocabulary.py
351
364
  tests/test_workspace_convert_clone.py
352
365
  tests/test_workspace_edit_lease_cap.py
353
366
  tests/test_workspace_identity_boundary.py
@@ -1,3 +1,4 @@
1
1
  [console_scripts]
2
2
  git-review = gr2.python_cli.git_review:main
3
+ gr = gr2.python_cli.gr_resolver:main
3
4
  gr2 = gr2.python_cli.app:main
@@ -0,0 +1,67 @@
1
+ # gr2 platform adapter protocol: changes
2
+
3
+ This file ships inside the `gitgrip` wheel and sdist, so an adapter author can read it from the installed
4
+ package:
5
+
6
+ ```python
7
+ from importlib.resources import files
8
+ print((files("gr2") / "PLATFORM_ADAPTER_CHANGELOG.md").read_text())
9
+ ```
10
+
11
+ It covers what an out-of-tree adapter implements or receives: the `PlatformAdapter` protocol in
12
+ `gr2.python_cli.platform`, the request and result types passed through it, and the registration seam.
13
+ Each entry names the release that first carried it. The full release notes for every change are in the
14
+ project's `CHANGELOG.md` and its GitHub releases.
15
+
16
+ `PLATFORM_ADAPTER_API_VERSION` is the protocol's version number. It is `1`, and it changes only for a change
17
+ an existing adapter cannot absorb.
18
+
19
+ ## 2.0.0a8
20
+
21
+ - **`CreatePRRequest.remote`** is new (default `None`): the exact Git URL configured for the selected
22
+ member in the workspace spec or review bind. Created PR groups retain it as `prs[].remote` when it is
23
+ supplied. Direct Python callers may omit it and keep the previous stored-group shape. This is additive
24
+ to adapter API version 1; factories still take no arguments and `repo` keeps its existing value.
25
+ Later lifecycle calls still receive the existing repo string; this field supplies creation context only.
26
+ Lane URLs are stripped of surrounding whitespace; blank values are treated as absent.
27
+ A lane member URL carrying credentials is refused by member name before adapter calls or PR state writes.
28
+
29
+ ## 2.0.0a7
30
+
31
+ - **Registration.** Adapters register through the `gr2.platform_adapters` entry point group
32
+ (`PLATFORM_ADAPTER_ENTRY_POINTS`), or in-process with `register_platform_adapter(name, factory)`, where
33
+ `factory` takes no arguments and returns the adapter. A factory is loaded only when its platform is
34
+ selected. Names are lowercase (`[a-z][a-z0-9_-]*`); `github` and `gh` are reserved, and a name registered
35
+ twice is refused.
36
+ - **`PLATFORM_ADAPTER_API_VERSION = 1`.** An adapter may set `platform_adapter_api_version`; when the adapter
37
+ is loaded, gr2 refuses one that declares any other value.
38
+ - **`require_adapter_capability(adapter, method)`.** A verb that needs a method the adapter does not
39
+ provide now fails with a named refusal before any member is changed, instead of a `TypeError` or
40
+ `AttributeError` mid-run. Every adapter must provide `create_pr` when it is loaded. **`merge_pr` must
41
+ accept the `method` and `expected_head` keywords**; an adapter whose `merge_pr` does not is refused rather
42
+ than called without the head pin.
43
+ - **`CreatePRRequest.draft` defaults to `True`** (it was `False`). A pull request opens as a draft unless
44
+ the caller asks otherwise, so an adapter must honour `draft` rather than assume a ready PR.
45
+
46
+ ## 2.0.0a6
47
+
48
+ - **`pr_view(repo, number) -> PRDetail`** is new: one PR's full state. `PRDetail` carries `ref`, `state`,
49
+ `body`, `author`, `labels`, `review_decision`, `reviews`, `head_oid`, `is_draft`, `merged`, `mergeable` and
50
+ `checks`.
51
+ - **New type `PRReview`**, one review on a PR: `user` and `state`.
52
+ - **`merge_pr(..., *, method, expected_head=None)`** gains `expected_head`. When it is given, the adapter
53
+ must merge only if the PR's head is still that commit, and refuse otherwise; `gr2 pr merge
54
+ --match-head-commit` relies on it.
55
+ - **`PRStatus.head_oid`** is new (default `None`): the PR's current head commit, which gr2 compares against
56
+ the reviewed head.
57
+
58
+ ## 2.0.0a5
59
+
60
+ - **`edit_pr_body(repo, number, body) -> None`** is new: replaces a PR's description. gr2 uses it to keep a
61
+ grouped PR set's cross-links current.
62
+
63
+ ## 2.0.0a1 to 2.0.0a4
64
+
65
+ The protocol as first published: `name`, `create_pr(CreatePRRequest) -> PRRef`, `merge_pr(repo, number, *,
66
+ method) -> MergeReceipt`, `pr_status(repo, number) -> PRStatus`, `list_prs(repo, *, head_branch=None)`, and
67
+ `pr_checks(repo, number) -> list[PRCheck]`. No protocol change between these four releases.
@@ -15,6 +15,7 @@ from gr2.overlay.trust import (
15
15
  trust_config_path,
16
16
  )
17
17
  from gr2.overlay.types import OverlayRef
18
+ from gr2.python_cli import gitops
18
19
 
19
20
  GRIP_DIR = ".grip"
20
21
  STACK_FILE = "overlay-stack.json"
@@ -187,10 +188,5 @@ def _load_managed_files(workspace_root: Path) -> dict[str, list[str]]:
187
188
 
188
189
 
189
190
  def _git_output(git_dir: Path, *args: str) -> str:
190
- result = subprocess.run(
191
- ["git", f"--git-dir={git_dir}", *args],
192
- check=True,
193
- capture_output=True,
194
- text=True,
195
- )
191
+ result = gitops.check(gitops.run_argv(["git", f"--git-dir={git_dir}", *args]))
196
192
  return result.stdout.strip()
@@ -8,6 +8,7 @@ from pathlib import Path
8
8
  from typing import Any
9
9
 
10
10
  from gr2.overlay.types import OverlayRef
11
+ from gr2.python_cli import gitops
11
12
 
12
13
  GRIP_DIR = ".grip"
13
14
 
@@ -146,10 +147,5 @@ def _read_overlay_file_list(overlay_store: Path, overlay_ref: OverlayRef) -> lis
146
147
 
147
148
 
148
149
  def _git_output(git_dir: Path, *args: str) -> str:
149
- result = subprocess.run(
150
- ["git", f"--git-dir={git_dir}", *args],
151
- check=True,
152
- capture_output=True,
153
- text=True,
154
- )
150
+ result = gitops.check(gitops.run_argv(["git", f"--git-dir={git_dir}", *args]))
155
151
  return result.stdout.strip()