agentwheel 0.20.16 → 0.20.18

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.
package/README.md CHANGED
@@ -461,6 +461,44 @@ agentwheel ownership retire-stale \
461
461
 
462
462
  The dry-run still proves exact destination coverage and runtime bytes. Apply only its emitted command,
463
463
  which includes the plan, source, destination, and manifest-inventory revisions.
464
+ For duplicate state owned by the same registered Fleet, set both workspace roots to the Fleet root
465
+ and add `--from-fleet-id <fleet-id>`. The planner selects only legacy paths covered by the stable
466
+ Fleet manifest. For JSON deep merges it also accepts a source contribution that is an exact
467
+ recursive subset of the destination contribution. Across package revisions, merge entries must
468
+ identify the same package and artifact with equal source hashes; other merge contributions must
469
+ match exactly. A source-only path stays in the legacy manifest;
470
+ when every source entry is covered, apply removes the old manifest and source lock without changing
471
+ runtime files or the stable manifest. Preserve copies of those old state files before applying a
472
+ retirement when they are needed as historical evidence.
473
+
474
+ A nested, non-Fleet workspace (for example a profile checked out beneath a registered Fleet root)
475
+ can inherit paths that older installs claimed under a fingerprint-only state key. Those claims name
476
+ another plain workspace root, or this workspace's own root from before it was Fleet-qualified, so
477
+ install refuses them as foreign. Adopt them into this workspace's stable state without
478
+ `--force-foreign-state`, running from the workspace that owns the target:
479
+
480
+ ```bash
481
+ agentwheel ownership adopt-legacy --agent <agent> \
482
+ --source-state-key <adapter>.<installation-type>.<legacy-fingerprint> \
483
+ --from-workspace-root <previous-owner-root> --json
484
+ ```
485
+
486
+ The dry-run proves each moved entry: the previous owner root must hold a graph lock named by the
487
+ legacy fingerprint, and for another workspace root exactly one such lock must match the entry's
488
+ graph-lock digest, node, selector, and source hash. Only entries the current graph still installs at
489
+ the same path with the same artifact identity move; the rest stay in the source manifest and are
490
+ listed. The current graph groups packages as install does, by installation type and adapter
491
+ configuration, and the command refuses when they resolve to more than one install state or when
492
+ `--installation-type`, `--adapter-config`, or `--adapter-module` differs from what install resolves.
493
+ Runtime bytes must match the recorded hash unless `--carry-drift` keeps that hash, so the next
494
+ install reports drift instead of overwriting local changes. A path another owner still claims blocks the
495
+ plan. A duplicate claim by the same previous owner is listed only when it sits under another legacy
496
+ key of that root with the same proof and the same recorded artifact and hashes; run the command
497
+ again with that key to retire it. Any other duplicate, including one in that root's current state,
498
+ blocks the plan. Apply only the emitted command. It writes the stable manifest first and the legacy
499
+ manifest second, and changes nothing else. A pending apply journal blocks the command. If an apply
500
+ stops after the stable manifest was written, run the dry-run again: paths already in the stable
501
+ state are then retired from the legacy key.
464
502
 
465
503
  ## Core Ideas
466
504