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.
- {worktree_controller-1.32.0 → worktree_controller-1.32.1}/PKG-INFO +1 -1
- {worktree_controller-1.32.0 → worktree_controller-1.32.1}/docs/client-integration.md +27 -0
- {worktree_controller-1.32.0 → worktree_controller-1.32.1}/docs/reference.md +4 -3
- {worktree_controller-1.32.0 → worktree_controller-1.32.1}/pyproject.toml +1 -1
- {worktree_controller-1.32.0 → worktree_controller-1.32.1}/pyproject.toml.orig +1 -1
- {worktree_controller-1.32.0 → worktree_controller-1.32.1}/src/worktree_controller/__init__.py +1 -1
- {worktree_controller-1.32.0 → worktree_controller-1.32.1}/src/worktree_controller/keyed_document_scope.py +16 -10
- {worktree_controller-1.32.0 → worktree_controller-1.32.1}/src/worktree_controller/tool_cli_contract.json +2 -2
- {worktree_controller-1.32.0 → worktree_controller-1.32.1}/tool_cli_contract.json +2 -2
- {worktree_controller-1.32.0 → worktree_controller-1.32.1}/LICENSE +0 -0
- {worktree_controller-1.32.0 → worktree_controller-1.32.1}/README.md +0 -0
- {worktree_controller-1.32.0 → worktree_controller-1.32.1}/docs/architecture.md +0 -0
- {worktree_controller-1.32.0 → worktree_controller-1.32.1}/docs/daily-workflow.md +0 -0
- {worktree_controller-1.32.0 → worktree_controller-1.32.1}/docs/first-change.md +0 -0
- {worktree_controller-1.32.0 → worktree_controller-1.32.1}/docs/getting-started.md +0 -0
- {worktree_controller-1.32.0 → worktree_controller-1.32.1}/docs/operations.md +0 -0
- {worktree_controller-1.32.0 → worktree_controller-1.32.1}/docs/publishing.md +0 -0
- {worktree_controller-1.32.0 → worktree_controller-1.32.1}/examples/change_task.py +0 -0
- {worktree_controller-1.32.0 → worktree_controller-1.32.1}/examples/client_continuation.py +0 -0
- {worktree_controller-1.32.0 → worktree_controller-1.32.1}/examples/quickstart.py +0 -0
- {worktree_controller-1.32.0 → worktree_controller-1.32.1}/src/worktree_controller/activation_layout.py +0 -0
- {worktree_controller-1.32.0 → worktree_controller-1.32.1}/src/worktree_controller/branch_retirement.py +0 -0
- {worktree_controller-1.32.0 → worktree_controller-1.32.1}/src/worktree_controller/canonical_refresh.py +0 -0
- {worktree_controller-1.32.0 → worktree_controller-1.32.1}/src/worktree_controller/canonical_transition.py +0 -0
- {worktree_controller-1.32.0 → worktree_controller-1.32.1}/src/worktree_controller/cleanup_attempts.py +0 -0
- {worktree_controller-1.32.0 → worktree_controller-1.32.1}/src/worktree_controller/cleanup_evidence.py +0 -0
- {worktree_controller-1.32.0 → worktree_controller-1.32.1}/src/worktree_controller/cleanup_recovery.py +0 -0
- {worktree_controller-1.32.0 → worktree_controller-1.32.1}/src/worktree_controller/cli.py +0 -0
- {worktree_controller-1.32.0 → worktree_controller-1.32.1}/src/worktree_controller/controller.py +0 -0
- {worktree_controller-1.32.0 → worktree_controller-1.32.1}/src/worktree_controller/convergence.py +0 -0
- {worktree_controller-1.32.0 → worktree_controller-1.32.1}/src/worktree_controller/delivered_closeout.py +0 -0
- {worktree_controller-1.32.0 → worktree_controller-1.32.1}/src/worktree_controller/disposable.py +0 -0
- {worktree_controller-1.32.0 → worktree_controller-1.32.1}/src/worktree_controller/environment.py +0 -0
- {worktree_controller-1.32.0 → worktree_controller-1.32.1}/src/worktree_controller/frozen_recovery.py +0 -0
- {worktree_controller-1.32.0 → worktree_controller-1.32.1}/src/worktree_controller/git_backend.py +0 -0
- {worktree_controller-1.32.0 → worktree_controller-1.32.1}/src/worktree_controller/governance.py +0 -0
- {worktree_controller-1.32.0 → worktree_controller-1.32.1}/src/worktree_controller/hardlinks.py +0 -0
- {worktree_controller-1.32.0 → worktree_controller-1.32.1}/src/worktree_controller/integration_cleanup.py +0 -0
- {worktree_controller-1.32.0 → worktree_controller-1.32.1}/src/worktree_controller/integration_conflict.py +0 -0
- {worktree_controller-1.32.0 → worktree_controller-1.32.1}/src/worktree_controller/integration_retry.py +0 -0
- {worktree_controller-1.32.0 → worktree_controller-1.32.1}/src/worktree_controller/lifecycle.py +0 -0
- {worktree_controller-1.32.0 → worktree_controller-1.32.1}/src/worktree_controller/lifecycle_history.py +0 -0
- {worktree_controller-1.32.0 → worktree_controller-1.32.1}/src/worktree_controller/lifecycle_observation.py +0 -0
- {worktree_controller-1.32.0 → worktree_controller-1.32.1}/src/worktree_controller/metadata_codec.py +0 -0
- {worktree_controller-1.32.0 → worktree_controller-1.32.1}/src/worktree_controller/metadata_relocation.py +0 -0
- {worktree_controller-1.32.0 → worktree_controller-1.32.1}/src/worktree_controller/models.py +0 -0
- {worktree_controller-1.32.0 → worktree_controller-1.32.1}/src/worktree_controller/mount_diagnostics.py +0 -0
- {worktree_controller-1.32.0 → worktree_controller-1.32.1}/src/worktree_controller/multiple_cleanup_recovery.py +0 -0
- {worktree_controller-1.32.0 → worktree_controller-1.32.1}/src/worktree_controller/namespace_migration.py +0 -0
- {worktree_controller-1.32.0 → worktree_controller-1.32.1}/src/worktree_controller/native_session_recovery.py +0 -0
- {worktree_controller-1.32.0 → worktree_controller-1.32.1}/src/worktree_controller/owner_actions.py +0 -0
- {worktree_controller-1.32.0 → worktree_controller-1.32.1}/src/worktree_controller/policy.py +0 -0
- {worktree_controller-1.32.0 → worktree_controller-1.32.1}/src/worktree_controller/preservation.py +0 -0
- {worktree_controller-1.32.0 → worktree_controller-1.32.1}/src/worktree_controller/preserved_cleanup.py +0 -0
- {worktree_controller-1.32.0 → worktree_controller-1.32.1}/src/worktree_controller/publication_execution.py +0 -0
- {worktree_controller-1.32.0 → worktree_controller-1.32.1}/src/worktree_controller/reconciler.py +0 -0
- {worktree_controller-1.32.0 → worktree_controller-1.32.1}/src/worktree_controller/recovery_guidance.py +0 -0
- {worktree_controller-1.32.0 → worktree_controller-1.32.1}/src/worktree_controller/registration_backfill.py +0 -0
- {worktree_controller-1.32.0 → worktree_controller-1.32.1}/src/worktree_controller/registration_prune.py +0 -0
- {worktree_controller-1.32.0 → worktree_controller-1.32.1}/src/worktree_controller/rendering.py +0 -0
- {worktree_controller-1.32.0 → worktree_controller-1.32.1}/src/worktree_controller/resource_admission.py +0 -0
- {worktree_controller-1.32.0 → worktree_controller-1.32.1}/src/worktree_controller/retirement_adapters.py +0 -0
- {worktree_controller-1.32.0 → worktree_controller-1.32.1}/src/worktree_controller/retirement_execution.py +0 -0
- {worktree_controller-1.32.0 → worktree_controller-1.32.1}/src/worktree_controller/semantics.py +0 -0
- {worktree_controller-1.32.0 → worktree_controller-1.32.1}/src/worktree_controller/session.py +0 -0
- {worktree_controller-1.32.0 → worktree_controller-1.32.1}/src/worktree_controller/session_admission.py +0 -0
- {worktree_controller-1.32.0 → worktree_controller-1.32.1}/src/worktree_controller/source_cleanup.py +0 -0
- {worktree_controller-1.32.0 → worktree_controller-1.32.1}/src/worktree_controller/source_preservation.py +0 -0
- {worktree_controller-1.32.0 → worktree_controller-1.32.1}/src/worktree_controller/source_recovery.py +0 -0
- {worktree_controller-1.32.0 → worktree_controller-1.32.1}/src/worktree_controller/store.py +0 -0
- {worktree_controller-1.32.0 → worktree_controller-1.32.1}/src/worktree_controller/task_workflow.py +0 -0
- {worktree_controller-1.32.0 → worktree_controller-1.32.1}/src/worktree_controller/transaction_scope.py +0 -0
- {worktree_controller-1.32.0 → worktree_controller-1.32.1}/src/worktree_controller/writer_lease.py +0 -0
- {worktree_controller-1.32.0 → worktree_controller-1.32.1}/src/worktree_controller/writer_session.py +0 -0
|
@@ -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
|
|
1482
|
-
|
|
1483
|
-
|
|
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
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
"""Prove independent
|
|
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/
|
|
17
|
-
|
|
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
|
|
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,
|
|
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 !=
|
|
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/
|
|
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.
|
|
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/
|
|
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.
|
|
1074
|
+
"tool_version": "1.32.1",
|
|
1075
1075
|
"delivered_closeout_version": 1,
|
|
1076
1076
|
"retained_archive_version": 1,
|
|
1077
1077
|
"retention_convergence_version": 2,
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{worktree_controller-1.32.0 → worktree_controller-1.32.1}/src/worktree_controller/controller.py
RENAMED
|
File without changes
|
{worktree_controller-1.32.0 → worktree_controller-1.32.1}/src/worktree_controller/convergence.py
RENAMED
|
File without changes
|
|
File without changes
|
{worktree_controller-1.32.0 → worktree_controller-1.32.1}/src/worktree_controller/disposable.py
RENAMED
|
File without changes
|
{worktree_controller-1.32.0 → worktree_controller-1.32.1}/src/worktree_controller/environment.py
RENAMED
|
File without changes
|
{worktree_controller-1.32.0 → worktree_controller-1.32.1}/src/worktree_controller/frozen_recovery.py
RENAMED
|
File without changes
|
{worktree_controller-1.32.0 → worktree_controller-1.32.1}/src/worktree_controller/git_backend.py
RENAMED
|
File without changes
|
{worktree_controller-1.32.0 → worktree_controller-1.32.1}/src/worktree_controller/governance.py
RENAMED
|
File without changes
|
{worktree_controller-1.32.0 → worktree_controller-1.32.1}/src/worktree_controller/hardlinks.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{worktree_controller-1.32.0 → worktree_controller-1.32.1}/src/worktree_controller/lifecycle.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{worktree_controller-1.32.0 → worktree_controller-1.32.1}/src/worktree_controller/metadata_codec.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{worktree_controller-1.32.0 → worktree_controller-1.32.1}/src/worktree_controller/owner_actions.py
RENAMED
|
File without changes
|
|
File without changes
|
{worktree_controller-1.32.0 → worktree_controller-1.32.1}/src/worktree_controller/preservation.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{worktree_controller-1.32.0 → worktree_controller-1.32.1}/src/worktree_controller/reconciler.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{worktree_controller-1.32.0 → worktree_controller-1.32.1}/src/worktree_controller/rendering.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{worktree_controller-1.32.0 → worktree_controller-1.32.1}/src/worktree_controller/semantics.py
RENAMED
|
File without changes
|
{worktree_controller-1.32.0 → worktree_controller-1.32.1}/src/worktree_controller/session.py
RENAMED
|
File without changes
|
|
File without changes
|
{worktree_controller-1.32.0 → worktree_controller-1.32.1}/src/worktree_controller/source_cleanup.py
RENAMED
|
File without changes
|
|
File without changes
|
{worktree_controller-1.32.0 → worktree_controller-1.32.1}/src/worktree_controller/source_recovery.py
RENAMED
|
File without changes
|
|
File without changes
|
{worktree_controller-1.32.0 → worktree_controller-1.32.1}/src/worktree_controller/task_workflow.py
RENAMED
|
File without changes
|
|
File without changes
|
{worktree_controller-1.32.0 → worktree_controller-1.32.1}/src/worktree_controller/writer_lease.py
RENAMED
|
File without changes
|
{worktree_controller-1.32.0 → worktree_controller-1.32.1}/src/worktree_controller/writer_session.py
RENAMED
|
File without changes
|