gitgrip 2.0.0a7__tar.gz → 2.0.0a9__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 (433) hide show
  1. {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/PKG-INFO +62 -16
  2. {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/README.md +61 -15
  3. {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/gitgrip.egg-info/PKG-INFO +62 -16
  4. {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/gitgrip.egg-info/SOURCES.txt +72 -0
  5. {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/gitgrip.egg-info/entry_points.txt +1 -0
  6. gitgrip-2.0.0a9/gr2/PLATFORM_ADAPTER_CHANGELOG.md +97 -0
  7. {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/gr2/overlay/activate.py +2 -6
  8. {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/gr2/overlay/introspection.py +2 -6
  9. {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/gr2/overlay/objects.py +14 -77
  10. {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/gr2/overlay/refs.py +3 -12
  11. {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/gr2/prototypes/repo_maintenance_prototype.py +55 -1
  12. gitgrip-2.0.0a9/gr2/python_cli/agent_record.py +269 -0
  13. {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/gr2/python_cli/app.py +596 -75
  14. gitgrip-2.0.0a9/gr2/python_cli/approvals.py +319 -0
  15. {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/gr2/python_cli/check_records.py +7 -10
  16. {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/gr2/python_cli/clone_exec.py +2 -2
  17. {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/gr2/python_cli/consent.py +63 -30
  18. {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/gr2/python_cli/context.py +2 -1
  19. gitgrip-2.0.0a9/gr2/python_cli/declared_sets.py +217 -0
  20. {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/gr2/python_cli/defaults.py +5 -5
  21. {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/gr2/python_cli/execops.py +20 -0
  22. {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/gr2/python_cli/git_review.py +4 -6
  23. {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/gr2/python_cli/gitops.py +155 -66
  24. {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/gr2/python_cli/gr_resolver.py +67 -14
  25. gitgrip-2.0.0a9/gr2/python_cli/gr_shadow.py +101 -0
  26. {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/gr2/python_cli/grip.py +115 -68
  27. {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/gr2/python_cli/grip_cli.py +1273 -60
  28. {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/gr2/python_cli/hooks.py +292 -6
  29. {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/gr2/python_cli/lane_defaults.py +2 -4
  30. {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/gr2/python_cli/lane_downstream.py +15 -2
  31. {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/gr2/python_cli/launch_exec.py +58 -6
  32. gitgrip-2.0.0a9/gr2/python_cli/member_field_tree.py +202 -0
  33. gitgrip-2.0.0a9/gr2/python_cli/merge_gate.py +460 -0
  34. gitgrip-2.0.0a9/gr2/python_cli/merge_receipts.py +67 -0
  35. {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/gr2/python_cli/merge_verification.py +2 -7
  36. {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/gr2/python_cli/migration.py +240 -11
  37. gitgrip-2.0.0a9/gr2/python_cli/names.py +78 -0
  38. gitgrip-2.0.0a9/gr2/python_cli/next_steps.py +101 -0
  39. {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/gr2/python_cli/open_gr_review.py +58 -4
  40. {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/gr2/python_cli/platform.py +72 -6
  41. {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/gr2/python_cli/pr.py +67 -5
  42. {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/gr2/python_cli/prune.py +2 -8
  43. {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/gr2/python_cli/push.py +113 -2
  44. {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/gr2/python_cli/review_ephemeral.py +5 -10
  45. {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/gr2/python_cli/review_field_tree.py +137 -32
  46. {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/gr2/python_cli/review_members.py +14 -6
  47. {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/gr2/python_cli/review_rebind.py +10 -9
  48. {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/gr2/python_cli/review_records.py +2 -4
  49. {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/gr2/python_cli/review_run.py +62 -12
  50. {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/gr2/python_cli/root_option.py +35 -0
  51. gitgrip-2.0.0a9/gr2/python_cli/set_check.py +319 -0
  52. gitgrip-2.0.0a9/gr2/python_cli/set_hints.py +132 -0
  53. {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/gr2/python_cli/spec_apply.py +19 -1
  54. gitgrip-2.0.0a9/gr2/python_cli/store_hooks.py +579 -0
  55. gitgrip-2.0.0a9/gr2/python_cli/workspace_mode.py +50 -0
  56. {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/pyproject.toml +5 -2
  57. gitgrip-2.0.0a9/tests/test_agent_record_append.py +360 -0
  58. gitgrip-2.0.0a9/tests/test_agent_record_fold.py +334 -0
  59. gitgrip-2.0.0a9/tests/test_agent_record_stamps.py +210 -0
  60. {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_api_dump.py +8 -1
  61. gitgrip-2.0.0a9/tests/test_consent_key_paths.py +215 -0
  62. gitgrip-2.0.0a9/tests/test_declared_set_pins.py +144 -0
  63. gitgrip-2.0.0a9/tests/test_declared_sets.py +416 -0
  64. {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_defaults_from_repo.py +4 -4
  65. gitgrip-2.0.0a9/tests/test_exec_run_names_what_did_not_run.py +95 -0
  66. gitgrip-2.0.0a9/tests/test_field_tree_schema_reader.py +140 -0
  67. gitgrip-2.0.0a9/tests/test_files_compose.py +382 -0
  68. gitgrip-2.0.0a9/tests/test_git_transport_allow_list.py +254 -0
  69. gitgrip-2.0.0a9/tests/test_gitops_shared.py +340 -0
  70. gitgrip-2.0.0a9/tests/test_gr_installed_wheel.py +70 -0
  71. gitgrip-2.0.0a9/tests/test_gr_resolved_cleared.py +14 -0
  72. {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_gr_resolver_conformance.py +67 -9
  73. gitgrip-2.0.0a9/tests/test_gr_shadow.py +176 -0
  74. gitgrip-2.0.0a9/tests/test_grip_toml_literals.py +95 -0
  75. gitgrip-2.0.0a9/tests/test_hostile_names.py +218 -0
  76. gitgrip-2.0.0a9/tests/test_hostile_names_helper.py +83 -0
  77. gitgrip-2.0.0a9/tests/test_lane_probe_batch.py +134 -0
  78. gitgrip-2.0.0a9/tests/test_lane_push.py +291 -0
  79. gitgrip-2.0.0a9/tests/test_lane_remove.py +329 -0
  80. gitgrip-2.0.0a9/tests/test_malformed_remote_refusal.py +46 -0
  81. gitgrip-2.0.0a9/tests/test_migration_desk_state.py +512 -0
  82. {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_migration_unadopted_notice.py +13 -3
  83. gitgrip-2.0.0a9/tests/test_names.py +50 -0
  84. {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_native_store_gitinclude.py +1 -1
  85. gitgrip-2.0.0a9/tests/test_np_bench_contract_scenario.py +131 -0
  86. gitgrip-2.0.0a9/tests/test_out_of_set_hint.py +181 -0
  87. gitgrip-2.0.0a9/tests/test_platform_adapter_changelog.py +115 -0
  88. {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_platform_adapter_plugins.py +141 -54
  89. gitgrip-2.0.0a9/tests/test_pr_adapter_v2_target.py +377 -0
  90. {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_pr_review_subject.py +51 -0
  91. {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_push.py +1 -1
  92. {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_readme_verbs_exist.py +13 -0
  93. gitgrip-2.0.0a9/tests/test_retire_gr1.py +137 -0
  94. {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_review_a4.py +7 -7
  95. {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_review_a4_v2.py +61 -4
  96. gitgrip-2.0.0a9/tests/test_review_approvals.py +837 -0
  97. {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_review_bind_author.py +16 -0
  98. {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_review_bind_migration.py +1 -1
  99. {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_review_bind_native_store.py +1 -1
  100. {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_review_close_keeps_local_work.py +221 -1
  101. {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_review_field_tree_reader_edges.py +1 -1
  102. {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_review_merge_gate.py +118 -4
  103. {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_review_merge_gate_lost_ack.py +9 -8
  104. gitgrip-2.0.0a9/tests/test_review_merge_receipt.py +133 -0
  105. gitgrip-2.0.0a9/tests/test_review_merge_updates_tracking_ref.py +154 -0
  106. {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_review_open_lane.py +59 -0
  107. gitgrip-2.0.0a9/tests/test_review_pin_stamp_names.py +57 -0
  108. {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_review_reader_defaults.py +5 -5
  109. {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_review_remote_safety.py +122 -0
  110. gitgrip-2.0.0a9/tests/test_review_run_deleted_cwd.py +73 -0
  111. gitgrip-2.0.0a9/tests/test_review_run_package_name.py +40 -0
  112. gitgrip-2.0.0a9/tests/test_review_run_venv_and_refusal_identity.py +133 -0
  113. {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_review_subject.py +5 -5
  114. {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_review_transport.py +1 -1
  115. gitgrip-2.0.0a9/tests/test_review_vocabulary.py +66 -0
  116. {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_root_option_verbs.py +12 -6
  117. gitgrip-2.0.0a9/tests/test_set_check.py +305 -0
  118. gitgrip-2.0.0a9/tests/test_set_check_remote_heads.py +162 -0
  119. gitgrip-2.0.0a9/tests/test_skill_dump.py +111 -0
  120. gitgrip-2.0.0a9/tests/test_spec_show_native_root.py +140 -0
  121. {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_store_break_attempts.py +8 -3
  122. gitgrip-2.0.0a9/tests/test_store_commit_follows_branch.py +158 -0
  123. gitgrip-2.0.0a9/tests/test_store_commit_keeps_record.py +152 -0
  124. {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_store_commit_noop.py +4 -4
  125. gitgrip-2.0.0a9/tests/test_store_commit_refuses_rewind.py +499 -0
  126. gitgrip-2.0.0a9/tests/test_store_full_mode_carrier.py +364 -0
  127. gitgrip-2.0.0a9/tests/test_store_full_mode_coverage.py +386 -0
  128. gitgrip-2.0.0a9/tests/test_store_full_mode_layers.py +453 -0
  129. gitgrip-2.0.0a9/tests/test_store_full_mode_records.py +244 -0
  130. gitgrip-2.0.0a9/tests/test_store_git_hooks.py +641 -0
  131. {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_store_git_native_smoke.py +1 -0
  132. gitgrip-2.0.0a9/tests/test_store_gitmodules.py +188 -0
  133. gitgrip-2.0.0a9/tests/test_store_gitmodules_branch.py +150 -0
  134. gitgrip-2.0.0a9/tests/test_store_hook_takes_verb_coverage.py +190 -0
  135. gitgrip-2.0.0a9/tests/test_store_init_clone.py +220 -0
  136. gitgrip-2.0.0a9/tests/test_store_materialize_branch.py +174 -0
  137. gitgrip-2.0.0a9/tests/test_store_materialize_fetches_new_pin.py +214 -0
  138. gitgrip-2.0.0a9/tests/test_store_materialize_installs_hooks.py +179 -0
  139. gitgrip-2.0.0a9/tests/test_store_status_inspection.py +129 -0
  140. {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_store_status_values.py +49 -0
  141. gitgrip-2.0.0a9/tests/test_store_submodule_init.py +146 -0
  142. gitgrip-2.0.0a9/tests/test_store_submodule_update_merge.py +172 -0
  143. {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_store_verb_witnesses.py +212 -7
  144. {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_sync_ssh_rewrite.py +6 -0
  145. {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_sync_status_probe.py +3 -0
  146. {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_tmux_launch_runtime.py +102 -5
  147. {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_version_static.py +2 -2
  148. gitgrip-2.0.0a9/tests/test_vocabulary.py +115 -0
  149. {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_workspace_convert_clone.py +196 -0
  150. gitgrip-2.0.0a7/gr2/python_cli/merge_gate.py +0 -277
  151. {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/gitgrip.egg-info/dependency_links.txt +0 -0
  152. {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/gitgrip.egg-info/requires.txt +0 -0
  153. {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/gitgrip.egg-info/top_level.txt +0 -0
  154. {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/gr2/__init__.py +0 -0
  155. {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/gr2/api_core.py +0 -0
  156. {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/gr2/overlay/__init__.py +0 -0
  157. {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/gr2/overlay/agent_manifest.py +0 -0
  158. {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/gr2/overlay/cli.py +0 -0
  159. {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/gr2/overlay/cross_repo.py +0 -0
  160. {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/gr2/overlay/drivers.py +0 -0
  161. {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/gr2/overlay/language_drivers.py +0 -0
  162. {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/gr2/overlay/perf.py +0 -0
  163. {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/gr2/overlay/trust.py +0 -0
  164. {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/gr2/overlay/types.py +0 -0
  165. {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/gr2/overlay/units.py +0 -0
  166. {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/gr2/overlay/workspace_spec.py +0 -0
  167. {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/gr2/prototypes/__init__.py +0 -0
  168. {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/gr2/prototypes/cache_materialization_probe.py +0 -0
  169. {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/gr2/prototypes/concurrent_event_stress.py +0 -0
  170. {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/gr2/prototypes/concurrent_lease_stress.py +0 -0
  171. {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/gr2/prototypes/concurrent_workspace_cap_stress.py +0 -0
  172. {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/gr2/prototypes/contribution_protocol.py +0 -0
  173. {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/gr2/prototypes/cross_mode_lane_stress.py +0 -0
  174. {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/gr2/prototypes/jsonl_store.py +0 -0
  175. {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/gr2/prototypes/lane_workspace_prototype.py +0 -0
  176. {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/gr2/prototypes/layout_model_probe.py +0 -0
  177. {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/gr2/prototypes/propagation_daemon.py +0 -0
  178. {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/gr2/prototypes/propagation_state_machine.py +0 -0
  179. {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/gr2/prototypes/python_exec_playground.py +0 -0
  180. {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/gr2/prototypes/python_hook_runtime_playground.py +0 -0
  181. {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/gr2/prototypes/python_migration_playground.py +0 -0
  182. {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/gr2/prototypes/python_review_checkout_playground.py +0 -0
  183. {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/gr2/prototypes/python_spec_apply_playground.py +0 -0
  184. {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/gr2/prototypes/real_git_lane_materialization.py +0 -0
  185. {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/gr2/prototypes/real_git_playground.py +0 -0
  186. {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/gr2/prototypes/recall_lane_history.py +0 -0
  187. {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/gr2/prototypes/repo_transport_probe.py +0 -0
  188. {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/gr2/python_cli/__init__.py +0 -0
  189. {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/gr2/python_cli/__main__.py +0 -0
  190. {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/gr2/python_cli/add.py +0 -0
  191. {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/gr2/python_cli/approval_schema.py +0 -0
  192. {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/gr2/python_cli/branch.py +0 -0
  193. {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/gr2/python_cli/channel_bridge.py +0 -0
  194. {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/gr2/python_cli/commit.py +0 -0
  195. {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/gr2/python_cli/config.py +0 -0
  196. {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/gr2/python_cli/ecosystems_python.py +0 -0
  197. {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/gr2/python_cli/env_exec.py +0 -0
  198. {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/gr2/python_cli/events.py +0 -0
  199. {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/gr2/python_cli/exit_codes.py +0 -0
  200. {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/gr2/python_cli/failures.py +0 -0
  201. {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/gr2/python_cli/file_exec.py +0 -0
  202. {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/gr2/python_cli/gitinclude.py +0 -0
  203. {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/gr2/python_cli/lane_graph.py +0 -0
  204. {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/gr2/python_cli/lane_plugins.py +0 -0
  205. {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/gr2/python_cli/layout.py +0 -0
  206. {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/gr2/python_cli/project_review.py +0 -0
  207. {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/gr2/python_cli/review.py +0 -0
  208. {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/gr2/python_cli/review_allocation.py +0 -0
  209. {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/gr2/python_cli/review_dispatch.py +0 -0
  210. {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/gr2/python_cli/review_runners.py +0 -0
  211. {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/gr2/python_cli/staging_cleanup.py +0 -0
  212. {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/gr2/python_cli/syncops.py +0 -0
  213. {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/gr2/python_cli/target.py +0 -0
  214. {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/gr2/python_cli/version.py +0 -0
  215. {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/gr2/python_cli/workspace_guidance.py +0 -0
  216. {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/gr2/python_cli/workspace_snapshot.py +0 -0
  217. {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/gr2/schemas/dev.synapt.grip.approval.v1alpha1/approval.proto +0 -0
  218. {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/gr2/schemas/dev.synapt.grip.approval.v1alpha1/descriptor_set.pb +0 -0
  219. {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/gr2/schemas/dev.synapt.grip.check.v1alpha1/check.proto +0 -0
  220. {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/gr2/schemas/dev.synapt.grip.check.v1alpha1/descriptor_set.pb +0 -0
  221. {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/gr2/schemas/dev.synapt.grip.merge.v1alpha1/descriptor_set.pb +0 -0
  222. {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/gr2/schemas/dev.synapt.grip.merge.v1alpha1/merge.proto +0 -0
  223. {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/gr2/schemas/dev.synapt.grip.review.v1alpha1/descriptor_set.pb +0 -0
  224. {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/gr2/schemas/dev.synapt.grip.review.v1alpha1/review.proto +0 -0
  225. {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/gr2/schemas/gr2-materialization-plan-v1.schema.json +0 -0
  226. {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/gr2/schemas/gr2-workspace-spec-v1.schema.json +0 -0
  227. {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/gr2_overlay/__init__.py +0 -0
  228. {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/setup.cfg +0 -0
  229. {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_add.py +0 -0
  230. {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_agent_manifest_overlay_source.py +0 -0
  231. {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_api_core_seam.py +0 -0
  232. {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_app_event_outcomes.py +0 -0
  233. {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_apply_convergence.py +0 -0
  234. {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_apply_gr1_sibling_adoption.py +0 -0
  235. {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_approval_schema.py +0 -0
  236. {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_branch.py +0 -0
  237. {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_break_17_unit_path_containment.py +0 -0
  238. {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_break_18_gr1_sibling_units.py +0 -0
  239. {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_channel_bridge.py +0 -0
  240. {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_cli_adapter_error_boundary.py +0 -0
  241. {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_cli_shape_witnesses.py +0 -0
  242. {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_clone_materialization.py +0 -0
  243. {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_commit.py +0 -0
  244. {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_config_base_path_guard.py +0 -0
  245. {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_config_overlay.py +0 -0
  246. {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_conftest_git_isolation.py +0 -0
  247. {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_context_resolver.py +0 -0
  248. {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_contribution_protocol.py +0 -0
  249. {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_deprecation_registry.py +0 -0
  250. {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_ecosystems_python.py +0 -0
  251. {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_ensure_lane_checkout_reference_clone.py +0 -0
  252. {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_env_materialization.py +0 -0
  253. {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_event_log_integrity.py +0 -0
  254. {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_event_outcome_policy.py +0 -0
  255. {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_events.py +0 -0
  256. {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_events_torn_line.py +0 -0
  257. {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_exec_apostrophe_and_oserror.py +0 -0
  258. {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_exec_single_string_and_materialize_plan.py +0 -0
  259. {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_execops.py +0 -0
  260. {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_failure_event_outcome.py +0 -0
  261. {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_field_tree_name.py +0 -0
  262. {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_first_five_minutes.py +0 -0
  263. {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_foreground_launch_runtime.py +0 -0
  264. {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_git_review.py +0 -0
  265. {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_gitinclude_compiler.py +0 -0
  266. {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_gr1_first_run_guidance.py +0 -0
  267. {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_gr2_packaging.py +0 -0
  268. {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_gr2_review_receipt.py +0 -0
  269. {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_grip_cli.py +0 -0
  270. {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_grip_hardening.py +0 -0
  271. {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_grip_snapshot.py +0 -0
  272. {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_grip_toml_schema_v1.py +0 -0
  273. {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_hook_events.py +0 -0
  274. {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_hook_hardening.py +0 -0
  275. {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_hooks_consent.py +0 -0
  276. {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_hooks_group_names.py +0 -0
  277. {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_jsonl_store.py +0 -0
  278. {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_lane_checkout_root.py +0 -0
  279. {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_lane_create_defaults.py +0 -0
  280. {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_lane_create_fork_base_cli.py +0 -0
  281. {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_lane_create_refusal_leaves_nothing.py +0 -0
  282. {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_lane_create_refuses_own_branch.py +0 -0
  283. {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_lane_downstream.py +0 -0
  284. {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_lane_downstream_run.py +0 -0
  285. {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_lane_enter_hook_warnings.py +0 -0
  286. {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_lane_exit_keeps_dirty_work.py +0 -0
  287. {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_lane_graph.py +0 -0
  288. {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_lane_lease_show_json.py +0 -0
  289. {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_lane_lifecycle_safety.py +0 -0
  290. {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_lane_plugins.py +0 -0
  291. {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_lane_probe.py +0 -0
  292. {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_lane_repo_paths_and_all_skipped.py +0 -0
  293. {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_lane_roles.py +0 -0
  294. {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_lane_show_name.py +0 -0
  295. {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_lane_store_path_pins.py +0 -0
  296. {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_lane_toml_serialization.py +0 -0
  297. {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_launch_primitive.py +0 -0
  298. {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_layout_census.py +0 -0
  299. {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_linked_review_receipts.py +0 -0
  300. {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_m2_overlay_hindsight.py +0 -0
  301. {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_m2_overlay_mem0.py +0 -0
  302. {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_m2_overlay_zep.py +0 -0
  303. {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_materialization_plan_contract.py +0 -0
  304. {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_materialize_pin.py +0 -0
  305. {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_member_working_root_checkout_materialize.py +0 -0
  306. {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_merge_evidence.py +0 -0
  307. {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_merge_parent_verification.py +0 -0
  308. {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_migration.py +0 -0
  309. {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_migration_overlay_compatibility.py +0 -0
  310. {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_native_store_review_record_probes.py +0 -0
  311. {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_no_bare_python_cli_imports.py +0 -0
  312. {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_null_current_lane_refusal.py +0 -0
  313. {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_open_gr_enter.py +0 -0
  314. {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_open_project_refusal_reason_cli.py +0 -0
  315. {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_outbox_ack_after_effect.py +0 -0
  316. {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_overlay_acceptance.py +0 -0
  317. {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_overlay_activate.py +0 -0
  318. {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_overlay_cli.py +0 -0
  319. {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_overlay_cli_wiring.py +0 -0
  320. {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_overlay_composition_merge.py +0 -0
  321. {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_overlay_cross_repo_atomic_apply.py +0 -0
  322. {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_overlay_cross_repo_perf_gate.py +0 -0
  323. {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_overlay_cross_repo_rollback.py +0 -0
  324. {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_overlay_driver_registry.py +0 -0
  325. {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_overlay_introspection.py +0 -0
  326. {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_overlay_multi_stack.py +0 -0
  327. {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_overlay_object_encoding.py +0 -0
  328. {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_overlay_perf_gates.py +0 -0
  329. {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_overlay_python_driver.py +0 -0
  330. {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_overlay_tier_b_encoding.py +0 -0
  331. {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_overlay_tier_b_perf_gates.py +0 -0
  332. {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_overlay_tier_b_repo_state.py +0 -0
  333. {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_overlay_tier_b_staging_discipline.py +0 -0
  334. {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_overlay_trust_model.py +0 -0
  335. {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_overlay_workspace_spec.py +0 -0
  336. {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_pr_events.py +0 -0
  337. {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_pr_group_legibility.py +0 -0
  338. {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_pr_merge_head_pin.py +0 -0
  339. {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_pr_merge_method.py +0 -0
  340. {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_pr_merge_missing_target.py +0 -0
  341. {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_pr_merge_partial_failure.py +0 -0
  342. {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_pr_view.py +0 -0
  343. {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_project_file_materialization.py +0 -0
  344. {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_project_review_range_reconstruction.py +0 -0
  345. {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_project_review_three_repo.py +0 -0
  346. {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_projection_tracked_dest.py +0 -0
  347. {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_propagation_contribution.py +0 -0
  348. {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_propagation_daemon.py +0 -0
  349. {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_propagation_state_machine.py +0 -0
  350. {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_prune.py +0 -0
  351. {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_python_group_install.py +0 -0
  352. {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_record_schema_copies.py +0 -0
  353. {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_remote_check_records.py +0 -0
  354. {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_repo_path_read_through.py +0 -0
  355. {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_repo_status_linked_worktree.py +0 -0
  356. {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_repo_status_schema_version.py +0 -0
  357. {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_repo_status_symlinked_git_dir.py +0 -0
  358. {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_review_a4_v3.py +0 -0
  359. {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_review_allocation_recovery.py +0 -0
  360. {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_review_ansi_parse.py +0 -0
  361. {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_review_b3_reader_alignment.py +0 -0
  362. {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_review_bind_fork_base.py +0 -0
  363. {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_review_bind_from_range.py +0 -0
  364. {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_review_bind_root_refs.py +0 -0
  365. {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_review_bind_verify.py +0 -0
  366. {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_review_check_name.py +0 -0
  367. {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_review_cli.py +0 -0
  368. {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_review_close_gr.py +0 -0
  369. {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_review_context_defaults.py +0 -0
  370. {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_review_context_witnesses.py +0 -0
  371. {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_review_create_project_cli.py +0 -0
  372. {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_review_dispatch.py +0 -0
  373. {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_review_ephemeral.py +0 -0
  374. {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_review_events.py +0 -0
  375. {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_review_field_tree.py +0 -0
  376. {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_review_field_tree_readers.py +0 -0
  377. {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_review_install_hint.py +0 -0
  378. {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_review_pr_marker_context.py +0 -0
  379. {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_review_rebind.py +0 -0
  380. {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_review_receipt_cleanup.py +0 -0
  381. {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_review_ref_v1_migration.py +0 -0
  382. {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_review_ref_v1_reader.py +0 -0
  383. {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_review_ref_v1_writer.py +0 -0
  384. {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_review_run.py +0 -0
  385. {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_review_run_context.py +0 -0
  386. {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_review_run_dependency_order.py +0 -0
  387. {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_review_run_import_isolation.py +0 -0
  388. {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_review_run_integrity_recheck.py +0 -0
  389. {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_review_run_multi_repo.py +0 -0
  390. {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_review_run_plugin_order.py +0 -0
  391. {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_review_run_rerun_and_refusal_receipt.py +0 -0
  392. {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_review_runners.py +0 -0
  393. {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_review_v1_format_guard.py +0 -0
  394. {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_review_verify_inside.py +0 -0
  395. {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_rmtree_or_refuse.py +0 -0
  396. {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_selected_workspace_commit.py +0 -0
  397. {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_single_repo_cwd_refusal.py +0 -0
  398. {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_snapshot_id_prefix_resolution.py +0 -0
  399. {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_spec_apply_event_outcomes.py +0 -0
  400. {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_spec_declaration_ref_pin.py +0 -0
  401. {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_sprint21_sync_platform.py +0 -0
  402. {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_staging_cleanup.py +0 -0
  403. {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_store_checkout_atomicity.py +0 -0
  404. {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_store_declared_members.py +0 -0
  405. {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_store_init_branch_inference.py +0 -0
  406. {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_store_log_adoption_boundary.py +0 -0
  407. {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_store_member_path_hygiene.py +0 -0
  408. {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_store_member_state.py +0 -0
  409. {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_store_migrate_branch_inference.py +0 -0
  410. {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_store_moved_workspace_guard.py +0 -0
  411. {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_store_verb_rename.py +0 -0
  412. {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_submodule_member_predicate.py +0 -0
  413. {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_superproject_import.py +0 -0
  414. {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_sync_event_outcomes.py +0 -0
  415. {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_sync_fast_forward.py +0 -0
  416. {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_sync_fetch.py +0 -0
  417. {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_sync_seed_local.py +0 -0
  418. {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_target.py +0 -0
  419. {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_unit_abort.py +0 -0
  420. {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_unit_apply.py +0 -0
  421. {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_unit_apply_dry_run.py +0 -0
  422. {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_unit_manifest_schema.py +0 -0
  423. {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_unit_propose.py +0 -0
  424. {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_unit_topological_apply.py +0 -0
  425. {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_validate_repo_path_conflict.py +0 -0
  426. {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_version_identity.py +0 -0
  427. {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_workspace_edit_lease_cap.py +0 -0
  428. {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_workspace_identity_boundary.py +0 -0
  429. {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_workspace_init_from_topology.py +0 -0
  430. {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_workspace_init_local_repos.py +0 -0
  431. {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_workspace_root_defaults.py +0 -0
  432. {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/tests/test_workspace_root_nearest_marker.py +0 -0
  433. {gitgrip-2.0.0a7 → gitgrip-2.0.0a9}/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.0a9
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
 
@@ -77,11 +79,14 @@ gr2 commit -m "my change" --workspace-root ~/ws --owner-unit default
77
79
  ```bash
78
80
  gr2 exec run ~/ws default --actor human:you -- pytest -q # one command, every lane repo
79
81
  gr2 review create-project ~/ws default feat-x # prints gr:<sha>: one object to review
82
+ gr2 lane push ~/ws default feat-x # push every lane repo, each verified on its remote
80
83
  gr2 lane show ~/ws default # where am I?
81
84
  gr2 lane exit ~/ws default --actor human:you
85
+ gr2 lane list ~/ws # each lane: removable, or keep and why
86
+ gr2 lane remove ~/ws default feat-x # end it: its clones and record go
82
87
  ```
83
88
 
84
- `exec run` and `lane exit` require `--actor`. Every group and verb takes `--help`; `gr2 --help` lists them all.
89
+ `lane remove` refuses while the lane is entered or leased, or was made by `lane bind`, while any of its repos holds uncommitted work, a stash, or a commit no remote has (on any branch or tag), or while its checkout holds anything that is not one of its repos; it names each one and removes nothing. `exec run` and `lane exit` require `--actor`. Every group and verb takes `--help`; `gr2 --help` lists them all.
85
90
 
86
91
  ## What works today, and what is not there yet
87
92
 
@@ -101,20 +106,52 @@ Not there yet:
101
106
 
102
107
  | Group | Verbs |
103
108
  |---|---|
104
- | `workspace` | init, init-from-topology, materialize, status, convert-clone, detect-gr1, migrate-gr1, migrate-lane-state, bootstrap-gr1, gitinclude |
109
+ | `workspace` | init, init-from-topology, materialize, status, convert-clone, detect-gr1, migrate-gr1, retire-gr1, migrate-lane-state, bootstrap-gr1, gitinclude |
105
110
  | `spec` | show, validate |
106
- | `lane` | create, enter, exit, show, resolve, bind, lease |
111
+ | `lane` | create, enter, exit, show, resolve, bind, lease, list, push, remove |
107
112
  | (top level) | branch, add, commit, push, prune, status, plan, apply |
108
113
  | `sync` | status, run |
109
114
  | `pr` | create, status, checks, merge, view |
110
- | `check` | run, show |
111
- | `review` | open, close, checkout-pr, run, check, bind, publish, receive, verify, show, merge, rebind, create-project |
115
+ | `check` | run, show, set |
116
+ | `review` | open, close, checkout-pr, run, check, pin, publish, receive, verify, show, stamp, merge, repin, create-project, bind, approve, rebind |
112
117
  | `exec` | status, run |
113
118
  | `repo` | status, projection-run |
114
119
  | `hooks` | trust, revoke, status, show, run |
115
120
  | `store` | init, commit, check, push, status, log, diff, checkout, materialize, migrate, migrate-reviews |
116
121
  | `target`, `config` | stored PR target; config overlays |
117
122
 
123
+ `review bind`, `review approve` and `review rebind` remain as aliases of `pin`, `stamp` and `repin`.
124
+
125
+ The words these commands use (lane, pin, stamp, repin, gate, review) are defined in [docs/GLOSSARY.md](docs/GLOSSARY.md).
126
+
127
+ ## Stamps (unsigned approvals)
128
+
129
+ Inside a workspace with one pinned review matching every member's current head,
130
+ a reviewer stamps it as the workspace's Git `user.name`:
131
+
132
+ ```bash
133
+ gr2 review stamp
134
+ gr2 review merge
135
+ ```
136
+
137
+ The author recorded by the pin, and anyone who authored a commit in its range,
138
+ cannot stamp it. A stamp records an approval; approver names are self-declared and receipts say `signed: false`.
139
+ Repeated stamps by the same name count once. A moved head needs a new pin
140
+ and fresh stamps. Signing is not implemented by these commands.
141
+
142
+ The workspace's `grip.toml` sets the number required before merging:
143
+
144
+ ```toml
145
+ [approvals]
146
+ required = 2
147
+ ```
148
+
149
+ The default is zero; `review merge --approvals N` can raise the count for that
150
+ run, but cannot lower the workspace policy. With zero required, the merge gate
151
+ skips approval counting. When approvals are required, broken records or different
152
+ chain tips across member remotes refuse before this run pushes a merge. After a refused stamp, rerun
153
+ `review stamp` to read the current chain and retry with a lease.
154
+
118
155
  ## Overlay substrate
119
156
 
120
157
  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 +170,17 @@ Migration: use `gr2 review check` for compiled review requirements. `review requ
133
170
  remains a hidden alias with a warning on stderr until beta. Both report `satisfied`
134
171
  in the same JSON payload, and a missing reviewer remains a reported status with exit 0.
135
172
 
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.
173
+ 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
174
 
138
- New review binds record the binder's Git `user.name` from the workspace root.
175
+ New pinned reviews record the author's Git `user.name` from the workspace root.
139
176
  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
177
+ `review show --json` and `review verify --json` include this author; older pinned reviews
141
178
  remain readable without an author field, and reading them does not invent one.
142
179
 
143
180
 
144
181
  ## Transfer a native review
145
182
 
146
- Publish an existing bound review and receive it in another native workspace:
183
+ Publish an existing pinned review and receive it in another native workspace:
147
184
 
148
185
  ```bash
149
186
  gr2 review publish gr:<full-review-id> --remote https://example.org/workspace.git
@@ -164,7 +201,7 @@ refused without falling back to context.
164
201
  Publish transfers only that review ref and confirms its returned target. Receive
165
202
  compares both the advertised and actual fetched raw target with the expected ID,
166
203
  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
204
+ local review ref. A valid same-ID receive is idempotent. A conflicting existing ref
168
205
  is refused. Object downloads may remain after refusal. The owned temporary ref
169
206
  is removed separately, and cleanup failure is reported without replacing a
170
207
  primary failure.
@@ -183,6 +220,9 @@ or cleanup authority. Opening a reconstruction remains a separate operation.
183
220
  External packages can expose a zero-argument factory through the
184
221
  `gr2.platform_adapters` entry-point group. See [the adapter contract](docs/PR-LIFECYCLE.md#51-adapter-protocol-and-capabilities)
185
222
  for registration, optional operation capabilities and merge head-pin requirements.
223
+ What changed in that protocol, release by release, ships in the package: read it from
224
+ an install with `importlib.resources.files("gr2") / "PLATFORM_ADAPTER_CHANGELOG.md"`,
225
+ or in this repository at [gr2/PLATFORM_ADAPTER_CHANGELOG.md](gr2/PLATFORM_ADAPTER_CHANGELOG.md).
186
226
  Select the installed adapter with `gr2 pr create ... --platform NAME` on a
187
227
  materialized lane. The bound-lane path currently pushes and returns its receipt.
188
228
 
@@ -217,6 +257,12 @@ The read JSON contains `status`, `record_id` (the head's record-set blob id or
217
257
  null), `snapshot_oid`, `head`, `member_key`, `records`, and `reason`. Each
218
258
  observation retains its fields and adds a SHA-256 `observation_id`.
219
259
 
260
+ A review over several members is checked as one set. `gr2 check set <workspace> <review> -- <command>`
261
+ reconstructs every member at its pinned head side by side (`GR2_SET_ROOT`, `GR2_REVIEW_ID` and `GR2_SET_MEMBERS`
262
+ name them), runs the command once, and publishes one `set` observation per member remote, carrying the review and the
263
+ identity of the set. `gr2 review merge` requires that record on a multi-member review (`--no-set` says otherwise),
264
+ and `check show --require set --review <id>` reads a `set` record for another review as stale.
265
+
220
266
  A failed command is recorded and `check run` exits 1. Publication or execution
221
267
  refusals exit 2. `check show` returns `pass`, `fail` or `absent` in its JSON;
222
268
  failed or unmeasurable reads exit 2. Conflicting pass and fail observations both
@@ -225,13 +271,13 @@ failure at that commit. Concurrent writes union observations with bounded
225
271
  compare-and-swap retries. An unmeasurable push acknowledgement is reported as
226
272
  indeterminate unless a fresh remote read confirms the observation.
227
273
 
228
- ## Merge a bound review into plain Git remotes
274
+ ## Merge a pinned review into plain Git remotes
229
275
 
230
276
  ```sh
231
277
  gr2 review merge
232
278
  ```
233
279
 
234
- This merges the review bound at the members' current heads, from their current branch, into the
280
+ This merges the review pinned at the members' current heads, from their current branch, into the
235
281
  branch on each remote that still sits at the reviewed base, and prints what it resolved. If several
236
282
  branches sit there, it asks for `--into`. It merges only if every member's remote feature
237
283
  branch is still the reviewed head, the target is still the reviewed base, and the exact-head check
@@ -243,7 +289,7 @@ Exit codes:
243
289
  - 3: none merged (refused);
244
290
  - 4: partial or unknown.
245
291
 
246
- A review id, `--from` and `--into` override the defaults. Zero or several matching binds, or members on
292
+ A review id, `--from` and `--into` override the defaults. Zero or several matching pinned reviews, or members on
247
293
  different branches, refuse and name the value to pass.
248
294
 
249
295
  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
 
@@ -61,11 +63,14 @@ gr2 commit -m "my change" --workspace-root ~/ws --owner-unit default
61
63
  ```bash
62
64
  gr2 exec run ~/ws default --actor human:you -- pytest -q # one command, every lane repo
63
65
  gr2 review create-project ~/ws default feat-x # prints gr:<sha>: one object to review
66
+ gr2 lane push ~/ws default feat-x # push every lane repo, each verified on its remote
64
67
  gr2 lane show ~/ws default # where am I?
65
68
  gr2 lane exit ~/ws default --actor human:you
69
+ gr2 lane list ~/ws # each lane: removable, or keep and why
70
+ gr2 lane remove ~/ws default feat-x # end it: its clones and record go
66
71
  ```
67
72
 
68
- `exec run` and `lane exit` require `--actor`. Every group and verb takes `--help`; `gr2 --help` lists them all.
73
+ `lane remove` refuses while the lane is entered or leased, or was made by `lane bind`, while any of its repos holds uncommitted work, a stash, or a commit no remote has (on any branch or tag), or while its checkout holds anything that is not one of its repos; it names each one and removes nothing. `exec run` and `lane exit` require `--actor`. Every group and verb takes `--help`; `gr2 --help` lists them all.
69
74
 
70
75
  ## What works today, and what is not there yet
71
76
 
@@ -85,20 +90,52 @@ Not there yet:
85
90
 
86
91
  | Group | Verbs |
87
92
  |---|---|
88
- | `workspace` | init, init-from-topology, materialize, status, convert-clone, detect-gr1, migrate-gr1, migrate-lane-state, bootstrap-gr1, gitinclude |
93
+ | `workspace` | init, init-from-topology, materialize, status, convert-clone, detect-gr1, migrate-gr1, retire-gr1, migrate-lane-state, bootstrap-gr1, gitinclude |
89
94
  | `spec` | show, validate |
90
- | `lane` | create, enter, exit, show, resolve, bind, lease |
95
+ | `lane` | create, enter, exit, show, resolve, bind, lease, list, push, remove |
91
96
  | (top level) | branch, add, commit, push, prune, status, plan, apply |
92
97
  | `sync` | status, run |
93
98
  | `pr` | create, status, checks, merge, view |
94
- | `check` | run, show |
95
- | `review` | open, close, checkout-pr, run, check, bind, publish, receive, verify, show, merge, rebind, create-project |
99
+ | `check` | run, show, set |
100
+ | `review` | open, close, checkout-pr, run, check, pin, publish, receive, verify, show, stamp, merge, repin, create-project, bind, approve, rebind |
96
101
  | `exec` | status, run |
97
102
  | `repo` | status, projection-run |
98
103
  | `hooks` | trust, revoke, status, show, run |
99
104
  | `store` | init, commit, check, push, status, log, diff, checkout, materialize, migrate, migrate-reviews |
100
105
  | `target`, `config` | stored PR target; config overlays |
101
106
 
107
+ `review bind`, `review approve` and `review rebind` remain as aliases of `pin`, `stamp` and `repin`.
108
+
109
+ The words these commands use (lane, pin, stamp, repin, gate, review) are defined in [docs/GLOSSARY.md](docs/GLOSSARY.md).
110
+
111
+ ## Stamps (unsigned approvals)
112
+
113
+ Inside a workspace with one pinned review matching every member's current head,
114
+ a reviewer stamps it as the workspace's Git `user.name`:
115
+
116
+ ```bash
117
+ gr2 review stamp
118
+ gr2 review merge
119
+ ```
120
+
121
+ The author recorded by the pin, and anyone who authored a commit in its range,
122
+ cannot stamp it. A stamp records an approval; approver names are self-declared and receipts say `signed: false`.
123
+ Repeated stamps by the same name count once. A moved head needs a new pin
124
+ and fresh stamps. Signing is not implemented by these commands.
125
+
126
+ The workspace's `grip.toml` sets the number required before merging:
127
+
128
+ ```toml
129
+ [approvals]
130
+ required = 2
131
+ ```
132
+
133
+ The default is zero; `review merge --approvals N` can raise the count for that
134
+ run, but cannot lower the workspace policy. With zero required, the merge gate
135
+ skips approval counting. When approvals are required, broken records or different
136
+ chain tips across member remotes refuse before this run pushes a merge. After a refused stamp, rerun
137
+ `review stamp` to read the current chain and retry with a lease.
138
+
102
139
  ## Overlay substrate
103
140
 
104
141
  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 +154,17 @@ Migration: use `gr2 review check` for compiled review requirements. `review requ
117
154
  remains a hidden alias with a warning on stderr until beta. Both report `satisfied`
118
155
  in the same JSON payload, and a missing reviewer remains a reported status with exit 0.
119
156
 
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.
157
+ 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
158
 
122
- New review binds record the binder's Git `user.name` from the workspace root.
159
+ New pinned reviews record the author's Git `user.name` from the workspace root.
123
160
  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
161
+ `review show --json` and `review verify --json` include this author; older pinned reviews
125
162
  remain readable without an author field, and reading them does not invent one.
126
163
 
127
164
 
128
165
  ## Transfer a native review
129
166
 
130
- Publish an existing bound review and receive it in another native workspace:
167
+ Publish an existing pinned review and receive it in another native workspace:
131
168
 
132
169
  ```bash
133
170
  gr2 review publish gr:<full-review-id> --remote https://example.org/workspace.git
@@ -148,7 +185,7 @@ refused without falling back to context.
148
185
  Publish transfers only that review ref and confirms its returned target. Receive
149
186
  compares both the advertised and actual fetched raw target with the expected ID,
150
187
  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
188
+ local review ref. A valid same-ID receive is idempotent. A conflicting existing ref
152
189
  is refused. Object downloads may remain after refusal. The owned temporary ref
153
190
  is removed separately, and cleanup failure is reported without replacing a
154
191
  primary failure.
@@ -167,6 +204,9 @@ or cleanup authority. Opening a reconstruction remains a separate operation.
167
204
  External packages can expose a zero-argument factory through the
168
205
  `gr2.platform_adapters` entry-point group. See [the adapter contract](docs/PR-LIFECYCLE.md#51-adapter-protocol-and-capabilities)
169
206
  for registration, optional operation capabilities and merge head-pin requirements.
207
+ What changed in that protocol, release by release, ships in the package: read it from
208
+ an install with `importlib.resources.files("gr2") / "PLATFORM_ADAPTER_CHANGELOG.md"`,
209
+ or in this repository at [gr2/PLATFORM_ADAPTER_CHANGELOG.md](gr2/PLATFORM_ADAPTER_CHANGELOG.md).
170
210
  Select the installed adapter with `gr2 pr create ... --platform NAME` on a
171
211
  materialized lane. The bound-lane path currently pushes and returns its receipt.
172
212
 
@@ -201,6 +241,12 @@ The read JSON contains `status`, `record_id` (the head's record-set blob id or
201
241
  null), `snapshot_oid`, `head`, `member_key`, `records`, and `reason`. Each
202
242
  observation retains its fields and adds a SHA-256 `observation_id`.
203
243
 
244
+ A review over several members is checked as one set. `gr2 check set <workspace> <review> -- <command>`
245
+ reconstructs every member at its pinned head side by side (`GR2_SET_ROOT`, `GR2_REVIEW_ID` and `GR2_SET_MEMBERS`
246
+ name them), runs the command once, and publishes one `set` observation per member remote, carrying the review and the
247
+ identity of the set. `gr2 review merge` requires that record on a multi-member review (`--no-set` says otherwise),
248
+ and `check show --require set --review <id>` reads a `set` record for another review as stale.
249
+
204
250
  A failed command is recorded and `check run` exits 1. Publication or execution
205
251
  refusals exit 2. `check show` returns `pass`, `fail` or `absent` in its JSON;
206
252
  failed or unmeasurable reads exit 2. Conflicting pass and fail observations both
@@ -209,13 +255,13 @@ failure at that commit. Concurrent writes union observations with bounded
209
255
  compare-and-swap retries. An unmeasurable push acknowledgement is reported as
210
256
  indeterminate unless a fresh remote read confirms the observation.
211
257
 
212
- ## Merge a bound review into plain Git remotes
258
+ ## Merge a pinned review into plain Git remotes
213
259
 
214
260
  ```sh
215
261
  gr2 review merge
216
262
  ```
217
263
 
218
- This merges the review bound at the members' current heads, from their current branch, into the
264
+ This merges the review pinned at the members' current heads, from their current branch, into the
219
265
  branch on each remote that still sits at the reviewed base, and prints what it resolved. If several
220
266
  branches sit there, it asks for `--into`. It merges only if every member's remote feature
221
267
  branch is still the reviewed head, the target is still the reviewed base, and the exact-head check
@@ -227,7 +273,7 @@ Exit codes:
227
273
  - 3: none merged (refused);
228
274
  - 4: partial or unknown.
229
275
 
230
- A review id, `--from` and `--into` override the defaults. Zero or several matching binds, or members on
276
+ A review id, `--from` and `--into` override the defaults. Zero or several matching pinned reviews, or members on
231
277
  different branches, refuse and name the value to pass.
232
278
 
233
279
  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.0a9
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
 
@@ -77,11 +79,14 @@ gr2 commit -m "my change" --workspace-root ~/ws --owner-unit default
77
79
  ```bash
78
80
  gr2 exec run ~/ws default --actor human:you -- pytest -q # one command, every lane repo
79
81
  gr2 review create-project ~/ws default feat-x # prints gr:<sha>: one object to review
82
+ gr2 lane push ~/ws default feat-x # push every lane repo, each verified on its remote
80
83
  gr2 lane show ~/ws default # where am I?
81
84
  gr2 lane exit ~/ws default --actor human:you
85
+ gr2 lane list ~/ws # each lane: removable, or keep and why
86
+ gr2 lane remove ~/ws default feat-x # end it: its clones and record go
82
87
  ```
83
88
 
84
- `exec run` and `lane exit` require `--actor`. Every group and verb takes `--help`; `gr2 --help` lists them all.
89
+ `lane remove` refuses while the lane is entered or leased, or was made by `lane bind`, while any of its repos holds uncommitted work, a stash, or a commit no remote has (on any branch or tag), or while its checkout holds anything that is not one of its repos; it names each one and removes nothing. `exec run` and `lane exit` require `--actor`. Every group and verb takes `--help`; `gr2 --help` lists them all.
85
90
 
86
91
  ## What works today, and what is not there yet
87
92
 
@@ -101,20 +106,52 @@ Not there yet:
101
106
 
102
107
  | Group | Verbs |
103
108
  |---|---|
104
- | `workspace` | init, init-from-topology, materialize, status, convert-clone, detect-gr1, migrate-gr1, migrate-lane-state, bootstrap-gr1, gitinclude |
109
+ | `workspace` | init, init-from-topology, materialize, status, convert-clone, detect-gr1, migrate-gr1, retire-gr1, migrate-lane-state, bootstrap-gr1, gitinclude |
105
110
  | `spec` | show, validate |
106
- | `lane` | create, enter, exit, show, resolve, bind, lease |
111
+ | `lane` | create, enter, exit, show, resolve, bind, lease, list, push, remove |
107
112
  | (top level) | branch, add, commit, push, prune, status, plan, apply |
108
113
  | `sync` | status, run |
109
114
  | `pr` | create, status, checks, merge, view |
110
- | `check` | run, show |
111
- | `review` | open, close, checkout-pr, run, check, bind, publish, receive, verify, show, merge, rebind, create-project |
115
+ | `check` | run, show, set |
116
+ | `review` | open, close, checkout-pr, run, check, pin, publish, receive, verify, show, stamp, merge, repin, create-project, bind, approve, rebind |
112
117
  | `exec` | status, run |
113
118
  | `repo` | status, projection-run |
114
119
  | `hooks` | trust, revoke, status, show, run |
115
120
  | `store` | init, commit, check, push, status, log, diff, checkout, materialize, migrate, migrate-reviews |
116
121
  | `target`, `config` | stored PR target; config overlays |
117
122
 
123
+ `review bind`, `review approve` and `review rebind` remain as aliases of `pin`, `stamp` and `repin`.
124
+
125
+ The words these commands use (lane, pin, stamp, repin, gate, review) are defined in [docs/GLOSSARY.md](docs/GLOSSARY.md).
126
+
127
+ ## Stamps (unsigned approvals)
128
+
129
+ Inside a workspace with one pinned review matching every member's current head,
130
+ a reviewer stamps it as the workspace's Git `user.name`:
131
+
132
+ ```bash
133
+ gr2 review stamp
134
+ gr2 review merge
135
+ ```
136
+
137
+ The author recorded by the pin, and anyone who authored a commit in its range,
138
+ cannot stamp it. A stamp records an approval; approver names are self-declared and receipts say `signed: false`.
139
+ Repeated stamps by the same name count once. A moved head needs a new pin
140
+ and fresh stamps. Signing is not implemented by these commands.
141
+
142
+ The workspace's `grip.toml` sets the number required before merging:
143
+
144
+ ```toml
145
+ [approvals]
146
+ required = 2
147
+ ```
148
+
149
+ The default is zero; `review merge --approvals N` can raise the count for that
150
+ run, but cannot lower the workspace policy. With zero required, the merge gate
151
+ skips approval counting. When approvals are required, broken records or different
152
+ chain tips across member remotes refuse before this run pushes a merge. After a refused stamp, rerun
153
+ `review stamp` to read the current chain and retry with a lease.
154
+
118
155
  ## Overlay substrate
119
156
 
120
157
  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 +170,17 @@ Migration: use `gr2 review check` for compiled review requirements. `review requ
133
170
  remains a hidden alias with a warning on stderr until beta. Both report `satisfied`
134
171
  in the same JSON payload, and a missing reviewer remains a reported status with exit 0.
135
172
 
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.
173
+ 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
174
 
138
- New review binds record the binder's Git `user.name` from the workspace root.
175
+ New pinned reviews record the author's Git `user.name` from the workspace root.
139
176
  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
177
+ `review show --json` and `review verify --json` include this author; older pinned reviews
141
178
  remain readable without an author field, and reading them does not invent one.
142
179
 
143
180
 
144
181
  ## Transfer a native review
145
182
 
146
- Publish an existing bound review and receive it in another native workspace:
183
+ Publish an existing pinned review and receive it in another native workspace:
147
184
 
148
185
  ```bash
149
186
  gr2 review publish gr:<full-review-id> --remote https://example.org/workspace.git
@@ -164,7 +201,7 @@ refused without falling back to context.
164
201
  Publish transfers only that review ref and confirms its returned target. Receive
165
202
  compares both the advertised and actual fetched raw target with the expected ID,
166
203
  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
204
+ local review ref. A valid same-ID receive is idempotent. A conflicting existing ref
168
205
  is refused. Object downloads may remain after refusal. The owned temporary ref
169
206
  is removed separately, and cleanup failure is reported without replacing a
170
207
  primary failure.
@@ -183,6 +220,9 @@ or cleanup authority. Opening a reconstruction remains a separate operation.
183
220
  External packages can expose a zero-argument factory through the
184
221
  `gr2.platform_adapters` entry-point group. See [the adapter contract](docs/PR-LIFECYCLE.md#51-adapter-protocol-and-capabilities)
185
222
  for registration, optional operation capabilities and merge head-pin requirements.
223
+ What changed in that protocol, release by release, ships in the package: read it from
224
+ an install with `importlib.resources.files("gr2") / "PLATFORM_ADAPTER_CHANGELOG.md"`,
225
+ or in this repository at [gr2/PLATFORM_ADAPTER_CHANGELOG.md](gr2/PLATFORM_ADAPTER_CHANGELOG.md).
186
226
  Select the installed adapter with `gr2 pr create ... --platform NAME` on a
187
227
  materialized lane. The bound-lane path currently pushes and returns its receipt.
188
228
 
@@ -217,6 +257,12 @@ The read JSON contains `status`, `record_id` (the head's record-set blob id or
217
257
  null), `snapshot_oid`, `head`, `member_key`, `records`, and `reason`. Each
218
258
  observation retains its fields and adds a SHA-256 `observation_id`.
219
259
 
260
+ A review over several members is checked as one set. `gr2 check set <workspace> <review> -- <command>`
261
+ reconstructs every member at its pinned head side by side (`GR2_SET_ROOT`, `GR2_REVIEW_ID` and `GR2_SET_MEMBERS`
262
+ name them), runs the command once, and publishes one `set` observation per member remote, carrying the review and the
263
+ identity of the set. `gr2 review merge` requires that record on a multi-member review (`--no-set` says otherwise),
264
+ and `check show --require set --review <id>` reads a `set` record for another review as stale.
265
+
220
266
  A failed command is recorded and `check run` exits 1. Publication or execution
221
267
  refusals exit 2. `check show` returns `pass`, `fail` or `absent` in its JSON;
222
268
  failed or unmeasurable reads exit 2. Conflicting pass and fail observations both
@@ -225,13 +271,13 @@ failure at that commit. Concurrent writes union observations with bounded
225
271
  compare-and-swap retries. An unmeasurable push acknowledgement is reported as
226
272
  indeterminate unless a fresh remote read confirms the observation.
227
273
 
228
- ## Merge a bound review into plain Git remotes
274
+ ## Merge a pinned review into plain Git remotes
229
275
 
230
276
  ```sh
231
277
  gr2 review merge
232
278
  ```
233
279
 
234
- This merges the review bound at the members' current heads, from their current branch, into the
280
+ This merges the review pinned at the members' current heads, from their current branch, into the
235
281
  branch on each remote that still sits at the reviewed base, and prints what it resolved. If several
236
282
  branches sit there, it asks for `--into`. It merges only if every member's remote feature
237
283
  branch is still the reviewed head, the target is still the reviewed base, and the exact-head check
@@ -243,7 +289,7 @@ Exit codes:
243
289
  - 3: none merged (refused);
244
290
  - 4: partial or unknown.
245
291
 
246
- A review id, `--from` and `--into` override the defaults. Zero or several matching binds, or members on
292
+ A review id, `--from` and `--into` override the defaults. Zero or several matching pinned reviews, or members on
247
293
  different branches, refuse and name the value to pass.
248
294
 
249
295
  These records are attestations by writers trusted with remote access, not signed