gitgrip 2.0.0a8__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 (432) hide show
  1. {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/PKG-INFO +14 -5
  2. {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/README.md +13 -4
  3. {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/gitgrip.egg-info/PKG-INFO +14 -5
  4. {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/gitgrip.egg-info/SOURCES.txt +59 -0
  5. {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/gr2/PLATFORM_ADAPTER_CHANGELOG.md +32 -2
  6. {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/gr2/prototypes/repo_maintenance_prototype.py +55 -1
  7. gitgrip-2.0.0a9/gr2/python_cli/agent_record.py +269 -0
  8. {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/gr2/python_cli/app.py +507 -29
  9. {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/gr2/python_cli/approvals.py +18 -1
  10. {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/gr2/python_cli/consent.py +63 -30
  11. gitgrip-2.0.0a9/gr2/python_cli/declared_sets.py +217 -0
  12. {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/gr2/python_cli/execops.py +20 -0
  13. {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/gr2/python_cli/git_review.py +2 -1
  14. {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/gr2/python_cli/gitops.py +19 -1
  15. {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/gr2/python_cli/grip.py +28 -5
  16. {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/gr2/python_cli/grip_cli.py +1269 -56
  17. {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/gr2/python_cli/hooks.py +289 -1
  18. gitgrip-2.0.0a9/gr2/python_cli/member_field_tree.py +202 -0
  19. {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/gr2/python_cli/merge_gate.py +180 -6
  20. gitgrip-2.0.0a9/gr2/python_cli/merge_receipts.py +67 -0
  21. {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/gr2/python_cli/migration.py +240 -11
  22. gitgrip-2.0.0a9/gr2/python_cli/names.py +78 -0
  23. gitgrip-2.0.0a9/gr2/python_cli/next_steps.py +101 -0
  24. {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/gr2/python_cli/open_gr_review.py +55 -5
  25. {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/gr2/python_cli/platform.py +67 -5
  26. {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/gr2/python_cli/pr.py +58 -4
  27. {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/gr2/python_cli/push.py +113 -2
  28. {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/gr2/python_cli/review_field_tree.py +134 -29
  29. {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/gr2/python_cli/review_members.py +11 -3
  30. {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/gr2/python_cli/review_run.py +56 -2
  31. {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/gr2/python_cli/root_option.py +35 -0
  32. gitgrip-2.0.0a9/gr2/python_cli/set_check.py +319 -0
  33. gitgrip-2.0.0a9/gr2/python_cli/set_hints.py +132 -0
  34. {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/gr2/python_cli/spec_apply.py +19 -1
  35. gitgrip-2.0.0a9/gr2/python_cli/store_hooks.py +579 -0
  36. gitgrip-2.0.0a9/gr2/python_cli/workspace_mode.py +50 -0
  37. {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/pyproject.toml +1 -1
  38. gitgrip-2.0.0a9/tests/test_agent_record_append.py +360 -0
  39. gitgrip-2.0.0a9/tests/test_agent_record_fold.py +334 -0
  40. gitgrip-2.0.0a9/tests/test_agent_record_stamps.py +210 -0
  41. {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_api_dump.py +4 -1
  42. gitgrip-2.0.0a9/tests/test_consent_key_paths.py +215 -0
  43. gitgrip-2.0.0a9/tests/test_declared_set_pins.py +144 -0
  44. gitgrip-2.0.0a9/tests/test_declared_sets.py +416 -0
  45. gitgrip-2.0.0a9/tests/test_exec_run_names_what_did_not_run.py +95 -0
  46. gitgrip-2.0.0a9/tests/test_field_tree_schema_reader.py +140 -0
  47. gitgrip-2.0.0a9/tests/test_files_compose.py +382 -0
  48. gitgrip-2.0.0a9/tests/test_git_transport_allow_list.py +254 -0
  49. {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_gitops_shared.py +8 -2
  50. {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_gr_shadow.py +27 -0
  51. gitgrip-2.0.0a9/tests/test_grip_toml_literals.py +95 -0
  52. gitgrip-2.0.0a9/tests/test_hostile_names.py +218 -0
  53. gitgrip-2.0.0a9/tests/test_hostile_names_helper.py +83 -0
  54. gitgrip-2.0.0a9/tests/test_lane_push.py +291 -0
  55. gitgrip-2.0.0a9/tests/test_lane_remove.py +329 -0
  56. gitgrip-2.0.0a9/tests/test_malformed_remote_refusal.py +46 -0
  57. gitgrip-2.0.0a9/tests/test_migration_desk_state.py +512 -0
  58. {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_migration_unadopted_notice.py +13 -3
  59. gitgrip-2.0.0a9/tests/test_names.py +50 -0
  60. {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_native_store_gitinclude.py +1 -1
  61. gitgrip-2.0.0a9/tests/test_np_bench_contract_scenario.py +131 -0
  62. gitgrip-2.0.0a9/tests/test_out_of_set_hint.py +181 -0
  63. {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_platform_adapter_plugins.py +2 -0
  64. gitgrip-2.0.0a9/tests/test_pr_adapter_v2_target.py +377 -0
  65. {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_pr_review_subject.py +30 -0
  66. {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_push.py +1 -1
  67. gitgrip-2.0.0a9/tests/test_retire_gr1.py +137 -0
  68. {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_review_a4_v2.py +57 -0
  69. {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_review_approvals.py +86 -1
  70. {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_review_bind_author.py +16 -0
  71. {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_review_close_keeps_local_work.py +221 -1
  72. {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_review_merge_gate.py +118 -4
  73. {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_review_merge_gate_lost_ack.py +9 -8
  74. gitgrip-2.0.0a9/tests/test_review_merge_receipt.py +133 -0
  75. gitgrip-2.0.0a9/tests/test_review_merge_updates_tracking_ref.py +154 -0
  76. {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_review_open_lane.py +59 -0
  77. gitgrip-2.0.0a9/tests/test_review_run_deleted_cwd.py +73 -0
  78. gitgrip-2.0.0a9/tests/test_review_run_package_name.py +40 -0
  79. gitgrip-2.0.0a9/tests/test_review_run_venv_and_refusal_identity.py +133 -0
  80. {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_root_option_verbs.py +12 -6
  81. gitgrip-2.0.0a9/tests/test_set_check.py +305 -0
  82. gitgrip-2.0.0a9/tests/test_set_check_remote_heads.py +162 -0
  83. gitgrip-2.0.0a9/tests/test_skill_dump.py +111 -0
  84. gitgrip-2.0.0a9/tests/test_spec_show_native_root.py +140 -0
  85. {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_store_break_attempts.py +8 -3
  86. gitgrip-2.0.0a9/tests/test_store_commit_follows_branch.py +158 -0
  87. gitgrip-2.0.0a9/tests/test_store_commit_keeps_record.py +152 -0
  88. {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_store_commit_noop.py +4 -4
  89. gitgrip-2.0.0a9/tests/test_store_commit_refuses_rewind.py +499 -0
  90. gitgrip-2.0.0a9/tests/test_store_full_mode_carrier.py +364 -0
  91. gitgrip-2.0.0a9/tests/test_store_full_mode_coverage.py +386 -0
  92. gitgrip-2.0.0a9/tests/test_store_full_mode_layers.py +453 -0
  93. gitgrip-2.0.0a9/tests/test_store_full_mode_records.py +244 -0
  94. gitgrip-2.0.0a9/tests/test_store_git_hooks.py +641 -0
  95. {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_store_git_native_smoke.py +1 -0
  96. gitgrip-2.0.0a9/tests/test_store_gitmodules.py +188 -0
  97. gitgrip-2.0.0a9/tests/test_store_gitmodules_branch.py +150 -0
  98. gitgrip-2.0.0a9/tests/test_store_hook_takes_verb_coverage.py +190 -0
  99. gitgrip-2.0.0a9/tests/test_store_init_clone.py +220 -0
  100. gitgrip-2.0.0a9/tests/test_store_materialize_branch.py +174 -0
  101. gitgrip-2.0.0a9/tests/test_store_materialize_fetches_new_pin.py +214 -0
  102. gitgrip-2.0.0a9/tests/test_store_materialize_installs_hooks.py +179 -0
  103. gitgrip-2.0.0a9/tests/test_store_status_inspection.py +129 -0
  104. {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_store_status_values.py +49 -0
  105. gitgrip-2.0.0a9/tests/test_store_submodule_init.py +146 -0
  106. gitgrip-2.0.0a9/tests/test_store_submodule_update_merge.py +172 -0
  107. {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_store_verb_witnesses.py +212 -7
  108. {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_version_static.py +2 -2
  109. {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_workspace_convert_clone.py +196 -0
  110. {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/gitgrip.egg-info/dependency_links.txt +0 -0
  111. {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/gitgrip.egg-info/entry_points.txt +0 -0
  112. {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/gitgrip.egg-info/requires.txt +0 -0
  113. {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/gitgrip.egg-info/top_level.txt +0 -0
  114. {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/gr2/__init__.py +0 -0
  115. {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/gr2/api_core.py +0 -0
  116. {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/gr2/overlay/__init__.py +0 -0
  117. {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/gr2/overlay/activate.py +0 -0
  118. {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/gr2/overlay/agent_manifest.py +0 -0
  119. {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/gr2/overlay/cli.py +0 -0
  120. {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/gr2/overlay/cross_repo.py +0 -0
  121. {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/gr2/overlay/drivers.py +0 -0
  122. {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/gr2/overlay/introspection.py +0 -0
  123. {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/gr2/overlay/language_drivers.py +0 -0
  124. {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/gr2/overlay/objects.py +0 -0
  125. {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/gr2/overlay/perf.py +0 -0
  126. {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/gr2/overlay/refs.py +0 -0
  127. {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/gr2/overlay/trust.py +0 -0
  128. {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/gr2/overlay/types.py +0 -0
  129. {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/gr2/overlay/units.py +0 -0
  130. {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/gr2/overlay/workspace_spec.py +0 -0
  131. {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/gr2/prototypes/__init__.py +0 -0
  132. {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/gr2/prototypes/cache_materialization_probe.py +0 -0
  133. {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/gr2/prototypes/concurrent_event_stress.py +0 -0
  134. {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/gr2/prototypes/concurrent_lease_stress.py +0 -0
  135. {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/gr2/prototypes/concurrent_workspace_cap_stress.py +0 -0
  136. {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/gr2/prototypes/contribution_protocol.py +0 -0
  137. {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/gr2/prototypes/cross_mode_lane_stress.py +0 -0
  138. {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/gr2/prototypes/jsonl_store.py +0 -0
  139. {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/gr2/prototypes/lane_workspace_prototype.py +0 -0
  140. {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/gr2/prototypes/layout_model_probe.py +0 -0
  141. {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/gr2/prototypes/propagation_daemon.py +0 -0
  142. {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/gr2/prototypes/propagation_state_machine.py +0 -0
  143. {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/gr2/prototypes/python_exec_playground.py +0 -0
  144. {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/gr2/prototypes/python_hook_runtime_playground.py +0 -0
  145. {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/gr2/prototypes/python_migration_playground.py +0 -0
  146. {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/gr2/prototypes/python_review_checkout_playground.py +0 -0
  147. {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/gr2/prototypes/python_spec_apply_playground.py +0 -0
  148. {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/gr2/prototypes/real_git_lane_materialization.py +0 -0
  149. {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/gr2/prototypes/real_git_playground.py +0 -0
  150. {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/gr2/prototypes/recall_lane_history.py +0 -0
  151. {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/gr2/prototypes/repo_transport_probe.py +0 -0
  152. {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/gr2/python_cli/__init__.py +0 -0
  153. {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/gr2/python_cli/__main__.py +0 -0
  154. {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/gr2/python_cli/add.py +0 -0
  155. {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/gr2/python_cli/approval_schema.py +0 -0
  156. {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/gr2/python_cli/branch.py +0 -0
  157. {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/gr2/python_cli/channel_bridge.py +0 -0
  158. {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/gr2/python_cli/check_records.py +0 -0
  159. {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/gr2/python_cli/clone_exec.py +0 -0
  160. {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/gr2/python_cli/commit.py +0 -0
  161. {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/gr2/python_cli/config.py +0 -0
  162. {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/gr2/python_cli/context.py +0 -0
  163. {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/gr2/python_cli/defaults.py +0 -0
  164. {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/gr2/python_cli/ecosystems_python.py +0 -0
  165. {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/gr2/python_cli/env_exec.py +0 -0
  166. {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/gr2/python_cli/events.py +0 -0
  167. {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/gr2/python_cli/exit_codes.py +0 -0
  168. {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/gr2/python_cli/failures.py +0 -0
  169. {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/gr2/python_cli/file_exec.py +0 -0
  170. {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/gr2/python_cli/gitinclude.py +0 -0
  171. {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/gr2/python_cli/gr_resolver.py +0 -0
  172. {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/gr2/python_cli/gr_shadow.py +0 -0
  173. {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/gr2/python_cli/lane_defaults.py +0 -0
  174. {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/gr2/python_cli/lane_downstream.py +0 -0
  175. {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/gr2/python_cli/lane_graph.py +0 -0
  176. {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/gr2/python_cli/lane_plugins.py +0 -0
  177. {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/gr2/python_cli/launch_exec.py +0 -0
  178. {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/gr2/python_cli/layout.py +0 -0
  179. {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/gr2/python_cli/merge_verification.py +0 -0
  180. {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/gr2/python_cli/project_review.py +0 -0
  181. {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/gr2/python_cli/prune.py +0 -0
  182. {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/gr2/python_cli/review.py +0 -0
  183. {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/gr2/python_cli/review_allocation.py +0 -0
  184. {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/gr2/python_cli/review_dispatch.py +0 -0
  185. {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/gr2/python_cli/review_ephemeral.py +0 -0
  186. {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/gr2/python_cli/review_rebind.py +0 -0
  187. {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/gr2/python_cli/review_records.py +0 -0
  188. {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/gr2/python_cli/review_runners.py +0 -0
  189. {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/gr2/python_cli/staging_cleanup.py +0 -0
  190. {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/gr2/python_cli/syncops.py +0 -0
  191. {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/gr2/python_cli/target.py +0 -0
  192. {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/gr2/python_cli/version.py +0 -0
  193. {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/gr2/python_cli/workspace_guidance.py +0 -0
  194. {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/gr2/python_cli/workspace_snapshot.py +0 -0
  195. {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/gr2/schemas/dev.synapt.grip.approval.v1alpha1/approval.proto +0 -0
  196. {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/gr2/schemas/dev.synapt.grip.approval.v1alpha1/descriptor_set.pb +0 -0
  197. {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/gr2/schemas/dev.synapt.grip.check.v1alpha1/check.proto +0 -0
  198. {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/gr2/schemas/dev.synapt.grip.check.v1alpha1/descriptor_set.pb +0 -0
  199. {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/gr2/schemas/dev.synapt.grip.merge.v1alpha1/descriptor_set.pb +0 -0
  200. {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/gr2/schemas/dev.synapt.grip.merge.v1alpha1/merge.proto +0 -0
  201. {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/gr2/schemas/dev.synapt.grip.review.v1alpha1/descriptor_set.pb +0 -0
  202. {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/gr2/schemas/dev.synapt.grip.review.v1alpha1/review.proto +0 -0
  203. {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/gr2/schemas/gr2-materialization-plan-v1.schema.json +0 -0
  204. {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/gr2/schemas/gr2-workspace-spec-v1.schema.json +0 -0
  205. {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/gr2_overlay/__init__.py +0 -0
  206. {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/setup.cfg +0 -0
  207. {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_add.py +0 -0
  208. {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_agent_manifest_overlay_source.py +0 -0
  209. {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_api_core_seam.py +0 -0
  210. {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_app_event_outcomes.py +0 -0
  211. {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_apply_convergence.py +0 -0
  212. {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_apply_gr1_sibling_adoption.py +0 -0
  213. {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_approval_schema.py +0 -0
  214. {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_branch.py +0 -0
  215. {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_break_17_unit_path_containment.py +0 -0
  216. {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_break_18_gr1_sibling_units.py +0 -0
  217. {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_channel_bridge.py +0 -0
  218. {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_cli_adapter_error_boundary.py +0 -0
  219. {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_cli_shape_witnesses.py +0 -0
  220. {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_clone_materialization.py +0 -0
  221. {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_commit.py +0 -0
  222. {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_config_base_path_guard.py +0 -0
  223. {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_config_overlay.py +0 -0
  224. {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_conftest_git_isolation.py +0 -0
  225. {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_context_resolver.py +0 -0
  226. {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_contribution_protocol.py +0 -0
  227. {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_defaults_from_repo.py +0 -0
  228. {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_deprecation_registry.py +0 -0
  229. {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_ecosystems_python.py +0 -0
  230. {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_ensure_lane_checkout_reference_clone.py +0 -0
  231. {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_env_materialization.py +0 -0
  232. {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_event_log_integrity.py +0 -0
  233. {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_event_outcome_policy.py +0 -0
  234. {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_events.py +0 -0
  235. {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_events_torn_line.py +0 -0
  236. {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_exec_apostrophe_and_oserror.py +0 -0
  237. {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_exec_single_string_and_materialize_plan.py +0 -0
  238. {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_execops.py +0 -0
  239. {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_failure_event_outcome.py +0 -0
  240. {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_field_tree_name.py +0 -0
  241. {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_first_five_minutes.py +0 -0
  242. {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_foreground_launch_runtime.py +0 -0
  243. {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_git_review.py +0 -0
  244. {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_gitinclude_compiler.py +0 -0
  245. {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_gr1_first_run_guidance.py +0 -0
  246. {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_gr2_packaging.py +0 -0
  247. {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_gr2_review_receipt.py +0 -0
  248. {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_gr_installed_wheel.py +0 -0
  249. {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_gr_resolved_cleared.py +0 -0
  250. {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_gr_resolver_conformance.py +0 -0
  251. {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_grip_cli.py +0 -0
  252. {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_grip_hardening.py +0 -0
  253. {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_grip_snapshot.py +0 -0
  254. {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_grip_toml_schema_v1.py +0 -0
  255. {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_hook_events.py +0 -0
  256. {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_hook_hardening.py +0 -0
  257. {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_hooks_consent.py +0 -0
  258. {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_hooks_group_names.py +0 -0
  259. {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_jsonl_store.py +0 -0
  260. {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_lane_checkout_root.py +0 -0
  261. {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_lane_create_defaults.py +0 -0
  262. {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_lane_create_fork_base_cli.py +0 -0
  263. {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_lane_create_refusal_leaves_nothing.py +0 -0
  264. {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_lane_create_refuses_own_branch.py +0 -0
  265. {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_lane_downstream.py +0 -0
  266. {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_lane_downstream_run.py +0 -0
  267. {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_lane_enter_hook_warnings.py +0 -0
  268. {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_lane_exit_keeps_dirty_work.py +0 -0
  269. {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_lane_graph.py +0 -0
  270. {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_lane_lease_show_json.py +0 -0
  271. {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_lane_lifecycle_safety.py +0 -0
  272. {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_lane_plugins.py +0 -0
  273. {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_lane_probe.py +0 -0
  274. {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_lane_probe_batch.py +0 -0
  275. {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_lane_repo_paths_and_all_skipped.py +0 -0
  276. {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_lane_roles.py +0 -0
  277. {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_lane_show_name.py +0 -0
  278. {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_lane_store_path_pins.py +0 -0
  279. {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_lane_toml_serialization.py +0 -0
  280. {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_launch_primitive.py +0 -0
  281. {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_layout_census.py +0 -0
  282. {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_linked_review_receipts.py +0 -0
  283. {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_m2_overlay_hindsight.py +0 -0
  284. {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_m2_overlay_mem0.py +0 -0
  285. {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_m2_overlay_zep.py +0 -0
  286. {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_materialization_plan_contract.py +0 -0
  287. {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_materialize_pin.py +0 -0
  288. {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_member_working_root_checkout_materialize.py +0 -0
  289. {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_merge_evidence.py +0 -0
  290. {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_merge_parent_verification.py +0 -0
  291. {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_migration.py +0 -0
  292. {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_migration_overlay_compatibility.py +0 -0
  293. {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_native_store_review_record_probes.py +0 -0
  294. {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_no_bare_python_cli_imports.py +0 -0
  295. {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_null_current_lane_refusal.py +0 -0
  296. {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_open_gr_enter.py +0 -0
  297. {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_open_project_refusal_reason_cli.py +0 -0
  298. {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_outbox_ack_after_effect.py +0 -0
  299. {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_overlay_acceptance.py +0 -0
  300. {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_overlay_activate.py +0 -0
  301. {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_overlay_cli.py +0 -0
  302. {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_overlay_cli_wiring.py +0 -0
  303. {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_overlay_composition_merge.py +0 -0
  304. {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_overlay_cross_repo_atomic_apply.py +0 -0
  305. {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_overlay_cross_repo_perf_gate.py +0 -0
  306. {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_overlay_cross_repo_rollback.py +0 -0
  307. {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_overlay_driver_registry.py +0 -0
  308. {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_overlay_introspection.py +0 -0
  309. {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_overlay_multi_stack.py +0 -0
  310. {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_overlay_object_encoding.py +0 -0
  311. {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_overlay_perf_gates.py +0 -0
  312. {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_overlay_python_driver.py +0 -0
  313. {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_overlay_tier_b_encoding.py +0 -0
  314. {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_overlay_tier_b_perf_gates.py +0 -0
  315. {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_overlay_tier_b_repo_state.py +0 -0
  316. {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_overlay_tier_b_staging_discipline.py +0 -0
  317. {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_overlay_trust_model.py +0 -0
  318. {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_overlay_workspace_spec.py +0 -0
  319. {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_platform_adapter_changelog.py +0 -0
  320. {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_pr_events.py +0 -0
  321. {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_pr_group_legibility.py +0 -0
  322. {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_pr_merge_head_pin.py +0 -0
  323. {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_pr_merge_method.py +0 -0
  324. {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_pr_merge_missing_target.py +0 -0
  325. {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_pr_merge_partial_failure.py +0 -0
  326. {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_pr_view.py +0 -0
  327. {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_project_file_materialization.py +0 -0
  328. {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_project_review_range_reconstruction.py +0 -0
  329. {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_project_review_three_repo.py +0 -0
  330. {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_projection_tracked_dest.py +0 -0
  331. {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_propagation_contribution.py +0 -0
  332. {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_propagation_daemon.py +0 -0
  333. {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_propagation_state_machine.py +0 -0
  334. {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_prune.py +0 -0
  335. {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_python_group_install.py +0 -0
  336. {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_readme_verbs_exist.py +0 -0
  337. {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_record_schema_copies.py +0 -0
  338. {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_remote_check_records.py +0 -0
  339. {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_repo_path_read_through.py +0 -0
  340. {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_repo_status_linked_worktree.py +0 -0
  341. {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_repo_status_schema_version.py +0 -0
  342. {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_repo_status_symlinked_git_dir.py +0 -0
  343. {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_review_a4.py +0 -0
  344. {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_review_a4_v3.py +0 -0
  345. {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_review_allocation_recovery.py +0 -0
  346. {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_review_ansi_parse.py +0 -0
  347. {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_review_b3_reader_alignment.py +0 -0
  348. {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_review_bind_fork_base.py +0 -0
  349. {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_review_bind_from_range.py +0 -0
  350. {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_review_bind_migration.py +0 -0
  351. {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_review_bind_native_store.py +0 -0
  352. {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_review_bind_root_refs.py +0 -0
  353. {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_review_bind_verify.py +0 -0
  354. {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_review_check_name.py +0 -0
  355. {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_review_cli.py +0 -0
  356. {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_review_close_gr.py +0 -0
  357. {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_review_context_defaults.py +0 -0
  358. {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_review_context_witnesses.py +0 -0
  359. {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_review_create_project_cli.py +0 -0
  360. {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_review_dispatch.py +0 -0
  361. {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_review_ephemeral.py +0 -0
  362. {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_review_events.py +0 -0
  363. {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_review_field_tree.py +0 -0
  364. {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_review_field_tree_reader_edges.py +0 -0
  365. {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_review_field_tree_readers.py +0 -0
  366. {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_review_install_hint.py +0 -0
  367. {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_review_pin_stamp_names.py +0 -0
  368. {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_review_pr_marker_context.py +0 -0
  369. {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_review_reader_defaults.py +0 -0
  370. {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_review_rebind.py +0 -0
  371. {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_review_receipt_cleanup.py +0 -0
  372. {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_review_ref_v1_migration.py +0 -0
  373. {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_review_ref_v1_reader.py +0 -0
  374. {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_review_ref_v1_writer.py +0 -0
  375. {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_review_remote_safety.py +0 -0
  376. {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_review_run.py +0 -0
  377. {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_review_run_context.py +0 -0
  378. {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_review_run_dependency_order.py +0 -0
  379. {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_review_run_import_isolation.py +0 -0
  380. {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_review_run_integrity_recheck.py +0 -0
  381. {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_review_run_multi_repo.py +0 -0
  382. {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_review_run_plugin_order.py +0 -0
  383. {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_review_run_rerun_and_refusal_receipt.py +0 -0
  384. {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_review_runners.py +0 -0
  385. {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_review_subject.py +0 -0
  386. {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_review_transport.py +0 -0
  387. {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_review_v1_format_guard.py +0 -0
  388. {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_review_verify_inside.py +0 -0
  389. {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_review_vocabulary.py +0 -0
  390. {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_rmtree_or_refuse.py +0 -0
  391. {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_selected_workspace_commit.py +0 -0
  392. {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_single_repo_cwd_refusal.py +0 -0
  393. {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_snapshot_id_prefix_resolution.py +0 -0
  394. {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_spec_apply_event_outcomes.py +0 -0
  395. {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_spec_declaration_ref_pin.py +0 -0
  396. {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_sprint21_sync_platform.py +0 -0
  397. {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_staging_cleanup.py +0 -0
  398. {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_store_checkout_atomicity.py +0 -0
  399. {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_store_declared_members.py +0 -0
  400. {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_store_init_branch_inference.py +0 -0
  401. {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_store_log_adoption_boundary.py +0 -0
  402. {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_store_member_path_hygiene.py +0 -0
  403. {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_store_member_state.py +0 -0
  404. {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_store_migrate_branch_inference.py +0 -0
  405. {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_store_moved_workspace_guard.py +0 -0
  406. {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_store_verb_rename.py +0 -0
  407. {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_submodule_member_predicate.py +0 -0
  408. {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_superproject_import.py +0 -0
  409. {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_sync_event_outcomes.py +0 -0
  410. {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_sync_fast_forward.py +0 -0
  411. {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_sync_fetch.py +0 -0
  412. {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_sync_seed_local.py +0 -0
  413. {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_sync_ssh_rewrite.py +0 -0
  414. {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_sync_status_probe.py +0 -0
  415. {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_target.py +0 -0
  416. {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_tmux_launch_runtime.py +0 -0
  417. {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_unit_abort.py +0 -0
  418. {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_unit_apply.py +0 -0
  419. {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_unit_apply_dry_run.py +0 -0
  420. {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_unit_manifest_schema.py +0 -0
  421. {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_unit_propose.py +0 -0
  422. {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_unit_topological_apply.py +0 -0
  423. {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_validate_repo_path_conflict.py +0 -0
  424. {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_version_identity.py +0 -0
  425. {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_vocabulary.py +0 -0
  426. {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_workspace_edit_lease_cap.py +0 -0
  427. {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_workspace_identity_boundary.py +0 -0
  428. {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_workspace_init_from_topology.py +0 -0
  429. {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_workspace_init_local_repos.py +0 -0
  430. {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_workspace_root_defaults.py +0 -0
  431. {gitgrip-2.0.0a8 → gitgrip-2.0.0a9}/tests/test_workspace_root_nearest_marker.py +0 -0
  432. {gitgrip-2.0.0a8 → 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.0a8
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
@@ -79,11 +79,14 @@ gr2 commit -m "my change" --workspace-root ~/ws --owner-unit default
79
79
  ```bash
80
80
  gr2 exec run ~/ws default --actor human:you -- pytest -q # one command, every lane repo
81
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
82
83
  gr2 lane show ~/ws default # where am I?
83
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
84
87
  ```
85
88
 
86
- `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.
87
90
 
88
91
  ## What works today, and what is not there yet
89
92
 
@@ -103,13 +106,13 @@ Not there yet:
103
106
 
104
107
  | Group | Verbs |
105
108
  |---|---|
106
- | `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 |
107
110
  | `spec` | show, validate |
108
- | `lane` | create, enter, exit, show, resolve, bind, lease |
111
+ | `lane` | create, enter, exit, show, resolve, bind, lease, list, push, remove |
109
112
  | (top level) | branch, add, commit, push, prune, status, plan, apply |
110
113
  | `sync` | status, run |
111
114
  | `pr` | create, status, checks, merge, view |
112
- | `check` | run, show |
115
+ | `check` | run, show, set |
113
116
  | `review` | open, close, checkout-pr, run, check, pin, publish, receive, verify, show, stamp, merge, repin, create-project, bind, approve, rebind |
114
117
  | `exec` | status, run |
115
118
  | `repo` | status, projection-run |
@@ -254,6 +257,12 @@ The read JSON contains `status`, `record_id` (the head's record-set blob id or
254
257
  null), `snapshot_oid`, `head`, `member_key`, `records`, and `reason`. Each
255
258
  observation retains its fields and adds a SHA-256 `observation_id`.
256
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
+
257
266
  A failed command is recorded and `check run` exits 1. Publication or execution
258
267
  refusals exit 2. `check show` returns `pass`, `fail` or `absent` in its JSON;
259
268
  failed or unmeasurable reads exit 2. Conflicting pass and fail observations both
@@ -63,11 +63,14 @@ gr2 commit -m "my change" --workspace-root ~/ws --owner-unit default
63
63
  ```bash
64
64
  gr2 exec run ~/ws default --actor human:you -- pytest -q # one command, every lane repo
65
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
66
67
  gr2 lane show ~/ws default # where am I?
67
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
68
71
  ```
69
72
 
70
- `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.
71
74
 
72
75
  ## What works today, and what is not there yet
73
76
 
@@ -87,13 +90,13 @@ Not there yet:
87
90
 
88
91
  | Group | Verbs |
89
92
  |---|---|
90
- | `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 |
91
94
  | `spec` | show, validate |
92
- | `lane` | create, enter, exit, show, resolve, bind, lease |
95
+ | `lane` | create, enter, exit, show, resolve, bind, lease, list, push, remove |
93
96
  | (top level) | branch, add, commit, push, prune, status, plan, apply |
94
97
  | `sync` | status, run |
95
98
  | `pr` | create, status, checks, merge, view |
96
- | `check` | run, show |
99
+ | `check` | run, show, set |
97
100
  | `review` | open, close, checkout-pr, run, check, pin, publish, receive, verify, show, stamp, merge, repin, create-project, bind, approve, rebind |
98
101
  | `exec` | status, run |
99
102
  | `repo` | status, projection-run |
@@ -238,6 +241,12 @@ The read JSON contains `status`, `record_id` (the head's record-set blob id or
238
241
  null), `snapshot_oid`, `head`, `member_key`, `records`, and `reason`. Each
239
242
  observation retains its fields and adds a SHA-256 `observation_id`.
240
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
+
241
250
  A failed command is recorded and `check run` exits 1. Publication or execution
242
251
  refusals exit 2. `check show` returns `pass`, `fail` or `absent` in its JSON;
243
252
  failed or unmeasurable reads exit 2. Conflicting pass and fail observations both
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: gitgrip
3
- Version: 2.0.0a8
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
@@ -79,11 +79,14 @@ gr2 commit -m "my change" --workspace-root ~/ws --owner-unit default
79
79
  ```bash
80
80
  gr2 exec run ~/ws default --actor human:you -- pytest -q # one command, every lane repo
81
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
82
83
  gr2 lane show ~/ws default # where am I?
83
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
84
87
  ```
85
88
 
86
- `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.
87
90
 
88
91
  ## What works today, and what is not there yet
89
92
 
@@ -103,13 +106,13 @@ Not there yet:
103
106
 
104
107
  | Group | Verbs |
105
108
  |---|---|
106
- | `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 |
107
110
  | `spec` | show, validate |
108
- | `lane` | create, enter, exit, show, resolve, bind, lease |
111
+ | `lane` | create, enter, exit, show, resolve, bind, lease, list, push, remove |
109
112
  | (top level) | branch, add, commit, push, prune, status, plan, apply |
110
113
  | `sync` | status, run |
111
114
  | `pr` | create, status, checks, merge, view |
112
- | `check` | run, show |
115
+ | `check` | run, show, set |
113
116
  | `review` | open, close, checkout-pr, run, check, pin, publish, receive, verify, show, stamp, merge, repin, create-project, bind, approve, rebind |
114
117
  | `exec` | status, run |
115
118
  | `repo` | status, projection-run |
@@ -254,6 +257,12 @@ The read JSON contains `status`, `record_id` (the head's record-set blob id or
254
257
  null), `snapshot_oid`, `head`, `member_key`, `records`, and `reason`. Each
255
258
  observation retains its fields and adds a SHA-256 `observation_id`.
256
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
+
257
266
  A failed command is recorded and `check run` exits 1. Publication or execution
258
267
  refusals exit 2. `check show` returns `pass`, `fail` or `absent` in its JSON;
259
268
  failed or unmeasurable reads exit 2. Conflicting pass and fail observations both
@@ -49,6 +49,7 @@ gr2/prototypes/repo_transport_probe.py
49
49
  gr2/python_cli/__init__.py
50
50
  gr2/python_cli/__main__.py
51
51
  gr2/python_cli/add.py
52
+ gr2/python_cli/agent_record.py
52
53
  gr2/python_cli/app.py
53
54
  gr2/python_cli/approval_schema.py
54
55
  gr2/python_cli/approvals.py
@@ -60,6 +61,7 @@ gr2/python_cli/commit.py
60
61
  gr2/python_cli/config.py
61
62
  gr2/python_cli/consent.py
62
63
  gr2/python_cli/context.py
64
+ gr2/python_cli/declared_sets.py
63
65
  gr2/python_cli/defaults.py
64
66
  gr2/python_cli/ecosystems_python.py
65
67
  gr2/python_cli/env_exec.py
@@ -82,9 +84,13 @@ gr2/python_cli/lane_graph.py
82
84
  gr2/python_cli/lane_plugins.py
83
85
  gr2/python_cli/launch_exec.py
84
86
  gr2/python_cli/layout.py
87
+ gr2/python_cli/member_field_tree.py
85
88
  gr2/python_cli/merge_gate.py
89
+ gr2/python_cli/merge_receipts.py
86
90
  gr2/python_cli/merge_verification.py
87
91
  gr2/python_cli/migration.py
92
+ gr2/python_cli/names.py
93
+ gr2/python_cli/next_steps.py
88
94
  gr2/python_cli/open_gr_review.py
89
95
  gr2/python_cli/platform.py
90
96
  gr2/python_cli/pr.py
@@ -102,12 +108,16 @@ gr2/python_cli/review_records.py
102
108
  gr2/python_cli/review_run.py
103
109
  gr2/python_cli/review_runners.py
104
110
  gr2/python_cli/root_option.py
111
+ gr2/python_cli/set_check.py
112
+ gr2/python_cli/set_hints.py
105
113
  gr2/python_cli/spec_apply.py
106
114
  gr2/python_cli/staging_cleanup.py
115
+ gr2/python_cli/store_hooks.py
107
116
  gr2/python_cli/syncops.py
108
117
  gr2/python_cli/target.py
109
118
  gr2/python_cli/version.py
110
119
  gr2/python_cli/workspace_guidance.py
120
+ gr2/python_cli/workspace_mode.py
111
121
  gr2/python_cli/workspace_snapshot.py
112
122
  gr2/schemas/gr2-materialization-plan-v1.schema.json
113
123
  gr2/schemas/gr2-workspace-spec-v1.schema.json
@@ -122,6 +132,9 @@ gr2/schemas/dev.synapt.grip.review.v1alpha1/review.proto
122
132
  gr2_overlay/__init__.py
123
133
  tests/test_add.py
124
134
  tests/test_agent_manifest_overlay_source.py
135
+ tests/test_agent_record_append.py
136
+ tests/test_agent_record_fold.py
137
+ tests/test_agent_record_stamps.py
125
138
  tests/test_api_core_seam.py
126
139
  tests/test_api_dump.py
127
140
  tests/test_app_event_outcomes.py
@@ -139,8 +152,11 @@ tests/test_commit.py
139
152
  tests/test_config_base_path_guard.py
140
153
  tests/test_config_overlay.py
141
154
  tests/test_conftest_git_isolation.py
155
+ tests/test_consent_key_paths.py
142
156
  tests/test_context_resolver.py
143
157
  tests/test_contribution_protocol.py
158
+ tests/test_declared_set_pins.py
159
+ tests/test_declared_sets.py
144
160
  tests/test_defaults_from_repo.py
145
161
  tests/test_deprecation_registry.py
146
162
  tests/test_ecosystems_python.py
@@ -151,13 +167,17 @@ tests/test_event_outcome_policy.py
151
167
  tests/test_events.py
152
168
  tests/test_events_torn_line.py
153
169
  tests/test_exec_apostrophe_and_oserror.py
170
+ tests/test_exec_run_names_what_did_not_run.py
154
171
  tests/test_exec_single_string_and_materialize_plan.py
155
172
  tests/test_execops.py
156
173
  tests/test_failure_event_outcome.py
157
174
  tests/test_field_tree_name.py
175
+ tests/test_field_tree_schema_reader.py
176
+ tests/test_files_compose.py
158
177
  tests/test_first_five_minutes.py
159
178
  tests/test_foreground_launch_runtime.py
160
179
  tests/test_git_review.py
180
+ tests/test_git_transport_allow_list.py
161
181
  tests/test_gitinclude_compiler.py
162
182
  tests/test_gitops_shared.py
163
183
  tests/test_gr1_first_run_guidance.py
@@ -170,11 +190,14 @@ tests/test_gr_shadow.py
170
190
  tests/test_grip_cli.py
171
191
  tests/test_grip_hardening.py
172
192
  tests/test_grip_snapshot.py
193
+ tests/test_grip_toml_literals.py
173
194
  tests/test_grip_toml_schema_v1.py
174
195
  tests/test_hook_events.py
175
196
  tests/test_hook_hardening.py
176
197
  tests/test_hooks_consent.py
177
198
  tests/test_hooks_group_names.py
199
+ tests/test_hostile_names.py
200
+ tests/test_hostile_names_helper.py
178
201
  tests/test_jsonl_store.py
179
202
  tests/test_lane_checkout_root.py
180
203
  tests/test_lane_create_defaults.py
@@ -191,6 +214,8 @@ tests/test_lane_lifecycle_safety.py
191
214
  tests/test_lane_plugins.py
192
215
  tests/test_lane_probe.py
193
216
  tests/test_lane_probe_batch.py
217
+ tests/test_lane_push.py
218
+ tests/test_lane_remove.py
194
219
  tests/test_lane_repo_paths_and_all_skipped.py
195
220
  tests/test_lane_roles.py
196
221
  tests/test_lane_show_name.py
@@ -202,20 +227,25 @@ tests/test_linked_review_receipts.py
202
227
  tests/test_m2_overlay_hindsight.py
203
228
  tests/test_m2_overlay_mem0.py
204
229
  tests/test_m2_overlay_zep.py
230
+ tests/test_malformed_remote_refusal.py
205
231
  tests/test_materialization_plan_contract.py
206
232
  tests/test_materialize_pin.py
207
233
  tests/test_member_working_root_checkout_materialize.py
208
234
  tests/test_merge_evidence.py
209
235
  tests/test_merge_parent_verification.py
210
236
  tests/test_migration.py
237
+ tests/test_migration_desk_state.py
211
238
  tests/test_migration_overlay_compatibility.py
212
239
  tests/test_migration_unadopted_notice.py
240
+ tests/test_names.py
213
241
  tests/test_native_store_gitinclude.py
214
242
  tests/test_native_store_review_record_probes.py
215
243
  tests/test_no_bare_python_cli_imports.py
244
+ tests/test_np_bench_contract_scenario.py
216
245
  tests/test_null_current_lane_refusal.py
217
246
  tests/test_open_gr_enter.py
218
247
  tests/test_open_project_refusal_reason_cli.py
248
+ tests/test_out_of_set_hint.py
219
249
  tests/test_outbox_ack_after_effect.py
220
250
  tests/test_overlay_acceptance.py
221
251
  tests/test_overlay_activate.py
@@ -239,6 +269,7 @@ tests/test_overlay_trust_model.py
239
269
  tests/test_overlay_workspace_spec.py
240
270
  tests/test_platform_adapter_changelog.py
241
271
  tests/test_platform_adapter_plugins.py
272
+ tests/test_pr_adapter_v2_target.py
242
273
  tests/test_pr_events.py
243
274
  tests/test_pr_group_legibility.py
244
275
  tests/test_pr_merge_head_pin.py
@@ -264,6 +295,7 @@ tests/test_repo_path_read_through.py
264
295
  tests/test_repo_status_linked_worktree.py
265
296
  tests/test_repo_status_schema_version.py
266
297
  tests/test_repo_status_symlinked_git_dir.py
298
+ tests/test_retire_gr1.py
267
299
  tests/test_review_a4.py
268
300
  tests/test_review_a4_v2.py
269
301
  tests/test_review_a4_v3.py
@@ -294,6 +326,8 @@ tests/test_review_field_tree_readers.py
294
326
  tests/test_review_install_hint.py
295
327
  tests/test_review_merge_gate.py
296
328
  tests/test_review_merge_gate_lost_ack.py
329
+ tests/test_review_merge_receipt.py
330
+ tests/test_review_merge_updates_tracking_ref.py
297
331
  tests/test_review_open_lane.py
298
332
  tests/test_review_pin_stamp_names.py
299
333
  tests/test_review_pr_marker_context.py
@@ -306,12 +340,15 @@ tests/test_review_ref_v1_writer.py
306
340
  tests/test_review_remote_safety.py
307
341
  tests/test_review_run.py
308
342
  tests/test_review_run_context.py
343
+ tests/test_review_run_deleted_cwd.py
309
344
  tests/test_review_run_dependency_order.py
310
345
  tests/test_review_run_import_isolation.py
311
346
  tests/test_review_run_integrity_recheck.py
312
347
  tests/test_review_run_multi_repo.py
348
+ tests/test_review_run_package_name.py
313
349
  tests/test_review_run_plugin_order.py
314
350
  tests/test_review_run_rerun_and_refusal_receipt.py
351
+ tests/test_review_run_venv_and_refusal_identity.py
315
352
  tests/test_review_runners.py
316
353
  tests/test_review_subject.py
317
354
  tests/test_review_transport.py
@@ -321,24 +358,46 @@ tests/test_review_vocabulary.py
321
358
  tests/test_rmtree_or_refuse.py
322
359
  tests/test_root_option_verbs.py
323
360
  tests/test_selected_workspace_commit.py
361
+ tests/test_set_check.py
362
+ tests/test_set_check_remote_heads.py
324
363
  tests/test_single_repo_cwd_refusal.py
364
+ tests/test_skill_dump.py
325
365
  tests/test_snapshot_id_prefix_resolution.py
326
366
  tests/test_spec_apply_event_outcomes.py
327
367
  tests/test_spec_declaration_ref_pin.py
368
+ tests/test_spec_show_native_root.py
328
369
  tests/test_sprint21_sync_platform.py
329
370
  tests/test_staging_cleanup.py
330
371
  tests/test_store_break_attempts.py
331
372
  tests/test_store_checkout_atomicity.py
373
+ tests/test_store_commit_follows_branch.py
374
+ tests/test_store_commit_keeps_record.py
332
375
  tests/test_store_commit_noop.py
376
+ tests/test_store_commit_refuses_rewind.py
333
377
  tests/test_store_declared_members.py
378
+ tests/test_store_full_mode_carrier.py
379
+ tests/test_store_full_mode_coverage.py
380
+ tests/test_store_full_mode_layers.py
381
+ tests/test_store_full_mode_records.py
382
+ tests/test_store_git_hooks.py
334
383
  tests/test_store_git_native_smoke.py
384
+ tests/test_store_gitmodules.py
385
+ tests/test_store_gitmodules_branch.py
386
+ tests/test_store_hook_takes_verb_coverage.py
335
387
  tests/test_store_init_branch_inference.py
388
+ tests/test_store_init_clone.py
336
389
  tests/test_store_log_adoption_boundary.py
390
+ tests/test_store_materialize_branch.py
391
+ tests/test_store_materialize_fetches_new_pin.py
392
+ tests/test_store_materialize_installs_hooks.py
337
393
  tests/test_store_member_path_hygiene.py
338
394
  tests/test_store_member_state.py
339
395
  tests/test_store_migrate_branch_inference.py
340
396
  tests/test_store_moved_workspace_guard.py
397
+ tests/test_store_status_inspection.py
341
398
  tests/test_store_status_values.py
399
+ tests/test_store_submodule_init.py
400
+ tests/test_store_submodule_update_merge.py
342
401
  tests/test_store_verb_rename.py
343
402
  tests/test_store_verb_witnesses.py
344
403
  tests/test_submodule_member_predicate.py
@@ -13,8 +13,38 @@ It covers what an out-of-tree adapter implements or receives: the `PlatformAdapt
13
13
  Each entry names the release that first carried it. The full release notes for every change are in the
14
14
  project's `CHANGELOG.md` and its GitHub releases.
15
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.
16
+ `PLATFORM_ADAPTER_API_VERSION` is the protocol's version number. It changes only for a change an existing
17
+ adapter cannot absorb. Version `2` is first carried by 2.0.0a9, and later 2.0.0a releases may add to it;
18
+ an adapter that declares version `1`, or nothing, is still accepted and called as before.
19
+
20
+ ## 2.0.0a9 (adapter API version 2)
21
+
22
+ An adapter that declares no `platform_adapter_api_version` is a version 1 adapter and is called exactly as
23
+ before.
24
+
25
+ - **`PLATFORM_ADAPTER_API_VERSION = 2`.** gr2 accepts a declared `1` or `2` and refuses any other value.
26
+ `adapter_api_version(adapter)` returns the declaration, and `1` when there is none.
27
+ - **`RemoteTarget`** is new: `raw` (the exact configured Git URL) and the adapter's reading of it, `host`,
28
+ `org`, `project` and `repo`, each `None` when the platform has no such part. gr2 never parses a hosting URL.
29
+ - **`resolve_target(remote) -> RemoteTarget`** is new and is required of a version 2 adapter: it is the only
30
+ place a URL is parsed.
31
+ - **`CreatePRRequest.target`** is new (default `None`): the member's `RemoteTarget`, resolved by the adapter
32
+ before the first PR of a group is created. A version 2 adapter always receives it; a version 1 adapter
33
+ receives `None`. `CreatePRRequest.remote` is unchanged and still carries the raw URL.
34
+ - **`target` keyword on the lifecycle calls.** For a version 2 adapter gr2 passes `target=<that member's
35
+ RemoteTarget>` to `pr_status`, `merge_pr`, `edit_pr_body`, `pr_checks`, `pr_view` and `list_prs`, so the adapter routes by the member's own
36
+ target and not by a repo string. A version 1 adapter is never passed `target`.
37
+ - **Old groups are refused by name.** A version 2 adapter given a stored group whose member has neither a
38
+ `target` nor a `remote` is refused as `group_lacks_routing_context`, before any adapter call; the group is
39
+ re-created with `gr2 pr create`. A member whose stored remote now resolves to a different target than the
40
+ one stored is refused as `routing_target_changed`.
41
+ - **Review verbs.** `review open` reads the PR's base branch through the adapter's own target when the adapter
42
+ is version 2 (`pr_status(..., target=<origin's RemoteTarget>)`), and refuses by name when the repository has
43
+ no origin url; a version 1 adapter is read exactly as before. Review creation resolves each member through
44
+ `resolve_target` and requires the effective URL (after any `url.<base>.insteadOf` rewrite) to resolve to the
45
+ same `(host, org, project, repo)` as the bound one.
46
+ - **Selection refuses a version 2 adapter without `resolve_target`** by name (`platform adapter lacks required
47
+ resolve_target capability`), at the same point it refuses one without `create_pr`.
18
48
 
19
49
  ## 2.0.0a8
20
50
 
@@ -507,7 +507,10 @@ def declared_repo_state(
507
507
  branch of record is resolved in the order the ruling names:
508
508
 
509
509
  1. ``declared_ref``, from the workspace's own ``.gitmodules`` when the
510
- caller supplies it.
510
+ caller supplies it -- under the member's LOCAL name when its head is
511
+ attached to a branch configured to track origin's declared branch
512
+ (``branch.<local>.remote`` = origin, ``.merge`` = the declared branch),
513
+ since ``.gitmodules`` names a branch on origin.
511
514
  2. the branch the repo is on, when its head is attached.
512
515
  3. the remote's default from ``refs/remotes/origin/HEAD``, which git sets
513
516
  when it clones -- resolved rather than invented, and used for the
@@ -534,6 +537,17 @@ def declared_repo_state(
534
537
  ref: str | None = None
535
538
  if declared_ref:
536
539
  ref = declared_ref
540
+ # `.gitmodules` names a branch on the member's ORIGIN. A member attached to a local branch configured to track
541
+ # exactly that branch (`branch.<local>.remote` is origin and `.merge` is refs/heads/<declared>) agrees with the
542
+ # declaration under its own name (`mine` tracking `origin/main`, declared `main`), so the local name is the
543
+ # branch of record. Any other upstream, including the same name on another remote (`fork/main`), does not agree,
544
+ # and the declaration still outranks it. Read as configured, so a remapped fetch refspec cannot fool it.
545
+ if is_attached:
546
+ local = attached.stdout.strip().removeprefix("refs/heads/")
547
+ remote = run_git(path, "config", "--get", f"branch.{local}.remote")
548
+ merge = run_git(path, "config", "--get", f"branch.{local}.merge")
549
+ if remote.stdout.strip() == "origin" and merge.stdout.strip() == f"refs/heads/{declared_ref}":
550
+ ref = local
537
551
  elif is_attached:
538
552
  ref = attached.stdout.strip().removeprefix("refs/heads/")
539
553
  else:
@@ -805,6 +819,40 @@ def swap_in_place(staged: Path, target: Path) -> None:
805
819
  shutil.move(str(staged), str(target))
806
820
 
807
821
 
822
+ def _restore_tracking_refs(staging_path: Path, owner_root: Path, *, keep_origin: bool) -> None:
823
+ """Make the staging clone's refs/remotes/origin/* what the worktree saw, not what the clone copied.
824
+
825
+ The clone's origin refs are the owner's refs/heads/*; delete them all (no-deref, so the origin/HEAD symref
826
+ itself goes, not its target). When the original had an origin, bring in the owner's own origin tracking refs
827
+ over file://, which is local, and restore its origin/HEAD symref; when it had none there is nothing to bring
828
+ and none are left.
829
+ """
830
+ listed = run_git(staging_path, "for-each-ref", "--format=%(refname)", "refs/remotes/origin")
831
+ for ref in listed.stdout.split():
832
+ run_git(staging_path, "update-ref", "--no-deref", "-d", ref)
833
+ if not keep_origin:
834
+ return
835
+ got = run_git(
836
+ staging_path, "fetch", "-q", f"file://{owner_root}", "+refs/remotes/origin/*:refs/remotes/origin/*"
837
+ )
838
+ if got.returncode != 0:
839
+ shutil.rmtree(staging_path, ignore_errors=True)
840
+ raise ConvertCloneError(
841
+ f"could not carry the owner's remote-tracking refs into the staging clone: {got.stderr.strip()}"
842
+ )
843
+ # The fetch brings origin/HEAD back as a PLAIN ref holding a sha, and the readers of the remote's default
844
+ # branch (`rev-parse --abbrev-ref origin/HEAD`, `symbolic-ref refs/remotes/origin/HEAD`) need the SYMREF.
845
+ # Put the owner's symref back, when it has one and its target is among the refs just carried; when it
846
+ # has none, there is none here either.
847
+ run_git(staging_path, "update-ref", "--no-deref", "-d", "refs/remotes/origin/HEAD")
848
+ owner_head = run_git(owner_root, "symbolic-ref", "-q", "refs/remotes/origin/HEAD")
849
+ target = owner_head.stdout.strip()
850
+ if owner_head.returncode == 0 and target:
851
+ have = run_git(staging_path, "show-ref", "--verify", "-q", target)
852
+ if have.returncode == 0:
853
+ run_git(staging_path, "symbolic-ref", "refs/remotes/origin/HEAD", target)
854
+
855
+
808
856
  def convert_worktree_to_clone(path: Path) -> dict[str, object]:
809
857
  """Convert a linked worktree into an own clone, in place.
810
858
 
@@ -933,6 +981,12 @@ def convert_worktree_to_clone(path: Path) -> dict[str, object]:
933
981
  else:
934
982
  run_git(staging_path, "remote", "remove", "origin")
935
983
 
984
+ # `git clone <owner path>` copied the OWNER's branches as refs/remotes/origin/*, and the real origin was just
985
+ # restored above, so those refs now claim the real origin holds commits that exist only in the owner. A
986
+ # commit the worktree knew was unpushed would read as pushed. Replace them with the refs the worktree itself
987
+ # was reading: the owner's own refs/remotes/origin/*, taken from the owner locally (no network).
988
+ _restore_tracking_refs(staging_path, canonical_repo_root, keep_origin=original_origin is not None)
989
+
936
990
  staging_git = staging_path / ".git"
937
991
  staging_summary = _lstat_summary(staging_git)
938
992
  if not staging_summary["is_dir"]: