As a maintainer, I want the code that reads the authored tree to read its new home, so that the payload the release ships is still built from the tree that is actually authored.
Acceptance Criteria
Notes
The inventory is wider than "two sites" and was measured during gating:
liveClaudeDir in libs/portable-tools/src/vendor-components.ts, and its caller in vendor-bundle.ts, which follows automatically.
parity.spec.ts reaches the repository's own .claude/ through three independent mechanisms, not one: the payload-fingerprint hash via liveClaudeDir, a CLAUDE_SKILLS_DIR constant with seven script constants hanging off it, and a resolver-seeding helper that copies from the repository root. Only the first follows the helper; the other two must be moved by hand.
vendor-components.spec.ts, the helper's own test.
One breakage this story does not own is now owned elsewhere. Three runtime sites — libs/epic-resolve/src/classify.ts, libs/pr-worktree/src/worktree.ts and libs/pr-worktree/src/git-fixtures.ts — resolve <target-root>/.claude/skills/nxs-gh-shared/delivery_config.py, which for this repository is the file Story 2 deletes. They are not authoring-tree reads, so this story's AC3 correctly excludes them. #249 gained a story for them during the same gating pass, and this epic is not startable before it lands.
AC4 is the regression check that matters: the move must not silently change what ships.
As a maintainer, I want the code that reads the authored tree to read its new home, so that the payload the release ships is still built from the tree that is actually authored.
Acceptance Criteria
.claude/as the authoring source, then every match is the new location — including the skills-directory constant and the resolver-seeding helper in the parity test, which do not follow the helper automatically.Notes
The inventory is wider than "two sites" and was measured during gating:
liveClaudeDirinlibs/portable-tools/src/vendor-components.ts, and its caller invendor-bundle.ts, which follows automatically.parity.spec.tsreaches the repository's own.claude/through three independent mechanisms, not one: the payload-fingerprint hash vialiveClaudeDir, aCLAUDE_SKILLS_DIRconstant with seven script constants hanging off it, and a resolver-seeding helper that copies from the repository root. Only the first follows the helper; the other two must be moved by hand.vendor-components.spec.ts, the helper's own test.One breakage this story does not own is now owned elsewhere. Three runtime sites —
libs/epic-resolve/src/classify.ts,libs/pr-worktree/src/worktree.tsandlibs/pr-worktree/src/git-fixtures.ts— resolve<target-root>/.claude/skills/nxs-gh-shared/delivery_config.py, which for this repository is the file Story 2 deletes. They are not authoring-tree reads, so this story's AC3 correctly excludes them. #249 gained a story for them during the same gating pass, and this epic is not startable before it lands.AC4 is the regression check that matters: the move must not silently change what ships.