worktree-controller 1.32.0__tar.gz → 1.32.1__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (74) hide show
  1. {worktree_controller-1.32.0 → worktree_controller-1.32.1}/PKG-INFO +1 -1
  2. {worktree_controller-1.32.0 → worktree_controller-1.32.1}/docs/client-integration.md +27 -0
  3. {worktree_controller-1.32.0 → worktree_controller-1.32.1}/docs/reference.md +4 -3
  4. {worktree_controller-1.32.0 → worktree_controller-1.32.1}/pyproject.toml +1 -1
  5. {worktree_controller-1.32.0 → worktree_controller-1.32.1}/pyproject.toml.orig +1 -1
  6. {worktree_controller-1.32.0 → worktree_controller-1.32.1}/src/worktree_controller/__init__.py +1 -1
  7. {worktree_controller-1.32.0 → worktree_controller-1.32.1}/src/worktree_controller/keyed_document_scope.py +16 -10
  8. {worktree_controller-1.32.0 → worktree_controller-1.32.1}/src/worktree_controller/tool_cli_contract.json +2 -2
  9. {worktree_controller-1.32.0 → worktree_controller-1.32.1}/tool_cli_contract.json +2 -2
  10. {worktree_controller-1.32.0 → worktree_controller-1.32.1}/LICENSE +0 -0
  11. {worktree_controller-1.32.0 → worktree_controller-1.32.1}/README.md +0 -0
  12. {worktree_controller-1.32.0 → worktree_controller-1.32.1}/docs/architecture.md +0 -0
  13. {worktree_controller-1.32.0 → worktree_controller-1.32.1}/docs/daily-workflow.md +0 -0
  14. {worktree_controller-1.32.0 → worktree_controller-1.32.1}/docs/first-change.md +0 -0
  15. {worktree_controller-1.32.0 → worktree_controller-1.32.1}/docs/getting-started.md +0 -0
  16. {worktree_controller-1.32.0 → worktree_controller-1.32.1}/docs/operations.md +0 -0
  17. {worktree_controller-1.32.0 → worktree_controller-1.32.1}/docs/publishing.md +0 -0
  18. {worktree_controller-1.32.0 → worktree_controller-1.32.1}/examples/change_task.py +0 -0
  19. {worktree_controller-1.32.0 → worktree_controller-1.32.1}/examples/client_continuation.py +0 -0
  20. {worktree_controller-1.32.0 → worktree_controller-1.32.1}/examples/quickstart.py +0 -0
  21. {worktree_controller-1.32.0 → worktree_controller-1.32.1}/src/worktree_controller/activation_layout.py +0 -0
  22. {worktree_controller-1.32.0 → worktree_controller-1.32.1}/src/worktree_controller/branch_retirement.py +0 -0
  23. {worktree_controller-1.32.0 → worktree_controller-1.32.1}/src/worktree_controller/canonical_refresh.py +0 -0
  24. {worktree_controller-1.32.0 → worktree_controller-1.32.1}/src/worktree_controller/canonical_transition.py +0 -0
  25. {worktree_controller-1.32.0 → worktree_controller-1.32.1}/src/worktree_controller/cleanup_attempts.py +0 -0
  26. {worktree_controller-1.32.0 → worktree_controller-1.32.1}/src/worktree_controller/cleanup_evidence.py +0 -0
  27. {worktree_controller-1.32.0 → worktree_controller-1.32.1}/src/worktree_controller/cleanup_recovery.py +0 -0
  28. {worktree_controller-1.32.0 → worktree_controller-1.32.1}/src/worktree_controller/cli.py +0 -0
  29. {worktree_controller-1.32.0 → worktree_controller-1.32.1}/src/worktree_controller/controller.py +0 -0
  30. {worktree_controller-1.32.0 → worktree_controller-1.32.1}/src/worktree_controller/convergence.py +0 -0
  31. {worktree_controller-1.32.0 → worktree_controller-1.32.1}/src/worktree_controller/delivered_closeout.py +0 -0
  32. {worktree_controller-1.32.0 → worktree_controller-1.32.1}/src/worktree_controller/disposable.py +0 -0
  33. {worktree_controller-1.32.0 → worktree_controller-1.32.1}/src/worktree_controller/environment.py +0 -0
  34. {worktree_controller-1.32.0 → worktree_controller-1.32.1}/src/worktree_controller/frozen_recovery.py +0 -0
  35. {worktree_controller-1.32.0 → worktree_controller-1.32.1}/src/worktree_controller/git_backend.py +0 -0
  36. {worktree_controller-1.32.0 → worktree_controller-1.32.1}/src/worktree_controller/governance.py +0 -0
  37. {worktree_controller-1.32.0 → worktree_controller-1.32.1}/src/worktree_controller/hardlinks.py +0 -0
  38. {worktree_controller-1.32.0 → worktree_controller-1.32.1}/src/worktree_controller/integration_cleanup.py +0 -0
  39. {worktree_controller-1.32.0 → worktree_controller-1.32.1}/src/worktree_controller/integration_conflict.py +0 -0
  40. {worktree_controller-1.32.0 → worktree_controller-1.32.1}/src/worktree_controller/integration_retry.py +0 -0
  41. {worktree_controller-1.32.0 → worktree_controller-1.32.1}/src/worktree_controller/lifecycle.py +0 -0
  42. {worktree_controller-1.32.0 → worktree_controller-1.32.1}/src/worktree_controller/lifecycle_history.py +0 -0
  43. {worktree_controller-1.32.0 → worktree_controller-1.32.1}/src/worktree_controller/lifecycle_observation.py +0 -0
  44. {worktree_controller-1.32.0 → worktree_controller-1.32.1}/src/worktree_controller/metadata_codec.py +0 -0
  45. {worktree_controller-1.32.0 → worktree_controller-1.32.1}/src/worktree_controller/metadata_relocation.py +0 -0
  46. {worktree_controller-1.32.0 → worktree_controller-1.32.1}/src/worktree_controller/models.py +0 -0
  47. {worktree_controller-1.32.0 → worktree_controller-1.32.1}/src/worktree_controller/mount_diagnostics.py +0 -0
  48. {worktree_controller-1.32.0 → worktree_controller-1.32.1}/src/worktree_controller/multiple_cleanup_recovery.py +0 -0
  49. {worktree_controller-1.32.0 → worktree_controller-1.32.1}/src/worktree_controller/namespace_migration.py +0 -0
  50. {worktree_controller-1.32.0 → worktree_controller-1.32.1}/src/worktree_controller/native_session_recovery.py +0 -0
  51. {worktree_controller-1.32.0 → worktree_controller-1.32.1}/src/worktree_controller/owner_actions.py +0 -0
  52. {worktree_controller-1.32.0 → worktree_controller-1.32.1}/src/worktree_controller/policy.py +0 -0
  53. {worktree_controller-1.32.0 → worktree_controller-1.32.1}/src/worktree_controller/preservation.py +0 -0
  54. {worktree_controller-1.32.0 → worktree_controller-1.32.1}/src/worktree_controller/preserved_cleanup.py +0 -0
  55. {worktree_controller-1.32.0 → worktree_controller-1.32.1}/src/worktree_controller/publication_execution.py +0 -0
  56. {worktree_controller-1.32.0 → worktree_controller-1.32.1}/src/worktree_controller/reconciler.py +0 -0
  57. {worktree_controller-1.32.0 → worktree_controller-1.32.1}/src/worktree_controller/recovery_guidance.py +0 -0
  58. {worktree_controller-1.32.0 → worktree_controller-1.32.1}/src/worktree_controller/registration_backfill.py +0 -0
  59. {worktree_controller-1.32.0 → worktree_controller-1.32.1}/src/worktree_controller/registration_prune.py +0 -0
  60. {worktree_controller-1.32.0 → worktree_controller-1.32.1}/src/worktree_controller/rendering.py +0 -0
  61. {worktree_controller-1.32.0 → worktree_controller-1.32.1}/src/worktree_controller/resource_admission.py +0 -0
  62. {worktree_controller-1.32.0 → worktree_controller-1.32.1}/src/worktree_controller/retirement_adapters.py +0 -0
  63. {worktree_controller-1.32.0 → worktree_controller-1.32.1}/src/worktree_controller/retirement_execution.py +0 -0
  64. {worktree_controller-1.32.0 → worktree_controller-1.32.1}/src/worktree_controller/semantics.py +0 -0
  65. {worktree_controller-1.32.0 → worktree_controller-1.32.1}/src/worktree_controller/session.py +0 -0
  66. {worktree_controller-1.32.0 → worktree_controller-1.32.1}/src/worktree_controller/session_admission.py +0 -0
  67. {worktree_controller-1.32.0 → worktree_controller-1.32.1}/src/worktree_controller/source_cleanup.py +0 -0
  68. {worktree_controller-1.32.0 → worktree_controller-1.32.1}/src/worktree_controller/source_preservation.py +0 -0
  69. {worktree_controller-1.32.0 → worktree_controller-1.32.1}/src/worktree_controller/source_recovery.py +0 -0
  70. {worktree_controller-1.32.0 → worktree_controller-1.32.1}/src/worktree_controller/store.py +0 -0
  71. {worktree_controller-1.32.0 → worktree_controller-1.32.1}/src/worktree_controller/task_workflow.py +0 -0
  72. {worktree_controller-1.32.0 → worktree_controller-1.32.1}/src/worktree_controller/transaction_scope.py +0 -0
  73. {worktree_controller-1.32.0 → worktree_controller-1.32.1}/src/worktree_controller/writer_lease.py +0 -0
  74. {worktree_controller-1.32.0 → worktree_controller-1.32.1}/src/worktree_controller/writer_session.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: worktree-controller
3
- Version: 1.32.0
3
+ Version: 1.32.1
4
4
  Summary: Govern Git worktree budgets, authority, ownership, and lifecycle
5
5
  License-Expression: Apache-2.0
6
6
  License-File: LICENSE
@@ -105,6 +105,33 @@ This demonstrates two CLI consumers, not actual invocation or discovery by two A
105
105
  Vendor-specific discovery and live-client use require their own observed acceptance, as described
106
106
  in [checks and deployment evidence](operations.md#checks-and-deployment).
107
107
 
108
+ ## Accept a real AI client
109
+
110
+ Accept a client by observing it use the installed WC interface during a real task,
111
+ including a pause and continuation in a later native session. Running the offline
112
+ protocol example checks the CLI workflow; it does not establish that an AI client
113
+ discovers or invokes WC correctly. Keep the actual session identities and checkpoint
114
+ evidence with the acceptance result, and limit claims to the client and workflow observed.
115
+
116
+ Use the separate `worktree-session-end` executable for session closeout. Keep a practical
117
+ evidence checklist:
118
+
119
+ - Capture actual native-client WC invocations, raw results and exit codes, client version,
120
+ and distinct native session/run/holder identities before and after interruption.
121
+ - Verify the raw checkpoint digest and unchanged Task/authority/owner, allocation, path,
122
+ branch, HEAD and scope; compare exact file SHA256 values before the next session edits.
123
+ - Resume the original Task, acquire a fresh live writer, and pass its check and write guard;
124
+ record refusal of the previous identity without reviving it or bypassing a refusal.
125
+ - While leases are recorded, check and end with the exact client/session/run/holder selector.
126
+ Include every allocation via `--expected-allocation-id`; retain every per-tree decision
127
+ and require `summary.terminal_complete` with `--require-complete` before claiming closeout.
128
+ - Follow the [first-change workflow](first-change.md) to finish; keep separate Finalizer,
129
+ handoff, integration/publication and release evidence before claiming task completion.
130
+ A retained checkpoint preserves unfinished work; it is not delivery evidence.
131
+
132
+ One tested vendor does not prove another vendor's discovery or invocation of WC; accept each
133
+ client and workflow using its own observed evidence.
134
+
108
135
  ## Upgrade an existing managed installation
109
136
 
110
137
  A public package installation in a new environment is separate from activation of a shared
@@ -1478,9 +1478,10 @@ checkout rejects feature writes. `READY_TO_PUBLISH` is write-fenced until explic
1478
1478
  out-of-band HEAD, content, record, or binding drift makes old evidence unusable.
1479
1479
 
1480
1480
  The bounded `integration-keyed-document-scope/v1` refinement applies only when the entire
1481
- overlap is the exact `docs/handbook/business-progress.json` path. Every pair of frozen source
1482
- commits must have one non-ancestor merge base and the same committed `.gitattributes` declaring
1483
- `merge=qp-handbook-progress`. QP schema 2 records are compared by whole `tasks.authority_key`
1481
+ overlap is exactly `docs/nexus/business-progress.json` with `merge=qp-nexus-progress`, or
1482
+ the historical `docs/handbook/business-progress.json` with `merge=qp-handbook-progress`.
1483
+ Cross-path moves retain the ordinary file fence. Every pair of frozen source commits must have
1484
+ one non-ancestor merge base and the same committed `.gitattributes` declaring the matching profile. QP schema 2 records are compared by whole `tasks.authority_key`
1484
1485
  or `development_lines/modules/decisions.id`, including additions and deletions. All changed key
1485
1486
  sets must be disjoint. Metadata, schema, ordering, duplicate keys, missing/oversized/non-regular
1486
1487
  blobs, unknown evidence, broad paths and code overlaps keep the ordinary file fence. Explicit
@@ -4,7 +4,7 @@ build-backend = "uv_build"
4
4
 
5
5
  [project]
6
6
  name = "worktree-controller"
7
- version = "1.32.0"
7
+ version = "1.32.1"
8
8
  description = "Govern Git worktree budgets, authority, ownership, and lifecycle"
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.12,<3.13"
@@ -4,7 +4,7 @@ build-backend = "uv_build"
4
4
 
5
5
  [project]
6
6
  name = "worktree-controller"
7
- version = "1.32.0"
7
+ version = "1.32.1"
8
8
  description = "Govern Git worktree budgets, authority, ownership, and lifecycle"
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.12,<3.13"
@@ -1,3 +1,3 @@
1
1
  """Worktree lifecycle controller."""
2
2
 
3
- __version__ = "1.32.0"
3
+ __version__ = "1.32.1"
@@ -1,4 +1,4 @@
1
- """Prove independent Handbook records from frozen Git objects, never working files.
1
+ """Prove independent Nexus records from frozen Git objects, never working files.
2
2
 
3
3
  This refines only the known keyed-document overlap. It does not choose merge results,
4
4
  change declared ownership, or replace candidate validation and main publication CAS.
@@ -13,8 +13,11 @@ from pathlib import Path
13
13
  from .git_backend import _git
14
14
  from .models import ControllerError
15
15
 
16
- PROGRESS_PATH = "docs/handbook/business-progress.json"
17
- _ATTRIBUTE = f"{PROGRESS_PATH} merge=qp-handbook-progress"
16
+ PROGRESS_PATH = "docs/nexus/business-progress.json"
17
+ PROGRESS_PROFILES = {
18
+ PROGRESS_PATH: "qp-nexus-progress",
19
+ "docs/handbook/business-progress.json": "qp-handbook-progress",
20
+ }
18
21
  _COLLECTIONS = {
19
22
  "tasks": "authority_key",
20
23
  "development_lines": "id",
@@ -105,11 +108,11 @@ def _blob(repo: Path, commit: str, path: str, *, limit: int = _MAX_BYTES) -> byt
105
108
  return raw
106
109
 
107
110
 
108
- def _progress(repo: Path, commit: str) -> tuple[str, bytes]:
111
+ def _progress(repo: Path, commit: str, path: str) -> tuple[str, bytes]:
109
112
  attributes = _blob(repo, commit, ".gitattributes", limit=64 * 1024).decode("utf-8")
110
- if _ATTRIBUTE not in attributes.splitlines():
113
+ if f"{path} merge={PROGRESS_PROFILES[path]}" not in attributes.splitlines():
111
114
  raise ValueError("keyed merge protocol is not declared")
112
- return attributes, _blob(repo, commit, PROGRESS_PATH)
115
+ return attributes, _blob(repo, commit, path)
113
116
 
114
117
 
115
118
  def independent_progress_scopes(
@@ -133,7 +136,10 @@ def independent_progress_scopes(
133
136
  for right in right_paths
134
137
  if left == right or left.startswith(right + "/") or right.startswith(left + "/")
135
138
  }
136
- if overlaps != {(PROGRESS_PATH, PROGRESS_PATH)}:
139
+ if len(overlaps) != 1:
140
+ return False
141
+ path, other = next(iter(overlaps))
142
+ if path != other or path not in PROGRESS_PROFILES:
137
143
  return False
138
144
  if len(left_sources) > 8 or len(right_sources) > 8:
139
145
  return False
@@ -148,9 +154,9 @@ def independent_progress_scopes(
148
154
  base = bases[0].decode("ascii")
149
155
  if not _OID.fullmatch(base) or base in (left, right):
150
156
  return False
151
- attributes, original = _progress(repo, base)
152
- left_attributes, left_document = _progress(repo, left)
153
- right_attributes, right_document = _progress(repo, right)
157
+ attributes, original = _progress(repo, base, path)
158
+ left_attributes, left_document = _progress(repo, left, path)
159
+ right_attributes, right_document = _progress(repo, right, path)
154
160
  if attributes != left_attributes or attributes != right_attributes:
155
161
  return False
156
162
  left_keys = _changed_keys(original, left_document)
@@ -468,7 +468,7 @@
468
468
  "contract": "integration-keyed-document-scope/v1",
469
469
  "entry_points": "normal enqueue, claim, reconcile and retry scope checks",
470
470
  "identity": "original frozen source commits, scopes and queue sequence; no mutable checkout evidence",
471
- "supported_document": "docs/handbook/business-progress.json, quant-platform schema 2, unchanged committed qp-handbook-progress merge profile",
471
+ "supported_document": "docs/nexus/business-progress.json with qp-nexus-progress, or historical docs/handbook/business-progress.json with qp-handbook-progress; quant-platform schema 2, unchanged committed merge profile",
472
472
  "proof": "unique non-ancestor merge base for every frozen source pair; whole-record changed keys must be disjoint across tasks.authority_key and development_lines/modules/decisions.id",
473
473
  "bounds": "at most 8 sources per intent, 2 MiB regular document blobs, 64 KiB attributes blobs",
474
474
  "fail_closed": "shared record, metadata/schema/order changes, broad paths, code overlap, duplicate keys, invalid/missing/oversized Git evidence, ancestry dependency, explicit prerequisite or earlier publishing/recovery/attention state",
@@ -1071,7 +1071,7 @@
1071
1071
  "session_launcher_entrypoint": "worktree-session",
1072
1072
  "session_entrypoint": "worktree-session-end",
1073
1073
  "tool_name": "worktree-controller",
1074
- "tool_version": "1.32.0",
1074
+ "tool_version": "1.32.1",
1075
1075
  "delivered_closeout_version": 1,
1076
1076
  "retained_archive_version": 1,
1077
1077
  "retention_convergence_version": 2,
@@ -468,7 +468,7 @@
468
468
  "contract": "integration-keyed-document-scope/v1",
469
469
  "entry_points": "normal enqueue, claim, reconcile and retry scope checks",
470
470
  "identity": "original frozen source commits, scopes and queue sequence; no mutable checkout evidence",
471
- "supported_document": "docs/handbook/business-progress.json, quant-platform schema 2, unchanged committed qp-handbook-progress merge profile",
471
+ "supported_document": "docs/nexus/business-progress.json with qp-nexus-progress, or historical docs/handbook/business-progress.json with qp-handbook-progress; quant-platform schema 2, unchanged committed merge profile",
472
472
  "proof": "unique non-ancestor merge base for every frozen source pair; whole-record changed keys must be disjoint across tasks.authority_key and development_lines/modules/decisions.id",
473
473
  "bounds": "at most 8 sources per intent, 2 MiB regular document blobs, 64 KiB attributes blobs",
474
474
  "fail_closed": "shared record, metadata/schema/order changes, broad paths, code overlap, duplicate keys, invalid/missing/oversized Git evidence, ancestry dependency, explicit prerequisite or earlier publishing/recovery/attention state",
@@ -1071,7 +1071,7 @@
1071
1071
  "session_launcher_entrypoint": "worktree-session",
1072
1072
  "session_entrypoint": "worktree-session-end",
1073
1073
  "tool_name": "worktree-controller",
1074
- "tool_version": "1.32.0",
1074
+ "tool_version": "1.32.1",
1075
1075
  "delivered_closeout_version": 1,
1076
1076
  "retained_archive_version": 1,
1077
1077
  "retention_convergence_version": 2,